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类型
  1. Entry Span:服务入口Span
  2. Local Span:本地方法Span
  3. 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
数据不显示
  1. 检查Agent配置是否正确
  2. 确认OAP服务正常运行
  3. 验证存储服务(如ES)状态
  4. 检查采样率配置
性能问题
  1. 调整缓冲区大小
  2. 优化采样策略
  3. 检查网络延迟
  4. 监控存储性能

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. 升级步骤

  1. 备份现有配置和数据
  2. 阅读新版本文档和变更说明
  3. 测试环境验证
  4. 生产环境灰度升级
  5. 监控升级过程

2. 兼容性说明

  • Agent与OAP版本需匹配
  • 配置语法可能变更
  • 存储结构可能调整

总结

SkyWalking作为一款功能强大的国产APM系统,具有以下优势:

  1. 功能全面:覆盖链路追踪、性能监控、告警等完整APM功能
  2. 性能优异:低性能损耗,适合高并发场景
  3. 生态丰富:支持多种语言和框架
  4. 易于使用:安装配置简单,界面友好
  5. 社区活跃:持续更新,问题响应及时

建议在生产环境中根据实际需求合理配置,定期监控系统性能,及时调整优化参数,确保系统稳定高效运行。

Logo

汇聚全球AI编程工具,助力开发者即刻编程。

更多推荐