百无一用程序员

  博客园  :: 首页  :: 新随笔  :: 联系 :: 订阅 订阅  :: 管理

概述

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,将会产生以下三个数据序列:

  1. 计算特定buckets范围内数据的个数: <basename>_bucket{le="<upper inclusive bound>"}';
  2. 计算所有数据的总和:<basename>_sum;
  3. 所有数据个数:<basename>_count(等价于<basename>_bucket{le="+Inf"} ,Inf表示无穷大)。

举个例子来理解上述概念。

假设对一个人数为50人的班级的考试成绩做统计,首先在Prometheus 上建立一个histogram类型的测量项,名字为examination,该项用于接收学生成绩。随后老师通过客户段录入学生成绩,不同成绩段的人数如下(该班级本次平均成绩为75分):

分数范围 人数
90~100 5
80~90 10
60~80 30
~60 5

我们先看下examination测量项相关的数据:

  1. examination_sum = 50*75:该项数据保存了所有学生的成绩的总和;
  2. 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,将会产生以下三个数据序列:

  1. 计算特定φ-quantiles范围内数据的个数: <basename>{quantile="<φ>"};
  2. 计算所有数据的总和:<basename>_sum;
  3. 所有数据个数:<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
posted on 2021-01-31 20:59  psbec  阅读(297)  评论(0编辑  收藏  举报