关注分享主机优惠活动
国内外VPS云服务器

容器监控实践-PromQL查询分析(显示容器详细信息的命令)

摘要:获取所请求数字的第一位的时间序列样本数据。 您可以使用公式计算当前样本数据值的分布。 例如,如果 is ,则表示求当前样本数据的中值并返回结果。 以下内置函数提供了许多其他内置函数,可以对时间序列数据进行丰富的处理。

1.概述

除了存储数据之外,Prometheus还提供了强大的函数式表达语言PromQL,可以让用户存储实时序列。允许您选择和汇总时间。

表达式的结果可以以图形或表格数据的形式显示在浏览器中,也可以通过HTTP API从外部系统调用。 通过PromQL,用户可以轻松地使用表达式查询监控数据并设置警报。

示例:k8s 的节点在线率: sum(kube_node_status_condition{condition="Ready", status="true"} ) / sum(kube_node_info) *100

Metric类型

时间序列存储参见https://www.infoq.cn/article/。 ...

Prometheus将所有采集到的样本数据以时间序列(time-series)的形式存储在内存数据库TSDB中,并定期保存到硬盘上。 time-series 是时间戳和值的序列,称为向量。 每个 time- 系列均由度量名称和一组标签命名。

time-系列中的每个点称为样本。 该示例由三部分组成:

指标:示例要素当前标签集的指标名称和描述。

时间戳:以毫秒为单位的精确时间戳。

>

样本值(value):folat64浮点数据表示当前样本的值。

比如某一时刻的node_cpu指标是459.71。

node_cpu{app="node-exporter",cpu="cpu0",instance="192.168.0.4 :9100" ,job="kubernetes-service-endpoints",kubernetes_name ="node-exporter",kubernetes_namespace="kube-system",mode="guest"} 459.71

Prometheus 定义了四种不同的 metric 类型:

Counter 计数器

计数器。 它只会增加,不会减少(例如http_requests_total)。  例如,通过rate()函数获取HTTP请求。    交易量增长率:rate(http_requests_total[5m])

仪表板

当前状态。 可以增加或减少。    例如,您可以使用 kube_pod_status_ready 中当前可用 pod 的数量来获取一段时间内返回的样本的变化。 示例: delta(kube_pod_status_ready[2h])

直方图 直方图

_bucket {le=""}, _bucket{le="+Inf "}, 
按 _sum、_count 绘制的直方图。 主要用来表示数据采样。  您可以对指定时间段(通常是请求时长或响应大小)内的指定间隔和总计数进行统计。  收集的数据通常显示为直方图。    例如,P在rometheus服务器上,prometheus_local_storage_series_chunks_persisted表示每个Prometheus时间序列中应存储的块的数量。  您可以使用它来计算要保留的数据的分位数。    

Summary摘要

Summary类似于直方图,由{quantile=""}、_sum、_count组成,主要用于为了表示一段时间内(通常是请求持续时间或响应大小)数据采样的结果,分位数数据直接存储,而不是根据统计间隔计算。    例如,Prometheus 服务器上的 prometheus_target_interval_length_seconds。    直方图需要通过_bucket计算分位数值,而摘要则直接存储分位数值。    

基本查询

PromQL是Prometheus内置的数据查询语言,支持丰富的时序数据查询、聚合和逻辑运算功能。

您可以通过添加一组包含在 {} 中的标签(例如 http_requests_total 指示器)来进一步过滤这些时间序列。

以下示例仅选择名为 http_requests_total 的时间序列、prometheus 作业标签和 canary 组标签。

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

如果条件为空,可以像http_requests_total那样写。 {}

您还可以反转匹配标签值以及使用正则表达式匹配标签值。运算符如:

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

范围查询

http_requests_total{job="prometheus",group= 与“canary”类似}方法,得到瞬时值。 如果要检索特定范围内的值,可以使用范围查询。

时间范围由时间范围选择器[]定义。 例如,您可以使用以下公式选择过去5分钟的所有样本数据,例如http_request_total{}[5m]。

除了分钟之外,支持的单位还有:

s - 秒

m - 分钟

h - 小时

d - 天

p> p>

w -周

y -年

偏移量查询

示例:查询本周http_requests_total的百分比:

rate( http_requests_total{} offset 1w)

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

http_requests_total 偏移 5m

等效

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

请注意,偏移修饰符必须始终位于选择器之后。 所以下面的说法是正确的。

sum(http_requests_total{method="GET"} offset 5m) // 好。

以下内容不正确:

sum(http_requests_total{method="GET"}) offset 5m // 无效。

运算符

Prometheus的查询语言支持基本的逻辑和算术运算。

二元算术运算:

加法

减法

乘法

/除法

%余数

^无效

运算中使用的基本数据类型:

即时向量 - 一系列时间序列。 每个时间序列包含一个样本并共享相同的时间戳。 也就是说,表达式的返回值仅包含时间序列的最新样本值。 相应的表达式称为瞬时向量表达式。

范围向量-一系列时间序列。 每个时间序列都包含一段时间内的样本数据。

标量-浮点数据值。

