All truths are easy to understand once they are discovered; the point is to discover them. — Galileo Galilei
Tanım: Observability, uygulamaların canlı ortamda bile iç durumlarını dışa vuran veriler üreterek izlenebilmesini sağlayan bir yaklaşımdır. Aynı zamanda bir sistemin iç durumunu dış gözlemlerle anlama yeteneğini ifade eder ve dağıtık sistemlerde sistemin performansını izlemek ve hataları tespit etmek için kullanılır.
Neden Önemli?: IDE’de lokal olarak debug yapmak kolay. Ancak canlıda bir sorun yaşandığında sistemi gözlemleyebilmek için bazı verileri aktif olarak toplamamız gerekir.
Sistemde meydana gelen olayların kaydıdır ve detaylı analiz yapma imkanı sunar.
Uygulamanın zaman bilgisini (timestamp), mesajı, sınıf/metot bilgilerini ve formatlanmış metinleri içerir.
Her yere log atmak sakıncalı olabilir, çünkü sistemde yük oluşturabilir.
Metrics:
Yükü en hafif olan, sistem performansını gösteren sayısal veriler sağlar. (ör. CPU kullanımı, kuyruktaki istek sayısı, hata sayısı).
Uygulamadan veya container/servis mesh gibi katmanlardan toplanabilir.
Tracing:
İşlemlerin dağıtık sistemlerde nasıl ilerlediğini izler. Özellikle mikroservisler arası isteklerin nasıl geçtiğini takip eder.
Trace Data: Başlangıçtan bitişine kadar bir operasyonu (transaction) uçtan uca izlemek için oluşturulur (Bu veride hangi işlemle devam etti, işlem ne kadar sürdü gibi veriler vardır.).
Geniş çaplı (ör. bir HTTP request’in veritabanı işlemlerine kadar takibi) süreçlerde gereklidir.
Her yerde trace tutmak da kaynak tüketimini artırır; ihtiyaca göre konumlandırılmalıdır.
Elastic APM: Elastic tarafından geliştirilen bir Application Performance Monitoring çözümüdür. Uygulamaların performansını, hatalarını ve işlemler arasındaki gecikmeleri izleyebilmek için distribute tracing, log analizi ve metrik toplama özelliklerini bir arada sunar.
New Relic: SaaS tabanlı bir Application Performance Monitoring platformudur. Anlık performans metrikleri, hata takibi ve gelişmiş analiz araçları sunarak uygulamanızın uçtan uca izlenmesini sağlar. Kod seviyesinde detaylı tracing, kullanılabilirlik ölçümleri, gecikme analizleri gibi özelliklerle performans sorunlarını hızlıca tespit etmeye yardımcı olur.
Application Insights: Microsoft Azure ekosisteminin bir parçası olan Application Insights, canlı uygulamaların performans ve kullanım verilerini izlemek için kullanılan bir APM hizmetidir. Kullanıcı davranışlarını, istek performansını ve hataları gerçek zamanlı olarak takip etmeyi sağlar. Ayrıca, Azure’un diğer hizmetleriyle entegre çalışarak merkezi izleme, uyarı mekanizmaları ve veri analizi imkanları sunar.
OpenTelemetry’de Resource, hangi servis veya uygulamanın veri ürettiğini tanımlayan ve telemetri (Trace, Metrics, Logs) verilerine bağlam kazandıran meta bilgileri içerir. Bu sayede, ürettiğiniz verilerin hangi servis tarafından, hangi sürümde, hangi ortamda (örn. dev, preprod, prod) veya hangi instance (kopya) üzerinden geldiğini anlayabilirsiniz.
Span’e ek bilgi (metadata) eklemek için kullanılır.
Örnek: Sipariş ID, kullanıcı ID, işlem türü gibi bilgileri, span ile ilişkilendirerek daha ayrıntılı takip edebiliriz.
İleride analiz yaparken veya sorun giderirken, bu etiketler sayesinde hangi işlemin hangi kullanıcı veya siparişle ilgili olduğunu hızlıca bulabilirsiniz.
Bir uygulama içindeki veya farklı servisler arasındaki span’lerin birbirine bağlı olduğu durumu ifade eder.
İstek, bir servis/uygulamadan diğerine aktarıldığında, traceId paylaşılır ve böylece bütün istek zinciri aynı iz (trace) altında toplanır.
Bu sayede APM (Application Performance Monitoring) araçlarında tek bir iz (trace) içerisinde, çoklu servis ve işlem adımlarını uçtan uca takip edebilirsiniz.
Tanım: .NET uygulamalarında halihazırda etkin (aktif) olan Activity nesnesine (span) erişim sağlar.
Kullanım: Aşağıdaki örnek, Activity.Current üzerinden mevcut işlem (span) bilgisini elde etmeye yarar. Örneğin, etiket eklemek veya durum güncellemesi yapmak istediğinizde Activity.Current?.SetTag("key", "value") şeklinde çağrı yapabilirsiniz.
Tanım: .NET uygulamalarında, oluşturulan veya bitirilen Activity (yani Span) nesnelerini dinlemek (listen) ve yönetmek için kullanılan bir mekanizmadır.
Amaç: Uygulamada hangi Activity’lerin (işlemlerin) izlenmesi, örneğin hangilerinin kaydedilmesi veya kaydedilmemesi gerektiğine karar vermenizi sağlar.
Esneklik: Gerçek zamanlı olarak hangi span’lerin kaydedilmesi gerektiğini değiştirerek (örneğin, hata modunda tüm tracing’i aktif hale getirerek) sistem davranışını dinamik olarak ayarlayabilirsiniz.
İnce Ayar: Özel mantıklar (ör. belirli bir kullanıcıya veya siparişe ait Activity’leri kaydetme) tanımlayarak ince düzeyde kontrol sağlayabilirsiniz.
Aşağıda, hem Jaeger hem de Elastic APM için temel kurulum örneklerini bulabilirsiniz. Bu örnekler, hızlı bir şekilde lokal ortamda çalıştırmak veya test amaçlı yapılandırmak içindir. Üretim ortamına uygun daha detaylı kurulumlar için resmi dokümanları inceleyebilirsiniz.
Instrumentations, bir uygulamanın belirli bölümlerini (ör. ASP.NET Core, HttpClient, Entity Framework, Redis, RabbitMQ) otomatik olarak izlenebilir hâle getiren bileşenler veya kütüphanelerdir. Bu sayede, uygulamanızın farklı katmanlarında (ör. web istekleri, veri tabanı işlemleri, mesaj kuyruğu vb.) gerçekleşen olaylar ve performans metrikleri otomatik olarak toplanır ve kaydedilir.
Neden Gerekli?
Uygulamanın kritik noktalarını (API çağrıları, veritabanı sorguları, mesaj kuyruğu işlemleri vb.) tek tek manuel kodlamadan izlemeye olanak tanır.
Performans sorunlarını veya hataları hızlı bir şekilde tespit edip kök neden analizi (root cause analysis) yapmak kolaylaşır.
Nasıl Çalışır?
Geliştiriciler, ilgili instrumentation paketini projeye ekler (NuGet).
Uygulamaya, konfigürasyonla hangi bileşenlerin izleneceği belirtilir (AddAspNetCoreInstrumentation, AddHttpClientInstrumentation, vb.).
Toplanan veriler, tercihe göre Jaeger, Zipkin, Elastic APM gibi dış araçlara veya konsola gönderilir (export edilir).
Özetle: Instrumentations, uygulamanızdaki karmaşık işlemleri elle uğraşmadan otomatik olarak ölçümleyerek daha kolay gözlemleme (observability) sağlar.
Aşağıda .NET projelerinde sıkça kullanılan instrumentation (izleme/ölçüm) seçeneklerini özetliyoruz. Bu bileşenler, OpenTelemetry veya benzeri kütüphaneler aracılığıyla uygulamanın önemli noktalarını (HTTP istekleri, veritabanı işlemleri, mesaj kuyruğu işlemleri vb.) otomatik veya yarı otomatik bir şekilde izlenebilir hâle getirir.
Dağıtık bir mimaride, mesajların uçtan uca (publish -> queue -> consumer) hangi aşamalardan geçtiğini görebilir, hangi aşamada gecikme ya da hata oluştuğunu tespit edebilirsiniz.
MassTransit ile entegre bir şekilde izleme sağlayarak, iş akışını (workflow) uçtan uca izleyebilirsiniz.
Özetle, bu instrumentations sayesinde uygulamanın önemli katmanları (web istekleri, veritabanı, mesaj kuyruğu vb.) hakkında ayrıntılı telemetri verileri elde edebilir, hata ayıklama ve performans analizi süreçlerinizi kolaylaştırabilirsiniz.