relabel_configs и metric_relabel_configs: на каком этапе меняются метки

Prometheus собирает слишком много данных. В одном случае лишними оказываются целые targets тестового окружения, в другом — только отладочная метрика внутри нужного exporter. Обе задачи можно выразить через relabeling, но одинаковая запись в разных секциях меняет совершенно разные части процесса.

До HTTP-запроса Prometheus знает адрес target и метаданные обнаружения. После запроса у него появляются samples с именами метрик и собственными labels. relabel_configs работает с targets до scrape, а metric_relabel_configs — с собранными samples перед приёмом. От этого зависит, какие поля доступны и какую работу вы действительно экономите.

Исключим target до обращения к нему

Пусть статическая конфигурация помечает машины окружением env. Собирать нужно только prod:

scrape_configs:
  - job_name: app
    static_configs:
      - targets: ['app-prod:9100']
        labels:
          env: prod
      - targets: ['app-test:9100']
        labels:
          env: test
    relabel_configs:
      - source_labels: [env]
        regex: prod
        action: keep

Правило keep сохраняет targets, у которых объединённое значение source_labels совпало с regex. Test будет исключён до сетевого запроса. Это уменьшает количество опросов. В конфигурации service discovery источником часто становятся временные labels с префиксом __meta_; они доступны именно на этой стадии.

Внутренние labels с двойным подчёркиванием обычно удаляются после target relabeling. Если значение обнаружения нужно видеть в запросах, перенесите его в обычный label на этом этапе. Не ожидайте, что __meta-поле автоматически окажется у каждой сохранённой метрики.

Отфильтруем конкретные samples

Теперь нужный production-exporter публикует крупную debug-метрику. Сам target нужен, поэтому добавим фильтр по имени:

    metric_relabel_configs:
      - source_labels: [__name__]
        regex: app_debug_payload_bytes
        action: drop

Этот блок добавляется к тому же scrape job. Имя метрики доступно через __name__. Prometheus уже скачал и разобрал ответ, поэтому фильтр не уменьшает размер HTTP-передачи или работу exporter. Он уменьшает число samples, поступающих в хранилище. Если дорого именно формирование ответа, нужно менять инструментацию или набор публикуемых метрик на источнике.

Автоматически создаваемые серии вроде up не проходят обычный metric relabeling. Поэтому удаление всех app-метрик не равнозначно исчезновению target. Страница targets и значение up могут продолжать показывать успешный scrape.

Почему удаление label требует осторожности

Высококардинальный label хочется просто убрать через labeldrop. Но если он различал две серии с одинаковыми остальными labels, после удаления они станут одним и тем же набором. Это не содержательное суммирование. Возможны конфликты samples, а результат перестанет выражать исходные наблюдения.

Допустим, по user_id публикуется число запросов. Удалить user_id у всех строк — не способ получить общий счётчик. Общий счёт нужно формировать в инструментации или вычислять корректной агрегацией сохранённых серий. Прежде чем менять labels при приёме, выпишите два исходных примера и получившиеся наборы: они должны оставаться однозначными.

Проверим оба этапа отдельно

После проверки YAML и штатного применения конфигурации откройте targets. Для отброшенного test проверьте результат обнаружения и relabeling. Для production запросите конкретную debug-метрику на новом интервале и убедитесь, что остальные app-метрики продолжают поступать. Старые сохранённые samples не исчезают автоматически из истории.

Сравните показатели samples до и после metric relabeling и длительность scrape. Если уменьшилось хранение, но сеть и exporter по-прежнему перегружены, это ожидаемый предел выбранного этапа. Решение становится понятным, когда каждый фильтр отвечает на конкретный вопрос: обращаться ли к target вообще или какие полученные samples сохранять.

Ещё по теме

Продолжить изучение

Хотите построить мониторинг, который помогает находить причины сбоев? Метрики, дашборды и оповещения входят в программу «Prometheus и Grafana: мониторинг и observability».

Продолжить на практике

  • Prometheus и Grafana: мониторинг и observability ↗

    Замечайте сбои до жалоб пользователей. Соберите мониторинг приложения: метрики Prometheus, запросы PromQL, дашборды Grafana и алерты, по которым понятно, что делать. Итог — наблюдаемый сервис и разбор учебного инцидента.