Налаштування розподіленого трасування через Tempo (Grafana) — повний посібник

Розбір інциденту розтягується на години, бо незрозуміло, який сервіс дав збій. Ми налаштовуємо наскрізне трасування на Tempo і Grafana під ключ: від аудиту сервісів до передачі готових схем і регламентів. Команда отримує повну картину запиту й скорочує час пошуку причини в рази.
Часті запитання

Розподілене трасування: що ламається без Tempo і Grafana

Поки система складається з одного сервісу, питання «де саме гальмує» вирішується переглядом журналу застосунку. Щойно з'являються шлюз, кілька сервісів і черга повідомлень, метрики показують, що час відповіді зріс, але не показують, на якій ділянці ланцюжка викликів це сталося.

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

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

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

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

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

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

Далі розбираємо, як це влаштовано на Tempo і Grafana і що потрібно, щоб видимість між сервісами з'явилася не в теорії.

Що дає наскрізне трасування: час відгуку і розбір відмов

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

Tempo у зв'язці з Grafana зберігає ці маршрути і дозволяє шукати за ними — за кодом відповіді, іменем операції, тривалістю.

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

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

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

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

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

Підключення Tempo до Grafana: порівняння варіантів розгортання

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

Варіанти розміщення сховища трас

Варіант Коли підходить Обмеження
Локальний диск на одному вузлі Пісочниця, налагодження, невеликий потік Немає реплікації, термін зберігання впирається в розмір диска
Об'єктне сховище в монолітному режимі Середній потік, потрібен повний контроль над даними Один процес відповідає і за приймання, і за стиснення блоків
Розподілений режим поверх об'єктного сховища Високий потік, тривале зберігання Більше компонентів — складніше масштабування і супровід
Керований сервіс Немає своєї команди експлуатації Дані поза вашим контуром, розмежування задає провайдер

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

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

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

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

Етапи впровадження трасування: від аудиту сервісів до передачі

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

  1. Аудит сервісів і зв'язків. Збираємо перелік сервісів, черг і зовнішніх залежностей, позначаємо, хто кого викликає і де виклики синхронні. На виході — список сервісів без інструментування і «сліпих зон» на критичному шляху.
  2. Схема потоків запитів. Малюємо наскрізний шлях запиту від точки входу до сховища, позначаємо ключові точки вимірювання. Схему узгоджуємо з власниками сервісів, інакше карта трас розійдеться з реальними зв'язками.
  3. Налаштування збору трас. Розгортаємо приймання і зберігання (Grafana Tempo), підключаємо застосунки, задаємо єдині імена сервісів і операцій, термін зберігання і частку вибірки. Без спільних правил іменування відрізки одного запиту не склеюються в трасу.
  4. Перевірка на пілотній групі сервісів. Беремо кілька сервісів на критичному шляху і дивимося накладні витрати, повноту зв'язків, час пошуку причини збою. Розриви закриваємо до розгортання на всю систему.
  5. Регламент супроводу і передача. Фіксуємо правила іменування, терміни зберігання, типові запити чергового і порядок підключення нових сервісів. Команда замовника отримує документацію і розбір на живих збоях.

Комплект передачі: конфігурації, схеми і регламенти

Трейсинг приносить користь, поки команда розуміє, як він зібраний і чому поводиться саме так при зростанні навантаження.

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

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

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

Кейс: розбір інциденту скоротився з двох годин до десяти хвилин

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

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

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

Що змінили

Увімкнули розподілене трасування на Tempo: сервіси віддають спани через спільний колектор, ідентифікатор запиту проходить крізь усі виклики, включно з асинхронними.

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

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

Метрики до і після

Показник До Після
Пошук причини збою ~100 хвилин 8–10 хвилин
Розбір без ескалації на старшого поодинокі випадки більшість інцидентів
Картина за запитом логи і метрики окремо трейс, логи і метрики на одній осі

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

Що робити, якщо трасування вже частково розгорнуто?

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

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

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

Якщо приймачів кілька — частина потоку йде в Grafana Tempo, частина в інший збирач — ми не тягнемо обидва контури паралельно, а зводимо дані в один, щоб пошук за ідентифікатором повертав ланцюжок цілком, а не його фрагмент.

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

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

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

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

Технічні сумніви: терміни зберігання, навантаження і доступи

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

Який обсяг трас зберігати і чи не розростеться він?

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

Чи не додасть збір навантаження на самі сервіси?

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

Чи всі сервіси потраплять у картину трас?

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

Що робити зі старими системами без підтримки трасування?

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

Як розмежувати доступ між командами?

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

Обговоримо задачу: що потрібно для старту робіт

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

  • Опис задачі. Що болить: де губиться контекст між сервісами, скільки часу йде на пошук причини збою, які питання до системи залишаються без відповіді сьогодні.
  • Перелік сервісів. Які компоненти беруть участь в обробці запиту, на чому написані, як спілкуються між собою — прямі виклики, черги, фонові завдання. Окремо позначте, хто вже віддає метрики і логи.
  • Схема оточень. Скільки контурів і чим вони відрізняються за складом сервісів і навантаженням. Зазвичай трасування впроваджують на тестовий контур, а продакшн підключають після перевірки.
  • Пріоритети розбору. Що розбирати першим: помилки на зовнішніх викликах, повільні ділянки обробки, розбір інцидентів заднім числом або контроль термінів виконання операцій.
  • Обмеження і доступи. Політика безпеки, вимоги до зберігання даних, де не можна змінювати конфігурацію сервісів, хто погоджує права. Це впливає на схему збору сильніше, ніж обсяг даних.
  • Поточний інструментарій. Що вже стоїть і як вбудувати трасування через Tempo і Grafana поруч із ним, не дублюючи збір.

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

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

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

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