【JavaEE】【SpringCloud】分布式链路追踪 SkyWalking
目录
一、分布式链路追踪介绍
链路追踪是分布式系统中跟踪请求全流程的技术,通过记录请求在多个服务间的流转路径,耗时,状态等信息,形成完整的调⽤链视图。也就是将⼀次分布式请求的调⽤情况集中进⾏展⽰。其核⼼是通过唯⼀标识( TraceID )串联跨服务的调⽤单元( Span ),并借助上下⽂传递( Context )实现链路连续性。
核⼼概念
- Trace:代表⼀次完整的请求处理过程,从请求到响应结束。由多个 Span 组成
- TraceID:每个Trace有⼀个唯⼀的 Trace ID来标识,⽤于关联跨服务的⽇志和监控数据
- Span:Trace的基本单元。代表请求在单个服务节点上的处理过程(如下单,⽀付,数据库查询等),包含操作名称,耗时等数据。
链路追踪的作⽤:
- 保障系统可⽤性与稳定性
分布式系统中,服务依赖的复杂性使得局部故障可能迅速扩散。链路追踪⼯具会通过实时采集CPU、内存、请求成功率等指标,可主动发现异常,并在达到阈值时触发告警。帮助团队在⽤⼾感知前介⼊处理,避免系统雪崩 - 优化性能与资源利⽤率
链路追踪⼯具通过记录请求的完整调⽤链(Trace),将每个服务节点的处理耗时可视化。这种细粒度分析帮助开发者精准识别慢调⽤(如服务 A 的 HTTP 请求耗时占⽐ 80%)并进⾏优化 - 提升故障排查效率
传统⽇志排查需在多台服务器间⼈⼯拼接线索,耗时且易遗漏关键信息。追踪⼯具为每个请求分配唯⼀Trace ID,将跨服务的⽇志,错误信息关联为统⼀视图,帮助快速定位故障节点(如识别数据库查询超时或第三⽅接⼝异常) - 理解服务依赖与拓扑
分布式系统服务依赖关系动态变化,⼈⼯维护依赖图谱成本⾼,可以借助链路追踪⼯具⾃动⽣成服务拓扑图,展⽰服务间调⽤频率与成功率,辅助容量规划与架构治理。
二、主流链路追踪工具介绍
2.1 ZipKin
开源地址:https://github.com/openzipkin/zipkin
Zipkin 是由Twitter开发并开源的⼀款分布式链路追踪产品,基于Google的Dapper论⽂设计,旨在帮助开发者监控和排查微服务架构中的请求链路问题
Zipkin早期主要⽤于Twitter内部解决分布式系统调⽤链路可视化难题,后逐渐被Netflix、阿⾥巴巴等企业采⽤并推⼴,2015年成为Apache孵化器项⽬,⽀持多种存储后端(如MySQL,Elasticsearch、内存等)及多语⾔客⼾端。随着微服务架构普及,Zipkin成为链路追踪领域的标准⼯具之⼀,常与Spring Cloud等⽣态集成
⽬前GitHub收获17.2K+ Star,3100+ Forks,被全球上百家公司采⽤,覆盖电商,⾦融,云计算等多个⾏业
2.2 CAT
开源地址:http://github.com/dianping/cat
官⽅⽂档:https://github.com/dianping/cat/wiki/intro
CAT(Central Application Tracking)是⼀个⽐较早的分布式监控产品,是美团点评在2011年底基于Java 开发的⼀套开源的分布式实时监控系统,⽬前已经覆盖了美团点评的外卖,酒旅,出⾏,⾦融等核⼼业务线,⼏乎已经接⼊美团点评的所有核⼼应⽤。CAT⾃从2014年开源,GitHub收获18.9K+ Star,5400+ Forks,被 100+公司企业使⽤,其中不乏携程,陆⾦所,猎聘⽹,平安等业内知名公司
CAT的原型和理念来源于eBay的CAL系统(CAL是eBay平台的⽇志服务,主要负责存储⽇志数据,并提供检索,聚合,分析等功能),CAT 不仅增强了CAL的系统核⼼模型,还添加了丰富的报表
2.3 SkyWalking
开源地址:https://github.com/apache/skywalking
官⽅⽂档:https://skywalking.apache.org/
资料参考:https://qcon.infoq.cn/2018/beijing/presentation/445
Apache SkyWalking 是由个⼈吴晟(华为开发者)于2015年发起的开源应⽤性能监控(APM)系统,于2017年进⼊ Apache 孵化器,成为国内⾸个由个⼈主导进⼊ Apache 的开源项⽬,并于2019年正式毕业成为 Apache 顶级项⽬,标志着其技术成熟度与社区认可度达到新⾼度。其发展轨迹从个⼈项⽬逐步演变为全球顶级的分布式系统监控解决⽅案,背后离不开开源社区的持续贡献(如华为、阿⾥巴巴等企业的⽀持)。
SkyWalking 专为微服务及分布式架构设计,现已成为全球领先的可观测性解决⽅案。特点是⽀持多种插件,UI功能较强,接⼊端⽆代码侵⼊。⽬前GitHub收获24.3 K+ Star,6600+ Forks,被全球多家知名企业应⽤于⽣产环境。
2.4 特点对⽐
| 维度 | Zipkin | CAT | SkyWalking |
|---|---|---|---|
| 接⼊复杂度 | 轻量级,集成Spring Cloud Sleuth即可 | 需代码埋点 | 通过Java Agent启动,代码⽆侵⼊ |
| 数据粒度 | 接⼝级 | 代码级(可细化到具体代码块) | ⽅法级(⽀持RPC,HTTP) |
| ⽀持语⾔ | Java,C#,Python,Nodejs,Golang,Ruby,Scala等 | Java,C/C++,Python,Nodejs,Golang等 | Java,Python,Nodejs,PHP,Golang,Ruby等 |
| 调⽤链可视化 | 有 | 有 | 有 |
| 聚合报表 | 少 | ⾮常丰富 | 较丰富 |
| 服务依赖图 | 简单 | 简单 | 好 |
| 告警⽀持 | ⽆ | ⽀持 | ⽀持 |
| 存储机制 | 内存,ES,MySQL等 | mysql(报表),本地⽂件/HDFS(调⽤链) | ES,MySQL,banyandb,PostgreSQL等(最新版本已移除H2存储) |
| 社区⽀持 | ⽂档丰富,国外主流,功能迭代较慢 | 社区活跃低,⽂档⼀般,主要国内,⼤⼚使⽤多 | 社区活跃,更新频繁 |
| 亮点 轻量,部署简单,适合SpringCloud微服务快速集成 | 功能全⾯(⽇志采集,报警,业务报表),适合⼤⼚综合监控 | ⾮侵⼊,Apache 背书,社区活跃 | |
| 不⾜ | 报表能⼒弱,功能单⼀ | 代码侵⼊性⾼,社区不活跃 | 插件开发⻔槛⾼ |
- Zipkin 适合需要快速搭建链路追踪的中⼩型团队,对深度监控和业务分析⽀持有限
- CAT 适合中⼤企业,对报表以及监控粒度要求较⾼
- SkyWalking 综合实⼒较强,⽆侵⼊,多语⾔且性能较优,⾃⾝包含⽐较丰富的报表及告警⽀持,并且⽀持插件定制开发(难度较⼤)
三、专业术语介绍
3.1 APM
APM:Application Performance Monitor,应⽤性能监控。APM 指通过收集,分析和可视化应⽤程序的运⾏时数据(如响应时间、吞吐量、错误率等),帮助开发者和运维团队优化系统性能的技术体系。上述CAT 和 SkyWalking 就是APM⼯具
3.2 OAP
OAP:Observability Analysis Platform,观测分析平台。
SkyWalking的架构通常包括三个主要组件:探针(Agent),后端(Backend) 和前端(UI)。其中OAP是后端的重要组成部分,负责接收、处理、存储来⾃探针的可观测性数据,并⽣成聚合指标。
3.3 Agent
Agent:探针。轻量级数据采集组件,通过字节码植⼊技术(Bytecode Instrumentation)⽆侵⼊式收集应⽤程序的运⾏时数据,SkyWalking提供了Java,Python,Go,NodeJS,PHP等语⾔的探针
3.4 UI
UI:可视化界⾯
通过 RESTful API 从 OAP 获取数据,⽀持图表化展⽰与交互式筛选,提供 Web 控制台,展⽰服务拓扑、调⽤链路、实时指标、告警信息等。
3.5 Metrics
Metrics:指标,⽐如服务响应时间,服务成功率等
3.6 Endpoint
Endpoint:服务实例中⽤于接收和处理外部请求的具体⼊⼝点,是⽐service更细粒度的监控单元,⽤于描述服务内部的接⼝或⽅法级别的访问路径。
四、安装与部署
官⽅下载地址:https://skywalking.apache.org/downloads/
分别下载:SkyWalking APM(10.2.0) 和 Java Agent(9.4.0)
4.1 数据库选型与配置
SkyWalking⽀持多种存储选项:
-
H2
⾃ 2015 年以来,H2 ⼀直作为 SkyWalking 的默认存储选项,旨在简化⽤⼾⾸次安装的体验。其内存模式为⽤⼾提供了⼀种⽆需额外配置即可本地快速上⼿的⽅式,⾮常适合学习,但是在⽣产环境⾮常受限,⽐如H2的内存模式通常会在运⾏⼤约 20 分钟后丢失数据,更糟糕的是,这种⾏为没有任何预警,导致⽆法⻓期使⽤。所以官⽅从2025年宣布H2将不再作为存储选项被⽀持。取⽽代之的是BanyanDB -
MySQL
Skywalking⼀直⽀持MySQL为存储选项,MySQL对于中⼩规模的数据友好,部署和运维成本低,适合已有MySQL基础设施的团队,但是分库分表复杂度⾼,⽆法适应千亿级数据的分布式存储需求。但对时间序列数据的聚合查询效率远低于 ES,复杂查询易成为瓶颈。适合学习和测试环境,或者数据量极⼩的环境。 -
Elasticsearch
在2025年之前,ES⼀直作为官⽅推荐的⽣产环境使⽤的存储选项,ES基于倒排索引和分⽚机制,擅⻓处理海量时序数据的查询与聚合分析,可通过集群分⽚应对 PB 级数据存储需求。⽽且社区⽀持⼴泛,但是ES的运维成本较⾼,需要独⽴部署ES集群,对资源消耗⼤,使得ES的性价⽐不是很⾼。 -
BanyanDB
BanyanDB脱胎于SkyWalking社区,主要⾯向APM领域,专为处理 Metrics(指标)、Tracing(追踪)、Logging(⽇志)三类可观测性数据设计。BanyanDB 专为云原⽣架构设计,能够处理更⼤的⼯作负载,⽆需担⼼数据丢失,⽽且设置⾮常简单,降低了新⽤⼾的使⽤⻔槛。作为SkyWalking的原⽣数据库,BanyanDB⽬前还处于⾼速研发的阶段。随着BanyanDB⼦项⽬的不断发展,SkyWalking官⽅宣布,BanyanDB 0.8已经完全⽣产可⽤,是⽣产环境的理想选择
4.2 修改配置
解压apm后新建⼀个agent⽂件夹,然后解压agent,把内容复制到apm中创建的agent⽂件夹中。
4.2.1 修改端⼝号(按需)
SkyWalking UI的默认端⼝号是 8080,如果和现有进程冲突了,可以进⾏修改。
修改⽂件:/apache-skywalking-apm-bin/webapp/application.yml
Skywalking-oap-server 服务(OAP模块的实际运⾏实例)启动后会暴露11800和12800两个端⼝
11800:grpc端⼝,接受SkyWalking Agent 的监控数据
12800:REST API端⼝,提供 RESTful API 服务,供 SkyWalking UI 或其他外部系统调⽤,⽤于查询监控数据
4.2.2 创建数据库
CREATE DATABASE skywalking;
4.2.3 修改存储后端为MySQL
连接mysql需要在 /apache-skywalking-apm-bin/oap-libs 这个⽬录下放⼊ mysqlconnector-java 的包
修改存储配置
配置⽂件路径:/apache-skywalking-apm-bin/config/application.yml ,改为mysql
修改mysql相关配置:数据库名skywalking,用户名和密码
4.3 启动SkyWalking
启动⽂件:/apache-skywalking-apm-bin/bin/startup.bat 双击运⾏
ip+上面设置的端口号,访问:
五、SkyWalking 快速使用
使⽤前⾯seata组件时的项⽬,修改项⽬名称即可,确认所有服务都是正常的。
5.1 服务接⼊
以order-service为例:
添加启动参数,通过 -javaagent 参数进⾏配置SkyWalking Agent来跟踪微服务
-javaagent:D:\software\SkyWalking\apache-skywalking-apm-bin\agent\skywalking-agent.jar
-Dskywalking.agent.service_name=order-service
-Dskywalking.collector.backend_service=127.0.0.1:11800
-javaagent: 后⾯换成⾃⼰的路径
-Dskywalking.agent.service_name : 服务名称
-Dskywalking.collector.backend_service : SkyWalking 服务器配置

