SkyWalking 微服务链路追踪

上一篇文章微服务分布式组件—Gateway

8. SkyWalking 微服务链路追踪


8.1 介绍 SkyWalking

链路追踪的介绍

对于一个大型的几十个、几百个微服务构成的微服务架构系统,通常会遇到下面一些问题:

  • 如何串联整个调用链路,快速定位问题
  • 如何缕清各个微服务之间的依赖关系
  • 如何进行个各位服务接口的性能分析
  • 如何跟踪整个业务流程的调用处理顺序

Skywalking 是什么

Skywalking 是一个国产开源框架,2015年由吴晟开源,2017年加入 Apache 孵化器。Skywalking 是分布式系统的应用程序性能监视工具,专为微服务、云原生架构和基于容器(Docker、K8s、Mesos)架构而设计。它是一款优秀的 APM(Application Performance Management)工具,包括了分布式追踪、性能指标分析、应用和服务以来分析等

🌈 官网:https://skywalking.apache.org/

🌈 下载:https://skywalking.apache.org/downloads/

🌈 Github:https://github.com/apache/skywalking

🌈 文档:https://skywalking.apache.org/docs/main/v8.5.0/readme/

🌈 中文文档:https://skyapm.github.io/document-cn-translation-of-skywalking/

链路追踪框架对比

  1. ZipKinTwitter 开源的调用链路分析工具,目前基于 SpringCloud sleuth 得到了广泛的使用,特点是轻量,使用部署简单

  2. Pinpoint 是韩国人开源的基于字节码注入的调用链分析,以及应用监控分析工具。特点是支持多种插件,UI 功能强大,接入端无代码侵入

  3. Skywalking 是本土开源的基于字节码注入的调用链路分析,以及应用监控分析工具。特点是支持多种插件,UI 功能强大,接入端无代码侵入。目前已加入 Apache 孵化器

  4. CAT 是大众点评开源的基于编码和配置的调用链路分析,应用监控分析,日志采集,监控报警等一系列的监控平台工具

项目CATZipKinSkywalking
调用链可视化
聚合报表非常丰富较丰富
服务依赖图简单简单比较好
埋点方式侵入式侵入式非侵入式,字节码增强
VM 监控指标
支持语言java/.net丰富java/.net/Node.js/php/go
存储机制mysql(报表)、本地文件/HDFS(调用链)内存、es、mysql等H2、es、mysql等
社区支持主要在国内国外主流Apache 支持
使用案例美团、携程、陆金所京东、阿里定制后不开源华为、小米、当当、微众银行
APM
开发基础eBay calGoogle DapperGoogle Dapper
是否支持 webflux
Github12.3k12.2k11.8k

性能对比

模拟了三中国并发用于:500,750,100 使用 JMeter 测试,每个线程发送30个请求,设置思考时间为10ms。使用的采样率为1,即100%,这边与生产可能有差别。Pinpoint 默认的采样率为20,即50%,通过设置 agent 的配置文件改为100%。ZipKin 默认也是1.组合起来一共有12种

在这里插入图片描述

从上表可以看出,在三种链路监控组件中,Skywalking 的探针对吞吐量的影响最小,ZipKin 的吞吐量居中。Pinpoint 的探针吞吐量的影响较为明显,在500并发用户时,测试服务的吞吐量从1385降低到774,影响很大。然后再看下CPU和memory影响,在内部服务器进行的压测,对CPU和memory的影响都差不多在10%

Skywalking 主要功能特性

  1. 多种监控手段,可以通过语言探针和 service mesh 获得监控的数据
  2. 支持多种语言自动探针,包括 Java,.NET Code 和 Node.JS
  3. 轻量高效、无需大数据平台和大量的服务器资源
  4. 模块化,UI、存储、集群管理都有多种机制可选
  5. 支持告警
  6. 优秀的可视化解决方案

8.2 Skywalking—服务搭建

在这里插入图片描述

  • Skywalking Agent 和业务系统绑定在一起,负责收集各种监控数据
  • Skywalking Oapservice 是负责处理监控数据的,比如接收 Skywalking Agent 的监控数据,并存储在数据库种;接收 Skywalking Webapp 的前端请求,从数据库查询数据,并返回数据给前端。Skywalking Oapservice 通常以集群的形式存在
  • Skywalking Webapp,前端界面,用于展示数据
  • 用于存储监控数据的数据库,比如 MySQL、Elasticsearch

