写点什么

详细解读 Prometheus 四种指标类型

  • 2020-05-16
  • 本文字数:3951 字

    阅读完需:约 13 分钟

详细解读Prometheus四种指标类型

Prometheus 的客户端库中提供了四种核心的指标类型。但这些类型只是在客户端库(客户端可以根据不同的数据类型调用不同的 API 接口)和在线协议中,实际在 Prometheus server 中并不对指标类型进行区分,而是简单地把这些指标统一视为无类型的时间序列。不过,将来我们会努力改变这一现状的。

Counter(计数器)

Counter 类型代表一种样本数据单调递增的指标,即只增不减,除非监控系统发生了重置。例如,你可以使用 counter 类型的指标来表示服务的请求数、已完成的任务数、错误发生的次数等。counter 主要有两个方法:


//将counter值加1.Inc()// 将指定值加到counter值上,如果指定值<0 会panic.Add(float64)
复制代码


Counter 类型数据可以让用户方便的了解事件产生的速率的变化,在 PromQL 内置的相关操作函数可以提供相应的分析,比如以 HTTP 应用请求量来进行说明:


//通过rate()函数获取HTTP请求量的增长率rate(http_requests_total[5m])//查询当前系统中,访问量前10的HTTP地址topk(10, http_requests_total)
复制代码


不要将 counter 类型应用于样本数据非单调递增的指标,例如:当前运行的进程数量(应该用 Guage 类型)。


不同语言关于 Counter 的客户端库使用文档:


Guage(仪表盘)

Guage 类型代表一种样本数据可以任意变化的指标,即可增可减。guage 通常用于像温度或者内存使用率这种指标数据,也可以表示能随时增加或减少的“总数”,例如:当前并发请求的数量。


对于 Gauge 类型的监控指标,通过 PromQL 内置函数 delta() 可以获取样本在一段时间内的变化情况,例如,计算 CPU 温度在两小时内的差异:


dalta(cpu_temp_celsius{host="zeus"}[2h])
复制代码


你还可以通过 PromQL 内置函数 predict_linear() 基于简单线性回归的方式,对样本数据的变化趋势做出预测。例如,基于 2 小时的样本数据,来预测主机可用磁盘空间在 4 个小时之后的剩余情况:


predict_linear(node_filesystem_free{job="node"}[2h], 4 * 3600) < 0
复制代码


不同语言关于 Guage 的客户端库使用文档:


Histogram(直方图)

在大多数情况下人们都倾向于使用某些量化指标的平均值,例如 CPU 的平均使用率、页面的平均响应时间。这种方式的问题很明显,以系统 API 调用的平均响应时间为例:如果大多数 API 请求都维持在 100ms 的响应时间范围内,而个别请求的响应时间需要 5s,那么就会导致某些 WEB 页面的响应时间落到中位数的情况,而这种现象被称为 长尾问题


为了区分是平均的慢还是长尾的慢,最简单的方式就是按照请求延迟的范围进行分组。例如,统计延迟在 0~10ms 之间的请求数有多少而 10~20ms 之间的请求数又有多少。通过这种方式可以快速分析系统慢的原因。Histogram 和 Summary 都是为了能够解决这样问题的存在,通过 Histogram 和 Summary 类型的监控指标,我们可以快速了解监控样本的分布情况。


Histogram 在一段时间范围内对数据进行采样(通常是请求持续时间或响应大小等),并将其计入可配置的存储桶(bucket)中,后续可通过指定区间筛选样本,也可以统计样本总数,最后一般将数据展示为直方图。


