Заметка для самых маленьких.
Прилетает алерт "
KubernetesStatefulsetDown".Брр, ну ок, смотрю что не так.
А, понял! Судя по названию приложения
statefulset, это же наш новый тестовый неймспейс test-project.Там сейчас на пару месяцев будут тесты, нам не нужны эти алерты.
Можно добавить и сайленс, но сайленс работает лишь до первого рестарта алертменеджера и не хранит стейт.
Хочу полностью отключить все алерты на этом неймспейсе.
Иду в алертменеджер, добавляю рут в начале типа
routes:
...
- receiver: 'null'
matchers:
- namespace = "test-project"
continue: false
....
тут дальше остальные руты на нормальные ресиверы
Применяю, всё ок.
Проходит час - снова этот же алёрт.
Может опечатка? Может конфиг поломанный?
Смотрим что у нас в логах vmalert/alertmanager.
kubectl logs vmalert-podname
...
... Rules reloaded successfully from ... yaml
...
Да не, время совпадает - применилось недавно мной.
Ладно. Идём в git к алёрту, смотрим что там у него в
expr.expr: kube_statefulset_replicas != kube_statefulset_status_replicas_ready > 0
Ну всё эээ понятно. Всё просто. Никаких вопросов.
Пока ковырялся, пришёл ещё алерт, такой же.
Не понял, иду в https://prometheus.io/webtools/alerting/routing-tree-editor/
Копирую туда часть конфига алертменеджера с рутами.
Дальше проверяю на namespace
{namespace="test-project"). Матчинг, идёт в
null, как и должно.Бред, возвращаюсь в git к алерту.
Копирую expr
kube_statefulset_replicas != kube_statefulset_status_replicas_ready > 0
иду в prometheus/VM/grafana explore, вставляю:
Да, вижу респонс метрики с лейблами.
kube_statefulset_replicas
{
container="kube-state-metrics",
endpoint="http",
instance="10.0.115.164:8080",
job="kube-state-metrics",
namespace="test-project",
pod="kube-state-metrics-6794d79b55-sf879",
service="kube-state-metrics",
statefulset="fake-app"
}
Хм, всё есть - лейбл
namespace и он не пустой.По второй метрике так же есть лейбл
namespace.Но ведь магии не бывает (ну кроме тех случаях, когда руководство постоянно забывает про наши просьбы поднять зарплату, там точно магия поработала, не иначе)
В третий раз, словно старик закидывает невод в море, иду к алёртам. Теперь смотрю всё и сразу.
- alert: KubernetesStatefulsetDown
expr: kube_statefulset_replicas != kube_statefulset_status_replicas_ready > 0
for: 1m
labels:
...
severity: critical
namespace: '{{ $labels.namespac }}'
statefulset: '{{ $labels.statefulset }}'
...
annotations:
summary: ...
Сразу же видна причина, можно было бы и раньше увидеть🤡.
Зачем-то, скорее всего копипастой, был добавлен лейбл неймспейса. Дубль. С опечаткой в названии.
Лейбла
namespac у нас нет в метрике, а значит пустым значением от namespac перетирается значение namespace. В итоге до алёртменеджера алёрт приходил с пустым значением
namespace и все рулсы рутов игнорировались(ведь нет матчинга).Я такие случаи называю "
broken downstream-routing".Поиском поискал ещё опечатки, нашёл ещё три шутки, поправил(конкретно в этом алерте я просто удалил, он совсем тут не нужен), проверил в ВМ и отправил MR.
Наступила тишина в слак канале и можно попить кофе.☕️
.
..
...
....
А не, хер мне, а не отдых.
Теперь при верном неймспейсе заработали другие три алерта и прилетела новая проблема, ранее не замеченная из-за кривого лейбла. И это уже прод.
Эх, ну значит потом кофе попью😭.
Поехали чинить..