从Kube State Metrics中提取指标时,如何在Prometheus中获得豆荚的标签

时间:2018-10-25 16:49:58

标签: kubernetes prometheus prometheus-alertmanager

我有一个Prometheus吊舱和我的Kube-State-Metrics(KSM)吊舱一起运行。 KSM从群集中所有名称空间中的所有Pod收集所有指标。 Prometheus只是从KSM刮取指标-这样,Prometheus无需刮除单个Pod。

部署pod时,其部署具有某些与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抓取信息时,它会用APP覆盖kube-state-metrics。例如下面的指标实际上适用于名为“ 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 标签保持在一起而不覆盖它们?

编辑-我想通了

我的问题:我的部署和Pod已定义了某些标签(APP,TEAM)。 Kube-state-metrics从K8 API获取这些信息。当Prometheus从kube-state-metrics刮取时,它没有这些标签。

我的目标:将这些标签暴露在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.'

1 个答案:

答案 0 :(得分:2)

解决方案:使用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.'