Skip to content
清晨的一缕阳光
返回

SkyWalking 性能指标监控

SkyWalking 性能指标监控

指标监控架构

指标类型

SkyWalking 收集以下类型的性能指标:

服务指标:

JVM 指标:

数据库指标:

消息队列指标:

数据流

┌─────────────────┐
│   Agent 采集    │
│  (指标 + 链路)   │
└────────┬────────┘
         │
         ▼
┌─────────────────┐
│   OAP Server    │
│  (聚合 + 分析)   │
└────────┬────────┘
         │
         ▼
┌─────────────────┐
│   存储引擎      │
│  (ES/MySQL)     │
└────────┬────────┘
         │
         ▼
┌─────────────────┐
│     UI 展示     │
│  (仪表盘 + 告警) │
└─────────────────┘

服务指标监控

1. 基础指标

SkyWalking 自动收集以下服务指标:

QPS 指标:

service_cpm - 服务每分钟调用次数
service_sla - 服务成功率

响应时间指标:

service_resp_time - 平均响应时间
service_p50 - P50 响应时间
service_p75 - P75 响应时间
service_p90 - P90 响应时间
service_p95 - P95 响应时间
service_p99 - P99 响应时间

查看方式:

2. 服务拓扑

服务依赖图:

实例依赖图:

3. 端点分析

Endpoint 指标:

endpoint_cpm - 端点每分钟调用次数
endpoint_resp_time - 端点响应时间
endpoint_sla - 端点成功率

慢端点分析:

示例查询:

query queryTopNEndpoint($duration: Duration!, $topN: Int!) {
  readTopNEndpoint(duration: $duration, topN: $topN, order: DES) {
    id
    name
    value
  }
}

JVM 指标监控

1. 内存指标

堆内存:

jvm_memory_used - 堆内存使用量
jvm_memory_max - 堆内存最大值
jvm_memory_committed - 堆内存分配量

# 分区域
jvm_memory_pool_used - 各内存池使用量
  - Eden Space
  - Survivor Space
  - Old Gen
  - Metaspace

内存使用率计算:

内存使用率 = jvm_memory_used / jvm_memory_max * 100%

告警阈值:

2. GC 指标

GC 次数:

jvm_gc_count - GC 总次数
jvm_gc_young_count - Young GC 次数
jvm_gc_old_count - Old GC 次数

GC 时间:

jvm_gc_time - GC 总时间(毫秒)
jvm_gc_young_time - Young GC 时间
jvm_gc_old_time - Old GC 时间

GC 频率分析:

GC 频率 = jvm_gc_count / 时间窗口

告警阈值:

3. 线程指标

线程数:

jvm_thread_count - 活跃线程数
jvm_daemon_thread_count - 守护线程数

线程状态:

jvm_thread_runnable - 运行中线程
jvm_thread_blocked - 阻塞线程
jvm_thread_waiting - 等待线程
jvm_thread_timed_waiting - 超时等待线程

告警阈值:

4. 类加载指标

类加载数:

jvm_class_loaded_count - 已加载类数
jvm_class_total_loaded_count - 累计加载类数
jvm_class_unloaded_count - 已卸载类数

数据库指标监控

1. SQL 执行指标

执行次数:

database_cpm - 数据库每分钟调用次数

执行时间:

database_resp_time - 平均响应时间
database_p90 - P90 响应时间

慢 SQL 统计:

database_slow_query_count - 慢查询次数

2. SQL 分析

慢 SQL 排行:

SQL 语句分析:

-- 查看慢 SQL
SELECT service_name, statement, avg_resp_time, count
FROM slow_query
WHERE time >= now() - interval '1 hour'
ORDER BY avg_resp_time DESC
LIMIT 10;

执行计划分析:

3. 连接池指标

HikariCP:

hikaricp_connections - 总连接数
hikaricp_active_connections - 活跃连接数
hikaricp_idle_connections - 空闲连接数
hikaricp_pending_threads - 等待线程数

Druid:

druid_active_count - 活跃连接数
druid_pooling_count - 池中连接数
druid_wait_thread_count - 等待线程数

告警阈值:

缓存指标监控

1. Redis 指标

命令执行:

redis_commands_per_sec - 每秒命令数
redis_resp_time - 响应时间

内存使用:

redis_used_memory - 已用内存
redis_max_memory - 最大内存

连接数:

redis_connected_clients - 连接客户端数

命中率:

hit_rate = keyspace_hits / (keyspace_hits + keyspace_misses)

2. 本地缓存指标

Caffeine:

caffeine_cache_size - 缓存大小
caffeine_hit_count - 命中次数
caffeine_miss_count - 未命中次数
caffeine_eviction_count - 淘汰次数

命中率计算:

hit_rate = hit_count / (hit_count + miss_count)

消息队列指标

1. Kafka 指标

生产指标:

kafka_produce_rate - 生产速率
kafka_produce_latency - 生产延迟

消费指标:

kafka_consume_rate - 消费速率
kafka_consume_latency - 消费延迟
kafka_lag - 消费积压

Topic 指标:

kafka_topic_partitions - 分区数
kafka_topic_replicas - 副本数

2. RocketMQ 指标

生产指标:

rocketmq_tps - 生产 TPS
rocketmq_latency - 生产延迟

消费指标:

rocketmq_consume_tps - 消费 TPS
rocketmq_consume_latency - 消费延迟
rocketmq_message_accumulation - 消息积压

自定义指标

1. 业务指标

订单指标:

