微服务链路追踪-SkyWalking

SkyWalking官网地址:https://skywalking.apache.org/

SkyWalking官方文档:https://skywalking.apache.org/docs/main/v8.6.0/readme/

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

SkyWalking是 一个开源的可观测平台, 用于从服务和云原生基础设施收集, 分析, 聚合及可视化数据。

一、SkyWalking环境搭建部属

1. 下载

下载地址:https://skywalking.apache.org/downloads/

这里下载的是SkyWalking APM 8.6.0的版本。

下载解压。

2. 环境搭建

SkyWalking包含:

  • agent和业务系统绑定在一起,负责收集各种监控数据。
  • oap服务,是负责处理监控数据的,比如接受skywalking agent的监控数据, 并存储在数据库中;接受skywalking webapp的前端请求,从数据库查询数据,并返回数据给前端。Skywalking oapservice通常以集群的形式存在。
  • webapp的UI服务,前端界面,用于展示数据。

2.1 config/application.yml文件

Skywalking启动后,会有两个服务(oap与UI),oap服务会暴露两个端口号:11800用于收集监控数据的端口,12800用于接收前端请求。

SkyWalking的默认存储方式为h2,为了持久化可以修改为mysql,elasticsearch等。

这里我们使用MySQL的存储方式,然后相应的修改下面对应的mysql的配置信息(地址、账号密码等信息)。

2.2 webapp/webapp.yml

SkyWalking UI服务端口,默认是8080。

这里修改为8868后,启动访问的地址为 http://127.0.0.1:8868/。

2.3 MySQL持久化

将存储方式修改为MySQL方式后,需要新建对应的数据库,这里时swtest,在SkyWalking启动时会自动建表,需要注意的是,启动脚本中没有mysql驱动包,需要下载后放在oap-libs目录下。mysql-connector-java.jar可以前往https://mvnrepository.com/artifact/mysql/mysql-connector-java/8.0.21下载,也可以从有依赖mysql的项目仓库中找一个。

项目启动时可能会遇到time zone的服务器时区问题,需要在config/application.yml的mysql信息配置中设置时区,jdbc:mysql://localhost:3306/swtest?serverTimezone=UTC

项目成功启动后数据库如下:

2.4 日志文件

启动后会生成logs文件夹,日志文件存储在那里。

2.5 SkyWalking接入微服务

SkyWalking是无侵入性的,无需在项目代码中进行配置。只需在项目启动时做些配置。

用IDEA配置:在Configurations中配置VM options。配置如下:

-javaagent:D:/skywalking/apache-skywalking-apm-bin-es7/agent/skywalking-agent.jar
-DSW_AGENT_COLLECTOR_BACKEND_SERVICES=127.0.0.1:11800
-DSW_AGENT_NAME=gateway-server

第一行是指定skywalking-agent.jar的文件路径,第二行是指定收集监控数据的地址,第三行是该项目的服务名(自定义,一般使用spring.application.name)。

用jar包启动配置:

java -javaagent:D:/skywalking/apache-skywalking-apm-bin-es7/agent/skywalking-agent.jar
-DSW_AGENT_COLLECTOR_BACKEND_SERVICES=127.0.0.1:11800
-DSW_AGENT_NAME=gateway-server -jar xxx.jar

Linux下启动配置: 可以通过上述java -jar的方式,也可以配置启动脚本:

#!/bin/sh
# SkyWalking agent配置
export SW_AGENT_NAME=gateway-server
export SW_AGENT_COLLECTOR_BACKEND_SERVICES=127.0.0.1:11800
export SW_AGENT_SPAN_LIMIT=2000 #配置链路的最大Span数量,默认为 300。
export JAVA_AGENT=‐javaagent:/usr/local/src/apache‐skywalking‐apm‐bin‐es7/agent/skywalking‐agent.jar
java $JAVA_AGENT ‐jar xxx.jar

2.6 Gateway接入微服务不显示问题

需将agent\optional-plugins目录下的gateway包移至agent/plugins目录。

项目中我是用的是gateway 2.0的版本,但是移入2.0的还是不显示,2.1的可以显示。

3. 自定义SkyWalking链路追踪

SkyWalking链路追踪的为请求接口,不会追踪接口下所涉及到的方法,为了方便排查问题,可做如下操作:

3.1 引入依赖

