目录

一、前言

二、SkyWalking是什么

三、链路追踪框架对比

四、主要功能特性

五、服务端搭建

六、SkyWalking接入微服务

七、SkyWalking跨多个微服务跟踪

八、持久化

基于mysql持久化

九、自定义链路追踪

十、性能剖析

十一、SkyWalking集成日志框架

SkyWalking通过grpc上报日志(需要v.8.4.0+)

十二、告警

告警规则

Webhook(网络钩子)

邮件告警功能实践

十三、SkyWalking高可用


一、前言

对于一个大型的几十个、几百个微服务构成的微服务架构系统,通常会遇到一些问题,比如:

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

2.如何缕清各个微服务之间的依赖关系?

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

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


二、SkyWalking是什么

SkyWalking是一个国产开源框架。SkyWalking是分布式系统的应用程序性能监视工具,专为微服务、云原生架构和基于容器(Docker、K8s)架构而设计。它是一款优秀的APM(Application Performance Management)工具,包括了分布式追踪、性能分析、应用和服务依赖分析等。

官网:Apache SkyWalking

下载地址:Downloads | Apache SkyWalking

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

文档:Welcome | Apache SkyWalking

中文文档:SkyWalking 文档中文版


三、链路追踪框架对比

1.Zipkin是Twitter开源的调用链分析工具,目前基于SpringCloud Sleuth得到了广泛应用,特点是轻量,使用部署简单。

2.Pinpoint是韩国开源的基于字节码注入的调用链分析,以及应用监控分析工具。特点是支持多种插件,UI功能强大,接入端无代码侵入。

3.SkyWalking是中国开源的基于字节码注入的调用链分析,以及应用监控分析工具。特点是支持多种插件,UI功能较强,接入端无代码侵入。

4.CAT是大众点评开源的基于编码和配置的调用链路分析,应用监控分析,日志采集,监控报警等一系列的监控平台工具。

项目 Cat Zipkin

SkyWalking

调用链可视化
聚合报表 非常丰富 较丰富
服务依赖图 简单 简单
埋点方式 侵入式 侵入式 非侵入式,字节码增强
VM监控指标
支持语言 java/.net

丰富

java/.net/php/go/node.js
存储机制 mysql(报表),本地文件/HDFS(调用链) 内存、es、mysql等 H2、es
社区支持 主要在国内 国外主流 Apache支持
使用案例 美团、携程 京东、阿里定制后不开源 华为、小米、。。。
APM
开发基础 eBay cal Google Dapper Google Dapper
是否支持WebFlux

四、主要功能特性

1.多种监控手段,可以通过语言探针和service mesh获得监控的数据

2.支持多种语言自动探针,包括Java、.Net Core和Node JS等

3.轻量高效,无需大数据平台和大量的服务器资源

4.模块化、UI、存储、集群管理都有多种机制可选

5.支持告警

6.优秀的可视化解决方案


五、服务端搭建

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

下载

 目录结构

  • webapp:ui前端(web监控页面)的jar包和配置文件
  • oap-libs: 后台应用的jar包,以及它的依赖jar包,里边有一个server-starter-*.jar就是启动程序
  • config:  启动后台应用程序的配置文件,是使用的各种配置
  • logs: 日志信息
  • bin: 各种脚本,一般使用脚本startup.*来启动web页面和对应的后台应用
  1. oapservice.*:默认使用的后台程序的启动脚本(使用的是默认启动模式,还支持其它模式,各模式区别见启动模式)
  2. oapServiceInit.*:默认init模式启动,在此模式下,OAP服务器启动以执行初始化工作,然后退出
  3. oapServiceNoInit.*: 使用NO init模式启动,在此模式下,OAP服务器不进行初始化
  4. webappService.*: UI前端启动的脚本
  5. startup.*: 组合脚本,同时启动oapService.* 、webappService.*脚本
  • agent:
  1. skywalking-agent.jar:代理服务jar包
  2. config:代理服务启动时使用的配置文件
  3. plugins:包含多个插件,代理服务启动时会加载该目录下的所有插件(实际是各种jar包)
  4. optional-plugins: 可选插件,当需要支持某种功能时,比如SpringCloud Gateway,则需要把对应的jar包拷贝到plugins目录下

启动

  • 双击startup.bat(linux下就启动startup.sh)
  • 启动成功后会启动两个服务,一个是skywalking-oap-server,一个是skywalking-web-ui : 默认端口号是8080,通常情况下在启动前会修改webapp目录下的配置文件,修改端口号。
  • skywalking-oap-server服务启动后会暴露11800和12800端口,分别为收集监控数据的端口11800和接收前端请求的端口12800,修改端口可以修改config/application.yml

