SkyWalking 核心概念
SkyWalking 简介
SkyWalking 是一款开源的应用性能监控(APM)系统,为分布式系统提供链路追踪、性能分析、服务网格观测等功能。
核心特性
- 多语言支持:支持 Java、Go、Python、Node.js 等多种语言
- 多种探针:支持自动探针和手动埋点
- 多种存储:支持 Elasticsearch、MySQL、TiDB、InfluxDB 等
- 服务网格:支持 Istio 服务网格观测
- 告警机制:灵活的告警规则配置
- 拓扑分析:自动生成了服务依赖拓扑图
架构组成
┌─────────────────────────────────────────────────────┐
│ Agent │
│ (Java Agent, Go SDK, Python SDK, etc.) │
└──────────────────────┬──────────────────────────────┘
│
│ 上报追踪数据
▼
┌─────────────────────────────────────────────────────┐
│ OAP Server │
│ (数据接收、分析、聚合、告警) │
└──────────────────────┬──────────────────────────────┘
│
│ 存储数据
▼
┌─────────────────────────────────────────────────────┐
│ Storage (ES, MySQL, etc.) │
└──────────────────────┬──────────────────────────────┘
│
│ 查询数据
▼
┌─────────────────────────────────────────────────────┐
│ UI (Web) │
│ (可视化展示、拓扑图、链路追踪、指标分析) │
└─────────────────────────────────────────────────────┘
核心概念
1. 服务(Service)
服务是 SkyWalking 中的基本概念,代表一个应用系统:
- 服务名:应用的唯一标识
- 服务实例:服务的具体运行实例
- 服务版本:应用的版本号
2. 服务实例(Service Instance)
服务实例是服务的具体运行单元:
- 实例 ID:实例的唯一标识
- 实例属性:IP、端口、主机名等
- 实例状态:在线/离线状态
3. 端点(Endpoint)
端点是服务提供的接口:
- 端点名称:接口路径或方法名
- 端点类型:HTTP、gRPC、Dubbo 等
- 端点响应时间:接口的平均响应时间
4. 追踪(Trace)
追踪是请求在分布式系统中的完整调用链路:
- Trace ID:追踪的唯一标识
- 段(Segment):一次服务调用产生的追踪片段
- 跨度(Span):追踪中的最小单元,代表一次 RPC 调用或本地方法调用
5. 跨度(Span)
跨度是追踪的基本单元:
- 操作名称:方法名或接口路径
- 开始时间/结束时间:调用时间范围
- 标签(Tags):附加信息(如 URL、参数等)
- 日志(Logs):调用过程中的日志
- 跨度类型:Entry(入口)、Exit(出口)、Local(本地)
快速开始
1. Docker 部署 SkyWalking
version: '3.3'
services:
elasticsearch:
image: docker.elastic.co/elasticsearch/elasticsearch:7.17.0
container_name: es
environment:
- discovery.type=single-node
- ES_JAVA_OPTS=-Xms512m -Xmx512m
ports:
- "9200:9200"
volumes:
- es_data:/usr/share/elasticsearch/data
skywalking-oap:
image: apache/skywalking-oap-server:9.7.0
container_name: oap
depends_on:
- elasticsearch
environment:
SW_STORAGE: elasticsearch
SW_STORAGE_ES_CLUSTER_NODES: elasticsearch:9200
ports:
- "11800:11800"
- "12800:12800"
skywalking-ui:
image: apache/skywalking-ui:9.7.0
container_name: ui
depends_on:
- skywalking-oap
environment:
SW_OAP_ADDRESS: skywalking-oap:12800
ports:
- "8080:8080"
volumes:
es_data:
2. Java Agent 接入
下载 SkyWalking Agent:
wget https://archive.apache.org/dist/skywalking/9.7.0/apache-skywalking-apm-9.7.0.tar.gz
tar -xzf apache-skywalking-apm-9.7.0.tar.gz
配置 agent.config:
# agent 配置
agent.service_name=user-service
agent.namespace=dev
agent.instance_name=instance-1
# OAP 服务器地址
collector.backend_service=127.0.0.1:11800
# 采样率(100 表示 100%)
sample_n_per_3_secs=100
# 日志配置
logging.dir=logs
logging.level=DEBUG
3. 启动应用
java -javaagent:/path/to/skywalking/agent/skywalking-agent.jar \
-Dskywalking.agent.service_name=user-service \
-Dskywalking.collector.backend_service=127.0.0.1:11800 \
-jar app.jar
4. Spring Boot 集成
<dependency>
<groupId>org.apache.skywalking</groupId>
<artifactId>apm-toolkit-trace</artifactId>
<version>9.7.0</version>
</dependency>
链路追踪
自动追踪
SkyWalking Agent 会自动追踪以下框架:
- Web 框架:Spring MVC、Spring WebFlux、JAX-RS
- RPC 框架:Dubbo、gRPC、Thrift
- 数据库:MySQL、PostgreSQL、Oracle、Redis
- 消息队列:Kafka、RabbitMQ、RocketMQ
- HTTP 客户端:OkHttp、HttpClient、RestTemplate
手动埋点
1. 使用注解
@Service
public class UserService {
@Trace
public User findById(Long id) {
return userRepository.findById(id).orElse(null);
}
@Trace(operationName = "customOperation")
public User create(User user) {
return userRepository.save(user);
}
@Trace(tags = {
@Tag(key = "userId", value = "arg[0]"),
@Tag(key = "result", value = "returnedObj")
})
public User update(Long id, User user) {
return userRepository.save(user);
}
}
2. 使用 API
@Service
public class OrderService {
@Autowired
private Tracer tracer;
public Order createOrder(Order order) {
// 创建 Span
Span span = Tracer.createSpan("createOrder");
try {
span.tag("orderId", order.getId().toString());
span.log("开始创建订单");
// 业务逻辑
Order result = orderRepository.save(order);
span.log("订单创建成功");
return result;
} catch (Exception e) {
span.errorOccurred();
span.log("订单创建失败:" + e.getMessage());
throw e;
} finally {
Tracer.stopSpan(span);
}
}
}
3. 异步追踪
@Service
public class AsyncService {
@Trace
public CompletableFuture<String> asyncTask() {
Span span = Tracer.createSpan("asyncTask");
try {
return CompletableFuture.supplyAsync(() -> {
try (Scope ignored = Tracer.activateSpan(span)) {
span.log("执行异步任务");
return "result";
}
});
} finally {
Tracer.stopSpan(span);
}
}
}
性能指标监控
1. 服务指标
SkyWalking 自动收集以下服务指标:
- QPS:每秒请求数
- 响应时间:平均响应时间、P50、P90、P95、P99
- 成功率:请求成功比例
- 慢调用:超过阈值的调用次数
2. JVM 指标
- 堆内存:Eden、Survivor、Old Gen
- 非堆内存:Metaspace、Code Cache
- GC 情况:GC 次数、GC 时间
- 线程数:活跃线程数、阻塞线程数
3. 数据库指标
- 连接池:活跃连接数、空闲连接数
- SQL 执行:执行次数、平均耗时
- 慢 SQL:超过阈值的 SQL 语句
告警配置
告警规则
# 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} 响应时间超过 1000ms
# 服务成功率告警
service_sla_rule:
metrics-name: service_sla
op: "<"
threshold: 80
period: 10
count: 2
silence-period: 5
message: 服务 {name} 成功率低于 80%
# 服务 P90 响应时间告警
service_p90_rule:
metrics-name: service_p90
op: ">"
threshold: 2000
period: 10
count: 3
silence-period: 5
message: 服务 {name} P90 响应时间超过 2000ms
# 数据库慢查询告警
database_resp_time_rule:
metrics-name: database_resp_time
op: ">"
threshold: 500
period: 10
count: 5
silence-period: 5
message: 数据库响应时间超过 500ms
告警通知
# webhook 通知
webhooks:
- http://alert-manager:9093/alert
# 钉钉通知
dingtalk:
webhooks:
- url: https://oapi.dingtalk.com/robot/send?access_token=xxx
secret: xxx
# 企业微信通知
wechat:
webhooks:
- url: https://qyapi.weixin.qq.com/cgi-bin/webhook/send?key=xxx
拓扑分析
服务拓扑图
SkyWalking 自动生成服务依赖拓扑图:
- 节点:代表服务实例
- 边:代表服务间调用关系
- 颜色:反映响应时间和成功率
- 大小:反映 QPS 大小
依赖分析
通过拓扑图可以分析:
- 服务依赖关系:了解服务间的调用链路
- 性能瓶颈:定位响应慢的服务
- 异常传播:追踪错误来源
- 容量规划:根据 QPS 规划资源
日志关联
日志采集
<dependency>
<groupId>org.apache.skywalking</groupId>
<artifactId>apm-toolkit-logback-1.x</artifactId>
<version>9.7.0</version>
</dependency>
配置 logback.xml:
<configuration>
<appender name="CONSOLE" class="ch.qos.logback.core.ConsoleAppender">
<encoder class="ch.qos.logback.core.encoder.LayoutWrappingEncoder">
<layout class="org.apache.skywalking.apm.toolkit.log.logback.v1.x.TraceIdPatternLogbackLayout">
<Pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%tid] [%thread] %-5level %logger{36} - %msg%n</Pattern>
</layout>
</encoder>
</appender>
<root level="INFO">
<appender-ref ref="CONSOLE"/>
</root>
</configuration>
日志与追踪关联
通过 Trace ID 将日志与追踪关联:
@Service
public class LogService {
private static final Logger logger = LoggerFactory.getLogger(LogService.class);
@Trace
public void process(String data) {
logger.info("开始处理数据:{}", data);
// 业务逻辑
logger.info("数据处理完成");
}
}
日志输出:
2026-04-10 10:00:00.000 [TID: N/A] [main] INFO c.e.service.LogService - 开始处理数据:test
2026-04-10 10:00:00.100 [TID: 123456.0.1] [main] INFO c.e.service.LogService - 数据处理完成
生产实践
1. Agent 配置优化
# 服务名
agent.service_name=${SW_AGENT_NAME:user-service}
# 命名空间(环境隔离)
agent.namespace=${SW_AGENT_NAMESPACE:prod}
# 实例名
agent.instance_name=${SW_AGENT_INSTANCE:instance-1}
# OAP 地址
collector.backend_service=${SW_AGENT_COLLECTOR_BACKEND:127.0.0.1:11800}
# 采样率
sample_n_per_3_secs=${SW_SAMPLE_N_PER_3_SECS:100}
# 忽略路径
agent.ignore_suffix=${SW_AGENT_IGNORE:.css,.js,.html,.png,.jpg}
# 插件配置
plugin.mysql.trace_sql_parameters=${SW_MYSQL_TRACE_SQL_PARAMETERS:true}
plugin.httpclient.skipHttpClientCollect=${SW_HTTPCLIENT_SKIP_COLLECT:false}
2. 性能优化
- 调整采样率:根据流量调整采样率
- 关闭不必要插件:禁用不使用的框架插件
- 异步日志:使用异步日志减少性能影响
- 批量上报:配置批量上报减少网络开销
3. 存储优化
# Elasticsearch 配置
storage:
elasticsearch:
namespace: ${SW_NAMESPACE:""}
clusterNodes: ${SW_STORAGE_ES_CLUSTER_NODES:localhost:9200}
indexShardsNumber: ${SW_STORAGE_ES_INDEX_SHARDS_NUMBER:2}
indexReplicasNumber: ${SW_STORAGE_ES_INDEX_REPLICAS_NUMBER:0}
# 索引保留天数
day: ${SW_STORAGE_ES_DAY:7}
4. 多环境部署
# dev 环境
agent.namespace: dev
collector.backend_service: dev-oap:11800
# test 环境
agent.namespace: test
collector.backend_service: test-oap:11800
# prod 环境
agent.namespace: prod
collector.backend_service: prod-oap:11800
常见问题
1. Agent 不生效
问题:接入 Agent 后没有追踪数据
排查步骤:
- 检查 Agent 路径是否正确
- 检查 OAP 服务是否正常运行
- 检查网络连通性
- 查看 Agent 日志
2. 数据不完整
问题:部分调用链路缺失
解决方案:
- 检查采样率配置
- 检查异步调用是否正确使用 Context
- 检查插件是否启用
3. 性能影响
问题:接入 Agent 后性能下降
解决方案:
- 降低采样率
- 关闭不必要的插件
- 优化 Agent 配置
总结
SkyWalking 提供了强大的分布式链路追踪和性能监控能力,通过自动探针和手动埋点可以全面监控应用的运行状态。
合理配置 SkyWalking 可以帮助快速定位性能瓶颈和故障根源,提高系统的可观测性。
在生产环境中,建议做好环境隔离,优化 Agent 配置,并建立完善的告警机制。