5.2 接⼝请求
发起接⼝请求后,ui界面出现监控:

六、UI界面介绍
6.1 ⻚⾯指标介绍
服务接⼊Skywalking后,当有请求时,UI⻚⾯会显⽰服务相关的指标
- Service Apdex:当前服务的评分,量化⽤⼾对服务性能满意度的标准化指标,反映⽤⼾体验的质量
- Service Success Rate:服务请求成功率
- Service Avg Response Time (ms):服务平均响应延时(单位ms)
- Service Load (calls / min):分钟请求数
- Endpoint Success Rate:当前端点的成功率
- Endpoint Avg Response Time (ms):端点的平均响应时⻓
- Endpoint Load (calls / min):每个端点(URL)的请求次数

6.2 模拟接⼝
为了⽅便观察,我们新增⼀个订单查询的接⼝
order-service的OrderController:
@RequestMapping("/query/{orderId}")
public ResponseEntity<OrderInfo> queryOrder(@PathVariable Integer orderId)
throws InterruptedException {
log.info("查询订单, orderId:{}", orderId);
Thread.sleep(new Random().nextInt(100));
if (orderId%5==0){
throw new RuntimeException("模拟异常");
}
if (orderId==9){
Thread.sleep(2000);
}
OrderInfo orderInfo= orderService.queryById(orderId);
return ResponseEntity.status(HttpStatus.OK).body(orderInfo);
}
OrderService
OrderInfo queryById(Integer orderId);
OrderServiceImpl
@Override
public OrderInfo queryById(Integer orderId) {
return orderMapper.selectById(orderId);
}
6.3 观察指标
重启服务,使⽤JMeter模拟请求,随机访问上述接⼝
请求路径:/order/query/${__Random(1,20)}
观察UI⻚⾯,指标会发⽣相应变化
6.3.1 Service
会显⽰接⼊Skywalking的服务,已经服务的概况
ServiceNames:服务名称
Load(calls/min):每分钟访问次数
Success Rate(%):请求成功率
Latency(ms):服务请求延迟时间(此处为服务平均响应时间)
Apdex:当前服务评分

