Skywalking 分布式链路追踪系统
·
Skywalking
概述
SkyWalking 是一款优秀的国产开源分布式应用性能监控(APM)系统,专注于微服务、云原生和基于容器架构的监控需求。项目于2015年由吴晟个人开源,2017年加入Apache孵化器,2019年4月成为Apache顶级项目。主要开发人员来自华为,社区活跃,增长势头强劲。
核心特性
1. 核心功能
- 分布式追踪:跨服务调用链路追踪
- 性能指标分析:服务性能指标监控与分析
- 服务依赖分析:自动生成服务拓扑图
- 告警系统:实时异常监控与告警
- 日志集成:分布式日志关联分析
2. 技术特点
- 多语言支持:Java、.NET、Node.js、PHP、Python、Go等
- 无代码侵入:采用字节码注入技术实现
- 数据存储灵活:支持Elasticsearch、MySQL、TiDB、H2等
- 云原生友好:支持Kubernetes、Service Mesh等
- 轻量级探针:性能损耗低(<10%)
架构组成
1. 核心组件
text
├── Agent # 数据采集探针(各服务部署)
├── OAP Server # 数据接收、聚合、分析服务
├── Storage # 数据存储(ES/MySQL等)
└── UI # 可视化展示界面
2. 部署模式
- 单机模式:适用于开发测试环境
- 集群模式:适用于生产环境
- Kubernetes Operator:云原生部署
安装部署
1. 版本说明
- 9.0+版本中APM与Agent分开下载
- 推荐使用最新稳定版
2. 下载地址
官方下载:https://skywalking.apache.org/downloads/
GitHub Releases:https://github.com/apache/skywalking/releases
3. 快速安装(Linux)
bash
# 下载最新版本
wget https://dlcdn.apache.org/skywalking/9.4.0/apache-skywalking-apm-9.4.0.tar.gz
# 解压
tar -zxvf apache-skywalking-apm-9.4.0.tar.gz
cd apache-skywalking-apm-bin
# 修改配置文件(可选)
vim config/application.yml
# 启动服务
./bin/startup.sh
# 停止服务
./bin/stop.sh
4. 配置详解
OAP Server配置 (config/application.yml)
yaml
cluster:
selector: ${SW_CLUSTER:standalone} # 集群模式选择
storage:
selector: ${SW_STORAGE:elasticsearch} # 存储选择
elasticsearch:
namespace: ${SW_NAMESPACE:""}
clusterNodes: ${SW_STORAGE_ES_CLUSTER_NODES:localhost:9200}
receiver-sharing-server:
selector: ${SW_RECEIVER_SHARING_SERVER:default}
default:
authentication: ${SW_AUTHENTICATION:""}
core:
selector: ${SW_CORE:default}
default:
# 采样率设置
sampleRate: ${SW_CORE_SAMPLE_RATE:10000} # 采样率,默认100%
UI配置 (webapp/application.yml)
yaml
server:
port: 8080 # UI端口
collector:
path: /graphql
ribbon:
ReadTimeout: 10000
listOfServers: ${SW_COLLECTOR_RIBON_LIST:127.0.0.1:12800} # OAP地址
security:
user:
admin: # 管理员账户
password: admin
服务集成配置
1. Agent配置
基础配置
bash
# Java应用启动参数
-javaagent:/path/to/skywalking-agent/skywalking-agent.jar
-Dskywalking.agent.service_name=your-service-name
-Dskywalking.collector.backend_service=127.0.0.1:11800
完整配置示例
bash
# 微服务启动配置示例
java -javaagent:/opt/skywalking/agent/skywalking-agent.jar \
-Dskywalking.agent.service_name=order-service \
-Dskywalking.agent.instance_name=order-service-instance-1 \
-Dskywalking.collector.backend_service=skywalking-oap:11800 \
-Dskywalking.agent.sample_n_per_3_secs=-1 \
-Dskywalking.logging.level=DEBUG \
-jar your-application.jar
Agent配置详解 (agent/config/agent.config)
properties
# 服务名称配置
agent.service_name=${SW_AGENT_NAME:Your_ApplicationName}
# 后端服务地址
collector.backend_service=${SW_AGENT_COLLECTOR_BACKEND_SERVICES:127.0.0.1:11800}
# 采样配置
agent.sample_n_per_3_secs=${SW_AGENT_SAMPLE:-1} # -1表示全部采样
# 日志级别
logging.level=${SW_LOGGING_LEVEL:INFO}
# 忽略路径配置
agent.ignore_suffix=${SW_AGENT_IGNORE_SUFFIX:.jpg,.jpeg,.png,.gif,.css,.js}
# 跨进程传播配置
agent.cause_exception_depth=${SW_AGENT_CAUSE_EXCEPTION_DEPTH:5}
2. 插件管理
常用插件
text
plugins/
├── apm-spring-webmvc-annotations-6.x-plugin.jar # Spring MVC
├── apm-spring-cloud-gateway-3.x-plugin.jar # Spring Cloud Gateway
├── apm-feign-default-http-9.x-plugin.jar # Feign客户端
├── apm-httpClient-4.x-plugin.jar # HttpClient
├── apm-mysql-5.x-plugin.jar # MySQL
├── apm-redis-2.x-plugin.jar # Redis
├── apm-kafka-plugin.jar # Kafka
└── apm-elasticsearch-5.x-plugin.jar # Elasticsearch
插件启用/禁用
bash
# 方式1:修改agent配置
-Dskywalking.plugin.mysql.trace_sql_parameters=true # 启用MySQL参数追踪
# 方式2:配置文件
vim agent/config/agent.config
# 添加配置
plugin.mysql.trace_sql_parameters=true
3. Spring Cloud集成
Maven依赖
xml
<!-- Spring Cloud集成 -->
<dependency>
<groupId>org.apache.skywalking</groupId>
<artifactId>apm-toolkit-trace</artifactId>
<version>${skywalking.version}</version>
</dependency>
<dependency>
<groupId>org.apache.skywalking</groupId>
<artifactId>apm-toolkit-logback-1.x</artifactId>
<version>${skywalking.version}</version>
</dependency>
配置文件示例
yaml
# application.yml
spring:
application:
name: order-service
skywalking:
agent:
service_name: ${spring.application.name}
collector:
backend_service: ${SKYWALKING_HOST:127.0.0.1}:11800
logging:
level: DEBUG
自定义Trace
java
import org.apache.skywalking.apm.toolkit.trace.Trace;
import org.apache.skywalking.apm.toolkit.trace.TraceContext;
@Service
public class OrderService {
@Trace(operationName = "createOrder")
public Order createOrder(OrderRequest request) {
// 获取Trace ID
String traceId = TraceContext.traceId();
// 添加标签
ActiveSpan.tag("order_type", request.getType());
ActiveSpan.tag("user_id", request.getUserId());
// 记录日志
ActiveSpan.info("Creating order for user: " + request.getUserId());
return processOrder(request);
}
@Trace
private Order processOrder(OrderRequest request) {
// 业务逻辑
return new Order();
}
}
功能详解
1. 服务监控
仪表板概览
- 服务健康状态
- 服务响应时间统计
- 服务吞吐量(QPS)
- 服务SLA(服务等级协议)
服务详情
json
{
"service": "order-service",
"type": "HTTP",
"cpm": 150, // 每分钟调用次数
"avgResponseTime": 45, // 平均响应时间(ms)
"p95ResponseTime": 120, // P95响应时间
"p99ResponseTime": 250, // P99响应时间
"successRate": 99.8, // 成功率
"apdex": 0.95 // 应用性能指数
}
2. 拓扑结构图
功能特性
- 自动发现:自动识别服务间依赖关系
- 动态更新:实时更新拓扑结构
- 深度分析:支持多层调用链路展示
- 异常标识:高亮显示异常服务节点
拓扑图元素
- 节点:服务实例、数据库、缓存等
- 连线:调用关系和流量方向
- 颜色标识:绿色(正常)、红色(异常)
- 流量指标:线条粗细表示流量大小
3. 链路追踪(Trace)
Trace详情结构
text
Trace ID: a1b2c3d4e5f6
Duration: 245ms
Status: Success
├── Span 1: gateway入口 [15ms]
│ ├── HTTP请求: GET /api/orders
│ └── Tags: http.method=GET, http.status_code=200
├── Span 2: order-service [120ms]
│ ├── 数据库查询: 查询订单
│ ├── Redis操作: 获取缓存
│ └── RPC调用: 调用product-service
└── Span 3: product-service [85ms]
└── 数据库查询: 查询商品信息
Span类型
- Entry Span:服务入口Span
- Local Span:本地方法Span
- Exit Span:服务出口Span
Trace查询语法
sql
-- 基本查询
service(order-service) and endpoint(/api/orders/*)
-- 状态查询
trace.status = error
-- 时间范围查询
trace.start_time > '2024-01-01 00:00:00'
-- 标签查询
trace.tag.http.method = 'GET'
-- 组合查询
service(order-service) and trace.duration > 1000 and trace.status = error
4. 数据库监控
支持的数据库
- MySQL、PostgreSQL、Oracle
- Elasticsearch、MongoDB
- Redis、Memcached
- Kafka、RocketMQ
监控指标
yaml
database_monitoring:
sql_execution:
slow_sql_threshold: 100ms # 慢SQL阈值
max_sql_length: 2048 # SQL最大长度
trace_sql_parameters: true # 是否追踪参数
connection_pool:
max_connections: 100
active_connections: 45
idle_connections: 55
performance:
queries_per_second: 1200
avg_query_time: 25ms
error_rate: 0.05%
5. 告警功能
告警规则配置
yaml
rules:
- name: service_slow_response
metrics-name: service_resp_time
op: ">"
threshold: 1000
period: 10
count: 2
silence-period: 5
message: Service {name} response time is over 1000ms
- name: service_error_rate
metrics-name: service_cpm
op: ">"
threshold: 50
period: 5
count: 3
message: Service {name} error rate is high
告警通知渠道
- Webhook通知
- 邮件通知
- Slack/钉钉/企业微信
- 短信通知
高级配置
1. 集群部署
OAP集群配置
yaml
# application.yml
cluster:
selector: ${SW_CLUSTER:standalone}
standalone:
# 或使用其他协调器
zookeeper:
hostPort: ${SW_CLUSTER_ZK_HOST_PORT:localhost:2181}
sessionTimeout: ${SW_CLUSTER_ZK_SESSION_TIMEOUT:100000}
storage:
selector: ${SW_STORAGE:elasticsearch}
elasticsearch:
namespace: ${SW_NAMESPACE:""}
clusterNodes: ${SW_STORAGE_ES_CLUSTER_NODES:localhost:9200}
user: ${SW_ES_USER:""}
password: ${SW_ES_PASSWORD:""}
UI负载均衡
nginx
# Nginx配置示例
upstream skywalking_ui {
server ui1:8080;
server ui2:8080;
server ui3:8080;
}
server {
listen 80;
server_name skywalking.example.com;
location / {
proxy_pass http://skywalking_ui;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
}
}
2. 安全配置
认证配置
yaml
# OAP认证配置
receiver-sharing-server:
default:
authentication: ${SW_AUTHENTICATION:secret-token}
# Agent认证配置
agent.authentication=${SW_AGENT_AUTHENTICATION:secret-token}
SSL/TLS配置
yaml
# SSL配置示例
receiver-sharing-server:
default:
ssl:
enabled: ${SW_SSL_ENABLED:false}
key_path: ${SW_SSL_KEY_PATH:""}
cert_chain_path: ${SW_SSL_CERT_CHAIN_PATH:""}
3. 性能调优
Agent调优
properties
# 缓冲区配置
buffer.channel_size=${SW_BUFFER_CHANNEL_SIZE:5}
buffer.buffer_size=${SW_BUFFER_BUFFER_SIZE:300}
# 发送配置
agent.force_reconnection_period=${SW_AGENT_FORCE_RECONNECTION_PERIOD:1}
# 采样配置
agent.sample_n_per_3_secs=${SW_AGENT_SAMPLE:-1}
# 日志配置
logging.level=${SW_LOGGING_LEVEL:INFO}
logging.dir=${SW_LOGGING_DIR:logs}
logging.file_name=${SW_LOGGING_FILE_NAME:skywalking-api.log}
OAP调优
yaml
# JVM参数建议
-Xms4g -Xmx4g
-XX:+UseG1GC
-XX:MaxGCPauseMillis=200
-XX:+HeapDumpOnOutOfMemoryError
# OAP核心配置
core:
default:
# 线程池配置
gRPCThreadPoolSize: ${SW_CORE_GRPC_THREAD_POOL_SIZE:4}
gRPCThreadPoolQueueSize: ${SW_CORE_GRPC_THREAD_POOL_QUEUE_SIZE:10000}
# 缓存配置
cacheLayer: ${SW_CORE_CACHE_LAYER:guava}
guavaCacheSize: ${SW_CORE_GUAVA_CACHE_SIZE:10000}
故障排除
1. 常见问题
Agent无法连接OAP
bash
# 检查网络连通性
telnet <oap-host> 11800
# 检查防火墙
firewall-cmd --list-all
# 查看Agent日志
tail -f logs/skywalking-api.log
数据不显示
- 检查Agent配置是否正确
- 确认OAP服务正常运行
- 验证存储服务(如ES)状态
- 检查采样率配置
性能问题
- 调整缓冲区大小
- 优化采样策略
- 检查网络延迟
- 监控存储性能
2. 日志分析
Agent日志级别
bash
# 修改日志级别
-Dskywalking.logging.level=DEBUG
# 查看详细日志
grep "ERROR\|WARN" logs/skywalking-api.log
OAP日志分析
bash
# 查看启动日志
tail -f logs/oap.log
# 错误日志分析
grep -A 5 -B 5 "Exception" logs/oap.log
最佳实践
1. 生产环境部署
yaml
# 生产环境配置示例
environment:
mode: production
agent:
service_naming_strategy: ${SW_AGENT_NAMING:default}
instance_properties_json: '{"host.ip":"${SW_AGENT_IP}","os.name":"${SW_AGENT_OS}"}'
collector:
keep_tracing: ${SW_COLLECTOR_KEEP_TRACING:true}
analysis_register_period: ${SW_ANALYSIS_REGISTER_PERIOD:3}
storage:
elasticsearch:
index_shards_number: ${SW_STORAGE_ES_INDEX_SHARDS_NUMBER:2}
index_replicas_number: ${SW_STORAGE_ES_INDEX_REPLICAS_NUMBER:0}
2. Kubernetes部署
Sidecar模式
yaml
apiVersion: apps/v1
kind: Deployment
metadata:
name: order-service
spec:
template:
spec:
containers:
- name: order-service
image: order-service:latest
env:
- name: JAVA_TOOL_OPTIONS
value: "-javaagent:/skywalking/agent/skywalking-agent.jar"
- name: SW_AGENT_NAME
value: "order-service"
- name: SW_AGENT_COLLECTOR_BACKEND_SERVICES
value: "skywalking-oap.skywalking.svc.cluster.local:11800"
volumeMounts:
- name: skywalking-agent
mountPath: /skywalking/agent
volumes:
- name: skywalking-agent
configMap:
name: skywalking-agent-config
3. 监控指标集成
Prometheus集成
yaml
# OAP Prometheus配置
prometheus-fetcher:
selector: ${SW_PROMETHEUS_FETCHER:default}
default:
active: ${SW_PROMETHEUS_FETCHER_ACTIVE:true}
# 导出指标
core:
default:
enableEndpointNameGroupingByOpenapi: true
enableDatabaseStatementGroupingByOpenapi: true
版本升级
1. 升级步骤
- 备份现有配置和数据
- 阅读新版本文档和变更说明
- 测试环境验证
- 生产环境灰度升级
- 监控升级过程
2. 兼容性说明
- Agent与OAP版本需匹配
- 配置语法可能变更
- 存储结构可能调整
总结
SkyWalking作为一款功能强大的国产APM系统,具有以下优势:
- 功能全面:覆盖链路追踪、性能监控、告警等完整APM功能
- 性能优异:低性能损耗,适合高并发场景
- 生态丰富:支持多种语言和框架
- 易于使用:安装配置简单,界面友好
- 社区活跃:持续更新,问题响应及时
建议在生产环境中根据实际需求合理配置,定期监控系统性能,及时调整优化参数,确保系统稳定高效运行。
更多推荐




所有评论(0)