字符串- 一个简单的字符串值。

二元算术运算符支持标量/标量(scalar/scalar)、向量/标量(向量/标量)和向量/向量(向量/向量)之间的运算。

当您在两个标量之间执行数学运算时,结果也是一个标量。

例如,如果要根据node_disk_bytes_write和node_disk_bytes_read获取主机磁盘IO总量,可以使用以下公式:

`node_disk_bytes_write + node_disk_bytes_read
`

或节点内存的 GB 数

node_memory_free_bytes_total / (1024 * 1024)
布尔运算

==(等于)

!=(不等于)

(大于)

<(小于)

=(大于或等于)

<=(小于等于))

示例:http_requests_total 获取请求总数是否大于10000,返回0和1。 1 发出警报

http_requests_total > 10000 # 结果为 true 或 falsehttp_requests_total > bool 10000 # 结果为 1 或 0
设置操作

and ( and)

or(或)

unless(排除)

优先级

四种算术运算都有优先级,而 promql 也有优先顺序用于 . 中的复杂操作。

例如,要查询主机的CPU使用率,可以使用以下公式:

 100 * (1 - avg (irate(node_cpu{mode="idle"}[5m])) by(job) )

irate 是一个内置函数在PromQL中是的,用于计算区间向量。 中等时间序列每秒的即时增长率
PromQL 运算符具有以下优先级(从高到低):

^

*、/、%

+、-

==、!=、<=、=、>

此外,

除了匹配模式(联接查询)

以及数据库中的联接promsql 有两种典型模式。 匹配查询:

一对一(one-to -one)

多对一(many-to-one)或一对多(一-to-many)

例如,如果您有示例:

method_code:http_errors:rate5m{method="get", code="500"} 24method_code: http_errors:rate5m{method="get", code="404"} 30method_code:http_errors:rate5m{method="put", code="501"} 3method_code:http_errors:rate5m{method="post", code= “500”} 6method_code:http_errors:rate5m{method="post", code="404"} 21method:http_requests:rate5m{method="get"} 600method:http_requests:rate5m{method="del"} 34method:http_requests: rate5m{ method= "post"} 120

使用 PromQL 表达式:

method_code:http_errors:rate5m{code="500"} /ignore(code) method:http_requests:rate5m 

此表达式返回最近 5 分钟内 HTTP 请求状态代码为 500 的所有请求的百分比。 如果不使用 ignoring(code),则运算符两侧的表达式返回的瞬时向量将找不到具有相同标签的匹配项。

结果应该如下所示:

{method="get"} 0.04 // 24 / 600
{method="post"} 0.05// 6 / 120

同时,put 和 del 方法没有找到匹配的样本,因此不会出现在结果中。

多对一模式

例如,使用以下表达式:

method_code:http_errors:rate5m /ignore( code ) group_left method :http_requests:rate5m

在此表达式中,左向量 method_code:http_errors:rate5m 包含两个标签:method 和 code。 右侧向量中的方法:http_requests:rate5m 仅包含一种标签方法,因此您必须使用ignore if match 来限制代码中匹配的标签。

限制匹配标签后,右向量的元素可能会匹配多个左向量的元素。 因此,该表达式的匹配模式是多对一的。 您必须使用组修饰符 group_left 来指定左向量具有 Better 基。

最终运行结果为:

{method="get", code="500"} 0.04 // 24 / 600
{method="get", code ="404"} 0.05 // 30 / 600
{method="post", code="500"} 0.05 // 6 / 120
{method="post", code= "404" } 0.175 // 21 / 120

注意:组修饰符只能与比较和数学运算符一起使用。    逻辑运算,否则,和或运算默认匹配右侧向量的所有元素。    聚合操作

Prometheus 还提供以下内置聚合运算符,范围仅限于临时向量。 可以聚合瞬时表达式返回的样本数据以形成样本值较少的新时间序列。

sum(求和)

min(最小值)

max(最大值)

avg(平均值)

>

p>

stddev(标准差)

stdvar(标准差)

count(计数)

count_values(计数值) ))

bottomk(样本值最小的k个元素)

topk(样本值最大的k个元素)

Quantiles(分布统计)

这些运算符用于聚合所有标签维度或通过 without 或 by 子语句保留单个维度。

without 用于从计算结果中删除枚举标签,同时保留其他标签。

by 则相反,仅列出的标签保留在结果向量中,其余标签被删除。

With without 和 by 允许您根据示例问题聚合数据。

示例:

如果指标http_requests_total有应用程序、实例和组的时间序列标签集,则可以计算每个应用程序和组的请求总数。 在所有情况下,它都将如下所示: 金额:

sum(http_requests_total),不含(实例)

等值

`
sum(http_requests_total) by (application) , Group)
`

如果您只想计算应用程序中的 HTTP 请求总数,可以直接使用该表。公式:

`sum(http_requests_total)
`

count_values用于时间序列中每个样本值出现的次数。 count_values 为每个唯一样本值输出一个时间序列,每个时间序列都包含一个附加标签。

该标签的名称由聚合参数指定,标签值是唯一的样本值。

