【Skywalking】一、分布式链路跟踪-Skywalking

Skywalking分布式链路跟踪

  • 一、Skywalking分布式链路跟踪
    • 1、 Skywalking主要功能特性
    • 2、Skywalking整体架构
      • 1、上部分Agent :
      • 2、下部分 SkyWalking OAP :
      • 3、右部分Storage:
      • 4、左部分SkyWalking UI:
  • 二、SkyWalking 环境搭建部署
    • 1、下载 SkyWalking 软件包
    • 2、SkyWalking OAP 搭建
    • 3、启动 SkyWalking OAP 服务
    • 4、访问SkyWalking UI界面:http://127.0.0.1:8080/
  • 二、SkyWalking Agent跟踪微服务
    • 案例一:
    • 案例二:
  • 三、SkyWalking中三个概念
    • 服务(Service) :
    • 服务实例(Service Instance) :
    • 端点(Endpoint) :
  • 四、 在IDEA中使用Skywalking
  • 五 、Skywalking告警通知
    • Webhook回调通知
  • 六 、Skywalking持久化到elasticsearch
  • 七 、Skywalking跨多个微服务跟踪
  • 八、自定义SkyWalking链路追踪
    • 1、添加依赖;
    • 2、在业务代码中使用如下方法:
  • 九、Skywalking集成日志框架
    • 1、添加如下依赖;
    • 2、添加logback-spring.xml文件(参见git代码);
    • 3、在代码中记录日志:
    • 4、访问controller测试,查看日志输出,就可以在日志中看到跟踪的traceId;

一、Skywalking分布式链路跟踪

分布式链路跟踪是分布式系统的应用程序性能监视工具,专为微服务、云原生架构和基于容器(Docker、K8s)架构而设计;
也就是说Skywalking是用于微服务的“跟踪" ;
对于一个大型的几十个、几百个微服务构成的微服务架构系统,通常会遇到下面一些问题,比如:

如何串联整个调用链路,快速定位问题? 
如何理清各个微服务之间的依赖关系?
如何进行各个微服务接口的性能分折? 
如何跟踪整个业务流程的调用处理顺序?

Skywalking提供分布式追踪、服务网格遥测分析、度量聚合和可视化一体化解决方案;
Skywalking是国人采用Java开发的,现在已经是apache下的一个等级项目

1、 Skywalking主要功能特性

1、多种监控手段,可以通过语言探针和service mesh获得监控的数据;
2、支持多种语言自动探针,包括 Java,.NET Core 和 Node.JS;
3、轻量高效,无需大数据平台和大量的服务器资源;
4、模块化,UI、存储、集群管理都有多种机制可选;
5、支持告警;
6、优秀的可视化解决方案;
官网:http://skywalking.apache.org/
下载:http://skywalking.apache.org/downloads/
Github:https://github.com/apache/skywalking

2、Skywalking整体架构

【Skywalking】一、分布式链路跟踪-Skywalking_第1张图片
整个架构分成四部分:

1、上部分Agent :

负责从应用中,收集链路信息,发送给 SkyWalking OAP 服务器;

2、下部分 SkyWalking OAP :

负责接收Agent发送的Tracing数据信息,然后进行分析(Analysis Core),存储到外部存储器(Storage),最终提供查询(Query)功能;

3、右部分Storage:

Tracing数据存储,目前支持ES、MySQL、Sharding Sphere、TiDB、H2多种存储器,目前采用较多的是ES,主要考虑是SkyWalking开发团队自己的生产环境采用ES为主;

4、左部分SkyWalking UI:

负责提供控台,查看链路等等;

二、SkyWalking 环境搭建部署

【Skywalking】一、分布式链路跟踪-Skywalking_第2张图片
1,下载 SkyWalking 软件包;
2,搭建一个 SkyWalking OAP 和SkyWalking UI服务;
3,启动一个Spring Boot应用,并配置SkyWalking Agent;
数据存储暂时先使用它默认的H2数据库存储。

1、下载 SkyWalking 软件包

对于 SkyWalking 的软件包,有两种方式获取:
手动编译
官方包
一般情况下,我们建议使用官方包,手动编译也可以;
从这里下载:http://skywalking.apache.org/downloads/

2、SkyWalking OAP 搭建

解压:tar -zxvf apache-skywalking-apm-8.1.0.tar.gz
解压后即完成了安装,不需要做其他操作;
切换:cd apache-skywalking-apm-bin
【Skywalking】一、分布式链路跟踪-Skywalking_第3张图片
目录说明:

agent #SkyWalking Agent
bin #执行脚本
config #SkyWalking OAP Server 配置文件
LICENSE
licenses
NOTICE
oap-libs #SkyWalking OAP Server
README.txt
tools
webapp #SkyWalking UI

3、启动 SkyWalking OAP 服务

切换到bin目录:./startup.sh
启动后会启动两个服务,一个是skywalking-oap-server,一个是skywalking-web-ui;
查看安装目录下的 ./logs 下的日志文件,检查两个服务的日志文件是否启动成功;
skywalking-oap-server服务启动后会占用:11800 和 12800 两个端口;
skywalking-web-ui服务会占用 8080 端口;
如果想要修改SkyWalking UI服务的参数,可以编辑webapp/webapp.yml 配置文件,比如:

server.port:SkyWalking UI服务端口,默认是8080;
collector.ribbon.listOfServers:SkyWalking OAP服务地址数组,SkyWalking UI界面的数据是通过请求SkyWalking OAP服务来获得;

4、访问SkyWalking UI界面:http://127.0.0.1:8080/

页面的右下角可以中英文切换,可以切换选择要展示的时间区间的跟踪数据;
【Skywalking】一、分布式链路跟踪-Skywalking_第4张图片

二、SkyWalking Agent跟踪微服务

【Skywalking】一、分布式链路跟踪-Skywalking_第5张图片

案例一:

准备一个springboot程序,打成可执行jar包,写一个shell脚本,在启动项目的Shell脚本上,通过 -javaagent 参数进行配置SkyWalking Agent来跟踪微服务;

#!/bin/sh
# SkyWalking Agent配置
export SW_AGENT_NAME=11-springboot #Agent名字,一般使用`spring.application.name` 
export SW_AGENT_COLLECTOR_BACKEND_SERVICES=127.0.0.1:11800 #配置 Collector 地址。
export SW_AGENT_SPAN_LIMIT=2000 #配置链路的最大Span数量,默认为 300。
export JAVA_AGENT=-javaagent:/usr/local/apache-skywalking-apm-bin/agent/skywalking-agent.jar
java $JAVA_AGENT -jar springboot-1.0.0.jar #jar启动

在启动程序前加一个-javaagent 参数即可完成对程序的跟踪;

案例二:

在tomcat中部署war包配置SkyWalking Agent来跟踪微服务;
修改/usr/local/apache-tomcat-9.0.31/bin/catalina.sh 文件,在顶部第一行加上:

CATALINA_OPTS="$CATALINA_OPTS -javaagent:/usr/local/apache-skywalking-apm-bin/agent/skywalking-agent.jar";
export CATALINA_OPTS;

如果tomcat端口与skywalking ui端口冲突的话,修改一下tomcat端口;
测试,访问一下项目,然后进入 SkyWalking UI 界面查看跟踪情况,由于上传数据是异步的,访问完项目后,可能需要等几秒才能看到跟踪数据;

三、SkyWalking中三个概念

服务(Service) :

表示对请求提供相同行为的一系列或一组工作负载,在使用Agent时,可以定义服务的名字,我们可以看到 Spring Boot 应用服务为 “springboot”,就是我们在环境变量 SW_AGENT_NAME 中所定义的;

服务实例(Service Instance) :

上述的一组工作负载中的每一个工作负载称为一个实例, 一个服务实例实际就是操作系统上的一个真实进程;
这里我们可以看到 Spring Boot 应用的服务为 {agent_name}-pid:{pid}@{hostname},由 Agent 自动生成;

端点(Endpoint) :

对于特定服务所接收的请求路径, 如HTTP的URI路径和gRPC服务的类名 + 方法签名;
我们可以看到 Spring Boot 应用的一个端点,为API接口 /index;

四、 在IDEA中使用Skywalking

在运行的程序配置jvm参数和环境变量参数,如下图所示:
【Skywalking】一、分布式链路跟踪-Skywalking_第6张图片

五 、Skywalking告警通知

skywalking告警的核心由一组规则驱动,这些规则定义在config/alarm-settings.yml文件中,告警规则的定义分为三部分;
1、告警规则:它们定义了应该如何触发度量警报,应该考虑什么条件;
2、**网络钩子(Webhook}:**当警告触发时,哪些服务终端需要被通知;
3、**gRPC钩子:**远程gRPC方法的主机和端口,告警触发后调用;
为了方便,skywalking发行版中提供了默认的alarm-setting.yml文件,包括一些规则,每个规则有英文注释,可以根据注释得知每个规则的作用;
比如service_resp_time_rule规则:

service_resp_time_rule:
    metrics-name: service_resp_time
    op: ">"
    threshold: 1000
    period: 10
    count: 3
    silence-period: 5
    message: Response time of service {name} is more than 1000ms in 3 minutes of last 10 minutes.

该规则表示服务{name}的响应时间在最近10分钟的3分钟内超过1000ms;
只有我们的服务请求符合alarm-setting.yml文件中的某一条规则就会触发告警;

Webhook回调通知

SkyWalking告警Webhook回调要求接收方是一个Web容器(比如tomcat服务),告警的消息会通过HTTP请求进行发送, 请求方法为POST, Content-Type为application/json, JSON格式基于
List的集合对象数据, 集合中的每个AlarmMessage包含以下信息:

  • 1、scopeId. 所有可用的Scope请查阅:
    org.apache.skywalking.oap.server.core.source.DefaultScopeDefine;
  • 2、name. 目标 Scope 的实体名称;
  • 3、id0. Scope 实体的 ID;
  • 4、id1. 未使用;
  • 5、ruleName. 您在 alarm-settings.yml 中配置的规则名;
  • 6、alarmMessage. 报警消息内容;
  • 7、startTime. 告警时间, 位于当前时间与 UTC 1970/1/1 之间;

AlarmMessage类的代码
【Skywalking】一、分布式链路跟踪-Skywalking_第7张图片

六 、Skywalking持久化到elasticsearch

Skywalking跟踪数据默认是存放在内嵌式数据库H2中的,重启skywalking,跟踪数据就丢失了,我们可以把跟踪数据持久化到mysql或者elasticsearch中,上一次课我们介绍了如何将跟踪数据持久化到mysql,此次我们介绍一些如何将跟踪数据持久化到elasticsearch中;
需要解压另一个专门针对elasticsearch版本的Skywalking:

  • 1、tar -zxvf apache-skywalking-apm-es7-8.1.0.tar.gz
  • 2、cd apache-skywalking-apm-es7-8.1.0
  • 3、修改application.yml配置文件:
    storage:
    selector: ${SW_STORAGE:elasticsearch7}
  • 4、启动elasticsearch7
    ./elasticsearch -d 后台运行 (es不能用root启动)
    注:Elasticsearch的jvm内存不能配置太小,至少512m,小了会出现错误:
    status line [HTTP/1.1 429 Too Many Requests]
  • 5、启动elasticsearch-head插件:npm run start 便于查看elasticsearch数据;
  • 6、启动skywalking
    ./startup.sh
    启动时会向elasticsearch中创建大量的index索引用于持久化数据,每天会产生一个新的索引文件;
  • 7、启动应用程序,查看跟踪数据是否已经持久化到elasticsearch的索引中;
  • 8、然后重启skywalking,验证跟踪数据会不会丢失;

七 、Skywalking跨多个微服务跟踪

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

-javaagent:D:/dev/apache-skywalking-apm-bin/agent/skywalking-agent.jar

SW_AGENT_COLLECTOR_BACKEND_SERVICES=127.0.0.1:11800;SW_AGENT_NAME=springboot-idea

八、自定义SkyWalking链路追踪

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

1、添加依赖;

<!-- SkyWalking 工具类 -->
<dependency>
    <groupId>org.apache.skywalking</groupId>
    <artifactId>apm-toolkit-trace</artifactId>
    <version>8.1.0</version>
</dependency>

2、在业务代码中使用如下方法:

TraceContext.putCorrelation("myKey", "myValue");
Optional<String> op = TraceContext.getCorrelation("myKey");
log.info("myValue = {} ", op.get());

String traceId = TraceContext.traceId();
log.info("traceId = {} ", traceId);

这样就可以拿到跟踪的traceId,便于根据traceId去ui界面搜索整个跟踪链路;
另外如果一个业务方法想在ui界面的跟踪链路上显示出来,只需要在业务方法上加上@Trace注解即可;

九、Skywalking集成日志框架

1、添加如下依赖;

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

2、添加logback-spring.xml文件(参见git代码);

3、在代码中记录日志:

log.info(“/goods --> getAllGoods --> …” );

4、访问controller测试,查看日志输出,就可以在日志中看到跟踪的traceId;

你可能感兴趣的:(04_分布式专题,spring,cloud,分布式,skywalking)