6.3.2 服务详情
告警信息
点击服务名称,会显⽰相应服务的详情
服务概况:
- Service Avg Response Time (ms):服务平均响应延时(单位ms)
- Service Apdex:当前服务评分
- Service Response Time Percentile (ms):服务响应时间百分⽐,通过分位数(如P99,P95,P90,P75,P50)反映不同⽐例请求的延迟情况,如P99=300ms 表⽰ 99% 的请求延迟低于300ms
- Service Load (calls / min):分钟请求数
- Success Rate (%):分钟请求成功百分⽐
- Message Queue Consuming Count:消息队列消耗计数
- Message Queue Avg Consuming Latency (ms):消息队列平均消耗延迟(单位ms)
- Service Instances Load (calls / min):服务节点每分钟请求次数
- Slow Service Instance (ms):服务节点的最⼤延时
- Service Instance Success Rate (%):每个服务实例的请求成功率
- Endpoint Load in Current Service(calls / min):每个端点(URL)的请求次数
- Slow Endpoints in Current Service (ms):当前端点(URL)的慢响应时间
- Endpoint Success Rate in Current Service (%):当前端点(URL)的成功响应请求占⽐
6.3.3 Instance
显⽰所选服务的实例节点
6.3.4 Endpoint
按端点聚合,显⽰端点的请求次数/成功率/延迟
6.3.5 Topology
显⽰服务的拓扑图
6.3.6 Trace
左侧为端点列表,蓝⾊表⽰正常请求,红⾊表⽰异常请求
右侧显⽰请求的追踪链表,各个节点的调⽤顺序及时间等
6.4 数据库指标
Skywalking 也会提供数据库相关的监控指标
6.4.1 指标介绍
点击数据库,可以看到执⾏数据库的详情
- DatabaseAvgResponseTime(ms):数据库平均响应时间
- DatabaseAccessSuccessfulRate(%): 数据库访问成功率
- DatabaseTraffic (calls / min): 数据库流量(每分钟的请求次数)
- DatabaseAccessLatencyPercentile (ms): 数据库访问延迟(百分位数)
- SlowStatements(ms):慢SQL列表
6.4.2 模拟慢SQL
代码修改
OrderController
@RequestMapping("/slowSql")
public String slowSql(int time){
orderService.selectSleep(time);
return "success";
}
OrderService
void selectSleep(int time);
OrderServiceImpl
@Override
public void selectSleep(int time) {
orderMapper.selectSleep(time);
}
OrderMapper
@Select("select sleep(#{time})")
Integer selectSleep(int time);

