skywalking 分布式链路追踪

一、介绍

  • Skywalking是什么

  • 市场上同类解决方案

    • Zipkin是由Twitter开源的链路分析分析工具,在springcloud sleuth得到了广泛的使用,具有轻量,部署简单的特点

    • Pinpoint是由韩国人开发的链路追踪应用监控分析工具,基于字节码方式注入。具有支持多种插件,UI功能强大,接入端没有代码侵入

    • Skywalking是由国人开发的链路追踪应用监控分析工具,基于字节码方式注入。具有支持多种插件,UI功能强大,接入端没有代码侵入,现已加入Apache孵化器

    • CAT是大众点评开源的链路追踪分析工具,具有对应用监控的分析、日志的采集、监控报警一系列的监控平台

  • Skywalking特点

    • 具有多种监控手段,可以通过语言探针来获取监控数据

      • 具有多种语言的自动探针。它包括了Java、.net、node.js等

      • 具有轻量有高效的特点,不占用大量的服务器资源

      • 清晰的模块化,UI、存储、集群管理都有许多种机制供选择

      • 支持告警,具有优秀的可视化解决方案

      • 可以在多种环境下运行,例如:像注册中心,Eureka和RPC框架springcloud dubbo

  • Skywalking整体架构

    • 可以分为:上、下、左、右四个部分

    • 上部分(skywalking-agent):这一部分负责从应用程序中收集链路信息,然后把链路信息发送给skywalking OAP处理器

    • 下部分(skywalking OAp):负责接收从skywalking-agent发送过来的Tracing数据信息,然后把数据信息给Analysis Core进行分析,把分析到的数据存储到外部的存储器当中,最后面把数据信息给Query Core提供查询数据的功能

    • 左部分(Skywalking UI):负责给用户查看链路等信息

  • 部署组件介绍

    • 数据存储(H2/mysql/ElasticSearch)

    • Skywalking-OAP-Server

    • Skywalking UI

    • Skywalking-Agent(项目引入)

二、部署

数据存储ElasticSearch 7.6.2部署

mkdir -p /mydata/es/config
mkdir -p /mydata/es/data
chmod 777 -R /mydata/es
echo "http.host: 0.0.0.0" >> /mydata/es/config/elasticsearch.yml

#启动运行
docker run -d --name es7 -p 9200:9200 -p 9300:9300 \
  -e "discovery.type=single-node" -e ES_JAVA_OPTS="-Xms128m -Xmx128m" \
  -v /mydata/es/config/elasticsearch.yml:/usr/share/elasticsearch/config/elasticsearch.yml \
  -v /mydata/es/data:/usr/share/elasticsearch/data \
  -v /mydata/es/plugins:/usr/share/elasticsearch/plugins elasticsearch:7.6.2

#参数说明
#-e "discovery.type=single-node" 设置为单节点
#-e ES_JAVA_OPTS="-Xms128m -Xmx128m" 设置ES的初始内存和最大内存,否则过大启动不了ES

#注意:这时候会提示权限不够需要开启权限:chmod 777 -R /mydata/es
     #登录http://ip:9200/_cat/nodes?v=true&pretty
     #记得开放网络安全组 9200 9300

Skywalking部署

docker部署

Skywalking-OAP-Server部署
#--安装oap
docker run --name skywalking-oap --restart always -d -e TZ=Asia/Shanghai -p 12800:12800 -p 11800:11800 --link es7 -e SW_STORAGE=elasticsearch7 -e SW_STORAGE_ES_CLUSTER_NODES=es7:9200 apache/skywalking-oap-server:8.5.0-es7

#参数:
#--link <name or id>:alias ,添加到另一个容器的链接,可以添加别名或者不加

#–link后面的参数和elasticsearch容器名一致;

#SW_STORAGE=elasticsearch7 是固定的,使用es7;

#SW_STORAGE_ES_CLUSTER_NODES:es7也可改为es服务器部署的Ip地址,比如ip:9200
 Skywalking-UI安装
#--安装ui
docker run -d --name skywalking-ui \
--restart=always \
-e TZ=Asia/Shanghai \
-p 8080:8080 \
--link xd_oap \
-e SW_OAP_ADDRESS=xd_oap:12800 \
apache/skywalking-ui:8.5.0

#SkyWalking UI界面访问地址 ip:8080

源码部署

源码包目录
  • config配置文件 application.yml配置修改 
application.yml

 

 

  • 本地部署SkyWalking

    • 方式一:直接启动(ui和oap)

      #源码bin目录下
      bin/startup.sh
    • 方式二:分别依次启动

      #端口 11800
      bin/oapService.sh
      
      #端口8080
      bin/webappService.sh
      
    • 查看日志

      #oap日志
      skywalking-oap-server.log
      #ui界面日志
      webapp.log
    • 访问

      • ip:8080

 

 三、skywalking常见概念、ui界面、Skywalking-Agent 探针介绍

