1、下载SkyWalking APM
1.手动下载
Downloads | Apache SkyWalkinghttps://skywalking.apache.org/downloads/
2.链接下载
https://dlcdn.apache.org/skywalking/10.2.0/apache-skywalking-apm-10.2.0.tar.gzhttps://dlcdn.apache.org/skywalking/10.2.0/apache-skywalking-apm-10.2.0.tar.gz
2、解压压缩包
随便上传到服务器某个路径,自己找得到就行
cd /www/wwwroot/skywalking
tar -zxvf apache-skywalking-apm-10.2.0.tar.gz
查看bin目录下的文件
cd /www/wwwroot/skywalking/apache-skywalking-apm-bin/bin
一般来说linux启动应用的都是
./startup.sh
3、修改配置文件
1.修改webapp配置
进入webapp目录下修改端口
http://IP+:12800
2.修改skywalking服务配置
进入config目录下修改一些配置
观察到服务注册这里,默认走的单机模式,下面还有zookeeper、nacos等注册中心,加入需要切换调整上面配置即可,这里我选的默认。
假设你需要使用nacos作为配置中心,可以按下述描述进行修改配置
cluster:selector: ${SW_CLUSTER:nacos} # 设置为 nacosnacos:serviceName: ${SW_SERVICE_NAME:"SkyWalking_OAP_Cluster"} # 注册的服务名称hostPort: ${SW_CLUSTER_NACOS_HOST_PORT:localhost:8848} # Nacos 地址namespace: ${SW_CLUSTER_NACOS_NAMESPACE:"public"} # Nacos 命名空间contextPath: ${SW_CLUSTER_NACOS_CONTEXT_PATH:""} # Nacos 上下文路径(可选)username: ${SW_CLUSTER_NACOS_USERNAME:""} # Nacos 用户名(如果启用了认证)password: ${SW_CLUSTER_NACOS_PASSWORD:""} # Nacos 密码(如果启用了认证)accessKey: ${SW_CLUSTER_NACOS_ACCESSKEY:""} # Nacos 访问密钥(可选)secretKey: ${SW_CLUSTER_NACOS_SECRETKEY:""} # Nacos 秘钥(可选)internalComHost: ${SW_CLUSTER_INTERNAL_COM_HOST:""} # 内部通信主机(可选)internalComPort: ${SW_CLUSTER_INTERNAL_COM_PORT:-1} # 内部通信端口(可选)
配置存储数据库:
这里的解释我用AI给大家解释一下:
默认是这个banyandb,但是实际上我们使用ES比较多,关于如何使用ES进行配置如下:
如果想要学习怎么docker部署ES,可以看我下面的博客:
Springboot中使用Elasticsearch(部署+使用+讲解 最完整)_spring boot elasticsearch-CSDN博客文章浏览阅读8k次,点赞34次,收藏72次。最完整最详细的springboot中使用es,在前面有服务器部署es相关的东西,在后面有使用java的实战,对于实战的方法使用结合官网深度去研究和讲解。在这篇文章前面是实战,后面是具体讲解~~~如果只想实战就只看一和二,深入了解就继续看,在未来还会继续更新对这个实战,还有es技术的更新,几万字大长文。_spring boot elasticsearchhttps://blog.csdn.net/qq_73440769/article/details/141477177?spm=1001.2014.3001.5502修改 SkyWalking 配置文件:
storage:selector: ${SW_STORAGE:elasticsearch} # 设置为 elasticsearchelasticsearch:namespace: ${SW_NAMESPACE:""} # 命名空间(可选)clusterNodes: ${SW_STORAGE_ES_CLUSTER_NODES:localhost:9200} # Elasticsearch 地址protocol: ${SW_STORAGE_ES_HTTP_PROTOCOL:"http"} # 协议,默认为 httpconnectTimeout: ${SW_STORAGE_ES_CONNECT_TIMEOUT:3000} # 连接超时时间(毫秒)socketTimeout: ${SW_STORAGE_ES_SOCKET_TIMEOUT:30000} # 套接字超时时间(毫秒)responseTimeout: ${SW_STORAGE_ES_RESPONSE_TIMEOUT:15000} # 响应超时时间(毫秒)numHttpClientThread: ${SW_STORAGE_ES_NUM_HTTP_CLIENT_THREAD:0} # HTTP 客户端线程数(默认为 0)user: ${SW_ES_USER:""} # 用户名(如果启用了认证)password: ${SW_ES_PASSWORD:""} # 密码(如果启用了认证)dayStep: ${SW_STORAGE_DAY_STEP:1} # 每个索引的时间跨度(天)indexShardsNumber: ${SW_STORAGE_ES_INDEX_SHARDS_NUMBER:1} # 每个索引的分片数indexReplicasNumber: ${SW_STORAGE_ES_INDEX_REPLICAS_NUMBER:1} # 每个索引的副本数
查看ES状态是否正常:
ES部署的服务器IP+:9200
4、启动skywalking
1.开放端口
在一开始我只开启IPv4的端口的时候是没问题的,但是后来重启服务器发现报了下面的错误
2025-03-31 14:18:11,350 - com.linecorp.armeria.common.Flags - 1738 [main] INFO [] - verboseExceptions: rate-limit=10 (default)
2025-03-31 14:18:11,521 - com.linecorp.armeria.common.Flags - 1738 [main] INFO [] - useEpoll: true (default)
2025-03-31 14:18:11,560 - com.linecorp.armeria.common.Flags - 1738 [main] INFO [] - annotatedServiceExceptionVerbosity: unhandled (default)
2025-03-31 14:18:12,394 - com.linecorp.armeria.common.Flags - 635 [main] INFO [] - Using Tls engine: OpenSSL BoringSSL, 0x1010107f
2025-03-31 14:18:12,551 - com.linecorp.armeria.common.util.SystemInfo - 525 [main] INFO [] - IPv6: disabled (no IPv6 network interface)
找了很久bug后,我思索我也没开IPv6啊,唯一想到的就是自己监控的服务器部署了小程序,小程序使用的可能是IPv6,索性不继续找配置文件的bug了,向困难低头,我就多开个IPv6的端口,结果问题真就解决了:
2.配置java环境
建议先配置环境再启动
如果启动出现:
下面提供两种配置方式,选择一个即可,建议第二个,如果已经配置了全局java环境可以忽略这一步。
(1)修改配置文件,指定jdk目录
替换这两个为你jdk的目录
(2)配置Java的home位置
添加这些配置,根据你的jdk位置为准
export JAVA_HOME=/www/server/java/jdk-17.0.8/
export JRE_HOME=$JAVA_HOME/jre
export CLASSPATH=$JAVA_HOME/lib:$JRE_HOME/lib:$CLASSPATH
export PATH=$JAVA_HOME/bin:$JRE_HOME/bin:$PATH
如果不配置会出现这两个错误
启动后可以查看日志文件:
参考如下AI解释:
3.启动服务
cd /www/wwwroot/skywalking/apache-skywalking-apm-bin/bin
./startup.sh
查看日志:
查看有无报错,没有报错就是启动成功
访问:IP+:8902
5、如何关闭服务
个人觉得,应该也可以写个stop.sh进行自己关闭,不过需要自己去编写配置文件
分别关掉这两个进程,注意PID根据实际的选择
sudo lsof -i :8902
sudo lsof -i :12800
kill -9 +PID
6、Skywalking-agent代理Java服务
1.下载Skywalking-agent
Downloads | Apache SkyWalkinghttps://skywalking.apache.org/downloads/
2.下载后解压进服务器
cd /www/wwwroot/skywalking
tar -zxvf apache-skywalking-java-agent-9.4.0.tgz
3.修改代理配置 agent.config
可以通过ctrl+F定位到这两个配置:
agent.service_name
collector.backend_service
修改服务名称
我会起有具体意义的名称
4.准备java服务
这个就是我自己的jar服务,进行配置代理检测
nohup /www/server/java/jdk-17.0.8/bin/java \-Xmx1024M \-Xms256M \-javaagent:/www/wwwroot/skywalking/skywalking-agent/skywalking-agent.jar \-DSW_SERVICE_NAME=quick-server \-jar /www/wwwroot/quick_pickup_java/quick-server-0.0.1-SNAPSHOT.jar \> /www/wwwroot/quick_pickup_java/app.log 2>&1 &
或者在启动命令中添加:
/www/server/java/jdk-17.0.8/bin/java \-Xmx1024M \-Xms256M \-javaagent:/www/wwwroot/skywalking/skywalking-agent/skywalking-agent.jar \-DSW_SERVICE_NAME=quick-server \-jar /www/wwwroot/quick_pickup_java/quick-server-0.0.1-SNAPSHOT.jar
AI解释:
5.启动Java服务
启动服务后出现:
至此完成部署。
7、UI使用教程
大家可以查看官方中文文档的这个UI介绍,我觉得这里讲的很详细:
https://github.com/SkyAPM/document-cn-translation-of-skywalking/blob/master/docs/zh/8.0.0/ui/README.mdhttps://github.com/SkyAPM/document-cn-translation-of-skywalking/blob/master/docs/zh/8.0.0/ui/README.md
9、SpingBoot代码中自定义追踪
1.为什么
比如说我要追踪这个接口:
这里我就可以进行一个链路的追踪,可以看到这个接口的一些链路信息,但是我如果想要看到这个方法里面的一些具体的信息,结果可以看到
发现系统中是默认不会链路追踪代码里面的一些业务信息,所以这里就需要我们在后端代码中加一些配置信息进行自定义追踪接口的信息。
2.引入依赖
大家可以去选择自己喜欢的版本:
https://mvnrepository.com/artifact/org.apache.skywalking/apm-toolkit-trace/9.4.0https://mvnrepository.com/artifact/org.apache.skywalking/apm-toolkit-trace/9.4.0
<!-- https://mvnrepository.com/artifact/org.apache.skywalking/apm-toolkit-trace -->
<dependency><groupId>org.apache.skywalking</groupId><artifactId>apm-toolkit-trace</artifactId><version>9.4.0</version>
</dependency>
3.选择链路的接口
4.部署服务器观察
出现我们刚刚定义的链路名称,不过点击可以发现
5.对查看链路的内容添加注解和 API进行增强
@Trace(operationName="user-store-getByClassification")@Tags({@Tag(key = "classificationId", value = "arg[0]") // 动态获取 classificationId})@Overridepublic List<StoreVO> selectByClassification(Long classificationId) {String key = RedisConstant.STORE_CLASSIFICATION_ + classificationId;try {// 查询 Redis 中是否存在店铺数据List<StoreVO> storeVOList = (List<StoreVO>) redisTemplate.opsForValue().get(key);if (storeVOList != null && !storeVOList.isEmpty()) {log.info("从 Redis 中获取店铺数据");ActiveSpan.tag("result", "Redis hit"); // 记录 Redis 命中return storeVOList;}// 查询数据库storeVOList = iStoreService.getByClassification(classificationId);if (storeVOList == null || storeVOList.isEmpty()) {// 防止缓存穿透List<StoreVO> cacheThoughtStoreVOList = getCacheThoughtStoreVOList();redisTemplate.opsForValue().set(key, cacheThoughtStoreVOList, 5L, TimeUnit.MINUTES);ActiveSpan.tag("result", "Cache penetration prevention"); // 记录缓存穿透return cacheThoughtStoreVOList;}// 将查询结果存储到 Redis 中redisTemplate.opsForValue().set(key, storeVOList);ActiveSpan.tag("result", "DB query success"); // 记录数据库查询成功return storeVOList;} catch (Exception e) {// 记录错误信息到链路中ActiveSpan.error(e); // 记录异常ActiveSpan.tag("error", e.getMessage()); // 自定义错误标签log.error("查询店铺数据失败,分类ID: {}, 错误信息: {}", classificationId, e.getMessage(), e);throw new StoreException("根据店铺类型分类id查询店铺接口出错");}}
关键点解析
1. @Trace
注解
@Trace(operationName = "user-store-getByClassification")
定义了链路操作名称。- 这会使该方法成为一个独立的 Trace 节点,SkyWalking 会自动记录该方法的执行时间。
2. @Tags
和 @Tag
注解
- 使用
@Tags
和@Tag
注解可以动态地将方法参数或返回值绑定到链路中。 - 在这个例子中:
@Tag(key = "userId", value = "arg[0]")
动态获取方法的第一个参数(即userId
)。@Tag(key = "classificationId", value = "arg[1]")
动态获取方法的第二个参数(即classificationId
)。
3. ActiveSpan
API
ActiveSpan
是 SkyWalking 提供的一个工具类,用于在运行时动态向链路中添加标签或记录错误。- 常用方法:
ActiveSpan.tag(String key, String value)
:添加自定义标签。ActiveSpan.error(Throwable throwable)
:记录异常信息。ActiveSpan.error()
:标记当前 Span 为错误状态。
4. 记录 Redis 和数据库查询结果
- 使用
ActiveSpan.tag("result", "xxx")
记录 Redis 命中、缓存穿透、数据库查询成功等信息。 - 这些标签可以帮助你在 SkyWalking UI 中快速定位问题。
5. 异常处理
- 捕获异常后,调用
ActiveSpan.error(e)
和ActiveSpan.tag("error", e.getMessage())
将错误信息记录到链路中。 - 同时,打印日志以便进一步排查问题。
6.线上测试
说到这个线上测试,其实还是我错误的在一个未拦截用户线程的接口里面用线程TreadLocal去获取用户ID用来测试自己写的SkyWalkinh能不能输出日志,在上面案例可以看到我用到的用户的ID来放在下面这个地方:
线上事故链路如下:
修改完成后,发现这些具体的属性都有了:
9、参考
参考这些大佬的文章:
分布式监控Skywalking安装及使用教程(保姆级教程)-CSDN博客文章浏览阅读8.9k次,点赞47次,收藏91次。本文主要讲解分布式链路追踪监控系统Skywalking的安装及使用教程,从0到1,图文并茂的保姆级教程。SkyWalking是一款用于分布式系统跟踪和性能监控的开源工具。它可以帮助开发人员了解分布式系统中不同组件之间的调用关系和性能指标,从而进行故障排查和性能优化。它支持多种语言和框架,包括Java、.NET、Node.js等。它通过在应用程序中插入代理或使用特定的SDK来收集跟踪数据,并将这些数据发送到SkyWalking服务器进行分析和展示。分布式跟踪。_skywalking安装https://blog.csdn.net/chang_mao/article/details/135998660?spm=1001.2014.3001.5502
【第二十二篇】商城系统-Skywalking链路追踪【商城系统完结篇】-腾讯云开发者社区-腾讯云 Skywalking是由国内开源爱好者吴晟开源并提交到Apache孵化器的产品,它同时吸收了Zipkin /Pinpoint /CAT 的设计思路。特点是:支持多种插件,UI功能较强,支持非侵入式埋点。目前使用厂商最多,版本更新较快。https://cloud.tencent.com/developer/article/2135248?policyId=1003
SkyWalking入门搭建【apache-skywalking-apm-10.0.0】_skywalking10.0.0版本部署-CSDN博客文章浏览阅读3.4k次,点赞27次,收藏38次。SkyWalking在Java中使用的是字节方式植入,是完全无代码侵入的VM options 添加,就是刚刚上面下的 java-agentEnvironment variables 添加,指定 SkyWalking的地址效果图操作步骤(idea 2023,其它版本百度操作)配置好后,启动服务会看到下面的日志,就说明 java-agent.jar 读取到了随机访问几下服务的接口,再去刷新SkyWalking 控制台,就可以看到了。_skywalking10.0.0版本部署https://blog.csdn.net/Tomwildboar/article/details/140589444