分布式服务调用链路追踪——Skywalking
SkyWalking是什么?
SkyWalking是一个可观测性分析平台和应用性能管理系统,提供分布式跟踪、服务网格遥测分析、度量聚合和可视化一体化解决方案,并支持多种开发语言。
官网:http://skywalking.apache.org/
特点:
-
性能好
针对单实例5000tps的应用,在全量采集的情况下,只增加 10% 的CPU开销。详细评测见《skywalking agent performance test》。 - 无代码嵌入,支持众多中间件
-
支持多语言探针
-
支持自动及手动探针
自动探针:Java支持的中间件、框架与类库列表
手动探针:OpenTrackingApi、@Trace注解、trackId集成到日志中。
SkyWalking 架构
说明:
SkyWalking 的核心是数据分析和度量结果的存储平台,通过 HTTP 或 gRPC 方式向 SkyWalking Collecter 提交分析和度量数据,
SkyWalking Collecter 对数据进行分析和聚合,存储到 Elasticsearch、H2、MySQL、TiDB 等其一即可,最后我们可以通过 SkyWalking UI 的可视化界面对最终的结果进行查看。
Skywalking 支持从多个来源和多种格式收集数据:多种语言的 Skywalking Agent 、Zipkin v1/v2 、Istio 勘测、Envoy 度量等数据格式。
整体架构看似模块有点多,但在实际上还是比较清晰的,主要就是通过收集各种格式的数据进行存储,然后展示。
所以搭建 Skywalking 服务我们需要关注的是 SkyWalking Collecter、SkyWalking UI 和 存储设备,SkyWalking Collecter、SkyWalking UI 官方下载安装包内已包含,最终我们只需考虑存储设备即可。
安装部署
-
下载
SkyWalking支持单机与集群部署(默认standalone),并支持多种数据存储(默认H2),如mysql,Elasticsearch,Elasticsearch7等。
本文以SkyWalking8.4.0并使用Elasticsearch来存储数据进行讲解,ElasticSearch搭建请参考我的另外一篇文章。
SkyWalking下载地址:http://skywalking.apache.org/downloads/
由于要使用Elasticsearch,下载的时候请注意选择:
根据不同版本,点击tar后选择一个地址即可开始下载:
相关操作命令如下:
mkdir -p /opt/soft/skywalking cd /opt/soft/skywalking wget https://mirrors.tuna.tsinghua.edu.cn/apache/skywalking/8.4.0/apache-skywalking-apm-es7-8.4.0.tar.gz tar -xvf apache-skywalking-apm-es7-8.4.0.tar.gz
cd apache-skywalking-apm-bin-es7/
-
配置
1.web访问端口 8080 -> 18080 (本机8080已被其它服务占用)
vim /opt/soft/skywalking/apache-skywalking-apm-bin-es7/webapp/webapp.yml
#将server.port: 8080 改为18080
2.修改使用Elasticsearch(默认使用h2)
注意:nameSpace要和Elasticsearch集群的cluster_name一致.
-
启动
在启动 SkyWalking 之前,确保 Elasticsearch 已启动。
我们可以分别启动 oapService 和 webappService,也可以通过 startup 一次性全部启动。
/opt/soft/skywalking/apache-skywalking-apm-bin-es7/bin/startup.sh
确认应用启动成功端口正常监听:
如果出错可以查看日志并根据错误类型进行处理:
-
验证
启动成功后,打开浏览器进行查看。ip地址:38080
注:一开始是没数据的,待项目集成后再刷新页面就可以看到数据了。
项目集成
1. 将skywalking主目录下的agent目录,拷贝到各服务所在机器上用作探针:
scp -r /opt/soft/skywalking/apache-skywalking-apm-bin-es7/agent chengjs@192.168.100.12:/opt/skywalking/
2. 修改 agent/config/agent.config 配置文件,也可以通过命令行参数指定。
主要是配置服务名称和后端服务地址:
# 服务名称
agent.service_name=${SW_AGENT_NAME:user-center}
# 采集信息的服务地址
collector.backend_service=${SW_AGENT_COLLECTOR_BACKEND_SERVICES:192.168.100.12:11800}
当然,也可以在启动的时候通过环境变量来设置,例如:
-Dskywalking.agent.service_name=masl -Dskywalking.collector.backend_service=XXX.XXX.XXX.XXX:11800
#skywalking.agent.service_name 服务名称
#skywalking.collector.backend_service 采集信息的服务地址 agent.config配置了就可以不用指定
3. 最后,在服务启动的时候用相关命令行参数来指定探针:
- Linux Tomcat
修改 tomcat/bin/catalina.sh
,在首行加入如下信息:
CATALINA_OPTS="$CATALINA_OPTS -javaagent:/opt/skywalking/agent/skywalking-agent.jar"; export CATALINA_OPTS
- JAR file
在启动你的应用程序的命令行中添加 -javaagent
参数. 并确保在-jar
参数之前添加它. 例如:
java -javaagent:/opt/skywalking/agent/skywalking-agent.jar -jar yourApp.jar
或
java -javaagent:/opt/skywalking/agent/skywalking-agent.jar -Dskywalking.agent.service_name=masl -Dskywalking.collector.backend_service=XXX.XXX.XXX.XXX:11800 -jar yourApp.jar
- IDEA
-javaagent:D:\soft\apache-skywalking-apm-bin-es7\agent\skywalking-agent.jar -Dskywalking.agent.service_name=masl -Dskywalking.collector.backend_service=172.16.10.63:11800
4. 访问应用中服务后访问skywalking UI界面查看相应信息:
其它
-
日志输出TraceId
1. pom添加依赖项:
<!--打印skywalking的TraceId到日志--> <dependency> <groupId>org.apache.skywalking</groupId> <artifactId>apm-toolkit-logback-1.x</artifactId> <version>8.4.0</version> </dependency>
2. logback日志layout使用 org.apache.skywalking.apm.toolkit.log.logback.v1.x.TraceIdPatternLogbackLayout
,通过%tid
输出trace-id
(%tid
必须小写):
<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> %black(%d{ISO8601}) [%tid] %highlight(${LOG_LEVEL_PATTERN:-%5p}) [%blue(%t)] %yellow(%C{1.}): %msg%n%throwable </Pattern> </layout> </encoder> </appender>
3. 访问相关请求,输出日志如下:
-
将方法加入链路跟踪
业务代码中未被跟踪的方法,如果需要跟踪,则:
1. pom添加依赖项:
<dependency> <groupId>org.apache.skywalking</groupId> <artifactId>apm-toolkit-trace</artifactId> <version>8.4.0</version> </dependency>
2. 在方法上添加@Trace
注解:
SkyWalking通过AOP实现跟踪,静态方法添加@Trace无效,只能用于实例方法;
- Span中添加自定义Tag
链路跟踪只记录方法名,不记录参数值,可通过代码添加,在当前span上添加tag(必须是被SkyWalking跟踪的方法):
ActiveSpan.tag("account", account); ActiveSpan.tag("userId", String.valueOf(userId));
链路跟踪中即查看tag名称和值:
-
记录SQL语句参数值
在agent\config\agent.config
文件中将plugin.mysql.trace_sql_parameters
设为true。
- 自动收集日志
1、skywalking8.4.0版本开始才支持收集日志功能,同时pom需引用以下依赖(version对应skywalking的版本):
<dependency> <groupId>org.apache.skywalking</groupId> <artifactId>apm-toolkit-trace</artifactId> <version>8.4.0</version> </dependency>
2、配置应用中的logback-spring.xml 文件:
<appender name="skywalking-grpc-log" class="org.apache.skywalking.apm.toolkit.log.logback.v1.x.log.GRPCLogClientAppender"></appender>
同时要开启日志,且你要输出日志到文件中,grpc是利用本地日志去上传的:
<root level="info"> <appender-ref ref="skywalking-grpc-log" /> </root>
3、打开你的agent/config/agent.config配置文件,添加如下配置信息,注意skywalking的log通信用的grpc:
# 指定要向其报告日志数据的grpc服务器的主机 plugin.toolkit.log.grpc.reporter.server_host=${SW_GRPC_LOG_SERVER_HOST:172.16.10.63}
# 指定要向其报告日志数据的grpc服务器的端口 plugin.toolkit.log.grpc.reporter.server_port=${SW_GRPC_LOG_SERVER_PORT:11800}
# 指定grpc客户端要报告的日志数据的最大大小 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}
注:gRPC报告程序可以将收集到的日志转发到SkyWalking OAP服务器或SkyWalking Satellite卫星。
4、然后就可以在你的UI界面上看到:
功能介绍
这里先着重介绍下 SkyWalking 中最重要的三个概念:
- 服务(Service) : 表示对请求提供相同行为的一系列或一组工作负载。在使用 Agent 或 SDK 的时候,你可以定义服务的名字。如果不定义的话,SkyWalking 将会使用应用名称上定义的名字。
- 服务实例(Service Instance) : 上述的一组工作负载中的每一个工作负载称为一个实例。就像 Kubernetes 中的 pods 一样, 服务实例未必就是操作系统上的一个进程。但当你在使用 Agent 的时候, 一个服务实例实际就是操作系统上的一个真实进程。
- 端点(Endpoint) : 对于特定服务所接收的请求路径, 如 HTTP 的 URI 路径和 gRPC 服务的类名 + 方法签名。
仪表盘
-
仪表盘布局
skywalking仪表盘分为服务、端点、实例的性能监控。大致结构如下(展示的图表可以自定义):
- 服务视角
服务视角有以下的监控数据,可以自定义监视数据图表的展示:
- 实例视角
实例仪表盘分析了JVM相关的图表和请求响应相关的图表,可以直观的看到请求或者服务占用等情况。
- 端点视角
端点仪表盘展示了每个端点的请求响应情况以及延时情况。在端点可以看到影响性能的端点名称等。
拓补图
拓补图可以看到整个微服务的相互作用关系,可以看到整个调用链的大致结构,以及服务的类型。方便开发者理解整个系统的架构。
拓补图可以大致的看出某个服务的运行情况,也可以点击服务相关内容查看详细信息。在每个调用链上也展示了请求数和延时情况等信息,方便查看者对服务情况大体的了解。
拓补图内容如下:
追踪
skywalking链路追踪可以收集整个服务的调用链,以及调用情况,执行情况,和参数等。
蓝色为调用成功的链路,点击列表可展示链路具体的调用信息,查看耗时,参数,执行情况等,方便对链路进行分析。
性能分析
skywalking的性能分析,在根据服务名称、端点名称,以及相应的规则建立了任务列表后,在调用了此任务列表的端点后。skywalking会自动记录,剖析当前端口,生成剖析结果,具体流程如图:
skywalking告警
- 配置
skywalking告警的配置文件如图:
在skywalking目录的config目录下的alarm-setings.yml文件中进行配置:
- 配置规则
具体规格参考:
英文文档:https://github.com/apache/skywalking/blob/v8.0.1/docs/en/setup/backend/backend-alarm.md
- 动态规则
skywalking可以设置动态规则,可以配合nacos或者Zookeeper实现。