常见概念

  • 服务(Service)

    • 比如商品微服务

  • 实例(Instance)

    • 比如 机器1(192.12.41.4)

  • 端点(Endpoint)

    • 比如商品微服务对外提供的接口 /api/v1/product/list,就是端点

  • 用户的满意程度 Service Apdex

    • 全称 Application Performance Index,最大值就是 1, 是一个不断优化的方向

    • 分3个指标,T 值代表着用户对应用性能满意的响应时间界限或者说是“门槛”,假如T是0.5秒

      • 满意:这样的响应时间让用户感到很愉快,响应时间少于 T 秒钟; 0.5秒内

      • 容忍:慢了一点,但还可以接受,继续这一应用过程,响应时间 T~4T 秒; 0.5~2秒内

      • 失望:太慢了,受不了了,用户决定放弃这个应用,响应时间超过 4T 秒; 多于2秒

  • SLA

    • 服务等级协议,全称:service level agreement,为保障服务的性能和可用性,

    • 9越多代表全年服务可用时间越长服务更可靠,停机时间越短

    1年 = 365天 = 8760小时
    
    99.9 = 8760 * 0.1% = 8760 * 0.001 = 8.76小时
    
    99.99 = 8760 * 0.0001 = 0.876小时 = 0.876 * 60 = 52.6分钟
    
    99.999 = 8760 * 0.00001 = 0.0876小时 = 0.0876 * 60 = 5.26分钟
    
    从以上看来,全年停机5.26分钟才能做到99.999%,即5个9
  • CPM

    • 全称 call per minutes,是吞吐量(Throughput)指标,每分钟请求调用的次数

  • RT

    • Response Time 表示请求响应时间,对于人来说,响应时间最好不要超过2秒

  • Percent Response 百分位数统计

    • 表示采集样本中某些值的占比,Skywalking 有 “p50、p75、p90、p95、p99” 一些列值

    • 比如 “p99:360” 表示 99% 请求的响应时间在360ms以内

ui界面介绍

控制栏

控制栏

展示栏(Global全局维度)

展示栏(Service服务维度)

展示栏(Instance服务维度,不过对于监控CPU、内存等,Promethus 是个更好的选择)

展示栏(Endpoint维度)

拓扑图

追踪

性能剖析

性能剖析新建任务

 

监控警告

 

Skywalking-Agent探针

  • 什么SkyWalking探针

    • 探针表示集成到目标系统中的代理或 SDK 库,即收集并格式化数据, 并发送到后端 包括链路追踪和性能指标

  • Skywalking-Agent的安装和使用

  • skywalking-agen目录文件的介绍

    • logs:skywalking agent的相关运行日志

    • bootstrap-plugins:插件包

    • optional-plugins:插件包(可供选择的插件包,如果需要生效则需要拷贝到plugins包下)

    • plugins:插件包(生效的插件包,支持多个框架链路追踪)

    • optional-reporter-plugins:插件包

    • activations:插件包

    • config: 配置文件

    • skywalking-agent.jar:agent代理的jar包(主要是这个!)

  • skywalking-agent的使用方式

    • 优先级:探针-> JVM配置-> 环境变量配置 -> agent.config(优先级低)

    • 第一种-javaagent:/path/to/skywalking-agent.jar={config1}={value1},{config2}={value2}

      #- agent.service_name:客户端服务名,在apm系统中显示的服务名称
      #- collector.backend_service:SW上传的服务地址
      -javaagent:../skywalking-agent.jar=agent.service_name=customName,collector.backend_service=127.0.0.1:11800
    • 第二种:-Dskywalking.[option1]=[value2]

      #- agent.service_name:客户端服务名,在apm系统中显示的服务名称
      #- collector.backend_service:SW上传的服务地址
      -javaagent: ../skywalking-agent.jar -Dskywalking.agent.service_name=customName -Dskywalking.collector.backend_service=127.0.0.1:11800

四、springboot整合skywalking

整合skywalking链路追踪

#- agent.service_name:客户端服务名,在apm系统中显示的服务名称
#- collector.backend_service:SW上传的服务地址
-javaagent: ../skywalking-agent.jar -Dskywalking.agent.service_name=customName -Dskywalking.collector.backend_service=127.0.0.1:11800
  •  直接在启动时 JVM配置
    • 优点是无侵入性
    • 缺点是只能看到简单得节点耗时信息,不能明确到各个方法层

自定义 SkyWalking链路追踪配置实战

  • 什么是TraceId

    • 用来标识一条请求链路,一条请求链路中包含一个Trace ID,多个Span ID

  • 背景

    • 对业务代码进行链路追踪,方便排查问题

    • 比如,某个接口请求耗时慢,想对业务接口方法进行追踪

    • controller->service 方法,记录业务方法加入到链路中,记录入参、返回值等

  • 编码

    • 添加依赖

    <dependency>
                <groupId>org.apache.skywalking</groupId>
                <artifactId>apm-toolkit-trace</artifactId>
                <version>8.5.0</version>
    </dependency>
    • 业务方法添加注解

      • @Trace

    • 记录入参和返回值

      • POJO记得重写toString方法

      • #第一个入参就是arg[0],第二个就是arg[1],以此类推
        #返回参数 returnedObj 固定写法
        @Tags(
        	{@Tag(key = "方法名-input", value = "arg[0]"), 
        	@Tag(key = "方法名-output", value = "returnedObj")
        	}
        )
  • 缺点

    • 代码有侵入性

