分布式服务调用链路追踪——Skywalking

 

SkyWalking是什么?

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

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

特点:

 

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 已启动。

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_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/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实现。

 

 

 

posted on 2021-05-22 18:32  曹伟雄  阅读(9115)  评论(1编辑  收藏  举报

导航