SkyWalking
Apache SkyWalking 是专为分布式系统设计的 APM(应用性能监控)平台,提供链路追踪、服务拓扑、指标分析和日志关联四大能力。以 Java Agent 字节码增强为核心,无侵入接入,无需修改业务代码。
核心概念
| 概念 | 说明 |
|---|---|
| Trace | 一次完整的请求调用链,由多个 Span 组成 |
| Span | 一次操作的时间段(HTTP 调用、DB 查询、MQ 消息) |
| Segment | 单个进程内连续的 Span 集合 |
| TraceId | 全局唯一请求标识,贯穿所有服务 |
| Service | 一个微服务实例组 |
| Service Instance | Service 的一个运行实例 |
| Endpoint | 具体接口(URI + Method) |
架构
Java Agent (字节码增强)
│ gRPC / HTTP
▼
OAP Server(Observability Analysis Platform)
├── 链路数据接收与聚合
├── 告警引擎
└── 存储写入(Elasticsearch / BanyanDB / H2)
│
▼
SkyWalking UI(内置)/ Grafana
Java Agent 接入
下载 Agent(从 SkyWalking 官网 获取):
skywalking-agent/
├── skywalking-agent.jar
├── config/
│ └── agent.config
└── plugins/ # 各中间件插件
JVM 启动参数:
java -javaagent:/path/to/skywalking-agent.jar \
-Dskywalking.agent.service_name=order-service \
-Dskywalking.collector.backend_service=oap-server:11800 \
-jar app.jarDocker 方式:
FROM eclipse-temurin:21-jre
COPY skywalking-agent/ /skywalking-agent/
COPY app.jar /app.jar
ENTRYPOINT ["java", \
"-javaagent:/skywalking-agent/skywalking-agent.jar", \
"-Dskywalking.agent.service_name=order-service", \
"-Dskywalking.collector.backend_service=oap:11800", \
"-jar", "/app.jar"]配置(agent.config 关键项)
# 服务名
agent.service_name=order-service
# OAP 地址
collector.backend_service=127.0.0.1:11800
# 采样率(0-10000,默认 10000 = 100%,生产环境建议调低)
agent.sample_n_per_3_secs=1000
# 忽略特定 URL(健康检查等)
agent.ignore_suffix=.html,.css,.js,.jpg,.pngSpring Boot 集成(不用 Agent,SDK 方式)
<dependency>
<groupId>org.apache.skywalking</groupId>
<artifactId>apm-toolkit-trace</artifactId>
<version>9.3.0</version>
</dependency>// 手动标记 Span
@TraceCrossThread
public void asyncProcess() {
ActiveSpan.tag("orderId", "123456");
ActiveSpan.error(new RuntimeException("process failed"));
TraceContext.traceId(); // 获取当前 TraceId(用于日志关联)
}日志关联
在 logback 中注入 TraceId,实现日志与链路的互相跳转:
<!-- logback-spring.xml -->
<dependency>
<groupId>org.apache.skywalking</groupId>
<artifactId>apm-toolkit-logback-1.x</artifactId>
</dependency>
<pattern>%d{HH:mm:ss.SSS} [%tid] [%thread] %-5level %logger{36} - %msg%n</pattern>%tid 会自动输出 TID: <traceId>,在 SkyWalking UI 中点击日志即可跳转到对应链路。
OAP + UI 部署(Docker Compose)
services:
elasticsearch:
image: elasticsearch:8.13.0
environment:
- discovery.type=single-node
- xpack.security.enabled=false
oap:
image: apache/skywalking-oap-server:9.7.0
environment:
SW_STORAGE: elasticsearch
SW_STORAGE_ES_CLUSTER_NODES: elasticsearch:9200
ports:
- "11800:11800" # gRPC(Agent 上报)
- "12800:12800" # HTTP(UI 查询)
depends_on:
- elasticsearch
skywalking-ui:
image: apache/skywalking-ui:9.7.0
environment:
SW_OAP_ADDRESS: http://oap:12800
ports:
- "8080:8080"
depends_on:
- oap告警规则
# config/alarm-settings.yml
rules:
service_resp_time_rule:
metrics-name: service_resp_time
op: ">"
threshold: 1000 # 响应时间 > 1000ms
period: 10
count: 3
message: "服务 {name} 平均响应时间超过 1s"
service_error_rate_rule:
metrics-name: service_sla
op: "<"
threshold: 9500 # 成功率 < 95%(SLA 单位为 1/10000)
period: 10
count: 2
message: "服务 {name} 成功率低于 95%"
webhooks:
- https://oapi.dingtalk.com/robot/send?access_token=xxxSkyWalking vs Zipkin vs Jaeger
| 特性 | SkyWalking | Zipkin | Jaeger |
|---|---|---|---|
| 接入方式 | Agent 无侵入 | 代码侵入 | 代码侵入 |
| 指标分析 | 内置(服务/实例/端点) | 无 | 弱 |
| 日志关联 | 支持 | 不支持 | 不支持 |
| 告警 | 内置规则引擎 | 无 | 无 |
| 存储 | ES / BanyanDB | MySQL/ES/Cassandra | ES/Cassandra/Kafka |
| UI | 功能完整 | 基础 | 基础 |
相关链接
- OpenTelemetry — 可替代 Agent,OAP 支持 OTLP 协议接收
- Prometheus — 指标监控,与 SkyWalking APM 互补
- Grafana — 可对接 SkyWalking 数据源进行自定义面板
- 可观测性(架构) · Spring Cloud 链路追踪