Перейти к содержимому
ГоМастер

Поиск по урокам

Найдите урок, курс, термин или раздел

Урок 23 из 25 ~18 мин +20 XP

Скрейпинг: prometheus.yml и сервис-дискавери

Настройка prometheus.yml — это список целей scrape_configs и интервалы опроса: именно она решает, узнает ли Prometheus о вашем /metrics, который открывается в браузере, но никем не читается. Разберём job_name, scrape interval, relabel и сервис-дискавери — путь от строчки конфига до зелёной метрики up.

Содержание урока · 10 разделов

Сервис переехал на новый стенд, /metrics открывается, метрики красивые — а в Grafana тишина, потому что у нового хоста нет цели в конфиге Prometheus. Это второй акт той самой истории из третьего урока: живой endpoint — половина контракта, вторая половина — тот, кто регулярно забирает данные. Prometheus работает по pull-модели: сам ничего не ищет в вашей инфраструктуре сверх того, что сказано в prometheus.yml, и молчит ровно до тех пор, пока цель не объявлена. В этом уроке разберём настройку скрейпа целиком: глобальные интервалы, разделы scrape_configs с job_name и metrics_path, правила relabel, честный обзор сервис-дискавери — и то, как за минуту проверить, что цель зелёная.

prometheus.yml: глобальная секция и scrape_configs#

Конфиг Prometheus — YAML с четырьмя основными секциями. В global живут дефолты: scrape_interval — как часто опрашивать цели, scrape_timeout — сколько ждать ответа, evaluation_interval — как часто пересчитывать правила. Раздел rule_files подключает файлы алертов и записей — то самое место, которого ждал урок про алерты, когда обещал научить подключать правила к серверу. Наконец, scrape_configs — список задач: каждая имеет job_name, уникальный в конфиге, и список целей через static_configs или сервис-дискавери. job_name становится лейблом job на каждой серии этого таргета, и по нему фильтруются запросы и дашборды — поэтому имя задачи стоит выбирать так же дисциплинированно, как namespace метрик из предыдущего урока: коротко, доменом сервиса, без окружения внутри имени.

Рабочий минимум prometheus.yml

GO
global:
  scrape_interval: 15s
  scrape_timeout: 10s
  evaluation_interval: 15s

