PromQL "where" 子句
PromQL "where" clause
如何在 PromQL 中添加 where 子句?
我正在尝试构建一个查询,当 Kubernetes 中的应用程序 运行 已启动超过一分钟但我想按命名空间过滤时显示。
这就是我的查询目前的样子
100 * (count(up == 1) BY (job, namespace, service) ) > 1
这很好用,但它给了我不需要的额外信息。
{job="prometheus-grafana", namespace="monitor", service="prometheus-grafana"}
{job="jenkins", namespace="jenkins", service="jenkins"}
{job="kube-state-metrics", namespace="monitor", service="prometheus-kube-state-metrics"}
{job="node-exporter", namespace="monitor", service="prometheus-prometheus-node-exporter"}
{job="kubelet", namespace="kube-system", service="prometheus-kube-prometheus-kubelet"}
{job="apiserver", namespace="default", service="kubernetes"}
我想要完成的是仅获取 jenkins
和 default
命名空间的结果。
{job="apiserver", namespace="default", service="kubernetes"}
{job="jenkins", namespace="jenkins", service="jenkins"}
我试过
100 * (count(up == 1) BY (job, namespace, service) ) > 1 and ON {namespace="jenkins"}
但是我收到 invalid parameter "query": 1:65: parse error: unexpected "{" in grouping opts, expected "("
错误。
在你的情况下,你必须通过你想要的标签(命名空间)“向上”过滤指标,它应该看起来像这样:
100 * count(up{namespace=~"default|jenkins"} == 1) > 1
- 你也可以试试这个。在 Kubernetes 中,所有资源都使用 pod。因此,如果您采用 pod 状态指标并减去当前时间 60,则得到 post 1 分钟 pods 运行 状态。
time()-60 > (kube_pod_start_time)
Prometheus 提供了以下方式来过滤查询中的数据:
- Time series selectors. They allow filtering time series by metrics and labels. For example,
up{namespace=~"default|jenkins"}
is a series selector, which returns only time series with the name up
, which contain label namespace
matching the given given regular expression:default|jenkins
。这大致相当于以下 SQL:
SELECT * FROM table WHERE name = 'up' and namespace ~ '^(default|jenkins)$'
- Comparison operators,允许按值过滤时间序列。例如,名称为
up
的 up == 0
returns 时间序列具有 0
值。这大致相当于以下 SQL:
SELECT * FROM table WHERE name = 'up' and value == 0
- Time series matching via binary operators。这允许执行 join-like 查询。例如,
up * on(instance) group_left(name) node_os_info
通过 instance
标签加入 up
指标和 node_os_info
指标,并从 node_os_info
指标中选择额外的 name
标签。这大致相当于以下 SQL:
SELECT up.*, node_os_info.name
FROM up LEFT JOIN node_os_info ON (instance)
如何在 PromQL 中添加 where 子句?
我正在尝试构建一个查询,当 Kubernetes 中的应用程序 运行 已启动超过一分钟但我想按命名空间过滤时显示。
这就是我的查询目前的样子
100 * (count(up == 1) BY (job, namespace, service) ) > 1
这很好用,但它给了我不需要的额外信息。
{job="prometheus-grafana", namespace="monitor", service="prometheus-grafana"}
{job="jenkins", namespace="jenkins", service="jenkins"}
{job="kube-state-metrics", namespace="monitor", service="prometheus-kube-state-metrics"}
{job="node-exporter", namespace="monitor", service="prometheus-prometheus-node-exporter"}
{job="kubelet", namespace="kube-system", service="prometheus-kube-prometheus-kubelet"}
{job="apiserver", namespace="default", service="kubernetes"}
我想要完成的是仅获取 jenkins
和 default
命名空间的结果。
{job="apiserver", namespace="default", service="kubernetes"}
{job="jenkins", namespace="jenkins", service="jenkins"}
我试过
100 * (count(up == 1) BY (job, namespace, service) ) > 1 and ON {namespace="jenkins"}
但是我收到 invalid parameter "query": 1:65: parse error: unexpected "{" in grouping opts, expected "("
错误。
在你的情况下,你必须通过你想要的标签(命名空间)“向上”过滤指标,它应该看起来像这样:
100 * count(up{namespace=~"default|jenkins"} == 1) > 1
- 你也可以试试这个。在 Kubernetes 中,所有资源都使用 pod。因此,如果您采用 pod 状态指标并减去当前时间 60,则得到 post 1 分钟 pods 运行 状态。
time()-60 > (kube_pod_start_time)
Prometheus 提供了以下方式来过滤查询中的数据:
- Time series selectors. They allow filtering time series by metrics and labels. For example,
up{namespace=~"default|jenkins"}
is a series selector, which returns only time series with the nameup
, which contain labelnamespace
matching the given given regular expression:default|jenkins
。这大致相当于以下 SQL:
SELECT * FROM table WHERE name = 'up' and namespace ~ '^(default|jenkins)$'
- Comparison operators,允许按值过滤时间序列。例如,名称为
up
的up == 0
returns 时间序列具有0
值。这大致相当于以下 SQL:
SELECT * FROM table WHERE name = 'up' and value == 0
- Time series matching via binary operators。这允许执行 join-like 查询。例如,
up * on(instance) group_left(name) node_os_info
通过instance
标签加入up
指标和node_os_info
指标,并从node_os_info
指标中选择额外的name
标签。这大致相当于以下 SQL:
SELECT up.*, node_os_info.name
FROM up LEFT JOIN node_os_info ON (instance)