七、自定义追踪
Skywalking默认会对接⼝提供追踪,如果我们希望对项⽬中的业务⽅法进⾏链路追踪,就需要⾃定义追踪了。
7.1 添加依赖
<dependency>
<groupId>org.apache.skywalking</groupId>
<artifactId>apm-toolkit-trace</artifactId>
<version>9.4.0</version>
</dependency>
7.2 添加注解@Trace
在需要监控的⽅法上添加 @Trace 注解,就会把⽅法加⼊链路追踪⾥,会⾃动⽣成span并记录⽅法的执⾏耗时及调⽤关系,@Trace ⽀持⾃定义span名称(operationName )以增强可读性
7.3 附加业务信息
在SkyWalking中,可以使⽤ @Tag 或者@Tags 在⾃定义链路追踪中附加关键业务或上下⽂信息的注解,⽐如记录参数和返回信息。在⽅法上使⽤ @Tag 或@Tags 注解,指定需捕获的数据类型。

arg[n]: 表⽰⽅法的第n个输⼊参数(从0开始).
returnedObj:表⽰⽅法的返回值.

八、性能剖析
性能剖析功能是⼀种针对分布式系统代码级性能的动态分析技术,SkyWalking提供了追踪分析的功能,可以查看请求调⽤链中具体⽅法或者代码块的执⾏耗时,⽤于快速识别⾼耗时⽅法(如慢SQL查询等),定位服务调⽤链(Trace)中具体Span(单个操作节点)的性能问题。
8.1 新建任务

