ІнфраструктураSenior

Алертинг

Алертинг — це те, як стан системи перетворюється на рішення когось розбудити. Алерт — це прохання перервати людину, і саме так його варто читати щоразу, коли пишеш новий. Більшість систем алертингу провалюються не тому, що щось пропускають, а тому, що кричать «вовки», доки черговий інженер не перестане їм вірити, — і це збій проєктування, а не проблема дисципліни. На цій сторінці — які умови заслуговують переривання, чому алерт на симптом кращий за алерт на причину, як SLO й швидкість спалювання перетворюють «сайт наче гальмує» на число, заради якого варто прокинутися, і що має існувати ще до того, як виклик буде надіслано.

Алерт — це
Переривання
Алертувати на
Симптоми, не причини
Кожен виклик потребує
Дії, зараз

Алерт — це прохання перервати людину

Алертинг зазвичай подають як технічне питання: яка метрика, який поріг, яке вікно. Куди краще розуміти його як питання етичне й організаційне, бо алерт насправді забирає людину з її вечора, сну чи зосередженості й наводить на проблему. Ця рамка дає перевірку, якої не дасть жодна суперечка про пороги: якщо це спрацює о третій ночі, чи є щось, що людина мусить зробити негайно, і чи знає вона що саме? Якщо хоч одна половина — «ні», це не виклик.

Два питання вирішують, куди належить умова, і жодне з них не про пороги. Чи мусить людина щось зробити — і чи мусить це щось статися зараз? Лише «так» на обидва заслуговує переривання: це виклик. «Так» на перше і «ні» на друге — це тікет: справжня робота, але запланована. «Ні» на перше при вигляді терміновості — небезпечний квадрант, бо когось будять через умову, на яку він не може вплинути; лагодити треба алерт, а не систему. А «ні» на обидва — це дашборд або метрика, а не алерт узагалі. Кожен виклик, що потрапив не в той квадрант, коштує більше за шум, який він робить, бо навчає чергового інженера, що виклики можна ігнорувати, — і цей урок буде застосовано до наступного справжнього.

Нижній лівий квадрант вартий довгого погляду, бо саме там більшість систем алертингу справді ламається. Умова виглядає терміновою, когось будять — і зробити немає чого: диск заповнюється на вузлі, який платформа однаково замінить; залежність деградувала, і її власники вже цим займаються; алерт спрацював на сплеску, що розсмоктався сам, поки ніхто не встиг відкрити ноутбук. Інстинкт — сказати інженерові бути терплячішим. Правильна реакція — змінити алерт, бо кожен виклик, на який не можна було зреагувати, є маленьким внеском у переконання, що виклики можна ігнорувати, — і це переконання знімають з рахунку під час справжнього.

Алертуйте на симптоми, а не на причини

Природний спосіб побудувати алертинг — перелічити те, що може зламатися, і повісити алерт на кожне: CPU понад 90%, памʼять понад 85%, диск понад 80%, реплік менше трьох, черга довша за тисячу. Кожне окремо виправдане, а набір є пасткою — з двох причин, що тягнуть у різні боки. Він постійно спрацьовує на умовах, які нікому не шкодять (пакетна задача законно тримає CPU десять хвилин), — і зовсім пропускає той збій, якого ніхто не перелічив, а саме він вас і кладе.

Алертинг на симптомах перевертає це. Замість питання, що може зламатися, спитайте, що відчуває користувач, коли вже зламалося, — і алертуйте на це: запити падають, запити повільні, черга не розбирається, замовлення не оформлюються. Таких умов на сервіс — жменя, вони покривають причини, яких ніхто не передбачив, і кожна з них за побудовою є тим, на що користувач поскаржився б, — і питання «чи варто когось будити» відповідає само собі.

Алерт на причинуАлерт на симптомЧому друге краще
CPU понад 90% пʼять хвилинp99 затримки понад цільВисокий CPU, що нікому не шкодить, — норма; повільні відповіді — ніколи.
Реплік менше трьохЧастка помилок понад цільДві репліки, що чудово обслуговують, — не інцидент. Запити, що падають, — так, за будь-якої кількості реплік.
Зʼєднань до бази близько до лімітуЗапити падають або тайм-аутятьсяПовний пул важить, лише якщо він відвертає користувачів, — а симптом міряє це прямо.
Конкретна задача впалаРезультат застарів або відсутнійЗадача може впасти й успішно повторитися; наслідки має саме те, що дані спізнюються.

SLO і швидкість спалювання: алерт на число, що має сенс

Алертингу на симптомах потрібна ціль, а обрана на дотик вона дає або алерт, який не спрацьовує ніколи, або такий, що спрацьовує щовівторка. Три терміни роблять ціль явною, і їх варто означити точно — бо вживають їх усюди приблизно.

  • SLI — це вимір: частка запитів, що завершилися успішно за 300 мс, числом від 0 до 1. Це відношення добрих подій до дійсних, а не середнє.
  • SLO — це ціль для цього виміру у вікні: 99,9% запитів за останні 28 днів. Це обіцянка, яку ви обираєте, а не та, яку дає система.
  • Бюджет помилок — це те, що SLO дозволяє: 0,1% від 28 днів — це близько 40 хвилин збоїв, які ви маєте право витратити, і витрачати їх нормально, а не є проявом браку дисципліни.

Саме бюджет робить алертинг притомним, бо перетворює питання без відповіді («чи 0,3% помилок — це погано?») на арифметичне («з такою швидкістю скільки лишилося до кінця місячного бюджету?»). Це відношення і є швидкістю спалювання: горіння на 1× витрачає бюджет рівно за вікно, а на 14,4× місячний бюджет зникає за два дні. Алертуйте на швидкість спалювання, а не на сиру частку помилок, — і той самий алерт покриє і раптову аварію, і повільну кровотечу, яку фіксований поріг завжди пропускає.

