SkyWalking微服务链路追踪实战

目录

skywalking是什么?

Skywalking主要功能特性

Skywalking整体架构

[SkyWalking 环境搭建部署](#SkyWalking 环境搭建部署)

SkyWalking快速开始

[SkyWalking Agent追踪微服务](#SkyWalking Agent追踪微服务)

通过jar包方式接入

在IDEA中使用Skywalking

Skywalking跨多个微服务追踪

Skywalking集成日志框架

[Skywalking通过grpc上报日志 (需要v8.4.0以上)](#Skywalking通过grpc上报日志 (需要v8.4.0以上))

Skywalking告警通知

Skywalking持久化追踪数据

基于mysql持久化

自定义SkyWalking链路追踪

@Trace将方法加入追踪链路

加入@Tags或@Tag


skywalking是什么?

skywalking是一个国产开源框架,2015年由吴晟开源 , 2017年加入Apache孵化器。skywalking是分布式系统的应用程序性能监视工具,专为微服务、云原生架构和基于容器(Docker、K8s、Mesos)架构而设计。SkyWalking 是观察性分析平台和应用性能管理系统,提供分布式追踪、服务网格遥测分析、度量聚合和可视化一体化解决方案。

官网:Apache SkyWalking

下载:Downloads | Apache SkyWalking

Github:GitHub - apache/skywalking: APM, Application Performance Monitoring System

文档:Welcome | Apache SkyWalking

中文文档: SkyWalking 文档中文版(社区提供)


Skywalking主要功能特性

1、多种监控手段,可以通过语言探针和service mesh获得监控的数据;

2、支持多种语言自动探针,包括 Java,.NET Core 和 Node.JS;

3、轻量高效,无需大数据平台和大量的服务器资源;

4、模块化,UI、存储、集群管理都有多种机制可选;

5、支持告警;

6、优秀的可视化解决方案;

Skywalking整体架构

整个架构分成四部分:

  • 上部分Agent :负责从应用中,收集链路信息,发送给 SkyWalking OAP 服务器;
  • 下部分 SkyWalking OAP :负责接收Agent发送的Tracing数据信息,然后进行分析(Analysis Core),存储到外部存储器(Storage),最终提供查询(Query)功能;
  • 右部分Storage:Tracing数据存储,目前支持ES、MySQL、Sharding Sphere、TiDB、H2多种存储器,目前采用较多的是ES,主要考虑是SkyWalking开发团队自己的生产环境采用ES为主;
  • 左部分SkyWalking UI:负责提供控制台,查看链路等;

SkyWalking 环境搭建部署

下载 SkyWalking

下载:Downloads | Apache SkyWalking

搭建SkyWalking OAP 服务

1)先使用默认的H2数据库存储,不用修改配置

2)启动脚本bin/startup.bat

日志信息存储在logs目录

启动成功后会启动两个服务,一个是skywalking-oap-server,一个是skywalking-web-ui

skywalking-oap-server服务启动后会暴露11800 和 12800 两个端口,分别为收集监控数据的端口11800和接受前端请求的端口12800,修改端口可以修改config/applicaiton.yml

skywalking-web-ui服务会占用 8080 端口, 修改端口可以修改webapp/webapp.yml

访问:​​​​​​http://localhost:8080/general


SkyWalking快速开始

SkyWalking Agent追踪微服务

通过jar包方式接入

准备一个springboot程序,打成可执行jar包,写一个shell脚本,在启动项目的Shell脚本上,通过 -javaagent 参数进行配置SkyWalking Agent来追踪微服务。

startup.sh脚本:

javascript 复制代码
#!/bin/sh
# SkyWalking Agent配置
export SW_AGENT_NAME=springboot-skywalking-demo #Agent名字,一般使用`spring.application.name`
export SW_AGENT_COLLECTOR_BACKEND_SERVICES=127.0.0.1:11800 #配置 Collector 地址。
export SW_AGENT_SPAN_LIMIT=2000 #配置链路的最大Span数量,默认为 300。
export JAVA_AGENT=-javaagent:/root/skywalking-agent/skywalking-agent.jar
java $JAVA_AGENT -jar springboot-skywalking-demo-0.0.1-SNAPSHOT.jar #jar启动

等同于

javascript 复制代码
java -javaagent:/root/skywalking-agent/skywalking-agent.jar 
-DSW_AGENT_COLLECTOR_BACKEND_SERVICES=127.0.0.1:11800 
-DSW_AGENT_NAME=springboot-skywalking-demo -jar springboot-skywalking-demo-0.0.1-SNAPSHOT.jar

在IDEA中使用Skywalking

在运行的程序配置jvm参数

javascript 复制代码
-javaagent:D:\weifuwu\skywalking\skywalking-agent\skywalking-agent.jar
-DSW_AGENT_NAME=springboot-skywalking-demo
-DSW_AGENT_COLLECTOR_BACKEND_SERVICES=127.0.0.1:11800
Skywalking跨多个微服务追踪

Skywalking跨多个微服务追踪,只需要每个微服务启动时添加javaagent参数即可。

启动微服务mall-gateway,mall-order,mall-user ,配置skywalking的jvm参数


Skywalking集成日志框架

引入依赖

javascript 复制代码
<!-- apm-toolkit-logback-1.x -->
<dependency>
    <groupId>org.apache.skywalking</groupId>
    <artifactId>apm-toolkit-logback-1.x</artifactId>
    <version>8.11.0</version>
</dependency>

微服务添加logback-spring.xml文件,并配置 %tid 占位符

javascript 复制代码
<?xml version="1.0" encoding="UTF-8"?>
<configuration>

    <appender name="console" class="ch.qos.logback.core.ConsoleAppender">
        <!-- 日志的格式化 -->
        <encoder class="ch.qos.logback.core.encoder.LayoutWrappingEncoder">
            <layout class="org.apache.skywalking.apm.toolkit.log.logback.v1.x.TraceIdPatternLogbackLayout">
                <Pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%tid] [%thread] %-5level %logger{36} -%msg%n</Pattern>
            </layout>
        </encoder>
    </appender>

    <!-- 设置 Appender -->
    <root level="INFO">
        <appender-ref ref="console"/>
    </root>

