skywalking链路追踪

​ Skywalking是分布式系统的应用程序性能监视工具,专为微服务,云原生架构和基于容器(Docker,K8S,Mesos)架构而设计,它是一款优秀的APM(Application Performance Management)工具,包括了分布式追踪,性能指标分析和服务依赖分析等

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

下载:http://skywalking.apache.org/downloads/

Github: https://github.com/apache/skywalking

文档:https://skywalking.apache.org/docs/main/v8.4.0/readme/

中文文档:https://skyapm.github.io/document-cn-translation-of-skywalking/

1、需要解决的问题:

  • 如何串联整个调用链路,快速定位问题?

  • 如何理清楚各个微服务之间的依赖关系?

  • 如何进行各个微服务接口的性能分析?

  • 如何跟踪整个业务流程的调用处理顺序?

    与其他框架的对比:
    对比框架

skywalking的探针对吞吐量的影响最小,zipkin的吞吐量居中。pinpoint的探针对吞吐量的影响较为明显。

2、Skywalking主要功能特性

  • 多种监控手段,可以通过语言探针和service mesh获得监控的数据;
  • 支持多种语言自动探针,包括java,.NET Core和Node.JS;
  • 轻量高效,无需大数据平台和大量的服务器资源;
  • 模块化,UI、存储、集群管理都有多种机制可选;
  • 支持告警;
  • 优秀的可视化解决方案;

3、Skywalking环境搭建部署

环境部署

  • skywalking agent和业务系统绑定在仪器,负责收集各种监控数据;
  • Skywalking oapservice(相当于服务端):是负责收集并处理监控数据的,如接收skywalking agent的监控数据,并存储在数据库(mysql、h2)中;接收skywalking webapp的前端请求,从数据库查询数据,并返回数据给前端。Skywalking oapservice通常以集群的形式存在。
  • skywalking webapp,前端界面,用于展示数据。
  • 用于存储监控数据的数据库,比如mysql、elasticsearch等。

4、下载及安装

1)下载:Index of /dist/skywalking (apache.org)

在这里插入图片描述

(这里下v8.5.0)

2)解压完成后文件夹内容

文件组成

目录结构
  • **webapp:**UI 前端( web 监控页面)的 jar 包和配置文件 .yml;(可以通过配置文件修改端口)

  • **oap-libs:**后台应用的 jar 包,以及它的依赖jar包,里边有一个 server-starter-*.jar 就是启动程序;

  • **config:**启动后台应用程序的配置文件,是使用的各种配置(主要是修改里边的 application.yml 文件,可在 storage 修改默认存储方式(h2是内存数据库,重启会丢失监控数据))

  • **bin:*各种启动版本,一般使用脚本 startup. 启动 web页面 和对应的 后台应用

    • oapService.*:默认使用的后台程序的启动脚本;(使用的是默认模式启动,还支持其他模式,各模式区别)
    • oapServiceinit.*:使用 init 模式启动;在此模式下,OAP服务器启动以执行初始化工作,然后退出
    • oapServiceNoInit.*:使用 no init 模式启动;在此模式下,OAP服务器不进行初始化。
    • webappService.*:UI前端的启动脚本;
    • stratup.*:组合脚本,同时启动 oapService. *、webappService. *脚本;
  • agent:

    • skywalking-agent.jar:代理服务 jar 包
    • config:代理服务启动时使用的配置文件
    • plugins:包含多个插件,代理服务启动时会加载该目录下的所有插件(就是各种jar包)
    • optional-plugins:可选插件,当需要支持某种功能时,比如 SpringCloud Gateway,则需要把对应的 jar 包拷贝到plugins

5、SkyWalking的服务

​ SkyWalking启动之后,会启动两个Java服务:skywalking-oap-server、skywalking-web-ui

skywalking-oap-server服务启动后会暴露11800 和 12800 两个端口,分别为 收集监控数据的端口11800接收前端请求的端口12800 ,修改端口可以修改config/application.yml

  • Skywalking-Collector

​ 1. 追踪信息收集器,通过gRPC/Http收集客户端的采集信息。默认采用gRPC。

​ 2. gRPC默认端口11800,Http默认端口12800

  • Skywalking-Webapp

    1. 管理平台页面,默认端口8080
    

6、skywalking中的三个概念

  • 服务(Service):表示对请求提供相同行为的一系列或一组工作负载,使用Agent时,可以定义服务名字
  • 服务实例(instance):自已工作负载中的每一个工作负载是一个实例,一个服务实例就是操作系统的一个真实流程
  • 端点(Endpoint):对特定服务接收的请求路径,如HTTP的URI路径和gRPC服务的类名+方法签名

7、skywalking在idea中的配置

无侵入式,不需要对代码修改

在这里插入图片描述

-javaagent:D:\skywalking\apache-skywalking-apm-bin\agent\skywalking-agent.jar (指定agent.jar所在的位置)
-DSW-AGENT_NAME=springboot-skywalking-demo (指定服务名字)
-DSW_AGENT_COLLECTOR_SERVICES=127.0.0.1:11800 (指定aollector连接地址,与微服务对接的端口)

