失眠网,内容丰富有趣,生活中的好帮手!
失眠网 > SkyWalking 微服务链路追踪

SkyWalking 微服务链路追踪

时间:2024-03-01 08:42:15

相关推荐

SkyWalking 微服务链路追踪

目录

8. SkyWalking 微服务链路追踪8.1 介绍 SkyWalking8.2 Skywalking---服务搭建8.3 SkyWalking---接入服务8.3.1 windows 环境---在IDEA中使用 Skywalking8.3.2 Linux 环境---通过 jar 包方式接入8.3.3 SkyWalking跨多个微服务跟踪8.3.4 SkyWalking---使用MySQL持久化8.3.5 SkyWalking---自定义链路追踪8.4 Skywalking---性能剖析8.5 Skywalking---集成日志框架8.6 SkyWalking---告警功能

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

8. SkyWalking 微服务链路追踪

8.1 介绍 SkyWalking

链路追踪的介绍

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

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

Skywalking 是什么

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

🌈 官网:/

🌈 下载:/downloads/

🌈 Github:/apache/skywalking

🌈 文档:/docs/main/v8.5.0/readme/

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

链路追踪框架对比

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

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

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

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

性能对比

模拟了三中国并发用于: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 主要功能特性

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

8.2 Skywalking—服务搭建

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

下载 SkyWalking

🌈 /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 目录下skywalking-web-ui服务会占用 8080 端口,修改端口可以修改/webapp/webapp.ymlWindows 启动/bin/目录下的startup.bat会自动执行oapService.batwebappService.bat启动成功后,一个是skywalking-oap-server,一个是skywalking-web-ui:8868skywalking-oap-server服务启动后会暴露1180012800两个端口,分别为收集监控数据的端口 11800 和接收前端请求的端口 12800,修改端口可以修改/config/application.yml日志信息存储在/logs/目录下

8.3 SkyWalking—接入服务

8.3.1 windows 环境—在IDEA中使用 Skywalking

在运行的程序配置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

配置springcloud-gateway-8088下的application.yml文件

server:port: 8088spring:application:# 服务名称name: api-gatewaycloud:# 配置 Nacosnacos:discovery:server-addr: 192.168.159.100:7070,192.168.159.100:7080,192.168.159.100:7090username: nacospassword: nacosinetutils:# 配置忽略的网卡信息ignored-interfaces: 'VMware Virtual Ethernet Adapter for VMnet1,VMware Virtual Ethernet Adapter for VMnet8'# gateway 配置gateway:# 路由规则routes:- id: consumer_route # 路由的唯一标识,路由到consumeruri: lb://springcloud-consumer-dept # 从nacos中按照服务名获取微服务 lb: 使用nacos中的本地负载均衡策略# 断言规则 用于路由规则的匹配predicates:- Path=/consumer/**

启动配置的Nacos服务

启动springcloud-gateway-8088

启动springcloud-provider-dept-8001

启动springcloud-consumer-dept-80

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

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

解决办法

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

重新启动springcloud-gateway-8088服务

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

访问http://localhost:8868/

8.3.2 Linux 环境—通过 jar 包方式接入

准备一个 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 数量,默认为 300export JAVA_AGENT=-javaagent:/usr/local/apache-skywalking-apm-bin-es7/agent/skywalking-agent.jarjava $JAVA_AGENT -jar springboot-skywalking-demo-0.0.1-SNAPSHOT.jar # jar启动

8.3.3 SkyWalking跨多个微服务跟踪

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

测试

修改springcloud-gateway-8088模块下的application.yml文件

server:port: 8088spring:application:# 服务名称name: api-gatewaycloud:# 配置 Nacosnacos:discovery:server-addr: 127.0.0.1:8848username: nacospassword: nacosinetutils:# 配置忽略的网卡信息ignored-interfaces: 'VMware Virtual Ethernet Adapter for VMnet1,VMware Virtual Ethernet Adapter for VMnet8'# gateway 配置gateway:# 路由规则routes:- id: consumer_route # 路由的唯一标识,路由到consumeruri: lb://springcloud-provider-order-seata # 从nacos中按照服务名获取微服务 lb: 使用nacos中的本地负载均衡策略# 断言规则 用于路由规则的匹配predicates:- Path=/order/**

