在 Prometheus 的表达式语言(PromQL)中,表达式或子表达式可以解析为四种类型之一:
PromQL(Prometheus Query Language)中的瞬时向量(Instant vector)是一种数据类型,它表示一组时序数据,其中每个时序数据在特定的采样点只有一个采样值。这意味着瞬时向量提供的是时间序列在某个特定时刻的“快照”。
瞬时向量选择器被用来选择一组时序在某个采样点的采样值。最简单的情况就是指定一个度量指标,选择出所有属于该度量指标的时序的当前采样值。通过瞬时向量选择器,可以过滤和选择特定条件下的时序数据,以获取所需的信息。
例如:如果想要选择指标名称为 prometheus_http_requests_total 的所有时间序列,并且根据标签过滤样本,仅返回 code 为 200,handler 以 /api/v1/status/ 开头的样本:
prometheus_http_requests_total{code="200",handler=~"/api/v1/status/.+"}
执行上面查询,将返回一个瞬时向量,其中包含满足这些条件的所有时序数据在当前采样点的采样值。
执行结果如下图:
注意:瞬时向量不支持区间向量选择器的时间范围定义,它仅表示一个特定时刻的数据状态。如果需要获取一段时间内的数据,应该使用区间向量(Range vector)数据类型。
在 Prometheus 中,范围向量(Range vector)是一种特殊的数据类型,它表示一组时间序列,这些时间序列包含了在指定时间范围内的一系列数据点。与瞬时向量(Instant vector)不同,范围向量关注的是一段时间内的数据变化,而不是仅仅一个时间点的数据快照。
范围向量通常用于计算时间序列在一段时间内的聚合值,比如平均值、最大值、最小值等。它们也用于生成时间序列的图形和趋势分析。
在 PromQL 中,你可以通过指定时间范围来选择范围向量。时间范围可以通过使用方括号 [] 来定义,括号内是相对于当前时间的时间偏移量。
例如:如果你想获取过去一小时内的 prometheus_http_requests_total 指标的数据中每隔 10 分钟的采样值:
prometheus_http_requests_total{code="200",handler="/api/v1/query"}[1h:10m]
上述表达式的各个部分解析如下:
prometheus_http_requests_total: 这是 Prometheus 中的一个指标名称,通常用来计量 HTTP 请求总量的计数器类型指标。
{code="200", handler="/api/v1/query"}: 这是一个标签选择器,它指定了我们只关心那些带有特定标签值的时序数据。在这个例子中,我们选择了 HTTP 状态码为 200 以及处理程序(handler)路径为 /api/v1/query 的 HTTP 请求相关的指标数据。
[1h:10m]: 这是一个区间向量选择器或者称为“范围查询”参数,它定义了时间序列数据的时间窗口。具体来说,1h:10m 意味着在过去的1小时(1h)内,但步长为10分钟(10m),即每隔10分钟取一次样本数据。这意味着 Prometheus 会返回过去 1 小时内按照每 10 分钟为间隔的数据点,展示在这段时间内满足条件的HTTP请求总量的变化情况。
综上所述,整个表达式的结果将展示在过去1小时内,每10分钟间隔统计的、针对特定接口(/api/v1/query)并返回状态码200的HTTP请求数量的时间序列数据。
执行结果如下图:
从上图可知,返回了 6 条样本数据,10 分钟一条。
当然,范围向量也可以用于聚合操作,比如计算某个指标在过去一段时间内的平均值:
avg_over_time(prometheus_http_requests_total[1h])
上面查询将计算 prometheus_http_requests_total 指标在过去一小时内的平均值,并返回了一个瞬时向量,其中包含了每个时间序列的平均值。
执行结果如下图:
特别注意:Prometheus 存储的是离散的时间样本点,所以当你查询一个范围向量时,Prometheus 会返回该时间范围内所有可用的样本点,而不是连续的时间序列。这意味着返回的数据点之间的时间间隔可能不是均匀的,取决于 Prometheus 的抓取间隔和存储策略。
标量是一个单一的数值,可以是整数或浮点数。在Prometheus中,标量通常用于表示某个指标在某个时间点或某个时间范围内的值。例如,CPU使用率、内存使用率或磁盘使用率等都是标量类型的指标。这些指标通常用于描述系统的资源使用情况。
标量数据类型用于算术二元运算符和比较二元操作符。在二元运算中,标量可以与另一个标量进行运算,例如加法、减法、乘法、除法和模运算等。同时,标量也可以用于比较操作,如等于、不等于、大于、小于、大于等于和小于等于等。
假设我们要监控一个Web应用程序的响应时间。我们可以创建一个名为 http_response_time 的标量指标,用于记录应用程序处理HTTP请求的平均响应时间。每当应用程序处理一个请求时,它就会更新这个指标的值。Prometheus 可以定期从应用程序中拉取这个指标的值,并将其存储在自己的数据库中。然后,我们可以使用 Prometheus 的查询语言 PromQL 来查询这个指标的值,以便了解应用程序的响应时间情况。
字符串(String)数据类型通常不被直接用作指标的值,因为 Prometheus 主要关注数值型数据,如标量(Scalar)和向量(Vector),这些数据类型更适合进行数学运算、聚合和查询。
然而,字符串在 Prometheus 中确实存在,主要用于标签(Labels)的值。标签是 Prometheus 指标的一个重要组成部分,用于标识和区分不同的时间序列数据。标签的值可以是字符串类型,这使得我们可以使用字符串来描述和分类指标数据。
例如,假设我们有一个记录 HTTP 请求的指标,我们可以为这个指标添加一些标签来描述请求的不同方面。其中,一个可能的标签是 method,它的值可以是字符串 "GET"、"POST"、"PUT" 等,用于表示不同的 HTTP 请求方法。