prometheus中如何过滤不需要的指标

在prometheus的采集中会发现一个job中可能包含几十上百个指标,而每个指标的下的数据量也很大。在生产环境中我们实际上用的到指标可能只有几十个,而哪些被prometheus采集过来我们又没有用到的指标就成了浪费部署资源的元凶。
这个时候我们就要考虑对prometheus采集的job中指标进行过滤。

如何查询指标下数据量的情况

1
2
3
4
5
# 展现数据量前50的指标
topk(50, count by (__name__, job)({__name__=~".+"}))

# prometheus中的指标数据量
sum(count by (__name__, job)({__name__=~".+"}))

过滤prometheus 采集Job上的指标

下面以cadvice采集job为例子,目前采用的是metric_relabel_configs下的drop操作,丢弃不需要的指标(感觉不是特别方便)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
- job_name: kubernetes-cadvisor
kubernetes_sd_configs:
- role: node
scheme: https
tls_config:
ca_file: /var/run/secrets/kubernetes.io/serviceaccount/ca.crt
bearer_token_file: /var/run/secrets/kubernetes.io/serviceaccount/token
relabel_configs:
- action: labelmap
regex: __meta_kubernetes_node_label_(.+)
- target_label: __address__
replacement: kubernetes.default.svc:443
- source_labels: [__meta_kubernetes_node_name]
regex: (.+)
target_label: __metrics_path__
replacement: /api/v1/nodes/${1}/proxy/metrics/cadvisor
metric_relabel_configs:
- action: replace
source_labels: [id]
regex: '^/machine\.slice/machine-rkt\\x2d([^\\]+)\\.+/([^/]+)\.service$'
target_label: rkt_container_name
replacement: '${2}-${1}'
- action: replace
source_labels: [id]
regex: '^/system\.slice/(.+)\.service$'
target_label: systemd_service_name
replacement: '${1}'
# 丢弃掉container_network_tcp_usage_total指标
- action: drop
source_labels: [__name__]
regex: 'container_network_tcp_usage_total'
- action: drop
source_labels: [__name__]
regex: 'container_tasks_state'
- action: drop
source_labels: [__name__]
regex: 'container_network_udp_usage_total'
- action: drop
source_labels: [__name__]
regex: 'container_memory_failures_total'

过滤prometheus-opretor中Servicemonit配置的job指标

当采用prometheus-opretor部署监控环境时,会发现很多监控job都是使用Servicemonit来定义的,Servicemonit内部同样可以配置drop来丢弃指标

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
serviceMonitors:
- name: foundation-prometheus
namespaceSelector:
matchNames:
- monitoring
selector:
matchLabels:
cluster: foundation
endpoints:
- port: foundation-port
honorLabels: true
path: /federate
params:
'match[]':
- '{__name__=~".+"}'
# 配置丢弃container_memory_failures_total指标
metricRelabelings:
- action: drop
source_labels: [__name__]
regex: 'container_memory_failures_total'

在各个采集export中配置不需要的指标

最好的处理的方式就是在prometheus采集指标之前就对各个export提供的指标进行控制,只给prometheus提供我们需要监控的指标。下面以node-export为例,在node-export官方就对应用有说明可以使用–no-collector. flag来控制不需要采集的模块
node-export