在正则表达式中为 Prometheus 重新标记配置使用标签
Use label in regex for Prometheus relabel configs
我正试图在 dockerswarm_sd_configs
中通过网络过滤掉一些目标。如果我在配置文件中硬编码网络名称但我想从 docker 标签设置过滤器(在我的 docker 撰写中)。
这是我的 Prometheus 配置文件:
# Create a job for Docker Swarm containers.
- job_name: 'dockerswarm'
dockerswarm_sd_configs:
- host: unix:///var/run/docker.sock
role: tasks
port: 80
relabel_configs:
# Only keep containers that should be running.
- source_labels: [__meta_dockerswarm_task_desired_state]
regex: running
action: keep
# Only keep containers that have a `prometheus-job` label.
- source_labels: [__meta_dockerswarm_service_label_prometheus_job]
regex: .+
action: keep
# Use the prometheus-job Swarm label as Prometheus job label.
- source_labels: [__meta_dockerswarm_service_label_prometheus_job]
target_label: job
# Keep port
- source_labels: [__meta_dockerswarm_service_label_port]
target_label: port
# Keep network
- source_labels: [__meta_dockerswarm_service_label_scrape_network]
target_label: network
# Relabel address to inject custom port value
- source_labels: [__address__, __meta_dockerswarm_service_label_port]
action: replace
regex: ([^:]+)(?::\d+)?;(\d+)
replacement: :
target_label: __address__
# Check network
- source_labels: [__meta_dockerswarm_network_name]
# Works with hardcoded value but not an other label
regex: network
action: keep
有没有办法在正则表达式字段中使用标签作为变量?
这不是最干净的答案,但我最终为我的两个普罗米修斯做了一个单独的配置文件(每个 docker 网络一个)。最后一步现在看起来像这样:
# Check network
- source_labels: [__meta_dockerswarm_network_name,__meta_dockerswarm_service_label_prometheus_scrape_network]
regex: network1;network1
action: keep
第一行 (source_labels) 收集“元网络名称”(为此目标从 docker 中抓取的网络名称)和“标签网络”,这是在我的 docker堆栈:
labels:
# Prometheus Swarm
- prometheus-job=myJobsName
- prometheus-port=3000
- prometheus-scrape-network=network1
- prometheus-env=production
第二行检查标签是否等于 network1;network1 因此它将过滤掉另一个网络上的“重复”目标(因为另一个将等于 network2;network1
)。
我正试图在 dockerswarm_sd_configs
中通过网络过滤掉一些目标。如果我在配置文件中硬编码网络名称但我想从 docker 标签设置过滤器(在我的 docker 撰写中)。
这是我的 Prometheus 配置文件:
# Create a job for Docker Swarm containers.
- job_name: 'dockerswarm'
dockerswarm_sd_configs:
- host: unix:///var/run/docker.sock
role: tasks
port: 80
relabel_configs:
# Only keep containers that should be running.
- source_labels: [__meta_dockerswarm_task_desired_state]
regex: running
action: keep
# Only keep containers that have a `prometheus-job` label.
- source_labels: [__meta_dockerswarm_service_label_prometheus_job]
regex: .+
action: keep
# Use the prometheus-job Swarm label as Prometheus job label.
- source_labels: [__meta_dockerswarm_service_label_prometheus_job]
target_label: job
# Keep port
- source_labels: [__meta_dockerswarm_service_label_port]
target_label: port
# Keep network
- source_labels: [__meta_dockerswarm_service_label_scrape_network]
target_label: network
# Relabel address to inject custom port value
- source_labels: [__address__, __meta_dockerswarm_service_label_port]
action: replace
regex: ([^:]+)(?::\d+)?;(\d+)
replacement: :
target_label: __address__
# Check network
- source_labels: [__meta_dockerswarm_network_name]
# Works with hardcoded value but not an other label
regex: network
action: keep
有没有办法在正则表达式字段中使用标签作为变量?
这不是最干净的答案,但我最终为我的两个普罗米修斯做了一个单独的配置文件(每个 docker 网络一个)。最后一步现在看起来像这样:
# Check network
- source_labels: [__meta_dockerswarm_network_name,__meta_dockerswarm_service_label_prometheus_scrape_network]
regex: network1;network1
action: keep
第一行 (source_labels) 收集“元网络名称”(为此目标从 docker 中抓取的网络名称)和“标签网络”,这是在我的 docker堆栈:
labels:
# Prometheus Swarm
- prometheus-job=myJobsName
- prometheus-port=3000
- prometheus-scrape-network=network1
- prometheus-env=production
第二行检查标签是否等于 network1;network1 因此它将过滤掉另一个网络上的“重复”目标(因为另一个将等于 network2;network1
)。