Prometheus专题[4.Prometheus基础概念]

1.数据模型

Prometheus 存储的是时序数据, 即按照相同时序(相同的名字和标签),以时间维度存储连续的数据的集合。

1.1 时序索引

时序(time series) 是由名字(Metric),以及一组 key/value 标签定义的,具有相同的名字以及标签属于相同时序。

时序的名字由 ASCII 字符,数字,下划线,以及冒号组成,它必须满足正则表达式 [a-zA-Z_:][a-zA-Z0-9_:]*, 其名字应该具有语义化,一般表示一个可以度量的指标,例如 http_requests_total, 可以表示 http 请求的总数。

时序的标签可以使 Prometheus 的数据更加丰富,能够区分具体不同的实例,例如 http_requests_total{method=”POST”} 可以表示所有 http 中的 POST 请求。

标签名称由 ASCII 字符,数字,以及下划线组成, 其中 __ 开头属于 Prometheus 保留,标签的值可以是任何 Unicode 字符,支持中文。

1.2 时序样本

按照某个时序以时间维度采集的数据,称之为样本,其值包含:

  • 一个 float64 值
  • 一个毫秒级的 unix 时间戳

1.3 格式

Prometheus 时序格式与 OpenTSDB 相似:

<metric name>{<label name>=<label value>, …}
其中包含时序名字以及时序的标签。

2.时序4种类型

Prometheus 时序数据分为 Counter, Gauge, Histogram, Summary 四种类型。

  • Counter

Counter表示收集的数据是按照某个趋势(增加/减少)一直变化的。

  • Gauge

Gauge表示搜集的数据是瞬时的,可以任意变高变低。

  • Histogram

Histogram可以理解为直方图,主要用于表示一段时间范围内对数据进行采样,(通常是请求持续时间或响应大小),并能够对其指定区间以及总数进行统计。

  • Summary

Summary和Histogram十分相似,主要用于表示一段时间范围内对数据进行采样,(通常是请求持续时间或响应大小),它直接存储了 quantile 数据,而不是根据统计区间计算出来的。

在我们的使用场景中,大部分监控使用Counter来记录,例如接口请求次数、消息队列数量、重试操作次数等。比较推荐多使用Counter类型采集,因为Counter类型不会在两次采集间隔中间丢失信息。

一小部分使用Gauge,如在线人数、协议流量、包大小等。Gauge模式比较适合记录无规律变化的数据,而且两次采集之间可能会丢失某些数值变化的情况。随着时间周期的粒度变大,丢失关键变化的情况也会增多。

还有一小部分使用Histogram和Summary,用于统计平均延迟、请求延迟占比和分布率。另外针对Historgram,不论是打点还是查询对服务器的CPU消耗比较高,通过查询时查询结果的返回耗时会有十分直观的感受。

3.作业和实例

prometheus 中,将任意一个独立的数据源(target)称之为实例(instance)。包含相同类型的实例的集合称之为作业(job)。 如下是一个含有四个重复实例的作业:

  • 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

4.自生成标签和时序

prometheus 在采集数据的同时,会自动在时序的基础上添加标签,作为数据源(target)的标识,以便区分:

job: The configured job name that the target belongs to.
instance: The <host>:<port> part of the target’s URL that was scraped.
如果其中任一标签已经在此前采集的数据中存在,那么将会根据 honor_labels 设置选项来决定新标签。详见官网解释: scrape configuration documentation

对每一个实例而言,prometheus 按照以下时序来存储所采集的数据样本:

up{job=”<job-name>”, instance=”<instance-id>”}: 1 表示该实例正常工作
up{job=”<job-name>”, instance=”<instance-id>”}: 0 表示该实例故障

scrape_duration_seconds{job=”<job-name>”, instance=”<instance-id>”} 表示拉取数据的时间间隔

scrape_samples_post_metric_relabeling{job=”<job-name>”, instance=”<instance-id>”} 表示采用重定义标签(relabeling)操作后仍然剩余的样本数

scrape_samples_scraped{job=”<job-name>”, instance=”<instance-id>”} 表示从该数据源获取的样本数
其中 up 时序可以有效应用于监控该实例是否正常工作。

# 推荐文章
  1.深刻理解Docker镜像大小
  2.k8s专题[1.k8s基础概念]
  3.k8s专题[10.使用Spinnaker持续发布应用]
  4.k8s专题[2.k8s设计原则]
  5.k8s专题[3.k8s基础组件]

评论


:D 一言句子获取中...