</configuration>

Skywalking通过grpc上报日志 (需要v8.4.0以上)

gRPC报告程序可以将收集到的日志转发到SkyWalking OAP服务器上

logback-spring.xml中添加

javascript 复制代码
<!-- https://skywalking.apache.org/docs/skywalking-java/latest/en/setup/service-agent/java-agent/application-toolkit-logback-1.x/  -->
<!-- 通过grpc上报日志到skywalking oap-->
<appender name="grpc-log" class="org.apache.skywalking.apm.toolkit.log.logback.v1.x.log.GRPCLogClientAppender">
    <encoder class="ch.qos.logback.core.encoder.LayoutWrappingEncoder">
        <layout class="org.apache.skywalking.apm.toolkit.log.logback.v1.x.TraceIdPatternLogbackLayout">
            <Pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%tid] [%thread] %-5level %logger{36} -%msg%n</Pattern>
        </layout>
    </encoder>
</appender>

Skywalking告警通知

skywalking告警的核心由一组规则驱动,这些规则定义在config/alarm-settings.yml文件中,告警规则的定义分为三部分:

  • 告警规则:它们定义了应该如何触发度量警报,应该考虑什么条件;
  • 网络钩子(Webhook}:当警告触发时,哪些服务终端需要被通知;
  • gRPC钩子:远程gRPC方法的主机和端口,告警触发后调用;

如service_resp_time_rule规则:

该规则表示服务{name}的响应时间在最近10分钟的3分钟内超过1000ms

  • metrics-name:度量名称,也是OAL脚本中的度量名。默认配置中可以用于告警的度量有:服务,实例,端点,服务关系,实例关系,端点关系。它只支持long,double和int类型。
  • op:操作符。
  • threshold:阈值。
  • period:多久告警规则需要被检查一下。这是一个时间窗口,与后端部署环境时间相匹配。
  • count:在一个周期窗口中,如果按op计算超过阈值的次数达到count,则发送告警
  • silence-period:在时间N中触发报警后,在N -> N + silence-period这段时间内不告警。
  • message:该规则触发时,发送的通知消息。

测试:编写接口,模拟慢查询

java 复制代码
@RequestMapping("/info/{id}")
public User info(@PathVariable("id") Integer id){
    try {
        Thread.sleep(2000);
    } catch (InterruptedException e) {
        e.printStackTrace();
    }
    return userService.getById(id);
}

过段时间会在skywalking控制界面出现了告警信息

实现回调接口

java 复制代码
@RequestMapping("/notify")
public String notify(@RequestBody Object obj){
    //TODO 告警信息,给技术负责人发短信,钉钉消息,邮件,微信通知等
    System.err.println(obj.toString());
    return "notify successfully";
}

