Skip to content

OpenTelemetry

Giriş

OpenTelemetry, modern uygulamalar için açık kaynaklı bir gözlemlenebilirlik (observability) çerçevesidir. Telemetri verilerinin (metrikler, izler ve loglar) toplanması, işlenmesi ve aktarılması için standart bir API ve SDK sağlar. .NET uygulamalarında dağıtık izleme, metrik toplama ve log yönetimi için kullanılır.

OpenTelemetry'nin Önemi

  1. Standartlaştırma
  2. Tek bir API
  3. Farklı sağlayıcılarla uyumluluk
  4. Dil bağımsız yaklaşım
  5. Topluluk desteği

  6. Esneklik

  7. Özelleştirilebilir yapı
  8. Farklı export seçenekleri
  9. Zengin enstrümantasyon
  10. Modüler mimari

  11. Dağıtık İzleme

  12. End-to-end tracing
  13. Context propagation
  14. Span ve trace yönetimi
  15. Correlation

OpenTelemetry Kullanımı

  1. Temel Kurulum

    // NuGet paketleri:
    // OpenTelemetry.Extensions.Hosting
    // OpenTelemetry.Instrumentation.AspNetCore
    // OpenTelemetry.Exporter.Console
    // OpenTelemetry.Exporter.OpenTelemetryProtocol
    
    public class Startup
    {
        public void ConfigureServices(IServiceCollection services)
        {
            services.AddOpenTelemetry()
                .WithTracing(builder => builder
                    .AddAspNetCoreInstrumentation()
                    .AddHttpClientInstrumentation()
                    .AddConsoleExporter())
                .WithMetrics(builder => builder
                    .AddAspNetCoreInstrumentation()
                    .AddConsoleExporter());
        }
    }
    

  2. Özel Telemetri

    public class TelemetryService
    {
        private readonly Tracer _tracer;
        private readonly Meter _meter;
    
        public TelemetryService(TracerProvider tracerProvider, MeterProvider meterProvider)
        {
            _tracer = tracerProvider.GetTracer("MyApp");
            _meter = meterProvider.GetMeter("MyApp");
        }
    
        public async Task TrackOperationAsync(string operationName, Func<Task> operation)
        {
            using var span = _tracer.StartActiveSpan(operationName);
            try
            {
                await operation();
                span.SetStatus(Status.Ok);
            }
            catch (Exception ex)
            {
                span.SetStatus(Status.Error);
                span.RecordException(ex);
                throw;
            }
        }
    
        public void TrackMetric(string metricName, double value)
        {
            var counter = _meter.CreateCounter<double>(metricName);
            counter.Add(value);
        }
    }
    

  3. Dağıtık İzleme

    public class DistributedTracingMiddleware
    {
        private readonly RequestDelegate _next;
        private readonly Tracer _tracer;
    
        public DistributedTracingMiddleware(RequestDelegate next, TracerProvider tracerProvider)
        {
            _next = next;
            _tracer = tracerProvider.GetTracer("MyApp");
        }
    
        public async Task InvokeAsync(HttpContext context)
        {
            using var span = _tracer.StartActiveSpan("HTTP Request");
            try
            {
                span.SetAttribute("http.method", context.Request.Method);
                span.SetAttribute("http.url", context.Request.Path);
    
                await _next(context);
    
                span.SetAttribute("http.status_code", context.Response.StatusCode);
                span.SetStatus(Status.Ok);
            }
            catch (Exception ex)
            {
                span.SetStatus(Status.Error);
                span.RecordException(ex);
                throw;
            }
        }
    }
    

  4. Metrik Toplama

    public class MetricsCollector
    {
        private readonly Meter _meter;
        private readonly Counter<double> _requestCounter;
        private readonly Histogram<double> _responseTimeHistogram;
    
        public MetricsCollector(MeterProvider meterProvider)
        {
            _meter = meterProvider.GetMeter("MyApp");
            _requestCounter = _meter.CreateCounter<double>("http_requests_total");
            _responseTimeHistogram = _meter.CreateHistogram<double>("http_response_time_seconds");
        }
    
        public void TrackRequest(string path, double duration)
        {
            _requestCounter.Add(1, new KeyValuePair<string, object>("path", path));
            _responseTimeHistogram.Record(duration, new KeyValuePair<string, object>("path", path));
        }
    }
    

OpenTelemetry Best Practices

  1. İzleme Tasarımı
  2. Anlamlı span isimleri
  3. Doğru attribute kullanımı
  4. Context propagation
  5. Sampling stratejileri

  6. Performans

  7. Span sayısı optimizasyonu
  8. Batch işlemler
  9. Async operasyonlar
  10. Buffer yönetimi

  11. Güvenlik

  12. Hassas veri filtreleme
  13. PII veri yönetimi
  14. Erişim kontrolü
  15. Data retention

  16. Monitoring

  17. Alert kuralları
  18. Dashboard tasarımı
  19. Metric aggregation
  20. Trend analizi

Mülakat Soruları