下载 SkyWalking

🌈 https://skywalking.apache.org/downloads/

🌈 个人使用的版本

在这里插入图片描述

注意不要将解压后的文件放在带有"空格"的文件夹下,这样会导致 xxx.bat文件运行时闪退

在这里插入图片描述

目录结构

  • webapp:UI 前端(web 监控页面)的 jar 包和配置文件

  • oap-libs:后台应用的 jar 包,以及它的依赖 jar 包,里边有一个 server-starter-*.jar 就是启动程序

  • config:启动后台应用程序的配置文件,是使用的各种配置文件

  • bin:各种启动脚本,一般使用脚本 startup.* 来启动 web页面 和对应的 后台应用

    • oapService.*:默认使用的后台程序和启动脚本:(使用的是默认模式启动,还支持其它模式,各种模式区别见 启动模式)
    • oapServiceInit.*:使用 init 模式启动;再次模式下,OAP 服务器启动以执行初始化工作,然后退出
    • oapServiceNoInit.*:使用 No Init 模式启动;在此模式下, OAP 服务不进行初始化
    • startup.*:组合脚本,同时启动 oapService. *;webappService. * 脚本
  • agent:(在搭建微服务的时候会用到)

    • skywalking-agent.jar:代理服务 jar 包
    • config:代理服务启动时使用的配置文件
    • plugins:包含多个插件,代理服务启动时会加载该目录下的所有插件(实际是各种 jar 包)
    • optional-plugins:可选插件,当然需要支持某种功能时,比如 SpringCloud Gateway,则需要把对应的 jar 包拷贝到 plugins 目录下
  1. skywalking-web-ui 服务会占用 8080 端口,修改端口可以修改/webapp/webapp.yml

在这里插入图片描述

  1. Windows 启动/bin/目录下的 startup.bat会自动执行oapService.batwebappService.bat

在这里插入图片描述

  1. 启动成功后,一个是 skywalking-oap-server,一个是 skywalking-web-ui:8868

在这里插入图片描述

  1. skywalking-oap-server 服务启动后会暴露 1180012800 两个端口,分别为收集监控数据的端口 11800 和接收前端请求的端口 12800 ,修改端口可以修改/config/application.yml
  • 日志信息存储在 /logs/目录下

在这里插入图片描述

8.3 SkyWalking—接入服务

8.3.1 windows 环境—在IDEA中使用 Skywalking
  1. 在运行的程序配置jvm参数,如下图所示:

在这里插入图片描述

# skywalking-agent.jar 的本地磁盘路径
-javaagent:D:\Files\apache-skywalking-apm-bin-es7\agent\skywalking-agent.jar
# 在 skywalking 上显示的服务名
-DSW_AGENT_NAME=api-gateway
# skywalking 的 collector 服务的IP及端口
-DSW_AGENT_COLLECTOR_BACKEND_SERVICES=127.0.0.1:11800
  1. 配置springcloud-gateway-8088下的application.yml文件
server:
  port: 8088
