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);
}
相关推荐
二哈喇子!1 天前
SpringBoot项目右上角选择ProjectNameApplication的配置
java·spring boot
二哈喇子!1 天前
基于Spring Boot框架的车库停车管理系统的设计与实现
java·spring boot·后端·计算机毕业设计
二哈喇子!1 天前
基于SpringBoot框架的水之森海底世界游玩系统
spring boot·旅游
二哈喇子!1 天前
Java框架精品项目【用于个人学习】
java·spring boot·学习
二哈喇子!1 天前
基于SpringBoot框架的网上购书系统的设计与实现
java·大数据·spring boot
Leon Cheng1 天前
Canvas + DOM 混合渲染架构:高性能文本编辑器的创新方案
架构
码农三叔1 天前
(3-2)机器人身体结构与人体仿生学:人形机器人躯干系统
人工智能·架构·机器人·人形机器人
二哈喇子!1 天前
基于JavaSE的淘宝卖鞋后端管理系统的设计与实现
java·spring boot·spring
Coder_Boy_1 天前
基于SpringAI的在线考试系统-智能考试系统-学习分析模块
java·开发语言·数据库·spring boot·ddd·tdd
代码游侠1 天前
学习笔记——时钟系统与定时器
arm开发·笔记·单片机·嵌入式硬件·学习·架构