SkyWalking

Apache SkyWalking 是专为分布式系统设计的 APM(应用性能监控)平台,提供链路追踪、服务拓扑、指标分析和日志关联四大能力。以 Java Agent 字节码增强为核心,无侵入接入,无需修改业务代码。


核心概念

概念说明
Trace一次完整的请求调用链,由多个 Span 组成
Span一次操作的时间段(HTTP 调用、DB 查询、MQ 消息)
Segment单个进程内连续的 Span 集合
TraceId全局唯一请求标识,贯穿所有服务
Service一个微服务实例组
Service InstanceService 的一个运行实例
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.jar

Docker 方式

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,.png

Spring 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=xxx

SkyWalking vs Zipkin vs Jaeger

特性SkyWalkingZipkinJaeger
接入方式Agent 无侵入代码侵入代码侵入
指标分析内置(服务/实例/端点)
日志关联支持不支持不支持
告警内置规则引擎
存储ES / BanyanDBMySQL/ES/CassandraES/Cassandra/Kafka
UI功能完整基础基础

相关链接