Трасування: що це, принципи та збір даних

Автор: IT Sectr Опубліковано: 2026-05-29 Час читання: 8 хв

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

Головне

  • Трасування — запис шляху запиту через всі компоненти розподіленої системи з фіксацією часу кожного кроку.
  • Span — базова одиниця трасування, що представляє одну операцію із зазначенням часу початку та завершення.
  • Distributed tracing — механізм, що зв'язує spans з різних сервісів в єдиний ланцюжок trace за допомогою контекстної передачі.
  • OpenTelemetry — стандарт збору телеметрії, що підтримує трасування для всіх популярних мов і платформ.
  • Sampling — стратегія вибору частини запитів для трасування, що дозволяє контролювати обсяг даних і вартість зберігання.

Що таке трасування в моніторингу

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

Кожен крок обробки — виклик бази даних, HTTP-запит до іншого мікросервісу, виконання фонового завдання — фіксується як окрема одиниця з міткою часу, статусом та атрибутами. За даними Google Dapper (оригінальна публікація 2010 року), трасування дозволяє локалізувати затримки в розподілених системах з точністю до одного виклику.

Трасування особливо важливе для мобільних застосунків, де бекенд складається з десятків мікросервісів. Дія користувача — наприклад, вхід в акаунт — може пройти через API Gateway, сервіс автентифікації, базу даних та Push-сервіс. Без трасування визначити, який саме компонент гальмує відповідь, практично неможливо.

Spans та traces: базова структура даних

Основна одиниця трасування — span. Кожен span представляє одну логічну операцію: HTTP-запит, SQL-запит, виклик gRPC, серіалізацію JSON. Span містить унікальний ідентифікатор, батьківський ідентифікатор, назву операції, час початку, тривалість, статус та набір атрибутів.

Ієрархія spans у trace

Всі spans, що належать до одного кореневого запиту, об'єднуються в trace. Кореневий span (root span) представляє точку входу — HTTP-запит від мобільного клієнта до API. Дочірні spans утворюють дерево, де кожен span посилається на батька через поле parent_span_id.

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

Атрибути та події span

Кожен span може містити атрибути — пари ключ-значення з мета-інформацією: URL запиту, ID користувача, версія API, ім'я хоста. Атрибути використовуються для фільтрації та групування трас. Крім атрибутів, span підтримує події — часові мітки з текстовим описом, наприклад "кеш-промах" або "повторна спроба з'єднання".

Як працює distributed tracing

Distributed tracing вирішує проблему зв'язування spans, які створюються в різних процесах та на різних машинах. Механізм заснований на контекстній передачі: при виклику сервісу B з сервісу A в вихідний запит додається заголовок з ідентифікатором поточного trace та батьківського span.

Стандартні протоколи передачі контексту — W3C Trace Context (заголовки traceparent та tracestate) та Zipkin B3 (заголовки X-B3-TraceId, X-B3-SpanId). W3C Trace Context прийнятий як стандарт консорціумом W3C у 2021 році та підтримується всіма основними провайдерами телеметрії.

При отриманні запиту сервіс B витягує trace_id з заголовка та створює дочірній span з цим trace_id. Таким чином, після завершення запиту всі spans з різних сервісів об'єднуються в один trace на стороні колектора. Для цього потрібно, щоб кожен сервіс був інструментований однією і тією ж бібліотекою трасування.

Контекстна передача в мікросервісах

У мобільній розробці контекстна передача охоплює не лише бекенд, але й клієнт-серверну взаємодію. Мобільний застосунок може надсилати trace_id в заголовку кожного API-запиту, дозволяючи пов'язати дію клієнта з серверною обробкою. OpenTelemetry SDK для iOS та Android підтримує автоматичне створення та передачу trace-контексту через HTTP-клієнти.

kotlin
import io.opentelemetry.api.trace.Span
import io.opentelemetry.api.trace.Tracer
import io.opentelemetry.context.Context

class TracingInterceptor : Interceptor {
    private val tracer: Tracer = OpenTelemetry.getTracer("mobile-app")

    override fun intercept(chain: Interceptor.Chain): Response {
        val span = tracer.spanBuilder("HTTP POST /api/login")
            .setParent(Context.current())
            .startSpan()

        return chain.proceed(chain.request())
            .also { span.end() }
    }
}

Представлений перехоплювач на Kotlin створює span для кожного HTTP-запиту до сервера. Батьківський контекст передається з коду, що викликає, через Context.current(), що дозволяє пов'язати клієнтське трасування з серверним.

Впровадження трасування через OpenTelemetry

OpenTelemetry — стандарт де-факто для збору трасувальних даних. Він надає єдиний API для генерації spans, автоматичну інструментацію популярних бібліотек та гнучкий механізм експорту даних в різні бекенди: Jaeger, Zipkin, Grafana Tempo, Datadog, New Relic.

Автоматична інструментація

OpenTelemetry підтримує автоматичне створення spans для популярних фреймворків: Spring Boot, Ktor, Flask, Express, gRPC. Розробнику достатньо додати залежність в проєкт, і бібліотека самостійно перехоплює вхідні та вихідні запити. Auto-instrumentation для Java використовує javaagent, який модифікує байт-код на льоту без зміни вихідного коду.

Для мобільних платформ OpenTelemetry надає Swift SDK та Kotlin SDK. Вони автоматично створюють spans для мережевих запитів (URLSession, OkHttp), роботи з базою даних (CoreData, Room) та фонових завдань. Розробник може додавати кастомні spans для бізнес-логіки.

Експорт даних

