Налаштування вимірювання Change Failure Rate (частка невдалих змін)

Відмови випусків обговорюють постфактум, і частка невдалих змін залишається невідомою. Ми налаштовуємо вимірювання Change Failure Rate під ключ: збираємо дані з ваших систем, впроваджуємо регламент розбору та панель. Команда отримує прозору динаміку якості релізів і помітно меншу частку невдалих змін.
Часті запитання

Change Failure Rate: чому відмови випусків не видно команді

Команда викочує по кілька разів на день: конвеєр зелений, перевірки пройдено, артефакт доставлено.

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

Причина в устрої обліку. Відкат живе в терміналі чергового, аварія — у системі оповіщень, ручна правка на сервері не фіксується взагалі ніде. Зв'язок між випуском і наступним збоєм відновлюють з пам'яті вже на розборі аварій, коли важливіше знайти винного, ніж порахувати. Частка невдалих змін існує лише як відчуття «наче стало більше».

Change Failure Rate перетворює це відчуття на число: відношення відкатів і екстрених виправлень до загальної кількості випусків за період. Ознака невдачі задається формально — повернення на попередню збірку, випуск виправлення поза планом, зміна конфігурації в обхід регламенту. Якість релізів стає видно на панелі моніторингу щодня, а не лише після великого збою.

Основна складність — тегування. В історії випусків має залишатися ознака: який артефакт пішов, хто підтвердив успіх, що сталося у вікні спостереження після викочування.

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

Розбираємо, як поставити це вимірювання на наявний процес випуску, не додаючи ручної роботи інженерам.

Що дає регулярне вимірювання failure rate у розробці

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

Підхід сягає досліджень DORA: команди, які рахують частку відкатів регулярно, швидше пов'язують причину з наслідком і перестають обговорювати надійність на рівні відчуттів.

Що на обліку Що стає видно Що змінюється
Частка невдалих змін Яка частина релізів закінчується відкатом або терміновим виправленням З'являється база для порівняння між версіями й командами
Час розбору інциденту Де втрачається час — у виявленні чи у відновленні Діагностика перестає бути ручною
Причини відмов за категоріями Які класи збоїв повторюються Повторювані сценарії закриваються автоматичними перевірками
Динаміка за релізами Чи працюють внесені зміни в процесі Рішення про пріоритети спираються на дані, а не на думки

Чек-лист сходиться в одну картину: якщо частка відкатів стоїть на місці, а час розбору зростає, вузьке місце — у діагностиці, а не в якості коду. Якщо зростає все разом — проблема в самих змінах і в тому, як вони перевіряються перед викочуванням.

Зворотний зв'язок щодо якості стискається з тижнів до годин: інженер бачить наслідки своєї зміни в тому самому циклі роботи.

Заодно зникає цілий клас відмов — ті, що спричинені ручними кроками під час викочування та відсутністю перевірок перед релізом: кожен такий випадок тепер потрапляє в облік і отримує конкретне виправлення.

Формати обліку невдалих змін: порівняння підходів

Рахувати частку невдалих змін можна по-різному, і перше, що визначає підхід, — класифікація.

Поки не зафіксовано, що саме вважається невдалою зміною (повний відкат релізу, аварійне виправлення, вимкнення функціональності флагом, відкат конфігурації), кожна команда рахує по-своєму, і цифри непорівнянні між звітами.

Другий чинник — чи є в контурі доставки єдиний ідентифікатор зміни, за яким викочування пов'язується з наступним інцидентом.

Варіант Коли підходить Обмеження
Ручний розбір інцидентів Десятки релізів на квартал, різнорідні контури, немає наскрізної телеметрії Оцінка суб'єктивна й запізнюється; ручне розмічання не масштабується на зростання частоти викочувань
Автоматичний збір метрики Єдиний конвеєр збірки та викочування, події деплою й алерти пишуться в одну систему Хибні зв'язки за паралельних викочувань; без розмічання причин відкат не відокремити від планової зміни
Гібридний облік відмов Часті релізи плюс вимоги аудиту й розбору інцидентів Потрібен регламент розмічання й відповідальний; спірні випадки все одно розбирає людина

