主题
Apache SkyWalking
Apache SkyWalking 是一个应用性能监控(APM)系统,专门为微服务、云原生和基于容器(Docker、K8s、Mesos)的架构而设计。它提供了分布式追踪、服务网格遥测分析、指标聚合和可视化等功能。
核心特性
- 分布式追踪:自动追踪分布式系统中的请求链路
- 性能指标监控:监控应用性能指标,包括响应时间、吞吐量等
- 服务拓扑图:自动生成服务依赖关系图
- 告警:支持多种告警规则和通知方式
- 日志关联:将日志与追踪数据关联
- 多语言支持:支持 Java、.NET、Node.js、Python、Go 等
- 存储支持:支持 Elasticsearch、MySQL、TiDB、InfluxDB 等
架构组件
- Agent:探针,负责收集应用数据
- Collector:收集器,接收 Agent 上报的数据
- Storage:存储层,存储追踪和指标数据
- UI:Web 界面,提供可视化和查询功能
Docker 安装
安装 Elasticsearch(存储)
bash
docker run -d \
--name elasticsearch \
--restart=always \
-p 9200:9200 \
-p 9300:9300 \
-e "discovery.type=single-node" \
-e "ES_JAVA_OPTS=-Xms512m -Xmx512m" \
elasticsearch:7.17.0安装 SkyWalking OAP(收集器)
bash
docker run -d \
--name skywalking-oap \
--restart=always \
-p 11800:11800 \
-p 12800:12800 \
-e SW_STORAGE=elasticsearch \
-e SW_STORAGE_ES_CLUSTER_NODES=elasticsearch:9200 \
apache/skywalking-oap-server:9.5.0安装 SkyWalking UI
bash
docker run -d \
--name skywalking-ui \
--restart=always \
-p 8080:8080 \
--link skywalking-oap:skywalking-oap \
-e SW_OAP_ADDRESS=http://skywalking-oap:12800 \
apache/skywalking-ui:9.5.0访问 UI:http://localhost:8080
Java 应用集成
方式一:使用 Agent(推荐)
下载 SkyWalking Agent:
bash
wget https://archive.apache.org/dist/skywalking/9.5.0/apache-skywalking-java-agent-9.5.0.tgz
tar -xzf apache-skywalking-java-agent-9.5.0.tgz启动应用时添加 JVM 参数:
bash
java -javaagent:/path/to/skywalking-agent/skywalking-agent.jar \
-DSW_AGENT_NAME=your-service-name \
-DSW_AGENT_COLLECTOR_BACKEND_SERVICES=localhost:11800 \
-jar your-application.jar方式二:Spring Boot 集成
添加依赖
在 pom.xml 中添加依赖:
xml
<dependency>
<groupId>org.apache.skywalking</groupId>
<artifactId>apm-toolkit-trace</artifactId>
<version>9.5.0</version>
</dependency>
<dependency>
<groupId>org.apache.skywalking</groupId>
<artifactId>apm-toolkit-logback-1.x</artifactId>
<version>9.5.0</version>
</dependency>配置 Agent
在 application.yml 中配置:
yaml
skywalking:
agent:
service_name: your-service-name
collector:
backend_service: localhost:11800
plugin:
mysql:
trace_sql_parameters: true启动参数
在启动脚本中添加:
bash
-javaagent:/path/to/skywalking-agent/skywalking-agent.jar手动追踪
创建自定义追踪
java
import org.apache.skywalking.apm.toolkit.trace.Trace;
import org.apache.skywalking.apm.toolkit.trace.TraceContext;
@Service
public class OrderService {
@Trace
public void createOrder(Order order) {
// 业务逻辑
processOrder(order);
}
@Trace(operationName = "processOrder")
public void processOrder(Order order) {
// 处理订单
}
public void logTraceId() {
// 获取追踪 ID
String traceId = TraceContext.traceId();
log.info("Trace ID: {}", traceId);
}
}异步追踪
java
import org.apache.skywalking.apm.toolkit.trace.RunnableWrapper;
import org.apache.skywalking.apm.toolkit.trace.TraceCrossThread;
@Service
public class AsyncService {
@TraceCrossThread
public void asyncProcess() {
CompletableFuture.runAsync(
RunnableWrapper.of(() -> {
// 异步任务
})
);
}
}日志关联
Logback 配置
在 logback-spring.xml 中配置:
xml
<configuration>
<appender name="STDOUT" 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="STDOUT" />
</root>
</configuration>使用日志
java
import org.apache.skywalking.apm.toolkit.trace.ActiveSpan;
import org.apache.skywalking.apm.toolkit.trace.TraceContext;
@Service
public class OrderService {
public void createOrder(Order order) {
// 添加追踪信息到日志
ActiveSpan.info("Creating order: " + order.getOrderId());
// 获取追踪 ID
String traceId = TraceContext.traceId();
log.info("Trace ID: {}, Order ID: {}", traceId, order.getOrderId());
}
}指标监控
HTTP 指标
SkyWalking 自动监控 HTTP 请求的以下指标:
- 响应时间
- 吞吐量(QPS)
- 错误率
- 状态码分布
数据库指标
自动监控数据库操作的:
- SQL 执行时间
- SQL 执行次数
- 慢 SQL 识别
自定义指标
java
import org.apache.skywalking.apm.toolkit.meter.Counter;
import org.apache.skywalking.apm.toolkit.meter.Gauge;
import org.apache.skywalking.apm.toolkit.meter.MeterFactory;
@Service
public class MetricsService {
private Counter orderCounter;
@PostConstruct
public void init() {
orderCounter = MeterFactory.counter("order_count")
.tag("type", "create")
.build();
}
public void createOrder() {
// 增加计数器
orderCounter.increment();
}
}告警配置
告警规则配置
在 config/alarm-settings.yml 中配置:
yaml
rules:
# 服务响应时间告警
service_sla_rule:
metrics-name: service_sla
threshold: 8000
op: "<"
period: 10
count: 3
message: "服务 {name} 的平均响应时间在最近 10 分钟内低于 8000 毫秒"
# 服务错误率告警
service_resp_time_rule:
metrics-name: service_resp_time
threshold: 1000
op: ">"
period: 10
count: 3
message: "服务 {name} 的平均响应时间在最近 10 分钟内超过 1000 毫秒"
# 数据库慢查询告警
database_access_sla_rule:
metrics-name: database_access_sla
threshold: 1000
op: "<"
period: 10
count: 2
message: "数据库 {name} 的平均响应时间在最近 10 分钟内低于 1000 毫秒"Webhook 通知
yaml
webhooks:
- http://localhost:8080/webhook服务拓扑图
SkyWalking 会自动生成服务依赖关系图,包括:
- 服务之间的调用关系
- 服务与数据库的依赖关系
- 服务与消息队列的依赖关系
- 调用链路的性能指标
追踪查询
按服务查询
在 UI 中可以按服务查询追踪数据:
- 选择服务
- 选择时间范围
- 查看追踪列表
按端点查询
可以查询特定端点的追踪数据:
- 选择端点(如 HTTP 路径)
- 查看该端点的所有追踪
按追踪 ID 查询
如果知道追踪 ID,可以直接查询:
- 输入追踪 ID
- 查看完整的调用链路
性能分析
端点性能分析
- 查看端点的平均响应时间
- 查看端点的吞吐量
- 查看端点的错误率
- 识别慢端点
服务性能分析
- 查看服务的整体性能
- 分析服务的依赖关系
- 识别性能瓶颈
数据库性能分析
- 查看 SQL 执行时间
- 识别慢 SQL
- 分析数据库连接池使用情况
最佳实践
- 合理设置采样率:在高并发场景下,可以设置采样率减少数据量
- 配置告警规则:及时发现问题
- 日志关联:将日志与追踪数据关联,便于排查问题
- 性能优化:根据监控数据优化性能瓶颈
- 存储优化:合理配置存储,定期清理历史数据
- Agent 版本管理:保持 Agent 版本与 OAP 版本一致
常见问题
Agent 无法连接 OAP
- 检查网络连接
- 检查 OAP 服务是否正常启动
- 检查配置的地址和端口是否正确
数据不显示
- 检查 Agent 是否正常启动
- 检查采样率配置
- 检查存储配置
性能影响
- Agent 对应用性能影响很小(通常 < 3%)
- 可以调整采样率减少影响
- 可以关闭不需要的插件
SkyWalking 作为强大的 APM 工具,可以帮助开发团队快速定位和解决分布式系统中的性能问题,提升系统的可观测性。