SkyWalking APM:应用性能监控与诊断

FreeGuideOnline 最新 2026-06-30

yaml version: '3.8' services: oap: image: apache/skywalking-oap-server:9.7.0 container_name: oap restart: always ports: - "11800:11800" # gRPC 数据上报端口 - "12800:12800" # HTTP 数据上报端口 environment: SW_STORAGE: h2 # 默认内存数据库,生产环境请更换为 ElasticSearch ui: image: apache/skywalking-ui:9.7.0 container_name: ui restart: always ports: - "8080:8080" # UI 访问端口 environment: SW_OAP_ADDRESS: http://oap:12800 depends_on: - oap


### 2. 启动服务

```bash
docker-compose up -d

浏览器访问 http://localhost:8080,即可看到 SkyWalking UI 界面。

生产环境建议:将存储切换为 ElasticSearch,只需修改 OAP 容器环境变量:

SW_STORAGE: elasticsearch
SW_STORAGE_ES_CLUSTER_NODES: your-es-cluster:9200

应用接入:Java Agent 无侵入监控

SkyWalking 最强大之处在于对 Java 应用的无侵入性,只需在启动命令中添加一行 -javaagent 参数即可。

1. 下载 Agent 包

官方下载页 获取 apache-skywalking-java-agent-9.2.0.tgz,解压后找到 skywalking-agent.jar

2. 修改 Agent 配置(可选)

打开 agent/config/agent.config,可以调整服务名和后端地址:

agent.service_name=${SW_AGENT_NAME:your-application-name}
collector.backend_service=${SW_AGENT_COLLECTOR_BACKEND_SERVICES:127.0.0.1:11800}

3. 启动应用挂载探针

以 Spring Boot 应用为例:

java -javaagent:/path/to/skywalking-agent.jar \
     -DSW_AGENT_NAME=my-cool-service \
     -jar my-app.jar

启动后,SkyWalking UI 的“General”页面就会自动出现该服务,并能观察到它产生的请求指标。

核心功能实操指南

1. 查看全链路追踪

  • 打开 UI,点击 Trace 菜单。
  • 按时间范围、服务、端点等条件筛选。
  • 点击任意一条 Trace,可以看到详细的水波图(甘特图),每个 Span 的耗时、调用关系一目了然。
  • 单击某个 Span,可以查看具体标签(如 SQL 语句、HTTP URL、响应状态码)。

诊断慢请求:在 Trace 列表按耗时降序排列,快速定位最慢的调用链。

2. 理解服务拓扑图

  • 进入 Topology 页面。
  • 图上的每个节点代表一个服务,连线代表调用关系。
  • 连线上会显示平均延迟、吞吐率和成功率。
  • 选中某个服务,可以高亮它的上下游依赖。

拓扑图能帮你快速发现:

  • 不合理的调用链(如循环依赖)。
  • 突然消失的服务实例。
  • 某个依赖服务的流量异常飙升。

3. 监控核心性能指标

Dashboard(或者通过菜单进入各服务的指标页面),你可以看到:

  • 服务级指标:平均响应时间、吞吐量(CPM)、成功率。
  • 端点级指标:每个接口的 QPS 和延迟分位数(P99、P95、P90)。
  • 实例级指标:单个 JVM 的 CPU、堆内存、GC 情况、线程数。
  • 基础设施指标:通过 JMX 或外部 Prometheus 可采集数据库连接池、MQ 等指标。

这些指标都支持时间范围选择和自定义图表。

4. 设置告警规则

SkyWalking 内置了一些维度的告警,例如服务平均响应时间、成功率等。规则在 config/alarm-settings.yml 中定义。

rules:
  service_resp_time_rule:
    metrics-name: service_resp_time
    op: ">"
    threshold: 1000
    period: 10
    count: 3
    silence-period: 5
    message: 服务 {name} 平均响应时间超过 1 秒