Histogram 类型的样本会提供三种指标(假设指标名称为 <basename>):


  • 样本的值分布在 bucket 中的数量,命名为 _bucket{le="<上边界>"}。解释得更通俗易懂一点,这个值表示指标值小于等于上边界的所有样本数量。


 // 在总共2次请求当中。http 请求响应时间 <=0.005 秒 的请求次数为0 io_namespace_http_requests_latency_seconds_histogram_bucket{path="/",method="GET",code="200",le="0.005",} 0.0 // 在总共2次请求当中。http 请求响应时间 <=0.01 秒 的请求次数为0 io_namespace_http_requests_latency_seconds_histogram_bucket{path="/",method="GET",code="200",le="0.01",} 0.0 // 在总共2次请求当中。http 请求响应时间 <=0.025 秒 的请求次数为0 io_namespace_http_requests_latency_seconds_histogram_bucket{path="/",method="GET",code="200",le="0.025",} 0.0 io_namespace_http_requests_latency_seconds_histogram_bucket{path="/",method="GET",code="200",le="0.05",} 0.0 io_namespace_http_requests_latency_seconds_histogram_bucket{path="/",method="GET",code="200",le="0.075",} 0.0 io_namespace_http_requests_latency_seconds_histogram_bucket{path="/",method="GET",code="200",le="0.1",} 0.0 io_namespace_http_requests_latency_seconds_histogram_bucket{path="/",method="GET",code="200",le="0.25",} 0.0 io_namespace_http_requests_latency_seconds_histogram_bucket{path="/",method="GET",code="200",le="0.5",} 0.0 io_namespace_http_requests_latency_seconds_histogram_bucket{path="/",method="GET",code="200",le="0.75",} 0.0 io_namespace_http_requests_latency_seconds_histogram_bucket{path="/",method="GET",code="200",le="1.0",} 0.0 io_namespace_http_requests_latency_seconds_histogram_bucket{path="/",method="GET",code="200",le="2.5",} 0.0 io_namespace_http_requests_latency_seconds_histogram_bucket{path="/",method="GET",code="200",le="5.0",} 0.0 io_namespace_http_requests_latency_seconds_histogram_bucket{path="/",method="GET",code="200",le="7.5",} 2.0 // 在总共2次请求当中。http 请求响应时间 <=10 秒 的请求次数为 2 io_namespace_http_requests_latency_seconds_histogram_bucket{path="/",method="GET",code="200",le="10.0",} 2.0 io_namespace_http_requests_latency_seconds_histogram_bucket{path="/",method="GET",code="200",le="+Inf",} 2.0
复制代码


  • 所有样本值的大小总和,命名为<basename>_sum。


 // 实际含义:发生的2次 http 请求总的响应时间为 13.107670803000001 秒 io_namespace_http_requests_latency_seconds_histogram_sum{path="/",method="GET",code="200",} 13.107670803000001
复制代码


  • 样本总数,命名为<basename>_count。值和 <basename>_bucket{le="+Inf"}相同。


 // 实际含义:当前一共发生了 2 次 http 请求 io_namespace_http_requests_latency_seconds_histogram_count{path="/",method="GET",code="200",} 2.0
复制代码


可以通过 histogram_quantile() 函数来计算 Histogram 类型样本的分位数。分位数可能不太好理解,我举个例子,假设你要计算样本的 9 分位数(quantile=0.9),即表示 90% 的样本的值。Histogram 还可以用来计算应用性能指标值(Apdex score)。


不同语言关于 Histogram 的客户端库使用文档:


Summary(摘要)

与 Histogram 类型类似,用于表示一段时间内的数据采样结果(通常是请求持续时间或响应大小等),但它直接存储了分位数(通过客户端计算,然后展示出来),而不是通过区间来计算。


Summary 类型的样本也会提供三种指标(假设指标名称为 ):


  • 样本值的分位数分布情况,命名为 <basename>{quantile="<φ>"}。


 // 含义:这 12 次 http 请求中有 50% 的请求响应时间是 3.052404983s io_namespace_http_requests_latency_seconds_summary{path="/",method="GET",code="200",quantile="0.5",} 3.052404983 // 含义:这 12 次 http 请求中有 90% 的请求响应时间是 8.003261666s io_namespace_http_requests_latency_seconds_summary{path="/",method="GET",code="200",quantile="0.9",} 8.003261666
复制代码


  • 所有样本值的大小总和,命名为 <basename>_sum。


 // 含义:这12次 http 请求的总响应时间为 51.029495508s io_namespace_http_requests_latency_seconds_summary_sum{path="/",method="GET",code="200",} 51.029495508