端点:需要分析的端点的名称
监控时间:采集数据的开始时间
监控持续时间:监控采集多⻓时间
起始监控时间:多少秒后进⾏采集
监控间隔:多⻓时间采集⼀次
最⼤采集数:最⼤采集多少样本
8.2 观察剖析结果
发起请求,观察链路的追踪情况
通过这个链路追踪,可以查看各个span的执⾏时间,选择需要分析的span,点击[分析],就会出现线程栈信息
九、 ⽇志上传
SkyWalking不仅⽀持链路追踪,还可以集成⽇志数据,帮助⽤⼾在⼀个平台上统⼀查看⽇志和追踪信息,基于TraceID实现⽇志与请求链路的⾃动关联,快速定位故障上下⽂.
配置参考: https://skywalking.apache.org/docs/skywalking-java/next/en/setup/service-agent/java-agent/application-toolkit-logback-1.x/
9.1 引⼊依赖
<dependency>
<groupId>org.apache.skywalking</groupId>
<artifactId>apm-toolkit-logback-1.x</artifactId>
<version>9.4.0</version>
</dependency>
9.2 ⽇志配置
添加 logback-spring.xml ⽂件
- Logback框架默认加载的配置⽂件名为 logback.xml,该名称适⽤于⾮SpringBoot应⽤.
- SpringBoot默认会识别 logback-spring.xml,这是SpringBoot推荐的⽅式,优先级⾼于默认 logback.xml,⽀持Spring扩展特性(如${spring.profiles.active}) •
- 若同时存在 logback.xml 和 logback-spring.xml,SpringBoot优先加载 logback-spring.xml
<?xml version="1.0" encoding="UTF-8"?>
<configuration scan="true" scanPeriod="60 seconds" debug="false">
<!-- ⽇志格式化, 配置 %tid 占位符 -->
<appender name="STDOUT" 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>
<!-- 通过 grpc 把⽇志上报到Skywalking-->
<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>
<root level="info">
<appender-ref ref="STDOUT"/>
<appender-ref ref="grpc-log"/>
</root>
</configuration>
十、告警管理
除了指标的监测之外,SkyWalking还提供了告警功能.当系统出现异常时(如接⼝响应慢,成功率低),⾃动触发通知,帮助研发⼈员或者运维⼈员快速定位问题
10.1 告警规则
SkyWalking 的告警系统预先定义了⼀部分告警规则,在config/alarm-settings.yml⽂件中,⽤⼾也可以⾃定义告警规则
参考链接:https://skywalking.apache.org/docs/main/v10.2.0/en/setup/backend/backend-alarm/
# Sample alarm rules.
rules:
# Rule unique name, must be ended with `_rule`.
service_resp_time_rule:
# A MQE expression, the result type must be `SINGLE_VALUE` and the root operation of the expression must be a Compare Operation
# which provides `1`(true) or `0`(false) result. When the result is `1`(true), the alarm will be triggered.
expression: sum(service_resp_time > 1000) >= 1
period: 10
silence-period: 5
message: Response time of service {name} is more than 1000ms in 3 minutes of last 10 minutes.
配置说明:
- XXXX_rule:规则名称,必须以"_rule"结尾
- expression:告警表达式,结果为1时,触发报警
- period:告警周期,评估指标的时间⻓度(以分钟为单位)
- silence-period: 静默期,在告警触发后,多⻓时间内不再触发.
-
- 在Time-N(TN)触发告警后,在"TN->TN+period"时间段内保持静默.
-
- 默认情况下,它的⼯作⽅式与period相同.同⼀告警在⼀个周期内只能触发⼀次
- message:告警消息
为⽅便起⻅,SkyWalking提供了⼀个默认的alarm-setting.yml,包括以下规则:
- 过去3分钟内服务平均响应时间超过1秒。
- 最近2分钟服务成功率低于80%。
- 过去3分钟内超过1秒的服务响应时间百分位数
- 服务实例在过去2分钟内的平均响应时间超过1秒,并且实例名称与正则表达式匹配。
- 终端节点在过去2分钟内的平均响应时间超过1秒。
- 过去2分钟内数据库访问平均响应时间超过1秒。
- 终端节点关系过去2分钟内超过1秒的平均响应时间。
10.2 Webhook
webhook是⼀种允许应⽤程序向外部系统实时推送事件或数据的机制,通常通过HTTP回调实现,从⽽实现跨系统⾃动化的信息传递。
核⼼特征:
- 事件驱动:当预设条件触发时(如告警触发、数据更新),主动向⽬标URL发送HTTP请求(通常为POST)
- 轻量级集成:接收⽅只需提供⼀个可访问的HTTP端点即可接收数据,⽆需轮询查询
- 灵活扩展:适⽤于告警通知,流程触发,数据同步等场景
10.2.1 SkyWalking 的WebHook实现
SkyWalking 提供了WebHook的⽅式,主要⽤于告警通知.其核⼼功能与配置要点如下:
10.2.1.1. 告警触发与推送
当监控指标(如响应时间、错误率等)达到告警规则阈值时,SkyWalking会⽣成告警事件,⾃动把告警
信息封装为JSON格式,通过HTTP的⽅式发送⾄预设的WebHook接收地址.
JSON格式定义参考:List<org.apache.skywalking.oap.server.core.alarm.AlarmMessage>
- scopeId、scope:告警⽬标的监控范围,参考
org.apache.skywalking.oap.server.core.source.DefaultScopeDefine中定义 - Name:告警⽬标的名称,如服务名、端点名等
- id0: ⽬标实体的主要ID,通常是数据库中的主键
- id1: ⽬标实体的次要ID(可选),⽤于更精确的标识
- ruleName: 触发告警的规则名称
- alarmMessage : 具体的告警消息内容
- startTime: 告警触发的时间戳(毫秒)
- 标签: 标签列表,包含与告警相关的附加信息
10.2.1.2. WebHook配置
在 alarm-settings.yml 中定义WebHook地址及关联规则
hooks:
webhook:
default:
is-default: true
urls:
- http://127.0.0.1/notify/
- http://127.0.0.1/go-wechat/
urls 为接收告警的HTTP端点.
10.2.1.3. 典型应⽤场景
- 集成第三⽅系统:推送告警⾄钉钉,企业微信、⻜书,邮箱等协作⼯具.
- ⾃动化运维:触发运维脚本(如⾃动扩容)或联动故障管理系统.
- 数据聚合分析:将告警事件转发⾄⼤数据平台进⾏统计分析
10.2.2 WebHook实践
10.2.2.1 配置WebHook
配置 apache-skywalking-apm-bin\config\alarm-settings.yml , 然后重启skyWalking
10.2.2.2 接⼝开发
- 创建项⽬alarm-service,⽤来接收WebHook