springcloud中:默认不显示gateway,需要将 agent \optional-plugins 文件夹下的 apm-spring-cloud-gateway-2.1.x-plugin-8.5.0.jar 复制到 agent\plugins文件夹下

自定义链路追踪
  • 对项目中的方法实现链路追踪,引入一下依赖
<!--skywalking工具类, 跟服务版本一致-->
<dependency>
    <groupId>org.apache.skywalking</groupId>
    <artifactId>apm-toolkit-trace</artifactId>
    <version>8.5.0</version>
</dependency>
  • @Trace 将方法加入链路追踪

    • 若业务方法想在UI界面的追踪链路上显示出来,只需要在业务方法上加 @Trace
    • 为追踪链路增加其他的额外信息,比如记录参数和返回信息,在方法上增加 @Tag 或 @Tags
    • @Tag中 Key = 方法名,value = returnedObj 返回值 ,value = arg[0] =参数
    @Trace
    @Tag(key = "add", value = "returnedObj")
    public int add(String businessKey) {
        BusinessStatus bs = new BusinessStatus();
        // 待提交
        bs.setStatus(BusinessStatusEnum.WAIT.getCode());
        bs.setBusinessKey(businessKey);
        return baseMapper.insert(bs);
    }
    
    @Override
    @Trace
    @Tags({
            @Tag(key = "add", value = "returnedObj"),
            @Tag(key = "add", value = "arg[0]")
    })
    

8、UI管理端图形界面使用说明

仪表盘
Global

在这里插入图片描述
在这里插入图片描述

  • Services Load:服务每分钟请求数

  • Slow Services:慢响应服务,单位ms

  • Un-Health Services (Apdex):不健康服务

  • Slow Endpoints:慢端点,单位ms

  • Global Response Latency:百分比响应延时,不同百分比的延时时间,单位ms

  • Global Heatmap:服务响应时间热力分布图,根据时间段内不同响应时间的数量显示颜色深度

Service

在这里插入图片描述

  • Service Apdex(数字):当前服务的评分

  • Service Apdex(折线图):不同时间的Apdex评分

  • Service Avg Response Time:服务平均响应时间

  • Successful Rate(数字):请求成功率

  • Successful Rate(折线图):不同时间的请求成功率

  • Service Response Time Percentile:百分比响应延时

  • Service Load(数字):每分钟请求数

  • Servce Load(折线图):不同时间的每分钟请求数

  • Service Instances Load:每个服务实例的每分钟请求数

  • Slow Service Instance:每个服务实例的最大延时

  • Service Instance Successful Rate:每个服务实例的请求成功率

Instance

在这里插入图片描述

  • Service Instance Load:当前实例的每分钟请求数

  • Service Instance Throughput:实例吞吐量

  • Service Instance Successful Rate:当前实例的请求成功率

  • Service Instance Latency:当前实例的响应延时

  • JVM CPU (Java Service):jvm占用CPU的百分比

  • JVM Memory (Java Service):JVM内存占用大小,单位m

  • JVM GC Time:JVM垃圾回收时间,包含YGC和OGC

  • JVM GC Count:JVM垃圾回收次数,包含YGC和OGC

  • JVM Thread Count (Java Service):JVM线程数

  • JVM Thread State Count (Java Service)

  • JVM Class Count (Java Service)

EndPoint

在这里插入图片描述

  • Endpoint Load in Current Service:每个端点的每分钟请求数

  • Slow Endpoints in Current Service:每个端点的最慢请求时间,单位ms

  • Successful Rate in Current Service:每个端点的请求成功率

  • Endpoint Load:当前端点每个时间段的请求数据

  • Endpoint Avg Response Time:当前端点每个时间段的请求行响应时间

  • Endpoint Response Time Percentile:当前端点每个时间段的响应时间占比

  • Endpoint Successful Rate:当前端点每个时间段的请求成功率

拓扑图

在这里插入图片描述

单个服务相关内容(从左到右)

  • 单个服务内容
  • 服务告警信息
  • 服务端点追踪信息
  • 服务实例性能信息
  • api信息面板
追踪

在这里插入图片描述

  • 左侧:api接口列表,红色-异常请求,蓝色-正常请求;
  • 右侧:api追踪列表,api请求连接各端点的先后顺序和时间;
性能剖析

可以用来解决 慢请求,慢响应的问题

新建任务

在这里插入图片描述

刷新后界面信息

在这里插入图片描述

分析线程信息

在这里插入图片描述

日志

skywalking集成日志框架(logback)

  • 引入依赖
<dependency>
            <groupId>org.apache.skywalking</groupId>
            <artifactId>apm-toolkit-logback-1.x</artifactId>
            <version>8.5.0</version>
        </dependency>
  • 添加logback-spring.xml文件
