概述
Prometheus的定位是监控和趋势预测系统,包含收集、存储、查询、图形化展示、告警功能,所有这些功能全部依赖时间序列的数据。
数据模型(Data model)
Prometheus以流的形式保存一个Metric在不同时间点对应的值,同时提供查询功能,可以根据需要返回给用户一个系列的数据。
每一个序列的数据都可以通过测量名字(Metric Name)+key-value标签(key-value labels)唯一表示,其中label可选。
Metric Name的格式要求:[a-zA-Z_:][a-zA-Z0-9_:]*
。
label的格式要求:[a-zA-Z_][a-zA-Z0-9_]*
。
每个Metric Name都应当能够正确的表达其含义,例如:
Name | 含义 |
---|---|
http_requests_total | 收到的HTTP请求次数 |
http_request_duration_seconds | HTTP请求处理时长(单位秒),名字中需要体现测量单位 |
同一个Metric Name下可以通过不同的label来区分卡不同的数据序列,也就是您可以通过label来细分一个Metric下的数据,例如:
Metric Name | label | 含义 |
---|---|---|
api_http_requests_total | operation="create|update|delete" | 根据HTTP的操作请求类型对消息进行分类 |
api_request_duration_seconds | stage="extract|transform|load" | 记录不同阶段的时间占用情况 |
一个Metric可以有多个label,表达方式:
<metric name>{<label name>=<label value>, ...}
例如,测量项的名字为api_http_requests_total
,对应的两个label分别是method="POST"
和handler="/messages"
,那么可以描述为:
api_http_requests_total{method="POST", handler="/messages"}
测量类型(METRIC TYPES)
Prometheus 客户端库提供了四种测量类型,下面分别介绍。
Counter
计数器类型,这种数据类型只能递增或者设置为0(复位),一般可以用于计数器,例如收到的消息数。
gauge
同样是数值类型,只不过这个可以上报任意值,不限制递增或者递减,一般可以用于设置当前值,例如CPU利用率。
histogram
histogram类型的数据同时提供三个数据序列,假设Metric Name的名字是basename,将会产生以下三个数据序列:
- 计算特定
buckets
范围内数据的个数: <basename>_bucket{le="<upper inclusive bound>"}'; - 计算所有数据的总和:<basename>_sum;
- 所有数据个数:<basename>_count(等价于<basename>_bucket{le="+Inf"} ,Inf表示无穷大)。
举个例子来理解上述概念。
假设对一个人数为50人的班级的考试成绩做统计,首先在Prometheus 上建立一个histogram
类型的测量项,名字为examination
,该项用于接收学生成绩。随后老师通过客户段录入学生成绩,不同成绩段的人数如下(该班级本次平均成绩为75分):
分数范围 | 人数 |
---|---|
90~100 | 5 |
80~90 | 10 |
60~80 | 30 |
~60 | 5 |
我们先看下examination
测量项相关的数据:
- examination_sum = 50*75:该项数据保存了所有学生的成绩的总和;
- examination_count = 50:该项数据保存了学生总数。
那么这个班的平均成绩可以通过 examination_sum/examination_count 计算出来,即75。
接下来看下bucket
的概念,bucket
是人为设定的一个上限值,当用户上报的数据小于这个上限值时,这个buket
的数据计数器++,也就是统计小于某个值范围内的数据的数量。
以上面的数据为例,假定bucket
设置为80,那么我们可以知道小于80分的学生为35个,也就是:
examination_bucket{le="80"} = 35
bucket
的值与上报的数据值有关系,上面的例子中bucket
就是学生考试分数。
histogram类型的数据特别强调其累积特性(cumulative),继续拿上面的例子来讲,所谓的累积,是指小于80分的学生数一定包含小于60分的学生数量。
Summary
Summary类型的数据同时提供三个数据序列,假设Metric Name的名字是basename,将会产生以下三个数据序列:
- 计算特定
φ-quantiles
范围内数据的个数: <basename>{quantile="<φ>"}; - 计算所有数据的总和:<basename>_sum;
- 所有数据个数:<basename>_count。
φ-quantiles
为分位数,取值范围是[0, 1]。假定用户上报了N个数据,系统对这N个数据从小到大进行排序,φ对应的数据就是第φ*N个数据。
实例化,用户上报了10个数据,系统需要将这10个数据从小到大进行排序,当φ=0.5时,则取第5个数据;φ=0.9时,则取第9个数据。所以Summary是以数量为基础进行计算,取指定位置的值。
当用户指定φ值时,同时指定误差值,例如设置为 0.5:0.05 时,则φ的有效范围为[0.45, 0.55],只要是位于这个区间的数据就行。
任务和实例(JOBS AND INSTANCES)
一个任务(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
Prometheus上报数据时会自动添加Job和Instance数据:
- job: The configured job name that the target belongs to.
- instance: The
: part of the target's URL that was scraped.
Prometheus内部保存了一些数据,通过这些数据可以查看Job和Instance的属性:
数据 | 说明 |
---|---|
up | 1 if the instance is healthy, i.e. reachable, or 0 if the scrape failed. |
scrape_duration_seconds | duration of the scrape. |
scrape_samples_post_metric_relabeling | the number of samples remaining after metric relabeling was applied. |
scrape_samples_scraped | the number of samples the target exposed. |
scrape_series_added | the approximate number of new series in this scrape. New in v2.10 |