#docker #prometheus #docker-swarm
#docker #prometheus #docker-swarm
Вопрос:
Я пытаюсь отфильтровать некоторые цели по сети в моем dockerswarm_sd_configs
. Это работает, если я жестко закодирую имя сети в файле конфигурации, но я хочу установить фильтр из метки docker (в моем docker compose).
Это мой конфигурационный файл формы 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: ${1}:${2}
target_label: __address__
# Check network
- source_labels: [__meta_dockerswarm_network_name]
# Works with hardcoded value but not an other label
regex: network
action: keep
Есть ли способ использовать метку в качестве переменной в поле регулярных выражений?
Комментарии:
1. Я все еще ищу лучший ответ, если у кого-то есть.
Ответ №1:
Это не самый чистый ответ, но в итоге я создал отдельный конфигурационный файл для двух своих prometheus (по одному для каждой сети 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
).