Temel Sorular

  1. OpenTelemetry nedir ve ne için kullanılır?
  2. Cevap: OpenTelemetry, modern uygulamalar için açık kaynaklı bir gözlemlenebilirlik çerçevesidir. Telemetri verilerinin toplanması, işlenmesi ve aktarılması için standart bir API ve SDK sağlar.

  3. OpenTelemetry'nin temel özellikleri nelerdir?

  4. Cevap:

    • Dağıtık izleme
    • Metrik toplama
    • Log yönetimi
    • Context propagation
    • Sampling
  5. OpenTelemetry'nin avantajları nelerdir?

  6. Cevap:

    • Standartlaştırma
    • Esneklik
    • Topluluk desteği
    • Dil bağımsızlık
    • Zengin enstrümantasyon
  7. Span ve Trace nedir?

  8. Cevap: Span, bir işlemin başlangıcı ve bitişi arasındaki süreyi temsil eder. Trace ise bir isteğin tüm yaşam döngüsünü kapsayan span'lerin toplamıdır.

  9. Context Propagation nedir?

  10. Cevap: Context Propagation, dağıtık sistemlerde trace bilgisinin servisler arasında taşınması sürecidir. Genellikle HTTP header'ları veya mesaj kuyrukları üzerinden yapılır.

Teknik Sorular

  1. OpenTelemetry nasıl yapılandırılır?
  2. Cevap:

    public class Startup
    {
        public void ConfigureServices(IServiceCollection services)
        {
            services.AddOpenTelemetry()
                .WithTracing(builder => builder
                    .AddAspNetCoreInstrumentation()
                    .AddHttpClientInstrumentation()
                    .AddConsoleExporter())
                .WithMetrics(builder => builder
                    .AddAspNetCoreInstrumentation()
                    .AddConsoleExporter());
        }
    }
    

  3. Özel telemetri nasıl gönderilir?

  4. Cevap:

    public class TelemetryService
    {
        private readonly Tracer _tracer;
        private readonly Meter _meter;
    
        public TelemetryService(TracerProvider tracerProvider, MeterProvider meterProvider)
        {
            _tracer = tracerProvider.GetTracer("MyApp");
            _meter = meterProvider.GetMeter("MyApp");
        }
    
        public async Task TrackOperationAsync(string operationName, Func<Task> operation)
        {
            using var span = _tracer.StartActiveSpan(operationName);
            try
            {
                await operation();
                span.SetStatus(Status.Ok);
            }
            catch (Exception ex)
            {
                span.SetStatus(Status.Error);
                span.RecordException(ex);
                throw;
            }
        }
    }
    

  5. Dağıtık izleme nasıl yapılır?

  6. Cevap:

    public class DistributedTracingMiddleware
    {
        private readonly RequestDelegate _next;
        private readonly Tracer _tracer;
    
        public DistributedTracingMiddleware(RequestDelegate next, TracerProvider tracerProvider)
        {
            _next = next;
            _tracer = tracerProvider.GetTracer("MyApp");
        }
    
        public async Task InvokeAsync(HttpContext context)
        {
            using var span = _tracer.StartActiveSpan("HTTP Request");
            try
            {
                span.SetAttribute("http.method", context.Request.Method);
                span.SetAttribute("http.url", context.Request.Path);
    
                await _next(context);
    
                span.SetAttribute("http.status_code", context.Response.StatusCode);
                span.SetStatus(Status.Ok);
            }
            catch (Exception ex)
            {
                span.SetStatus(Status.Error);
                span.RecordException(ex);
                throw;
            }
        }
    }
    

  7. Metrik toplama nasıl yapılır?

  8. Cevap:

    public class MetricsCollector
    {
        private readonly Meter _meter;
        private readonly Counter<double> _requestCounter;
        private readonly Histogram<double> _responseTimeHistogram;
    
        public MetricsCollector(MeterProvider meterProvider)
        {
            _meter = meterProvider.GetMeter("MyApp");
            _requestCounter = _meter.CreateCounter<double>("http_requests_total");
            _responseTimeHistogram = _meter.CreateHistogram<double>("http_response_time_seconds");
        }
    
        public void TrackRequest(string path, double duration)
        {
            _requestCounter.Add(1, new KeyValuePair<string, object>("path", path));
            _responseTimeHistogram.Record(duration, new KeyValuePair<string, object>("path", path));
        }
    }
    

  9. Sampling nasıl yapılandırılır?

  10. Cevap:
    public void ConfigureServices(IServiceCollection services)
    {
        services.AddOpenTelemetry()
            .WithTracing(builder => builder
                .SetSampler(new ParentBasedSampler(new TraceIdRatioBasedSampler(0.1)))
                .AddAspNetCoreInstrumentation()
                .AddConsoleExporter());
    }
    

İleri Seviye Sorular

  1. OpenTelemetry performans optimizasyonu nasıl yapılır?
  2. Cevap:

    • Sampling stratejileri
    • Span sayısı optimizasyonu
    • Batch işlemler
    • Async operasyonlar
    • Buffer yönetimi
  3. OpenTelemetry güvenliği nasıl sağlanır?

  4. Cevap:

    • Hassas veri filtreleme
    • PII veri yönetimi
    • Erişim kontrolü
    • Data retention
    • Audit logging
  5. OpenTelemetry monitoring ve alerting nasıl yapılır?

  6. Cevap:

    • Alert kuralları
    • Dashboard tasarımı
    • Metric aggregation
    • Trend analizi
    • Notification kanalları
  7. OpenTelemetry ile log aggregation nasıl yapılır?

  8. Cevap:

    • Log entegrasyonu
    • Log analizi
    • Log enrichment
    • Log rotasyonu
    • Log arşivleme
  9. OpenTelemetry ile distributed tracing nasıl yapılır?

  10. Cevap:
    • Context propagation
    • Span ve trace yönetimi
    • Correlation
    • End-to-end tracing
    • Performance analysis