链路监控
1. 概述
链路监控是微服务架构中重要的运维工具,通过追踪请求在各个服务之间的调用路径,可以快速定位和解决分布式系统中的问题。在梵医云系统中,使用 Apache SkyWalking 进行链路追踪。SkyWalking 是一款应用性能监控系统(APM),提供分布式追踪、服务网格遥测、数据库遥测等功能。本文档介绍如何配置和使用链路监控。
2. 监控体系架构
2.1 监控组件
梵医云系统链路监控包含以下组件:
- SkyWalking OAP Server:观测分析平台,接收和分析追踪数据
- SkyWalking UI:Web 界面,用于查看和分析追踪数据
- SkyWalking Agent:Java Agent,自动采集应用追踪数据
- SkyWalking Java Agent Toolkit:集成工具包,提供 TraceId 等功能
- Elasticsearch:存储后端(可选)
- TraceFilter:自定义过滤器,将 TraceId 添加到响应头
2.2 监控架构
┌─────────────┐ ┌─────────────┐ ┌─────────────┐ ┌─────────────┐
│ Java App │ ───> │ SkyWalking │ ───> │ OAP Server │ ───> │ UI │
│ + Agent │ │ Agent │ │ │ │ │
└─────────────┘ └─────────────┘ └─────────────┘ └─────────────┘
│
▼
┌─────────────┐
│ TraceFilter │
└─────────────┘3. SkyWalking 安装
3.1 Docker 安装
3.1.1 使用 Docker Compose 安装
创建 docker-compose.yml:
version: '3'
services:
# SkyWalking OAP Server
oap:
image: apache/skywalking-oap-server:8.17.0
container_name: skywalking-oap
ports:
- "11800:11800"
- "12800:12800"
environment:
- SW_STORAGE=elasticsearch
- SW_ES_CLUSTER_NODES=elasticsearch:9200
depends_on:
- elasticsearch
networks:
- skywalking
# SkyWalking UI
ui:
image: apache/skywalking-ui:8.17.0
container_name: skywalking-ui
ports:
- "8080:8080"
environment:
- SW_OAP_ADDRESS=http://oap:12800
depends_on:
- oap
networks:
- skywalking
# Elasticsearch
elasticsearch:
image: docker.elastic.co/elasticsearch:7.17.0
container_name: skywalking-elasticsearch
ports:
- "9200:9200"
- "9300:9300"
environment:
- discovery.type=single-node
- ES_JAVA_OPTS=-Xms512m -Xmx512m
networks:
- skywalking
networks:
skywalking:
driver: bridge启动服务:
docker-compose up -d3.1.2 单独安装 OAP Server
# 拉取镜像
docker pull apache/skywalking-oap-server:8.17.0
# 运行容器
docker run -d \
--name skywalking-oap \
-p 11800:11800 \
-p 12800:12800 \
-e SW_STORAGE=elasticsearch \
-e SW_ES_CLUSTER_NODES=192.168.1.10:9200 \
--restart=always \
apache/skywalking-oap-server:8.17.03.1.3 单独安装 UI
# 拉取镜像
docker pull apache/skywalking-ui:8.17.0
# 运行容器
docker run -d \
--name skywalking-ui \
-p 8080:8080 \
-e SW_OAP_ADDRESS=http://192.168.1.10:12800 \
--restart=always \
apache/skywalking-ui:8.17.03.2 源码安装
# 下载 SkyWalking
cd /opt
wget https://downloads.apache.org/skywalking/8.17.0/apache-skywalking-apm-8.17.0.tar.gz
# 解压
tar -zxvf apache-skywalking-apm-8.17.0.tar.gz
mv apache-skywalking-apm-8.17.0 skywalking
# 启动 OAP Server
cd skywalking/bin
./oapService.sh
# 启动 UI
./webappService.sh3.3 访问 SkyWalking UI
打开浏览器访问:
http://your-server-ip:80804. SkyWalking Agent 配置
4.1 下载 Agent
# 创建目录
mkdir -p /data/skywalking/agent
cd /data/skywalking/agent
# 下载 Agent
wget https://downloads.apache.org/skywalking/8.17.0/apache-skywalking-java-agent-8.17.0.tar.gz
# 解压
tar -zxvf apache-skywalking-java-agent-8.17.0.tar.gz4.2 配置 Agent
编辑 /data/skywalking/agent/config/agent.config:
# Agent 服务名称
agent.service_name=${SW_AGENT_NAME:fanyi-gateway}
# OAP Server 地址
collector.backend_service=${SW_AGENT_COLLECTOR_BACKEND_SERVICES:192.168.1.10:11800}
# 采样率(1 表示 100%)
agent.sample_n_per_3_secs=${SW_AGENT_SAMPLE:-1}
# 是否启用 JVM 监控
jvm.buffer_size=${SW_JVM_BUFFER_SIZE:1000}
# 是否启用类增强
agent.class_cache_mode=${SW_AGENT_CLASS_CACHE_MODE:MEMORY}
# 是否启用插件
plugin.mount=${SW_AGENT_MOUNT:-/usr/local/skywalking/agent/plugins}
# 日志级别
logging.level=${SW_LOGGING_LEVEL:INFO}
# 日志文件路径
logging.file_name=${SW_LOGGING_FILE_NAME:/data/skywalking/agent/logs/skywalking-api.log}
# 日志最大大小
logging.max_file_size=${SW_LOGGING_MAX_FILE_SIZE:300*1024*1024}
# 日志最大历史
logging.max_history_files=${SW_LOGGING_MAX_HISTORY_FILES:10}4.3 应用接入 Agent
4.3.1 Java 应用接入
在启动 Java 应用时添加 JVM 参数:
java -javaagent:/data/skywalking/agent/skywalking-agent.jar \
-Dskywalking.agent.service_name=fanyi-gateway \
-Dskywalking.collector.backend_service=192.168.1.10:11800 \
-jar fanyi-gateway.jar4.3.2 Docker 应用接入
在 docker-compose.yml 中添加环境变量:
services:
fanyi-gateway:
image: fanyi-cloud/fanyi-gateway:latest
ports:
- "48080:48080"
environment:
# 配置 SkyWalking Agent
- JAVA_TOOL_OPTIONS=-javaagent:/data/skywalking/skywalking-agent/skywalking-agent.jar
- SW_AGENT_NAME=fanyi-gateway
- SW_AGENT_COLLECTOR_BACKEND_SERVICES=192.168.1.10:11800
volumes:
- /data/skywalking/skywalking-agent:/data/skywalking/skywalking-agent
restart: always4.3.3 Spring Boot 应用接入
在 application.yaml 中添加配置:
fanyi:
tracer:
# 是否启用链路追踪
enable: true5. 链路追踪使用
5.1 获取 TraceId
在代码中使用 TracerUtils 获取 TraceId:
import com.fanyi.cloud.framework.common.util.monitor.TracerUtils;
@Service
public class OrderService {
public void createOrder(Order order) {
// 获取 TraceId
String traceId = TracerUtils.getTraceId();
// 使用 TraceId
log.info("创建订单,TraceId: {}", traceId);
// 业务逻辑
saveOrder(order);
}
}5.2 TraceFilter 自动添加 TraceId
TraceFilter 会自动将 TraceId 添加到响应头:
public class TraceFilter extends OncePerRequestFilter {
private static final String HEADER_NAME_TRACE_ID = "trace-id";
@Override
protected void doFilterInternal(HttpServletRequest request, HttpServletResponse response, FilterChain chain)
throws IOException, ServletException {
// 设置响应 traceId
response.addHeader(HEADER_NAME_TRACE_ID, TracerUtils.getTraceId());
// 继续过滤
chain.doFilter(request, response);
}
}客户端可以从响应头中获取 TraceId:
// 从响应头获取 TraceId
const traceId = response.headers['trace-id'];
console.log('TraceId:', traceId);5.3 在日志中记录 TraceId
使用 SkyWalking 的 TraceIdPatternLogbackLayout 自动在日志中添加 TraceId:
<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} | %5p | %thread [%tid] %logger{39} | %m%n</pattern>
</layout>
</encoder>
</appender>日志输出示例:
2024-02-12 10:30:45.123 | INFO | http-nio-48080-exec-1 [TID: 1234567890abcdef] c.f.c.m.s.OrderService | 创建订单,订单号: 123456. SkyWalking UI 使用
6.1 仪表板
SkyWalking UI 提供多个仪表板:
- 全局仪表板:查看整体系统状态
- 服务仪表板:查看单个服务的指标
- 端点仪表板:查看端点性能
- 实例仪表板:查看实例指标
- 数据库仪表板:查看数据库性能
- 缓存仪表板:查看缓存性能
6.2 拓扑图
拓扑图展示服务之间的调用关系:
- 服务拓扑:查看服务之间的调用关系
- 实例拓扑:查看实例之间的调用关系
- 端点拓扑:查看端点之间的调用关系
6.3 追踪查询
追踪查询功能用于查找和分析调用链:
- 选择服务
- 选择端点
- 选择时间范围
- 点击"搜索"按钮
- 查看追踪详情
6.4 追踪详情
追踪详情展示完整的调用链:
- 调用链:查看完整的调用路径
- 时间轴:查看各步骤的耗时
- 标签:查看追踪的标签信息
- 日志:查看相关的日志
- 异常:查看异常信息
6.5 性能分析
性能分析功能用于分析性能问题:
- 慢查询:查看慢 SQL
- 慢调用:查看慢调用
- 错误分析:查看错误统计
- 告警:查看告警信息
7. 日志集成
7.1 配置日志收集
SkyWalking 支持通过 gRPC 收集日志。在 logback-spring.xml 中添加:
<!-- SkyWalking GRPC 日志收集 -->
<appender name="GRPC" class="org.apache.skywalking.apm.toolkit.log.logback.v1.x.log.GRPCLogClientAppender">
<encoder class="ch.qos.logback.core.encoder.LayoutWrappingEncoder">
<layout class="org.apache.skywalking.apm.toolkit.log.logback.v1.x.TraceIdPatternLogbackLayout">
<pattern>${PATTERN_DEFAULT}</pattern>
</layout>
</encoder>
</appender>
<root level="INFO">
<appender-ref ref="GRPC"/>
</root>7.2 配置 Agent 日志收集
在 agent.config 中添加:
# 启用日志收集
plugin.toolkit.log.transmit_formatted=true
# 日志格式
plugin.toolkit.log.grpc.reporter.server_host=192.168.1.10
plugin.toolkit.log.grpc.reporter.server_port=11800
# 日志级别
plugin.toolkit.log.grpc.reporter.max_message_size=104857607.3 查看日志
在 SkyWalking UI 中查看日志:
- 进入"日志"页面
- 选择服务和实例
- 选择时间范围
- 输入 TraceId 或关键词
- 查看日志详情
8. 告警配置
8.1 配置告警规则
在 SkyWalking UI 中配置告警规则:
- 进入"告警"页面
- 点击"新建规则"
- 配置告警规则:
- 规则名称
- 指标类型
- 阈值
- 持续时间
- 告警级别
- 通知方式
8.2 常见告警规则
服务响应时间告警:
- 指标:服务响应时间
- 阈值:> 1000ms
- 持续时间:5 分钟
服务错误率告警:
- 指标:服务错误率
- 阈值:> 5%
- 持续时间:5 分钟
服务可用性告警:
- 指标:服务可用性
- 阈值:< 95%
- 持续时间:5 分钟
数据库慢查询告警:
- 指标:数据库查询时间
- 阈值:> 5000ms
- 持续时间:5 分钟
9. 性能优化
9.1 Agent 优化
# 调整采样率
agent.sample_n_per_3_secs=10
# 调整 JVM 缓冲区大小
jvm.buffer_size=500
# 调整类缓存模式
agent.class_cache_mode=MEMORY
# 调整日志级别
logging.level=WARN9.2 OAP Server 优化
# 调整存储
SW_STORAGE=elasticsearch
# 调整 ES 集群
SW_ES_CLUSTER_NODES=192.168.1.10:9200
# 调整索引分片
SW_ES_INDEX_SHARDS_NUMBER=2
# 调整索引副本
SW_ES_INDEX_REPLICAS_NUMBER=19.3 应用优化
- 减少不必要的追踪
- 使用异步调用
- 优化数据库查询
- 使用缓存
- 避免循环调用
10. 常见问题
10.1 Agent 无法连接 OAP Server
问题:Agent 无法连接到 OAP Server
解决方案:
- 检查 OAP Server 是否运行
- 检查网络连接是否正常
- 检查防火墙是否开放端口
- 检查 Agent 配置是否正确
10.2 追踪数据不显示
问题:SkyWalking UI 中看不到追踪数据
解决方案:
- 检查 Agent 是否正常启动
- 检查 Agent 日志是否有错误
- 检查 OAP Server 日志
- 检查时间范围是否正确
- 检查服务名称是否正确
10.3 TraceId 为空
问题:TracerUtils.getTraceId() 返回空字符串
解决方案:
- 检查 Agent 是否正常启动
- 检查应用是否在 Agent 下运行
- 检查是否启用了链路追踪
- 检查是否有调用链路
10.4 日志无法收集
问题:日志无法在 SkyWalking UI 中查看
解决方案:
- 检查日志配置是否正确
- 检查 Agent 日志收集是否启用
- 检查网络连接是否正常
- 检查日志格式是否正确
11. 注意事项
- Agent 配置:根据实际情况调整 Agent 配置
- 采样率:合理设置采样率,平衡性能和监控精度
- 日志集成:确保日志正确集成到 SkyWalking
- 告警配置:配置合理的告警规则
- 性能影响:注意 Agent 对应用性能的影响
- 版本兼容:确保 Agent 和 OAP Server 版本兼容
- 网络配置:确保网络配置正确
- 数据存储:定期清理历史数据
