发布时间:2023-09-07 17:00
目录
一、前言
二、SkyWalking是什么
三、链路追踪框架对比
四、主要功能特性
五、服务端搭建
六、SkyWalking接入微服务
七、SkyWalking跨多个微服务跟踪
八、持久化
基于mysql持久化
九、自定义链路追踪
十、性能剖析
十一、SkyWalking集成日志框架
SkyWalking通过grpc上报日志(需要v.8.4.0+)
十二、告警
告警规则
Webhook(网络钩子)
邮件告警功能实践
十三、SkyWalking高可用
对于一个大型的几十个、几百个微服务构成的微服务架构系统,通常会遇到一些问题,比如:
1.如何串联整个调用链路,快速定位问题?
2.如何缕清各个微服务之间的依赖关系?
3.如何进行各个微服务接口的性能分析?
4.如何跟踪整个业务流程的调用处理顺序?
SkyWalking是一个国产开源框架。SkyWalking是分布式系统的应用程序性能监视工具,专为微服务、云原生架构和基于容器(Docker、K8s)架构而设计。它是一款优秀的APM(Application Performance Management)工具,包括了分布式追踪、性能分析、应用和服务依赖分析等。
官网:Apache SkyWalking
下载地址:Downloads | Apache SkyWalking
GitHub:https://github.com/apache/skywalking
文档:Welcome | Apache SkyWalking
中文文档:SkyWalking 文档中文版
1.Zipkin是Twitter开源的调用链分析工具,目前基于SpringCloud Sleuth得到了广泛应用,特点是轻量,使用部署简单。
2.Pinpoint是韩国开源的基于字节码注入的调用链分析,以及应用监控分析工具。特点是支持多种插件,UI功能强大,接入端无代码侵入。
3.SkyWalking是中国开源的基于字节码注入的调用链分析,以及应用监控分析工具。特点是支持多种插件,UI功能较强,接入端无代码侵入。
4.CAT是大众点评开源的基于编码和配置的调用链路分析,应用监控分析,日志采集,监控报警等一系列的监控平台工具。
项目 | Cat | Zipkin | SkyWalking |
---|---|---|---|
调用链可视化 | 有 | 有 | 有 |
聚合报表 | 非常丰富 | 少 | 较丰富 |
服务依赖图 | 简单 | 简单 | 好 |
埋点方式 | 侵入式 | 侵入式 | 非侵入式,字节码增强 |
VM监控指标 | 好 | 无 | 有 |
支持语言 | java/.net | 丰富 |
java/.net/php/go/node.js |
存储机制 | mysql(报表),本地文件/HDFS(调用链) | 内存、es、mysql等 | H2、es |
社区支持 | 主要在国内 | 国外主流 | Apache支持 |
使用案例 | 美团、携程 | 京东、阿里定制后不开源 | 华为、小米、。。。 |
APM | 是 | 否 | 是 |
开发基础 | eBay cal | Google Dapper | Google Dapper |
是否支持WebFlux | 否 | 是 | 是 |
1.多种监控手段,可以通过语言探针和service mesh获得监控的数据
2.支持多种语言自动探针,包括Java、.Net Core和Node JS等
3.轻量高效,无需大数据平台和大量的服务器资源
4.模块化、UI、存储、集群管理都有多种机制可选
5.支持告警
6.优秀的可视化解决方案
下载
目录结构
启动
#指定skywalking-agent.jar所在位置
-javaagent:D:\SpringCloudAlibaba-2.2.7\
#指定服务名字
-DSW_AGENT_NAME=api-gateway
#指定collector连接地址
-DSW_AGENT_COLLECTOR_BACKED_SERVICES=127.0.0.1:11800
-DSW_AGENT_COLLECTOR_BACKED_SERVICES可以指定远程地址,但-javaagent必须绑定本机物理路径的skywalking-agent.jar
注意:此处存在bug,跟踪链路不显示gateway
拷贝agent/optional-plugins目录下的gateway插件到agent/plugins目录下,然后重启skywalking服务。
SkyWalking跨多个微服务跟踪,只需要每个微服务启动时添加javaagent参数即可。
默认使用的H2内存数据库存储。skywalking重启后数据就会丢失。
config/application.yml
1.修改config目录下的application.yml,使用mysql作为持久化存储的数据库
2.修改mysql连接配置
3.创建swtest数据库,数据库下的表会在skywalking启动的时候自动创建。
4.重启skywalking,在启动时,oap-service会启动报错,查看log日志,发现缺少了mysql的驱动,是因为skywalking oap-libs目录下没有mysql驱动的jar包,在oap-libs目录下放置一个mysql驱动的jar即可。
5.再次重启即可。
如果我们希望对项目中的业务方法,实现链路追踪,方便我们排查问题,可以使用如下代码
引入依赖
org.apache.skywalking
apm-toolkit-trace
8.5.0
@Trace
如果一个业务方法想在ui界面的跟踪链路上显示出来,只需要在业务方法上加上@Trace注解即可。
@Tag
我们还可以为追踪链路增加其他额外的信息,比如记录参数和返回信息。
实现方式:在方法上增加@Tag或者@Tags。
@Tag 注解中,key = 方法名,value = returnedObj是固定值。
SkyWalking的性能分析,在根据服务名称,端点名称、以及相应的规则建立了任务列表后,在调用了此任务列表的端点后,skywalking会自动记录,剖析当前端口,生成剖析结果。
Log4j官方配置
Log4j2官方配置
logback官方配置
引入依赖
org.apache.skywalking
apm-toolkit-logback-1.x
8.5.0
添加logback-spring.xml文件,并配置%tid占位符
%d{yyyy-MM-dd HH:mm:ss.SSS} [%X{tid}] [%thread] %-5level %logger{36} -%msg%n
gRPC报告程序可以将收集到的日志转发到SkyWalkingOAP服务器上。
logback-spring.xml中添加以下配置
%d{yyyy-MM-dd HH:mm:ss.SSS} [%X{tid}] [%thread] %-5level %logger{36} -%msg%n
修改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}
完整logback-spring.xml
%d{yyyy-MM-dd HH:mm:ss.SSS} [%X{tid}] [%thread] %-5level %logger{36} -%msg%n
%d{yyyy-MM-dd HH:mm:ss.SSS} [%X{tid}] [%thread] %-5level %logger{36} -%msg%n
SkyWalking告警功能是在6.x版本新增的,其核心由一组规则驱动,这些规则定义在config/alarm-settings.yml文件中。告警规则的定义分为两部分:
1.告警规则:他们定义了应该如何触发度量警报,应该考虑什么条件
2.Webhook(网络钩子):定义当警告触发时,哪些服务终端需要被告知
SkyWalking的发行版都会默认提供config/alarm-settings.yml文件,里面预先定义了一些常用的告警规则。如下:
1.过去三分钟内服务平均响应时间超过1秒。
2.过去2分钟服务成功率低于80%
3.过去3分钟内服务响应时间超过1s的百分比
4.服务实例在过去2分钟内平均响应时间超过1s,并且实例名称与正则表达式匹配
5.过去2分钟内端点平均响应时间超过1s
6.过去2分钟内数据库访问平均响应时间超过1s
7.过去2分钟内端点关系平均响应时间超过1s
这些预定义的告警规则,打开config/alarm-settings.yml文件即可看到
告警规则配置项的说明:
webhook可以简单理解为是一种web层面的回调机制,通常由一些事件触发,与代码中的事件回调类似,只不过是Web层面的。由于是Web层面的,所以当事件发生时,回调的不在是代码中的方法或函数,而是服务接口。例如,在告警这个场景,告警就是一个事件。当该事件发生时,SkyWalking就会主动去调用一个配置好的接口,该接口就是所谓的Webhook。
SkyWalking的告警消息会通过HTTP请求进行发送,请求方法为POST,Content-Type为application/json,其JSON数据是基于List
示例如下
[{
"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
}]
字段说明
1.修改 config/alarm-settings.yml文件
2.编写回调接口,使用org.apache.skywalking.oap.server.core.alarm.AlarmMessage类作为参数接收。
在大多数生产环境中,后端应用需要支持高吞吐量并且支持高可用来保证服务的稳定,所以你始终需要在生产环境进行集群管理。
SkyWalking集群是将skywalking oap作为一个服务注册到nacos上,只要skywalking oap服务没有全部宕机,保证有一个skywalking oap在运行,就能进行跟踪。
搭建一个skywalking oap集群需要:
1.修改config/application.yml文件,使用nacos作为注册中心
2.修改nacos配置
3.可以选择性修改监听端口
4.修改存储策略,使用es或者mysql作为storage
5.修改mysql或者es配置
6.配置ui服务webapp.yml文件的listOfServers,写两个地址,中间以逗号分隔
7.启动Skywalking服务,指定jvm参数,中间以逗号分隔
-DSW_AGENT_COLLECTOR_BACKED_SERVICES=127.0.0.1:11800,127.0.0.1:11800