2025-skywalking组件
历史版本下载地址:Apache Archive Distribution Directory
官网:Apache SkyWalking
目录
. webapp: UI前端(web 监控页面)的jar包和配置文件;
. oap-libs:后台应用的jar包,以及它的依赖jar包,里边有一个server-starter-*.jar就是启动程序;. config:启动后台应用程序的配置文件,是使用的各种配置
. bin:各种启动脚本,一般使用脚本startup.*来启动web页面和对应的后台应用;
. oapService.*:默认使用的后台程序的启动脚本;(使用的是默认模式启动,还支持其他模式,各模式区别见启动模式)
. oapServicelnit.*:使用init模式启动;在此模式下,OAP服务器启动以执行初始化工作,然后退出
. oapServiceNolnit.*:使用no init模式启动;在此模式下,OAP服务器不进行初始化。
. webappService.*: UI前端的启动脚本;
. startup.*:组合脚本,同时启动oapService.*:、webappService.*脚本;
修改端口: apache-skywalking-apm-es7-8.5.0\apache-skywalking-apm-bin-es7\webapp
启动
启动两个窗口 成功
启动成功后会启动两个服务,一个是skywalking-oap-server,一个是skywalking-web-ui
skywalking-oap-server服务启动后会暴露11800 和 12800 两个端口,分别为收集监控数据的端口11800和接受前端请求的端口12800,修改端口可以修改config/applicaiton.yml
默认端口是 8080 这里我改成 8868了 访问地址: 127.0.0.1:8868
注意、注意、注意 服务启动需要有 Gateway 网关服务,如没网关这里会没有数据的
idea 配置skywalking
# skywalking‐agent.jar的本地磁盘的路径
-javaagent:C:\Users\xu\Desktop\daima\apache-skywalking-apm-es7-8.5.0\apache-skywalking-apm-bin-es7\agent\skywalking-agent.jar
# 在skywalking上显示的服务名
-DSW_AGENT_NAME=gateway-service
# skywalking的collector服务的IP及端口
-DSW_AGENT_COLLECTOR_BACKEND_SERVICES=127.0.0.1:11800
手动复制 gateway 网关依赖包
注意:此处存在bug,追踪链路不显示gateway
解决方案:拷贝agent/optional-plugins目录下的gateway插件和webflux插件到agent/plugins目录
使用带 网关 的服务
注意 这里 启动服务后 需要等一会才能注册到 skywalking 服务里面
但是此时这里还没有数据,因为 skywalking 是懒加载的,需求通过网关请求一个接口
随便请求一个地址
此时就出现数据了,请求的url地址也出现了(如果没有数据 多等一会,这会有延迟)
有时候手动刷新 或者 F5 不生效 ,点击右上角的自动刷新 就出来了
注意版本问题,如果版本不对,会报错,类似如下
Error for HTTP POST "/auth/login"
java.lang.NullPointerException: null
at org.apache.skywalking.apm.plugin.spring.cloud.gateway.v21x.HttpClientFinalizerResponseConnectionInterceptor$1.apply(HttpClientFinalizerResponseConnectionInterceptor.java:42)
Suppressed: reactor.core.publisher.FluxOnAssembly$OnAssemblyException:
Error has been observed at the following site(s):
*__checkpoint ⇢ org.springframework.cloud.gateway.filter.WeightCalculatorWebFilter [DefaultWebFilterChain]
*__checkpoint ⇢ org.springframework.boot.actuate.metrics.web.reactive.server.MetricsWebFilter [DefaultWebFilterChain]
*__checkpoint ⇢ HTTP POST "/auth/login" [ExceptionHandlingWebHandler]
Original Stack Trace:
at org.apache.skywalking.apm.plugin.spring.cloud.gateway.v21x.HttpClientFinalizerResponseConnectionInterceptor$1.apply(HttpClientFinalizerResponseConnectionInterceptor.java:42)
at org.apache.skywalking.apm.plugin.spring.cloud.gateway.v21x.HttpClientFinalizerResponseConnectionInterceptor$1.apply(HttpClientFinalizerResponseConnectionInterceptor.java:37)
at reactor.netty.http.client.HttpClientFinalizer.lambda$responseConnection$4(HttpClientFinalizer.java:101)
at reactor.core.publisher.MonoFlatMapMany$FlatMapManyMain.onNext(MonoFlatMapMany.java:163)
at reactor.core.publisher.SerializedSubscriber.onNext(SerializedSubscriber.java:99)
at reactor.core.publisher.FluxRetryWhen$RetryWh
刚开始使用的 是 8.5版本,会报错,错误信息 如上所示,
更换8.7版本 可以正常使用,报错是因为 gateway的版本问题
使用 apm-spring-cloud-gateway-2.1.x-plugin-8.7.0 报错
使用 apm-spring-cloud-gateway-3.x-plugin-8.7.0 不报错,
可以将这个 apm-spring-cloud-gateway-3.x-plugin-8.7.0 插件复制到 8.5 版本里面测试,这样也可以,说明网关插件问题
注意idea 的配置 jar 路径,如果切换 skywalking的版本,idea 也要更新
-javaagent:C:\Users\xu\Desktop\daima\apache-skywalking-apm-es7-8.7.0\apache-skywalking-apm-bin-es7\agent\skywalking-agent.jar -DSW_AGENT_NAME=user-service -DSW_AGENT_COLLECTOR_BACKEND_SERVICES=127.0.0.1:11800
将这个 apm-spring-cloud-gateway-3.x-plugin-8.7.0 插件复制到 8.5 版本里面测试
访问成功
linux环境部署
准备一个springboot程序,打成可执行jar包,写一个shell脚本,在启动项目的Shell脚本上,通过 -javaagent 参数进行配置SkyWalking Agent来追踪微服务;
startup.sh脚本:
#!/bin/sh
# SkyWalking Agent配置
export SW_AGENT_NAME=springboot-skywalking-demo #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:/root/skywalking-agent/skywalking-agent.jar
java $JAVA_AGENT -jar springboot-skywalking-demo-0.0.1-SNAPSHOT.jar #jar启动
等同于
java -javaagent:/root/skywalking-agent/skywalking-agent.jar
-DSW_AGENT_COLLECTOR_BACKEND_SERVICES=127.0.0.1:11800
-DSW_AGENT_NAME=springboot-skywalking -jar springboot-skywalking-0.0.1-SNAPSHOT.jar
skywalking 持久化
修改配置文件
新建数据库 表结构不需要创建,启动 skywalking 时会自动创建表
此时启动失败
只启动一个服务,另外一个服务 skywalking-oap-server 自动关闭了
需要查询日志
查看日志
缺少mysql的驱动
去项目里面找个mysql的驱动
将驱动复制到oap-libs里面
重新启动,两个服务都启动成功
数据库开始创建表 供创建了146张表
重启springboot 的服务后 随便请求某个接口,请求成功
重启 skywalking的 服务
springboot 服务没启动
skywalking的数据还都存在,说明持久化成功
自定义SkyWalking链路追踪
引入依赖
<!-- SkyWalking 工具类 --> <dependency> <groupId>org.apache.skywalking</groupId> <artifactId>apm-toolkit-trace</artifactId> <version>8.5.0</version> </dependency>
在 services 层添加注解 @Trace, @Trace将方法加入追踪链路
如果一个业务方法想在ui界面的跟踪链路上显示出来,只需要在业务方法上加上@Trace注解即可
加入@Tags或@Tag
我们还可以为追踪链路增加其他额外的信息,比如记录参数和返回信息。实现方式:在方法上增加@Tag或者@Tags。
@Tag 注解中 key = 方法名 ; value = returnedObj 返回值 arg[0] 参数
注意、注意、注意 实体类需要重写 toString() 方法,否则打印的是对象的地址
打印参数
注意、注意、注意 如果使用 Tag或者 Tags 注解,必须使用 @Trace注解
@Tags({@Tag(key = "param", value = "arg[0]"), @Tag(key = "SysLogs", value = "returnedObj")})
继承父类
使用 @Tag
@Tag(key = "selectIPage", value = "returnedObj")
性能剖析
新建任务, 选择服务 指定url(断点名称) 然后点击左下角的新建任务
然后开始请求接口,多请求几次,这里我设置的是默认值 5 (最大采样数)
在services 睡眠 2 秒钟
可以看到 这里 打印的时间
点击分析 可以分析出来哪个地方的代码有问题
Skywalking集成日志框架
引入依赖 skywalking 和 logback 整合的依赖包
<!-- skywalking 和 logback 整合的依赖包 -->
<dependency>
<groupId>org.apache.skywalking</groupId>
<artifactId>apm-toolkit-logback-1.x</artifactId>
<version>8.5.0</version>
</dependency>
配置 logback-spring.xml 日志文件 配置 [%tid]
打印出tid
根据TID查询
通过 grpc 上传日志到 skywalking
<!-- 通过grpc上报日志到skywalking oap-->
<appender name="grpc-log" class="org.apache.skywalking.apm.toolkit.log.logback.v1.x.log.GRPCLogClientAppender">
<encoder class="ch.qos.logback.core.encoder.LayoutWrappingEncoder">
<layout class="org.apache.skywalking.apm.toolkit.log.logback.v1.x.TraceIdPatternLogbackLayout">
<Pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%tid] [%thread] %-5level %logger{36} -%msg%n</Pattern>
</layout>
</encoder>
</appender>
<!--系统操作日志--> <root level="info"> <appender-ref ref="console"/> <appender-ref ref="file_info"/> <appender-ref ref="file_error"/> <appender-ref ref="grpc-log"/> </root>
重启服务 然后 请求接口
如果不显示数据 修改下查询时间范围
随便点击某个字段 就可以查看某一行的日志数据
注意、 注意、 注意、 如果skywalking 是部署到远程服务器的话,日志 就不能上报成功,需要修改配置文件 到 远程服务器skywalking 的信息
打开agent/config/agent.config配置文件,添加如下配置信息:
去官网里面获取以下信息
skywalking/docs/en/setup/service-agent/java-agent/Application-toolkit-logback-1.x.md at v8.5.0 · apache/skywalking · GitHub
配置如下
plugin.toolkit.log.grpc.reporter.server_host=${SW_GRPC_LOG_SERVER_HOST:127.0.0.1}
plugin.toolkit.log.grpc.reporter.server_port=${SW_GRPC_LOG_SERVER_PORT:11800}
plugin.toolkit.log.grpc.reporter.max_message_size=${SW_GRPC_LOG_MAX_MESSAGE_SIZE:10485760}
plugin.toolkit.log.grpc.reporter.upstream_timeout=${SW_GRPC_LOG_GRPC_UPSTREAM_TIMEOUT:30}