SkyWalking是一个开源的可观察性平台,用于收集,分析,聚合和可视化来自本地或者云服务中的数据。即使在整个云环境中,SkyWalking也能提供一种简便的方法来维护您的分布式系统的清晰视图。它是一个现代的APM(Application Performance Monitor 应用性能监测软件),专门为基于云、容器的分布式系统而设计。
为什么要选择skywalking?
SkyWalking提供了用于在许多不同情况下观察和监视分布式系统的解决方案,并通过agent方式,做到高性能、低损耗、无侵入性,与类似的功能组件如:Zipkin、Pinpoint、CAT相比,skywalking无论是从性能还是社区活跃度方面考虑,都具有一定的优势。
skywalking监控维度
skywalking从三个维度提供可观察项功能,分别是:服务,服务实例,端点
服务:表示一组/一组工作负载,这些工作负载为传入请求提供相同的行为。
服务实例:服务组中的每个单独工作负载都称为实例。像pods在Kubernetes中一样,它不必是单个OS进程,但是,如果您使用agent代理,则实例实际上是一个真正的OS进程。
端点:服务中用于传入请求的路径,例如HTTP URI路径或gRPC服务类+方法签名。
skywalking架构
从逻辑上看,skywalking分为四个部分:探针,平台后端,存储和UI。
![](/2024/102994c0ea/image-20250122181242011.png)
探针:收集数据并重新格式化以符合SkyWalking的要求(不同的探针支持不同的来源)。
平台后端:支持数据聚合,分析和流处理,涵盖跟踪,指标和日志。
存储:设备通过开放/可插入的界面存储SkyWalking数据。您可以选择现有的实现,例如ElasticSearch,H2,MySQL,TiDB,InfluxDB,或者实现自己的实现。
UI:是一个高度可定制的基于Web的界面,允许SkyWalking最终用户可视化和管理SkyWalking数据。
skywalking安装
docker-compose部署
版本
名称 | 版本 |
---|---|
skywalking-oap-server | 8.9.1 |
skywalking-ui | 8.9.1 |
elasticsearch | 7.14.2 |
java-agent | 8.8.0 |
skywalking单机部署
docker-compose.yml
1 | version: '3.3' |
执行命令
1 | docker-compose up -d |
等待大约2~3min,在浏览器中输入一下地址进行访问:
1 | http://10.168.2.126:8080/ |
![](/2024/102994c0ea/image-20250122181532058.png)
skywalking使用
agent目录简介
![](/2024/102994c0ea/image-20250122181611418.png)
如果想要使用可选插件将其复制到plugins目录即可【需要重启应用程序生效】,不想用只需在plugins目录中将插件删除【需要重启应用后生效】,gateway服务需要使用单独的agent,把optional-plugins目录里的apm-spring-cloud-gateway-3.x-plugin-8.8.0.jar复制到plugins目录里。
把服务引到k8s集群使用
skywalking.yml:
1 | apiVersion: v1 |
创建ep和svc
1 | kubectl apply -f skywalking.yml |
idea 配置
在VM参数中增加如下配置
1 | "-javaagent:/app/skywalking-agent/skywalking-agent.jar", "-Dskywalking.agent.service_name=qifu-saas-bc-test", "-Dskywalking.collector.backend_service=oap.qifu.svc:11800", |
java -jar配置
1 | java "-javaagent:/app/skywalking-agent/skywalking-agent.jar", "-Dskywalking.agent.service_name=qifu-saas-bc-test", "-Dskywalking.collector.backend_service=oap.qifu.svc:11800", -jar SpringBoot-0.0.1-SNAPSHOT.jar |
注意:javaagent 需配置在 -jar前面
详细使用请看官网介绍:java-agent使用教程
一切准备就绪后,启动项目
1)仪表盘
![](/2024/102994c0ea/image-20250122182206277.png)
可以APM 处看见当前服务
注意:
如果此处没有出现服务,可以尝试访问项目中的任意接口或者多刷新几次页面)
如果还是没有可以查看agent目录下的日志看是否存在报错访问项目中任意接口
2)拓扑图
![](/2024/102994c0ea/image-20250122182404461.png)
点击服务本身可以展示各种指标
![](/2024/102994c0ea/image-20250122182421224.png)
3)追踪
![](/2024/102994c0ea/image-20250122182454394.png)
可以在此处看见刚刚访问的接口以及耗时情况(如果此时搜索不出来,需注意时间范围是否正确)
4)性能剖析
如果在追踪中发现了访问异常慢的接口可以通过性能剖析对其进行分析
操作步骤
- 新建任务
- 选择服务(如果此处未出现服务名称选择,需要刷新时间)
- 配置端点名称(注意此处最好是从追踪里面获取端点名称,需要加上请求方式,此处还有一点需要注意的是,接口的请求路径是全路径,需要加上项目的contex-path才行)
- 设置监控时间
- 采样数
点击新建任务请求配置的接口
出现如下页面(如果Sampled Traces未出现注意刷新时间【这是skywalking唯一一个不友好的地方,不管访问任务页面都要注意时间的影响】)
![](/2024/102994c0ea/image-20250122182541520.png)
点击分析按钮出现堆栈信息
![](/2024/102994c0ea/image-20250122182558000.png)
可以看见耗时最下最长的信息。
5)日志采集
日志采集需要配合TraceId一起做,有一定的侵入性
在项目中引入jar包
注意此处由于我使用的日志框架是logback,如果使用其他日志框架需引入对应的jar包
目前支持的日志框架有:log4j、log4j2和 logback。
1 | <dependency> |
日志数据格式化
1 | <!--日志文件输出格式--> |
日志采集
1 | <!-- skywalking日志收集 --> |
完整配置文件
logback-spring.xml
1 |
|
待一切配置好后(重启项目)需要等待3~5min就可以看见日志信息了
![](/2024/102994c0ea/image-20250122182751411.png)
注意时间范围
TraceId获取
配置了一个全局异常处理器,如果发生异常则返回TraceId,然后用该TraceId去查找相应的日志与链路信息
1 | @ExceptionHandler(value = Exception.class) |
定位链路
![](/2024/102994c0ea/image-20250122182820096.png)
点击相关日志进入日志详情
![](/2024/102994c0ea/image-20250122182835574.png)
注意:日志的上传需要时间,不能立马获取到实时日志
k8s部署skywalking
Elasticsearch 部署
Skywalking OAP Server
会将数据存储到 Elasticsearch 中,并通过 Elasticsearch 进行数据查询和分析,这里直接使用已经部署好的es集群。
数据初始化Job(init-job.yaml)
1 | apiVersion: batch/v1 |
部署OAP Server
rbac.yaml
1 | apiVersion: v1 |
dp.yaml
1 | apiVersion: apps/v1 |
svc.yaml
1 | apiVersion: v1 |
按以下顺序执行:
1 | kubectl apply -f rbac.yaml |
注意,需要等init-job.yaml执行成功之后再执行dp.yaml,否则启动oap服务的时候会报错:table: alarm_record does not exist. OAP is running in ‘no-init’ mode, waiting… retry 3s later.
init-job.yaml执行成功如图所示:
![](/2024/102994c0ea/image-20250122183238795.png)
![](/2024/102994c0ea/image-20250122183253352.png)
(k8s集群重启后可能还会出现报错table: alarm_record does not exist. OAP is running in ‘no-init’ mode, waiting… retry 3s later.,把skywalking-es-init的job删掉再重新kubectl apply -f init-job.yaml,初始化成功后再启动oap就行)
部署UI
ui-dp.yaml
1 |
|
ui-svc.yaml
1 | apiVersion: v1 |
ing.yaml
1 | apiVersion: networking.k8s.io/v1 |
skywalking的ui界面默认没有访问控制,可以通过下面基于方案,实现自定义服务的外部验证:
安装httpd-tools:
1 | yum install -y httpd-tools |
输入密码:
1 | htpasswd -c auth admin |
生成文件auth,利用此文件进行创建secret
1 | kubectl -n skywalking create secret generic skywalking-auth --from-file=auth |
这里有个坑,经过测试,在创建secret之前通过htpasswd工具生成的记录用户名密码的文件的文件名,必须叫auth,不然经过后续的一顿操作,最终访问的结果会报503 Service Temporarily Unavailable,这与传统方式配置nginx的basic auth是不同的,可能在源码中将此参数硬编码了,具体原因没有深究。
部署服务:
1 | kubectl apply -f ui-dp.yaml |
把skywalking.keyfil.com域名解析到对应的ingress-nginx后,访问skywalking的UI界面就行:
![](/2024/102994c0ea/image-20250122183433303.png)