链路追踪组件Skywalking使用
前言
Skywalking是一个国产开源框架,2015年由吴晟开源 , 2017年加入Apache孵化器,其用于追踪多微服务模块调用之间日志的追踪,协助程序员进行排除问题
Skywalking架构
Skywalking架构图大概如下
SkyWalking OAP: SkyWalking分析监控平台
SkyWalking UI :展示数据
这也是监控平台的核心链路
收集数据->分析数据->保存数据->展示数据-> 监控报警
SkyWalking使用
下载
下载地址:https://skywalking.apache.org/downloads/
0.9.0版本的OAP
8.8.0的agent插件
OAP安装
首先,上传到linux服务器上,如下
解压
tar -zxvf apache-skywalking-apm-9.0.0.tar.gz
查看bin目录下的文件,如下
oapService.sh:只启动oap服务
webappService.sh:只启动ui服务
startup.sh:同时启动oap和ui
刚开始我们肯定是两个一起启动的
/opt/apache-skywalking-apm-bin/config/application.yml文件为oap的配置文件,默认使用的是h2的数据源进行存储数据,它是一个基于内存的数据库,我们先使用这个默认的,如下
/opt/apache-skywalking-apm-bin/webapp/webapp.yml为ui的配置文件,如下
接下来我们启动一下启动命令为./bin/startup.sh,启动日志在如下位置:
查看 cat logs/skywalking-oap-server.log日志,如下
11800端口用于接收来自Java应用数据采集的传输
12800端口用于给UI获取数据展示使用的
然后我们访问一下ui的接口,地址为:http://192.168.0.90:8080/, 看到以下内容就是成功了,如下
到这里oap和ui服务就弄好了,接下来我准备了一个springboot项目,用于测试接入情况,你可以使用我的,也可以自己写,我的项目地址如下
SkyWalking Agent追踪项目
应用接入oap
首先解压上面下面的apache-skywalking-java-agent-8.10.0.tgz,如下
配置方式启动
通过jar包方式接入
#!/bin/sh
# SkyWalking Agent配置
export SW_AGENT_NAME=zxc-skywalking #Agent名字,一般使用`spring.application.name`
export SW_AGENT_COLLECTOR_BACKEND_SERVICES=192.168.0.90:11800 #配置 Collector 地址
export SW_AGENT_SPAN_LIMIT=2000 #配置链路的最大Span数量,默认为 300。
export JAVA_AGENT=-javaagent:E:\linuxSoft\skywalking-agent\skywalking-agent.jar
java $JAVA_AGENT -jar skywalking.jar #jar启动
通过jvm参数指定
java -javaagent:E:\linuxSoft\skywalking-agent\skywalking-agent.jar
-DSW_AGENT_COLLECTOR_BACKEND_SERVICES=192.168.0.90:11800
-DSW_AGENT_NAME=zxc-skywalking -jar skywalking.jar
skywalking配置方式
java -javaagent:E:\linuxSoft\skywalking-agent\skywalking-agent.jar
-Dskywalking.agent.service_name=zxc-skywalking
-Dskywalking.collector.backend_service=192.168.90.0:11800
在IDEA中使用Skywalking
在本地打开项目中添加如下jvm参数
-javaagent:E:\linuxSoft\skywalking-agent\skywalking-agent.jar
-DSW_AGENT_COLLECTOR_BACKEND_SERVICES=192.168.0.90:11800
-DSW_AGENT_NAME=zxc-skywalking
配置完如下,图片
然后启动程序,再到SkyWalking,如下
启动程序,如下出现了Skywalking相关的日志
这个时候再到oap上查看http://192.168.0.90:8080/general,如下
服务就已经出来
查看追踪日志
此时点击如下Trace模块,没有任何日志,如下
接下来我访问一下我本地的项目,http://localhost:8081/user/get/?id=1,访问完以后再看刷新,如下
整个链路就出来了,到此我们的配置就成功了,同时可以看到如下的访问层次
我的项目是先走了web,然后同时调用了redis和mysql,都能检测到
Skywalking告警通知
Skywalkingn默认提供了告警配置,在config/alarm-settings.yml文件中,内容如下
为了方便,skywalking发行版中提供了默认的alarm-setting.yml文件,包括一些规则,每个规则有英文注释,可以根据注释得知每个规则的作用:
在最近10分钟的3分钟内服务平均响应时间超过1000ms
最近10分钟内,服务成功率在2分钟内低于80%
那么我模拟一下在最近10分钟的3分钟内服务平均响应时间超过1000ms这种情况
模拟告警
我写了如下的方法
@GetMapping("/sleep")
public User sleep(@RequestParam("id") Integer id) throws Exception{
//模拟超时
Thread.sleep(2000);
return userService.getUser(id);
}
同时我在alarm-setting.yml配置了告警回调接口,如下
但是我在windows里面请求是无效的,所以我要先把项目放到Linux中跑起来,然后在请求,同时javaagent也要上传上去,如下
启动命令为
java -javaagent:/opt/skywalking-agent/skywalking-agent.jar -DSW_AGENT_COLLECTOR_BACKEND_SERVICES=192.168.0.90:11800 -DSW_AGENT_NAME=zxc-skywalking -jar skywalking-0.0.1-SNAPSHOT.jar
注意刚开始告警这里是空的
然后我们再访问休眠的那个方法,多访问几次,地址:http://192.168.0.90:8081/user/sleep/?id=1
然后你要等一定的时间才会触发这个规则,你可以先喝下水之类的,回头再回来看
看看他告警通知的回调数据,如下
这一串是skywalking通过我配置的接口返回给我的
[{
scopeId = 2,
scope = SERVICE_INSTANCE,
name = 7958 f824172946fab9064e9a7947b24c @192 .168 .0 .90 of zxc - skywalking,
id0 = enhjLXNreXdhbGtpbmc = .1 _Nzk1OGY4MjQxNzI5NDZmYWI5MDY0ZTlhNzk0N2IyNGNAMTkyLjE2OC4wLjkw,
id1 = ,
ruleName = service_instance_resp_time_rule,
alarmMessage = Response time of service instance 7958 f824172946fab9064e9a7947b24c @192 .168 .0 .90 of zxc - skywalking is more than 1000 ms in 2 minutes of last 10 minutes,
tags = [],
startTime = 1673969358452
}, {
scopeId = 1,
scope = SERVICE,
name = zxc - skywalking,
id0 = enhjLXNreXdhbGtpbmc = .1,
id1 = ,
ruleName = service_sla_rule,
alarmMessage = Successful rate of service zxc - skywalking is lower than 80 % in 2 minutes of last 10 minutes,
tags = [],
startTime = 1673969358452
}, {
scopeId = 6,
scope = ENDPOINT_RELATION,
name = User in User to GET: /user/sleep in zxc - skywalking,
id0 = VXNlcg == .0 _VXNlcg == ,
id1 = enhjLXNreXdhbGtpbmc = .1 _R0VUOi91c2VyL3NsZWVw,
ruleName = endpoint_relation_resp_time_rule,
alarmMessage = Response time of endpoint relation User in User to GET: /user/sleep in zxc - skywalking is more than 1000 ms in 2 minutes of last 10 minutes,
tags = [],
startTime = 1673969358453
}]
zxc-skywalking is more than 1000ms in 2 minutes of last 10 minutes
name=User in User to GET:/user/sleep in zxc-skywalking
数据存储源修改
还记得上面说到的文件吗,也就是config/application.yml文件中可以配置多个存储源,我们上面配置的是h2,重启数据就丢失了,但是我们也可以配置到其他数据源中,如下
存储到ElastciSearch中
首先,要安装ElastciSearch,参考我之前的文章
https://blog.csdn.net/zxc_user/article/details/128666834
然后修改config/application.yml文件
storage:
selector: ${SW_STORAGE:elasticsearch} #指定使用elasticsearch存储数据
elasticsearch:
namespace: ${SW_NAMESPACE:"zxc-skywalking-"} #生成zxc-skywalking-前缀的索引
clusterNodes: ${SW_STORAGE_ES_CLUSTER_NODES:192.168.0.90:9200} #elasticsearch服务器地址
注,如果你的es没有开启加密,那么这些要注释掉
#user: ${SW_ES_USER:""}
#password: ${SW_ES_PASSWORD:""}
然后,我又是在本地访问了路径,http://127.0.0.1:8081/user/get/?id=1
访问完查看SkyWalking日志,如下
我们再使用Kibana进行查看,如下
内存不足
因为我是在虚拟机测试的,所以elasticsearch只给了1g,所以skywalking在同步的时候出错了,如果你也是出这个错,可以试试把elasticsearch内存调大点...
flush data to ES failure:
java.util.concurrent.CompletionException: com.linecorp.armeria.client.ResponseTimeoutException
at java.util.concurrent.CompletableFuture.encodeThrowable(CompletableFuture.java:292) ~[?:1.8.0_281]
总结
到这里就结束了,搭建过程中遇到的一个问题就是elasticsearch内存不够引起skywalking写入不了,下次得注意了