<dependency><groupId>org.apache.skywalking</groupId><artifactId>apm-toolkit-trace</artifactId><!--与下载的skywalking版本一致--><version>8.6.0</version>
</dependency>

3.2 追踪方法

通过@Trace注解加在业务方法上可以将该方法在追踪面板中显示出来。

@Trace
public String hello() {return "hello";
}

通过@Tags或@Tag注解可以为追踪链路增加额外的信息。

@Tag注解中有两个属性,key为自定义名称,一般设置为方法名,value 可以是表示返回值的returnedObj或者表示参数的arg[参数索引]

示例:

①、@Tag-方法返回值示例

@Trace
@Tag(key = "hello",value = "returnedObj")
public String hello(Integer id) {return "hello world";
}

②、@Tags与@Tag-返回方法参数与方法返回值

@Trace
@Tags({@Tag(key = "helloParam",value = "arg[0]"),@Tag(key = "helloReturn",value = "returnedObj")})
public String hello(Integer id) {return "hello world";
}

4. SkyWalking集成日志

4.1 logback配置

官方配置地址:https://github.com/apache/skywalking/blob/v8.6.0/docs/en/setup/service-agent/java-agent/Application-toolkit-logback-1.x.md

引入依赖:

<!--skywalking集成日志-->
<dependency><groupId>org.apache.skywalking</groupId><artifactId>apm-toolkit-logback-1.x</artifactId><version>8.6.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"/><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>-%clr(%d{${LOG_DATEFORMAT_PATTERN:-yyyy-MM-dd HH:mm:ss.SSS}}){faint} %clr(${LOG_LEVEL_PATTERN:-%5p}) %clr(${PID:- }){magenta} [%tid] %clr(---){faint} %clr([%15.15t]){faint} %clr(%-40.40logger{39}){cyan} %clr(:){faint} %m%n${LOG_EXCEPTION_CONVERSION_WORD:-%wEx}}</Pattern></layout></encoder></appender><!--Skywalking通过grpc上报日志--> <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><!-- 设置 Appender --><root level="INFO"><appender-ref ref="console"/><appender-ref ref="grpc-log"/></root></configuration>

项目启动后请求接口会生成带有“[TID:1a418fc3c3b94aa6949800cc67191854.136.16529817427060001]” TID的日志,可根据TID及追踪ID在前台UI中进行搜索。

注意:

当SkyWalking没有部署在本地时,需要将agent\config\agent.config文件添加如下配置:

plugin.toolkit.log.grpc.reporter.server_host=${SW_GRPC_LOG_SERVER_HOST:127.0.0.1}
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.transmit_formatted 是否以格式化或未格式化的格式传输记录的数据 true
plugin.toolkit.log.grpc.reporter.server_host 指定要向其报告日志数据的grpc服务器的主机 127.0.0.1
plugin.toolkit.log.grpc.reporter.server_port 指定要向其报告日志数据的grpc服务器的端口 11800
plugin.toolkit.log.grpc.reporter.max_message_s ize 指定grpc客户端要报告的日志数据的最大大小 10485760
plugin.toolkit.log.grpc.reporter.upstream_time out 客户端向上游发送数据时将超时多长时间 单位是秒 30

4.2 log4j 配置

官方配置地址:https://skywalking.apache.org/docs/main/v8.6.0/en/setup/service-agent/java-agent/application-toolkit-log4j-1.x/

4.2 log4j2j 配置

官方配置地址:https://skywalking.apache.org/docs/main/v8.6.0/en/setup/service-agent/java-agent/application-toolkit-log4j-2.x/

5. SkyWalking告警功能

官方文档:https://github.com/apache/skywalking/blob/v8.6.0/docs/en/setup/backend/backend-alarm.md

告警规则都定义在config/alarm-setting.yml中。报警规则定义分为三个部分:

  1. 报警规则:它们定义了应如何触发指标警报以及应考虑哪些条件。
  2. 网络钩子(Webhook):Web 服务终结点的列表,应在触发警报后调用。
  3. gRPCHook:远程 gRPC 方法的主机和端口,应在触发警报后调用。

5.1 默认报警规则

