Pojďme prozkoumat základy Grafana Tempo, což je distribuovaný backend pro sledování tras.
Distribuované sledování tras představuje metodu, jak detailně monitorovat výkon systému. Umožňuje vizualizovat životní cyklus požadavku v rámci celé aplikace. Aplikace se může skládat z mnoha služeb, které mohou být umístěny na jednom serveru nebo distribuovány mezi různými servery.
Díky distribuovanému sledování získáte ucelený přehled o všech službách. A právě k tomu slouží Grafana Tempo.
Co je Grafana Tempo?
Na konferenci ObservabilityCon byly představeny významné novinky od Grafana Labs a Grafana Tempo byla jednou z nich. Grafana Labs tímto rozšířila své portfolio o další open-source projekt, a to „Grafana Tempo“.
Grafana Tempo je open-source distribuovaný trasovací backend s vysokou škálovatelností a snadným použitím. Je plně kompatibilní s jinými sledovacími protokoly, jako jsou Zipkin, Jaeger, OpenTelemetry a OpenCensus. V současnosti podporuje Tempo nástroje pro vyhledávání dat v Loki, platformy pro monitorování jako Prometheus a Grafana. Grafana 7.3 a novější verze nabízejí plynulou integraci mezi Grafanou a Tempem.
Proč používat Tempo?
Tempo se používá pro korelaci metrik, tras a logů. Často se stává, že uživatel opakovaně obdrží stejný typ chyby. Pokud chceme porozumět tomu, co se děje, potřebujeme se podívat na přesné trasy. Avšak z důvodu převzorkování se mohou některé důležité informace ztratit. S Tempem není nutné převzorkování distribuovaných dat sledování. Můžeme ukládat kompletní trasy do objektového úložiště, jako je S3 nebo GCS, což činí Tempo velmi nákladově efektivním.
Tempo také zrychluje ladění a odstraňování problémů díky možnosti rychlého přechodu od metrik k relevantním trasám a konkrétním logům, které zaznamenaly problémy.
Níže jsou uvedeny možnosti konfigurace používané v Tempu:
- Distributor: Slouží ke konfiguraci možností příjmu pro získávání spanů a jejich odesílání příjemcům.
- Ingester: Používá se pro vytváření dávek tras a jejich odesílání do TempoDB k uložení.
- Compactor: Streamuje bloky z úložiště, jako je S3 nebo GCS, spojuje je a zapisuje zpět do úložiště.
- Úložiště: Používá se ke konfiguraci TempoDB. V této konfiguraci je nutné uvést název backendu úložiště (S3 nebo GCS) spolu s dalšími parametry.
- Seznam členů: Používá se pro koordinaci mezi komponentami Tempo.
- Autentizace/Server: Tempo využívá Weaveworks/Common server. Slouží k nastavení konfigurace serveru.
Architektura Tempo
Výše uvedený diagram znázorňuje funkční architekturu Grafana Tempo.
Distributor primárně přijímá rozpětí v různých formátech od Zipkin, Jaeger, OpenTelemetry, OpenCensus a odesílá tato rozpětí příjemcům pomocí hashování ID trasy. Následně Ingester vytváří dávky stop, které se nazývají bloky.
Tyto bloky jsou poté odeslány do backendového úložiště (S3/GCS). Pokud chcete dohledat konkrétní trasovací ID, použijete Grafana UI a ID trasy zadáte do vyhledávacího pole. Dotazovač je zodpovědný za získání detailů o zadaném ID trasy z ingesteru nebo z objektového úložiště.
Nejdříve se ověří, zda je trasovací ID přítomno v ingesteru, a pokud se tam nenajde, zkontroluje se backendové úložiště. K zobrazení tras se využívá jednoduchý HTTP koncový bod. Mezitím kompaktor stahuje bloky z úložiště, spojuje je a posílá zpět do úložiště, čímž snižuje počet bloků v úložišti.
Nastavení Tempo pomocí Dockeru
V této části si krok za krokem ukážeme nastavení Grafana Tempo za použití Dockeru. Nejprve potřebujeme backend Tempo, proto vytvoříme dockerovou síť.
[[email protected] ~]$ docker network create docker-tempo
Stáhneme si konfigurační soubor pro Tempo.
[[email protected] ~]$ curl -o tempo.yaml https://raw.githubusercontent.com/grafana/tempo/master/example/docker-compose/etc/tempo-local.yaml
Níže naleznete seznam možností protokolu, které jsou k dispozici:
Protokol | Port |
Open Telemetry | 55680 |
Jaeger – Thrift Compact | 6831 |
Jaeger – Thrift Binary | 6832 |
Jaeger – Thrift HTTP | 14268 |
Jaeger – GRPC | 14250 |
Zipkin | 9411 |
Pomocí konfiguračního souboru Tempo spustíme docker kontejner. Vybereme formát Jaeger – Thrift Compact (port 6831) pro odesílání tras.
[[email protected] ~]$ docker run -d --rm -p 6831:6831/udp --name tempo -v $(pwd)/tempo-local.yaml:/etc/tempo-local.yaml --network docker-tempo grafana/tempo:latest -config.file=/etc/tempo-local.yaml
Nyní je potřeba spustit kontejner pro dotazy na Tempo. Nejdříve si proto stáhněte konfigurační soubor pro dotazy na Tempo.
[[email protected] ~]$ curl -o tempo-query.yaml https://raw.githubusercontent.com/grafana/tempo/master/example/docker-compose/etc/tempo-query.yaml
S pomocí konfiguračního souboru pro dotazy na Tempo spusťte docker kontejner.
[[email protected] ~]$ docker run -d --rm -p 16686:16686 -v $(pwd)/tempo-query.yaml:/etc/tempo-query.yaml --network docker-tempo grafana/tempo-query:latest --grpc-storage-plugin.configuration-file=/etc/tempo-query.yaml
Uživatelské rozhraní Jaeger bude dostupné na adrese http://localhost:16686, jak je zobrazeno níže.
Do vyhledávacího pole můžete vložit ID trasy z logu, kterou chcete odstraňovat, a vygeneruje se pro vás trasování.
Spuštění ukázkové aplikace na Tempo
Nyní je čas spustit ukázkovou aplikaci, která demonstruje Grafana Tempo. Spustíme příklad docker-compose, proto je nutné mít nainstalovaný docker-compose.
Stáhněte si zip soubor Grafana Tempo: https://github.com/grafana/tempo
Rozbalte jej do vaší domovské složky a přejděte do adresáře docker-compose. Zde najdete několik příkladů docker-compose. My použijeme příklad, kde jsou data aplikace ukládána lokálně.
[[email protected] ~]$ cd tempo-master/example/docker-compose/
[[email protected] docker-compose]$ ls
docker-compose.loki.yaml docker-compose.s3.minio.yaml docker-compose.yaml etc
example-data readme.md tempo-link.png
Spuštěním níže uvedeného příkazu spustíte celý stack.
[[email protected] docker-compose]$ docker-compose up -d
Starting docker-compose_prometheus_1 ... done
Starting docker-compose_tempo_1 ... done
Starting docker-compose_grafana_1 ... done
Starting docker-compose_tempo-query_1 ... done
Starting docker-compose_synthetic-load-generator_1 ... done
Vidíte, že se spustily kontejnery pro Grafanu, Loki, Tempo, Tempo-query a Prometheus.
[[email protected] docker-compose]$ docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
84cd557ce07b grafana/tempo-query:latest "/go/bin/query-linux…" 10 minutes ago Up 4 seconds 0.0.0.0:16686->16686/tcp docker-compose_tempo-query_1
f7cd9cf460d9 omnition/synthetic-load-generator:1.0.25 "./start.sh" 10 minutes ago Up 4 seconds docker-compose_synthetic-load-generator_1
6d9d9fbdb8f1 grafana/grafana:7.3.0-beta1 "/run.sh" 10 minutes ago Up 6 seconds 0.0.0.0:3000->3000/tcp docker-compose_grafana_1
d8574ea25028 grafana/tempo:latest "/tempo -config.file…" 10 minutes ago Up 6 seconds 0.0.0.0:49173->3100/tcp, 0.0.0.0:49172->14268/tcp docker-compose_tempo_1
5f9e53b5a09c prom/prometheus:latest "/bin/prometheus --c…" 10 minutes ago Up 6 seconds 0.0.0.0:9090->9090/tcp docker-compose_prometheus_1
V prohlížeči si také můžete ověřit, zda běží Grafana, Jaeger UI a Prometheus.
Syntetický generátor zátěže běžící uvnitř kontejneru nyní generuje ID tras, které vkládá do Tempo. Spuštěním příkazu níže si můžete zobrazit logy.
[[email protected] docker-compose]$ docker-compose logs -f synthetic-load-generator
Attaching to docker-compose_synthetic-load-generator_1
synthetic-load-generator_1
| using params:
--jaegerCollectorUrl http://tempo:14268
synthetic-load-generator_1
| 21/04/17 14:24:34 INFO ScheduledTraceGenerator: Starting trace generation for service frontend, route /product, 2880 traces/hr
synthetic-load-generator_1
| 21/04/17 14:24:34 INFO ScheduledTraceGenerator: Starting trace generation for service frontend, route /cart, 14400 traces/hr
synthetic-load-generator_1
| 21/04/17 14:24:34 INFO ScheduledTraceGenerator: Starting trace generation for service frontend, route /checkout, 480 traces/hr
synthetic-load-generator_1
| 21/04/17 14:24:37 INFO ScheduledTraceGenerator: Emitted traceId 17867942c5e161f2 for service frontend route /currency
synthetic-load-generator_1
| 21/04/17 14:24:37 INFO ScheduledTraceGenerator: Emitted traceId 3d9cc23c8129439f for service frontend route /shipping
synthetic-load-generator_1
Toto jsou ID trasy, které potřebujete zadat pro vygenerování trasování.
Zkopírujeme jedno z ID tras a vložíme ho do vyhledávacího panelu Jaeger UI.
Vidíte, že se úspěšně vygenerovalo trasování související s ID, které bylo zadáno.
Závěr
Tímto jsme probrali základy Grafana Tempo. Nyní můžete začít s generováním tras a detailněji porozumět metrikám a problémům ve vašich logách.
V Tempu je zachyceno vše a díky tomu se již neztratí žádný detail způsobený downsamplingem. Tempo umožňuje vývojářským a produkčním týmům snadno porozumět hlavním příčinám chyb nebo varování, které se mohou v logách objevit.