前言
可观测平台是数字化企业必备基础设施:
- 帮助运维快速定位未知故障、缩短处置时长
- 帮助研发追溯链路异常、持续优化系统性能
- 帮助测试依托真实线上数据校验版本质量;
- 利用可观测平台统一采集的遥测数据完成SLI自动化运算,搭建标准化SLI/SLO度量体系,实现用户体验可量化、可评估,帮助管理者以标准化SLI/SLO衡量用户体验。
实现技术指标向业务价值有效转化。
可观测平台在企业中有以下两种落地方案
1.SkyWalking应用可观测(小型单体 / 简单微服务)
SkyWalking是面向微服务架构、专注应用层的一体化可观测平台实现,原生支持指标、调用观测、应用日志、性能剖析与告警能力。
- 优点:部署简单,一套搞定应用链路 + 指标 + 日志 + 告警
- 缺点:看不到服务器/容器底层,日志检索拉胯,无基础设施监控,不适合大规模集群
2.完整可观测平台(中大型生产推荐)
仅靠SkyWalking无法完成IaaS层服务器、容器、网络资源以及外部SaaS服务的观测,搭配Prometheus、云监控、RUM等组件构建完整多层可观测体系。
分工:
- OpenTelemetry探针统一采集 Trace/Metric/Log(兼容所有组件)
- Trace数据投递SkyWalking:做链路拓扑、调用分析、故障定位
- Metric 统一进 Prometheus:机器、容器、中间件、业务指标统一存储计算 SLO
- Log存入Loki/ES:全文检索、日志清洗
- Grafana 统一聚合所有数据源做全局大盘
总结
只看业务代码、微服务调用、接口性能:SkyWalking自己够用;
想要完整可观测(应用 + 机器 + k8s + 中间件 + 日志检索 + SLO + 前端用户体验),SkyWalking只是链路核心,必须搭配Prometheus、日志系统、基础设施采集组件才能形成完整体系。
对于1个由几十个甚至几百个微服务构成的微服务架构系统,通常会遇到以下问题:
如何串联整个调用链路,快速定位问题?
如何梳理各个微服之间的依赖/调用关系?
如何进行各个微服务接口的性能分析?
如何跟踪整个业务流程的调用处理顺序?

如上图所示,在SpringClould微服务架构中
1个客户端请求会先经过负载均衡(如Nginx)到达微服务网关。
微服务网关(SpringClould Gateway)从注册/配置中心(Nacos)拉取服务列表,再通过本地负载均衡器(Ribbon)将请求路由到具体服务实例,期间可结合Sentinel进行流量控制和容错降级。
服务之间的远程调用则通过OpenFeign实现。
在分布式场景下,为保证跨服务调用的事务一致性,通常会引入Seata进行分布式事务管理。
此外,微服务架构还需解决分布式Session、消息队列、文件集群等一系列问题。
而对于多服务之间调用链路的监控与排查,则可通过引入分布式链路追踪系统(如SkyWalking、Zipkin或Jaeger)来解决。
它能为每1个请求生成全局唯一的Trace ID,串联起各服务节点的调用耗时与状态,从而实现全链路可视化观测。
二、SkyWalking
Apache SkyWalking是国产开源、Apache顶级项目的一体化可观测平台(APM 应用性能监控)。

专门面向微服务、云原生、K8s容器、服务网格场景,一站式搞定链路追踪(Trace)、指标监控(Metrics)、日志(Logs)、性能剖析(Proflies)(One platform for traces, metrics, logs and profiles)。
SkyWalking由以下核心组件组成,各司其职:
| 组件 | 全称 / 角色 | 核心职责 |
|---|---|---|
| Java Agent | 无侵入式探针 | 部署在应用侧,负责采集链路、指标、日志等数据,并上报给 OAP。 |
| OAP Server | Observability Analysis Platform (可观测性分析平台) | 系统的大脑,负责接收、分析、聚合和存储数据,并向 UI 提供查询接口,同时负责下发动态配置和 Profiling 任务。 |
| 存储介质 | 可插拔存储 | 持久化所有监控数据。最常用的是 Elasticsearch,也支持 MySQL、TiDB 等。 |
| UI 层 | 展示 | 集中展示所有可观测性数据。 |
三、接入SkyWalking
Agent方式(推荐)
java -jar:JVM会去寻找JAR包中MANIFEST.MF文件里定义的Main-Class,并执行它的main() 方法。这是应用程序的起点。
java -javaagent:JVM会去加载指定的JAR包,寻找 MANIFEST.MF文件里定义的Premain-Class,并执行它的premain() 方法。这是JVM专门为监控/增强类库预留的入口。
探针接入的特点:零代码侵入,对业务代码无任何改动,覆盖绝大部分监控场景。
java -javaagent:/path/to/skywalking-agent.jar \ -Dskywalking.agent.service_name=order-service \ # 指定服务名 -Dskywalking.collector.backend_service=192.168.1.100:11800 \ # 指定OAP地址 -jar your-app.jar
skyWalking探针记录的异常堆栈深度不足问题排查
#查看容器中主进程Pid ps -ef #根据Pod查看进程启动完整命令行 cat /proc/10/cmdline | tr '\\0' ' ' #根据完整启动命令中/monitor/skywalking/skywalking-agent.jar路径,锁定SkyWalking的配置文件路径 grep -i depth /monitor/skywalking/config/agent.config #查看环境变量 echo $SW_AGENT_CAUSE_EXCEPTION_DEPTH #skyWalking加载配置优先级 1. JVM 启动 `-Dskywalking.xxx`(你这里缺失深度配置) 2. 容器系统环境变量 `SW_AGENT_*`(你这里为空) 3. agent.config 文件 `${变量:默认值}` 兜底(当前生效
SDK代码方式
通过SDK的方式可以扩展自定义Skywalking链路追踪信息,其缺陷是对代码有侵入。
Agent采集到的可观测数据,只能看到1次HTTP请求的URL和方法和消耗时间。

