前言

可观测平台是数字化企业必备基础设施:

  • 帮助运维快速定位未知故障、缩短处置时长
  • 帮助研发追溯链路异常、持续优化系统性能
  • 帮助测试依托真实线上数据校验版本质量;
  • 利用可观测平台统一采集的遥测数据完成SLI自动化运算搭建标准化SLI/SLO度量体系,实现用户体验可量化、可评估,帮助管理者以标准化SLI/SLO衡量用户体验。

实现技术指标向业务价值有效转化。

可观测平台在企业中有以下两种落地方案

1.SkyWalking应用可观测(小型单体 / 简单微服务)

SkyWalking是面向微服务架构、专注应用层的一体化可观测平台实现,原生支持指标、调用观测、应用日志、性能剖析与告警能力。

适合:小团队、服务少、无 K8s、机器少
  • 优点:部署简单,一套搞定应用链路 + 指标 + 日志 + 告警
  • 缺点:看不到服务器/容器底层,日志检索拉胯,无基础设施监控,不适合大规模集群

2.完整可观测平台(中大型生产推荐)

仅靠SkyWalking无法完成IaaS层服务器、容器、网络资源以及外部SaaS服务的观测,搭配Prometheus、云监控、RUM等组件构建完整多层可观测体系。

统一标准:OpenTelemetry(采集层)+SkyWalking(链路分析核心) + Prometheus(指标统一存储)+ Loki/ELK(日志)+ Grafana(统一可视化)
分工:
  • OpenTelemetry探针统一采集 Trace/Metric/Log(兼容所有组件)
  • Trace数据投递SkyWalking:做链路拓扑、调用分析、故障定位
  • Metric 统一进 Prometheus:机器、容器、中间件、业务指标统一存储计算 SLO
  • Log存入Loki/ES:全文检索、日志清洗
  • Grafana 统一聚合所有数据源做全局大盘

总结

只看业务代码、微服务调用、接口性能:SkyWalking自己够用;

想要完整可观测(应用 + 机器 + k8s + 中间件 + 日志检索 + SLO + 前端用户体验),SkyWalking只是链路核心,必须搭配Prometheus、日志系统、基础设施采集组件才能形成完整体系。

一、链路追踪介绍

对于1个由几十个甚至几百个微服务构成的微服务架构系统,通常会遇到以下问题:

如何串联整个调用链路,快速定位问题?

如何梳理各个微服之间的依赖/调用关系?

如何进行各个微服务接口的性能分析?

如何跟踪整个业务流程的调用处理顺序?

image

如上图所示,在SpringClould微服务架构中

1个客户端请求会先经过负载均衡(如Nginx)到达微服务网关。

微服务网关(SpringClould Gateway)从注册/配置中心(Nacos)拉取服务列表,再通过本地负载均衡器(Ribbon)将请求路由到具体服务实例,期间可结合Sentinel进行流量控制和容错降级。

服务之间的远程调用则通过OpenFeign实现。

在分布式场景下,为保证跨服务调用的事务一致性,通常会引入Seata进行分布式事务管理。

此外,微服务架构还需解决分布式Session、消息队列、文件集群等一系列问题。

而对于多服务之间调用链路的监控与排查,则可通过引入分布式链路追踪系统(如SkyWalking、Zipkin或Jaeger)来解决。

它能为每1个请求生成全局唯一的Trace ID,串联起各服务节点的调用耗时与状态,从而实现全链路可视化观测。

二、SkyWalking

Apache SkyWalking是国产开源、Apache顶级项目一体化可观测平台(APM 应用性能监控)。

image

专门面向微服务、云原生、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探针记录的异常堆栈深度不足问题排查

skyWalking探针记录的异常堆栈深度不足问题排查

agent.cause_exception_depth配置决定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和方法和消耗时间。

image-20260702103254252

通过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,实现链路 - 日志联动

  • 功能:
    1. 按服务、实例、时间、日志级别 (INFO/ERROR) 过滤日志
    2. 从 Trace 详情一键跳转对应 TraceID 的完整日志,不用手动搜日志系统
    3. 支持日志关键词检索、异常堆栈高亮

使用场景:链路报错后,查看当时业务打印的错误日志、入参、上下文信息。

五、扩展方法级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>
pom.xml

代码@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五矿";
    }
}
HelloServiceImpl.java

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.conf

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

image

六、性能剖析(SkyWalking Profiling)

性能剖析(Profiling)是SkyWalking里一种按需触发的诊断机制

用户在SkyWalking UI界面新建任务通过OAP Server向目标Agent主动下发任务并周期性抓取线程栈快照。

从而精准定位到方法级或代码行级的性能瓶颈,补全链路追踪(Tracing)无法深入代码内部的盲区。

image-20260702102149755

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 收到指令后,会在你的 JVM 内启动 async-profiler 工具,按照你设定的参数(如CPU采样)开始采集数据。

  • 数据上传与分析:采样完成后,Agent 会将采集到的数据(如JFR格式文件)上传回 OAP Server。OAP Server 解析后,你就能在 UI 上看到可视化的分析结果了。

 

 

 

 

 

 

入门教程 

SkyWalking官网

posted on 2026-07-02 11:08  运维体系建设之路  阅读(68)  评论(0)    收藏  举报