Блог ·
Інцидент, який не закривається на мовчанні
Інцидент моніторингу має відкриватися на вимірюванні й закриватися на вимірюванні. Ось що ламається, коли відсутність даних дозволено вважати доброю новиною.
Автор: Provibr
Кожна система моніторингу рано чи пізно стикається з тим самим питанням у трохи іншому вбранні: що робити, коли вимірювання перестають надходити?
Спокуслива відповідь полягає в тому, щоб вважати це відновленням. Ніщо більше не падає, червоний рядок зникає, панель спокійна. Це також найдорожча брехня, яку система здатна сказати, бо мить, коли ви втрачаєте змогу дивитися на щось, є рівно тією миттю, коли не можна стверджувати, що з ним усе гаразд.
Ось конструкція, до якої ми дійшли для інцидентів, і здебільшого вона про те, щоб тримати «ми виміряли, що воно зламане», «ми виміряли, що воно полагоджене» і «ми зараз його не бачимо» трьома окремими твердженнями, які ніколи тихо не перетворюються одне на одне.
Чому інцидент є обʼєктом
До цього збій був низкою рядків у таблиці переходів стану. Цього досить, щоб намалювати графік, і не досить, щоб щось сказати. Три речі існують лише тоді, коли є обʼєкт.
Тривалість. Повідомлення про відновлення раніше взагалі не несло тривалості, бо не було чим заповнити параметр. У інциденту є початок, тож тривалість є вимірюванням, а не оцінкою.
Людський шар. Підтвердити, призначити й закрити вручну це те, що роблять люди, і воно не має торкатися виміряного стану. Колонка acknowledged_at на вимірюванні розмила б рівно ту межу, на якій побудована вся ця функція.
Дедуплікація в часі. Одне сповіщення при відкритті, нагадування за власним годинником, щонайбільше одна ескалація. Без обʼєкта немає на що повісити «вам уже сказали», і тоді кожен такт є новою нагодою сказати вам знову.
Дедуплікація є індексом
Унікальність, яка не дає двом інцидентам існувати для одного правила, є частковим унікальним індексом на правилі, де мітка часу закриття порожня. Два шлюзи, що обробляють той самий перехід, за побудовою дають один інцидент; другий отримує порушення унікальності й іде далі.
Код, який перевіряє, чи такий уже існує, а потім вставляє, це два оператори, тобто дві нагоди для чогось прослизнути між ними. Це та сама форма, що й індекс слотів планувальника й індекс зайнятості стійки деінде в цьому продукті, і з тієї самої причини.
Була тут і по-справжньому ганебна помилка, яку варто записати, бо на рецензії вона невидима. Ключ дедуплікації для сповіщення будувався з правила, нового стану й поточної мітки часу. Ключ, що містить поточну мітку часу, за побудовою не дедуплікує нічого, і на екрані має цілком розумний вигляд. Тепер ним є ідентифікатор інциденту. Виміряно потім: три послідовні відмови дають один інцидент і одне сповіщення, а ще три не змінюють нічого.
Три способи, якими інцидент може скінчитися, і лише один є вимірюванням
| Закриття | Що воно стверджує | Що записується разом із ним |
|---|---|---|
recovered | ми знову виміряли здоровий стан | результат, який його закрив, збережений на стрічці |
configuration_retired | правило, що його відкрило, більше нічого не міряє | немає, і його не стверджують |
manual | інцидент закрила людина | хто, і за бажанням чому |
Середній рядок є сенсом усього списку. Правило, яке замінює ревізія шаблона, мусить закрити свої відкриті інциденти, і зробити це воно мусить без хибного вимірювання відновлення. Якби єдиним доступним закриттям було recovered, заміна шаблона тихо записала б «це піднялося» в історію кожної служби, що на той момент лежала.
Закриття stale навмисно не існує. Те, що вимірювання перестали надходити, не каже про ціль нічого.
Які переходи взагалі торкаються інциденту
Інцидент висить на твердженні про ціль. Тому перехід у стан «джерело недоступне», тобто наш власний агент зник, не відкриває нічого і, що важливіше, нічого не закриває. Якби агент, що йде, міг закрити інцидент, живий збій зникав би з очей рівно тієї миті, коли ми втрачаємо змогу дивитися.
Перехід у стан «помилка конфігурації» поводиться так само: правило більше не описує нічого вимірюваного, а це твердження про нас, а не про службу.
Стан «деградовано» інцидент таки закриває. Служба відповідає, умову зараховано як здорову, високою є лише затримка. Лишити інцидент відкритим означало б зробити з повільної служби вічно відкритий збій, разом із нагадуваннями.
Під цим, ще з попереднього раунду, лежить жорстке розрізнення між недосяжним джерелом і ціллю, яка лежить. Перевірка, чий агент не приєднаний, дає «джерело недоступне» і ніколи не дає «недоступна». Усе вище є тим самим правилом, на шар вище.
Обслуговування глушить сповіщення й далі міряє
Вікно обслуговування придушує сповіщення. Воно не придушує вимірювання. Інцидент усе одно відкривається, стрічка все одно йде, і лише повідомлення лишається у висувній панелі.
Це не дрібниця. Питання, яке люди ставлять після вікна обслуговування, це «чи воно повернулося вчасно», а відповіді на нього немає, якщо ви припинили міряти саме тоді, коли це важило. Є окремий явний прапорець, який таки ставить перевірки на паузу, і типово він вимкнений; із ним планувальник не займає слот, тож ніщо не настає і ніщо не пропускається. Лишається по собі одна позначка прогалини, така сама, як для будь-якої іншої прогалини. Наздоганяння немає.
Саме вікно зберігається як абсолютний інтервал із часовим поясом IANA поруч. Клієнт уводить час за годинником на стіні й хоче прочитати його назад як той самий час за годинником на стіні, хоч панель рендерить у фіксованому поясі. Зберігання настінного часу разом із поясом натомість змусило б кожного читача, і планувальник, і приймання, і екран однаково, робити перетворення заново, і тоді перехід на літній час є годиною незгоди між двома з них.
Де два вікна перекриваються, перемагає те, яке ставить перевірки на паузу. Коли клієнт десь явно зробив суворіший вибір, шанувати треба саме той вибір.
Нагадування, ескалація і порядок двох тверджень
І інтервал нагадувань, і затримка ескалації живуть на ревізії правила, а не на інциденті, бо це конфігурація, а конфігурація належить тій ревізії, що її записала. Змініть політику під час збою, і поточний інцидент лишиться під політикою, з якою відкрився.
Обидва типово вимкнені. Типове значення, що будить людей уночі, є рішенням, якого клієнт не ухвалював.
Підтвердження глушить нагадування, і це вся функція підтвердження. Того, хто каже «я цим займаюся», не варто перебивати кожні кілька хвилин. Сповіщення про відновлення все одно приходить, бо це відповідь на питання, яким людина займалася. Годинник нагадувань до того ж рахує від останнього нагадування, а не від початку, тож робітник, який надолужує через годину, не доставляє дванадцять нагадувань одразу.
Робітник спершу записує мітку часу, а вже потім надсилає повідомлення, і оновлення вимагає, щоб стан і далі був тим, який він прочитав. Програйте ці перегони, і тут не станеться нічого. У зворотному порядку програні перегони дають повідомлення без запису про нього, і тоді повідомлення приходить знову наступного разу.
Ескалація стається щонайбільше раз на інцидент, і перевірка цього живе у спільному правилі, а не в робітнику. Без неї кожен прохід записував би ще одну подію ескалації, доки триває збій: тридцять на годину при опитуванні раз на дві хвилини.
Flapping є винятком, і його вирішують тоді, коли інцидент відкривається: три інциденти на одному правилі протягом години. Перевірка, що страждає на flapping, за визначенням ніколи не має інциденту, який лишається відкритим надовго, тож будь-яка ескалація за часом не помічає її ніколи. Три, а не два, бо двічі це невдача, і поріг у два називав би flapping кожне звичайне перезавантаження служби. Година, а не доба, бо три збої, рознесені по робочому дню, є трьома збоями.
Тривалість є числом і одиницею
Повідомлення про відновлення несе те, скільки все тривало, як значення й одиницю, і ніколи як речення. Якби робітник сам складав «1 hour 12 minutes», той англійський фрагмент сидів би посеред перекладеного речення вісьмома іншими мовами. Натомість їде одиниця, на якій вибирає переклад, із множиною всередині кожної гілки.
Одна одиниця, без складених: складеній потрібні розділювач і порядок, а вони відрізняються від мови до мови. Секунди нижче хвилини, хвилини до двох годин, години до двох діб, далі доби. Девʼяносто хвилин читаються різкіше, ніж дві години, а округлення вгору зробило б із 89-хвилинного збою двогодинний.
Два чесні наслідки, яких ми не виправили
Падіння, відновлення й нагадування поділяють спільний ключ групи сповіщень, бо нагадування є буквально тією самою темою знову і має оновлювати наявний рядок, а не додавати новий щоразу, коли спрацьовує годинник. Ціною є те, що нагадування оновлює рядок, який хтось уже прочитав, і тому для нього невидиме. Ескалація дістає власну групу рівно з цієї причини: повідомлення, яке має влучити найсильніше, не повинно бути тим, яке перезаписують першим. Сповіщення моніторингу сьогодні не йдуть поштою.
Що ми б записали
- Ніколи не дозволяйте відсутності даних щось закривати. Дайте стану «ми цього не бачимо» власне місце й подбайте, щоб він не відкривав і не закривав інциденту.
- Дайте інцидентові обʼєкт, щойно вам знадобиться тривалість, підтвердження або друге повідомлення про те саме.
- Покладіть дедуплікацію в унікальний індекс і перевірте, що ваш ключ сповіщення не містить поточного часу.
- Перелічіть, як інцидент може скінчитися, і вимагайте доказу лише там, де доказ стверджують.
- Придушуйте під час обслуговування сповіщення, а не вимірювання, і зробіть паузу перевірок окремим явним вибором, типово вимкненим.
- Оновіть стан, а потім надішліть повідомлення. Зворотний порядок тихо втрачає повідомлення.
Ця робота стоїть за прапорцем розгортання, який типово вимкнений, тож нічого з цього сьогодні купити не можна. Це записано як метод, а не як анонс. Шар вимірювань під нею, разом із тим, чому недосяжний агент не є службою, що падає, є окремою історією, а тісно повʼязане питання про те, коли платформа взагалі має право назвати час, є в індикатор, який відмовляється вгадувати.
З роботи над платформою Provibr.