Prometheus的4种metrics(指标)类型:

  • Counter
  • Gauge
  • Histogram
  • Summary

四种指标类型的数据对象都是数字,如果要监控文本类的信息只能通过指标名称或者 label 来呈现,在 zabbix 一类的监控中指标类型本身支持 Log 和文本,当然在这里我们不是要讨论 Prometheus 的局限性,而是要看一看 Prometheus 是如何把数字玩出花活的。 Counter 与 Gauge 比较好理解,我们简单的过一下 然后主要关注 Histogram 和 Summary

Counter 与 Gauge


Counter

单调递增的计数器。

例如 Prometheus自身 中 metrics 的 http 请求总数

Gauge

仪表,也可以认为是一种计数器,不过支持加和减。

例如 node 中的负载数据

Histogram 与 Summary


Histogram

直方图常用于请求持续时间或者响应大小采样,然后将结果记录到存储桶(bucket),每个桶为累加数据。

通过三个metrics名称来完整暴露一组Histogram

  • 桶累积计数器,<basename>_bucket{le="<upper inclusive bound>"}
  • 所有观察值的总和,<basename>_sum
  • 已观察到的事件计数,<basename>_count与上述相同<basename>_bucket{le="+Inf"}

例如K8s中pod启动耗时:

kubelet_pod_start_duration_seconds_bucket
kubelet_pod_start_duration_seconds_count #进行过pod start的数量
kubelet_pod_start_duration_seconds_sum # 总耗时

具体到某个节点中

le:小于等于。例如le=”5“,即pod启动耗时<=5s的有87次

+inf:无穷。当启动耗时为无穷时,也就是节点下pod启动过的数量,与kubelet_pod_start_duration_seconds_count相等

通过grafana 中 Bar gauge呈现桶的分布如下:

有了直方图数据后我们可以做相应的比例计算:

计算pod启动耗时大于1s,小于2.5s的次数

#kubelet_pod_start_duration_seconds_bucket{ instance="node4.**.com",le="2.5"} - ignoring(le) kubelet_pod_start_duration_seconds_bucket{ instance="node4.**.com",le="1"}
9

计算pod启动耗时大于2.5s的比例

#kubelet_pod_start_duration_seconds_bucket{ instance="node4.**.com",le="2.5"} / ignoring(le) kubelet_pod_start_duration_seconds_bucket{ instance="node4.**.com",le="+Inf"}
0.875

使用 PromQL 函数histogram_quantile计算百分位

#histogram_quantile(0.80,kubelet_pod_start_duration_seconds_bucket{ instance="node4.**.com"} )
1.3000000000000018

即80%的pod启动次数中,耗时<=1.3s,histogram_quantile函数计算百分位得到是一个近似值。

通过histogram_quantile函数聚合

计算Prometheus http所有请求中80百分位的值

histogram_quantile(0.8, sum(rate(prometheus_http_request_duration_seconds_bucket[5m])) by (le))

即80%的请求响应时间<=0.08s

通过histogram计算网站性能指标 - Apdex指数

Apdex 指数 =( 满意数量 + 0.5 * 可容忍数量 ) / 总样本数,假设请求满意时间为0.3s,则可容忍时间为1.2s(4倍)

(
sum(rate(http_request_duration_seconds_bucket{le="0.3"}[5m])) by (job)
+
sum(rate(http_request_duration_seconds_bucket{le="1.2"}[5m])) by (job)
) / 2 / sum(rate(http_request_duration_seconds_count[5m])) by (job)
Summary

Summary与Histogram相似,也是通过三个metrics名称来完整暴露一组Summary,不过Summary是直接在客户端帮我们计算出了百分位数(Histogram 则使用上面提到的histogram_quantile函数计算)

  • φ 分位数(0 ≤ φ ≤ 1),<basename>{quantile="<φ>"}
  • 所有观察值的总和,<basename>_sum
  • 已观察到的事件计数,<basename>_count

例如cgroup操作延迟:

kubelet_cgroup_manager_latency_microseconds
kubelet_cgroup_manager_latency_microseconds_sum
kubelet_cgroup_manager_latency_microseconds_count

Summary和Histogram都可以使用rate函数计算平均数

计算cgroup update操作的平均延迟:

rate(kubelet_cgroup_manager_latency_microseconds_sum{ instance="node4.**.com",operation_type="update"}[10m]) / rate(kubelet_cgroup_manager_latency_microseconds_count{ instance="node4.**.com",operation_type="update"}[10m])

最后我们对比一下Summary与Histogram

Histogram Summary
配置要求 选择符合预期观测值范围(le)的存储桶 选择所需的分位数φ和窗口范围,其他φ无法再被计算
客户端性能影响 低,仅需增加计数器 高,在客户端计算分位数
服务端性能影响 高,服务端需计算分位数 服务端成本低
时间序列的数量(除了_sum_count序列) 每添加一个存储桶增加一个时间序列 每添加一个分位数φ 值增加一个时间序列
分位数误差 受限于相关桶的宽度 误差在 φ 值的限制
φ分位数和窗口范围 取决于histogram_quantile函数中φ 由客户端预先添加
聚合 histogram_quantile函数聚合 不聚合

通过博客阅读:iqsing.github.io

参考:

HISTOGRAMS AND SUMMARIES