通过apm-toolkit-trace第三方依赖jar包,和代码@Trace主机自定义链路追踪 还可以记录Java代码中方法,参数、返回值实现链路追踪,
四、使用SkyWalking UI
全局大盘 → 服务拓扑Service Topology定位微服务依赖 → 选定Service → 锁定异常Endpoint → Trace追踪调用栈 → Log核对上下文日志
1.Service Topology
服务拓扑可以表示微服务之间的依赖和调用关系,最终形成一张有向无环图。
2.Service
Service就是微服务架构应用中一个服务,例如1个spring boot项目
3.Endpoint
1个服务中对外暴露的1个API接口
4.Segment
Segment:表示当前服务,在本次Trace请求中产生的所有Span集合
5.Trace
Trace:表示1次完整的用户请求,1条trace至少包含1个Segment和1个全局根Span,1个Segment至少包含1个本地根Span
6.Span
Span:本次Trace/Segment中包含的一个具体操作,全局根Span和TraceID在本次请求中唯一,根Span可以逐级衍生子Span,最终所有Span形成1棵树状结构。
如果使用SkyWalking的apm-customize-enhance.jar和apm-spring-annotation-plugin-9.5.0.jar插件对Spring项目中的Controller→Service → DAO层中的任一Bean的方法进行了增强,那么这个方法也可以成为1个Span。
7.Segment、Trace和Span关系图
Trace │ ├── Segment A:order-service │ │ │ ├── Root Span │ ├── Child Span │ ├── Child Span │ └── Child Span │ └── Segment B:user-service │ ├── Root Span ├── Child Span └── Child Span
8.Log(日志面板)
Agent开启日志采集,自动绑定TraceId,实现链路 - 日志联动
- 功能:
- 按服务、实例、时间、日志级别 (INFO/ERROR) 过滤日志
- 从 Trace 详情一键跳转对应 TraceID 的完整日志,不用手动搜日志系统
- 支持日志关键词检索、异常堆栈高亮
使用场景:链路报错后,查看当时业务打印的错误日志、入参、上下文信息。
五、扩展方法级Span
SkyWalking Java Agent默认并不会对所有Java类和方法进行无差别埋点。
通过Agent安装目录/plugins/…插件机制对特定框架、组件以及配置匹配的方法进行增强,在程序执行到这些增强点时生成对应的Span。
如果需要针对服务内某1个java类的方法进行埋点,有以下两种方式。
1.代码侵入
该方法需要修改业务代码
引入依赖
<dependency> <groupId>org.apache.skywalking</groupId> <artifactId>apm-toolkit-trace</artifactId> <version>9.5.0</version> <!-- scope选provided!!重点 --> <scope>provided</scope> </dependency>
代码@Trace注解
package com.zhanggen.swtestdemo.service.impl; import com.zhanggen.swtestdemo.service.HelloService; import org.springframework.stereotype.Service; import org.apache.skywalking.apm.toolkit.trace.Trace; // @Service 将当前类交给Spring管理 @Service public class HelloServiceImpl implements HelloService { @Override @Trace public String getHello() { // 后续业务逻辑、数据库查询都写在这里 return "hello五矿"; } }
2.Agent无侵入方案
SkyWalking Agent所有采集功能均依托插件实现,Agent的pulgin插件存放目录分为以下两个插件目录:
- plugins目录:启动Java进程时自动加载该目录下所有jar插件,内置常用组件埋点插件。
- optional-plugins目录:可选插件目录,目录内插件默认不会加载,用来存放非通用、按需启用的增强插件。
2.1.agen配置文件
agent.conf是aget启动时加载的统一配置入口。
2.2.从optional-plugins目录复制jar包到plugin目录
D:\skywalking\apache-skywalking-java-agent-9.5.0\skywalking-agent\optional-plugins/apm-customize-enhance-plugin.jar 复制到 D:\skywalking\apache-skywalking-java-agent-9.5.0\skywalking-agent\plugins
追加agent.cnf配置
plugin.customize.enhance_file=D:/customize_enhance.xml
agent配置加载的xml配置中定义的方法
2.3.单个类自定义增强
让apm-customize-enhance-plugin.jar加载D:/customize_enhance.xml配置。
<?xml version="1.0" encoding="UTF-8"?> <enhanced> <class class_name="com.zhanggen.swtestdemo.service.impl.HelloServiceImpl"> <method method="getHello()" static="false" operation_name="/service/getHello"> </method> </class> </enhanced>
2.4.批量增强
apm-spring-annotation-plugin-9.5.0.jar插件功能:
可追踪Spring容器中被@Bean、@Service、@Component、@Repository注解标注的Bean内所有方法
apm-spring-annotation-plugin-9.5.0.jar插件弊端:
若追踪Spring容器内所有Bean的所有方法,势必会产生海量链路片段(Span),同时消耗更多 CPU、内存与网络资源
#配置项 $ cat skywalking/apache-skywalking-java-agent-9.5.0/skywalking-agent/config/agent.config | grep plugin.springannotation.classname_match_regex plugin.springannotation.classname_match_regex=${SW_SPRINGANNOTATION_CLASSNAME_MATCH_REGEX:} #插件 $ ls skywalking/apache-skywalking-java-agent-9.5.0/skywalking-agent/plugins/apm-spring-annotation-plugin-9.5.0.jar skywalking/apache-skywalking-java-agent-9.5.0/skywalking-agent/plugins/apm-spring-annotation-plugin-9.5.0.jar #配置文件 $ tail -n 1 /d/skywalking/apache-skywalking-java-agent-9.5.0/skywalking-agent/config/agent.config plugin.customize.enhance_file=D:/custom-enhance.xml
D:/customize_enhance.xml配置内容
<?xml version="1.0" encoding="UTF-8"?> <enhanced> <!-- 正则匹配service包以及impl所有类 --> <class class_name="com.zhanggen.swtestdemo.service.**.*"> <method method="*" static="false"/> </class> </enhanced>
2.5.重启apache-skywalking-java-agent
java
-javaagent:/d/skywalking/apache-skywalking-java-agent-9.5.0/skywalking-agent/skywalking-agent.jar
-Dskywalking.agent.service_name=zhanggen89
-Dskywalking.collector.backend_service=127.0.0.1:11800
-jar sw-test-demo-0.0.1.jar --server.port=8081
2.6.UI展示生成的方法span

