Prometheus从根本上所有的存储都是按时间序列去实现的,相同的metrics(指标名称)和label(一个或多个标签)组成一条时间序列,不同的label表示不同的时间序列。为了支持一些查询,有时还会临时产生一些时间序列存储。每条时间序列是由唯一的”指标名称”和一组”标签(key=value)”的形式组成。

  • 指标名称:一般是给监测对像起一名字,例如http_requests_total这样,它有一些命名规则,可以包字母数字之类的的。通常是以应用名称开头监测对像数值类型单位这样。例如:push_total、userlogin_mysql_duration_seconds、app_memory_usage_bytes。

  • 标签:就是对一条时间序列不同维度的识别了,例如一个http请求用的是POST还是GET,它的endpoint是什么,这时候就要用标签去标记了。最终形成的标识便是这样了:http_requests_total{method=”POST”,endpoint=”/api/tracks”}。

记住:针对http_requests_total这个metrics name无论是增加标签还是删除标签都会形成一条新的时间序列。

查询语句就可以跟据上面标签的组合来查询聚合结果了。如果以传统数据库的理解来看这条语句,则可以考虑http_requests_total是表名,标签是字段,而timestamp是主键,还有一个float64字段是值了。(Prometheus里面所有值都是按float64存储)。

Prometheus查询表达式

查询

prometheus提供了功能性表达式语言,可让用户对于时间序列的数据进行选择和聚合。通过表达式查询的结果可以绘制为曲线图,也可以在prometheus提供的表达式浏览器中显示为表格,也可以通过外部系统以HTTP API来调用使用。

expression language data types

prometheus 表达式语言中,有四种类型:

  • 即时向量(instant vector):包含每个时间序列的单个样本的一组时间序列,共享相同的时间戳。
  • 范围向量(Range vector):包含每个时间序列随时间变化的数据点的一组时- 间序列。
  • 标量(Scalar):一个简单的数字浮点值
  • 字符串(String):一个简单的字符串值(目前未被使用)

根据使用情况(例如绘图或者显示表达式的输出),这些类型中只有一些是由用户指定的表达式产生的结果而有效的,例如,即时向量表达式是可以绘- 图的唯一类型。

时间序列选择器

1. 即时向量选择器

即时向量选择器允许选择一组时间序列,或者某个给定的时间戳的样本数据。下面这个例子选择了具有http_requests_total的时间序列:

1
http_requests_total

你可以通过附加一组标签,并用{}括起来,来进一步筛选这些时间序列。下面这个例子只选择有http_requests_total名称的、有prometheus工作标签的、有canary组标签的时间序列:

1
http_requests_total{job="prometheus",group="canary"}

另外,也可以也可以将标签值反向匹配,或者对正则表达式匹配标签值。下面列举匹配操作符:

  • =:选择正好相等的字符串标签
  • !=:选择不相等的字符串标签
  • =~:选择匹配正则表达式的标签(或子标签)
  • !=:选择不匹配正则表达式的标签(或子标签)

例如,选择staging、testing、development环境下的,GET之外的HTTP方法的http_requests_total的时间序列:

1
http_requests_total{environment=~"staging|testingdevelopment",method!="GET"}

2. 范围向量选择器

范围向量表达式正如即时向量表达式一样运行,前者返回从当前时刻的时间序列回来。语法是,在一个向量表达式之后添加[]来表示时间范围,持续时间用数字表示,后接下面单元之一:

  • s:seconds
  • m:minutes
  • h:hours
  • d:days
  • w:weeks
  • y:years

在下面这个例子中,我们选择此刻开始5分钟内的所有记录,metric名称为http_requests_total、作业标签为prometheus的时间序列的所有值:

1
http_requests_total{job="prometheus"}[5m]

3. 偏移修饰符(offset modifier)

偏移修饰符允许更改查询中单个即时向量和范围向量的时间偏移量,例如,以下表达式返回相对于当前查询时间5分钟前的http_requests_total值:

1
http_requests_total offset 5m

Note:请注意,偏移量修饰符始终需要跟随选择器,即以下是正确的:

1
sum(http_requests_total{method="GET"} offset 5m) // GOOD.

下面是错误的:

1
sum(http_requests_total{method="GET"}) offset 5m // INVALID.

如下是范围向量的相同样本。这返回http_requests_total在一周前5分钟内的速率:

1
rate(http_requests_total[5m] offset 1w)

4. 操作符

Prometheus支持多种二元和聚合的操作符请查看这里

5. 函数

Prometheus支持多种函数,来对数据进行操作请查看这里