Prometheus metric_types

Prometheus 四种metric类型的更多相关文章

  1. MySQL表的四种分区类型

    MySQL表的四种分区类型 一.什么是表分区 通俗地讲表分区是将一大表,根据条件分割成若干个小表.mysql5.1开始支持数据表分区了. 如:某用户表的记录超过了600万条,那么就可以根据入库日期将表 ...

  2. C++中四种转换类型的区别

    一.四种转换类型比较: 类型转换有c风格的,当然还有c++风格的.c风格的转换的格式很简单(TYPE)EXPRESSION,但是c风格的类型转换有不少的缺点,有的时候用c风格的转换是不合适的,因为它可 ...

  3. RabbitMQ四种交换机类型介绍

    RabbitMQ  原文地址: https://baijiahao.baidu.com/s?id=1577456875919174629&wfr=spider&for=pc 最新版本的 ...

  4. ASP.NET MVC中有四种过滤器类型

    在ASP.NET MVC中有四种过滤器类型

  5. python 四种数值类型(int,long,float,complex)介绍

    Python支持四种不同的数值类型,包括int(整数)long(长整数)float(浮点实际值)complex (复数),本文章向码农介绍python 四种数值类型,需要的朋友可以参考一下. 数字数据 ...

  6. Delphi中定义了四种布尔类型:Boolean,ByteBool,WordBool和LongBool。后面三种布尔类型是为了与其他语言兼容而引入的

    bool是LongBool类型. Delphi中定义了四种布尔类型:Boolean,ByteBool,WordBool和LongBool.后面三种布尔类型是为了与其他语言兼容而引入的,一般情况下建议使 ...

  7. JDBC 学习笔记(二)—— 详解 JDBC 的四种驱动类型

    JDBC 有四种驱动类型,分别是: JDBC-ODBC 桥(JDBC-ODBC bridge driver plus ODBC driver) 本地 API 驱动(Native-API partly ...

  8. MySQL有四种BLOB类型

    先说明一下Blob的类型,直接从网上摘抄了!!!1.MySQL有四种BLOB类型: ·tinyblob:仅255个字符 ·blob:最大限制到65K字节 ·mediumblob:限制到16M字节 ·l ...

  9. java gRPC四种服务类型简单示例

    一.gRPC 简介 gRPC 是Go实现的:一个高性能,开源,将移动和HTTP/2放在首位通用的RPC框架.使用gRPC可以在客户端调用不同机器上的服务端的方法,而客户端和服务端的开发语言和 运行环境 ...

随机推荐

  1. JS实现列表移动(通过DOM操作select标签)

    JS小例题 学习内容: 需求 总结: 学习内容: 需求 用 JavaScript 实现 select 标签的移动 实现代码 <!DOCTYPE html PUBLIC "-//W3C/ ...

  2. 如丝般顺滑:DDD再实践之类目树管理

    在上次反思DDD实践之后,在类目树管理项目中再次实践DDD.从需求分析到建模和具体的落地,结合个人体会,都是干货.

  3. ASP.NET Core WebApi返回结果统一包装实践

    前言 近期在重新搭建一套基于ASP.NET Core WebAPI的框架,这其中确实带来了不少的收获,毕竟当你想搭建一套框架的时候,你总会不自觉的去想,如何让这套框架变得更完善一点更好用一点.其中在关 ...

  4. ionic系列教程 2 ---- 安装

    开发平台注意点首先,我们需要注意构建Ionic App需要的最低配置:Ionic只支持iOS6 +和Android 4.0 + ,(虽然2.3可以工作,但会有点卡).但是,Android设备众多,可能 ...

  5. php个人博客搭建第二阶段②

    网站正文部分:热门博客的推荐: html代码: <!-- 网站正文部分 -->     <div class="content">         < ...

  6. Apache Doris Oracle ODBC外表使用指南

    1.软件环境 操作系统:ubuntu 18.04 Apache Doris :0.15 Postgresql数据库:oracle 19c UnixODBC:2.3.4 Oracle ODBC :ins ...

  7. Python图像处理丨OpenCV+Numpy库读取与修改像素

    摘要:本篇文章主要讲解 OpenCV+Numpy 图像处理基础知识,包括读取像素和修改像素. 本文分享自华为云社区<[Python图像处理] 二.OpenCV+Numpy库读取与修改像素> ...

  8. 【CSAPP】Cache Lab 实验笔记

    cachelab这节先让你实现个高速缓存模拟器,再在此基础上对矩阵转置函数进行优化,降低高速缓存不命中次数.我的感受如上一节,实在是不想研究这些犄角旮旯的优化策略了. 前期准备 我实验的时候用到了va ...

  9. [题解] [LOJ2743]「JOI Open 2016」摩天大楼

    题目大意 将 \(N\) 个互不相同的整数 \(A_1 , A_2 , ⋯ , A_N\) 任意排列成 \(B_1 , B_2 , ⋯ , B_N\) . 要求 \(∑^{N−1}_{i=1} |B_ ...

  10. Linux内存、Swap、Cache、Buffer详细解析

    关注「开源Linux」,选择"设为星标" 回复「学习」,有我为您特别筛选的学习资料~ 1. 通过free命令看Linux内存 total:总内存大小. used:已经使用的内存大小 ...