如果系统只能用一种APM工具,你就用skywalking

1,137 阅读4分钟

在人们一般的认知中,skywalking是一个典型的遵从google dapper论文思想的系统分布式链路追踪的工具。但正如skywalking官方所声称的,skywalking是一个APMApplication Performance Monitor,应用性能监测)工具,或者说的更玄乎一点,是一个OAP(Observation Analysis Platform,可观测性分析平台)。skywalking不仅能分析调用链,还可以方便地分析系统指标和链路日志。

1 skywalking框架简述

image.png

image.png

如上面官网的两张图所示:SkyWalking 逻辑上分为四部分: 探针, 平台后端, 存储和用户界面:

  1. Agent(探针)

    负责从应用中,收集链路信息,发送给 SkyWalking OAP 服务器。支持 SkyWalking、Zikpin、Jaeger 等提供的 Tracing 数据信息。系统已提供了很多开箱可用的探针,包括不同语言开发的应用程序,如java/go/.net/javascript/lua,也支持servicemesh,支持对http、grpc调用进行追踪。

  2. OAP(可观测性分析平台,即skywalking后端)

    支持数据聚合, 数据分析以及驱动数据流从探针到用户界面的流程。分析包括 Skywalking 原生追踪和性能指标以及第三方来源,包括 Istio 及 Envoy telemetry , Zipkin 追踪格式化等。 你甚至可以使用 Observability Analysis Language 对原生度量指标 和 用于扩展度量的计量系统 自定义聚合分析。如果你的系统比较大,OAP可以进一步细分为Receiver和Aggregator两种角色。Receiver负责从Agent接收数据,Aggregator则对Receiver的数据进行聚合和分析。

  3. Storage

    通过开放的插件化的接口存放 SkyWalking 数据. 你可以选择一个既有的存储系统, 如 ElasticSearch、H2、 MySQL集群(Sharding-Sphere 管理)、TiDB,也可以选择自己实现一个存储系统

  4. 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,不过这时候没有任何跟踪数据

image.png

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放在activationsplugins两个目录下:

$ 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]

打印的日志示例:

image.png

5 skywalking应用介绍

下面以一个简单的例子来介绍skywalking的应用。假设有两个服务,app-server1app-server2,app-server1通过gateway向外开放了一个接口,该接口会调用app-server2的一个接口,app-server2的这个接口会以10%的概率返回错误。app-server1、app-server2、gateway都注册到eureka注册中。我们观察一下跟踪的链路、拓扑、服务metric、日志等数据。

5.1 服务

如下图所示,service卡片展示了系统所有的服务以及每个服务的整体指标信息。如负载、成功率、调用延时、应用整体指标(Apdex)。 image.png

5.2 服务metric指标

点击某个服务,则可以查看服务相应的详细指标,基本上包括了我们平时关心的所有接口指标

image.png

5.3 服务调用拓扑

如下图所示,topology卡片展示了系统各服务的调用拓扑关系(图中右下角的localhost:8001节点代表eureka服务),并用不同的颜色表示了服务的健康状态。如果系统中使用了mysql、redis、kafka等组件,拓扑图中还会展示这些常用中间件的调用关系。 image.png

5.4 调用链分析

如下图所示,trace卡片展示的就是skywalking最为核心的调用链分析页面,该页面提供了调用链的详细信息,并用红色标识了失败的调用。 image.png

5.5 调用链日志分析

如果点击某个调用链分析页面右上角的『查看日志』按钮,则可以查看该调用链的相关日志。或者直接进入log卡片,则可以看到系统的所有日志,可以根据条件查找相关的日志。 image.png

5.6 查看日志内容

如下图所示,点击某条日志,则可以查看日志的具体内容(日志分析的效果还有较大的改善空间)。 image.png