Metric 指标类型及实践

一、指标类型详解

在可观测的metrics 中定义了以下四种指标类型,每种指标类型都有其特定的设计目的(如下示例以Prometheus为例):


① Counter(计数器)

📌 定义:
  • 单调递增的指标,仅用于累加值(不能减少,除非进程重启)。

  • 通常用于表示某类事件累计发生次数

✅ 示例用途:
  • http_requests_total:累计 HTTP 请求数

  • error_count_total:累计错误数

  • jobs_completed_total:累计任务数

📊 PromQL 查询:

rate(http_requests_total[5m]) // 计算每秒请求速率 increase(error_count_total[1h]) // 一小时内增长数量

🧠 最佳实践:
  • 始终将后缀加上 _total,例如 http_requests_total

  • 使用 rate()increase() 来处理 Counter 重置(例如重启后的归零)

  • 避免将值减掉(如 gauge 减一);改用标签或多个 counter 替代


② Gauge(仪表盘值)

📌 定义:
  • 任意增减的值,表示某个瞬时状态。

  • 常用于表示某一资源的使用量或状态值。

✅ 示例用途:
  • memory_usage_bytes:当前内存使用量

  • cpu_temperature_celsius:CPU 温度

  • active_sessions:当前活跃连接数

📊 PromQL 查询:

avg_over_time(memory_usage_bytes[5m]) max(active_sessions)

🧠 最佳实践:
  • 尽量保持更新频率一致,否则瞬时值意义会偏差

  • 避免只采集初始化值或长时间不变的值

  • 可用于表示缓存大小、连接池剩余、线程数等


③ Histogram(直方图)

📌 定义:
  • 用于分布统计的指标,把观测值放进多个 桶(bucket) 中,记录:

    • 每个桶的累计计数

    • 所有观测值的总数(count

    • 所有观测值的总和(sum

✅ 示例用途:
  • http_request_duration_seconds_bucket:请求时延分布

  • payload_size_bytes_bucket:请求体大小分布

📊 PromQL 查询:

histogram_quantile(0.95, sum(rate(http_request_duration_seconds_bucket[5m])) by (le))

🧠 最佳实践:
  • 使用合理的 bucket 划分(避免过细或过宽)
    可使用默认值 prometheus.DefBuckets(线性增长)

  • bucket累加的(≤),即 le="0.5" 表示 ≤0.5 秒的总数

  • 用于计算分位数(P95、P99)或绘制延迟热图

  • 会产生多个时序(每个 bucket + label),注意 Cardinality(标签维度)控制


④ Summary(摘要)

📌 定义:
  • 用于在客户端(应用内部)直接计算分位数(quantile)

  • 同时暴露总数(count)和总和(sum

✅ 示例用途:
  • http_request_latency_seconds{quantile="0.95"}:本地估算的 P95 延迟

  • job_duration_seconds:任务耗时的摘要分布

📊 PromQL 查询:

http_request_latency_seconds{quantile="0.99"}

🧠 最佳实践:
  • 适用于 单实例本地分位估算,但不适合跨实例聚合

  • 避免与 histogram_quantile() 混用理解

  • 通常用于对时间敏感的本地性能指标

  • 不推荐用于全局 SLO,使用 Histogram 更易聚合


🛠 二、Java + Micrometer 使用建议(Spring Boot)

Micrometer 是 Spring Boot 的监控抽象层,支持向 Prometheus 推送指标。

@Autowired MeterRegistry registry; 
// Counter 示例 
Counter requests = registry.counter("http_requests_total", "method", "GET"); requests.increment(); 
// Gauge 示例(注册时要提供值的 Supplier) 
registry.gauge("cache_size", cacheMap, Map::size); 
// Histogram 示例 
Timer timer = registry.timer("http_request_duration_seconds"); 
timer.record(() -> { // 执行耗时操作 });

Micrometer 默认将 Timer 类型映射为 Prometheus 的 Histogram,并自动生成 _bucket_count_sum 后缀指标。


🧪 三、实际场景推荐

场景推荐类型理由说明
统计请求量、任务数、错误数Counter只增不减,便于速率分析和报警
监控内存、线程、连接数等资源使用Gauge快照型状态值,便于展示和阈值报警
评估延迟分布、响应时间等Histogram可用 histogram_quantile() 聚合计算 SLO
单点延迟监控(如网关、本地调用)Summary本地估算分位值精度高,但不宜用于多实例场景聚合


📚 官方资源推荐

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

fire-flyer

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值