Začínáme s Grafana Tempo

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.