六、SkyWalking接入微服务

#指定skywalking-agent.jar所在位置
-javaagent:D:\SpringCloudAlibaba-2.2.7\
#指定服务名字
-DSW_AGENT_NAME=api-gateway
#指定collector连接地址
-DSW_AGENT_COLLECTOR_BACKED_SERVICES=127.0.0.1:11800

-DSW_AGENT_COLLECTOR_BACKED_SERVICES可以指定远程地址,但-javaagent必须绑定本机物理路径的skywalking-agent.jar

注意:此处存在bug,跟踪链路不显示gateway

拷贝agent/optional-plugins目录下的gateway插件到agent/plugins目录下,然后重启skywalking服务。


七、SkyWalking跨多个微服务跟踪

SkyWalking跨多个微服务跟踪,只需要每个微服务启动时添加javaagent参数即可。


八、持久化

默认使用的H2内存数据库存储。skywalking重启后数据就会丢失。

config/application.yml

基于mysql持久化

1.修改config目录下的application.yml,使用mysql作为持久化存储的数据库

2.修改mysql连接配置

3.创建swtest数据库,数据库下的表会在skywalking启动的时候自动创建。

4.重启skywalking,在启动时,oap-service会启动报错,查看log日志,发现缺少了mysql的驱动,是因为skywalking  oap-libs目录下没有mysql驱动的jar包,在oap-libs目录下放置一个mysql驱动的jar即可。

5.再次重启即可。


九、自定义链路追踪

如果我们希望对项目中的业务方法,实现链路追踪,方便我们排查问题,可以使用如下代码

引入依赖

<!--SkyWalking工具类 跟使用的SkyWalking的版本保持一致--><dependency><groupId>org.apache.skywalking</groupId><artifactId>apm-toolkit-trace</artifactId><version>8.5.0</version></dependency>

@Trace

如果一个业务方法想在ui界面的跟踪链路上显示出来,只需要在业务方法上加上@Trace注解即可。

@Tag

我们还可以为追踪链路增加其他额外的信息,比如记录参数和返回信息。

实现方式:在方法上增加@Tag或者@Tags。

@Tag 注解中,key = 方法名,value = returnedObj是固定值。


十、性能剖析

SkyWalking的性能分析,在根据服务名称,端点名称、以及相应的规则建立了任务列表后,在调用了此任务列表的端点后,skywalking会自动记录,剖析当前端口,生成剖析结果。


十一、SkyWalking集成日志框架

Log4j官方配置

Log4j2官方配置

logback官方配置

引入依赖

<!--apm-toolkit-logback-1.x--><dependency><groupId>org.apache.skywalking</groupId><artifactId>apm-toolkit-logback-1.x</artifactId><version>8.5.0</version></dependency>

 添加logback-spring.xml文件,并配置%tid占位符

<?xml version="1.0" encoding="UTF-8"?>
<configuration scan="true" scanPeriod=" 5 seconds"><!--引入SpringBoot默认的logback xml配置文件--><include resource="org/springframework/bootlogging/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.mdc.TraceIdMDCPatternLogbackLayout"><Pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%X{tid}] [%thread] %-5level %logger{36} -%msg%n</Pattern></layout></encoder></appender><root level="INFO"><appender-ref ref="console"/></root>
</configuration>

SkyWalking通过grpc上报日志(需要v.8.4.0+)

gRPC报告程序可以将收集到的日志转发到SkyWalkingOAP服务器上。

logback-spring.xml中添加以下配置

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

修改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}

完整logback-spring.xml

<?xml version="1.0" encoding="UTF-8"?>
<configuration scan="true" scanPeriod=" 5 seconds"><!--引入SpringBoot默认的logback xml配置文件--><include resource="org/springframework/bootlogging/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.mdc.TraceIdMDCPatternLogbackLayout"><Pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%X{tid}] [%thread] %-5level %logger{36} -%msg%n</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.mdc.TraceIdMDCPatternLogbackLayout"><Pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%X{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>

十二、告警

SkyWalking告警功能是在6.x版本新增的,其核心由一组规则驱动,这些规则定义在config/alarm-settings.yml文件中。告警规则的定义分为两部分:

1.告警规则:他们定义了应该如何触发度量警报,应该考虑什么条件

2.Webhook(网络钩子):定义当警告触发时,哪些服务终端需要被告知

告警规则

SkyWalking的发行版都会默认提供config/alarm-settings.yml文件,里面预先定义了一些常用的告警规则。如下:

1.过去三分钟内服务平均响应时间超过1秒。