例如,要计算每个构建版本运行的二进制文件的数量:

count_values("version", build_version) 返回:{ count="641"} 1{ count =" 3226"} 2{count="644"} 4

topk 和 Bottomk

是示例 将值排序为前 n 位当前样本值或时间序列的最后 n 位数字。

要获取前五个 HTTP 请求的计时示例数据,您可以使用以下公式:

topk(5, http_requests_total)

分位数用于以下目的: 计算当前样本数据值的分布分位数(φ,express), 0 ≤ φ ≤ 1

例如,如果φ为0.5,则表示求当前样本数据的中值I 。   quantile(0.5, http_requests_total ) 返回:{} 656

内置函数

Prometheus 有许多其他可以执行丰富时间处理的内置函数。 系列数据。 上面提到了 irate

100 * (1 - avg (irate(node_cpu{mode="idle"}[5m])) by(job) )

常用其中:

2分钟内平均CPU使用率:

rate(node_cpu[2m])

irate(node_cpu[2m])

请注意,使用速率或增长函数来计算样本的平均增长率很容易出现“长尾问题”,即无法解释样本数据在时间窗口内的突然变化。请。    例如,由于流量或其他问题,主机可能会在两分钟内占用 100% 的 CPU。  然而,计算一段时间内的平均增长率并不能反映这个问题。    为了解决这个问题,PromQL 提供了另一个更敏感的函数 irate(v range-vector)。    irate还用于计算区间向量计算速率,反映瞬时增长率。    irate函数通过区间向量中的最后两条数据来计算区间向量的增长率。    该方法可以避免时间范围内的“长尾问题”,体现出较好的灵敏度。   通过irate函数绘制的图标可以更好地反映样本数据的瞬时变化状态。    

irate 函数比rate 函数提供更高的灵敏度。 然而,如果需要分析长期趋势或将其纳入警报规则,则愤怒敏感性很容易造成干扰。

因此,我们建议使用速率函数进行长期趋势分析和警报。

完整的函数列表为:

abs()

absent()

ceil()

变化()

clamp_max()

clamp_min()

day_of_month()

day_of_week()

days_in_month()

delta()

deriv()

exp()

floor()

histogram_quantile()

holt_Winters()

hour()

idelta()

increase()

irate()

label_join()

label_replace()

ln()

log2()

log10()

分钟()

月份()

predict_linear()

速率()

重置()

round()

标量()

sort()

sort_desc()

sqrt()

时间()

时间戳()

向量()

年()

_over_time()

API访问

Prometheus当前稳定的HTTP API可以通过/api/v1访问。

错误状态代码:

404 错误请求:参数不正确或丢失。

422 Unprocessable Entity 如果表达式无法执行。

503 服务不可用 如果请求超时或中断。

所有 API 请求都使用以下 JSON 格式:

{ "status": "success" | "error", "data": , // 如果出现错误,将显示以下错误消息。  "errorType": "", "error": ""}

您可以通过 HTTP API 分别传递 /api/v1/query 和 /api/。 v1/query_range 查询当前或特定时间的 PromQL 表达式计算结果落在范围内。

即时数据查询

URL请求参数:

query=:PromQL表达式。

time=:用于指定PromQL计算所用的时间戳。 可选参数。 默认情况下,使用当前系统时间。

timeout=:超时设置。 可选参数,默认为-查询全局设置,超时。

$curl "http://localhost:9090/api/v1/query?query=up&time=2015-07-01T20:10:51.781Z"

返回:

{ "status" : "success", "data" : { "resultType" : "vector", "result" : [ { "metric" : { "__name__" : "up", “作业”:“普罗米修斯”,“实例”:“localhost:9090”},“值”:[1435781451.781,“1”]},{“指标”:{“__name__”:“向上”,“作业”: “节点”,“实例”:“localhost:9100”},“值”:[1435781451.781,“0”]}] }}
间隔查询

URL请求参数:

query=:PromQL表达式。

start=:开始时间。

end=:结束时间。

step=:查询步长。

timeout=:超时设置。 可选参数,默认为-查询全局设置,超时。

$curl“http://localhost:9090/api/v1/query_range?query=up&start=2015-07-01T20:10:30.781Z&end=2015-07[k4 ] ]01T20:11:00.781Z&step=15s"

返回:

{ "status" : "success", "data" : { "resultType" : "matrix", "结果 " : [ { "metric" : { "__name__" : "up", "job" : "prometheus", "instance" : "localhost:9090" }, "values" : [ [ 1435781430.781, "1" ], [1435781445.781,“1”],[1435781460.781,“1”]]},{“公制”:{“__name__”:“up”,“作业”:“节点”,“实例”:“localhost:9091”},“值”:[[1435781430.781,“0”],[1435781445.781,“0”],[1435781460.781 , "1" ] ] } ] }}

本文是关于容器监控实践的系列文章。 完整内容请参见container-monitor-book

未经允许不得转载:主机频道 » 容器监控实践-PromQL查询分析(显示容器详细信息的命令)

评论 抢沙发

评论前必须登录!