spring:
  application:
    # 服务名称
    name: api-gateway
  cloud:
    # 配置 Nacos
    nacos:
      discovery:
        server-addr: 192.168.159.100:7070,192.168.159.100:7080,192.168.159.100:7090
        username: nacos
        password: nacos
    inetutils:
      # 配置忽略的网卡信息
      ignored-interfaces: 'VMware Virtual Ethernet Adapter for VMnet1,VMware Virtual Ethernet Adapter for VMnet8'
    # gateway 配置
    gateway:
      # 路由规则
      routes:
        - id: consumer_route  # 路由的唯一标识,路由到consumer
          uri: lb://springcloud-consumer-dept  # 从nacos中按照服务名获取微服务   lb: 使用nacos中的本地负载均衡策略
          # 断言规则  用于路由规则的匹配
          predicates:
            - Path=/consumer/**
  1. 启动配置的 Nacos 服务

  2. 启动springcloud-gateway-8088

  3. 启动springcloud-provider-dept-8001

  4. 启动springcloud-consumer-dept-80

  5. 访问网关经过的一个接口http://localhost:8088/consumer/dept/msg

  6. 在已运行/bin/目录下的 startup.bat的情况下,访问http://localhost:8868/

在这里插入图片描述

在这里插入图片描述

  • 解决办法

在这里插入图片描述

  1. 重新运行/bin/目录下的 startup.bat

  2. 重新启动springcloud-gateway-8088服务

  3. 访问网关经过的一个接口http://localhost:8088/consumer/dept/msg

  4. 访问http://localhost:8868/

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

8.3.2 Linux 环境—通过 jar 包方式接入
  1. 准备一个 springboot 程序,打成可执行 jar 包,写一个 shell 脚本,再启动项目的 Shell 脚本上,通过 -javaagent 参数进行配置 SkyWalking Agent 来跟踪服务

    startup.sh 脚本

    #!/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:/usr/local/apache-skywalking-apm-bin-es7/agent/skywalking-agent.jar
    java $JAVA_AGENT -jar springboot-skywalking-demo-0.0.1-SNAPSHOT.jar # jar启动
    
8.3.3 SkyWalking跨多个微服务跟踪

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

测试

  1. 修改springcloud-gateway-8088模块下的application.yml文件
server:
  port: 8088
spring:
  application:
    # 服务名称
    name: api-gateway
  cloud:
    # 配置 Nacos
    nacos:
      discovery:
        server-addr: 127.0.0.1:8848
        username: nacos
        password: nacos
    inetutils:
      # 配置忽略的网卡信息
      ignored-interfaces: 'VMware Virtual Ethernet Adapter for VMnet1,VMware Virtual Ethernet Adapter for VMnet8'
    # gateway 配置
    gateway:
      # 路由规则
      routes:
        - id: consumer_route  # 路由的唯一标识,路由到consumer
          uri: lb://springcloud-provider-order-seata  # 从nacos中按照服务名获取微服务   lb: 使用nacos中的本地负载均衡策略
          # 断言规则  用于路由规则的匹配
          predicates:
            - Path=/order/**
  1. springcloud-provider-order-seata-8006模块添加 JVM 参数配置

在这里插入图片描述

  1. springcloud-provider-stock-seata-8007模块添加 JVM 参数配置

在这里插入图片描述

  1. 启动 Nacos 服务(这里使用本地的 Nacos 注册中心)
  2. 启动 seata-server服务
  3. 重新运行/bin/目录下的 startup.bat
  4. 启动springcloud-provider-order-seata-8006
  5. 启动springcloud-provider-stock-seata-8007
  6. 启动springcloud-gateway-8088
  7. 访问http://localhost:8088/order/add
  8. 访问http://localhost:8868/

在这里插入图片描述

在这里插入图片描述

  • 第一栏:不同内容主题的监控面板,应用性能管理/数据库/容器等

  • 第二栏:操作,抱包括 编辑/导出当前数据/导入展示数据/不同服务端点筛选展示

  • 第三栏:不同纬度展示,全局/服务/实例/端点

展示栏

Global 全局维度

  • 第一栏:Global、Service、Instance、Endpoint 不同展示面板

    • Services Load:服务每分钟请求数

    • Slow Services:慢响应服务,单位 ms

    • Un-Health Services(Apdex):Apdex 性能指标,1为满分

    • Slow Endpoint:慢响应端点,单位 ms

    • Global Response Latency:百分比响应延时,不同百分比的延时时间,单位 ms

    • Global Heatmap:服务响应时间热力分布图,根据时间段内不同响应时间的数量显示颜色深度

底部栏:展示数据的时间区间,点击可以调整

在这里插入图片描述

Service 服务维度

  • Service Apdex(数字):当前服务的评分

  • Service Apdex(折线图):不同时间的 Apdex 评分

  • Service Avg Response Times:平均响应延时,单位 ms

  • Successful Rate(数字):请求成功率

  • Successful Rate(折线图):不同时间的请求成功率

  • Service Load(数字):每分钟请求数

  • Service Load(折线图):不同时间的每分钟请求数

  • Service Instances Load:每个服务实例的每分钟请求数

  • Show Service Instance:每个服务实例的最大延时

  • Service Instance Successful Rate:每个服务实例的请求成功率

在这里插入图片描述

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-xF97j3iL-1654317914722)(E:\笔记\image\image-20220515213153978.png#pic_center =800x)]

8.3.4 SkyWalking—使用MySQL持久化

默认使用 H2 数据库存储

/config/application.yml

在这里插入图片描述

基于 MySQL 持久化

  1. 修改/config/目录下的 application.yml文件,使用 mysql 作为持久化存储的仓库

  1. 修改 mysql 连接配置

在这里插入图片描述

  1. 创建数据库 swtest

在这里插入图片描述

  1. 启动/bin/目录下的 startup.bat

在这里插入图片描述

启动失败,oapService.bat闪退

查看 /log/目录下的 skywalking-oap-server.log文件

在这里插入图片描述

  • 解决办法

在这里插入图片描述

在这里插入图片描述

  • 重新启动/bin/目录下的 startup.bat
  1. 将三个服务都启动springcloud-provider-order-seata-8006springcloud-provider-stock-seata-8007springcloud-gateway-8088
  2. 查看数据库swtest

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

再启动oapService.bat服务,刷新http://localhost:8868/

在这里插入图片描述

8.3.5 SkyWalking—自定义链路追踪

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

2022-05-15 23:30:49.421 ERROR 10972 — [nio-8006-exec-1] o.a.c.c.C.[.[.[/].[dispatcherServlet] : Servlet.service() for servlet [dispatcherServlet] in context with path [] threw exception [Request processing failed; nested exception is org.apache.ibatis.binding.BindingException: Invalid bound statement (not found): com.vinjcent.springcloud.mapper.OrderMapper.getOrderById] with root cause

  • 问题:没有找到接口绑定的映射文件

解决:在该项目的maven中"clear"一下之后再"install"一下

方法与参数追踪

加入@Trace追踪链路方法

加入@Tags@Tag

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

/**
	@Tag(key = "方法名",value = "记录返回值")
*/
@Override
@Trace
@Tag(key = "getAllOrders",value = "returnedObj")
public List<Order> getAllOrders() {
    return orderMapper.getAllOrders();
}

