В зависимости от задачи (проверка основного файла prometheus.yml или файлов с правилами alerts/rules), вам понадобятся promtool или готовые linters/CI-интеграции.

promtool check config и check rules — не просто YAML-парсеры, они гоняют конфиг через ту же логику валидации, что и сам Prometheus при старте/reload. Вот что реально проверяется:

promtool check config

  • Соответствие схеме — неизвестные поля, опечатки в ключах отклоняются.
  • Семантика значений: promtool check config configs/prometheus/prometheus.yml ловит именно то, что мы видели с scrape_timeout > scrape_interval — это не синтаксис, а бизнес-правило.
  • Корректность duration-строк (15s, 1h30m и т.п.) и label names/values по regex, который требует Prometheus.
  • Рекурсивно проверяет все файлы из rule_files (по сути прогоняет через check rules), причём с флагом --lint, доступные опции: all, duplicate-rules, none — то есть дополнительно ищет дублирующиеся правила.
  • Валидность relabel_configs/metric_relabel_configs: допустимые action, компилируемость regex.
  • Existence-проверки: если в конфиге указаны tls_config.cert_file, bearer_token_file, password_file и т.п. — promtool проверит, что файлы по этим путям реально существуют на диске.
  • Корректность remote_write/remote_read/alerting.alertmanagers — валидность URL и вложенных auth-конфигов.

promtool check rules

  • PromQL-синтаксис каждого expr (recording и alerting rules).
  • Линтинг (тот же --lint) — сейчас в основном про дубликаты правил в группах; более широкий promql-лint (стиль метрик, by/without, суффиксы _total и т.д.) живёт отдельно в promtool check metrics — это уже про сами метрики, а не про конфиг.
  • Обязательность alert/record, expr; для alerting-правил — валидность for, labels, annotations.

Что ещё умеет promtool, кроме config/rules (из официальной документации): проверка правильности web-config файлов, health/readiness самого сервера, service discovery для конкретного job с учётом relabeling, линтинг метрик через stdin на consistency и cardinality — последнее (promtool check metrics, читает /metrics через stdin) полезно отдельно от конфига: ловит дубли HELP/TYPE, неправильные суффиксы единиц измерения и т.п.

amtool check-config (для Alertmanager) проверяет отдельный набор вещей:

  • Схему конфига (receivers, route, inhibit_rules, templates).
  • Что каждый receiver, упомянутый в дереве route (включая вложенные routes), реально объявлен в секции receivers — это частая ошибка руками, YAML при этом валиден, а Alertmanager не стартует.
  • Синтаксис матчеров (matchers: / старый match/match_re) — регулярки, корректность синтаксиса label="value".
  • Обязательные поля под конкретный тип интеграции (например, у slack_configs нужен api_url либо глобальный slack_api_url).
  • Валидность Go-template синтаксиса, если указаны кастомные templates.

Итого: если конфиг «синтаксически валиден», это ещё не значит, что Prometheus/Alertmanager с ним реально поднимется — как раз таймаут/интервал, несуществующие receiver'ы, отсутствующие файлы сертификатов — классические примеры того, что ловит именно семантическая проверка, а не парсер YAML.

1. Официальная утилита: promtool

Утилита promtool поставляется вместе с самим Prometheus и является самым надежным инструментом.

Установка:

  • Входит в официальный архив с Prometheus.
  • На Linux можно установить отдельно через пакетный менеджер (например, apt install prometheus-promtool) или скачать бинарь с GitHub.

Основные команды:

  • Проверка основного конфигурационного файла (prometheus.yml):
promtool check config /path/to/prometheus.yml

*Пример вывода:*
> SUCCESS: prometheus.yml is valid prometheus config file syntax.

  • Проверка файлов с правилами и алертами (rules/alerts):
promtool check rules /path/to/rules.yml
  • Тестирование правил алертинга (Unit Tests):

Если вы пишете сложные алерты, их можно покрыть тестами:

promtool test rules /path/to/test_suite.yml

---

2. Дополнительные линтеры и статический анализ

Если нужно не просто проверить синтаксис YAML, но и убедиться в качестве PromQL-запросов и наименований метрик:

Продвинутый линтер для правил Prometheus. Проверяет корректность PromQL, оптимизирует тяжелые запросы и следит за соблюдением Best Practices.

pint lint /path/to/rules.yml