@Component
public class OrderMetrics {
    
    @Autowired
    private MeterRegistry meterRegistry;
    
    private Counter orderCreated;
    private Counter orderFailed;
    private Timer orderProcessTime;
    
    @PostConstruct
    public void init() {
        orderCreated = Counter.builder("order.created")
            .description("订单创建数")
            .register(meterRegistry);
        
        orderFailed = Counter.builder("order.failed")
            .description("订单失败数")
            .register(meterRegistry);
        
        orderProcessTime = Timer.builder("order.process.time")
            .description("订单处理时间")
            .publishPercentileHistogram()
            .register(meterRegistry);
    }
    
    public void recordOrderCreated() {
        orderCreated.increment();
    }
    
    public void recordOrderFailed() {
        orderFailed.increment();
    }
    
    public <T> T recordProcess(Supplier<T> supplier) {
        return orderProcessTime.recordSupplier(supplier);
    }
}

2. 指标上报

通过 Micrometer 上报:

management:
  metrics:
    export:
      prometheus:
        enabled: true
    tags:
      application: ${spring.application.name}
      instance: ${spring.cloud.client.ip-address}

SkyWalking 接收:

# oap/application.yml
receiver-sharing-server:
  default:
    receiverHost: ${SW_RECEIVER_GRPC_HOST:"0.0.0.0"}
    receiverPort: ${SW_RECEIVER_GRPC_PORT:11800}

仪表盘配置

1. 服务仪表盘

{
  "configuration": {
    "name": "服务监控",
    "description": "服务核心指标监控"
  },
  "components": [
    {
      "type": "LineChart",
      "title": "QPS 趋势",
      "metrics": ["service_cpm"],
      "duration": "LAST_HOUR"
    },
    {
      "type": "LineChart",
      "title": "响应时间",
      "metrics": ["service_resp_time", "service_p90", "service_p95"],
      "duration": "LAST_HOUR"
    },
    {
      "type": "Gauge",
      "title": "成功率",
      "metrics": ["service_sla"],
      "threshold": 99
    }
  ]
}

2. JVM 仪表盘

{
  "configuration": {
    "name": "JVM 监控",
    "description": "JVM 核心指标监控"
  },
  "components": [
    {
      "type": "LineChart",
      "title": "堆内存使用",
      "metrics": ["jvm_memory_used"],
      "duration": "LAST_HOUR"
    },
    {
      "type": "LineChart",
      "title": "GC 次数",
      "metrics": ["jvm_gc_count"],
      "duration": "LAST_HOUR"
    },
    {
      "type": "Table",
      "title": "线程状态",
      "metrics": [
        "jvm_thread_runnable",
        "jvm_thread_blocked",
        "jvm_thread_waiting"
      ]
    }
  ]
}

3. 数据库仪表盘

{
  "configuration": {
    "name": "数据库监控",
    "description": "数据库性能指标监控"
  },
  "components": [
    {
      "type": "LineChart",
      "title": "SQL 执行时间",
      "metrics": ["database_resp_time"],
      "duration": "LAST_HOUR"
    },
    {
      "type": "Table",
      "title": "慢 SQL 排行",
      "query": "SELECT * FROM slow_query ORDER BY avg_time DESC LIMIT 10"
    },
    {
      "type": "Gauge",
      "title": "连接池使用率",
      "metrics": ["hikaricp_active_connections"]
    }
  ]
}

告警配置

1. 服务告警

# 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} 响应时间超过 1 秒
  
  # 服务成功率告警
  service_sla_rule:
    metrics-name: service_sla
    op: "<"
    threshold: 99
    period: 10
    count: 2
    silence-period: 5
    message: 服务 {name} 成功率低于 99%

2. JVM 告警

rules:
  # 内存使用率告警
  jvm_memory_rule:
    metrics-name: jvm_memory_used
    op: ">"
    threshold: 85
    period: 5
    count: 2
    silence-period: 10
    message: JVM 内存使用率超过 85%
  
  # GC 时间告警
  jvm_gc_time_rule:
    metrics-name: jvm_gc_time
    op: ">"
    threshold: 1000
    period: 5
    count: 3
    silence-period: 5
    message: GC 时间超过 1 秒

3. 数据库告警

rules:
  # 慢 SQL 告警
  database_slow_query_rule:
    metrics-name: database_resp_time
    op: ">"
    threshold: 500
    period: 5
    count: 5
    silence-period: 5
    message: 数据库响应时间超过 500ms
  
  # 连接池告警
  connection_pool_rule:
    metrics-name: hikaricp_active_connections
    op: ">"
    threshold: 80
    period: 5
    count: 2
    silence-period: 10
    message: 连接池使用率超过 80%

性能分析

1. 性能趋势分析

同比分析:

环比分析:

2. 性能瓶颈定位

调用链分析:

数据库分析:

JVM 分析:

3. 容量规划

趋势预测:

压力测试:

最佳实践

1. 指标选择

关键指标:

辅助指标:

2. 告警优化

告警分级:

告警降噪:

3. 性能优化

定期分析:

持续改进:

总结

SkyWalking 提供丰富的性能指标监控功能,涵盖服务、JVM、数据库、消息队列等各个方面。

通过合理的指标选择和告警配置,可以全面了解系统运行状态,及时发现和处理性能问题。

建立完善的性能分析机制,定期 review 性能指标,持续优化系统性能。


分享这篇文章到:

上一篇文章
Spring Boot 参数校验实战
下一篇文章
MySQL 性能优化实战指南