Tracing: co to je, principy a sběr dat

Autor: IT Sectr Publikováno: 2026-05-29 Doba čtení: 8 min

Tracing je metoda pozorování toku požadavků distribuovaným systémem, při které je každý krok zpracování zaznamenán jako samostatná událost s časovým razítkem. Podle údajů OpenTelemetry, 2025, trace spojuje celou cestu požadavku od vstupního bodu až po konečnou odpověď, procházející všemi mikroslužbami a externími voláními. To umožňuje vývojářům identifikovat úzká místa, zpoždění a selhání ve složitých architekturách mobilních backendů.

Hlavní body

  • Tracing — záznam cesty požadavku přes všechny komponenty distribuovaného systému s fixací času každého kroku.
  • Span — základní jednotka trace představující jednu operaci s uvedením času zahájení a dokončení.
  • Distributed tracing — mechanismus spojující spany z různých služeb do jednoho řetězce trace pomocí kontextového předávání.
  • OpenTelemetry — standard sběru telemetrie podporující tracing pro všechny populární jazyky a platformy.
  • Sampling — strategie výběru části požadavků pro tracing umožňující kontrolu objemu dat a nákladů na úložiště.

Co je tracing v monitorování

Tracing je metoda distribuovaného pozorování, při které je každý příchozí požadavek sledován přes všechny služby a komponenty systému. Na rozdíl od metrik, které ukazují agregované hodnoty (průměrná doba odezvy, počet chyb), tracing zachovává úplný kontext jednoho konkrétního požadavku.

Každý krok zpracování — volání databáze, HTTP požadavek na jinou mikroslužbu, provedení úlohy na pozadí — je zaznamenán jako samostatná jednotka s časovým razítkem, stavem a atributy. Podle údajů Google Dapper (původní publikace z roku 2010), tracing umožňuje lokalizovat zpoždění v distribuovaných systémech s přesností na jedno volání.

Tracing je obzvláště důležitý pro mobilní aplikace, kde backend tvoří desítky mikroslužeb. Uživatelská akce — například přihlášení k účtu — může projít přes API Gateway, autentizační službu, databázi a Push službu. Bez trace je prakticky nemožné určit, která komponenta zpomaluje odpověď.

Spany a trace: základní datová struktura

Základní jednotkou trace je span. Každý span představuje jednu logickou operaci: HTTP požadavek, SQL dotaz, volání gRPC, serializaci JSON. Span obsahuje jedinečný identifikátor, identifikátor rodiče, název operace, čas zahájení, dobu trvání, stav a sadu atributů.

Hierarchie spanů v trace

Všechny spany týkající se jednoho kořenového požadavku se spojují v trace. Kořenový span (root span) představuje vstupní bod — HTTP požadavek od mobilního klienta k API. Dětské spany tvoří strom, kde každý span odkazuje na rodiče polem parent_span_id.

Doba trvání trace se rovná součtu dob trvání jedinečných časových úseků všech spanů. Pokud se dva dětské spany provádějí paralelně, jejich čas se nesčítá — to je kritické pro správnou analýzu zpoždění způsobených paralelními voláními mikroslužeb.

Atributy a události spanu

Každý span může obsahovat atributy — páry klíč-hodnota s metainformacemi: URL požadavku, ID uživatele, verze API, název hostitele. Atributy se používají k filtrování a seskupování trace. Kromě atributů span podporuje události — časová razítka s textovým popisem, například „výpadek mezipaměti“ nebo „pokus o opětovné připojení“.

Jak funguje distributed tracing

Distributed tracing řeší problém propojování spanů, které jsou vytvářeny v různých procesech a na různých strojích. Mechanismus je založen na kontextovém předávání: při volání služby B ze služby A je k odchozímu požadavku přidána hlavička s identifikátorem aktuálního trace a rodičovského spanu.

Standardní protokoly pro předávání kontextu — W3C Trace Context (hlavičky traceparent a tracestate) a Zipkin B3 (hlavičky X-B3-TraceId, X-B3-SpanId). W3C Trace Context byl přijat jako standard konsorciem W3C v roce 2021 a je podporován všemi hlavními poskytovateli telemetrie.