Готовый Action для автоматической проверки конфигураций в PR:

- name: Validate Prometheus Config
  uses: docker://prom/prometheus:v2.50.0
  with:
    args: check config /github/workspace/prometheus.yml

---

3. Быстрый запуск через Docker (без установки promtool)

Если у вас установлен Docker, можно выполнить валидацию локального файла одной командой:

docker run --rm -v $(pwd):/etc/prometheus prom/prometheus:latest check config /etc/prometheus/prometheus.yml

делаем имидж для закрытого сегмента сети

# cat Dockerfile 
# syntax=docker/dockerfile:1
#
# Образ-"чемоданчик" с promtool (и amtool) для проверки конфигов Prometheus/
# Alertmanager. Сам процесс ничего не слушает и никуда не стучится в рантайме -
# просто висит, чтобы можно было зайти внутрь через `docker exec` и погонять
# promtool руками по смонтированным конфигам.
#
# Сборка требует интернета (тянем релизные тарболы с GitHub). Если сборочный
# хост тоже без сети - см. вариант "офлайн-сборка" в конце файла.

FROM alpine:3.20 AS builder

ARG PROM_VERSION=3.13.3
ARG AM_VERSION=0.28.1
ARG TARGETARCH=amd64

RUN apk add --no-cache curl tar

WORKDIR /tmp/build

RUN curl -fsSL -o prometheus.tar.gz \
      "https://github.com/prometheus/prometheus/releases/download/v${PROM_VERSION}/prometheus-${PROM_VERSION}.linux-${TARGETARCH}.tar.gz" \
    && tar -xzf prometheus.tar.gz \
    && cp prometheus-${PROM_VERSION}.linux-${TARGETARCH}/promtool /usr/local/bin/promtool

RUN curl -fsSL -o alertmanager.tar.gz \
      "https://github.com/prometheus/alertmanager/releases/download/v${AM_VERSION}/alertmanager-${AM_VERSION}.linux-${TARGETARCH}.tar.gz" \
    && tar -xzf alertmanager.tar.gz \
    && cp alertmanager-${AM_VERSION}.linux-${TARGETARCH}/amtool /usr/local/bin/amtool

# --- финальный образ -------------------------------------------------------
FROM alpine:3.20

RUN apk add --no-cache ca-certificates bash

COPY --from=builder /usr/local/bin/promtool /usr/local/bin/promtool
COPY --from=builder /usr/local/bin/amtool   /usr/local/bin/amtool

RUN promtool --version && amtool --version

WORKDIR /config

# Контейнер не запускает сервер и никого не слушает - просто спит,
# чтобы в него можно было зайти через docker exec.
CMD ["sleep", "infinity"]

# ----------------------------------------------------------------------------
# ВАРИАНТ ДЛЯ ПОЛНОСТЬЮ ОФЛАЙН-СБОРКИ:
# если у сборочного хоста тоже нет доступа в интернет, скачайте тарболы
# заранее на машине с сетью:
#   https://github.com/prometheus/prometheus/releases
#   https://github.com/prometheus/alertmanager/releases
# положите рядом с Dockerfile как prometheus.tar.gz / alertmanager.tar.gz
# и замените стадию builder на:
#
#   FROM alpine:3.20 AS builder
#   ARG PROM_VERSION=3.13.3
#   ARG AM_VERSION=0.28.1
#   RUN apk add --no-cache tar
#   COPY prometheus.tar.gz alertmanager.tar.gz /tmp/build/
#   WORKDIR /tmp/build
#   RUN tar -xzf prometheus.tar.gz && \
#       cp prometheus-${PROM_VERSION}.linux-amd64/promtool /usr/local/bin/promtool && \
#       tar -xzf alertmanager.tar.gz && \
#       cp alertmanager-${AM_VERSION}.linux-amd64/amtool /usr/local/bin/amtool
# ----------------------------------------------------------------------------

Самый простой способ схлопнуть все слои изменённого контейнера в один — docker export + docker import (в отличие от docker commit, который просто добавляет ещё один слой поверх старых).

# 1. Экспортируем файловую систему контейнера (плоский тарбол, без истории слоёв)
#    и сразу импортируем как новый образ - получаем ОДИН layer.
#    Метаданные (CMD, WORKDIR и т.п.) `export` не сохраняет - задаём их заново через -c.
docker export promcheck | docker import \
  -c 'WORKDIR /config' \
  -c 'CMD ["sleep", "infinity"]' \
  - promcheck:packed