/**
@Tags({
        @Tag(key = "记录参数",value = "参数索引"),
        @Tag(key = "方法名",value = "返回值")
})
*/
@Override
@Tags({
    @Tag(key = "param",value = "arg[0]"),
    @Tag(key = "getOrderById",value = "returnedObj")
})
public Order getOrderById(Integer id) {
    return orderMapper.getOrderById(id);
}
  1. springcloud-provider-order-seata-8006模块下引入依赖
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <parent>
        <artifactId>seata</artifactId>
        <groupId>com.vinjcent</groupId>
        <version>0.0.1-SNAPSHOT</version>
    </parent>
    <modelVersion>4.0.0</modelVersion>

    <artifactId>springcloud-provider-order-seata-8006</artifactId>

    <properties>
        <maven.compiler.source>8</maven.compiler.source>
        <maven.compiler.target>8</maven.compiler.target>
    </properties>

    <dependencies>
        <!--nacos-服务注册与发现-->
        <dependency>
            <groupId>com.alibaba.cloud</groupId>
            <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
        </dependency>
        <!--openfeign-->
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-openfeign</artifactId>
        </dependency>
        <!--seata依赖-->
        <dependency>
            <groupId>com.alibaba.cloud</groupId>
            <artifactId>spring-cloud-starter-alibaba-seata</artifactId>
        </dependency>
        <!--SkyWalking 工具类-->
        <dependency>
            <groupId>org.apache.skywalking</groupId>
            <artifactId>apm-toolkit-trace</artifactId>
            <version>8.5.0</version>
        </dependency>
        <!--SkyWalking 服务端核心包-->
        <dependency>
            <groupId>org.apache.skywalking</groupId>
            <artifactId>server-core</artifactId>
            <version>8.5.0</version>
        </dependency>
    </dependencies>

    <build>
        <resources>
            <resource>
                <directory>src/main/resources</directory>
                <includes>
                    <include>**/*.properties</include>
                    <include>**/*.yml</include>
                    <include>**/*.xml</include>
                </includes>
                <filtering>true</filtering>
            </resource>
            <resource>
                <directory>src/main/java</directory>
                <includes>
                    <include>**/*.properties</include>
                    <include>**/*.yml</include>
                    <include>**/*.xml</include>
                </includes>
                <filtering>true</filtering>
            </resource>
        </resources>
    </build>


</project>
  1. 修改OrderController.class
@SuppressWarnings("all")
@RestController
@RequestMapping("/order")
public class OrderController {


    @Autowired
    private OrderService orderService;

    @RequestMapping("/add")
    public String addOrder(){

        Order order = new Order();
        order.setProductId(9)
                .setStatus("下单成功")
                .setTotalAmount(100);

        // 插入订单信息
        orderService.addOrder(order);

        return "下单成功";
    }

