在人们一般的认知中,skywalking
是一个典型的遵从google dapper
论文思想的系统分布式链路追踪的工具。但正如skywalking
官方所声称的,skywalking
是一个APM
(Application Performance Monitor
,应用性能监测)工具,或者说的更玄乎一点,是一个OAP
(Observation Analysis Platform
,可观测性分析平台)。skywalking不仅能分析调用链,还可以方便地分析系统指标和链路日志。
1 skywalking框架简述
如上面官网的两张图所示:SkyWalking 逻辑上分为四部分: 探针, 平台后端, 存储和用户界面:
-
Agent(探针)
负责从应用中,收集链路信息,发送给 SkyWalking OAP 服务器。支持 SkyWalking、Zikpin、Jaeger 等提供的 Tracing 数据信息。系统已提供了很多开箱可用的探针,包括不同语言开发的应用程序,如java/go/.net/javascript/lua,也支持servicemesh,支持对http、grpc调用进行追踪。
-
OAP(可观测性分析平台,即skywalking后端)
支持数据聚合, 数据分析以及驱动数据流从探针到用户界面的流程。分析包括 Skywalking 原生追踪和性能指标以及第三方来源,包括 Istio 及 Envoy telemetry , Zipkin 追踪格式化等。 你甚至可以使用 Observability Analysis Language 对原生度量指标 和 用于扩展度量的计量系统 自定义聚合分析。如果你的系统比较大,OAP可以进一步细分为Receiver和Aggregator两种角色。Receiver负责从Agent接收数据,Aggregator则对Receiver的数据进行聚合和分析。
-
Storage
通过开放的插件化的接口存放 SkyWalking 数据. 你可以选择一个既有的存储系统, 如 ElasticSearch、H2、 MySQL集群(Sharding-Sphere 管理)、TiDB,也可以选择自己实现一个存储系统
-
UI
一个基于接口高度定制化的Web系统,用户可以可视化查看和管理 SkyWalking 数据
2 OAP安装
如果你只是想体验一下skywalking的功能,下载skywalking安装包,直接启动即可:
$ tar -xzf apache-skywalking-apm-9.5.0.tar.gz
$ cd apache-skywalking-apm-bin
$ /bin/startup.sh
SkyWalking OAP started successfully!
SkyWalking Web Application started successfully!
然后就可以通过http://localhost.8080
访问skywalking UI,不过这时候没有任何跟踪数据
skywalking默认使用的后端存储是H2数据库,且是standalone模式,在正式生产环境中,应该选择持久化的后端数据库,如elasticsearch、mysql、postgresql、tidb等,一般选择elasticsearch作为存储后端的比较多。选择elasticsearch的最简配置如下所示:
storage:
# 选择elasticsearch作为后端存储
selector: ${SW_STORAGE:elasticsearch}
elasticsearch:
# es中所有相关的index名字都会以namespace值前缀
namespace: ${SW_NAMESPACE:"sky"}
# es集群地址
clusterNodes: ${SW_STORAGE_ES_CLUSTER_NODES:localhost:9200}
同样需要配置集群模式,skywalking支持通过多种平台来实现集群模式,如zookeeper、kubernetes、consul、etcd、nacos。如选择etcd,最简配置:
cluster:
selector: ${SW_CLUSTER:etcd}
etcd:
# etcd cluster nodes, example: 10.0.0.1:2379,10.0.0.2:2379,10.0.0.3:2379
endpoints: ${SW_CLUSTER_ETCD_ENDPOINTS:localhost:2379}
namespace: ${SW_CLUSTER_ETCD_NAMESPACE:/skywalking}
serviceName: ${SW_CLUSTER_ETCD_SERVICE_NAME:"SkyWalking_OAP_Cluster"}
3 Agent安装
如果是java agent,只需要下载agent安装包,解压到指定目录下,然后在启动java应用程序时通过-javaagent
参数指定agent位置即可,如下:
$ java -javaagent:./skywalking-agent/skywalking-agent.jar -jar target/gateway-0.0.1-SNAPSHOT.jar
agent的功能通过不同的plugin实现,生效的plugin放在activations
和plugins
两个目录下:
$ ls ./skywalking-agent
LICENSE NOTICE activations bootstrap-plugins config licenses logs optional-plugins optional-reporter-plugins plugins skywalking-agent.jar
agent安装包下还有一个optional-plugins
的目录,如果你要使用这个目录下的功能,将相应的plugin包移到plugins
目录下,比如你想跟踪spring-cloud-gateway
组件,则可以移动下面两个plugin:
$ cp ./skywalking-agent/optional-plugins/apm-spring-cloud-gateway-2.1.x-plugin-8.4.0.jar ./skywalking-agent/plugins/
$ cp ./skywalking-agent/optional-plugins/apm-spring-webflux-5.x-plugin-8.4.0.jar ./skywalking-agent/plugins/
agent的配置文件为./skywalking-agent/config/agent.config
,最简配置只需要修改服务名:
agent.service_name=${SW_AGENT_NAME:gateway}
4 跟踪链路日志
skywalking还可以搜集链路相关日志,将日志与分布式链路的trace id进行关联。需要支持该功能,在pom.xml
文件中添加相关依赖(假设日志组件使用的是logback 1.x版本,log4j2可以添加对应的依赖):
<dependency>
<groupId>org.apache.skywalking</groupId>
<artifactId>apm-toolkit-trace</artifactId>
<version>8.16.0</version>
</dependency>
<dependency>
<groupId>org.apache.skywalking</groupId>
<artifactId>apm-toolkit-logback-1.x</artifactId>
<version>8.16.0</version>
</dependency>
然后在logback配置中使用skywalking相应的日志encoder,如下是logback-spring.xml
配置文件的示例内容:
<?xml version="1.0" encoding="UTF-8"?>
<configuration scan="true" scanPeriod="60 seconds" debug="false">
<!-- 日志输出格式, [%tid]打印的就是trace id值 -->
<property name="log.pattern" value="%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{36} - [%method,%line] [%tid] - %msg%n"/>
<!-- 系统日志输出 -->
<appender name="stdout" class="ch.qos.logback.core.ConsoleAppender">
<file>${log.path}/info.log</file>
<encoder class="ch.qos.logback.core.encoder.LayoutWrappingEncoder">
<!-- 支持打印trace id -->
<layout class="org.apache.skywalking.apm.toolkit.log.logback.v1.x.TraceIdPatternLogbackLayout">
<pattern>${log.pattern}</pattern>
</layout>
<pattern>${log.pattern}</pattern>
</encoder>
</appender>
<!-- 收集日志到skywalking oap,这样在skywalking中能看到链路日志 -->
<appender name="grpcLog" class="org.apache.skywalking.apm.toolkit.log.logback.v1.x.log.GRPCLogClientAppender">
<encoder class="ch.qos.logback.core.encoder.LayoutWrappingEncoder">
<layout class="org.apache.skywalking.apm.toolkit.log.logback.v1.x.mdc.TraceIdMDCPatternLogbackLayout">
<pattern>${log.pattern}</pattern>
</layout>
</encoder>
</appender>
<root level="INFO">
<appender-ref ref="stdout"/>
<appender-ref ref="grpcLog"/>
</root>
</configuration>
这样项目在打印日志时,如果是链路追踪相关的日志,则会打印链路的trace id
;如果不是追踪链路相关的日志,[%tid]
占位符打印的内容为[N/A]
打印的日志示例:
5 skywalking应用介绍
下面以一个简单的例子来介绍skywalking的应用。假设有两个服务,app-server1
和app-server2
,app-server1通过gateway
向外开放了一个接口,该接口会调用app-server2的一个接口,app-server2的这个接口会以10%的概率返回错误。app-server1、app-server2、gateway都注册到eureka
注册中。我们观察一下跟踪的链路、拓扑、服务metric、日志等数据。
5.1 服务
如下图所示,service卡片展示了系统所有的服务以及每个服务的整体指标信息。如负载、成功率、调用延时、应用整体指标(Apdex)。
5.2 服务metric指标
点击某个服务,则可以查看服务相应的详细指标,基本上包括了我们平时关心的所有接口指标
5.3 服务调用拓扑
如下图所示,topology卡片展示了系统各服务的调用拓扑关系(图中右下角的localhost:8001节点代表eureka服务),并用不同的颜色表示了服务的健康状态。如果系统中使用了mysql、redis、kafka等组件,拓扑图中还会展示这些常用中间件的调用关系。
5.4 调用链分析
如下图所示,trace卡片展示的就是skywalking最为核心的调用链分析页面,该页面提供了调用链的详细信息,并用红色标识了失败的调用。
5.5 调用链日志分析
如果点击某个调用链分析页面右上角的『查看日志』按钮,则可以查看该调用链的相关日志。或者直接进入log卡片,则可以看到系统的所有日志,可以根据条件查找相关的日志。
5.6 查看日志内容
如下图所示,点击某条日志,则可以查看日志的具体内容(日志分析的效果还有较大的改善空间)。