# skywalking链路追踪

# 介绍

  • Skywalking是分布式系统的应用程序性能监视工具,专为微服务,云原生架构和基于容器(Docker,K8S,Mesos)架构而设计, 是一款优秀的APM(Application Performance Management)工具,包括了分布式追踪,性能指标分析和服务依赖分析等。
  • Skywalking是一个国产的开源框架,为Apache顶级项目
  • 支持Java、.Net、NodeJs等探针,数据存储支持Mysql、Elasticsearch等
  • 采用字节码注入的方式实现代码的无侵入,探针采集数据粒度粗,但性能表现优秀,且对云原生支持。

下面分别介绍skywalking UI中各项内容,分别为仪表盘拓扑图追踪性能剖析日志告警

# 仪表盘

仪表盘是我们进入skywalking的首页。他提供多个指示板来可视化指标,例如:服务(APM) 、数据库(Database)、istio等等。接下来,会着重介绍APM和Database面板。

skywalking_5.png

# APM

APM面板总体分为四块:global(全局)service(服务)instance(实例)endpoint(端点),提供筛选功能。每块都包含一些指标。

# global(全局)指标

  • Services Load(CPM - calls per minute):服务每分钟请求数

  • Slow Services(ms):慢响应服务(响应时间排序top n)

  • Un-Health Services (Apdex):Apdex分数

    Apdex是根据设定的阈值和响应时间结合考虑的衡量标准。它是满意响应时间和不满意响应时间相对于总响应时间的比率。 它衡量的是用户对你的服务的满意程度。

  • Slow Endpoints (ms):endpoint的平均响应耗时排序,单位ms

  • Global Response Latency(percentile in ms):响应时间百分比,不同百分比的延时时间,单位ms percentile标签含义(p99、p95、pxx等):例如p99为3500ms, 这意味着 99% 的请求应该比3500ms更快

  • Global Heatmap(ms):服务响应时间热力分布图,根据时间段内不同响应时间的数量显示颜色深度, 颜色越深,请求越多。

skywalking_1_0.png skywalking_1_1.png

# Service(服务)指标

  • Service Apdex 数字:Apdex分数(请参考上一章golbal的解释)
  • Service Apdex 折线图:一段时间的Apdex分数
  • Service Avg Response Time(ms):服务平均响应时间
  • Service Response Time Percentile(ms):百分比响应延时(参考上一章golbal的解释)
  • Successful Rate(%)数字:请求成功率
  • Successful Rate(%)折线图:一段时间的请求成功率
  • Service Load(CPM - calls per minute):每分钟调用数
  • Service Load(CPM - calls per minute):一段时间的每分钟调用数
  • Service Instances Load(CPM - calls per minute):每个实例每分钟请求数
  • Slow Service Instance(ms):每个服务实例平均延时topN
  • Service Instance Successful Rate(%):服务实例的请求成功率 topN

skywalking_1_2.png skywalking_1_3.png skywalking_1_4.png

# Instance(实例)指标

  • Service Instance Load(CPM - calls per minute): 实例每分钟调用数
  • Service Instance Successful Rate(%):实例调用成功比率
  • Service Instance Latency(ms):实例响应延时
  • JVM CPU(java service)%:jvm占用cpu百分比
  • JVM Memory (java service)(MB):jvm内存占用大小,包含四个指标instance_jvm_memory_heap(堆内存使用)、instance_jvm_memory_heap_max(最大堆内存)、instance_jvm_memory_noheap(直接内存当前使用)、instance_jvm_memory_noheap_max(最大直接内存)
  • JVM GC Time(ms):jvm垃圾回收时间,包含young gc和old gc。
  • JVM GC Count:jvm垃圾回收次数,包含young gc count和old gc count
  • JVM Thread Count(java service)线程数 另外还有四个.net的指标,不涉及,暂不描述

skywalking_1_5.png skywalking_1_6.png skywalking_1_7.png

# Endpoint(端点)指标

  • Endpoint Load in Current Service(CPM / PPM):每个端点(API)每分钟请求数
  • Slow Endpoints in Current Service(ms):每个端点(API)的平均响应时间最慢top n,单位ms
  • Successful Rate in Current Service(%):每个端点(API)的请求成功率
  • Endpoint Load:当前端点每个时间段的请求数据
  • Endpoint Avg Response Time:当前端点每个时间段的平均请求响应时间
  • Endpoint Response Time Percentile(ms):当前端点每个时间段的响应时间占比
  • Endpoint Successful Rate(%):当前端点每个时间段的请求成功率

skywalking_1_8.png skywalking_1_9.png

# Database

  • Database Avg Response Time(ms):当前数据库平均响应时间,单位ms
  • Database Access Successful Rate(%):当前数据库访问成功率
  • Database Traffic(CPM: Calls Per Minute):当前数据库每分钟请求数
  • Database Access Latency Percentile(ms):数据库不同比例的响应时间,单位ms
  • Slow Statements(ms):前N个慢查询,单位ms
  • All Database Loads(CPM: Calls Per Minute):所有数据库中请求量排序
  • Un-Health Databases:所有数据库不健康排名,请求成功率排名,失败最多的请求在最上。

