开源监控系统Prometheus中的一些概念

Prometheus从根本上是将所有数据存储为时间序列(属于同一度量的时间戳值和相同的标记维度集)。除了存储的时间序列,Prometheus还可以生成临时派生的时间序列作为查询的结果。

数据模型

每个时间序列都由指标名称(metric name)和一组 键值对(lables)来唯一标识。

指标名称(metric name)表示被测量的系统的某一特性(例如http_requests_total表示接收到的HTTP请求的总数)。它可能包含ASCII字母和数字,以及下划线和冒号。它必须匹配正则表达式[a-zA-Z_:][a-zA-Z0-9_:]*。

标签(lable)表示了Prometheus数据模型的维度:同一指标名称的任何给定标签组合都标识该度量标准的特定维度实例化(例如:使用POST方法用于/api/tracks处理程序的所有HTTP请求)。查询语言允许基于这些维度进行过滤和聚合。更改任何标签值(包括添加或删除标签)将创建新的时间序列。

标签名称可以包含ASCII字母,数字以及下划线。他们必须匹配正则表达式[a-zA-Z_][a-zA-Z0-9_]*。其中以__作为前缀的标签,是系统保留的关键字,只能在系统内部使用。

指标

给定指标名称和一组标签,通常使用此表示法标识时间序列。所有的指标(Metric)都通过如下格式标示:

{

例如,一个时间序列指标名称api_http_requests_total和标签method="POST"和handler="/messages"可以这样写:

api_http_requests_total{method="POST", handler="/messages"}

样本

在时间序列中的每一个点称为一个样本(sample),样本形成实际的时间序列数据。样本由以下三部分组成:

  • 指标(metric):metric name和描述当前样本特征的labelsets;
  • 时间戳(timestamp):一个精确到毫秒的时间戳;
  • 样本值(value): 一个folat64的浮点型数据表示当前样本的值。

例如:

<--------------- metric ---------------------><-timestamp -><-value->
http_request_total{status="200", method="GET"}@1434417560938 => 94355
http_request_total{status="200", method="GET"}@1434417561287 => 94334
​
http_request_total{status="404", method="GET"}@1434417560938 => 38473
http_request_total{status="404", method="GET"}@1434417561287 => 38544
​
http_request_total{status="200", method="POST"}@1434417560938 => 4748
http_request_total{status="200", method="POST"}@1434417561287 => 4785

指标类型

Prometheus在客户端库提供了四种不同的指标类型(metric type)。Counter(计数器)、Gauge(仪表盘)、Histogram(直方图)、Summary(摘要)。这些目前仅在客户端库中区分(以区分针对特定类型的使用而定制的API)。Prometheus服务器尚未使用类型信息,并将所有数据都看做是无类型区分的时间序列。这种情况可能在将来会发生变化。

Counter

Counter类型的指标其工作方式和计数器一样,只增不减(除非系统发生重置)。常见的监控指标,如http_requests_total,node_cpu都是Counter类型的监控指标。 一般在定义Counter类型指标的名称时推荐使用_total作为后缀。

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

Gauge

与Counter不同,Gauge类型的指标侧重于反应系统的当前状态。因此这类指标的样本数据可增可减。常见指标如:node_memory_MemFree(主机当前空闲的内存大小)、node_memory_MemAvailable(可用内存大小)都是Gauge类型的监控指标。

Gauge通常用于测量值,如温度或当前内存使用情况,但也可用于可以上下的“计数”,例如并发请求的数量。

Histogram

Histogram主用用于统计和分析样本的分布情况。在大多数情况下人们都倾向于使用某些量化指标的平均值,例如CPU的平均使用率、页面的平均响应时间。

Histogram类型的样本会反应当前指标的记录的总数(以_count作为后缀)以及其值的总量(以_sum作为后缀)。

Summary

与Histogram类似,Summary采样观察数据(通常是请求持续时间和响应大小等)。虽然它还提供观察的总数和所有观测值的总和,但它在滑动时间窗口上计算可配置的分位数。

同时对于Histogram的指标,我们还可以通过histogram_quantile()函数计算出其值的分位数。不同在于Histogram通过histogram_quantile函数是在服务器端计算的分位数。 而Sumamry的分位数则是直接在客户端计算完成。因此对于分位数的计算而言,Summary在通过PromQL进行查询时有更好的性能表现,而Histogram则会消耗更多的资源。

任务和实例

在Prometheus中,每一个暴露监控样本数据的HTTP服务称为一个实例。例如在当前主机上运行的node exporter可以被称为一个实例(Instance)。

而一组用于相同采集目的的实例,或者同一个采集进程的多个副本则通过一个一个任务(Job)进行管理。

例如,具有四个复制实例的API服务器任务:

job: api-server
instance 1: 1.2.3.4:5670
instance 2: 1.2.3.4:5671
instance 3: 5.6.7.8:5670
instance 4: 5.6.7.8:5671

当Prometheus抓取目标时,它会自动将一些标签附加到抓取的时间序列中,用于识别被抓取的目标:

  • job:目标所属的已配置任务名称。
  • instance::已抓取的目标URL 的一部分。

对于每次实例抓取,Prometheus都会在以下时间序列中存储样本:

  • up{job="", instance=""}:1代表实例是健康的,即可达,0代表抓取失败。
  • scrape_duration_seconds{job="", instance=""}:抓取的持续时间。
  • scrape_samples_post_metric_relabeling{job="", instance=""}:应用度量标准重新标记后剩余的样本数。
  • scrape_samples_scraped{job="", instance=""}:目标暴露的样本数。

up时间序列对实例的可用性监控非常重要。

你可能感兴趣的:(开源监控系统Prometheus中的一些概念)