Change Failure Rate: чому відмови випусків не видно команді
Команда викочує по кілька разів на день: конвеєр зелений, перевірки пройдено, артефакт доставлено.
Поставка стала рутиною, і саме тому питання про те, скільки випусків довелося відкотити або терміново полагодити протягом доби, застає зненацька — виразного числа немає ні в чергового інженера, ні в керівника напряму.
Причина в устрої обліку. Відкат живе в терміналі чергового, аварія — у системі оповіщень, ручна правка на сервері не фіксується взагалі ніде. Зв'язок між випуском і наступним збоєм відновлюють з пам'яті вже на розборі аварій, коли важливіше знайти винного, ніж порахувати. Частка невдалих змін існує лише як відчуття «наче стало більше».
Change Failure Rate перетворює це відчуття на число: відношення відкатів і екстрених виправлень до загальної кількості випусків за період. Ознака невдачі задається формально — повернення на попередню збірку, випуск виправлення поза планом, зміна конфігурації в обхід регламенту. Якість релізів стає видно на панелі моніторингу щодня, а не лише після великого збою.
Основна складність — тегування. В історії випусків має залишатися ознака: який артефакт пішов, хто підтвердив успіх, що сталося у вікні спостереження після викочування.
Тоді облік відкатів випусків перестає залежати від сумлінності чергового, а причини відкатів складаються в групи — конфігурація, міграції, зовнішні залежності, брак перевірок на конкретних шляхах.
Розбираємо, як поставити це вимірювання на наявний процес випуску, не додаючи ручної роботи інженерам.
Що дає регулярне вимірювання failure rate у розробці
Метрика сама по собі нічого не покращує — ефект дає замкнений контур: зміна йде в реліз, збій фіксується, розбір закінчується правкою самого процесу.
Підхід сягає досліджень DORA: команди, які рахують частку відкатів регулярно, швидше пов'язують причину з наслідком і перестають обговорювати надійність на рівні відчуттів.
| Що на обліку | Що стає видно | Що змінюється |
|---|---|---|
| Частка невдалих змін | Яка частина релізів закінчується відкатом або терміновим виправленням | З'являється база для порівняння між версіями й командами |
| Час розбору інциденту | Де втрачається час — у виявленні чи у відновленні | Діагностика перестає бути ручною |
| Причини відмов за категоріями | Які класи збоїв повторюються | Повторювані сценарії закриваються автоматичними перевірками |
| Динаміка за релізами | Чи працюють внесені зміни в процесі | Рішення про пріоритети спираються на дані, а не на думки |
Чек-лист сходиться в одну картину: якщо частка відкатів стоїть на місці, а час розбору зростає, вузьке місце — у діагностиці, а не в якості коду. Якщо зростає все разом — проблема в самих змінах і в тому, як вони перевіряються перед викочуванням.
Зворотний зв'язок щодо якості стискається з тижнів до годин: інженер бачить наслідки своєї зміни в тому самому циклі роботи.
Заодно зникає цілий клас відмов — ті, що спричинені ручними кроками під час викочування та відсутністю перевірок перед релізом: кожен такий випадок тепер потрапляє в облік і отримує конкретне виправлення.
Формати обліку невдалих змін: порівняння підходів
Рахувати частку невдалих змін можна по-різному, і перше, що визначає підхід, — класифікація.
Поки не зафіксовано, що саме вважається невдалою зміною (повний відкат релізу, аварійне виправлення, вимкнення функціональності флагом, відкат конфігурації), кожна команда рахує по-своєму, і цифри непорівнянні між звітами.
Другий чинник — чи є в контурі доставки єдиний ідентифікатор зміни, за яким викочування пов'язується з наступним інцидентом.
| Варіант | Коли підходить | Обмеження |
|---|---|---|
| Ручний розбір інцидентів | Десятки релізів на квартал, різнорідні контури, немає наскрізної телеметрії | Оцінка суб'єктивна й запізнюється; ручне розмічання не масштабується на зростання частоти викочувань |
| Автоматичний збір метрики | Єдиний конвеєр збірки та викочування, події деплою й алерти пишуться в одну систему | Хибні зв'язки за паралельних викочувань; без розмічання причин відкат не відокремити від планової зміни |
| Гібридний облік відмов | Часті релізи плюс вимоги аудиту й розбору інцидентів | Потрібен регламент розмічання й відповідальний; спірні випадки все одно розбирає людина |
Джерел даних про інциденти за автоматичного збору зазвичай три: події викочування з контуру доставки, алерти моніторингу й тікети системи обліку звернень.
Зв'язка «викочування → алерт → тікет» дає зв'язок, який можна перевірити очима: системи чергувань на кшталт PagerDuty віддають час спрацювання, а трекер — факт інциденту та його причину.
На практиці стійку метрику дає гібридний варіант: повністю ручний розбір розходиться в рази між розбирачами, а повністю автоматичний ловить зайві спрацювання.
Як ми впроваджуємо облік невдалих змін: етапи робіт
Облік частки невдалих змін (Change Failure Rate) тримається на одному: метрика чесна рівно настільки, наскільки однозначно визначено поняття «невдала зміна».
Тому порядок робіт будується від узгодження визначення до перевірки на історичних даних — інакше за місяць цифри розходяться з реальністю, і метриці перестають вірити.
- Узгодження визначення відкату. Фіксуємо, що вважаємо невдалою зміною: повернення релізу, аварійний виправляючий випуск, вимкнення функціональності флагом. Спірні випадки розбираємо з командою й записуємо в регламент.
- Аудит історії випусків. Зіставляємо журнали релізів, задачі в системі обліку й записи про інциденти за минулий період. Так видно, де дані вже є, де прогалини і якою є базова частка невдалих змін.
- Схема збору даних. Визначаємо джерела та правило зв'язку: як подія зміни зіставляється з інцидентом — за міткою, за часом чи вручну.
- Налаштування збору. Заводимо єдиний ідентифікатор зміни, який проходить через усі системи, налаштовуємо розрахунок частки та розбивку за сервісами й командами.
- Перевірка на минулих релізах. Проганяємо механіку на історичних даних і звіряємо з ручним розбором кількох випусків. Розходження пояснюємо й правимо правила зіставлення, поки цифри не зійдуться.
- Регламент і пороги. Фіксуємо, хто дивиться метрику, який рівень вважаємо нормою і що робимо при виході за нього — розбір причин без пошуку винних.
- Передача. Віддаємо схему, документацію й доступи, навчаємо чергових; за місяць звіряємо дані й коригуємо при зміні джерел.
Регламент, панель і схеми розбору відмов випусків
Метрика живе не у звіті, а в артефактах, які залишаються у вашому репозиторії та у вашій зоні відповідальності.
Збираємо їх так, щоб за пів року новий інженер відкрив репозиторій і зрозумів, звідки беруться цифри, чому конкретний випуск потрапив у відмову і як змінити правило, якщо визначення змінилося.
- Конфігурації збору — правила, за якими історія випусків та інцидентів зводиться в одну метрику Change Failure Rate (частка невдалих змін), із зазначенням джерел і періодичності перерахунку.
- Схема класифікації інцидентів — що відносимо до відмови випуску, що вважаємо відкатом, що плановою деградацією, а що зовнішнім збоєм і з розрахунку виключаємо.
- Панель показників релізів — динаміка за тижнями, розбивка за сервісами й командами, нанесений поріг, за якого випуск визнається невдалим.
- Регламент розбору відмов — хто веде розбір, склад учасників, строки фіксації причини і що вважається розбором закритим.
- Документація щодо метрики — визначення, формула, список джерел, відомі обмеження й історія змін у правилах обліку.
- Права доступу до даних — роли: хто бачить деталі інцидентів і вивантаження, хто лише агрегати, хто може змінювати схему класифікації.
- Інструкції з експлуатації — як підключити новий сервіс, як виправити правило обліку і що робити при розходженні даних із ручним вивантаженням.
Перші два-три розбори проводимо разом із вашою командою, далі вона веде їх сама — регламент для цього й написаний. Опишіть задачу, повернемося з оцінкою та планом.
Кейс: failure rate знизився втричі після налаштування обліку
До впровадження метрики картина щодо відмов збиралася з розрізнених джерел: інженери писали в нотатках, керівники раз на місяць проводили ручні опитування, а сам факт невдачі кожен трактував по-своєму.
Три команди — три визначення: в однієї відкат протягом години вважався інцидентом, у іншої — ні. Сперечатися про динаміку відкатів у таких умовах безглуздо: цифри не сходилися навіть між сусідніми релізами.
Як побудували облік
Спочатку зафіксували одне визначення Change Failure Rate: невдала зміна — та, яка протягом обумовленого вікна після викочування зажадала відкату або аварійного виправлення.
Позначки про інциденти прив'язали до конкретних випусків через GitLab — теги, номери збірок і записи про відкати опинилися в одному місці. Кожен випуск отримав короткий розбір: що зламалося, на якому етапі перевірок це ловилося, що додаємо в регрес.
Результати впровадження
Частка невдалих змін за перший квартал спостережень упала з 24% до 8% — не тому, що релізів стало менше, а тому що розбір за випусками почав повертати дефекти в набір автотестів.
Час від виявлення до відкату скоротився з кількох годин до десятків хвилин, а частка випусків, що пройшли через розбір, зросла з третини до всіх. Єдиний показник якості перестав бути предметом суперечки: одна метрика, одне вікно, одна таблиця за випусками.
Що робити, якщо випуски часті, а обліку відмов немає
Перше, що потрібно зафіксувати, — саме визначення невдалого випуску. Чи вважаємо ми таким зміну, яку довелося відкочувати, чи будь-яку, після якої відкрили інцидент із гарячим виправленням, — це принципово різні числа.
Поки визначення не узгоджене між командами, метрика непорівнянна навіть усередині одного продукту: одна група записує у відмови лише падіння, інша — будь-який дефект, знайдений за першу добу.
Історію інцидентів часто можна відновити заднім числом. У конвеєрі доставки вже залишаються записи про викочування з мітками версій і часом, а в трекері — закриті інциденти з датами.
Ретроспективний розбір випусків за кілька місяців будується на їх зіставленні: зміна позначається невдалою, якщо у вікні кореляції після неї з'явився інцидент, що зажадав позапланового виправлення.
Вікно підбирається за практикою команди — від кількох годин до доби, і краще одразу записати вибране значення, щоб цифра не «пливла» під час наступного перерахунку.
Мінімальний набір даних для такої реконструкції невеликий: ідентифікатор зміни, час потрапляння в продакшн, оточення, ознака відкату або гарячого виправлення, посилання на пов'язаний інцидент і тривалість відновлення.
Цього достатньо, щоб отримати і частку невдалих змін, і час до відновлення — без нових систем і сховищ. Зайві поля на старті лише гальмують збір: їх все одно ніхто не заповнює вручну.
Перший крок впровадження — не купівля інструмента, а фіксація визначення та одного джерела істини для мітки випуску. Далі збір нарощується навколо того місця, де мітка вже з'являється автоматично, — там не потрібно нічого додатково заводити.
Якщо почати з ручного журналу на кілька команд, уже за місяць видно, які випуски тягнуть метрику вгору і які зміни їх спричиняють.
Технічні сумніви під час налаштування метрики відмов
Питання до метрики виникають не навколо формули, а навколо меж: що потрапляє у відмову, кому вірити в оцінці і чи не почне команда ховати невдачі. Нижче — те, що найчастіше обговорюємо на етапі налаштування.
Як рахувати спірні випадки — наприклад, випуск відкотили за добу з бізнес-причини?
Правило фіксуємо до початку збору: відмова — будь-яка зміна, що зажадала відкату, термінового виправлення або втручання чергового у вікні спостереження. Бізнес-причина не скасовує факт: зміна вийшла неповною.
Спірні випадки розбираємо раз на цикл і записуємо рішення в глосарій, щоб не перераховувати історію заново.
Чи не почнуть команди ховати відкати, якщо метрика йде у звітність?
Почнуть, якщо показник прив'язаний до покарання. Тому рахуємо за даними системи доставки, а не за самозвітом, і обговорюємо класи причин, а не конкретних людей. Окремо вимірюємо час до виявлення: команда, яка швидко ловить і відкочує, виглядає краще за ту, що не визнає проблему.
Чи є сенс у метриці за ручного випуску?
Є, але точність нижча. Випуски фіксуємо в єдиному журналі: склад зміни, хто випускав, підсумок, чи були термінові виправлення. Такий журнал дає стійку частку невдалих змін уже за пару десятків випусків і заодно стає списком того, що автоматизувати першим.
Що робити з відмовами із зовнішніх причин і коли цифрі можна вірити?
Зовнішні причини — збій провайдера, відмова залежності — позначаємо окремою ознакою і в основну частку не включаємо, але зі статистики не викидаємо: за ними видно, де потрібне резервування.
Показнику довіряємо, коли він відтворюється від циклу до циклу і сходиться з ручною вибіркою; одиничний випуск нічого не доводить, стійкий тренд — дає.
Обговоримо задачу вимірювання відмов і план впровадження
Метрику відмов не можна порахувати «з коробки»: спочатку потрібно домовитися, що вважати невдалою зміною саме у вас, де брати факти про інциденти і як пов'язати їх із конкретним релізом. Тому починаємо не з панелі моніторингу, а з розмови про вашу інфраструктуру та процеси.
На дзвінку уточнюємо вхідні дані — цього достатньо, щоб повернутися з оцінкою робіт і планом впровадження метрики. Що корисно підготувати заздалегідь:
- Карту оточень і конвеєрів збірки: де з'являються артефакти, як і куди йде викладка, які кроки виконуються вручну.
- Визначення відмови: що вже вважаєте інцидентом — відкат релізу, гаряче виправлення, деградація на проді.
- Джерела фактів: трекер задач, журнал інцидентів, системи моніторингу та оповіщень, історія викладок.
- Регламент релізів: частота, вікна, хто і за якою ознакою ухвалює рішення про відкат.
- Відповідальних: хто володіє сервісом і хто підтверджує класифікацію змін.
- Межі першого контуру: які команди й сервіси включаємо одразу, а які — наступним етапом.
- Обмеження: доступи, політики безпеки, вимоги до зберігання та строку життя даних.
Далі фіксуємо порядок наступних кроків: схему збору даних, правила класифікації, зони відповідальності та графік. Опишіть задачу в зручному вигляді — повернемося з оцінкою робіт і планом впровадження метрики.