<?xml version="1.0" encoding="UTF-8" ?>
<configuration>
    <!-- 引入 Spring Boot 默认的logback XML 配置文件-->
    <include resource = "org/springframework/boot/logging/logback/defaults.xml"/>
    <property name="log_pattern" value="%d{yyyy-MM-dd HH:mm:ss.SSS Z} [%tid] [%thread] %-5level %logger{36}:%line - %msg%n" />
    <appender name="STDOUT" 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>${log_pattern}</pattern>
            </layout>
        </encoder>
    </appender>
    <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.TraceIdPatternLogbackLayout">
                <pattern>${log_pattern}</pattern>
            </layout>
        </encoder>
    </appender>
    <root level="INFO">
        <appender-ref ref="STDOUT"/>
        <appender-ref ref="FILE"/>
        <appender-ref ref="grpc-log"/>
    </root>
</configuration>

github.com/apache/skywalking/blob/v8.5.0/docs/en/setup/service-agent/java-agent/Application-tookit-logback-1.x.md

  • 若oap与agent不在同一个服务器上,需要配置 agent/config/agent.config 的内容
# 指定要向其报告日志数据的GRPC服务器主机
plugin.toolkit.log.grpc.reporter.server_host=${SW_GRPC_LOG_SERVER_HOST:10.10.10.1}
# 指定要向其报告日志数据的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}
告警

Skywalking每隔一段时间根据收集到的链路追踪的数据和配置的告警规则(如服务响应时间、服务响应时间百分比)等,判断如果达到阈值则发送相应的告警信息。发送告警信息是通过调用webhook接口完成,具体的webhook接口可以使用者自行定义,从而开发者可以在指定的webhook接口中编写各种告警方式,比如邮件、短信等。告警的信息也可以在RocketBot中查看到。

以下是默认的告警规则配置,位于skywalking安装目录下的config文件夹下 alarm-settings.yml 文件,若要使用webhooks,需要在alarm-settings.yml下配置

webhooks:
   http://127.0.0.1:8088/webhook

常见的报警规则

  • 最近3分钟内服务的平均响应时间超过1秒
  • 最近2分钟服务成功率低于80%
  • 最近3分钟90%服务响应时间超过1秒
  • 最近2分钟内服务实例的平均响应时间超过1秒

实现报警机制:

1、配置webhook

2、实现接口

编写告警功能接口来进行测试,创建skywalking_alarm项目。

AlamController:

package com.itcast.skywalking_alarm.controller;
 
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;
 
@RestController
public class AlarmController {
 
    //每次调用睡眠1.5秒,模拟超时的报警
    @GetMapping("/timeout")
    public String timeout(){
        try {
            Thread.sleep(1500);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
 
        return "timeout";
    }
}

主要用于模拟超时,多次调用产生告警信息

WebHooks

package com.itcast.skywalking_alarm.controller;
 
import com.itcast.skywalking_alarm.pojo.AlarmMessage;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RestController;
 
import java.util.ArrayList;
import java.util.List;
 
@RestController
public class WebHooks {
 
    private List<AlarmMessage> lastList = new ArrayList<>();
 
    @PostMapping("/webhook")
    public void  webhook(@RequestBody List<AlarmMessage> alarmMessageList){
        lastList = alarmMessageList;
    }
 
    @GetMapping("/show")
    public List<AlarmMessage> show(){
        return lastList;
    }
}

告警时会调用webhook接口,该接口必须是Post类型,同时接口参数使用RequestBody支持邮件,钉钉,企业微信等

package com.itcast.skywalking_alarm.pojo;

public class AlarmMessage {
    private int scopeId;
    private String name;
    private int id0;
    private int id1;
    //告警的消息
    private String alarmMessage;
    //告警的产生时间
    private long startTime;

public int getScopeId() {
    return scopeId;
}

public void setScopeId(int scopeId) {
    this.scopeId = scopeId;
}

public String getName() {
    return name;
}

public void setName(String name) {
    this.name = name;
}

public int getId0() {
    return id0;
}

public void setId0(int id0) {
    this.id0 = id0;
}

public int getId1() {
    return id1;
}

public void setId1(int id1) {
    this.id1 = id1;
}

public String getAlarmMessage() {
    return alarmMessage;
}

public void setAlarmMessage(String alarmMessage) {
    this.alarmMessage = alarmMessage;
}

public long getStartTime() {
    return startTime;
}

public void setStartTime(long startTime) {
    this.startTime = startTime;
}

@Override
public String toString() {
    return "AlarmMessage{" +
            "scopeId=" + scopeId +
            ", name='" + name + '\'' +
            ", id0=" + id0 +
            ", id1=" + id1 +
            ", alarmMessage='" + alarmMessage + '\'' +
            ", startTime=" + startTime +
            '}';
}
}

实体类用于接收告警信息

  • 调用接口,地址为http://IP:8088/timeout,直到出现告警
  • 查看告警信息接口:http://IP:8088/show

实体类用于接收告警信息

  • 调用接口,地址为http://IP:8088/timeout,直到出现告警
  • 查看告警信息接口:http://IP:8088/show

一次Skywalking线上分享会上记录的关于使用Skywalking定位问题的思路:

  • 纵览全局,通过Skywalking拓扑图
  • 监控告警,metric/tracting确定问题存在故障(根据metric做告警),确定故障在哪,tracing调用关系,确定故障出现在那个service或者endpoint
  • 追踪(profile手段)定位
Logo

K8S/Kubernetes社区为您提供最前沿的新闻资讯和知识内容

更多推荐