为了方便起见,我们在版本中提供了默认值。它包括以下规则:

  1. 过去 3 分钟内超过 1 秒的服务平均响应时间。
  2. 最近 2 分钟内服务成功率低于 80%。
  3. 过去 3 分钟内超过 1 秒的服务响应时间百分位数
  4. 服务实例在过去 2 分钟内的平均响应时间超过 1 秒,并且实例名称与正则表达式匹配。
  5. 终结点在过去 2 分钟内超过 1 秒的平均响应时间。
  6. 数据库访问过去 2 分钟内超过 1 秒的平均响应时间。
  7. 过去 2 分钟内超过 1 秒的终结点关系平均响应时间。

5.2 网络钩子

可以理解为Web层面的回调机制,当触发报警时,SkyWalking的告警消息会通过HTTP请求进行发送,请求方式为POST,Content-Type 为 application/json,其JSON 数据实基于List<org.apache.skywalking.oap.server.core.alarm.AlarmMessage>进行序列化的,JSON数据示例:

[{"scopeId": 1, "scope": "SERVICE","name": "serviceA", "id0": "12",  "id1": "",  "ruleName": "service_resp_time_rule","alarmMessage": "alarmMessage xxxx","startTime": 1560524171000,"tags": [{"key": "level","value": "WARNING"}]
}, {"scopeId": 1,"scope": "SERVICE","name": "serviceB","id0": "23","id1": "","ruleName": "service_resp_time_rule","alarmMessage": "alarmMessage yyy","startTime": 1560524171000,"tags": [{"key": "level","value": "CRITICAL"}]
}]
  • scopeIdscope:所有作用域都在 中定义。org.apache.skywalking.oap.server.core.source.DefaultScopeDefine
  • name:目标 scope 的实体名称。请遵循实体名称定义。
  • id0:与名称匹配的 scope 的 ID。使用关系范围时,它是源实体 ID。
  • id1:使用关系作用域时,它是目标实体 ID。否则,它是空的。
  • ruleName::在alarm-settings.yml中配置的规则名称。
  • alarmMessage:警报文本消息。
  • startTime:告警时间,格式为时间戳。
  • tags:在alarm-settings.yml中配置的标记。

5.3 告警功能实现

创建网络钩子所需实体类:

@Data
public class SkyWalkingAlarm {private Integer scopeId;private String scope;private String name;private String id0;private String id1;private String ruleName;private String alarmMessage;private Long startTime;
}

SkyWalking回调接口,需要在config/alarm-setting.yml中结尾添加回调路径:

webhooks:- http://127.0.0.1:8800/test/alarm

然后为该请求实现业务:

@RestController
@RequestMapping("/test")
@Slf4j
public class SkyWalkingController {@PostMapping("/alarm")public String alarm(@RequestBody List<SkyWalkingAlarm> alarmList) {log.info("=====告警信息提醒=====");StringBuilder sb = new StringBuilder();for (SkyWalkingAlarm alarm : alarmList) {sb.append("scopeId: ").append(alarm.getScopeId()).append("\nscope: ").append(alarm.getScope()).append("\n目标 Scope 的实体名称: ").append(alarm.getName()).append("\nScope 实体的 ID: ").append(alarm.getId0()).append("\nid1: ").append(alarm.getId1()).append("\n告警规则名称: ").append(alarm.getRuleName()).append("\n告警消息内容: ").append(alarm.getAlarmMessage()).append("\n告警时间: ").append(alarm.getStartTime()).append("\n\n‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐\n\n");}System.out.println(sb);return "告警信息提醒";}
}

