分布式链路跟踪是分布式系统的应用程序性能监视工具,专为微服务、云原生架构和基于容器(Docker、K8s)架构而设计;
也就是说Skywalking是用于微服务的“跟踪" ;
对于一个大型的几十个、几百个微服务构成的微服务架构系统,通常会遇到下面一些问题,比如:
如何串联整个调用链路,快速定位问题?
如何理清各个微服务之间的依赖关系?
如何进行各个微服务接口的性能分折?
如何跟踪整个业务流程的调用处理顺序?
Skywalking提供分布式追踪、服务网格遥测分析、度量聚合和可视化一体化解决方案;
Skywalking是国人采用Java开发的,现在已经是apache下的一个等级项目
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
负责从应用中,收集链路信息,发送给 SkyWalking OAP 服务器;
负责接收Agent发送的Tracing数据信息,然后进行分析(Analysis Core),存储到外部存储器(Storage),最终提供查询(Query)功能;
Tracing数据存储,目前支持ES、MySQL、Sharding Sphere、TiDB、H2多种存储器,目前采用较多的是ES,主要考虑是SkyWalking开发团队自己的生产环境采用ES为主;
负责提供控台,查看链路等等;
1,下载 SkyWalking 软件包;
2,搭建一个 SkyWalking OAP 和SkyWalking UI服务;
3,启动一个Spring Boot应用,并配置SkyWalking Agent;
数据存储暂时先使用它默认的H2数据库存储。
对于 SkyWalking 的软件包,有两种方式获取:
手动编译
官方包
一般情况下,我们建议使用官方包,手动编译也可以;
从这里下载:http://skywalking.apache.org/downloads/
解压:tar -zxvf apache-skywalking-apm-8.1.0.tar.gz
解压后即完成了安装,不需要做其他操作;
切换:cd apache-skywalking-apm-bin
目录说明:
agent #SkyWalking Agent
bin #执行脚本
config #SkyWalking OAP Server 配置文件
LICENSE
licenses
NOTICE
oap-libs #SkyWalking OAP Server
README.txt
tools
webapp #SkyWalking UI
切换到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服务来获得;
页面的右下角可以中英文切换,可以切换选择要展示的时间区间的跟踪数据;
准备一个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 界面查看跟踪情况,由于上传数据是异步的,访问完项目后,可能需要等几秒才能看到跟踪数据;
表示对请求提供相同行为的一系列或一组工作负载,在使用Agent时,可以定义服务的名字,我们可以看到 Spring Boot 应用服务为 “springboot”,就是我们在环境变量 SW_AGENT_NAME 中所定义的;
上述的一组工作负载中的每一个工作负载称为一个实例, 一个服务实例实际就是操作系统上的一个真实进程;
这里我们可以看到 Spring Boot 应用的服务为 {agent_name}-pid:{pid}@{hostname},由 Agent 自动生成;
对于特定服务所接收的请求路径, 如HTTP的URI路径和gRPC服务的类名 + 方法签名;
我们可以看到 Spring Boot 应用的一个端点,为API接口 /index;
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文件中的某一条规则就会触发告警;
SkyWalking告警Webhook回调要求接收方是一个Web容器(比如tomcat服务),告警的消息会通过HTTP请求进行发送, 请求方法为POST, Content-Type为application/json, JSON格式基于
List
的集合对象数据, 集合中的每个AlarmMessage包含以下信息:
Skywalking跟踪数据默认是存放在内嵌式数据库H2中的,重启skywalking,跟踪数据就丢失了,我们可以把跟踪数据持久化到mysql或者elasticsearch中,上一次课我们介绍了如何将跟踪数据持久化到mysql,此次我们介绍一些如何将跟踪数据持久化到elasticsearch中;
需要解压另一个专门针对elasticsearch版本的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 工具类 -->
<dependency>
<groupId>org.apache.skywalking</groupId>
<artifactId>apm-toolkit-trace</artifactId>
<version>8.1.0</version>
</dependency>
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注解即可;
<!-- apm-toolkit-logback-1.x -->
<dependency>
<groupId>org.apache.skywalking</groupId>
<artifactId>apm-toolkit-logback-1.x</artifactId>
<version>8.1.0</version>
</dependency>
log.info(“/goods --> getAllGoods --> …” );