    @RequestMapping("/get/{id}")
    public Order getOrder(@PathVariable("id") Integer id){
        return orderService.getOrderById(id);
    }

    @RequestMapping("/getAll")
    public List<Order> getAllOrders(){
        return orderService.getAllOrders();
    }

}
  1. 修改 OrderServiceImpl.class
@SuppressWarnings("all")
@Service
public class OrderServiceImpl implements OrderService {

    @Autowired
    private StockService stockService;

    @Autowired
    private OrderMapper orderMapper;


    @Override
    public int addOrder(Order order) {

        int result = orderMapper.addOrder(order);

        // 扣减库存
        stockService.reductStock(order.getProductId());

        // 模拟异常
        int a = 1/0;

        return result;
    }

    @Override
    @Trace
    @Tags({
            @Tag(key = "param",value = "arg[0]"),
            @Tag(key = "getOrderById",value = "returnedObj")
    })
    public Order getOrderById(Integer id) {
        return orderMapper.getOrderById(id);
    }

    @Override
    @Trace
    @Tag(key = "getAllOrders",value = "returnedObj")
    public List<Order> getAllOrders() {
        return orderMapper.getAllOrders();
    }

    @Override
    public int deleteOrder(Integer id) {
        return orderMapper.deleteOrder(id);
    }

    @Override
    public int updateOrder(Order order) {
        return orderMapper.updateOrder(order);
    }
}
  1. 重新启动springcloud-provider-order-seata-8006
  2. 访问http://localhost:8088/order/getAll

在这里插入图片描述

在这里插入图片描述

  1. 访问http://localhost:8088/order/get/22

在这里插入图片描述

在这里插入图片描述

8.4 Skywalking—性能剖析

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

8.5 Skywalking—集成日志框架

🌈 logback官方配置

🌈 log4j官方配置

🌈 log4j-2.x官方配置

测试

springcloud-provider-order-seata-8006模块下操作一下步骤

  1. 引入依赖

添加的版本需要保持与服务端版本一致

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <parent>
        <artifactId>seata</artifactId>
        <groupId>com.vinjcent</groupId>
        <version>0.0.1-SNAPSHOT</version>
    </parent>
    <modelVersion>4.0.0</modelVersion>

    <artifactId>springcloud-provider-order-seata-8006</artifactId>

    <properties>
        <maven.compiler.source>8</maven.compiler.source>
        <maven.compiler.target>8</maven.compiler.target>
    </properties>

    <dependencies>
        <!--nacos-服务注册与发现-->
        <dependency>
            <groupId>com.alibaba.cloud</groupId>
            <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
        </dependency>
        <!--openfeign-->
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-openfeign</artifactId>
        </dependency>
        <!--seata依赖-->
        <dependency>
            <groupId>com.alibaba.cloud</groupId>
            <artifactId>spring-cloud-starter-alibaba-seata</artifactId>
        </dependency>
        <!--SkyWalking 工具类-->
        <dependency>
            <groupId>org.apache.skywalking</groupId>
            <artifactId>apm-toolkit-trace</artifactId>
            <version>8.5.0</version>
        </dependency>
        <!--SkyWalking 日志依赖-->
        <dependency>
            <groupId>org.apache.skywalking</groupId>
            <artifactId>apm-toolkit-logback-1.x</artifactId>
            <version>8.5.0</version>
        </dependency>
    </dependencies>

    <build>
        <resources>
            <resource>
                <directory>src/main/resources</directory>
                <includes>
                    <include>**/*.properties</include>
                    <include>**/*.yml</include>
                    <include>**/*.xml</include>
                </includes>
                <filtering>true</filtering>
            </resource>
            <resource>
                <directory>src/main/java</directory>
                <includes>
                    <include>**/*.properties</include>
                    <include>**/*.yml</include>
                    <include>**/*.xml</include>
                </includes>
                <filtering>true</filtering>
            </resource>
        </resources>
    </build>


</project>
  1. 添加logback-spring.xml文件在resources/目录下,并配置 [%TID]

logback-spring.xml文件

