Prometheus的Mertic Type(指标类型)

一、什么是Prometheus的Mertic Type?

  Prometheus客户端库提供了四种核心度量标准类型。这些仅在客户端库(以启用针对特定类型的使用量身定制的API)和有线协议中有所区别。Prometheus服务器尚未使用类型信息,而是将所有数据展平为未键入的时间序列。将来可能会改变,其中主要定义了4钟不同的指标类型(metric type):Counter(计数器)、Gauge(仪表盘)、Histogram(直方图)、Summary(摘要)。

二、Counter(只增不减的计数器)

  Counter是一个简单但有强大的工具,例如我们可以在应用程序中记录某些事件发生的次数,通过以时序的形式存储这些数据,我们可以轻松的了解该事件产生速率的变化。PromQL内置的聚合操作和函数可以用户对这些数据进行进一步的分析:
例如,通过rate()函数获取HTTP请求量的增长率:rate( http_requests_total[5m])

三、Gauge(可增可减的仪表盘)

  与Counter不同,Gauge类型的指标侧重于反应系统的当前状态。因此这类指标的样本数据可增可减。常见指标如:node_memory_MemFree(主机当前空闲的内容大小)、node_memory_MemAvailable(可用内存大小)都是Gauge类型的监控指标。
通过Gauge指标,用户可以直接查看系统的当前状态:node_memory_MemFree
  对于Gauge类型的监控指标,通过PromQL内置函数delta()可以获取样本在一段时间返回内的变化情况。例如,计算CPU温度在两个小时内的差异:delta(cpu_temp_celsius{host= "zeus"}[2h])
  还可以使用deriv()计算样本的线性回归模型,甚至是直接使用predict_linear()对数据的变化趋势进行预测。例如,预测系统磁盘空间在4个小时之后的剩余情况:predict_linear(node_filesystem_free{job= "node"}[1h], 4 * 3600)

四、Histogram、Summary(分析数据分布情况

  场景:在大多数情况下人们都倾向于使用某些量化指标的平均值,例如CPU的平均使用率、页面的平均响应时间。这种方式的问题很明显,以系统API调用的平均响应时间为例:如果大多数API请求都维持在100ms的响应时间范围内,而个别请求的响应时间需要5s,那么就会导致某些WEB页面的响应时间落到中位数的情况,而这种现象被称为长尾问题。为了区分是平均的慢还是长尾的慢,最简单的方式就是按照请求延迟的范围进行分组。例如,统计延迟在010ms之间的请求数有多少而1020ms之间的请求数又有多少。通过这种方式可以快速分析系统慢的原因。Histogram和Summary都是为了能够解决这样问题的存在,
通过Histogram和Summary类型的监控指标,我们可以快速了解监控样本的分布情况。
  例如,指标prometheus_tsdb_wal_fsync_duration_seconds的指标类型为Summary。 它记录了Prometheus Server中wal_fsync处理的处理时间,通过访问Prometheus Server的/metrics地址,可以获取到以下监控样本数据:
      prometheus_tsdb_wal_fsync_duration_seconds{quantile= "0.5"} 0.012352463
      prometheus_tsdb_wal_fsync_duration_seconds{quantile= "0.9"} 0.014458005
      prometheus_tsdb_wal_fsync_duration_seconds{quantile= "0.99"} 0.017316173
      prometheus_tsdb_wal_fsync_duration_seconds_sum2.888716127000002
      prometheus_tsdb_wal_fsync_duration_seconds_count216
   从上面的样本中可以得知当前Promtheus Server进行wal_fsync操作的总次数为216次,耗时2.888716127000002s。其中中位数(quantile=0.5)的耗时为0.012352463,9分位数(quantile=0.9)的耗时为0.014458005s。
  Prometheus对于数据的存储方式就意味着,不同的标签就代表着不同的特征维度。用户可以通过这些特征维度对查询,过滤和聚合样本数据。
  例如,通过node_load1,查询出当前时间序列数据库中所有名为node_load1的时间序列:
  node_load1
  
  如果找到满足某些特征维度的时间序列,则可以使用标签进行过滤:
  node_load1{instance= "localhost:9100"}
  
  通过以标签为核心的特征维度,用户可以对时间序列进行有效的查询和过滤,当然如果仅仅是这样,显然还不够强大,Prometheus提供的丰富的聚合操作以及内置函数,可以通过PromQL轻松回答以下问题:
当前系统的CPU使用率?
  avg(irate(node_cpu{mode!= "idle"}[2m])) without (cpu, mode)
  
  CPU占用率前5位的主机有哪些?
  topk(5, avg(irate(node_cpu{mode!= "idle"}[2m])) without (cpu, mode))
  
  预测在4小时候后,磁盘空间占用大致会是什么情况?
  predict_linear(node_filesystem_free{job= "node"}[2h], 4 * 3600)
  
  其中avg(),topk()等都是PromQL内置的聚合操作,irate(),predict_linear()是PromQL内置的函数,irate()函数可以计算一段时间返回内时间序列中所有样本的单位时间变化率。predict_linear函数内部则通过简单线性回归的方式预测数据的变化趋势。
 
 
对Prometheus的Mertic Type的简单介绍到此为止,详情可参考官网:https://prometheus.io/docs/concepts/metric_types/
posted @ 2020-11-09 22:37  Fire♪一度  阅读(400)  评论(0编辑  收藏  举报