DAPR vám může zajistit přímou i nepřímou komunikaci mezi komponentami aplikace (service invoke a pub/sub), triggery (input binding) na události mimo DAPR (např. IoT zprávy v Kafka či EventHub) i konektory (output binding) na systémy mimo DAPR (např. soubory v Blob či S3 nebo události v Kafka a tak podobně). To taky znamená, že by v něm mohlo být docela dost užitečných informací a to včetně schopnosti distribuovaného trasování, že? Jasně. Pojďme si to vyzkoušet.
Začneme tím nejzajímavějším - distribuovaným trasováním. Tady DAPR podporuje především standardní protokol OpenTelemetry, na který můžete napojit různé systémy pro ukládání a analýzu těchto dat. Jedním z nich je Azure Application Insights v Azure Monitor, další komerční řešení zahrnují Datadog nebo Dynatrace, v open source světě je to Jaeger a další. Kromě OpenTelemetry podporuje DAPR ještě formát pro Zipkin, který zdá se podporu OpenTelemetry napřímo zatím nemá.
Jak to funguje? Nejdřív potřebujeme v clusteru sbírat OpenTelemetry a posílat do Application Insights. Dle dokumentace jsem použil projekt local-forwarder, který ale už dále rozvíjen nebude. Budoucnost je OpenTelemetry collector, což je univerzální způsob s podporou různých backendů včetně Azure. Ten ale zatím co se týče Azure podpory je v alpha fázi, tak jsem zatím zůstal u local-forwarder, který je dobře dokumentovaný. Nahodil jsem a dal mu klíče do App Insights - to je všechno.
Následně v Kubernetes vytvořím DAPR CRD s konfigurací exporteru s tím, že URL směřuje na můj local-forwarder v clusteru.
apiVersion: dapr.io/v1alpha1
kind: Component
metadata:
name: native
spec:
type: exporters.native
metadata:
- name: enabled
value: "true"
- name: agentEndpoint
value: "localforwarder-default.default.svc.cluster.local:50002"
Výborně - teď globálně zapnu exportování.
apiVersion: dapr.io/v1alpha1
kind: Configuration
metadata:
name: tracing
spec:
tracing:
enabled: true
expandParams: true
includeBody: true
Zbývá na jednotlivých podech zapnout trasování použitím anotace dapr.io/config:
annotations:
dapr.io/enabled: "true"
dapr.io/id: "nodea"
dapr.io/log-as-json: "true"
dapr.io/config: "tracing"
prometheus.io/scrape: "true"
prometheus.io/port: "9090"
prometheus.io/path: "/"
Výborně. Teď už jen spustit aplikaci, udělat pár operací a obrázek v App Insights je na světě.
Podívejme se na některé detaily trochu blíž.
V datech můžu vyhledávat.
Takhle třeba najdu detail jedné z operací, konkrétně zpráva mezi nodea a subscribeorders.
Jako vždy můžu použít připravené workbooky a také si vytvořit vlastní.
Co se týče logů, mohl bych použít Fluentd a cestu do Elastic Search + Kibana. Pro mě nejjednodušší určitě bude zapnutí logování do Azure Monitoru. To funguje samo o sobě, ale pro účely práce v Azure Monitor bude výborné zapnout logování ve formátu JSON, což se bude snadno parsovat. Stačí nastavit globálně při Helm instalaci (-set global.logAsJson=true) a následně přidat anotaci log-as-json u každé aplikace.
annotations:
dapr.io/enabled: "true"
dapr.io/id: "nodea"
dapr.io/log-as-json: "true"
dapr.io/config: "tracing"
prometheus.io/scrape: "true"
prometheus.io/port: "9090"
prometheus.io/path: "/"
V Kusto můžu rovnou v prvním příkazu provést parsing a mám rovnou každé políčko jako samostatný sloupec a hned se s tím výborně dělá. Snadno si pak připravím workbooky, alarmy a další vymoženosti Azure Monitoru.
A co nějaká základní telemetrie typu kolik mi to žeše, jak dlouho trvají requesty apod.? DAPR umí vystrkovat telemetrii ve formě API pro Prometheus. Stačí anotací uporoznit kolektor na sběr.
annotations:
dapr.io/enabled: "true"
dapr.io/id: "nodea"
dapr.io/log-as-json: "true"
dapr.io/config: "tracing"
prometheus.io/scrape: "true"
prometheus.io/port: "9090"
prometheus.io/path: "/"
Pro jednoduché vyzkoušení můžeme začít chytat do Promethea v clusteru, pro dlouhodobou práci s telemtrií jsem si ale nastavil Azure Monitor, aby logy sbíral on. Všechny tam jak vidno jsou.
Pro případ Prometheus + vizualizace v Grafaně jsou připravené i hezké hotové dashboardy.
Tady je základní pohled na sidecary.
Můžeme si prohlédnout http latenci.
Počty nahraných komponent.
Bezpečnostní operace - zejména mTLS mezi všemi instancemi DAPR.
Druhý dashboard se zaměřuje na systémové informace, tedy DAPR operátor, injector apod.
DAPR tedy nejen že zajistí mým aplikacím přenositelnost a jednoduchost, ale pro provoz také přináší další vhled. Vyzkoušejte si.