QCon 演讲火热征集中,快来分享技术实践与洞见! 了解详情
写点什么

详细解读 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:169093

评论

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

写给 Java 程序员的前端 Promise 教程

江南一点雨

Java spring 前端 springboot Promise

海外邮件发送指南(一)

极光JIGUANG

消息推送 邮件 SendCloud

SpringMVC(一、快速入门)

开源 springmvc 8月月更

C++面向对象友元,全局函数、类、成员函数做友元

CtrlX

8月月更

IT故障快速解决就用行云管家!快速安全!

行云管家

运维 IT运维 行云管家

Docker到底是什么,能干什么?这一篇文章全部给你解释清楚了

Java永远的神

Java Docker 程序员 面试 云原生

华为云弹性云服务器ECS使用【华为云至简致远】

IT资讯搬运工

弹性云服务器ECS

跟我一起了解云耀云服务器HECS【华为云至简致远】

IT资讯搬运工

云服务器

直播卖货APP——为何能得到商家和用户的喜欢?

开源直播系统源码

软件开发 语聊房 直播系统 直播源码

结合“xPlus”探讨软件架构的创新与变革

BizFree

敏捷开发 软件架构 数字化 信息化 软件定制

RT-Thread记录(三、RT-Thread 线程操作函数及线程管理与FreeRTOS的比较)

矜辰所致

RTT RT-Thread 8月月更 线程操作

游戏开发常遇到数据一致性BUG,怎么解?

华为云开发者联盟

数据库 后端 游戏开发

Arco Vue + Flask 手把手实战开发一测试需求平台

MegaQi

测试平台开发教程 签约计划第三季 8月月更

一名合格的程序员是如何优雅地解决线上问题的?

程序员小毕

Java 程序员 架构 程序人生 后端

【Redis】redis安装与客户端redis-cli的使用(批量操作)

石臻臻的杂货铺

redis' 8月月更

面试官:Redis 大 key 要如何处理?

Java永远的神

Java 数据库 redis 程序员 面试

电商秒杀系统架构设计

泋清

#架构训练营

开源一夏 | 自己画一块ESP32-C3 的开发板(PCB到手)

矜辰所致

开源 硬件设计 8月月更 ESP32-C3

leetcode 155. Min Stack最小栈(中等)

okokabcd

LeetCode 数据结构与算法 栈和队列

国产堡垒机品牌哪家好?功能有哪些?咨询电话多少?

行云管家

运维 堡垒机 运维审计 国产堡垒机 堡垒机品牌

客户案例 | 提高银行信用卡客户贡献率

易观分析

金融 银行 分析 客户

从零开始,如何拥有自己的博客网站【华为云至简致远】

IT资讯搬运工

linux 文件权限控制

云原生系列五:Kafka 集群数据迁移基于Kubernetes的内部

叶秋学长

kafka 开源 Kubernetes 8月月更

设计一个跨平台的即时通讯系统(采用华为云ECS服务器作为服务端 )【华为云至简致远】

IT资讯搬运工

云服务器ECS

再迎巅峰!阿里爆款分布式小册开源5天Github已73K

冉然学Java

架构 分布式 微服务 java; 编程、

【Redis】位图以及位图的使用场景(统计在线人数和用户在线状态)

石臻臻的杂货铺

redis' 8月月更

手把手教你设计一个全局异常处理器

了不起的程序猿

java程序员 异常处理 java 编程 spring-boot

转转商品系统高并发实战(数据篇)

转转技术团队

分布式 高并发

STM32的内存管理相关(内存架构,内存管理,map文件分析)

矜辰所致

内存 stm32 Flash 8月月更

开源一夏 | 使用 JavaScript 和 CSS 做一个图片转 PDF 的转换器

海拥(haiyong.site)

JavaScript 开源 前端 8月月更

看到这个应用上下线方式,不禁感叹:优雅,太优雅了!

华为云开发者联盟

云计算 开发 CCE

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