欢迎访问生活随笔!

生活随笔

您现在的位置是:首页 > 形式科学 > 计算机科学 > IT网络

IT网络

分布式服务呼叫链路跟踪——空中漫步

发布时间:2022-11-11IT网络 小博士
什么是高空行走?
SkyWalking是一个可观测性分析平台和应用性能管理系统,提供分布式跟踪、服务网格遥测分析、测量聚合和可视化的一体化解决方案,支持多种开发语言。
官网:http://

SkyWalking是什么?

SkyWalking是一个可观测性分析平台和应用性能管理系统,提供分布式跟踪、服务网格遥测分析、度量聚合和可视化一体化解决方案,并支持多种开发语言。

官网:http://skywalking.apache.org/

特点:

性能好
针对单实例5000tps的应用,在全量采集的情况下,只增加 10% 的CPU开销。详细评测见《skywalking agent performance test》。

无代码嵌入,支持众多中间件

支持多语言探针

支持自动及手动探针
自动探针:Java支持的中间件、框架与类库列表
手动探针:OpenTrackingApi、@Trace注解、trackId集成到日志中。

SkyWalking 架构

分布式服务调用链路追踪——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,下载的时候请注意选择:

分布式服务调用链路追踪——Skywalking-风君子博客

根据不同版本,点击tar后选择一个地址即可开始下载:

分布式服务调用链路追踪——Skywalking-风君子博客

相关操作命令如下:

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

分布式服务调用链路追踪——Skywalking-风君子博客

2.修改使用Elasticsearch(默认使用h2)

分布式服务调用链路追踪——Skywalking-风君子博客

注意:nameSpace要和Elasticsearch集群的cluster_name一致.

启动

在启动 SkyWalking 之前,确保 Elasticsearch 已启动。

SkyWalking 的启动包括两部分,一个是 SkyWalking Collector(oapService) ,一个是 SkyWalking UI(webappService),SkyWalking 解压后的 bin 目录:
分布式服务调用链路追踪——Skywalking-风君子博客

我们可以分别启动 oapService 和 webappService,也可以通过 startup 一次性全部启动。

/opt/soft/skywalking/apache-skywalking-apm-bin-es7/bin/startup.sh

确认应用启动成功端口正常监听:

分布式服务调用链路追踪——Skywalking-风君子博客

如果出错可以查看日志并根据错误类型进行处理:

分布式服务调用链路追踪——Skywalking-风君子博客

验证

启动成功后,打开浏览器进行查看。ip地址:38080

分布式服务调用链路追踪——Skywalking-风君子博客

注:一开始是没数据的,待项目集成后再刷新页面就可以看到数据了。

项目集成

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:softapache-skywalking-apm-bin-es7agentskywalking-agent.jar -Dskywalking.agent.service_name=masl -Dskywalking.collector.backend_service=172.16.10.63:11800

分布式服务调用链路追踪——Skywalking-风君子博客

4. 访问应用中服务后访问skywalking UI界面查看相应信息:

分布式服务调用链路追踪——Skywalking-风君子博客

分布式服务调用链路追踪——Skywalking-风君子博客

分布式服务调用链路追踪——Skywalking-风君子博客

其它

日志输出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. 访问相关请求,输出日志如下:

分布式服务调用链路追踪——Skywalking-风君子博客

将方法加入链路跟踪

业务代码中未被跟踪的方法,如果需要跟踪,则:

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名称和值:

分布式服务调用链路追踪——Skywalking-风君子博客

记录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-风君子博客

功能介绍

这里先着重介绍下 SkyWalking 中最重要的三个概念:

服务(Service) : 表示对请求提供相同行为的一系列或一组工作负载。在使用 Agent 或 SDK 的时候,你可以定义服务的名字。如果不定义的话,SkyWalking 将会使用应用名称上定义的名字。

服务实例(Service Instance): 上述的一组工作负载中的每一个工作负载称为一个实例。就像 Kubernetes 中的 pods 一样, 服务实例未必就是操作系统上的一个进程。但当你在使用 Agent 的时候, 一个服务实例实际就是操作系统上的一个真实进程。

端点(Endpoint): 对于特定服务所接收的请求路径, 如 HTTP 的 URI 路径和 gRPC 服务的类名 + 方法签名。

仪表盘

仪表盘布局

skywalking仪表盘分为服务、端点、实例的性能监控。大致结构如下(展示的图表可以自定义):

分布式服务调用链路追踪——Skywalking-风君子博客

服务视角

服务视角有以下的监控数据,可以自定义监视数据图表的展示:

分布式服务调用链路追踪——Skywalking-风君子博客

实例视角

实例仪表盘分析了JVM相关的图表和请求响应相关的图表,可以直观的看到请求或者服务占用等情况。

分布式服务调用链路追踪——Skywalking-风君子博客

端点视角

端点仪表盘展示了每个端点的请求响应情况以及延时情况。在端点可以看到影响性能的端点名称等。

分布式服务调用链路追踪——Skywalking-风君子博客

拓补图

拓补图可以看到整个微服务的相互作用关系,可以看到整个调用链的大致结构,以及服务的类型。方便开发者理解整个系统的架构。

拓补图可以大致的看出某个服务的运行情况,也可以点击服务相关内容查看详细信息。在每个调用链上也展示了请求数和延时情况等信息,方便查看者对服务情况大体的了解。

拓补图内容如下:

分布式服务调用链路追踪——Skywalking-风君子博客

分布式服务调用链路追踪——Skywalking-风君子博客

分布式服务调用链路追踪——Skywalking-风君子博客

追踪

skywalking链路追踪可以收集整个服务的调用链,以及调用情况,执行情况,和参数等。

蓝色为调用成功的链路,点击列表可展示链路具体的调用信息,查看耗时,参数,执行情况等,方便对链路进行分析。

分布式服务调用链路追踪——Skywalking-风君子博客

性能分析

skywalking的性能分析,在根据服务名称、端点名称,以及相应的规则建立了任务列表后,在调用了此任务列表的端点后。skywalking会自动记录,剖析当前端口,生成剖析结果,具体流程如图:

分布式服务调用链路追踪——Skywalking-风君子博客

分布式服务调用链路追踪——Skywalking-风君子博客

分布式服务调用链路追踪——Skywalking-风君子博客

skywalking告警

配置

skywalking告警的配置文件如图:

分布式服务调用链路追踪——Skywalking-风君子博客

在skywalking目录的config目录下的alarm-setings.yml文件中进行配置:

分布式服务调用链路追踪——Skywalking-风君子博客

配置规则

具体规格参考:

中文文档: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-风君子博客

动态规则

skywalking可以设置动态规则,可以配合nacos或者Zookeeper实现。