复制代码


  • 样本总数,命名为 <basename>_count。


 // 含义:当前一共发生了 12 次 http 请求 io_namespace_http_requests_latency_seconds_summary_count{path="/",method="GET",code="200",} 12.0
复制代码


现在可以总结一下 Histogram 与 Summary 的异同:


  • 它们都包含了 <basename>_sum 和 <basename>_count 指标

  • Histogram 需要通过 <basename>_bucket 来计算分位数,而 Summary 则直接存储了分位数的值。


关于 Summary 与 Histogram 的详细用法,请参考:


https://prometheus.io/docs/practices/histograms/


不同语言关于 Summary 的客户端库使用文档:



原文链接:

https://prometheus.io/docs/concepts/metric_types/


2020-05-16 17:168973

评论

发布
暂无评论
发现更多内容

Java集合与数据类型

kingcall

Java JAVA集合 Java集合框架 java数据类型

信用卡评测系列——阳光惠生活APP深化服务客户品牌理念,焕新升级7.0版

易观分析

金融 银行 信用卡

解决数据分析落地难的几点经验

穿过生命散发芬芳

数据分析 11月月更

算法题学习---删除有序链表中重复的元素-II

桑榆

算法题 11月月更

SpringBoot之用拦截器避免重复请求

okokabcd

Spring Boot

redis 集群实现方案与原理

想要飞的猪

redis哨兵集群 redid集群cluster

低代码会使初级码农失业吗

秃头也爱科技

浅谈中小企业进军新媒体行业为何屡次遭受挫败

石头IT视角

jvm(三)类加载机制、javac编译

想要飞的猪

JVM类加载

【Ajax】全面详细了解git的基础操作【万字教学+面试常客】

坚毅的小解同志

git 11月月更

2022-11-21:第N高的薪水。表结构和数据的sql语句如下。请问sql语句如何写? DROP TABLE IF EXISTS employee; CREATE TABLE employee (

福大大架构师每日一题

数据库 sql 福大大

Alluxio 2.9新版发布 | 重塑架构,支持大规模多租户环境

Alluxio

分布式 新闻 Alluxio 大数据 开源 数据编排

跨平台桌面应用开发都有哪些主流框架

FinFish

小程序 跨端框架 桌面端开发 跨端应用开发

DHCP 服务

我叫于豆豆吖.

11月月更

鸿蒙系统ARKUI框架对于分布式计算和请求API的实战研究

恒山其若陋兮

前端 11月月更

第二章STP应用配置

初学者

网络 11月月更

华为云企业交换机ESW,让数据业务无缝迁移上云

爱科技的水月

华为云Astro的前世今生:用7年时间革新低代码开发观念

科技怪授

分布式监控平台 WGCLOUD v3.4.2 节流 30%,更轻更快

王逅逅

Linux 信创 zabbix Prometheus #运维 性能监测

部署RDS 服务

我叫于豆豆吖.

11月月更

前端食堂技术周刊第 60 期:TypeScript 4.9、Ant Design 5.0、用 vanilla-extract 编写高性能的 CSS、Node.js 安全最佳实践

童欧巴

数据仓库实战教程

kingcall

数据仓库 数据湖 数据安全 数仓 数仓建模

真正的按需计费-函数工作流 FunctionGraph实战,5分钟搭建图片压缩应用

秃头也爱科技

2022年中国电商平台市场洞察

易观分析

电商 报告

API安全设计5A原则

阿泽🧸

11月月更 API安全

WSUS 服务

我叫于豆豆吖.

11月月更

【愚公系列】2022年11月 微信小程序-应用生命周期和全局变量

愚公搬代码

11月月更

ArkUI框架基于鸿蒙系统的Scroll和Scroller和自定义组件之插槽的实战案例心得

恒山其若陋兮

前端 11月月更

MACH架构的质量工程指南

俞凡

架构 微服务 云原生

【C语言】register 关键字

謓泽

11月月更

Linux 系统启动过程

芯动大师

Linux Linux驱动 11月月更

详细解读Prometheus四种指标类型_文化 & 方法_Rancher_InfoQ精选文章