Geçmişte arka uçtan bahsederken genellikle tek, büyük bir veritabanına sahip büyük bir uygulamadan bahsediyorduk ve izleme için günlük kaydı yeterliydi. Artık Kubernetes gibi teknolojiler sayesinde mikro hizmetler standart hale geldi. Uygulamalar daha çok sayıda ve daha fazla dağıtılmış durumdadır ve geleneksel günlük kaydı, uygulamalarımızdaki sorunların ayıklanması ve teşhis edilmesi için artık yeterli değildir.
İzlemeyi organize etmek için mükemmel bir çözüm, dağıtılmış sistemlerde hata ayıklama ve performans analizi için kullanılabilecek modern bir araç seti olan OpenTelemetry'dir.
Bu makale, arka uç optimizasyonu konusundaki bilgilerini genişletmek isteyen BT profesyonellerine yöneliktir. Aşağıda OpenTelemetry'nin ne olduğunu, temel kavramlarını ve çözülmesine yardımcı olduğu sorunları ayrıntılarıyla anlatacağız. OpenTelemetry'nin arka uç sistemlerini izleme ve hata ayıklama yaklaşımınızı nasıl değiştirebileceğini, güvenilirliklerini ve verimliliklerini nasıl artırabileceğini merak ediyorsanız okumaya devam edin.
Büyük teknoloji şirketleri ilk kez 2000'li yılların sonlarında dağıtılmış kayıt tutma ve izleme zorluğuyla karşılaştı. 2010 yılında Google bir makale yayınladı:
2014 yılında Kubernetes ortaya çıktı ve mikro hizmetlerin ve diğer bulut dağıtımlı sistemlerin geliştirilmesini önemli ölçüde basitleştirdi. Bu, birçok şirketin mikro hizmetlerde dağıtılmış günlük kaydı ve izlemeyle ilgili sorunlarla karşılaşmasına yol açtı. Dağıtılmış izlemeyi standartlaştırmak için CNCF tarafından benimsenen OpenTracing standardı ve Google'ın OpenCensus projesi oluşturuldu.
2019 yılında OpenTracing ve OpenCensus projeleri OpenTelemetry adı altında birleşeceğini duyurdu. Bu platform, uzun yıllar boyunca biriken en iyi uygulamaları birleştirerek, karmaşıklıkları ne olursa olsun izleme, kayıt tutma ve ölçümlerin herhangi bir sisteme kusursuz entegrasyonuna olanak tanır.
Bugün OpenTelemetry sadece bir proje değil; telemetri verilerinin toplanması ve iletilmesi için bir endüstri standardıdır. Google ve Microsoft gibi uzmanlardan ve pazar lideri şirketlerden oluşan bir topluluk tarafından geliştirilmekte ve desteklenmektedir. Proje, entegrasyon ve kullanım sürecini basitleştirecek yeni yetenekler kazanarak gelişmeye devam ediyor.
OpenTelemetry, bir uygulamanın dış dünyayla etkileşimde bulunmak için hangi sinyalleri üretebileceğini ve bu sinyallerin, uygulamaların ve bir bütün olarak sistemin durumunu izlemek için nasıl toplanabileceğini ve görselleştirilebileceğini tanımlayan kapsamlı bir uygulama ve araçlar setidir. Üç ana sinyal türü izleme, günlüğe kaydetme ve ölçüm toplamadır .
**Her bir bileşene daha yakından bakalım: \
OpenTelemetry operasyon bağlamları kavramını tanıtır. Bir bağlam öncelikle `trace_id`
(geçerli işlemin tanımlayıcısı) ve `span_id`
(bir alt isteğin her yeniden denemesinin benzersiz bir `span_id`
ye sahip olduğu bir alt isteğin tanımlayıcısı) gibi nitelikleri içerir.
Ayrıca bir bağlam, uygulamanın konuşlandırıldığı düğüm adı veya ortam adı (prod/qa) gibi statik bilgiler içerebilir. OpenTelemetry terminolojisinde kaynaklar olarak bilinen bu alanlar, daha kolay aranabilirlik için her günlüğe, metriğe veya izlemeye eklenir. Bağlamlar ayrıca günlük, ölçüm veya izleme gruplarına seçici olarak eklenebilen geçerli uç noktanın tanımlayıcısı ( `http_path: "GET /user/:id/info"`
) gibi dinamik verileri de içerebilir.
OpenTelemetry bağlamları, bağlam yayılım protokolleri kullanılarak farklı uygulamalar arasında aktarılabilir. Bu protokoller, her HTTP veya gRPC isteğine eklenen başlık kümelerinden veya kuyruklara ilişkin iletilerin başlıklarından oluşur. Bu, aşağı akışlı uygulamaların bu başlıklardan işlem bağlamını yeniden yapılandırmasına olanak tanır.
Bağlam yayılımına bazı örnekler:
B3-Yayılım Bu, orijinal olarak Zipkin izleme sistemi için geliştirilmiş bir dizi başlıktır ( x-b3-*
). OpenTracing'e uyarlandı ve birçok araç ve kitaplık tarafından kullanıldı. B3-Yayılma trace_id
/ span_id
ve örneklemenin gerekli olup olmadığını belirten bir bayrağı taşır.
W3C Trace Context W3C çalışma grubu tarafından geliştirilen bu standart, çeşitli bağlam yayılım yaklaşımlarını tek bir standartta birleştirir ve OpenTelemetry'de varsayılandır. Bu standartların uygulanmasına iyi bir örnek, izleme ve hata ayıklama doğruluğundan ödün vermeden, farklı teknolojilerle uygulanan mikro hizmetlerden geçen bir isteğin yürütülmesinin izlenmesidir.
İzleme, bir isteğin yolunun zaman çizelgesini birden çok mikro hizmet aracılığıyla kaydetme ve ardından görselleştirme işlemidir.
Görselleştirmede her çubuğa "span" adı verilir ve benzersiz bir "span_id" değeri vardır. Kök yayılma alanı "trace" olarak adlandırılır ve isteğin tamamı için tanımlayıcı görevi gören "trace_id" değerine sahiptir.
Bu tür görselleştirme şunları yapmanızı sağlar:
trace_id
ve span_id
değerlerini oluşturmaya devam eder.
Görünen basitliğine rağmen, günlük kaydı sorunları teşhis etmek için en güçlü araçlardan biri olmaya devam ediyor. OpenTelemetry, bağlamsal bilgiler ekleyerek geleneksel günlük kaydını geliştirir. Özellikle, etkin bir izleme mevcutsa, "trace_id" ve "span_id" nitelikleri günlüklere otomatik olarak eklenir ve bunları izleme zaman çizelgesine bağlar. Ayrıca günlük öznitelikleri, OpenTelemetry bağlamından düğüm tanımlayıcısı gibi statik bilgilerin yanı sıra geçerli HTTP uç nokta tanımlayıcısı (`http_path: "GET /user/:id"`) gibi dinamik bilgileri de içerebilir.
'Trace_id'yi kullanarak mevcut istekle ilişkili tüm mikro hizmetlerin günlüklerini bulabilirsiniz; 'span_id' ise alt istekleri ayırt etmenize olanak tanır. Örneğin, yeniden deneme durumunda, farklı denemelerden elde edilen günlükler farklı "span_id" değerlerine sahip olacaktır. Bu tanımlayıcıların kullanılması, tüm sistemin davranışının gerçek zamanlı olarak hızlı bir şekilde analiz edilmesini sağlar, sorun teşhisini hızlandırır ve kararlılığı ve güvenilirliği artırır.
Metrik toplama, sistem performansına ilişkin gecikme, hata oranları, kaynak kullanımı ve daha fazlası gibi niceliksel veriler sağlar. Ölçümlerin gerçek zamanlı izlenmesi, performans değişikliklerine anında yanıt vermenize, arızaları ve kaynak tükenmesini önlemenize ve uygulamanın kullanıcılar için yüksek kullanılabilirlik ve güvenilirlik sağlamasına olanak tanır.
Prometheus ve Grafana gibi metrik depolama ve görselleştirme sistemleriyle entegrasyon, bu verilerin görselleştirilmesini kolaylaştırarak izlemeyi önemli ölçüde basitleştirir.
OpenTelemetry metrik toplayıcıları Prometheus ve OpenMetrics standartlarıyla uyumludur ve önemli değişiklikler olmadan OpenTelemetry çözümlerine kolay geçiş sağlar. OpenTelemetry SDK, trace_id örneklerinin metriklerle birlikte dışa aktarılmasına olanak tanıyarak metriklerin günlük örnekleri ve izlemelerle ilişkilendirilmesini mümkün kılar.
Günlükler, ölçümler ve izleme birlikte sistemin durumuna ilişkin kapsamlı bir görünüm oluşturur:
OpenTelemetry, üç temel bileşene ek olarak Numune Alma, Bagaj ve operasyon bağlam yönetimi kavramlarını da içerir.
Yüksek yüklü sistemlerde, günlüklerin ve izlemelerin hacmi çok büyük hale gelir ve altyapı ve veri depolama için önemli miktarda kaynak gerektirir. Bu sorunu çözmek için OpenTelemetry standartları, sinyal örneklemeyi (izlerin ve günlüklerin yalnızca bir kısmını dışa aktarma yeteneği) içerir. Örneğin, isteklerin belirli bir yüzdesinden, uzun süredir devam eden isteklerden veya hata isteklerinden ayrıntılı sinyalleri dışa aktarabilirsiniz. Bu yaklaşım, önemli kaynaklardan tasarruf ederken istatistik oluşturmak için yeterli örneklemeye olanak tanır.
Ancak her sistem hangi isteklerin ayrıntılı olarak izleneceğine bağımsız olarak karar verirse, her isteğin parçalı bir görünümüne sahip oluruz. Bazı sistemler ayrıntılı verileri dışa aktarabilirken bazıları yalnızca kısmen dışa aktarabilir veya hiç dışa aktarmayabilir.
Bu sorunu çözmek için OpenTelemetry'nin içerik yayma mekanizmaları 'trace_id'/'span_id' ile birlikte bir örnekleme bayrağı iletir. Bu, kullanıcı isteğini alan ilk hizmetin, isteğin ayrıntılı olarak izlenmesi gerektiğine karar vermesi durumunda diğer tüm sistemlerin de aynı şeyi yapmasını sağlar. Aksi takdirde, kaynakları korumak için tüm sistemler kısmen veya hiç sinyal vermemelidir. Bu yaklaşıma "Baş Örnekleme" adı verilir; bu karar, istek işlemenin başlangıcında rastgele veya bazı girdi özelliklerine dayalı olarak alınır.
Ayrıca OpenTelemetry, tüm uygulamaların her zaman tüm sinyalleri ayrıntılı olarak aktardığı ancak bir ara ara belleğin bulunduğu "Kuyruk Örneklemeyi" destekler. Tüm verileri topladıktan sonra, bu arabellek tüm verileri mi yoksa yalnızca kısmi bir örneği mi tutacağına karar verir. Bu yöntem, her istek kategorisinin (başarılı/uzun/hata) daha temsili bir örneğine olanak tanır ancak ek altyapı kurulumu gerektirir.
Bagaj mekanizması, isteğe bağlı anahtar/değer çiftlerinin trace_id
/ span_id
ile birlikte iletilmesine ve istek işleme sırasında tüm mikro hizmetler arasında otomatik olarak geçiş yapılmasına olanak tanır. Bu, istek yolu boyunca ihtiyaç duyulan ek bilgilerin (kullanıcı bilgileri veya çalışma zamanı ortamı ayarları gibi) iletilmesi için kullanışlıdır.
W3C standardına göre bagaj aktarımına yönelik başlık örneği: tracestate: rojo=00f067aa0ba902b7,congo=t61rcWkgMzE,userId=1c30032v5
Bagaj kullanımına ilişkin bazı örnekler aşağıda verilmiştir:
userId
, productId
veya deviceId
gibi İş Bağlamı Bilgilerinin İletilmesi tüm mikro hizmetler aracılığıyla aktarılabilir. Uygulamalar bu bilgileri otomatik olarak günlüğe kaydederek orijinal istek için kullanıcı bağlamına göre günlük aramalarına olanak tanır.
SDK'lar veya altyapı için Özel Yapılandırma Parametreleri Ayarları.
Yönlendirme Bayrakları Yük dengeleyicilerin yönlendirme kararları almasına yardımcı olan bayraklar. Test sırasında bazı isteklerin sahte arka uçlara yönlendirilmesi gerekebilir. Bagaj tüm hizmetler aracılığıyla otomatik olarak iletildiğinden ek protokoller oluşturmaya gerek yoktur; yalnızca yük dengeleyicide bir kural oluşturmanız yeterlidir.
Bagajın performansa etkisi minimum düzeyde olsa da aşırı kullanımın ağ ve hizmet yükünü önemli ölçüde artırabileceğini unutmayın. Performans sorunlarından kaçınmak için Bagaja gerçekten hangi verileri aktarmanız gerektiğini dikkatlice seçin.
OpenTelemetry'nin altyapı düzeyinde uygulanması, OpenTelemetry arka uçlarının uygulama mimarisine entegre edilmesini ve altyapının veri toplama için yapılandırılmasını içerir.
Süreç dört aşamadan oluşur:
Uygulama Entegrasyonu İlk aşamada, OpenTelemetry SDK'ları ölçümleri, günlükleri ve izleri toplamak için doğrudan uygulamalara entegre edilir ve her sistem bileşeninin performansı hakkında sürekli veri akışı sağlanır.
Dışa Aktarıcıları Yapılandırma Toplanan veriler, ihtiyaçlarınıza bağlı olarak günlük kaydı, izleme, izleme veya analiz sistemleri gibi daha ileri işlemler için dışa aktarıcılar aracılığıyla uygulamalardan harici sistemlere yönlendirilir.
Toplama ve Depolama Bu aşama, verilerin normalleştirilmesini, ek bilgilerle zenginleştirilmesini ve sistemin durumuna ilişkin birleşik bir görünüm oluşturmak için farklı kaynaklardan gelen verilerin birleştirilmesini içerebilir.
Veri Görselleştirme Son olarak, işlenen veriler Grafana (metrikler ve izlemeler için) veya Kibana (loglar için) gibi sistemlerde gösterge tabloları olarak sunulur. Bu, ekiplerin sistemin durumunu hızlı bir şekilde değerlendirmesine, sorunları ve eğilimleri belirlemesine ve oluşturulan sinyallere göre uyarılar oluşturmasına olanak tanır.
Bir uygulamayla entegrasyon sağlamak için, kullanılan programlama diline uygun OpenTelemetry SDK'sını bağlamanız veya OpenTelemetry'yi doğrudan destekleyen kitaplıkları ve çerçeveleri kullanmanız gerekir. OpenTelemetry genellikle bilinen kitaplıklardan yaygın olarak kullanılan arayüzleri uygulayarak, anında değiştirmelere olanak tanır. Örneğin, Mikrometre kitaplığı, Java ekosistemindeki metriklerin toplanması için yaygın olarak kullanılır. OpenTelemetry SDK, Mikrometre arayüzlerinin uygulamalarını sağlayarak, ana uygulama kodunu değiştirmeden metrik dışa aktarmayı mümkün kılar. Ayrıca OpenTelemetry, eski OpenTracing ve OpenCensus arayüzlerinin uygulamalarını sunarak OpenTelemetry'ye sorunsuz geçişi kolaylaştırır.
BT sistemlerinde OpenTelemetry, güvenilir ve verimli arka uçların geleceğinin anahtarı olabilir. Bu araç, hata ayıklamayı ve izlemeyi basitleştirir ve aynı zamanda uygulama performansının ve optimizasyonunun yeni bir düzeyde derinlemesine anlaşılması için fırsatların kapısını açar. Arka uç geliştirmenin daha basit ve daha etkili olduğu bir geleceği şekillendirmeye yardımcı olmak için OpenTelemetry topluluğuna katılın!