Джерел даних про інциденти за автоматичного збору зазвичай три: події викочування з контуру доставки, алерти моніторингу й тікети системи обліку звернень.

Зв'язка «викочування → алерт → тікет» дає зв'язок, який можна перевірити очима: системи чергувань на кшталт PagerDuty віддають час спрацювання, а трекер — факт інциденту та його причину.

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

Як ми впроваджуємо облік невдалих змін: етапи робіт

Облік частки невдалих змін (Change Failure Rate) тримається на одному: метрика чесна рівно настільки, наскільки однозначно визначено поняття «невдала зміна».

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

  1. Узгодження визначення відкату. Фіксуємо, що вважаємо невдалою зміною: повернення релізу, аварійний виправляючий випуск, вимкнення функціональності флагом. Спірні випадки розбираємо з командою й записуємо в регламент.
  2. Аудит історії випусків. Зіставляємо журнали релізів, задачі в системі обліку й записи про інциденти за минулий період. Так видно, де дані вже є, де прогалини і якою є базова частка невдалих змін.
  3. Схема збору даних. Визначаємо джерела та правило зв'язку: як подія зміни зіставляється з інцидентом — за міткою, за часом чи вручну.
  4. Налаштування збору. Заводимо єдиний ідентифікатор зміни, який проходить через усі системи, налаштовуємо розрахунок частки та розбивку за сервісами й командами.
  5. Перевірка на минулих релізах. Проганяємо механіку на історичних даних і звіряємо з ручним розбором кількох випусків. Розходження пояснюємо й правимо правила зіставлення, поки цифри не зійдуться.
  6. Регламент і пороги. Фіксуємо, хто дивиться метрику, який рівень вважаємо нормою і що робимо при виході за нього — розбір причин без пошуку винних.
  7. Передача. Віддаємо схему, документацію й доступи, навчаємо чергових; за місяць звіряємо дані й коригуємо при зміні джерел.

Регламент, панель і схеми розбору відмов випусків

Метрика живе не у звіті, а в артефактах, які залишаються у вашому репозиторії та у вашій зоні відповідальності.

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

  • Конфігурації збору — правила, за якими історія випусків та інцидентів зводиться в одну метрику Change Failure Rate (частка невдалих змін), із зазначенням джерел і періодичності перерахунку.
  • Схема класифікації інцидентів — що відносимо до відмови випуску, що вважаємо відкатом, що плановою деградацією, а що зовнішнім збоєм і з розрахунку виключаємо.
  • Панель показників релізів — динаміка за тижнями, розбивка за сервісами й командами, нанесений поріг, за якого випуск визнається невдалим.
  • Регламент розбору відмов — хто веде розбір, склад учасників, строки фіксації причини і що вважається розбором закритим.
  • Документація щодо метрики — визначення, формула, список джерел, відомі обмеження й історія змін у правилах обліку.
  • Права доступу до даних — роли: хто бачить деталі інцидентів і вивантаження, хто лише агрегати, хто може змінювати схему класифікації.
  • Інструкції з експлуатації — як підключити новий сервіс, як виправити правило обліку і що робити при розходженні даних із ручним вивантаженням.

Перші два-три розбори проводимо разом із вашою командою, далі вона веде їх сама — регламент для цього й написаний. Опишіть задачу, повернемося з оцінкою та планом.

Кейс: failure rate знизився втричі після налаштування обліку

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

Три команди — три визначення: в однієї відкат протягом години вважався інцидентом, у іншої — ні. Сперечатися про динаміку відкатів у таких умовах безглуздо: цифри не сходилися навіть між сусідніми релізами.

Як побудували облік

Спочатку зафіксували одне визначення Change Failure Rate: невдала зміна — та, яка протягом обумовленого вікна після викочування зажадала відкату або аварійного виправлення.

Позначки про інциденти прив'язали до конкретних випусків через GitLab — теги, номери збірок і записи про відкати опинилися в одному місці. Кожен випуск отримав короткий розбір: що зламалося, на якому етапі перевірок це ловилося, що додаємо в регрес.

