Odigos (YC W23) – Kubernetes kümeleri için anında dağıtık izleme
(github.com/keyval-dev)Merhaba. Biz, Odigos'un (https://github.com/keyval-dev/odigos) kurucu ortakları Eden ve Ari'yiz. Odigos, uygulamalar için anında dağıtık izler (distributed trace) üreten ve kullanıcıların bunları kolayca kullanabilmesini sağlayan açık kaynaklı bir projedir. Odigos, mevcut izleme araçlarıyla uyumludur ve kaynak kodunda da değişiklik gerektirmez.
Önceki izleme araçlarıyla yaşadığımız deneyim oldukça hayal kırıklığı yaratıcıydı. Birden fazla mikroservis içeren dağıtık sistemleri izlerken, sorunun kök nedeni olan mikroservisi tespit etmek için fazlasıyla zaman harcadığımızı fark ettik. Örneğin, belirli bir uygulamanın gecikmeye neden olduğundan şüphelenip onu debug etmek için saatler harcadığımız olmuştu; ancak sonunda sorunun kaynağının ilişkili başka bir uygulama olduğunu ancak çok sonra anlayabildik.
Bunun ardından, bu tür sorunları çözmek için uygun olan dağıtık izleme (distributed tracing) üzerine çalıştık. Tek bir uygulamada belirli bir andaki veriyi yakalayan metrikler veya logların aksine, dağıtık izleme her isteği benzersiz bir kimlikle etiketleyerek dağıtık ortamda yayılan isteğin izlenebilmesini sağlar. Bu sayede geliştiriciler her isteğin bağlamını (context) ve dağıtık uygulamaların nasıl davrandığını anlayabilir.
Ancak bu yaklaşımın dezavantajı, uygulamasının zor olmasıdır. Tek bir uygulama için metrik veya loglardan farklı olarak, dağıtık izleme ancak birden fazla uygulama boyunca uygulanırsa anlamlı olur. Uygulamalardan yalnızca biri bile dağıtık iz üretmiyorsa bağlamın yayılımı kesilir ve ilgili izin değeri ciddi biçimde düşer.
Çeşitli şirketler için dağıtık izlemeyi bizzat uygulamış biri olarak gördük ki, eksiksiz dağıtık izleme elde etmek için tüm geliştirme ekiplerinin her uygulamayı enstrümante etmesini koordine etmek son derece zordur. Uygulama tamamlandığında üretim sorunlarını çok daha hızlı çözebildiğimiz için değeri yüksekti. Ancak kısmi uygulamalar pek de değerli değildi.
Bu süreci otomatikleştirmeye başladık. Sürecin büyük bölümünü nasıl ele alacağımızı biliyorduk, ancak en zor kısım derlenmiş dillerle (örneğin Go) yazılmış programları otomatik olarak enstrümante etmenin yoluydu. Sadece o kısmı otomatikleştirebilirsek, dağıtık iz üretme sürecinin tamamını otomatikleştirmenin mümkün olacağını düşündük. Araştırma sırasında, eBPF'nin (Linux çekirdeğinin harici programları yükleyip çekirdek içinde çalıştırmasına olanak tanıyan bir teknoloji) derlenmiş diller için otomatik enstrümantasyonu mümkün kıldığını fark ettik. Bu, yapbozun son parçasıydı ve onun sayesinde Odigos'u geliştirebildik.
Odigos önce çalışan tüm uygulamaları tarar; ardından eBPF ve OpenTelemetry kullanarak her uygulamanın programlama dilini tanır ve buna göre otomatik enstrümantasyon uygular. Ayrıca verileri tamponlayan, filtreleyen ve seçtiğiniz izleme aracına ileten collector'ları dağıtır ve trafik miktarına göre auto scale eder. Bu otomasyon sayesinde geliştiriciler, uygulanması aylar sürebilecek manuel işlerin aksine, yalnızca birkaç dakika içinde dağıtık izlemeden yararlanabilir.
Farklı programlama dilleri arasında otomatik enstrümantasyon, özellikle statik binary'ler (örneğin Go derleyicisinin ürettiği binary'ler) söz konusu olduğunda, basit bir iş değildir. İlgili header'ların güvenli ve kararlı bir şekilde eklenebilmesi için çeşitli mekanizmalar geliştirdik ve farklı sürümlerdeki açık kaynak kütüphanelerin işlevlerini ve struct'larını izleyen bir sistem kurduk. Ayrıca eBPF içinde userspace bellek yönetimi yapan bir sistem geliştirdik. Sonuç olarak Odigos, Go ve Rust gibi derlenmiş diller için dağıtık izleri otomatik olarak oluşturabilen tek çözüm haline geldi. Diğer çözümler kullanıcının OpenTelemetry veya eBPF konusunda uzman olmasını gerektirirken, bizim çözümümüz observability teknolojileri hakkında önceden bilgi gerektirmez.
Çözümümüz tek bir komutla Kubernetes kümesine kurulabilir. Kurulduktan sonra çalışan tüm uygulamaların programlama dilini algılar ve uygun enstrümantasyonu uygular. JIT dilleri (Java ve .NET) veya yorumlanan diller (JavaScript ve Python) için OpenTelemetry enstrümantasyonunu dağıtır. Derlenmiş diller (Go, Rust, C) içinse eBPF tabanlı enstrümantasyon dağıtır. Bunların tamamı kullanıcıdan soyutlandığı için kullanıcıların yalnızca (1) hedef uygulamaların bir kısmını veya tamamını seçmesi ve (2) izleme verilerinin gönderileceği backend'i seçmesi yeterlidir.
Mayıs 2022'de, eBPF tabanlı Go uygulamaları için otomatik enstrümantasyon sağlayan ilk açık kaynak projemizi yayımladık. Daha sonra bu projeyi OpenTelemetry topluluğuna bağışladık ve proje şu anda Go Automatic Instrumentation SIG'in bir parçası olarak geliştiriliyor.
Açık standartlara güçlü biçimde inandığımız için, Odigos'un kullandığı enstrümantasyon ve collector'ların tamamı OpenTelemetry topluluğu tarafından geliştirilen açık kaynak projelere dayanır. Bu sayede belirli bir vendor'a bağımlı kalmayız.
Şu anda açık kaynak projeyi geliştirmeye odaklanmış durumdayız. Henüz belirlenmiş bir fiyatlandırma veya ücretli özellik yok, ancak gelecekte kurumsal özellikler içeren yönetilen bir Odigos sürümü de sunmayı planlıyoruz.
Daha fazla bilgiye aşağıdan ulaşabilirsiniz.
- Dokümantasyon: https://docs.odigos.io
- Video (demo): https://www.youtube.com/watch?v=9d36AmVtuGU
- Ana sayfa: https://odigos.io
Dağıtık uygulama izleme ve monitoring konusundaki deneyimlerinizi ve farklı hikayelerinizi duymak ve birlikte paylaşmak istiyoruz!
1 yorum
Merhaba, buraya ilk kez yazıyorum. Topluluktan geri bildirim almak istiyoruz. Slack kanalına dilediğiniz gibi katılabilirsiniz.
https://join.slack.com/t/odigos/…
Teşekkürler!