分布式服务呼叫链路跟踪——空中漫步
SkyWalking是一个可观测性分析平台和应用性能管理系统,提供分布式跟踪、服务网格遥测分析、测量聚合和可视化的一体化解决方案,支持多种开发语言。
官网:http://
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.gzcd 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 已启动。
SkyWalking 的启动包括两部分,一个是 SkyWalking Collector(oapService) ,一个是 SkyWalking UI(webappService),SkyWalking 解压后的 bin 目录:
我们可以分别启动 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_OPTSJAR 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.jarIDEA
-javaagent:D:softapache-skywalking-apm-bin-es7agentskywalking-agent.jar -Dskywalking.agent.service_name=masl -Dskywalking.collector.backend_service=172.16.10.63:118004. 访问应用中服务后访问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语句参数值
在agentconfigagent.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/SkyAPM/document-cn-translation-of-skywalking/blob/master/docs/zh/8.0.0/setup/backend/backend-alarm.md
英文文档:https://github.com/apache/skywalking/blob/v8.0.1/docs/en/setup/backend/backend-alarm.md
动态规则
skywalking可以设置动态规则,可以配合nacos或者Zookeeper实现。
- 上一篇:Linux-锁屏时间设置
- 下一篇:Python爬虫微信官方账号所有信息,批量...