SkyWalking链路追踪-日志和RPC上报实战

  • 背景

    • 用户请求接口,怎么在我们日志中找到traceId来跟踪系统调用链路

    • 需要在系统日志打印出traceId

    • 注意(重要)

      • 由于阿里云选择的的服务器和带宽不高,安装了多个组件 oap、ui、es7等

      • 所以测试的时候有时数据有延迟、或者服务器压力过高,有时数据出不来,刷新页面几次才出来数据

      • 如果本地有docker环境和机器配置高,也可以本地进行安装skywalking相关组件

      • 后续也有源码安装

  • 整合

    • 添加依赖

      <dependency>
          <groupId>org.apache.skywalking</groupId>
          <artifactId>apm-toolkit-logback-1.x</artifactId>
          <version>8.5.0</version>
      </dependency>
    • 配置logback打印日志并上传(SpringBoot默认使用Logback),配置文件名 logback.xml

      <?xml version="1.0" encoding="UTF-8"?>
      <configuration>  
          <!-- 控制台输出 -->
          <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>%d{yyyy-MM-dd HH:mm:ss.SSS} [%tid] [%thread] %-5level %logger{36} -%msg%n</Pattern>
                  </layout>
              </encoder>
          </appender>
      
      <!-- skywalking grpc 日志收集上报服务端 8.4.0版本后支持 -->
          <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} [%tid] [%thread] %-5level %logger{36} -%msg%n</Pattern>
                  </layout>
              </encoder>
          </appender>
      
          <!--系统操作日志-->
          <root level="INFO">  
              <appender-ref ref="console"/> 
              <appender-ref ref="grpc-log"/>
          </root>
      </configuration>
    • 注意
      • skywaling agent 默认是上传到本地的oap,如果oap server地址不是本地,则需要单独配置oap server地址

      • agent文件夹里面config配置

        #日志数据的grpc服务器的主机
        plugin.toolkit.log.grpc.reporter.server_host=${SW_GRPC_LOG_SERVER_HOST:120.79.150.146} 
        #日志数据的grpc服务器的端口
        plugin.toolkit.log.grpc.reporter.server_port=${SW_GRPC_LOG_SERVER_PORT:11800}
        #日志数据的最大大小
        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}
        
        #下面是正式:不加中文注释
        plugin.toolkit.log.grpc.reporter.server_host=${SW_GRPC_LOG_SERVER_HOST:120.79.150.146}
        plugin.toolkit.log.grpc.reporter.server_port=${SW_GRPC_LOG_SERVER_PORT:11800}
        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接口地址可以自行定义路径

      • 注意:要OAP Server的网络可以触发的webhook接口

    • 开发人员可以在webhook接口中编写告警方式,比如邮件、短信等,就是一个http接口

  • Apache Skywalking默认的告警规则配置
    • 安装目录下的config文件夹下 alarm-settings.yml文件

    • 默认内置多个规则

      • 最近3分钟内服务的平均响应时间超过1秒

      • 最近2分钟服务成功率低于80%

      • 最近3分钟90%服务响应时间超过1秒

      • 最近2分钟内服务实例的平均响应时间超过1秒

    • 配置讲解

      • metrics-name 脚本中的度量名称

      • threshold 阈值

      • op 比较操作符,可以设定>,<,=

      • period 多久检查一次当前的指标数据是否符合告警规则,单位分钟

      • count 达到多少次后,触发告警消息

      • silence-period 在多久时间之内,忽略相同的告警消息,在时间T触发了某告警,那么在(T+10)这个时间段,不会再次触发相同告警

      • message 告警消息内容

      • webhooks 配置告警产生时的触发的调用地址,配置之后一定要重启

        alarm-settings.yml
  • 编码
//实体类 接收警告参数
public class AlarmMessage  {
    private int scopeId;
    private String scope;
    private String name;
    private String id0;
    private String id1;
    private String ruleName;
    private String alarmMessage;
    private long startTime;
    private transient int period;
    private transient boolean onlyAsCondition;
    
    //set get方法
}


@RestController
public class CallbackController {

    private List<AlarmMessage> messageList = new ArrayList<>();

    //接收接口
    @PostMapping("/webhook")
    public void  webhook(@RequestBody List<AlarmMessage> alarmMessageList){
        System.out.println("收到消息:" +alarmMessageList);
        messageList = alarmMessageList;
    }

    @GetMapping("/show")
    public List<AlarmMessage> show(){
        return messageList;
    }
}
  • 16
    点赞
  • 20
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值