2.过去2分钟服务成功率低于80%

3.过去3分钟内服务响应时间超过1s的百分比

4.服务实例在过去2分钟内平均响应时间超过1s,并且实例名称与正则表达式匹配

5.过去2分钟内端点平均响应时间超过1s

6.过去2分钟内数据库访问平均响应时间超过1s

7.过去2分钟内端点关系平均响应时间超过1s

这些预定义的告警规则,打开config/alarm-settings.yml文件即可看到

告警规则配置项的说明

  • Rule name:规则名称,也是在告警信息中显示的唯一名称。必须以_rule结尾,前缀可自定义
  • Metrics name: 度量名称,取值为oal脚本中的度量名,目前只支持long、double和int类型。
  • Include names: 该规则作用于哪些实体名称,比如服务名,终端名(可选,默认为全部)
  • Exclude names: 该规则作用于哪些实体名称,比如服务名,终端名(可选,默认为空)
  • Threshold:阈值
  • OP:操作符,目前支持>、<、=
  • Period: 多久告警规则需要被核实一下。这是一个时间窗口,与后端部署环境时间相匹配
  • Count: 在一个Period窗口中,如果values超过Threshold值(按op),达到Count值,需要发送警报
  • Silence period: 在时间N中触发报警后,在TN->TN+period这个阶段不告警。默认情况下,它和Period一样,这意味着相同的告警(在同一个Metrics name拥有相同的Id)在同一个Period内只触发一次
  • message: 告警消息

Webhook(网络钩子)

webhook可以简单理解为是一种web层面的回调机制,通常由一些事件触发,与代码中的事件回调类似,只不过是Web层面的。由于是Web层面的,所以当事件发生时,回调的不在是代码中的方法或函数,而是服务接口。例如,在告警这个场景,告警就是一个事件。当该事件发生时,SkyWalking就会主动去调用一个配置好的接口,该接口就是所谓的Webhook。

SkyWalking的告警消息会通过HTTP请求进行发送,请求方法为POST,Content-Type为application/json,其JSON数据是基于List<org.apache.skywalking.oap.server.core.alarm.AlarmMessage>进行序列化的。

示例如下

[{"scopeId": 1, "scope": "SERVICE","name": "serviceA", "id0": "12",  "id1": "",  "ruleName": "service_resp_time_rule","alarmMessage": "alarmMessage xxxx","startTime": 1560524171000
}, {"scopeId": 1,"scope": "SERVICE","name": "serviceB","id0": "23","id1": "","ruleName": "service_resp_time_rule","alarmMessage": "alarmMessage yyy","startTime": 1560524171000
}]

字段说明

  • scopeId、scope:所有可用的scope都在org.apache.skywalking.oap.server.core.source.DefaultScopeDefine 中定义
  • name: 目标scope实体名称
  • id0: scope实体的 ID与名称匹配。使用关系scope时,它是源实体 ID。
  • id1: 使用关系scope时,它将是目标实体 ID。否则,它是空的。
  • ruleName: 告警规则名称
  • alarmMessage:告警消息内容
  • startTime:告警时间,以毫秒为单位,格式为时间戳

邮件告警功能实践

1.修改 config/alarm-settings.yml文件

2.编写回调接口,使用org.apache.skywalking.oap.server.core.alarm.AlarmMessage类作为参数接收。


十三、SkyWalking高可用

在大多数生产环境中,后端应用需要支持高吞吐量并且支持高可用来保证服务的稳定,所以你始终需要在生产环境进行集群管理。

SkyWalking集群是将skywalking oap作为一个服务注册到nacos上,只要skywalking oap服务没有全部宕机,保证有一个skywalking oap在运行,就能进行跟踪。

搭建一个skywalking oap集群需要:

  1. 至少一个nacos(也可以是nacos集群)
  2. 至少一个es/mysql(也可以是集群)
  3. 至少2个skywalking oap服务
  4. 至少一个ui(ui也可以集群多个,用nginx代理统一入口)

1.修改config/application.yml文件,使用nacos作为注册中心

 2.修改nacos配置

 3.可以选择性修改监听端口

 4.修改存储策略,使用es或者mysql作为storage

5.修改mysql或者es配置

6.配置ui服务webapp.yml文件的listOfServers,写两个地址,中间以逗号分隔

 7.启动Skywalking服务,指定jvm参数,中间以逗号分隔

-DSW_AGENT_COLLECTOR_BACKED_SERVICES=127.0.0.1:11800,127.0.0.1:11800  

