Prometheus Metrics 设计的最佳实践和应用实例,看这篇够了!

Prometheus 是一个开源的监控解决方案,部署简单易使用,难点在于如何设计符合特定需求的 Metrics 去全面高效地反映系统实时状态,以助力故障问题的发现与定位。本文即基于最佳实践的 Metrics 设计方法,结合具体的场景实例——TKE 的网络组件 IPAMD 的内部监控,以个人实践经验谈一谈如何设计和实现适合的、能够更好反映系统实时状态的监控指标(Metrics)。该篇内容适于 Prometheus 或相关监控系统的初学者(可无任何基础了解),以及近期有 Prometheus 监控方案搭建和维护需求的系统开发管理者。通过这篇文章,可以加深对 Prometheus Metrics 的理解,并能针对实际的监控场景提出更好的指标(Metrics)设计。

1 引言

Prometheus 是一个开源的监控解决方案,它能够提供监控指标数据的采集、存储、查询以及监控告警等功能。作为云原生基金会(CNCF)的毕业项目,Prometheus 已经在云原生领域得到了大范围的应用,并逐渐成为了业界最流行的监控解决方案之一。

Prometheus 的部署和使用可以说是简单易上手,但是如何针对实际的问题和需求设计适宜的 Metrics 却并不是那么直接可行,反而需要优先解决暴露出来的诸多不确定问题,比如何时选用 Vector,如何设计适宜的 buckets,Summary 和 Histogram 指标类型的取舍等。然而,要想有效助力故障及问题的发现与定位,必须要有一个合理有效的 Metrics 去全面高效地反映系统实时状态。

本文将介绍基于最佳实践的 Metrics 设计方法,并结合具体的场景实例——TKE 的网络组件 IPAMD 的内部监控,以个人实践经验谈一谈如何设计和实现适合的、能够更好反映系统实时状态的监控指标(Metrics)。

本文之后的第 2 节将对 Prometheus 的 Metrics 做简单的介绍,对此已有了解的读者可跳过。之后第 3 节将介绍 Metrics 设计的最佳实践。第 4 节将结合具体的实例应用相关设计方法。第 5 节将介绍 Golang 上指标收集的实现方案。

2 Prometheus Metrics Type 简介

Prometheus Metrics 是整个监控系统的核心,所有的监控指标数据都由其记录。Prometheus 中,所有 Metrics 皆为时序数据,并以名字作区分,即每个指标收集到的样本数据包含至少三个维度的信息:名字、时刻和数值。

而 Prometheus Metrics 有四种基本的 type:

  • Counter: 只增不减的单变量
  • Gauge:可增可减的单变量
  • Histogram:多桶统计的多变量
  • Summary:聚合统计的多变量

此外,Prometheus Metrics 中有一种将样本数据以标签(Label)为维度作切分的数据类型,称为向量(Vector)。四种基本类型也都有其 Vector 类型:

  • CounterVec
  • GaugeVec
  • HistogramVec
  • SummaryVec

Vector 相当于一组同名同类型的 Metrics,以 Label 做区分。Label 可以有多个,Prometheus 实际会为每个 Label 组合创建一个 Metric。Vector 类型记录数据时需先打 Label 才能调用 Metrics 的方法记录数据。

如对于 HTTP 请求延迟这一指标,由于 HTTP 请求可在多个地域的服务器处理,且具有不同的方法,于是,可定义名为 http_request_latency_seconds 的 SummaryVec,标签有regionmethod,以此表示不同地域服务器的不同请求方法的请求延迟。

以下将对每个类型做详细的介绍。

2.1 Counter

  • 定义:是单调递增的计数器,重启时重置为0,其余时候只能增加。

  • 方法:

    type Counter interface {  Metric  Collector  // 自增1  Inc()  // 把给定值加入到计数器中. 若值小于 0 会 panic  Add(float64)}
    
  • 常测量对象:

    • 请求的数量
    • 任务完成的数量
    • 函数调用次数
    • 错误发生次数

2.2 Gauge

  • 定义:表示一个可增可减的数字变量,初值为0

  • 方法:

    type Gauge interface {  Metric  Collector  Set(float64)    // 直接设置成给定值  Inc()   // 自增1  Dec()   // 自减1  Add(float64)     // 增加给定值,可为负  Sub(float64)    // 减少给定值,可为负  // SetToCurrentTime 将 Gauge 设置成当前的 Unix 时间戳  SetToCurrentTime()}
    
  • 常测量对象:

    • 温度
    • 内存用量
    • 并发请求数

2.3 Histogram

  • 定义:Histogram 会对观测数据取样,然后将观测数据放入有数值上界的桶中,并记录各桶中数据的个数,所有数据的个数和数据数值总和。

  • 方法:

    type Histogram interface {  Metric  Collector  // Observe 将一个观测到的样本数据加入 Histogram 中,并更新相关信息  Observe(float64)}
    
  • 常测量对象:

    • 请求时延
    • 回复长度
    • …各种有样本数据
  • 0
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值