链路追踪组件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写入不了,下次得注意了

  • 3
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值