vyvchy
    Теми розділу

    10 · Performance testing

    Моніторинг, APM і спостережуваність

    Зміст

    Прогін завершився: p95 виріс удвічі, зʼявилися помилки. Це симптом без адреси. бачить систему ззовні, як з одним числом на виході, тож звіт, який закінчується фразою «щось повільно», розробка не може ні відтворити, ні полагодити.

    Другу половину картини дає моніторинг системи під тестом: які метрики просити, як їх читати під навантаженням і яким маршрутом іти від «повільно» до конкретної функції. Логи як щоденний інструмент, діагностика падінь і (observability) очима QA поза навантаженням — окрема глава розділу про Git і CI/CD: Логи, моніторинг і спостережуваність для QA.

    Застосунок і залізо на одному графіку

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

    ВеличинаЩо цеУ чому міряють
    Утилізація ресурсу (resource utilization)Середній час, протягом якого ресурс був зайнятий обслуговуванням роботиВідсотки за інтервал: «диск працює на 90%»
    Насичення (saturation)Ступінь, до якого ресурс має додаткову роботу, якої не може обслужити — зазвичай чергаДовжина черги: «середня черга виконання чотири»
    ПомилкиКількість подій-помилокСкалярні лічильники: «пʼятдесят пізніх колізій»

    Читають ці три числа не за принципом «зелене-червоне»:

    • 100% утилізації — зазвичай ознака вузького місця, але проблемою може бути вже понад ~70%. Причина перша: вимір за довгий період ховає короткі сплески до 100%. Причина друга: деякі ресурси, як-от диски, не можна перервати посеред операції, тож після 70% в черзі стають частішими.
    • Будь-яке ненульове насичення варте уваги. Черга завдовжки один — це вже робота, якої ресурс не встиг зробити.
    • Негативний результат теж корисний: низька утилізація, немає черги, немає помилок — обсяг розслідування звузився.

    Ресурс тут не лише залізо: метод прямо поширюється на мʼютекси (утилізація — час, поки лок утримувався; насичення — потоки в черзі на лок), пули потоків і ємність файлових дескрипторів. Це рівно ті місця, які канон перф-тестування називає причинами — недостатні пули ресурсів, пули потоків, зʼєднання з базою даних; серед технічних метрик прогону він називає процесор, памʼять, мережеву і затримку, дисковий простір, швидкість вводу-виводу, вільні й зайняті потоки. Там же — привʼязка, корисна на захисті звіту: утилізація — турбота системи, — користувача, — бізнесу.

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

    Метод RED: три метрики на кожен сервіс

    USE дивиться на ресурси. З боку застосунку той самий трюк робить (RED method) — він задає три метрики, які треба міряти для кожного мікросервісу:

    • Rate — кількість запитів за секунду, які обслуговують ваші сервіси;
    • Errors — кількість невдалих запитів за секунду;
    • Durationрозподіли часу, який займає кожен запит.

    Третій пункт варто читати дослівно: автор пише «розподіли», а не «середнє». Це той самий аргумент, що й у главі Метрики: response time, throughput, перцентилі — просити треба . Друге правило автора: частота помилок має бути виражена як частка від частоти запитів; «100 помилок» без знаменника не означає нічого. А міряти всі сервіси однаково він радить з організаційних міркувань: однаковість дає масштабованість операційних команд, бо зменшує кількість особливих випадків, які черговий інженер мусить памʼятати під час інциденту.

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

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

    Інструментування: звідки беруться числа

    Метрика не зʼявляється сама — її туди хтось поклав. (instrumentation) — це додавання метрик у код сервісу, і канонічна настанова тут максималістська: інструментуйте все, кожна бібліотека, підсистема й сервіс мають мати щонайменше кілька метрик. Джерело чесно називає себе набором думок, а не вимогою, — але для QA це найповніший перелік того, що просити перед прогоном. Набір залежить від типу сервісу:

    ТипКлючові метрики
    Онлайн-обслуговування — хтось чекає негайної відповідіКількість виконаних запитів, помилки, затримка; корисна ще кількість запитів у роботі
    Офлайн-обробка — ніхто активно не чекаєСкільки прийшло, скільки в роботі, коли востаннє щось оброблено, скільки відправлено
    Пакетні задачі — не працюють безперервноГоловна метрика: коли задача востаннє відпрацювала успішно

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

    Далі числа треба зібрати й показати — і це два різні предмети. Prometheus збирає й зберігає метрики як часові ряди — значення з міткою часу й необовʼязковими мітками — через HTTP; візуалізацію зібраних даних дока віддає Grafana або іншим API. Grafana формулює свою роль симетрично: запитувати, візуалізувати, сповіщати й досліджувати ваші метрики, логи й , хоч би де вони зберігалися. Тож «поставимо Prometheus і Grafana» — це не одне рішення, а два.

    витягування через HTTP

    інструментує

    Сервіс
    лічильники, датчики, гістограми

    Prometheus
    часові ряди з мітками

    Grafana
    запити, графіки, сповіщення

    SDK у коді
    або агент

    витягування через HTTP

    інструментує

    Сервіс
    лічильники, датчики, гістограми

    Prometheus
    часові ряди з мітками

    Grafana
    запити, графіки, сповіщення

    SDK у коді
    або агент

    Вибір між SDK і автоматичним інструментуванням через агента не косметичний: перше вимагає змін у коді й релізу, друге ні. Ціна виміру названа теж: витрата ресурсів на інструментування значно переважується вигодами, а обережність потрібна для коду, критичного до продуктивності або викликаного понад 100 тисяч разів за секунду в межах процесу. Тобто аргумент «моніторинг сповільнить систему» каноном не підтверджується. Виклад APM додає дзеркальну тезу — вимір створює накладні витрати, і їх зменшують кількістю подій, що моніторяться; джерело тут неканонічне (див. наступний розділ), тож це спостереження, а не норма.

    Типи метрик: лічильник, датчик, гістограма, зведення

    Просити «метрики» — це просити нічого. Бібліотеки інструментування пропонують чотири основні , і споріднений набір ужитий в інструменті навантаження k6 (Counter, Gauge, Rate, Trend), тож словник працює по обидва боки прогону:

    ТипЩо це
    Лічильник (counter)Кумулятивна метрика, яка лише зростає або обнуляється при перезапуску
    Датчик (gauge)Єдине числове значення, яке може довільно рости й спадати
    Гістограма (histogram)Записує спостереження в налаштовні бакети й дає суму всіх значень
    Зведення (summary)Так само семплює спостереження, але рахує квантилі в рухомому часовому вікні

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

    Гістограма проти зведення — не питання смаку. Гістограма розкладає спостереження в кумулятивні , і перцентилі з неї рахують уже на боці моніторингу функцією histogram_quantile(). Зведення рахує квантилі на боці застосунку, і такі квантилі між екземплярами не агрегуються; класичні гістограми з різними межами бакетів — теж. Висновок жорсткий: звести перцентилі двох сервісів із різними бакетами не можна, це питання даних, а не запиту.

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

    APM: назва, під якою немає канону

    (application performance management, APM) — термін, з яким треба поводитися обережно, і це не фігура мови. Канонічного джерела під нього немає: абревіатури не вводить ані силабус перф-тестування, ані стандарти телеметрії, а доступне означення дає лише енциклопедія — джерело неканонічне. Тож усе нижче — найкращий доступний виклад, а не норма.

    За цим викладом APM — моніторинг і керування продуктивністю та доступністю програмних застосунків, щоб виявляти й діагностувати складні проблеми й утримати очікуваний рівень сервісу. Пильно моніторять два набори метрик: перший описує продуктивність, яку відчувають кінцеві користувачі (навантаження — , запитів чи сторінок за секунду — і час відповіді), другий міряє ресурси, витрачені на це навантаження, показуючи, чи достатньо ємності й де можливі вузькі місця. Виміри встановлюють емпіричний базовий рівень, який далі використовують для виявлення змін, — та сама пара «симптом і причина», з якої почалася глава. Там же — спостереження, що пояснює саме існування перф-тестування: без навантаження компʼютерними вимогами більшість застосунків достатньо швидкі, тому програмісти можуть не зловити проблем продуктивності під час розробки.

    Три деталі, корисні на практиці:

    • Пасивний збір проти активного. Пасивний зазвичай безагентний, через дзеркалювання мережевого порту; активний — синтетичні проби, і вони дають видимість у непікові години, коли обсяг транзакцій малий.
    • Глибокий рівень вимагає агента, а моніторинг досвіду користувача може включати вставлення JavaScript у сторінку. «Увімкнути APM» — не зовнішня операція: вона зачіпає збірку й розгортання.
    • Віртуалізація збільшує мінливість вимірів — той самий чинник, що й шум спільного середовища в главі Середовище, генератори навантаження і достовірність, тільки з боку продакшену.

    Чому канону немає, пояснює саме джерело: з першої половини 2013 року APM увійшов у період інтенсивної конкуренції постачальників, унаслідок чого термін розмився й перетворився на концепцію, а не на єдиний ринок; «рамку», яку зазвичай цитують, тримає аналітична фірма, і вона вже змінювала означення. Звідси висновок: «у нас APM» і «у нас observability» у двох командах можуть означати різне — уточнювати треба набір сигналів, а не назву.

    Логи, метрики й трейси: три сигнали, три різні питання

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

    Розподілений трейс (distributed tracing) — методологія, яку реалізують інструменти трейсингу, щоб простежити, проаналізувати й задебажити транзакцію крізь кілька програмних компонентів. Формат передачі контексту стандартизований W3C: заголовок traceparent містить чотири поля через дефіс — версію, trace-id (16 байтів, 32 шістнадцяткові символи в малому регістрі — ідентифікатор усього трейсу), parent-id (8 байтів — ідентифікатор цього запиту з погляду викликача) і прапорці. У багатьох системах трейсингу parent-id звуть span-id, а (span) — це виконання одного клієнтського запиту. Значення з усіх нулів невалідне, а невалідний trace-id інструменти зобовʼязані ігнорувати разом із усім заголовком — тож підставити «схоже» значення не вийде:

    import { randomBytes } from 'node:crypto';
    
    // 32 і 16 шістнадцяткових символів у малому регістрі; усі нулі — невалідне значення
    const traceId = randomBytes(16).toString('hex');
    const spanId = randomBytes(8).toString('hex');
    
    // 01 у прапорцях означає «sampled», 00 — «not sampled»
    await request.get('/api/orders', {
      headers: { traceparent: `00-${traceId}-${spanId}-01` },
    });

    Логи мають власну економіку, і вона впливає на те, що ви зможете знайти. Loki індексує лише мітки, а самі дані стискає й тримає чанками в обʼєктному сховищі — звідси дешевизна й наслідок: якщо потрібного розрізу немає в мітках, шукати доведеться повним сканом. Kibana — це UI платформи Elasticsearch, і її Discover, що дає працювати з сирими даними під фільтрами й пошуком, є точкою входу для дослідницького аналізу. Sentry описує себе через ту саму задачу: наскрізний розподілений трейс, щоб знаходити й дебажити проблеми продуктивності та помилки в різних системах і сервісах. Звідси й правило для баг-репорту після перф-прогону: посилання на конкретний запит або трейс корисніше за текстовий дамп логів.

    Профілювання: від «повільно» до «де саме»

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

    Симптом: p95 виріс удвічі

    Загальносистемна спостережуваність:
    RED по сервісах, USE по ресурсах

    Перший прохід дав напрямок:
    заглиблення й аналіз затримки

    Рівень коду:
    профіль — яка функція і який рядок

    Симптом: p95 виріс удвічі

    Загальносистемна спостережуваність:
    RED по сервісах, USE по ресурсах

    Перший прохід дав напрямок:
    заглиблення й аналіз затримки

    Рівень коду:
    профіль — яка функція і який рядок

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

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

    Типові помилки

    «Середня утилізація процесора 70% — запас є». Виглядає як спокійний графік, а насправді вимір за довгий інтервал ховає короткі сплески до 100%, і саме в них живуть . Питання «яке вікно усереднення?» — обовʼязкове до будь-якого висновку про ресурси, і той самий чекліст — утилізація, черга, помилки — ставлять до кожного з них, включно з пулами.

    «Графік лічильника впав — навантаження впало». Виглядає як спад трафіку, а насправді лічильник обнуляється при перезапуску процесу: різке падіння графіка означає рестарт. І дзеркально — сирий лічильник без rate() не показує нічого корисного.

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

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

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

    Підсумок

    1. Симптом і причина живуть на різних графіках. RED дає три числа на кожен сервіс, USE — три числа на кожен ресурс. Це пара, а не альтернатива.
    2. Тип метрики — частина запиту до розробки. Лічильник, датчик, гістограму чи зведення обирають у коді, і неправильний вибір моніторинг не виправить.
    3. Збір і показ — два різні предмети. Prometheus витягує й зберігає часові ряди, Grafana їх показує.
    4. APM канонічного означення не має. Це ринкова назва набору практик, тож уточнюють набір сигналів — метрики, логи, трейси, профілі, — а не назву.
    5. Профіль не замінює метрик — він наступний крок після них. Канон описує рух від загальносистемної спостережуваності до дієвих висновків на рівні коду, а чекліст ресурсів називає першим проходом, після якого йде заглиблення.

    Можливі питання

    «Які метрики ви попросите в розробки перед навантажувальним прогоном?» Дивляться, чи є у вас структура замість переліку навмання. Сильна відповідь має дві половини: на кожен сервіс — частота, помилки й розподіл тривалості; на кожен ресурс — утилізація, довжина черги й лічильники помилок. Окремо — пул потоків і пул зʼєднань до БД.

    «Чим RED відрізняється від USE?» Класична пара на плутанину. RED — про сервіси, керовані запитами; USE — про ресурси. Плюс межі: для пакетних і потокових сервісів RED не працює, і це каже сам його автор.

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

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

    «У звіті генератора p95 дорівнює 800 мс, а на дашборді 500 мс. Хто правий?» Дивляться, чи кинетеся ви шукати винного. Правильна реакція — назвати законні причини розбіжності: вимір із різних боків і неагрегованість квантилів зі зведень та різних бакетів. Далі питання не «хто правий», а «яке число описує користувача».

    «Коли ви попросите профіль, а не метрики?» Хочуть почути порядок дій: коли метрики вже показали насичення ресурсу, але не показали причини.

    Джерела

    Застосунок і залізо на одному графіку

    Метод RED: три метрики на кожен сервіс

    • Tom Wilkie — The RED Method: key metrics for microservices architecture (2017) — три метрики методу, від частоти, організаційний аргумент, походження від золотих сигналів SRE і межі методу.
    • Brendan Gregg — The USE Method — означення методу USE, з яким автор RED розводить свій метод: ресурси проти сервісів.
    • Prometheus — Instrumentation — той самий поділ із боку доки: різні набори метрик для обслуговування запитів і для офлайн-обробки.

    Інструментування: звідки беруться числа

    • Prometheus — Instrumentation — настанова «інструментуйте все», три типи сервісів і їхні набори метрик, метрики пулів і кешу, вимір з обох боків, облік запитів на завершенні, ціна інструментування.
    • Prometheus — Overview — часові ряди з мітками, pull-модель через HTTP і передача візуалізації Grafana чи іншим споживачам API.
    • Grafana — documentation home (OSS and Enterprise) — роль Grafana: запитувати, візуалізувати, сповіщати й досліджувати метрики, логи й трейси.
    • Grafana Pyroscope — documentation home — два шляхи інструментування: SDK у коді проти автоматичного інструментування агентом.
    • Wikipedia — Application performance management — накладні витрати вимірювання та їх зменшення кількістю подій, що моніторяться (джерело неканонічне).

    Типи метрик: лічильник, датчик, гістограма, зведення

    • Prometheus — Metric types — чотири типи метрик і їхні означення, кумулятивні бакети гістограми, квантилі зведення в рухомому вікні, неагрегованість різних бакетів, обнулення лічильника при перезапуску.
    • Prometheus — Instrumentation — правило «якщо значення може падати, це датчик», rate() для лічильників, заборона rate() для датчика, ціна кожного набору міток і орієнтири кардинальності.
    • Prometheus — Metric and label naming — поіменна заборона міток високої кардинальності, час у секундах і частка в долях одиниці.
    • Prometheus — Histograms and summaries — механіка обчислення квантиля з бакетів і межі його точності.
    • Grafana k6 — Metrics — споріднений набір типів метрик на боці інструмента навантаження.

    APM: назва, під якою немає канону

    • Wikipedia — Application performance management — означення й мета APM, два набори метрик і базовий рівень, активний і пасивний збір, вимога агента для глибокого рівня, розмивання терміна конкуренцією вендорів (джерело неканонічне: канонічного під цей термін не існує).

    Логи, метрики й трейси: три сигнали, три різні питання

    • OpenTelemetry — Documentation (головна) — три види телеметрії, позиція галузевого стандарту й роль Collector як вендор-агностичного шару.
    • OpenTelemetry — Traces — трейси як окремий сигнал спостережуваності.
    • W3C — Trace Context (Recommendation) — розподілений трейс як методологія, формат traceparent, довжини trace-id і parent-id, span-id як інша назва parent-id, спан як виконання одного клієнтського запиту, обовʼязок ігнорувати невалідне значення.
    • Grafana Loki — Documentation (огляд) — індексація лише міток, чанки в обʼєктному сховищі й вплив розмітки на швидкість запитів і ціну.
    • Elastic Docs — Explore and analyze data with Kibana — Kibana як UI Elasticsearch і Discover як точка входу для дослідницького аналізу.
    • Sentry Docs — головна — самопозиціювання продукту через наскрізний розподілений трейс.

    Профілювання: від «повільно» до «де саме»

    • Grafana Pyroscope — documentation home — означення безперервного профілювання з роздільністю до рядка коду, рух від загальносистемної спостережуваності до коду, форми подачі даних і кореляція з іншими сигналами.
    • Brendan Gregg — USE Method: Linux Performance Checklist — чекліст ресурсів як перший прохід, після якого переходять до заглиблення й аналізу затримки.
    • Chrome DevTools — Analyze runtime performance — предмет панелі продуктивності: виконання, а не завантаження; розширення як джерело шуму у вимірах.

    Пояснення

    «Поясни» працює з власним API-ключем Anthropic: запит іде з вашого браузера прямо до Anthropic.

    Свій API-ключ (BYOK)

    Вставте власний ключ Anthropic — пояснення працюватиме на реальній моделі. Ключ зберігається лише у вашому браузері (localStorage), нікуди не надсилається, крім api.anthropic.com, і не логується.