链路追踪:SkyWalking相关推荐

  1. 分布式链路追踪SkyWalking进阶实战之RPC上报和WebHook通知(三)

    目录 1.自定义SkyWalking链路追踪配置 1.1 什么是TraceId 1.2 使用的背景 1.3 编码 2.SkyWalking-RocketBot性能剖析 3.SkyWalking链路追踪 ...

  2. 微服务链路追踪-SkyWalking

    微服务链路追踪-SkyWalking SkyWalking官网地址:https://skywalking.apache.org/ SkyWalking官方文档:https://skywalking.a ...

  3. 微服务链路追踪SkyWalking

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

  4. Admin监控Sleuth链路追踪 skywalking链路追踪

    Admin监控&Sleuth链路追踪,skywalking **Sleuth&Zipkin** 一.Sleuth&Zipkin介绍 二.搭建环境 三.Sleuth入门操作 四. ...

  5. PHP分布式链路追踪,SkyWalking:分布式架构链路追踪-SkyWalking介绍

    前面几篇文章提到了微服务相关系统的使用与搭建,在微服务架构下的问题也比较突出.正常系统下我们的每个请求都会在同一个系统中进行输出.但是在微服务架构中一个请求可能设置一到多个服务进行处理.服务之间相互依 ...

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

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

  7. 链路追踪-SkyWalking

    链路追踪是为了解决应用内部系统调用: 帮助理解系统行为.用于分析性能问题的工具,以便发生故障的时候,能够快速定位和解决问题,这就是所谓的 APM(应用性能管理) 提供分布式追踪.服务网格遥测分析.度量 ...

  8. 链路追踪SkyWalking

    1.SkyWalking的核心概念 1.1 概述 2015年由个人吴晟(华为开发者)开源 , 2017年加入Apache孵化器 分布式系统的应用程序性能监视工具,专为微服务.云原生架构和基于容器(Do ...

  9. 分布式链路追踪-skywalking入门体验

    背景 旁友,你的线上服务是不是偶尔来个超时,或者突然抖动一下,造成用户一堆反馈投诉.然后你费了九牛二虎之力,查了一圈圈代码和日志才总算定位到问题原因了.或者公司内部有链路追踪系统,虽然可以很轻松地通过 ...

  10. 猿创征文|链路追踪-Skywalking入门

    背景 旁友,你的线上服务是不是偶尔来个超时,或者突然抖动一下,造成用户一堆反馈投诉.然后你费了九牛二虎之力,查了一圈圈代码和日志才总算定位到问题原因了.或者公司内部有链路追踪系统,虽然可以很轻松地通过 ...

最新文章

  1. 【通信原理】【实验】实验二:数字基带传输实验(GZHU)
  2. 查看mysql是否内存中读取数据_MySQL中的内存临时表
  3. linux -- at命令
  4. VB 6.0中的数据连接模块
  5. android studio创建构造方法,使用Android studio创建你的第一个项目
  6. vue .prop修饰符
  7. Linux 火焰图(on-cpu , off-cpu , memory)
  8. \u5168\u56fd\u7f8e\u5bb9\u5927\u592b数据采集数据(\u82b1\u5bb9\u7f51 huaroo 公开数据),爬虫120例之26例
  9. 鸿鹄818芯片:小米电视千万销量面前的“水滴”
  10. c语言大作业宿舍管理系统,数据库大作业——学生宿舍管理系统
  11. 适合用做公司官网WordPress主题风格免受权版本
  12. HTML 表单 (form) 的作用解释
  13. 永恒骑士 小程序服务器列表空,微信小程序一键登录应用服务器通过AES解密返回purePhoneNumber为空?...
  14. 【python机器学习】普通最小二乘法多元线性回归
  15. Docker入门实战(三)-Docker容器镜像
  16. 陌上花开,可缓缓归矣——2016年校招总结
  17. python3中Failed building wheel for xxx”的解决办法
  18. HW及各大公司软侧面试题
  19. 【今日早报|每日小型简短新闻12条】12月1日 星期二
  20. 页面中生成图形二维码

热门文章

  1. RISC-V向量指令扩展(二)
  2. 静态时序分析(STA)附秋招面试提问
  3. 《无尽之刃》中采用的提高效率的美术制作技巧
  4. Android 8.1 中Systemui中的常见修改(六)NavigationBar加载流程
  5. 大数据下的90后事业画像
  6. Linux下使用云笔记及OneNote
  7. 网约车新政陆续出台,共享经济遇阻为哪般?
  8. 1030: 判断直角三角形 C语言
  9. layui单选框verify_layui lay-verify form表单自定义验证规则详解
  10. MySQL高级之外键、表关联、数据导入及导出