Odigos (YC W23) – Sofortiges Distributed Tracing für Kubernetes-Cluster
(github.com/keyval-dev)Hallo, wir sind Eden und Ari, die Mitgründer von Odigos (https://github.com/keyval-dev/odigos). Odigos ist ein Open-Source-Projekt, das sofort Distributed Traces für Anwendungen erzeugt, damit Nutzer sie einfach verwenden können. Odigos ist mit bestehenden Monitoring-Tools kompatibel und erfordert keine Änderungen am Quellcode.
Unsere früheren Erfahrungen mit Monitoring-Tools waren ziemlich enttäuschend. Beim Überwachen verteilter Systeme mit mehreren Microservices stellten wir fest, dass wir zu viel Zeit damit verbrachten, den Microservice zu identifizieren, der die Ursache eines Problems war. So haben wir zum Beispiel einmal stundenlang eine bestimmte Anwendung verdächtigt und debuggt, weil sie offenbar Latenzen verursachte, nur um dann erst später festzustellen, dass die eigentliche Ursache in einer anderen verbundenen Anwendung lag.
Danach haben wir uns mit Distributed Tracing als passendem Ansatz zur Lösung dieses Problems beschäftigt. Anders als Metriken oder Logs, die Daten zu einem bestimmten Zeitpunkt innerhalb einer einzelnen Anwendung erfassen, markiert Distributed Tracing jede Anfrage mit einer eindeutigen ID, sodass sich Anfragen, die sich in einer verteilten Umgebung ausbreiten, nachvollziehen lassen. Dadurch können Entwickler den Kontext jeder Anfrage und die Funktionsweise verteilter Anwendungen besser verstehen.
Allerdings ist dieser Ansatz schwer umzusetzen. Anders als Metriken oder Logs für eine einzelne Anwendung muss Distributed Tracing anwendungsübergreifend implementiert werden. Wenn auch nur eine Anwendung keine Distributed Traces erzeugt, wird die Kontextweitergabe unterbrochen und der Wert dieses Traces sinkt erheblich.
Aus unserer Erfahrung mit der manuellen Implementierung von Distributed Tracing für verschiedene Unternehmen wissen wir, dass es sehr schwierig ist, alle Entwicklungsteams dazu zu koordinieren, jede Anwendung zu instrumentieren, um vollständiges Distributed Tracing zu erreichen. Wenn die Implementierung abgeschlossen war, war der Nutzen hoch, weil sich Produktionsprobleme deutlich schneller beheben ließen. Eine teilweise Implementierung war dagegen kaum wertvoll.
Wir begannen deshalb, diesen Prozess zu automatisieren. Für die meisten Teile des Prozesses wussten wir, wie wir sie angehen konnten, aber der schwierigste Teil war die automatische Instrumentierung von Programmen, die in kompilierten Sprachen geschrieben sind (wie Go). Wenn wir nur diesen Teil automatisieren könnten, so dachten wir, wäre die vollständige Automatisierung des gesamten Prozesses zur Erzeugung von Distributed Traces möglich. Im Verlauf unserer Forschung erkannten wir, dass sich automatische Instrumentierung für kompilierte Sprachen mit eBPF (einer Technologie, mit der der Linux-Kernel externe Programme laden und im Kernel ausführen kann) realisieren lässt. Das war das letzte Puzzleteil, das uns die Entwicklung von Odigos ermöglichte.
Odigos scannt zunächst alle laufenden Anwendungen und erkennt mit eBPF und OpenTelemetry die Programmiersprache jeder Anwendung, um sie entsprechend automatisch zu instrumentieren. Außerdem werden Collector-Komponenten bereitgestellt, die Daten puffern, filtern und an das gewählte Monitoring-Tool weiterleiten, und die je nach Verkehrsaufkommen automatisch skalieren. Dank dieser Automatisierung können Entwickler Distributed Tracing in nur wenigen Minuten nutzen, statt monatelange manuelle Implementierungsarbeit leisten zu müssen.
Automatische Instrumentierung über verschiedene Programmiersprachen hinweg ist keine einfache Aufgabe, insbesondere wenn man statische Binärdateien berücksichtigt (zum Beispiel vom Go-Compiler erzeugte Binärdateien). Wir haben verschiedene Mechanismen eingeführt, um relevante Header sicher und stabil einzufügen, und ein System entwickelt, das Funktionen und Strukturen verschiedener Versionen von Open-Source-Bibliotheken nachverfolgt. Außerdem haben wir ein System für Userspace-Speicherverwaltung in eBPF entwickelt. Dadurch ist Odigos zur einzigen Lösung geworden, die automatisch Distributed Traces für kompilierte Sprachen wie Go und Rust erzeugen kann. Bei anderen Lösungen müssen Nutzer Experten für OpenTelemetry oder eBPF sein, während unsere Lösung keine Vorkenntnisse im Bereich Observability erfordert.
Unsere Lösung lässt sich mit einem einzigen Befehl in einem Kubernetes-Cluster installieren. Nach der Installation erkennt sie die Programmiersprache aller laufenden Anwendungen und setzt den passenden Instrumentierer ein. Für JIT-Sprachen (Java und .NET) oder interpretierte Sprachen (JavaScript und Python) werden OpenTelemetry-Instrumentierer bereitgestellt. Für kompilierte Sprachen (Go, Rust, C) werden eBPF-basierte Instrumentierer bereitgestellt. All das ist für den Nutzer abstrahiert, sodass er nur (1) einige oder alle Zielanwendungen auswählen und (2) das Backend wählen muss, an das die Monitoring-Daten gesendet werden sollen.
Im Mai 2022 haben wir unser erstes Open-Source-Projekt veröffentlicht: einen automatischen Instrumentierer für Go-Anwendungen auf Basis von eBPF. Später haben wir dieses Projekt an die OpenTelemetry-Community gespendet, und es wird heute als Teil der Go Automatic Instrumentation SIG weiterentwickelt.
Wir glauben fest an offene Standards, daher basieren sowohl die Instrumentierer als auch die Collector-Komponenten von Odigos auf Open-Source-Projekten, die von der OpenTelemetry-Community entwickelt werden. Dadurch bleiben wir unabhängig von einzelnen Anbietern.
Derzeit konzentrieren wir uns auf den Aufbau des Open-Source-Projekts. Es gibt noch keine Preise oder kostenpflichtigen Funktionen, aber wir planen künftig auch eine gemanagte Version von Odigos mit Enterprise-Funktionen anzubieten.
Weitere Informationen gibt es hier:
- Dokumentation: https://docs.odigos.io
- Video (Demo): https://www.youtube.com/watch?v=9d36AmVtuGU
- Website: https://odigos.io
Wir würden gern von euren Erfahrungen und Geschichten rund um das Tracing und Monitoring verteilter Anwendungen hören und sie gemeinsam teilen!
1 Kommentare
Hallo, dies ist mein erster Beitrag hier. Wir würden uns über Feedback aus der Community freuen. Tretet gerne dem Slack-Kanal bei.
https://join.slack.com/t/odigos/…
Vielen Dank!