Při přijetí požadavku služba B extrahuje trace_id z hlavičky a vytvoří dětský span s tímto trace_id. Po dokončení požadavku se všechny spany z různých služeb spojí do jednoho trace na straně kolektoru. K tomu musí být každá služba instrumentována stejnou knihovnou pro tracing.

Kontextové předávání v mikroslužbách

V mobilním vývoji kontextové předávání zahrnuje nejen backend, ale i interakci klient-server. Mobilní aplikace může odesílat trace_id v hlavičce každého API požadavku, což umožňuje propojení akce klienta se zpracováním na serveru. OpenTelemetry SDK pro iOS a Android podporuje automatické vytváření a předávání trace kontextu přes HTTP klienty.

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() }
    }
}

Prezentovaný interceptor v Kotlinu vytváří span pro každý HTTP požadavek na server. Rodičovský kontext je předáván z volajícího kódu přes Context.current(), což umožňuje propojení trace na straně klienta s trace na straně serveru.

Implementace tracingu přes OpenTelemetry

OpenTelemetry — de facto standard pro sběr dat trace. Poskytuje jednotné API pro generování spanů, automatickou instrumentaci populárních knihoven a flexibilní mechanismus exportu dat do různých backendů: Jaeger, Zipkin, Grafana Tempo, Datadog, New Relic.

Automatická instrumentace

OpenTelemetry podporuje automatické vytváření spanů pro populární frameworky: Spring Boot, Ktor, Flask, Express, gRPC. Vývojář stačí přidat závislost do projektu a knihovna samostatně zachycuje příchozí a odchozí požadavky. Auto-instrumentation pro Javu používá javaagent, který modifikuje bytecode za běhu bez změny zdrojového kódu.

Pro mobilní platformy OpenTelemetry poskytuje Swift SDK a Kotlin SDK. Automaticky vytvářejí spany pro síťové požadavky (URLSession, OkHttp), práci s databází (CoreData, Room) a úlohy na pozadí. Vývojář může přidávat vlastní spany pro obchodní logiku.

Export dat

Shromážděné spany jsou odesílány do kolektoru pomocí protokolu OTLP (OpenTelemetry Protocol). Kolektor může data bufferovat, filtrovat a přesměrovávat do jednoho nebo více úložných systémů. Podle dokumentace OpenTelemetry, typické zpoždění od vygenerování spanu po jeho zobrazení na dashboardu je 2–5 sekund při použití gRPC exportu.

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()

Kód ve Swift aktivuje automatickou instrumentaci síťové vrstvy a vytváří vlastní span pro operaci načtení profilu uživatele. Atribut user.id umožňuje pozdější filtrování trace podle konkrétního uživatele.

Strategie vzorkování trace

Ve vysoce zatížených systémech není možné sledovat každý požadavek — to by vytvořilo nepřijatelné zatížení úložiště a sítě. Vzorkování řeší tento problém ukládáním pouze části trace. Výběr strategie přímo ovlivňuje úplnost dat a náklady na infrastrukturu.

Head-based sampling

Rozhodnutí o uložení trace se provádí v okamžiku jeho vytvoření — v kořenovém spanu. Nejjednodušší a nejrozšířenější přístup: pevné procento požadavků (např. 5%) je uloženo, zbytek je zahozen. Nevýhoda — nelze zaručit, že vzácné chyby budou zachyceny. Probability sampler v OpenTelemetry podporuje nastavení pravděpodobnosti od 0,0 do 1,0.

Tail-based sampling

Rozhodnutí je odloženo až do dokončení všech spanů trace. Analyzátor vyhodnocuje, zda trace obsahuje chyby, překročení času nebo zajímavé atributy, a teprve poté jej uloží. Tento přístup vyžaduje bufferování všech spanů v kolektoru, což zvyšuje spotřebu paměti. Podle údajů Grafana Labs je tail-based sampling o 40–60% efektivnější z hlediska poměru „cena za užitečná data“ v systémech se vzácnými, ale kritickými chybami.

StrategieVýhodyNevýhody
Fixed probabilityJednoduchost, předvídatelné zatíženíPřehlíží vzácné události
Rate limitingZaručený objem datNerovnoměrné pokrytí
Tail-basedZachycení všech chybVysoká spotřeba paměti
AdaptiveRovnováha nákladů a pokrytíSložitost konfigurace