<?xml version="1.0" encoding="UTF-8" ?>
<configuration>

    <!--  引入 SpringBoot 默认的 logback XML 配置文件  -->
    <include resource="org/springframework/boot/logging/logback/defaults.xml" />

    <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>-%clr(%d{${LOG_DATEFORMAT_PATTERN:-yyyy-MM-dd HH:mm:ss.SSS}}){faint} %clr(${LOG_LEVEL_PATTERN:-%5p}) %clr(${PID:- }){magenta} [%tid] %clr(---){faint} %clr([%15.15t]){faint} %clr(%-40.40logger{39}){cyan} %clr(:){faint} %m%n${LOG_EXCEPTION_CONVERSION_WORD:-%wEx}}</Pattern>
            </layout>
        </encoder>

    </appender>

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


</configuration>

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

  1. 启动springcloud-provider-order-seata-8006

在这里插入图片描述

  1. springcloud-gateway-8088服务下访问springcloud-provider-order-seata-8006下的接口

在这里插入图片描述

在这里插入图片描述

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

gRPC 报告程序可以收集到的日志转发到 SkyWalking OAP 服务器上,这样就不需要每次都在控制面板中查看日志信息了

logback-spring.xml中添加

<?xml version="1.0" encoding="UTF-8" ?>
<configuration>

    <!--  引入 SpringBoot 默认的 logback XML 配置文件  -->
    <include resource="org/springframework/boot/logging/logback/defaults.xml" />

    <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>-%clr(%d{${LOG_DATEFORMAT_PATTERN:-yyyy-MM-dd HH:mm:ss.SSS}}){faint} %clr(${LOG_LEVEL_PATTERN:-%5p}) %clr(${PID:- }){magenta} [%tid] %clr(---){faint} %clr([%15.15t]){faint} %clr(%-40.40logger{39}){cyan} %clr(:){faint} %m%n${LOG_EXCEPTION_CONVERSION_WORD:-%wEx}}</Pattern>
            </layout>
        </encoder>

    </appender>

    <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.mdc.TraceIdMDCPatternLogbackLayout">
                <Pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%X{tid}] [%thread] %-5level %logger{36} -%msg%n</Pattern>
            </layout>
        </encoder>
    </appender>

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


</configuration>

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

注意】如果 SkyWalking 服务不是部署在本地,日志无法上报到 SkyWalking 需要修改\agent\config目录下的agent.config文件

将下面信息复制到文件底部

plugin.toolkit.log.grpc.reporter.server_host=${SW_GRPC_LOG_SERVER_HOST:127.0.0.1}
plugin.toolkit.log.grpc.reporter.server_port=${SW_GRPC_LOG_SERVER_PORT:11800}
plugin.toolkit.log.grpc.reporter.max_message_size=${SW_GRPC_LOG_MAX_MESSAGE_SIZE:10485760}
plugin.toolkit.log.grpc.reporter.upstream_timeout=${SW_GRPC_LOG_GRPC_UPSTREAM_TIMEOUT:30}
配置名解释默认值
plugin.toolkit.log.transmit_formatted是否格式化或未格式化的格式传输记录的数据true
plugin.toolkit.log.grpc.reporter.server_host指定要向其报告日志数据的 grpc 服务器的主机127.0.0.1
plugin.toolkit.log.grpc.reporter.server_port指定要向其报告日志数据的 grpc 服务器的端口11800
plugin.toolkit.log.grpc.reporter.max_message_size指定 grpc 客户端要报告的日志数据的最大大小10485760
plugin.toolkit.log.grpc.reporter.upstream_timeout客户端向上游发送数据时将超时多长时间。单位是秒30

8.6 SkyWalking—告警功能

SkyWalking 告警功能是在 6.x 版本新增的,其核心由一组规则驱动,这些规则定义在config/alarm-settings.yml文件中。告警规则的定义分为两部分:

  1. 告警规则:它们定义了应该如何触发度量报警,应该考虑什么条件
  2. Webhook(网络钩子):定义当警告触发时,哪些服务终端需要被告知

在这里插入图片描述

在这里插入图片描述

告警规则

SkyWalking 的发行版都会默认提供config/alarm-settings.yml文件,里面预先定义了一些常用的告警规则,如下:

  1. 在过去 3 分钟内服务平均响应时间超过 1 秒
  2. 在过去 2 分钟服务成功率低于 80%
  3. 在过去 3 分钟内服务响应时间超过 1s 的百分比
  4. 服务实例在过去 2 分钟平均响应时间超过 1s,并且实例名称与正则表达式匹配
  5. 过去 2 分钟内端点平均响应时间超过 1s
  6. 过去 2 分钟内数据库访问平均响应时间超过 1s
  7. 过去 2 分钟内端点关系平均响应时间超过 1s