六、性能剖析(SkyWalking Profiling)
性能剖析(Profiling)是SkyWalking里一种按需触发的诊断机制。
用户在SkyWalking UI界面新建任务通过OAP Server向目标Agent主动下发任务并周期性抓取线程栈快照。
从而精准定位到方法级或代码行级的性能瓶颈,补全链路追踪(Tracing)无法深入代码内部的盲区。

Skywaling的UI内置服务性能剖析功能,是定位代码级性能瓶颈(如 CPU 飙升、方法慢)的利器。
支持的剖析性能类型
| 剖析类型 | 分析目标 | 适用场景 | 支持版本 |
|---|---|---|---|
| CPU剖析 | 分析 CPU 热点方法 | 定位 CPU 使用率高的代码 | 全版本支持 |
| 内存分配剖析 (ALLOC) | 分析高频内存分配的调用栈 | 定位频繁创建对象的代码,优化 GC 压力 | SkyWalking 10.2.0+ |
对服务内存分配剖析需要升级SkyWalking至10.2.0+
工作流程
-
你发起任务:你在 SkyWalking UI 上选择目标服务和实例,配置好参数(如持续时间、CPU或内存采样等),创建一个新的 Profiling 任务。
-
Agent 接收指令:运行中的 Java Agent 会持续与 OAP Server 保持通信。当新任务创建后,Agent 会从 OAP Server 获取到“开始执行剖析”的指令。
-
Agent 执行采样
-
数据上传与分析:采样完成后,Agent 会将采集到的数据(如JFR格式文件)上传回 OAP Server。OAP Server 解析后,你就能在 UI 上看到可视化的分析结果了。
浙公网安备 33010602011771号