从 Kube State Metrics 中提取指标时如何在 Prometheus 中获取 pod 的标签
How to get a pod's labels in Prometheus when pulling the metrics from Kube State Metrics
我有一个 Prometheus pod 运行 以及我的 Kube-State-Metrics (KSM) pod。 KSM 从集群中所有命名空间的所有 pods 中收集所有指标。 Prometheus 只是从 KSM 中抓取指标——这样 Prometheus 不需要抓取个人 pods.
部署 pods 时,它们的部署具有某些与 pod 相关的标签,如下所示。他们有两个重要的标签:APP 和 TEAM:
apiVersion: apps/v1
kind: Deployment
metadata:
labels:
APP: AppABC
TEAM: TeamABC
...
在 Prometheus 中,我的抓取配置如下所示:
scrape_configs:
- job_name: 'pod monitoring'
honor_labels: true
kubernetes_sd_configs:
- role: pod
relabel_configs:
- action: labelmap
regex: __meta_kubernetes_pod_label_(.+)
...
问题是,当 Prometheus 从 kube-state-metrics 抓取信息时,它会用 kube-state-metrics
覆盖 APP
。例如下面的这个指标实际上是针对一个名为 "AppABC" 的应用,但 Prometheus 将 app
标签覆盖为 kube-state-metrics
.
kube_pod_container_status_restarts_total{
app="kube-state-metrics",
container="appabccontainer",
job="pod monitoring",
namespace="test-namespace",
pod="appabc-766cbcb68d-29smr"
}
我是否可以从 kube-state-metrics 中抓取指标,但将 APP 和 TEAM 标签保持在一起而不覆盖他们?
编辑 - 我想通了
我的问题: 我的部署和 pods 定义了某些标签(APP、TEAM)。 Kube-state-metrics 从 K8 API 获取这些。当 Prometheus 从 kube-state-metrics 中抓取时,它没有这些标签。
我的 Objective: 将这些标签公开到 Prometheus。
我的解决方案: 使用 PromQL,您可以进行分组。所以在我的prometheus-rules.yaml中,我改了这个:
expr: kube_pod_status_phase{phase="Failed"} > 0
对此:
expr: kube_pod_status_phase{phase="Failed"} * on (pod,namespace) group_right kube_pod_labels > 0
所以我的新警报规则如下所示:
- name: Pod_Failed
rules:
- alert: pod_failed
expr: kube_pod_status_phase{phase="Failed"} * on (pod,namespace) group_right kube_pod_labels > 0
labels:
appname: '{{ $labels.label_APP }}' # This is what I wanted to capture
teamname: '{{ $labels.label_TEAM }}' # This is what I wanted to capture
annotations:
summary: 'Pod: {{ $labels.pod }} is down'
description: 'Pod: {{ $labels.pod }} is down in {{ $labels.namespace }} namespace.'
解决方案: 使用 PromQL 可以进行分组。所以在我的prometheus-rules.yaml中,我改了这个:
expr: kube_pod_status_phase{phase="Failed"} > 0
对此:
expr: kube_pod_status_phase{phase="Failed"} * on (pod,namespace) group_right kube_pod_labels > 0
所以我的新警报规则如下所示:
- name: Pod_Failed
rules:
- alert: pod_failed
expr: kube_pod_status_phase{phase="Failed"} * on (pod,namespace) group_right kube_pod_labels > 0
labels:
appname: '{{ $labels.label_APP }}' # This is what I wanted to capture
teamname: '{{ $labels.label_TEAM }}' # This is what I wanted to capture
annotations:
summary: 'Pod: {{ $labels.pod }} is down'
description: 'Pod: {{ $labels.pod }} is down in {{ $labels.namespace }} namespace.'
我有一个 Prometheus pod 运行 以及我的 Kube-State-Metrics (KSM) pod。 KSM 从集群中所有命名空间的所有 pods 中收集所有指标。 Prometheus 只是从 KSM 中抓取指标——这样 Prometheus 不需要抓取个人 pods.
部署 pods 时,它们的部署具有某些与 pod 相关的标签,如下所示。他们有两个重要的标签:APP 和 TEAM:
apiVersion: apps/v1
kind: Deployment
metadata:
labels:
APP: AppABC
TEAM: TeamABC
...
在 Prometheus 中,我的抓取配置如下所示:
scrape_configs:
- job_name: 'pod monitoring'
honor_labels: true
kubernetes_sd_configs:
- role: pod
relabel_configs:
- action: labelmap
regex: __meta_kubernetes_pod_label_(.+)
...
问题是,当 Prometheus 从 kube-state-metrics 抓取信息时,它会用 kube-state-metrics
覆盖 APP
。例如下面的这个指标实际上是针对一个名为 "AppABC" 的应用,但 Prometheus 将 app
标签覆盖为 kube-state-metrics
.
kube_pod_container_status_restarts_total{
app="kube-state-metrics",
container="appabccontainer",
job="pod monitoring",
namespace="test-namespace",
pod="appabc-766cbcb68d-29smr"
}
我是否可以从 kube-state-metrics 中抓取指标,但将 APP 和 TEAM 标签保持在一起而不覆盖他们?
编辑 - 我想通了
我的问题: 我的部署和 pods 定义了某些标签(APP、TEAM)。 Kube-state-metrics 从 K8 API 获取这些。当 Prometheus 从 kube-state-metrics 中抓取时,它没有这些标签。
我的 Objective: 将这些标签公开到 Prometheus。
我的解决方案: 使用 PromQL,您可以进行分组。所以在我的prometheus-rules.yaml中,我改了这个:
expr: kube_pod_status_phase{phase="Failed"} > 0
对此:
expr: kube_pod_status_phase{phase="Failed"} * on (pod,namespace) group_right kube_pod_labels > 0
所以我的新警报规则如下所示:
- name: Pod_Failed
rules:
- alert: pod_failed
expr: kube_pod_status_phase{phase="Failed"} * on (pod,namespace) group_right kube_pod_labels > 0
labels:
appname: '{{ $labels.label_APP }}' # This is what I wanted to capture
teamname: '{{ $labels.label_TEAM }}' # This is what I wanted to capture
annotations:
summary: 'Pod: {{ $labels.pod }} is down'
description: 'Pod: {{ $labels.pod }} is down in {{ $labels.namespace }} namespace.'
解决方案: 使用 PromQL 可以进行分组。所以在我的prometheus-rules.yaml中,我改了这个:
expr: kube_pod_status_phase{phase="Failed"} > 0
对此:
expr: kube_pod_status_phase{phase="Failed"} * on (pod,namespace) group_right kube_pod_labels > 0
所以我的新警报规则如下所示:
- name: Pod_Failed
rules:
- alert: pod_failed
expr: kube_pod_status_phase{phase="Failed"} * on (pod,namespace) group_right kube_pod_labels > 0
labels:
appname: '{{ $labels.label_APP }}' # This is what I wanted to capture
teamname: '{{ $labels.label_TEAM }}' # This is what I wanted to capture
annotations:
summary: 'Pod: {{ $labels.pod }} is down'
description: 'Pod: {{ $labels.pod }} is down in {{ $labels.namespace }} namespace.'