Зібрані spans надсилаються до колектора через протокол OTLP (OpenTelemetry Protocol). Колектор може буферизувати, фільтрувати та перенаправляти дані в одну або кілька систем зберігання. За даними документації OpenTelemetry, типова затримка від генерації span до його відображення в дашборді становить 2–5 секунд при використанні gRPC-експорту.

swift
import OpenTelemetryApi
import OpenTelemetrySdk
import URLSessionInstrumentation

let instrumentation = URLSessionInstrumentation()
instrumentation.enable()

let tracer = OpenTelemetry.instance.tracerFactory
    .get("mobile-monitoring")

let span = tracer.spanBuilder("fetch-user-profile")
    .setAttribute(key: "user.id", value: userId)
    .startSpan()
span.end()

Код на Swift активує автоматичну інструментацію мережевого шару та створює кастомний span для операції отримання профілю користувача. Атрибут user.id дозволяє згодом фільтрувати траси за конкретним користувачем.

Стратегії семплювання трас

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

Head-based sampling

Рішення про збереження траси приймається в момент її створення — в кореневому span. Найпростіший і найпоширеніший підхід: фіксований відсоток запитів (наприклад, 5%) зберігається, решта відкидаються. Недолік — неможливо гарантувати, що рідкісні помилки будуть захоплені. Probability sampler в OpenTelemetry підтримує налаштування ймовірності від 0.0 до 1.0.

Tail-based sampling

Рішення відкладається до завершення всіх spans траси. Аналізатор оцінює, чи містить траса помилки, перевищення часу або цікаві атрибути, і тільки тоді зберігає її. Цей підхід вимагає буферизації всіх spans в колекторі, що збільшує споживання пам'яті. За даними Grafana Labs, tail-based sampling на 40–60% ефективніший за співвідношенням "ціна за корисні дані" в системах з рідкісними, але критичними помилками.

СтратегіяПлюсиМінуси
Fixed probabilityПростота, передбачуване навантаженняПропускає рідкісні події
Rate limitingГарантований обсяг данихНерівномірне покриття
Tail-basedЗахоплення всіх помилокВисоке споживання пам'яті
AdaptiveБаланс вартості та покриттяСкладність налаштування

Відмінність трасування від логування

Логування фіксує окремі події з рівнем важливості (info, warn, error), але не пов'язує їх в контекст одного запиту. Трасування, навпаки, створює структуроване дерево операцій, що належать одному наскрізному запиту. На практиці ці два підходи не взаємовиключні, а доповнюють один одного.

Логи ефективні для детального аналізу конкретної помилки: розробник бачить точне повідомлення, стектрейс, значення змінних. Трасування дає відповідь на питання "чому запит виконується 5 секунд" — показує, який саме мікросервіс або виклик зайняв найбільше часу. За даними Honeycomb (2024), команди, що використовують трасування разом з логуванням, знаходять кореневу причину інцидентів у 2.3 рази швидше.

Сучасний підхід — observability — об'єднує трасування, метрики та логи в єдину систему. OpenTelemetry підтримує кореляцію між цими трьома сигналами: кожен span може містити посилання на пов'язані логи, а метрики можуть бути розмічені за trace_id для переходу до конкретних трас.

Часті запитання

Чим відрізняється трасування від моніторингу?

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

Який відсоток запитів потрібно трасувати?

Для production-систем достатньо 1–5% запитів при head-based sampling. Якщо система рідко видає помилки, рекомендується tail-based sampling з фокусом на захоплення всіх помилкових трас. Для staging-середовища допустимо трасувати 100% запитів без обмежень.

Які інструменти підтримують distributed tracing?

Основні інструменти: Jaeger (рішення від Uber, відкритий вихідний код), Grafana Tempo (масштабоване сховище трас), Datadog APM, New Relic Distributed Tracing, AWS X-Ray та Honeycomb. Всі вони підтримують стандарт OpenTelemetry для прийому даних.

Чи можна трасувати мобільний застосунок без бекенду?

Так, локальне трасування працює всередині одного процесу. OpenTelemetry SDK для iOS та Android створює spans для локальних операцій: читання з бази даних, обробка зображень, мережеві запити. Такі траси не розподілені, але корисні для діагностики продуктивності клієнтської частини.

Як трасування впливає на продуктивність застосунку?

Сучасні бібліотеки трасування додають менше 1% накладних витрат при head-based sampling. OpenTelemetry використовує асинхронний експорт даних, який не блокує основний потік. Для мобільних пристроїв рекомендується обмежити частоту створення spans та використовувати стратегію адаптивного семплювання.

Підсумки

  • Трасування — метод спостереження, що фіксує шлях кожного запиту через всі компоненти розподіленої системи з точністю до окремої операції.
  • Span — елементарна одиниця трасування, що містить назву операції, тривалість, статус та атрибути.
  • Distributed tracing — механізм, що зв'язує spans з різних сервісів через контекстну передачу trace_id.
  • OpenTelemetry — стандарт збору трасувальних даних з підтримкою автоматичної інструментації та багатьох бекендів.
  • Семплювання дозволяє контролювати обсяг трас, що зберігаються — head-based для простоти, tail-based для захоплення рідкісних помилок.
  • Трасування в комбінації з логуванням та метриками дає повну картину observability системи.
  • Впровадження distributed tracing рекомендується починати з критичних сценаріїв — автентифікація, платежі, завантаження даних — і поступово розширювати на всі сервіси.

Ми розробимо мобільний застосунок під ключ

IT Sectr створює застосунки для iOS та Android для стартапів і бізнесу з 2017 року. Ми проконсультуємо вас і запропонуємо найкраще рішення.

Обговорити проект

Читайте також