rule_files:
  - /etc/prometheus/rules/*.yml

scrape_configs:
  - job_name: shop
    metrics_path: /metrics
    static_configs:
      - targets: ["10.0.0.11:8080", "10.0.0.12:8080"]
        labels:
          env: dev

  - job_name: prometheus
    static_configs:
      - targets: ["localhost:9090"]

Глобальные пятнадцать секунд распространяются на все задачи, у которых нет своего scrape_interval. Первая задача скрейпит две реплики сервиса: job=shop прилипает к их сериям, а env=dev — удобный лейбл окружения, заданный на уровне цели. Вторая задача — самообслуживание Prometheus: его внутренние метрики, включая счётчик скрейпов, полезны всегда.

scrape interval: цена частоты опроса#

scrape interval — компромисс между свежестью графиков и объёмом хранилища: каждая цель с каждой серией пишет сэмпл на каждый опрос. Арифметика честная: сто серий при опросе раз в пятнадцать секунд дают около шестисот тысяч сэмплов в сутки на один такой таргет, и при сотнях таргетов интервал перерастает в бюджет железа. Дефолт конфига — минута, пятнадцать секунд — рабочий выбор для сервисов, потому что графики отзывчивы, а объём умеренный; раз в пять секунд опрашивают только отдельные критичные задачи. Вторая связь важнее для кода: окно rate в PromQL обязано содержать минимум два сэмпла, иначе значение пустое, — при интервале пятнадцать секунд окно в минуту спокойно, а окно в десять секунд пустое почти всегда. Практическое правило из урока про PromQL: окно rate берут не меньше четырёх интервалов скрейпа. И третье: scrape_timeout обязан быть меньше scrape_interval, иначе ответы приходят после следующего опроса. Цену изменения проверяют до выката: prometheus_tsdb_head_series и прирост данных за сутки показывают эффект до того, как диск закончится, а фоновым задачам и тяжёлым отчётам допустимо оставить интервал в минуту — там изменения медленнее точности дашборда.

Сервис-дискавери: когда таргетов много#

static_configs честно работает до десятка целей: два-три реплики, база, шлюз — список читается глазами. Дальше начинается боль: поды меняют адреса при каждом деплое, и конфиг, правимый руками, отстаёт от реальности. Для этого в Prometheus встроены механизмы сервис-дискавери — списки целей, которые сервер запрашивает сам и обновляет по расписанию. Обзорно о рабочих вариантах: dns_sd_configs опрашивает DNS-записи A, AAAA или SRV — удобно для docker-compose и consul-шаблонов, где реплики видны по имени сервиса; http_sd_configs ходит по вашему URL и читает JSON-список целей — минимальный самописный дискавери, который возвращает то, что знает ваш оркестратор. Есть и тяжёлые интеграции — consul_sd_configs, kubernetes_sd_configs, файловый file_sd_configs, — устроенные по одному принципу: источник целей отделён от правил обработки. Разбор каждой интеграции — тема отдельной книги; для курса достаточно понимать контракт: дискавери отдаёт адреса, дальше работают те же relabel-правила.

Дискавери и отдельный интервал на задачу

GO
scrape_configs:
  - job_name: shop
    scrape_interval: 15s
    dns_sd_configs:
      - names: ["shop.internal"]
        type: A
        port: 8080
    relabel_configs:
      - source_labels: [__meta_dns_name]
        target_label: dns_zone

  - job_name: slow-jobs
    scrape_interval: 1m
    metrics_path: /internal/metrics
    static_configs:
      - targets: ["reports.internal:9100"]

Первая задача получает реплики по DNS-имени: Prometheus переопрашивает запись и сам добавляет и убирает цели. relabel_configs переносит имя DNS-записи в лейбл — так на дашборде видно источник. Вторая задача показывает, что интервал и путь задаются на задачу: тяжёлые эндпоинты опрашивают реже, служебные пути не обязаны называться /metrics.

Relabel: правила до скрейпа и после#

Relabel — это конвейер правил над лейблами, и у него два входа. relabel_configs выполняется до скрейпа и работает с метаданными цели: __address__, __scheme__, __metrics_path__ и метки дискавери с префиксом __meta_. Классика — переписать instance, вытащить зону из адреса, дописать общий лейбл окружения. metric_relabel_configs выполняется после скрейпа, на уже полученных сериях, и здесь живут два важных жеста: drop — выкинуть ненужные метрики до записи в хранилище, и keep — оставить только разрешённые. Регулярка применяется к указанным source_labels, и её же ловушка — косая черта в YAML и границы совпадения: regex анкерится по всей строке, поэтому debug.* не совпадёт с именем без префикса-начала. Правило границы: метрики дропают конфигом только как предохранитель — постоянная гигиена имён живёт в коде, как учили уроки про реестр и кардинальность.

Правила relabel в конфиге

GO
scrape_configs:
  - job_name: shop
    static_configs:
      - targets: ["10.0.0.11:8080"]
    relabel_configs:
      - source_labels: [__address__]
        regex: "([^:]+):\\d+"
        target_label: host
    metric_relabel_configs:
      - source_labels: [__name__]
        regex: "debug_.*"
        action: drop

Первое правило вырезает хост из адреса и кладёт в лейбл host — до скрейпа, на метаданных цели. Второе работает уже с полученными сериями: всё, что начинается с debug_, в хранилище не попадает. Дроп по регулярке — предохранитель от утечки отладочных метрик, а не замена дисциплине в коде.

Проверка: зелёный таргет за минуту#

После правки конфига проверка занимает минуту и не требует Grafana. Сначала promtool check config prometheus.yml — синтаксис и ссылки на файлы правил до перезапуска. Затем перезагрузка: сигнал SIGHUP или endpoint перезагрузки, если сервер запущен с включённым жизненным циклом. Дальше страница /targets или запрос к API: у каждой цели виден последний статус, длительность скрейпа и число полученных сэмплов. Зелёный таргет подтверждает метрика up со значением один; серый — цель пропала из конфига, красный — опрос не удался, и причина лежит в столбце ошибки. На дашбордах для наблюдения за самим скрейпом служат scrape_duration_seconds — время, которое сервер тратил на опрос, и scrape_samples_scraped — размер выборки: их рост при неизменном коде показывает, что endpoint тяжелеет, обычно из-за кардинальности из семнадцатого урока. Отдельный жест — SIGHUP перечитывает и файлы правил, поэтому правка алерта не требует рестарта сервера; рестарт нужен только при смене флагов запуска.

Причины красного таргета и их проверка#

  • Неверный metrics_path: сверить с curl по фактическому пути сервиса
  • Endpoint отвечает 500: текст ошибки на странице цели, чаще всего дубликат регистрации
  • Сеть и порт: curl с хоста Prometheus на таргет — первый шаг проверки
  • Таймаут: ответ тяжелее scrape_timeout — смотреть scrape_duration_seconds
  • Схема http вместо https: перенаправления ломают скрейп — проверить scheme
  • Цель пропала из дискавери: серый статус — источник целей не отдаёт адрес

Поля скрейпа и их дефолты#

ПолеЧто делаетДефолт
scrape_intervalчастота опроса цели1m
scrape_timeoutожидание ответа, меньше интервала10s
metrics_pathпуть эндпоинта метрик/metrics
schemehttp или httpshttp
honor_labelsчьи лейблы приоритетнее: цели или конфигаfalse
evaluation_intervalчастота пересчёта правил1m

Проверка: окно rate и интервал

scrape_interval равен 15 секундам. Какое окно rate заведомо рабочее?

Проверка: где дропнуть чужую метрику

Метрики debug_* уже приходят с таргета. Какая секция их отбросит?

Пустое окно

Прочитайте код и выберите, что он выведет:

# prometheus.yml
scrape_interval: 30s

# запрос панели
rate(http_requests_total[15s])

Соберите задачу скрейпа

Допишите имя задачи, путь и интервал опроса.

scrape_configs: - : shop : /internal/metrics : 30s static_configs: - targets: ["10.0.0.11:8080"]

Путь от конфига до графика

Расставьте шаги настройки скрейпа.

Строки

Ваша программа

Нажимайте на строки слева, чтобы собрать программу

Карточки: скрейпинг

Термин

scrape_configs и job_name

нажмите, чтобы перевернуть
Определение

Список задач опроса; job_name уникален в конфиге и становится лейблом job на всех сериях цели.

1 / 5

Скрейп связывает код из первой половины курса с сервером и дашбордами. Запросы для панелей — из урока про PromQL, само построение — из урока про Grafana, а правила в rule_files подключаются по шаблону урока про алерты. Если таргет красный из-за дубликатов регистрации — вернитесь к уроку про реестры; если хранилище пухнет — урок про кардинальность и дроп-правила из этого урока работают в паре. Дальше — эксплуатация: что мониторить в первую очередь, а полный маршрут — на странице Prometheus.

Песочница урока

Редактируйте код и запускайте его прямо здесь — интерпретатор работает в браузере, ничего устанавливать не нужно. За каждый запуск — +2 XP.

Вывод

Запустите код, чтобы увидеть вывод.

Коротко: что запомнить

  • Конфиг Prometheus: global с интервалами, rule_files для правил, scrape_configs со списком задач.
  • job_name становится лейблом job на сериях цели и фильтрует дашборды — выбирается как namespace метрик.
  • scrape interval — компромисс свежести и объёма: дефолт 1m, рабочий выбор 15s, окно rate — от двух интервалов.
  • scrape_timeout строго меньше scrape_interval, иначе ответы опаздывают к следующему опросу.
  • Сервис-дискавери (dns, http, файлы) отдаёт адреса вместо ручного списка — relabel-правила общие для всех источников.
  • relabel_configs работает до скрейпа с метаданными, metric_relabel_configs — после, с дропом серий.
  • Проверка цели: promtool, страница /targets, метрика up и scrape_duration_seconds.

Домашнее задание

Поднимите учебный сервис и Prometheus из докер-композа, напишите prometheus.yml с глобальными интервалами и двумя задачами: сервис через static_configs и вторую с отдельным scrape_interval и нестандартным metrics_path. Проверьте конфиг promtool-ом, перезагрузите сервер и добейтесь зелёного up на странице /targets. Добавьте metric_relabel_configs с дропом тестовой метрики и убедитесь, что она пропала из /api/v1/label/__name__/values. Затем сломайте metrics_path и прочитайте текст ошибки на странице цели.

Личные заметкиПусто
Хранятся только в вашем браузере (Prometheus · Скрейпинг: prometheus.yml и сервис-дискавери)

Вопросы и ответы по уроку

Какой scrape interval выбрать сервису?

Пятнадцать секунд — разумный старт: графики отзывчивы, хранилище растёт умеренно. Минута подойдёт для тяжёлых эндпоинтов и фоновых задач; пять секунд — только для узкого круга критичных задач, потому что объём сэмплов и нагрузка на endpoint растут пропорционально. Ключевое согласование: окна rate на дашбордах обязаны быть кратны интервалу с запасом в два-четыре раза.

Можно ли обойтись без сервис-дискавери?

Да, до десятка целей static_configs читается глазами и даже приятнее своей явностью. Дискавери нужен, когда цели появляются и исчезают без правки конфига: реплики за балансировщиком, поды при деплое. Промежуточный вариант — file_sd_configs: оркестратор пишет список целей в JSON-файл, Prometheus перечитывает его по расписанию, а yaml остаётся статичным.

Почему метрика up важнее любого графика?

up — единственная метрика, которую Prometheus пишет сам, от себя, о каждом опросе: единица при успехе, ноль при неудаче. Всё остальное приходит с таргета и молчит вместе с ним: когда сервис умер, его собственные метрики исчезают, и только up продолжает говорить. Алерт на up == 0 в течение пары минут — минимальный дежурный сигнал, dead man's switch строится на нём же.

Термины урока

Ключевые понятия из этого урока — короткие определения в глоссарии. Наведите на термин, чтобы вспомнить, откройте карточку для подробностей и ссылки на практику.

Следующая ступень учебного пути

WebSocket25 уроков~13 чпрактика25 уроков уже доступны

WebSocket в Go: real-time чаты и уведомления

Курс WebSocket на Go: gorilla/websocket, эхо-сервер, hub-паттерн, комнаты, авторизация соединений, ping/pong, reconnect и масштабирование. 25 уроков.

  • Поднимать WS-сервер и апгрейдить HTTP-соединения
  • Писать readPump/writePump без гонок на каждое соединение
  • Строить hub: регистрацию, рассылку и комнаты
  • Авторизовывать соединения и ограничивать сообщения