这些预定义的告警规则,打开config/alarm-settings.yml文件即可查到

告警规则配置项的说明

  • Rule name:规则名称,也是在告警信息中显示的唯一名称。必须以rule结尾,前缀可自定义
  • Metrics name:度量名称,取值为 oal 脚本中的度量名,目前只支持 long、double 和 int 类型。详见Official OAL script
  • Include names:该规则作用于哪些实体名称,比如服务名、终端名(可选、默认为全部)
  • Exclude names:该规则不做用于哪些实体名称,比如服务名、终端名(可选、默认为空)
  • Threshold:阈值
  • OP:操作符,目前支持 >、<、=
  • Period:多久告警规则需要被核实一下。这是一个时间窗口,与后端部署环境时间相匹配
  • Count:在一个 Period 窗口中,如果 values 超过 Threshold 值(按op),达到 Count 值,需要发送警报
  • Slience period:在时间 N 中触发警报后,在 TN -> TN + period 这个阶段不告警。默认情况下,它和 Period 一样,这意味着相同的告警(在同一个 Metrics name 拥有相同的id)在同一个 Period 内只会触发一次

Webhook(网络钩子)

Webhook 可以简单理解为一种 Web 层面的回调机制,通常由一些事件触发,与代码中的事件回调类似,只不过是 Web 层面的,所以当事件发生时,回调的不再是代码中的方法或函数,而是服务接口。例如,在告警这个场景,告警就是一个事件。当该事件发生时,SkyWalking 就会主动去调用一个配置好的接口,该接口就是所谓的 Webhook

Skywalking 的告警信息会通过 HTTP 请求进行发送,请求方法为 POSTContent-Typeapplication/json,其 JSON 数据基于 List<org.apache.skywalking.oap.server.core.alarm.AlarmMessage> 进行序列化的。JSON 数据示例

在这里插入图片描述

[{
	"scopeId": 1, 
	"scope": "SERVICE",
	"name": "serviceA", 
	"id0": "12",  
	"id1": "",  
    "ruleName": "service_resp_time_rule",
	"alarmMessage": "alarmMessage xxxx",
	"startTime": 1560524171000
}, {
	"scopeId": 1,
	"scope": "SERVICE",
	"name": "serviceB",
	"id0": "23",
	"id1": "",
    "ruleName": "service_resp_time_rule",
	"alarmMessage": "alarmMessage yyy",
	"startTime": 1560524171000
}]
  • scopeIdscope. 所有范围都在 org.apache.skywalking.oap.server.core.source.DefaultScopeDefine 中定义
  • name. 目标范围实体名称。请按照实体名称定义
  • id0. 范围实体的 ID 与名称匹配。使用关系范围时,它是源实体 ID
  • id1. 使用关系范围时,它将是目标实体 ID。否则,它是空的
  • ruleName. 您在 中配置的规则名称alarm-settings.yml
  • alarmMessage. 报警消息
  • startTime. 告警时间以毫秒为单位,介于当前时间和 UTC 时间 1970 年 1 月 1 日午夜之间

在这里插入图片描述

测试

  1. springcloud-gateway-8088添加SwAlarmController.class

package com.vinjcent.springcloud.controller;

import com.vinjcent.springcloud.pojo.SwAlarmMessage;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

import java.util.List;
import java.util.logging.Logger;


@RestController
@RequiredArgsConstructor
@RequestMapping("/alarm")
public class SwAlarmController {

    Logger log = Logger.getLogger(this.getClass().getName());

    /**
     * 接收Skywalking服务的告警通知并发送至邮箱
     * 必须是post请求
     * @param alarmList
     */
    @PostMapping("/receive")
    public void receive(@RequestBody List<SwAlarmMessage> alarmList){
//        SimpleMailMessage mailMessage = new SimpleMailMessage();
//        // 发送者邮箱
//        mailMessage.setFrom("from");
//        // 接收者邮箱
//        mailMessage.setTo("to");
//        // 主题
//        mailMessage.setSubject("主题");
//        // 邮件内容
//        String content = getContent(alarmList);
//        mailMessage.setText("content");
//        sender.send(mailMessage);

        String content = getContent(alarmList);
        log.info("告警邮箱已发送..."+content);

    }