springcloud-provider-order-seata-8006模块添加 JVM 参数配置 给springcloud-provider-stock-seata-8007模块添加 JVM 参数配置 启动 Nacos 服务(这里使用本地的 Nacos 注册中心)启动seata-server服务重新运行/bin/目录下的startup.bat启动springcloud-provider-order-seata-8006启动springcloud-provider-stock-seata-8007启动springcloud-gateway-8088访问http://localhost:8088/order/add访问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:每个服务实例的请求成功率

8.3.4 SkyWalking—使用MySQL持久化

默认使用 H2 数据库存储

/config/application.yml

基于 MySQL 持久化

修改/config/目录下的application.yml文件,使用 mysql 作为持久化存储的仓库 修改 mysql 连接配置 创建数据库swtest启动/bin/目录下的startup.bat

启动失败,oapService.bat闪退

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

解决办法重新启动/bin/目录下的startup.bat将三个服务都启动springcloud-provider-order-seata-8006springcloud-provider-stock-seata-8007springcloud-gateway-8088查看数据库swtest测试是否链路缓存是否还存在,关闭Skywalking-Collector服务,访问http://localhost:8868/

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

8.3.5 SkyWalking—自定义链路追踪

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

-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);}

springcloud-provider-order-seata-8006模块下引入依赖

<?xml version="1.0" encoding="UTF-8"?><project xmlns="/POM/4.0.0"xmlns:xsi="/2001/XMLSchema-instance"xsi:schemaLocation="/POM/4.0.0 /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><piler.source>8</piler.source><piler.target>8</piler.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></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>

修改OrderController.class

@SuppressWarnings("all")@RestController@RequestMapping("/order")public class OrderController {@Autowiredprivate 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();}}

修改OrderServiceImpl.class

@SuppressWarnings("all")@Servicepublic class OrderServiceImpl implements OrderService {@Autowiredprivate StockService stockService;@Autowiredprivate OrderMapper orderMapper;@Overridepublic 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();}@Overridepublic int deleteOrder(Integer id) {return orderMapper.deleteOrder(id);}@Overridepublic int updateOrder(Order order) {return orderMapper.updateOrder(order);}}

重新启动springcloud-provider-order-seata-8006访问http://localhost:8088/order/getAll 访问http://localhost:8088/order/get/22

8.4 Skywalking—性能剖析

8.5 Skywalking—集成日志框架

🌈 logback官方配置

🌈 log4j官方配置

🌈 log4j-2.x官方配置

测试

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

引入依赖

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

<?xml version="1.0" encoding="UTF-8"?><project xmlns="/POM/4.0.0"xmlns:xsi="/2001/XMLSchema-instance"xsi:schemaLocation="/POM/4.0.0 /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><piler.source>8</piler.source><piler.target>8</piler.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>

添加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>

启动springcloud-provider-order-seata-8006springcloud-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}

8.6 SkyWalking—告警功能

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

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

告警规则

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

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

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

告警规则配置项的说明

Rule name:规则名称,也是在告警信息中显示的唯一名称。必须以rule结尾,前缀可自定义Metrics name:度量名称,取值为 oal 脚本中的度量名,目前只支持 long、double 和 int 类型。详见Official OAL scriptInclude 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 与名称匹配。使用关系范围时,它是源实体 IDid1. 使用关系范围时,它将是目标实体 ID。否则,它是空的ruleName. 您在 中配置的规则名称alarm-settings.ymlalarmMessage. 报警消息startTime. 告警时间以毫秒为单位,介于当前时间和 UTC 时间 1970 年 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();}}

添加实体类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;}}

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

如果觉得《SkyWalking 微服务链路追踪》对你有帮助,请点赞、收藏,并留下你的观点哦!

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。