# 2. Проверяем, что реально один слой
docker history promcheck:packed
docker images promcheck:packed   # заодно видно итоговый размер

# 3. Упаковываем для переноса в защищённый сегмент
docker save promcheck:packed -o promcheck-packed.tar

# на той стороне:
docker load -i promcheck-packed.tar

Важные нюансы:

  • export/import не тащат ENV, LABEL, EXPOSE, ENTRYPOINT и прочие метаданные из оригинального Dockerfile — их надо явно повторить через -c (--change), иначе они потеряются. У вас в образе было только WORKDIR и CMD, так что достаточно двух -c, как выше. Если добавляли ENV при апдейте пакетов вручную — допишите -c 'ENV ...'.
  • Если контейнер был запущен с docker run -d ... promcheck:latest, перед экспортом лучше его остановить (docker stop promcheck), чтобы не поймать файлы в промежуточном состоянии (актуально, если что-то пишется на диск в рантайме — у вас, впрочем, только sleep infinity, так что риска нет).
  • Альтернатива — docker commit с флагом сквоша нет, зато есть docker build --squash (BuildKit/experimental), но это применимо только при сборке из Dockerfile, а не к уже руками модифицированному контейнеру — так что для вашего кейса export/import правильнее.

самодостаточные бинарники

#!/usr/bin/env bash
# install-promcheck.sh - ставит promtool, amtool и обёртку promcheck
# в систему без Docker. Требует интернет на время установки
# (или заранее скачанные тарболы - см. переменные ниже).
set -euo pipefail

PROM_VERSION="${PROM_VERSION:-3.13.3}"
AM_VERSION="${AM_VERSION:-0.28.1}"
PREFIX="${PREFIX:-/usr/local/bin}"

ARCH="$(uname -m)"
case "$ARCH" in
  x86_64)  ARCH=amd64 ;;
  aarch64) ARCH=arm64 ;;
  *) echo "Неизвестная архитектура: $ARCH" >&2; exit 1 ;;
esac

TMP="$(mktemp -d)"
trap 'rm -rf "$TMP"' EXIT

echo "==> promtool ${PROM_VERSION} (${ARCH})"
curl -fsSL -o "$TMP/prometheus.tar.gz" \
  "https://github.com/prometheus/prometheus/releases/download/v${PROM_VERSION}/prometheus-${PROM_VERSION}.linux-${ARCH}.tar.gz"
tar -xzf "$TMP/prometheus.tar.gz" -C "$TMP"
install -m 0755 "$TMP/prometheus-${PROM_VERSION}.linux-${ARCH}/promtool" "$PREFIX/promtool"

echo "==> amtool ${AM_VERSION} (${ARCH})"
curl -fsSL -o "$TMP/alertmanager.tar.gz" \
  "https://github.com/prometheus/alertmanager/releases/download/v${AM_VERSION}/alertmanager-${AM_VERSION}.linux-${ARCH}.tar.gz"
tar -xzf "$TMP/alertmanager.tar.gz" -C "$TMP"
install -m 0755 "$TMP/alertmanager-${AM_VERSION}.linux-${ARCH}/amtool" "$PREFIX/amtool"

echo "==> обёртка promcheck"
SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
install -m 0755 "$SCRIPT_DIR/promcheck" "$PREFIX/promcheck"

echo
echo "Установлено в $PREFIX:"
"$PREFIX/promtool" --version 2>&1 | head -1
"$PREFIX/amtool" --version 2>&1 | head -1
echo "promcheck готов: promcheck --help"

# ----------------------------------------------------------------------------
# ОФЛАЙН-УСТАНОВКА (нет сети на целевой машине):
# на машине с сетью скачайте тарболы:
#   prometheus-${PROM_VERSION}.linux-${ARCH}.tar.gz
#   alertmanager-${AM_VERSION}.linux-${ARCH}.tar.gz
# положите рядом с этим скриптом и запустите с флагом OFFLINE=1:
#   OFFLINE=1 ./install-promcheck.sh
# (при OFFLINE=1 скрипт берёт файлы из своей директории вместо curl -
#  добавьте эту ветку, если понадобится, сейчас не реализована ради простоты)
# ----------------------------------------------------------------------------

***