在config/alarm-settings.yml中配置回调接口,并重启skywalking服务

测试访问:http://localhost:8000/user/info/1,满足告警规则后,控制台输出告警信息


Skywalking持久化追踪数据

基于mysql持久化

  1. 修改config目录下的application.yml,使用mysql作为持久化存储的仓库
  1. 修改mysql连接配置
javascript 复制代码
storage:
  #选择使用mysql   默认使用h2,不会持久化,重启skyWalking之前的数据会丢失
  selector: ${SW_STORAGE:mysql}
  #使用mysql作为持久化存储的仓库
  mysql:
    properties:
      #数据库连接地址  创建swtest数据库
      jdbcUrl: ${SW_JDBC_URL:"jdbc:mysql://1ocalhost:3306/swtest"}
      #用户名
      dataSource.user: ${SW_DATA_SOURCE_USER:root}
      #密码
      dataSource.password: ${SW_DATA_SOURCE_PASSWORD:123456}

注意:需要添加mysql数据驱动包,因为在lib目录下是没有mysql数据驱动包的,所以修改完配置会启动失败。

添加mysql数据驱动包到oap-libs目录下

启动Skywalking后,查看swtest数据库,可以看到生成了很多表。

访问地址​​​​​​​http://localhost:8000/,可以看到skywalking的web界面。


自定义SkyWalking链路追踪

如果我们希望对项目中的业务方法,实现链路追踪,方便我们排查问题,可以使用如下的代码

引入依赖

javascript 复制代码
<!-- SkyWalking 工具类 -->
<dependency>
    <groupId>org.apache.skywalking</groupId>
    <artifactId>apm-toolkit-trace</artifactId>
    <version>8.11.0</version>
</dependency>

在业务方法中可以TraceContext获取到traceId

java 复制代码
@RequestMapping("/list")
public List<User> list(){
    //TraceContext可以绑定key-value
    TraceContext.putCorrelation("name", "zhangsan");
    Optional<String> op = TraceContext.getCorrelation("name");
    log.info("name = {} ", op.get());
    //获取追踪的traceId
    String traceId = TraceContext.traceId();
    log.info("traceId = {} ", traceId);
    return userService.list();
}

通过得到的traceId可以去ui中查询。


@Trace将方法加入追踪链路

如果一个业务方法想在ui界面的追踪链路上显示出来,只需要在业务方法上加上@Trace注解即可

加入@Tags或@Tag

可以为追踪链路增加其他额外的信息,比如记录参数和返回信息。实现方式:在方法上增加@Tag或者@Tags。

java 复制代码
@Trace
@Tag(key = "list", value = "returnedObj")
public List<User> list(){
    return userMapper.list();
}

@Trace
@Tags({@Tag(key = "param", value = "arg[0]"),
        @Tag(key = "user", value = "returnedObj")})
public User getById(Integer id){
    return userMapper.getById(id);
}
相关推荐
茶馆大橘42 分钟前
微服务系列六:分布式事务与seata
分布式·docker·微服务·nacos·seata·springcloud
58沈剑1 小时前
80后聊架构:架构设计中两个重要指标,延时与吞吐量(Latency vs Throughput) | 架构师之路...
架构
狂放不羁霸2 小时前
idea | 搭建 SpringBoot 项目之配置 Maven
spring boot·maven·intellij-idea
成富2 小时前
文本转SQL(Text-to-SQL),场景介绍与 Spring AI 实现
数据库·人工智能·sql·spring·oracle
计算机学长felix3 小时前
基于SpringBoot的“校园交友网站”的设计与实现(源码+数据库+文档+PPT)
数据库·spring boot·毕业设计·交友
码农派大星。3 小时前
Spring Boot 配置文件
java·spring boot·后端
江深竹静,一苇以航3 小时前
springboot3项目整合Mybatis-plus启动项目报错:Invalid bean definition with name ‘xxxMapper‘
java·spring boot
鹿屿二向箔4 小时前
基于SSM(Spring + Spring MVC + MyBatis)框架的汽车租赁共享平台系统
spring·mvc·mybatis
豪宇刘4 小时前
SpringBoot+Shiro权限管理
java·spring boot·spring
想进大厂的小王4 小时前
项目架构介绍以及Spring cloud、redis、mq 等组件的基本认识
redis·分布式·后端·spring cloud·微服务·架构