Alertmanager отвечает 404 на /api/v2/alerts: внешний префикс распространён на весь API #3161

Closed
opened 2026-08-27 18:16:27 +00:00 by bot-backend · 1 comment
Collaborator

Найдено приёмочной проверкой #3155 — на том же пути обнаружился второй, независимый отказ.

Симптом

После #3160 Prometheus приёмник видит:

activeAlertmanagers: [{"url":"http://alertmanager:9093/api/v2/alerts"}]
prometheus_notifications_alertmanagers_discovered 1

и даже отправляет. Но до Alertmanager ничего не доходит:

prometheus_notifications_sent_total{...}   1
prometheus_notifications_errors_total{...} 1
prometheus_notifications_dropped_total     1
alertmanager_alerts_received_total{status="firing"} 0

Причина

--web.external-url=https://metrics.gendsgn.ru/alertmanager без --web.route-prefix=/ заставляет Alertmanager обслуживать всё под этим префиксом. Проверено прямой пробой из контейнера Prometheus:

путь ответ
/api/v2/status 404
/alertmanager/api/v2/status 200

Prometheus пишет в первый.

Снаружи префикс при этом не нужен никому: маршрута /alertmanager в Caddy нет вовсе (caddy/sites/infra.caddy — есть /ingest/* и /ack/*, больше ничего), внешний адрес используется только для формирования ссылок.

Отдельно поучительное

Симптом этого же префикса уже ловили сегодня — на healthcheck: /-/healthy отдавал 404, контейнер бессрочно висел unhealthy. Вылечили на стороне проверки, прописав ей путь с префиксом, и в комментарии зафиксировали, что префикс распространяется на все служебные ручки. Причина осталась жива и продолжила ломать главное — доставку.

Что делаю

Добавляю --web.route-prefix=/ (тот же флаг и по той же причине уже стоит у Prometheus в этом же файле), healthcheck возвращаю на обычный путь.

Заодно оживает датасорс Alertmanager в Grafana (ops/metrics/grafana/provisioning/datasources/datasources.yml:37) — он настроен на корень и до сих пор упирался в тот же 404.

Найдено приёмочной проверкой #3155 — на том же пути обнаружился второй, независимый отказ. ## Симптом После #3160 Prometheus приёмник **видит**: ``` activeAlertmanagers: [{"url":"http://alertmanager:9093/api/v2/alerts"}] prometheus_notifications_alertmanagers_discovered 1 ``` и даже отправляет. Но до Alertmanager ничего не доходит: ``` prometheus_notifications_sent_total{...} 1 prometheus_notifications_errors_total{...} 1 prometheus_notifications_dropped_total 1 alertmanager_alerts_received_total{status="firing"} 0 ``` ## Причина `--web.external-url=https://metrics.gendsgn.ru/alertmanager` **без** `--web.route-prefix=/` заставляет Alertmanager обслуживать всё под этим префиксом. Проверено прямой пробой из контейнера Prometheus: | путь | ответ | |---|---| | `/api/v2/status` | 404 | | `/alertmanager/api/v2/status` | 200 | Prometheus пишет в первый. Снаружи префикс при этом не нужен никому: маршрута `/alertmanager` в Caddy нет вовсе (`caddy/sites/infra.caddy` — есть `/ingest/*` и `/ack/*`, больше ничего), внешний адрес используется только для формирования ссылок. ## Отдельно поучительное Симптом этого же префикса уже ловили сегодня — на healthcheck: `/-/healthy` отдавал 404, контейнер бессрочно висел `unhealthy`. Вылечили **на стороне проверки**, прописав ей путь с префиксом, и в комментарии зафиксировали, что префикс распространяется на все служебные ручки. Причина осталась жива и продолжила ломать главное — доставку. ## Что делаю Добавляю `--web.route-prefix=/` (тот же флаг и по той же причине уже стоит у Prometheus в этом же файле), healthcheck возвращаю на обычный путь. Заодно оживает датасорс Alertmanager в Grafana (`ops/metrics/grafana/provisioning/datasources/datasources.yml:37`) — он настроен на корень и до сих пор упирался в тот же 404.
Author
Collaborator

Приёмка пройдена — цепочка проверена целиком

Замер после деплоя обоих исправлений (#3160 + #3162):

Что Значение
prometheus_notifications_alertmanagers_discovered 1 (было 0)
prometheus_notifications_sent_total 4, растёт
prometheus_notifications_errors_total 3 и не растёт (все три — до #3162)
alertmanager_alerts_received_total{firing} 1 (было 0)
alertmanager_notifications_total{integration="telegram"} 1
alertmanager_notifications_failed_total{telegram,*} 0
health контейнера healthy на обычном пути

То есть Watchdog, горевший с 26.08 10:19 и до сегодня уходивший в dropped_total, доехал до Telegram: маршрут telegram-heartbeat шлёт « Мониторинг жив — сторож отчитался, канал доставки работает» и повторяет раз в 12 часов.

Дефект оказался двойным: пустая цель file_sd (этот тикет) и внешний префикс, распространённый на весь API Alertmanager (#3161). Первый прятал второй — пока Prometheus не находил приёмник, 404 на /api/v2/alerts не мог проявиться.

## Приёмка пройдена — цепочка проверена целиком Замер после деплоя обоих исправлений (#3160 + #3162): | Что | Значение | |---|---| | `prometheus_notifications_alertmanagers_discovered` | **1** (было 0) | | `prometheus_notifications_sent_total` | 4, растёт | | `prometheus_notifications_errors_total` | 3 и **не растёт** (все три — до #3162) | | `alertmanager_alerts_received_total{firing}` | **1** (было 0) | | `alertmanager_notifications_total{integration="telegram"}` | **1** | | `alertmanager_notifications_failed_total{telegram,*}` | **0** | | health контейнера | `healthy` на обычном пути | То есть `Watchdog`, горевший с 26.08 10:19 и до сегодня уходивший в `dropped_total`, доехал до Telegram: маршрут `telegram-heartbeat` шлёт «⚪ Мониторинг жив — сторож отчитался, канал доставки работает» и повторяет раз в 12 часов. Дефект оказался двойным: пустая цель file_sd (этот тикет) и внешний префикс, распространённый на весь API Alertmanager (#3161). Первый прятал второй — пока Prometheus не находил приёмник, 404 на `/api/v2/alerts` не мог проявиться.
Sign in to join this conversation.
No milestone
No project
No assignees
1 participant
Notifications
Due date
The due date is invalid or out of range. Please use the format "yyyy-mm-dd".

No due date set.

Dependencies

No dependencies set.

Reference: lekss361/gendesign#3161
No description provided.