Швидке горіння — це виклик

  • Приблизно 14× від темпу бюджету, обчислено на короткому вікні — скажімо, за годину.
  • З таким темпом бюджет на 28 днів зникає приблизно за два дні: само не розсмокчеться.
  • Підтверджуйте другим, коротшим вікном, щоб сплеск, який уже спинився, нікого не будив.
  • Це той алерт, що йде на телефон уночі, і таких має бути дуже мало.

Повільне горіння — це тікет

  • Приблизно 3× від темпу бюджету на довгому вікні — шість годин або доба.
  • Справжня деградація, що дає дні, а не хвилини, — тобто час полагодити її завидна.
  • Ловить повільну кровотечу, якої фіксований поріг не бачить: 0,5% помилок окремо виглядають нормально.
  • Іде в чергу, яку переглядають у робочі години, і ніколи на телефон.

Втома від алертів — це збій проєктування

Коли черговий інженер перестає реагувати швидко, звичний діагноз — що людина ставиться несерйозно. Чесний діагноз — що система її цього навчила. Людина, яку двадцять разів на тиждень переривають умови, що виявилися нічим, засвоює — правильно й неминуче, — що наступне переривання теж, мабуть, ніщо. Це не витренувати; можна лише прибрати ті переривання, що це спричинили.

Механіки, що тримають обсяг стерпним, невидовищні — і вони працюють:

  • Групуйте повʼязані алерти в одне сповіщення. Залежність, що впала, має дати один виклик, а не по одному на кожен сервіс, що від неї залежить.
  • Придушуйте нижні, поки горить верхній, — щоб до людини дійшла причина, а не сорок наслідків.
  • Вимагайте тривалості, а не миті. Умова, що має протриматися пʼять хвилин, відсіює сплески, які минають самі.
  • Давайте кожному викликові посилання на ранбук із першими трьома речами для перевірки. Алерт без нього — це загадка для людини, що напівспить.
  • Щотижня переглядайте алерти, що спрацювали, і видаляйте або знижуйте ті, на які ніхто не зреагував. Ця зустріч і є всією дисципліною.
  • Стежте за кількістю викликів на зміну як за числом, яке має власника. Якщо його не міряти, воно лише зростає.

Що має існувати ще до того, як виклик надіслано

Алерт — це лише перша секунда процесу, і те, що йде після нього, вирішує, чи вартувало переривання хоч чогось. Чотири складові мають існувати до того, як алерт увімкнуть, — а не після першого інциденту, що доведе їхню відсутність.

  • Названий власник

    Чергування, а не список розсилки. Алерт, скерований у групу, де кожен припускає, що взяв хтось інший, — це алерт, якого не взяв ніхто.

  • Ранбук

    Із посиланням із самого алерту: що це означає, перші три перевірки, як помʼякшити і до кого ескалювати. Пишеться до алерту, завидна.

  • Ескалація з таймером

    Якщо ніхто не квітує за кілька хвилин, воно автоматично йде до наступного. Телефони бувають без звуку, і люди пропускають; система має це припускати.

  • Розбір після

    Безобвинувальний, зосереджений на тому, що уможливило збій і що зробило його важковидимим. Його результат — зміни, зокрема й до алерту, що його знайшов.

Один організаційний пункт варто сказати прямо, бо саме він вирішує, чи переживе все це зіткнення з завантаженим кварталом. Чергування має бути оплаченим і обмеженим: ротація достатньо велика, щоб ніхто не ніс її постійно; години, визнані роботою; і дозвіл лагодити причини викликів у звичайний час. Де цього немає, система алертингу деградує в передбачуваному напрямку: пороги послаблюють, алерти замовчують, і моніторинг тихо перестає описувати систему. Цей результат — не провал інженерів у ротації, і його не полагодити ще одним алертом.

Антипатерни, які варто назвати

  • Алерт на кожну метрику ресурсу на кожному хості: стіна викликів під час будь-якого звичайного сплеску навантаження.
  • Пороги, обрані один раз і ніколи не переглянуті: вони описують систему, у якої відтоді втричі зріс трафік.
  • Алерти в чат-канал, який усі замовчали, — це видалення з додатковими кроками.
  • Виклик без ранбука, вручений найновішому в ротації о другій ночі.
  • Моніторинг, що працює всередині того, що моніторить: аварія забирає з собою й алертинг.
  • Дашборд, який вважають моніторингом: він працює, лише поки хтось випадково на нього дивиться.

Коли це застосовувати

Застосовуйте, коли

  • Сервіс, де збій має наслідки протягом хвилин і людина справді може ці хвилини скоротити.
  • Умови, виражені як видимі користувачеві симптоми: запити падають, відповіді повільні, робота не завершується.
  • Дедлайни, які справді передбачувані: сертифікат, що спливає, диск, що заповниться до ранку.
  • Будь-яка система з ротацією чергувань, ранбуком на алерт і щотижневим розбором того, що справді спрацювало.

Уникайте, коли

  • Умови, на які сьогодні вночі ніхто не може вплинути: їм місце в тікеті, хай яким тривожним є число.
  • Метрики ресурсів як виклики, коли зайнятість ресурсу сама по собі нікому не шкодить.
  • Ціль, обрана тому, що вражає, а не з того, що потрібно користувачам і що профінансує бізнес.
  • Будь-який алерт без власника, ранбука й шляху ескалації: саме через їхню відсутність виклики лишаються без відповіді.

Було корисно?

Поділіться з тим, хто працює над тією ж задачею.