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 性能优化实战指南