我有一个查询,我试图在一个标签上连接两个指标。K_Status_Value == 5 和 ON(macAddr) state_details{live="True"}
标签 macAddr 出现在两个指标中。标签的值有时以大写 (78:32:5A:29:2F:0D) 有时以小写 (78:72:5d:39:2f:0a) 出现在“K_Status_Value”中,但始终以大写出现'state_details' 的情况。有什么方法可以使查询中的标签 macAddr 值不区分大小写,以便我不会错过案例不匹配的情况?
我需要使用 prometheus 查询获取 kubernetes pod 中的 CPU 和内存使用情况。有人可以帮忙吗?
假设我有一个返回范围或即时向量的 promQL:范围向量 ->metric[1h]或实例向量 ->increase(metric[1h])
有没有办法将范围转换为即时向量和/或反之亦然?因为许多数学运算/函数只能在即时向量上进行。
如果无法进行转换,有没有办法对范围向量的每个值应用某个操作或函数?例如(值的平方):
(7 @1554105600, 5 @1554710400, 2 @1555315200, 12 @1555920000) 变成
(49 @1554105600, 25 @1554710400, 4 @1555315200, 144 @1555920000)
我正在尝试在 Prometheus 的alert.rules 文件中设置一个警报,该警报仅在特定时间段内触发。我已经在 expr 标签内测试了下面的代码块,没有时间限制,并且它工作得非常好。
正如PromQL 文档:hour()所述,hour()根据当前 UTC 返回 0 到 23 之间的值。
- alert: test_down
expr: absent(container_memory_usage_bytes{name="test_ap"}) and hour() > 5 and hour() < 22
for: 30s
labels:
severity: critical
annotations:
summary: "test_ap down"
description: "test_ap is down for more than 30 seconds."
Run Code Online (Sandbox Code Playgroud)
但在这里,不会触发任何警报通知。有谁知道为什么没有任何东西被解雇以及我该如何解决这个问题?
编辑:我已经解决了。我不明白为什么我必须像我这样做的方式那样做,但以下方法有效:
替换and hour() > 5 and hour() < 22为and ON() hour() > 5 < 22
我想在普罗米修斯中根据所有标签进行过滤。假设我在 prometheus 中的标签是实例、cpu、查询 node_cpu_seconds_total 的模式,我想做一个类似的操作,
input = ".*abc.*"
node_cpu_seconds_total{instance=~".*abc.*" or mode=~".*abc.*" or cpu=~".*abc.*"}
Run Code Online (Sandbox Code Playgroud)
基本上我希望我的正则表达式与所有标签值进行比较。有什么解决方案可以实现这一目标吗?
在我的 Prometheus 实例上,我设置了storage.tsdb.retention.sizeto128GiB和storage.tsdb.retention.timeto 0s,因此 Prometheus 会保留旧数据,直到达到 128 GB 限制。
现在,我有一些时间序列已经很长时间没有更新(即陈旧)。如果我对最近不再存在的过时指标进行范围查询,那么一切都很好。
例如,PromQL 查询:
> metric{label1="foo"}[1d]
Run Code Online (Sandbox Code Playgroud)
返回:
...
metric{label1="foo"} <value>@<timestamp> # <== OK, fresh time series
Run Code Online (Sandbox Code Playgroud)
但是,如果我在过时指标仍在更新时进行更远的范围查询,则该过时时间序列将包含在结果中。
例如,查询:
> metric{label1="foo"}[60d]
Run Code Online (Sandbox Code Playgroud)
返回:
...
metric{label1="foo"} <value>@<timestamp> # <== OK, newest timestamp right now
...
metric{label1="foo",label2="bar"} <value>@<timestamp> # <== !! newest timestamp one month ago!
Run Code Online (Sandbox Code Playgroud)
我不希望结果中包含第二个(陈旧)时间序列,我只希望第一个(新鲜)时间序列的数据达到 60 天前。
有没有办法用 PromQL 来实现这一点,即从范围查询中过滤掉过时的时间序列?
太长了;博士
我在普罗米修斯中有一个名为“ignore”的标签,其值为“yes”:
metric_test{label1="label1",ignore="yes"} 1
Run Code Online (Sandbox Code Playgroud)
我想禁用带有此标签的任何指标的警报。我不想手动编辑 500 多个警报。警报不应出现在 prometheus GUI 中。
有没有一个解决方案可以本地执行此操作?
我有各种机器和服务,其指标是通过 kubernetes_exporter 或 node_exporter 等导出器收集的。
我有一个警报“正常运行时间”,当机器出现故障时会触发该警报。
所有机器都有此警报,警报如下:
- alert: Uptime
expr: up{} == 0
for: 2m
labels:
severity: critical
Run Code Online (Sandbox Code Playgroud)
有些机器我不关心。它们会在计划外的时间持续关闭,并且通常并不重要,因此我想将此类机器从上述警报中排除。
我发现有效的是修改上面的表达式,添加被忽略的机器:
- alert: Uptime
expr: up{ignore!="yes"} == 0
for: 2m
labels:
severity: critical
Run Code Online (Sandbox Code Playgroud)
假设我有一个我不关心的 kubernetes 命名空间,我可以添加namespace!="test",Prometheus 仍然会收集指标,但不会触发警报。
我发现它也可以通过在 expr 末尾添加来使用AND up{ignore!="yes"},同时保持表达式的其余部分不变。
惊人的!
此处讨论以下方法:禁用对特定主机的警报,同时对所有其他主机发出警报
但这种方法有一个问题,那就是随着添加的忽略规则越多,您必须添加的条件就越多。当然,您可以像上面讨论的那样将事物分组在一起,添加标签,enableAlert="true"以便每台机器都enableAlert="false"被忽略。这可以工作,但仍然需要手动工作,并且还需要为每个警报进行手动配置。
那么,让我们看看其他可能的解决方案:
正如此处讨论的Prometheus 配置忽略 Kubernetes 中特定命名空间的指标抓取,当存在某个标签的值(例如 kubernetes 命名空间)时,可以删除指标。
请参阅上述讨论中的一个示例:
relabel_configs:
# This will ignore …Run Code Online (Sandbox Code Playgroud) 我metadata在普罗米修斯中有一个如下所示的指标
# HELP metadata Process metadata
# TYPE metadata counter
metadata{hostname="server-a",key="version",value="v1.1.0"} 1
metadata{hostname="server-a",key="feature1",value="true"} 1
metadata{hostname="server-a",key="feature2",value="false"} 1
metadata{hostname="server-b",key="version",value="v1.0.0"} 1
metadata{hostname="server-b",key="feature1",value="false"} 1
Run Code Online (Sandbox Code Playgroud)
其中key标签具有字段名称,value标签具有字符串值。我们不关心指标的值,但它始终是 1。
Grafana 是否可以将其格式化为表格?即像这样
| 主机名 | 版本 | 特征1 | 特征2 |
|---|---|---|---|
| 服务器-a | v1.1.0 | 真的 | 错误的 |
| 服务器-b | v1.0.0 | 错误的 |
如果我对每种可能都有一个单独的查询(使用表格式)key,那么我可以通过两次转换使其看起来像这样:一个Outer join按主机名,然后一个Organize fields删除多余的字段。
但是,我希望无需对每个进行单独的查询key,甚至key在可能的情况下进行硬编码。但尽管我摆弄了所有变换,我还是不知道如何实现。这里还有几个问题询问类似的事情,但没有一个完全符合我的要求:
还有一些不起作用的事情
metadata{}有一个键列和一个值列,而不是包含键名称的列Label to fields转换,其中有一列 1,其名称为 的值key。那么我想要的东西在 Grafana 中是否可能实现呢?
我已成功消除了当前已关闭节点的警报(并且在我们有时间物理替换它之前会持续一段时间)。
虽然我认为沉默会阻止警报在 Slack 通道中重新出现,但我也想在我们在 Prometheus 之上运行的 Grafana 仪表板上删除它。这是对 grafana 中各个图块的查询。
sum(ALERTS{alertname="NodeDown", alertstate="firing"})
Run Code Online (Sandbox Code Playgroud)
我的问题是是否有一个关键字可以替换“射击”,“不静音”不起作用(“静音”也不起作用;}),它只会向我显示警报未静音的机器。
使用案例:
我有 10 个 Kubernetes 节点(将它们视为虚拟机),它们有 7 到 14 个可分配的 CPU 核心,可由 Kubernetes Pod 请求。因此我想展示一个表格来显示
按节点分组。
问题
为前两个要求创建表很容易。我只是在 Grafana 中创建了一个表并添加了这两个指标:
sum(kube_pod_container_resource_requests_cpu_cores) by (node)
sum(kube_node_status_allocatable_cpu_cores) by (node)
Run Code Online (Sandbox Code Playgroud)
然而我在第三个方面遇到了困难。我尝试了这个查询,但它显然没有返回任何数据:
sum(kube_pod_container_resource_requests_cpu_cores / kube_node_status_allocatable_cpu_cores) by (node)
Run Code Online (Sandbox Code Playgroud)
问题
在我给定的示例中,如何实现 group by 语句中两个不同指标的计算?
prometheus ×10
promql ×10
grafana ×3
monitoring ×2
alert ×1
function ×1
kubernetes ×1
loops ×1
operators ×1