Результати впровадження

Частка невдалих змін за перший квартал спостережень упала з 24% до 8% — не тому, що релізів стало менше, а тому що розбір за випусками почав повертати дефекти в набір автотестів.

Час від виявлення до відкату скоротився з кількох годин до десятків хвилин, а частка випусків, що пройшли через розбір, зросла з третини до всіх. Єдиний показник якості перестав бути предметом суперечки: одна метрика, одне вікно, одна таблиця за випусками.

Що робити, якщо випуски часті, а обліку відмов немає

Перше, що потрібно зафіксувати, — саме визначення невдалого випуску. Чи вважаємо ми таким зміну, яку довелося відкочувати, чи будь-яку, після якої відкрили інцидент із гарячим виправленням, — це принципово різні числа.

Поки визначення не узгоджене між командами, метрика непорівнянна навіть усередині одного продукту: одна група записує у відмови лише падіння, інша — будь-який дефект, знайдений за першу добу.

Історію інцидентів часто можна відновити заднім числом. У конвеєрі доставки вже залишаються записи про викочування з мітками версій і часом, а в трекері — закриті інциденти з датами.

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

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

Мінімальний набір даних для такої реконструкції невеликий: ідентифікатор зміни, час потрапляння в продакшн, оточення, ознака відкату або гарячого виправлення, посилання на пов'язаний інцидент і тривалість відновлення.

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

Перший крок впровадження — не купівля інструмента, а фіксація визначення та одного джерела істини для мітки випуску. Далі збір нарощується навколо того місця, де мітка вже з'являється автоматично, — там не потрібно нічого додатково заводити.

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

Технічні сумніви під час налаштування метрики відмов

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

Як рахувати спірні випадки — наприклад, випуск відкотили за добу з бізнес-причини?

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

Спірні випадки розбираємо раз на цикл і записуємо рішення в глосарій, щоб не перераховувати історію заново.

Чи не почнуть команди ховати відкати, якщо метрика йде у звітність?

Почнуть, якщо показник прив'язаний до покарання. Тому рахуємо за даними системи доставки, а не за самозвітом, і обговорюємо класи причин, а не конкретних людей. Окремо вимірюємо час до виявлення: команда, яка швидко ловить і відкочує, виглядає краще за ту, що не визнає проблему.

Чи є сенс у метриці за ручного випуску?

Є, але точність нижча. Випуски фіксуємо в єдиному журналі: склад зміни, хто випускав, підсумок, чи були термінові виправлення. Такий журнал дає стійку частку невдалих змін уже за пару десятків випусків і заодно стає списком того, що автоматизувати першим.

Що робити з відмовами із зовнішніх причин і коли цифрі можна вірити?

Зовнішні причини — збій провайдера, відмова залежності — позначаємо окремою ознакою і в основну частку не включаємо, але зі статистики не викидаємо: за ними видно, де потрібне резервування.

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

Обговоримо задачу вимірювання відмов і план впровадження

Метрику відмов не можна порахувати «з коробки»: спочатку потрібно домовитися, що вважати невдалою зміною саме у вас, де брати факти про інциденти і як пов'язати їх із конкретним релізом. Тому починаємо не з панелі моніторингу, а з розмови про вашу інфраструктуру та процеси.

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

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

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

Наші компетенції:

Останні роботи

  • Розробка сайту компанії B2B ADVANCE
    Розробка сайту компанії B2B ADVANCE
    1542
  • Розробка веб-додатків для компанії FEEDME
    Розробка веб-додатків для компанії FEEDME
    1393
  • Розробка веб-сайту для компанії БЕЛФІНГРУП
    Розробка веб-сайту для компанії БЕЛФІНГРУП
    1081
  • Розробка інтернет магазину для компанії FURNORO
    Розробка інтернет магазину для компанії FURNORO
    1368
  • Розробка логотипу компанії B2B Advance
    Розробка логотипу компанії B2B Advance
    815
  • Розробка веб-додатків для компанії Enviok
    Розробка веб-додатків для компанії Enviok
    1139