Rozdíl mezi tracingem a logováním

Logování zaznamenává jednotlivé události s úrovní důležitosti (info, warn, error), ale nespojuje je v kontextu jednoho požadavku. Tracing naopak vytváří strukturovaný strom operací patřících k jednomu end-to-end požadavku. V praxi se tyto dva přístupy nevylučují, ale doplňují.

Logy jsou účinné pro detailní analýzu konkrétní chyby: vývojář vidí přesnou zprávu, zásobník volání, hodnoty proměnných. Tracing odpovídá na otázku „proč požadavek trvá 5 sekund“ — ukazuje, která mikroslužba nebo volání zabralo nejvíce času. Podle údajů Honeycomb (2024), týmy používající tracing společně s logováním nacházejí hlavní příčinu incidentů 2,3krát rychleji.

Moderní přístup — observability — spojuje trace, metriky a logy do jednoho systému. OpenTelemetry podporuje korelaci mezi těmito třemi signály: každý span může obsahovat odkazy na související logy a metriky mohou být označeny trace_id pro přechod ke konkrétním trace.

Často kladené otázky

Čím se liší tracing od monitorování?

Monitorování ukazuje agregované metriky systému — průměrnou dobu odezvy, počet chyb za minutu, zatížení CPU. Tracing ukazuje cestu jednoho konkrétního požadavku přes všechny komponenty. Monitorování odpovídá na otázku „co se děje“, tracing — „proč se to děje“.

Jaké procento požadavků je třeba trace?

Pro produkční systémy postačuje 1–5% požadavků při head-based samplingu. Pokud systém zřídka generuje chyby, doporučuje se tail-based sampling se zaměřením na zachycení všech chybných trace. Pro staging prostředí je přípustné trace 100% požadavků bez omezení.

Jaké nástroje podporují distributed tracing?

Hlavní nástroje: Jaeger (řešení od Uber, otevřený zdrojový kód), Grafana Tempo (škálovatelné úložiště trace), Datadog APM, New Relic Distributed Tracing, AWS X-Ray a Honeycomb. Všechny podporují standard OpenTelemetry pro příjem dat.

Lze trace mobilní aplikaci bez backendu?

Ano, lokální tracing funguje uvnitř jednoho procesu. OpenTelemetry SDK pro iOS a Android vytváří spany pro lokální operace: čtení z databáze, zpracování obrázků, síťové požadavky. Takové trace nejsou distribuované, ale jsou užitečné pro diagnostiku výkonu klientské části.

Jak tracing ovlivňuje výkon aplikace?

Moderní knihovny pro tracing přidávají méně než 1% režie při head-based samplingu. OpenTelemetry používá asynchronní export dat, který neblokuje hlavní vlákno. Pro mobilní zařízení se doporučuje omezit frekvenci vytváření spanů a používat strategii adaptivního vzorkování.

Shrnutí

  • Tracing — metoda pozorování zaznamenávající cestu každého požadavku přes všechny komponenty distribuovaného systému s přesností na jednotlivou operaci.
  • Span — elementární jednotka trace obsahující název operace, dobu trvání, stav a atributy.
  • Distributed tracing — mechanismus spojující spany z různých služeb přes kontextové předávání trace_id.
  • OpenTelemetry — standard pro sběr dat trace s podporou automatické instrumentace a mnoha backendů.
  • Vzorkování umožňuje kontrolu objemu ukládaných trace — head-based pro jednoduchost, tail-based pro zachycení vzácných chyb.
  • Tracing v kombinaci s logováním a metrikami poskytuje úplný obraz o observability systému.
  • Implementaci distributed tracingu se doporučuje začít kritickými scénáři — autentizace, platby, načítání dat — a postupně rozšiřovat na všechny služby.

Vyvineme mobilní aplikaci na klíč

IT Sectr vytváří aplikace pro iOS a Android pro startupy a podniky od roku 2017. Poradíme vám a navrhneme nejlepší řešení.

Prodiskutovat projekt

Přečtěte si také