Prometheus + Kubernetes 指标来自错误的抓取作业
Prometheus + Kubernetes metrics coming from wrong scrape job
我通过 prometheus helm chart using the chart's default values, including the chart's default scrape_configs 部署了 prometheus 服务器(+ kube 状态指标 + 节点导出器 + alertmanager)。问题是我希望某些指标来自特定的工作,而不是来自不同的工作。
例如,node_cpu_seconds_total
由 kubernetes-service-endpoints
工作提供,但我希望它来自 kubernetes-nodes
工作,即 node-exporter
。返回的指标值是准确的,但问题是我没有通常来自 kubernetes-nodes
的标签(因为 kubernetes-nodes
作业有 role: node
vs role: endpoint
for kubernetes-service-endpoints
。我需要这些缺少的标签来进行高级查询 + 仪表板。
node_cpu_seconds_total{mode="idle"}
的输出:
node_cpu_seconds_total{app="prometheus",chart="prometheus-7.0.2",component="node-exporter",cpu="0",heritage="Tiller",instance="10.80.20.46:9100",job="kubernetes-service-endpoints",kubernetes_name="get-prometheus-node-exporter",kubernetes_namespace="default",mode="idle",release="get-prometheus"} | 423673.44
node_cpu_seconds_total{app="prometheus",chart="prometheus-7.0.2",component="node-exporter",cpu="0",heritage="Tiller",instance="10.80.20.52:9100",job="kubernetes-service-endpoints",kubernetes_name="get-prometheus-node-exporter",kubernetes_namespace="default",mode="idle",release="get-prometheus"} | 417097.16
日志中没有错误,我确实有其他 kubernetes-nodes
指标,例如 up
和 storage_operation_errors_total
,所以 node-exporter
被抓取了。
我还手动验证了 node-exporter
有这个特定的指标,node_cpu_seconds_total
,curl <node IP>:9100/metrics | grep node_cpu
并且它有结果。
作业订单定义重要吗?如果一项工作具有相同的名称,是否会覆盖其他工作的指标?我应该放弃 kubernetes-service-endpoints
工作的指标吗?我是普罗米修斯的新手,所以非常感谢任何详细的帮助。
从抓取配置中,kubernetes-nodes 作业探测 https://kubernetes.default.svc:443/api/v1/nodes/${node_name}/proxy/metrics
,而 kubernetes-service-endpoints 作业探测那些定义了 prometheus.io/scrape: true
的服务的每个端点,其中包括节点导出器。所以在你的配置中,node_cpu_seconds_total 指标肯定来自 kuberenetes-service-endpoints 作业。
我能够通过导航到 prometheus 服务发现状态 UI 页面来弄清楚如何添加 "missing" 标签。此页面显示了所有可以通过 relabel_configs 处理和保留的 "Discovered Labels"。什么是 processed/kept 显示在 "Target Labels" 下的 "Discovered Labels" 旁边。因此,这只是修改 scrape_configs
中的 kubernetes-service-endpoints
作业配置的问题,所以我添加了更多目标标签。下面正是我在图表 scrape_configs
中所做的更改。使用这个新配置,我将 namespace
、service
、pod
和 node
添加到所有指标(如果指标还没有)(请参阅 honor_labels
).
- job_name: 'kubernetes-service-endpoints'
+ honor_labels: true
kubernetes_sd_configs:
- role: endpoints
relabel_configs:
- source_labels: [__meta_kubernetes_service_annotation_prometheus_io_scrape]
action: keep
regex: true
- source_labels: [__meta_kubernetes_service_annotation_prometheus_io_scheme]
action: replace
target_label: __scheme__
regex: (https?)
- source_labels: [__meta_kubernetes_service_annotation_prometheus_io_path]
action: replace
target_label: __metrics_path__
regex: (.+)
- source_labels: [__address__, __meta_kubernetes_service_annotation_prometheus_io_port]
action: replace
target_label: __address__
regex: ([^:]+)(?::\d+)?;(\d+)
replacement: :
- action: labelmap
regex: __meta_kubernetes_service_label_(.+)
- source_labels: [__meta_kubernetes_namespace]
action: replace
- target_label: kubernetes_namespace
+ target_label: namespace
- source_labels: [__meta_kubernetes_service_name]
action: replace
- target_label: kubernetes_name
+ target_label: service
+ - source_labels: [__meta_kubernetes_pod_name]
+ action: replace
+ target_label: pod
+ - source_labels: [__meta_kubernetes_pod_node_name]
+ action: replace
+ target_label: node
我通过 prometheus helm chart using the chart's default values, including the chart's default scrape_configs 部署了 prometheus 服务器(+ kube 状态指标 + 节点导出器 + alertmanager)。问题是我希望某些指标来自特定的工作,而不是来自不同的工作。
例如,node_cpu_seconds_total
由 kubernetes-service-endpoints
工作提供,但我希望它来自 kubernetes-nodes
工作,即 node-exporter
。返回的指标值是准确的,但问题是我没有通常来自 kubernetes-nodes
的标签(因为 kubernetes-nodes
作业有 role: node
vs role: endpoint
for kubernetes-service-endpoints
。我需要这些缺少的标签来进行高级查询 + 仪表板。
node_cpu_seconds_total{mode="idle"}
的输出:
node_cpu_seconds_total{app="prometheus",chart="prometheus-7.0.2",component="node-exporter",cpu="0",heritage="Tiller",instance="10.80.20.46:9100",job="kubernetes-service-endpoints",kubernetes_name="get-prometheus-node-exporter",kubernetes_namespace="default",mode="idle",release="get-prometheus"} | 423673.44
node_cpu_seconds_total{app="prometheus",chart="prometheus-7.0.2",component="node-exporter",cpu="0",heritage="Tiller",instance="10.80.20.52:9100",job="kubernetes-service-endpoints",kubernetes_name="get-prometheus-node-exporter",kubernetes_namespace="default",mode="idle",release="get-prometheus"} | 417097.16
日志中没有错误,我确实有其他 kubernetes-nodes
指标,例如 up
和 storage_operation_errors_total
,所以 node-exporter
被抓取了。
我还手动验证了 node-exporter
有这个特定的指标,node_cpu_seconds_total
,curl <node IP>:9100/metrics | grep node_cpu
并且它有结果。
作业订单定义重要吗?如果一项工作具有相同的名称,是否会覆盖其他工作的指标?我应该放弃 kubernetes-service-endpoints
工作的指标吗?我是普罗米修斯的新手,所以非常感谢任何详细的帮助。
从抓取配置中,kubernetes-nodes 作业探测 https://kubernetes.default.svc:443/api/v1/nodes/${node_name}/proxy/metrics
,而 kubernetes-service-endpoints 作业探测那些定义了 prometheus.io/scrape: true
的服务的每个端点,其中包括节点导出器。所以在你的配置中,node_cpu_seconds_total 指标肯定来自 kuberenetes-service-endpoints 作业。
我能够通过导航到 prometheus 服务发现状态 UI 页面来弄清楚如何添加 "missing" 标签。此页面显示了所有可以通过 relabel_configs 处理和保留的 "Discovered Labels"。什么是 processed/kept 显示在 "Target Labels" 下的 "Discovered Labels" 旁边。因此,这只是修改 scrape_configs
中的 kubernetes-service-endpoints
作业配置的问题,所以我添加了更多目标标签。下面正是我在图表 scrape_configs
中所做的更改。使用这个新配置,我将 namespace
、service
、pod
和 node
添加到所有指标(如果指标还没有)(请参阅 honor_labels
).
- job_name: 'kubernetes-service-endpoints'
+ honor_labels: true
kubernetes_sd_configs:
- role: endpoints
relabel_configs:
- source_labels: [__meta_kubernetes_service_annotation_prometheus_io_scrape]
action: keep
regex: true
- source_labels: [__meta_kubernetes_service_annotation_prometheus_io_scheme]
action: replace
target_label: __scheme__
regex: (https?)
- source_labels: [__meta_kubernetes_service_annotation_prometheus_io_path]
action: replace
target_label: __metrics_path__
regex: (.+)
- source_labels: [__address__, __meta_kubernetes_service_annotation_prometheus_io_port]
action: replace
target_label: __address__
regex: ([^:]+)(?::\d+)?;(\d+)
replacement: :
- action: labelmap
regex: __meta_kubernetes_service_label_(.+)
- source_labels: [__meta_kubernetes_namespace]
action: replace
- target_label: kubernetes_namespace
+ target_label: namespace
- source_labels: [__meta_kubernetes_service_name]
action: replace
- target_label: kubernetes_name
+ target_label: service
+ - source_labels: [__meta_kubernetes_pod_name]
+ action: replace
+ target_label: pod
+ - source_labels: [__meta_kubernetes_pod_node_name]
+ action: replace
+ target_label: node