skywalking_1_10.png skywalking_1_11.png

# 拓扑图

可以描述服务与服务直接的联系,例如下图,我们可以清晰的看到User服务依赖于consumer服务、messi服务两个服务

skywalking_1_12.png

# 追踪

查看每个接口的调用链,每个链路耗时、状态。如果为失败,还会展示错误信息,如果是数据库,会展示查询语句。 另外可以根据追踪id(trace id)和标记(tag)筛选。 如下图:

skywalking_1_13.png

点击查看详情:

skywalking_9.png

# 性能剖析

性能剖析通过新建任务,对不同端点进行采样,提供更详细的报告。目前看起来,比追踪多了线程栈的信息、慢方法提示

# 1、新建任务

skywalking_1_14.png

# 2、查看详细分析

skywalking_1_15.png

# 日志

综合展示各个服务的日志信息,可通过时间、追踪ID、关键词等进行检索

# 日志配置

服务中先完成相关配置才可以将日志正常传输到skywalking中

# 引入maven依赖(pom.xml)

<!--skyWalking监控相关-->
<dependency>
    <groupId>org.apache.skywalking</groupId>
    <artifactId>apm-toolkit-trace</artifactId>
    <version>8.7.0</version>
</dependency>
 <!--skyWalking日志相关-->
<dependency>
    <groupId>org.apache.skywalking</groupId>
    <artifactId>apm-toolkit-logback-1.x</artifactId>
    <version>8.7.0</version>
</dependency>

# logback.xml添加相关配置

<!-- skywalking日志配置 -->
<appender name="grpc-log" 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>%d{yyyy-MM-dd HH:mm:ss.SSS} [%X{tid}] [%thread] %-5level %logger{36} -%msg%n</Pattern>
        </layout>
    </encoder>
</appender>

<!-- Level: FATAL 0  ERROR 3  WARN 4  INFO 6  DEBUG 7 -->
<root level="INFO">
    <appender-ref ref="console"/>
    <appender-ref ref="info_log"/>
    <appender-ref ref="error_log"/>
    
    <!-- skywalking日志配置 -->
    <appender-ref ref="grpc-log"/>
</root>

# 日志展示

完成上面配置之后,即可在日志页面查看到相关日志,如下图

skywalking_1_16.png

点击之后查看详细信息

skywalking_13.png

点击追踪ID跳转到追踪页面

skywalking_14.png

# 告警

根据预设的告警规则,匹配信息并进行提示

# 告警配置

Apache SkyWalking 告警是由一组规则驱动,这些规则定义在 config/alarm-settings.yml 文件中,其位置如图所示:

skywalking_17.png

告警规则有两种类型:单独规则、复合规则

# 单独规则

rules:
  # 规则唯一名称,必须以'_rule'结尾.
  service_resp_time_rule:
    # 度量名称,也是OAL脚本中的度量名,目前Service, Service Instance, Endpoint的度量可以用于告警
    metrics-name: service_resp_time
    # [可选]默认,匹配此指标中的所有服务
    include-names:
      - service_a
      - service_b
    # 操作符
    op: >
    # 阈值,对于多种指标值的如percentile可以配置P50、P75、P90、P95、P99的阈值
    threshold: 1000
    # 评估度量标准的时间长度
    period: 10
    # 度量有多少次符合告警条件后,才会触发告警
    count: 2
    # 检查多少次,告警触发后保持沉默,默认周期相同
    silence-period: 10
    # 该规则触发时,发送的通知消息
    message: 服务【{name}】的平均响应时间在最近10分钟内有2分钟超过1秒

# 复合规则

复合规则仅适用于针对相同实体级别的告警规则 例如都是服务级别的告警规则:service_percent_rule && service_resp_time_percentile_rule 不适用于编写不同实体级别的告警规则

## 单独规则
rules:
  service_resp_time_rule:
    metrics-name: service_resp_time
    op: ">"
    threshold: 1000
    period: 10
    count: 2
    silence-period: 10
    message: 服务【{name}】的平均响应时间在最近10分钟内有2分钟超过1秒
  service_sla_rule:
    metrics-name: service_sla
    op: "<"
    threshold: 8000
    period: 10
    count: 2
    silence-period: 10
    message: 服务【{name}】的成功率在最近10分钟内有2分钟低于80%

# 规则名称:在告警信息中显示的唯一名称,必须以_rule结尾
comp_rule:
  # 指定如何组成规则,支持&&, ||, ()操作符
  expression: service_resp_time_rule && service_sla_rule
  message: 服务【{name}】在最近10分钟内有2分钟平均响应时间超过1秒并且成功率低于80%

# 告警信息查看

访问告警界面可以看到对应的告警信息,如下图

skywalking_1_17.png

点击查看详情

skywalking_1_18.png