微服务链路追踪-SkyWalking相关推荐

  1. 微服务链路追踪SkyWalking

    微服务链路追踪SkyWalking 链路追踪介绍 skywalking是什么 SkyWalking环境搭建部署 SkyWalking跨多个微服务跟踪 SkyWalking UI介绍 SkyWalkin ...

  2. 微服务链路追踪SkyWalking第一课 SkyWalking简介

    开篇词:从剖析 SkyWalking 源码到吃透 APM 核心知识 你好,我是你的 SkyWalking 老师徐郡明,网名吴小胖,你也可以叫我胖哥.进入互联网行业工作多年,主要从事基础组件开发相关的工 ...

  3. 微服务链路追踪SkyWalking第十一课 OAL详解实战

    第31讲:OAL 语言,原来定义创造一门新语言如此轻松(上) 在前文介绍 Metrics 实现以及对应的 DIspatcher 实现的时候,会发现有一部分实现类位于 generated-analysi ...

  4. 微服务链路追踪SkyWalking第八课 OAP的receiver模块详解

    第22讲:深入剖析 regiter-receiver-plugin 插件(上) 在上一课时中,重点介绍了 SkyWalking 存储层的框架设计以及核心接口.从本节课开始,我们将深入 SkyWalki ...

  5. SkyWalking 微服务链路追踪

    目录 8. SkyWalking 微服务链路追踪 8.1 介绍 SkyWalking 8.2 Skywalking---服务搭建 8.3 SkyWalking---接入服务 8.3.1 windows ...

  6. skywalking原理_微服务链路追踪原理

    作者:平也 来源:关爱程序员社区 背景介绍 在微服务横行的时代,服务化思维逐渐成为了程序员的基本思维模式,但是,由于绝大部分项目只是一味地增加服务,并没有对其妥善管理,当接口出现问题时,很难从错综复杂 ...

  7. 全网最全的微服务链路追踪实践-SkyWalking(看这一篇就够了)

    链路追踪介绍 对于一个大型的几十个.几百个微服务构成的微服务架构系统,通常会遇到下面一些问题,比如: 1. 如何串联整个调用链路,快速定位问题? 2. 如何缕清各个微服务之间的依赖关系? 3. 如何进 ...

  8. 阿里P7架构师详解微服务链路追踪原理

    背景介绍 在微服务横行的时代,服务化思维逐渐成为了程序员的基本思维模式,但是,由于绝大部分项目只是一味地增加服务,并没有对其妥善管理,当接口出现问题时,很难从错综复杂的服务调用网络中找到问题根源,从而 ...

  9. 微服务链路追踪之zipkin搭建

    前言 微服务治理方案中,链路追踪是必修课,SpringCloud的组件其实使用很简单,生产环境中真正令人头疼的往往是软件维护,接口在微服务间的调用究竟哪个环节出现了问题,哪个环节耗时较长,这都是项目上 ...

最新文章

  1. Dispatch 执行ABC任务,执行完成之后刷新UI,指定任务D
  2. 机器学习特征筛选:互信息法(mutual information)
  3. lua 求table长度和判断空
  4. c语言100位整数乘法,很大的数相乘怎么办?
  5. RNN循环神经网络实现预测比特币价格过程详解
  6. esxi root 密码规则_陌陌风控系统静态规则引擎aswan
  7. 当汽车工业遇见 AI,开发者的时代到来
  8. 机器学习面试--决策树
  9. ajax执行成功后,在success回调函数中把后台返回的list还原到html的table中
  10. 语言输出奇树有多少总方法_新手如何快速学习一门编程语言?了解 TA,三周学好C语言...
  11. 牛腩新闻发布系统-小技巧
  12. 无忧微店自动发货软件
  13. 工具系列之邮件--浅谈工具如何改变你的工作效率
  14. 智障Sloth的第108次启动mininet链接控制器失败的原因
  15. Linux学习之路-Linux-at及cron命令【7】---20171215
  16. 跟我一起学Linux系统编程006C-进程内存分配,堆分配brk、malloc、free
  17. 关于ST的一些库的说明(附标准库下载地址)
  18. Java 来判断手机号码是否已经存在例子
  19. 网络管理维护(SNMP、RMON)期末考试大纲总结
  20. 前端CSS核心内容浮动

热门文章

  1. .Net ( c# ) 与 Fortran 混合编程实例(二):杆系结构有限元法——平面桁架解答(3)
  2. 广东牵手宝钢淘汰落后产能(经济聚焦)
  3. 一款大功率6A 深度PWM调光的降压恒流驱动工作原理
  4. 深入理解操作系统(12)第四章:处理器体系结构(4)Y86-64的流水线实现(包括:PIPE-处理器/预测下一个PC/分支预测/流水线冒险/暂停,转发避免冒险/PPE硬件结构及实现/CPI)
  5. 关于 python问题:from XXX import XXX的解释
  6. RISC-V各种资料,书书籍,paper等等整理收集
  7. linux 更改网络速度,教你一招 提高Linux操作系统网速方法(转)
  8. LKD 文件系统部分
  9. Atom核心诺基亚N9抛弃全键盘 界面图曝光(zt)
  10. c语言万年历开题报告,基于单片机的电子万年历设计开题报告