pom文件:
<?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">
<modelVersion>4.0.0</modelVersion>
<parent>
<groupId>com.bite.demo</groupId>
<artifactId>skywalking-demo</artifactId>
<version>1.0-SNAPSHOT</version>
</parent>
<artifactId>alarm-service</artifactId>
<properties>
<maven.compiler.source>17</maven.compiler.source>
<maven.compiler.target>17</maven.compiler.target>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
</properties>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
</dependency>
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
<configuration>
<includeSystemScope>true</includeSystemScope>
</configuration>
</plugin>
</plugins>
</build>
</project>
配置文件:
server:
port: 8084
logging:
pattern:
dateformat: HH:mm:ss:SSS
spring:
application:
name: alarm-service
接收告警信息实体类:
对应数据库alarm_record_XXX表 AlarmMessage
参考链接:https://github.com/apache/skywalking/blob/master/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/alarm/AlarmMessage.java
https://github.com/apache/skywalking/blob/master/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/analysis/manual/searchtag/Tag.java
10.2.3 配置邮件告警
SkyWalking的WebHook功能,会通过HTTP的⽅式,把告警信息发送⾄预设的WebHook接收地址,我们可以借此功能在这个接⼝⾥实现发送邮件或者短信等功能,从⽽达到告警主动通知。接下来以邮件为例
参考: https://springdoc.cn/spring-boot-email/
- 添加依赖
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-mail</artifactId>
</dependency>
- 定义邮件配置项
spring:
mail:
host: smtp.126.com #需要在设置中开启smtp
username: XXXXX #发件⼈的邮箱
password: XXXXXX #邮箱的授权码, 并⾮个⼈密码
default-encoding: UTF-8 #字符集编码, 默认UTF-8
properties:
personal: 告警系统
- 定义邮件发送⼯具:
import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty;
import org.springframework.boot.autoconfigure.mail.MailProperties;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.mail.javamail.JavaMailSender;
@Configuration
@ConditionalOnProperty(
prefix = "spring.mail",
name = "host"
)
public class MailConfig {
@Bean
public Mail mail(MailProperties mailProperties, JavaMailSender mailSender){
return new Mail(mailProperties, mailSender);
}
}
import jakarta.mail.internet.MimeMessage;
import lombok.extern.slf4j.Slf4j;
import org.springframework.boot.autoconfigure.mail.MailProperties;
import org.springframework.mail.javamail.JavaMailSender;
import org.springframework.mail.javamail.MimeMessageHelper;
import java.util.Optional;
@Slf4j
public class Mail {
private MailProperties mailProperties;
private JavaMailSender javaMailSender;
public Mail(MailProperties mailProperties, JavaMailSender javaMailSender) {
this.mailProperties = mailProperties;
this.javaMailSender = javaMailSender;
}
public void send(String to, String subject, String content) throws
Exception {
// 创建⼀个邮件消息
MimeMessage message = javaMailSender.createMimeMessage();
// 创建 MimeMessageHelper
MimeMessageHelper helper = new MimeMessageHelper(message, false);
// 发件⼈邮箱和名称
String personal = Optional.ofNullable(mailProperties.getProperties().get("personal")).orElse(mailProperties.getUsername());
helper.setFrom(mailProperties.getUsername(), personal);
// 收件⼈邮箱
helper.setTo(to);
// 邮件标题
helper.setSubject(subject);
// 邮件正⽂,第⼆个参数表⽰是否是HTML正⽂
helper.setText(content, true);
// 发送
javaMailSender.send(message);
}
}
- 发送邮件
import com.bit.alarm.config.Mail;
import com.bit.alarm.entity.AlarmMessageDTO;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
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;
@Slf4j
@RequestMapping("/alarm")
@RestController
public class AlarmController {
@Autowired
private Mail mail;
@RequestMapping("/handler")
public void handler(@RequestBody List<AlarmMessageDTO> alarmMessages)
throws Exception {
log.info("收到报警, alarmMessages:{}", alarmMessages);
//发送
mail.send("XXXX@126.com", "告警通知", buildContent(alarmMessages));
}
private String buildContent(List<AlarmMessageDTO> alarmMessages) {
StringBuilder builder = new StringBuilder();
builder.append("系统告警: <br/>");
for (AlarmMessageDTO dto : alarmMessages) {
builder.append("scopeId: ").append(dto.getScopeId())
.append("<br/> scope: ").append(dto.getScope())
.append("<br/> ⽬标Scope 的实体名称: ").append(dto.getName())
.append("<br/> Scope 实体的 ID: ").append(dto.getId0())
.append("<br/> 告警规则名称: ").append(dto.getRuleName())
.append("<br/> 告警消息内容: ").append(dto.getAlarmMessage())
.append("<br/>告警时间: ").append(dto.getStartTime())
.append("<br/><br/>---------------");
}
return builder.toString();
}
}
10.3 接⼊⻜书
SkyWalking的WebHook功能,也集成了第三⽅系统,可以通过简单的配置,推送告警⾄Slack,企业微信,钉钉,⻜书等
参考链接:https://skywalking.apache.org/docs/main/v10.2.0/en/setup/backend/backend-alarm/#feishu
-
注册⻜书账号
-
创建机器⼈
打开⻜书群组→点击右上⻆「设置」→「群机器⼈」→「添加机器⼈」→选择「⾃定义机器⼈」配置机器⼈名称,获取⽣成的WebhookURL(格式为`https://open.feishu.cn/open-apis/bot/v2/hook/xxxxxx


-
配置webHook
hooks:
feishu:
default:
is-default: true
text-template: |
{
"msg_type":"text",
"content": {
"text": "Apache SkyWalking Alarm: \n %s."
}
}
webhooks:
- url: https://open.feishu.cn/open-apis/bot/v2/hook/f422708b-b41d-4911-87ed-aa1b22131ad9
secret: dCNQubWsVSTNytjCvmmk5f
更多推荐













所有评论(0)