java应用通过jvm参数-javaagent挂载skywalking agent实现零代码侵入,需用绝对路径、配置agent.service_name、修改agent.config而非application.yml,禁用重复sdk,注意插件兼容性及oap存储配置。

Java应用怎么加SkyWalking Agent启动
不改代码、不侵入业务,靠JVM参数挂载Agent是最稳妥的起步方式。关键在-javaagent路径必须绝对正确,且要放在-jar之前。
- Agent路径写错或文件不存在时,JVM直接报错退出,错误信息是:
Unable to open zip file: /path/to/skywalking-agent.jar - 如果用Docker,记得把Agent目录挂载进容器,且
skywalking-agent.jar和config/agent.config都在同一级目录下 -
agent.service_name必须显式配置(默认是MyService),否则所有服务在UI里都叫同一个名字,没法区分 - 别用
java -javaagent:./agent/skywalking-agent.jar -jar app.jar这种相对路径——容器或CI环境工作目录不确定,一律用绝对路径,比如/opt/skywalking/agent/skywalking-agent.jar
application.yml里要不要配SkyWalking客户端
不用。SkyWalking Java Agent是字节码增强型,完全绕过Spring Boot自动配置。你在application.yml里加skywalking:块、引入spring-boot-starter-skywalking,反而可能引发冲突或重复上报。
- 唯一需要改的配置文件是Agent自带的
config/agent.config,比如设置collector.backend_service=10.20.30.40:11800 - 如果用了OpenTelemetry SDK再叠一层Agent,会出现span重复、parent关系错乱,典型现象是Trace里出现两个一模一样的HTTP入口span
- Spring Cloud Gateway这类网关场景,需额外打开
plugin.spring-cloud-gateway-3.x-plugin,否则路由链路断在Gateway层
为什么Trace在UI里看不到,但日志说上报成功了
大概率是Collector接收到了数据,但OAP没存进存储,或者UI查的是另一个Storage(比如ES索引名不匹配、H2只存最近3小时)。
- 检查OAP日志有没有
EsHttpClientPool连接失败或IndexNotFoundException,ES集群没建好索引模板是常见原因 - OAP默认用H2做存储,只适合单机测试;生产必须切到Elasticsearch,且版本要匹配——SkyWalking 9.7要求ES 7.10–7.17,ES 8.x不兼容
- UI里时间范围选太小(比如只看“过去5分钟”),而你的请求实际发生在10分钟前,也会显示空白;右上角时间选择器默认不是“实时滚动”,得手动点刷新
- 确认Agent的
sample_n_per_3_secs没被设成0(全采样关闭),或者agent.ignore_suffix误把健康检查路径/actuator/health也过滤了
Feign调用链路断开,下游服务收不到traceId
Agent默认支持Feign,但前提是没手动替换成OkHttp或Apache HttpClient——一旦换底层HTTP客户端,原生Feign插件就失效了。
立即学习“Java免费学习笔记(深入)”;
- 检查
pom.xml是否引入了feign-httpclient或feign-okhttp,有就得启用对应插件:plugin.httpclient-4.x-plugin或plugin.okhttp-3.x-plugin - Spring Cloud OpenFeign 3.x+(对应Spring Boot 3)默认用Java 11+的
HttpClient,得开plugin.java-httpclient-plugin,这个插件在SkyWalking 9.4+才稳定 - 如果Feign接口用了
@Headers("X-B3-TraceId: {traceId}")这类硬编码透传,会覆盖Agent注入的W3C TraceContext,导致下游解析失败
Agent配置和网络连通性比代码改造重要得多;真正卡住的往往不是Java端,而是Collector和Storage之间的证书、权限、索引策略这些“非Java”环节。










