Использовать метку в регулярном выражении для конфигураций Prometheus relabel

#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 ).