Постмортем (postmortem, разбор сбоя) — документ, который пишут
после инцидента (incident-response), когда сервис уже работает.
В нём четыре части: что происходило по минутам, что почувствовали
пользователи, почему так вышло и что команда изменит. Цель — чтобы
тот же сбой не повторился и чтобы его опыт достался всем, кто не был
на смене.
# Разбор: сайт не отвечал 22.10
### Хронология
12:00:40 выкладка поменяла конфиг сайта; reload nginx не прошёл
12:00:52 плановый перезапуск nginx — не запустился:
unknown directive "proxy_pas"
12:00:53 lab-sitecheck: сайт не отвечает — начало сбоя
12:01:21 lab-sitecheck: сайт 200 — конец сбоя
### Влияние
28 с сайт не отвечал никому: 0,2 % бюджета ошибок за 30 дней
при SLO 99,5 %.
### Причина
Опечатка в конфиге сайта. Выкладка не запускала `nginx -t`,
неудачный reload никто не заметил, перезапуск остановил сайт.
### Действия
- Выкладка запускает `nginx -t` и останавливается при ошибке.
- Алерт на неудачный reload nginx.
По-английски разделы называются Timeline, Impact, Root cause и
Action items.
Хронология
Хронология — события сбоя по времени, строка на событие: время в
UTC первым, затем факт. Формат тот же, что у хронологии по ходу
инцидента (incident-response):
Если по ходу её не вели, хронологию собирают из журналов. Каждый
источник знает своё:
| Источник |
Что в нём видно |
journalctl -t sudo |
действия людей: кто, когда, какую команду |
journalctl -u <служба> |
что делала программа: старт, ошибка, остановка |
| проверка сайта, access.log |
что видели пользователи: коды и время ответа |
| алерты |
когда команда узнала о сбое |
Начало и конец сбоя берут по тому, что видели пользователи: первая
ошибка в access.log или в проверке сайта, первый успешный ответ после
них. Время правки — отдельная строка. Между правкой и началом сбоя
бывают секунды, а бывают дни: опечатка лежит в файле, пока службу не
перезапустят. Строки журнала годятся в хронологию как есть
(-o short-iso), их только сокращают до факта.
Без поиска виноватых
Разбор без поиска виноватых (blameless) исходит из того, что люди
ошибаются всегда, а система должна ловить ошибку раньше
пользователей. Вопрос разбора — что позволило ошибке дойти до них:
какой проверки не было, чего не было видно, почему откат занял
десять минут.
Поэтому в разборе роли вместо имён: «выкладка», «дежурный», deploy.
Человек, которого назвали виноватым, в следующий раз промолчит о
своей ошибке, и сбой будут искать дольше.
Причина
Причина сбоя редко одна. Обычно это пара:
- скрытая поломка — то, что было сломано заранее и ждало:
опечатка в конфиге, полный на 95 % диск, просроченный сертификат;
- спусковой крючок — событие, после которого поломка стала видна:
перезапуск, рост нагрузки, ночная ротация.
Дойти до них помогает цепочка «почему»: сайт не отвечал — nginx не
запустился — в конфиге опечатка — выкладка не проверила конфиг —
проверки в выкладке нет. Цепочку останавливают на том, что команда
может изменить. В раздел «Причина» пишут сломанные компоненты по
именам: конфиг сайта nginx, pg_hba.conf, правило алерта.
Влияние
Сколько длился сбой (по пользователям), сколько запросов упало, какую
долю бюджета ошибок он съел (sli-slo). Цифры берут из
access.log за окно сбоя — рецепт ниже.
Действия
Действия (action items) — что команда изменит, чтобы сбой не
повторился или был найден раньше. Каждое — конкретное и проверяемое,
с владельцем и сроком:
| Расплывчато |
Проверяемо |
| быть внимательнее при выкладке |
выкладка запускает nginx -t и останавливается при ошибке |
| следить за диском |
алерт при заполнении /var больше 80 % |
| лучше тестировать |
тест на конфиг в CI репозитория конфигов |
Действие «быть внимательнее» проверить нельзя, и через месяц сбой
повторится.