Prometheus Query Language典型应用场景:在仪表板中可视化Prometheus数据、使用Prometheus的警报管理器构建警报规则等。了解如何构建PromQL是使用Prometheus的一项基本技能,通过上篇文章学习了基础知识,本文带你更深入学习并实践。
Prometheus metrics类型
我们已经知道,Prometheus将从各种exportor中获取的指标数据存储在时间序列数据库中。对于想要存储的度量,必须有标识符,还包括一些列标签,当然还有时间戳和收集数据。
- 格式:Identifier -> ( timestamp1, value 1), ( t2,v2),…
- 示例:http_request_total{job=”httpcollector”, method=”GET”, path=”/tesst’}
通过这些标签可以筛选指标。从技术上讲,指标存储在JSON对象中,如下所示:
{
job=”httpcollector”,
method=”GET”,
path=”/tesst’ ,
__name__=”http_request_total”
}
__name__
是指标的名称。例如,使用它来过滤具有特定名称的所有指标。当应用PromQL时,Prometheus将转换数据并以4种不同的格式呈现:
- String
- Scalar
- Instant vector
- Range vector
前两个很容易理解:String只是一种文本格式,而Scalar是一个数值。然而,即时向量和范围向量有点复杂。
即时向量
数据不会同时到Prometheus,Prometheus到不同的exportor收集各类数据,他们都在不同的时间到达Prometheus。运行查询时,可以根据当前时间或特定时间计算数据。
下面是典型查询示例:
rate(cpu_meory_usage_total{ host=myserver, type=applicationserver, namesapce=test} [30s] )
在后面使用了过滤器:[30s],这意味着“查询最近30秒的数据”。
它将返回过去30秒内的值cpu_memory_usage / s
,即时向量给你每个时间序列一个值;如果不专门指定,则是最后报告的值。
范围向量
范围向量不会给你单个值,不像即时向量;它在两个时间戳之间提供了一组测量值。
Prometheus数据存储方式
如果计划编写Prometheus exportor程序,那么你需要了解Prometheus的各种数据类型,因为需要根据场景选择正确的数据集类型。即使你不构建exportor,了解各种数据类型也是有益的,如,帮助你合适的函数构建查询和预警规则。以下是这些数据类型的概述:
- Counter
- Gauge
- Histogram
- Summary
Prometheus客户端支持构建exportor程序。这些客户端通常很容易使用,它们的一些功能依赖于数据类型。支持主流的编程语言:
- Go
- Java
- Python
- Ruby
让我们详细看看数据类型。
Couter
计数器类型用来存储随时间增长的指标,例如request_count、error_count、total等。它不应该用于减少的指标。一般使用“rate”函数查询计数器。语法格式:
rate( metric name [last period of time])
Rate只接受计数器作为输入,它将在特定时间段内返回计数器的每秒次数。它返回一个瞬时向量。
Rate (http_request_count [5s]) # 最近5秒内的http_request/s
请注意,如果导出程序因任何原因崩溃,计数器将以值0重启,并从那时开始递增。这是计数器的最大不足。
Gauge
该指标可用于值上下变化的指标,如:响应时间、内存使用情况、CPU使用情况等。Gauge(仪表)数据类型很常用。如何在Prometheus中查询Gauge数据?
通常是聚合函数将Gauge数据作为输入参数。注意:不要用rate函数计算Gauge数据类型。
Avg_over_time (http_response_time[5m]) # 将返回最近5分钟的平均响应时间
Histogram
直方图指定预定义桶的值。请看示例:
假设我想统计http_response大小,通常使用直方图进行统计分享(例如,2秒),Prometheus将获取响应时间,并计算在特定桶中的请求数量。
直方图将计算在桶中具有该值的请求的数量。默认桶有一个清晰的结构:
.005,0.01,0.025;0.05,0.075,0.1,0.25,0.5,0.75,1,2.5,5,7.5,10
因此,默认桶将只支持最多10秒的指标。如果需要报告具有较高值的指标,则需要定义自定义桶。你需要知道潜在度量的最小值和最大值是多少。直方图支持计算平均值,百分位数等。如果你对原始数据不感兴趣,直方图很适合计算它们。Prometheus将自动存储直方图中的元素数量,以及总数(即,轻松计算平均值)。
举例:
Rate(metric_duaration_sum[5m]) / Rate(request_duration_count[5m])
# 获取最近5分钟的平均响应。
还有一个预定义的函数来计算百分位数,其中“le”是桶名:
Histogram_quantile ( 0.95, sum(rate(request_duration_buckets[5m]))) by (le) )
Summary
摘要与直方图非常相似。直方图分位数在Prometheus服务器中计算,而摘要在应用服务器中计算。不能从多个应用程序实例聚合汇总数据。直方图要求使用默认桶或根据度量值定义桶。如果你事先不知道值的范围是什么,那么摘要是完美的。
当我们需要收集尽可能多的测量值以便稍后计算平均值或百分位数时,我们通常使用摘要。如果您不需要原始数据或非常精确的测量,例如响应时间或响应大小,那么摘要是非常合适。
PromQL 过滤数据
PromQL提供了多种过滤数据的方法。在本节中,我们将详细探讨以下可能性:
- Labels
- Range operator
- Offset
- @ modifier
Labels过滤
我们已经看到prometheus数据有标签,利用标签可以过滤存储的指标。下面是标签匹配操作符:
- =:选择与提供的字符串完全相等的标签。
- !=:选择不等于所提供字符串的标签。
- =~:选择与提供的字符串进行正则匹配的标签。
- !~:选择与提供的字符串不匹配的标签。
注意:需要指定名称或标签操作符,不能使用空字符串。
NO: http_request_total {path = " "}
NO: http_request_total {path = ~”.*”}
YES: http_request_total {path = ~ " .+ "}
Range operator
使用范围操作符,可以指定一个时间长度,该时间长度将过滤从现在到特定时间范围之间的向量。
时间长度单位以数字形式指定,后面紧跟着下列单位之一:
- ms - milliseconds
- s - seconds
- m - minutes
- h - hours
- d - days - assuming a day has always 24h
- w - weeks - assuming a week has always 7d
- y - years - assuming a year has always 365d
offset
通过offset,可以在查询完成之前的一段时间内请求该值。
http_requests_total offset 5m
@ modifier
在PromQL中使用@修饰符过滤数据
@修饰符支持更改特定时间戳的评估日期。如果没有这个修饰符,您将默认使用当前时间戳。
你可以用@modifier组合范围选择器和偏移量。请看示例:
rate(http_requests_total[5m] @ 1609746000)
offset 在 @ 修饰符 之后
http_requests_total @ 1609746000 offset 5m
offset 在 @ 修饰符 之前
http_requests_total offset 5m @ 1609746000
函数应用
PromQL提供了一组丰富的函数和操作符来操作和分析时间序列数据。让我们来介绍一些最常用的:
Rate 和 Increase
rate()函数是PromQL中最常用的函数之一。它计算时间序列在范围向量中的每秒平均增长率。例如:
rate(http_requests_total [5m])
该查询计算过去5分钟内HTTP请求的每秒速率。
increase()函数与此类似,但返回计数器在时间范围内的总增量。对于以整数增加的计数器通常更直观:
increase(http_requests_total [1h])
这将显示过去一小时内HTTP请求的总数。
聚集函数
PromQL在聚合数据方面非常出色。下面是一些常见的聚合操作符:
- sum:计算维度上的和
- avg:计算维度
- min和max上的平均值:找到维度上的最小或最大值
- count:计算向量中元素的数量
例如,要获取所有端点上的HTTP请求总数:
sum(http_requests_total)
还可以按特定标签进行聚合:
sum(http_requests_total) by (status)
# 按状态码分组的请求总数。
直方图和摘要
直方图和摘要
Prometheus支持直方图和汇总度量类型,这对于度量值的分布(如请求持续时间)至关重要。下面是计算请求持续时间的第95个百分位数的示例:
Histogram_quantile(0.95, sum(rate(http_request_duration_seconds_bucket[5m])) by (le) )
该查询使用histogram_quantile函数以及sum和rate,为我们提供有关应用程序性能的有价值的见解。
总结
本文首先介绍Prometheus指标类型,区分即时向量和范围向量,然后介绍四种数据存储方式。基于指标类型和存储方式,介绍PromQL如何过滤数据、以及常用函数的用法。未来我们会结合实际应用场景继续学习更深入的监控预警应用。
标签:http,进阶,Language,request,Prometheus,直方图,total,向量 From: https://blog.csdn.net/neweastsun/article/details/143375025