    private String getContent(List<SwAlarmMessage> alarmList){
        StringBuilder sb = new StringBuilder();
        alarmList.forEach(message -> sb.append("scopeId: ").append(message.getScopeId())
                .append("\nscope: ").append(message.getScope())
                .append("\n目标 Scope 的实体类名称: ").append(message.getName())
                .append("\nScope 实体类的 ID: ").append(message.getId0())
                .append("\nid1: ").append(message.getId1())
                .append("\n告警规则名称: ").append(message.getRuleName())
                .append("\n告警消息内容: ").append(message.getAlarmMessage())
                .append("\n告警时间: ").append(message.getStartTime())
                .append("\n标签: ").append(message.getTags())
                .append("\n\n-----------------\n\n "));

        return sb.toString();
    }
}


  1. 添加实体类 SwAlarmMessage.class

package com.vinjcent.springcloud.pojo;

import org.apache.skywalking.oap.server.core.analysis.manual.searchtag.Tag;


import java.util.List;

public class SwAlarmMessage {

    private int scopeId;
    private String scope;
    private String name;
    private String id0;
    private String id1;
    private String ruleName;
    private String alarmMessage;
    private List<Tag> tags;
    private long startTime;
    private transient int period;
    private transient boolean onlyAsCondition;

    public static class Tag{
        private String key;
        private String value;

        public String getKey() {
            return key;
        }

        public void setKey(String key) {
            this.key = key;
        }

        public String getValue() {
            return value;
        }

        public void setValue(String value) {
            this.value = value;
        }
    }

    public int getScopeId() {
        return scopeId;
    }

    public void setScopeId(int scopeId) {
        this.scopeId = scopeId;
    }

    public String getScope() {
        return scope;
    }

    public void setScope(String scope) {
        this.scope = scope;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public String getId0() {
        return id0;
    }

    public void setId0(String id0) {
        this.id0 = id0;
    }

    public String getId1() {
        return id1;
    }

    public void setId1(String id1) {
        this.id1 = id1;
    }

    public String getRuleName() {
        return ruleName;
    }

    public void setRuleName(String ruleName) {
        this.ruleName = ruleName;
    }

    public String getAlarmMessage() {
        return alarmMessage;
    }

    public void setAlarmMessage(String alarmMessage) {
        this.alarmMessage = alarmMessage;
    }

    public List<Tag> getTags() {
        return tags;
    }

    public void setTags(List<Tag> tags) {
        this.tags = tags;
    }

    public long getStartTime() {
        return startTime;
    }

    public void setStartTime(long startTime) {
        this.startTime = startTime;
    }

    public int getPeriod() {
        return period;
    }

    public void setPeriod(int period) {
        this.period = period;
    }

    public boolean isOnlyAsCondition() {
        return onlyAsCondition;
    }

    public void setOnlyAsCondition(boolean onlyAsCondition) {
        this.onlyAsCondition = onlyAsCondition;
    }
}


🌈 官网连接

后续将继续补充测试告警功能

  • 4
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
Skywalking是一种用于微服务链路追踪的开源工具,它可以帮助开发人员分析和监控微服务架构中各个服务之间的调用关系和性能指标。 通过Skywalking,我们可以实现对微服务之间的调用链路进行追踪。它的工作原理是在每个微服务中嵌入一个Skywalking Agent,该Agent负责采集和发送调用链数据和指标信息到Skywalking Collector。 这些数据可以包括请求的来源、目标服务、请求的参数和响应时间等信息。通过收集和分析这些数据,我们可以了解到整个微服务架构中各个服务之间的调用关系和性能状况。 要实现微服务链路追踪,我们可以使用Zipkin或Skywalking这样的工具。这些工具提供了可视化界面,用于展示微服务之间的调用链路和性能指标。我们只需要在每个微服务中添加相应的Agent,并配置好Collector的地址,就可以开始进行链路追踪了。 总结起来,Skywalking是一种用于微服务链路追踪的工具,通过在每个微服务中嵌入Agent并将数据发送到Collector,可以帮助我们分析和监控微服务架构中各个服务之间的调用关系和性能指标。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* *2* [分布式链路追踪原理详解及SkyWalking、Zipkin介绍](https://blog.csdn.net/weixin_38004638/article/details/115975798)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_1"}}] [.reference_item style="max-width: 50%"] - *3* [分布式链路追踪SkyWalking](https://blog.csdn.net/swimming_in_IT_/article/details/130250233)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_1"}}] [.reference_item style="max-width: 50%"] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Naijia_OvO

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值