๐Ÿ“ˆ Telemetry & Observability

OpenTelemetry integration for comprehensive monitoring, distributed tracing, and correlation tracking

Request with Telemetry

Execute a request with automatic telemetry tracking including duration, correlation IDs, and context

Correlation Tracking

Demonstrate correlation ID tracking across multiple requests and services

๐Ÿ” Observability Features
๐Ÿ“Š Built-in Metrics
  • Request Duration: Automatic timing for every request
  • Correlation IDs: Unique ID per request for tracing
  • Status Tracking: HTTP status codes and success/failure
  • Error Details: Comprehensive error information
๐Ÿ”— OpenTelemetry Integration
  • Distributed Tracing: Track requests across services
  • Multiple Exporters: Console, Jaeger, OTLP support
  • Activity Context: Automatic context propagation
  • Metrics Export: Standard OpenTelemetry metrics
๐Ÿ“ Configuration & Usage
Configure OpenTelemetry in Program.cs
using OpenTelemetry.Resources;
using OpenTelemetry.Trace;
using WebSpark.HttpClientUtility.RequestResult;

// Add OpenTelemetry with tracing
builder.Services.AddOpenTelemetry()
  .WithTracing(tracerBuilder =>
  {
        tracerBuilder
    .SetResourceBuilder(ResourceBuilder.CreateDefault()
    .AddService("WebSpark.HttpClientUtility.Demo", "1.0.0"))
     .AddSource("WebSpark.HttpClientUtility")
    .AddHttpClientInstrumentation()
            .AddAspNetCoreInstrumentation()
            .AddConsoleExporter();  // For dev/debugging
            // .AddJaegerExporter();   // For Jaeger
  // .AddOtlpExporter(); // For OTLP-compatible backends
 });

// Register the telemetry decorator
builder.Services.AddScoped<IHttpRequestResultService>(provider =>
{
    IHttpRequestResultService service = 
        provider.GetRequiredService<HttpRequestResultService>();
    
    // Wrap with telemetry decorator (outermost layer)
    service = new HttpRequestResultServiceTelemetry(
        provider.GetRequiredService<ILogger<HttpRequestResultServiceTelemetry>>(),
        service
    );
    
    return service;
});
Using Telemetry in Your Service
public class MyApiService
{
    private readonly IHttpRequestResultService _requestService;
    private readonly ILogger<MyApiService> _logger;
    
    public async Task<MyData?> GetDataWithTelemetryAsync(string id)
    {
      // Create request with debug enabled for detailed logging
var request = new HttpRequestResult<MyData>
        {
      RequestPath = $"https://api.example.com/data/{id}",
   RequestMethod = HttpMethod.Get,
  IsDebugEnabled = true  // Enable detailed telemetry
      };
   
        // Execute - telemetry is automatic
    var result = await _requestService.HttpSendRequestResultAsync(request);
        
// Access telemetry data
        _logger.LogInformation(
            "Request completed: CorrelationId={CorrelationId}, " +
        "Duration={Duration}ms, Status={Status}",
 result.CorrelationId,
            result.RequestDurationMilliseconds,
 result.StatusCode);
        
     // Additional context is available in RequestContext dictionary
      if (result.RequestContext.TryGetValue("ActivityId", out var activityId))
        {
     _logger.LogDebug("Activity ID: {ActivityId}", activityId);
     }
        
    return result.ResponseResults;
    }
}
Querying Telemetry Data
// Example: Search logs by correlation ID
// All logs for a request share the same correlation ID
// In your logging platform (e.g., Application Insights, Elasticsearch):

{
  "timestamp": "2025-01-08T10:30:45.123Z",
  "level": "Information",
  "message": "HTTP Request: GET https://v2.jokeapi.dev/joke/Programming",
  "correlationId": "a1b2c3d4-e5f6-7890-abcd-ef1234567890",
  "requestDuration": 245,
  "statusCode": 200
}

// Track the entire request flow using the correlation ID:
// 1. Request initiated
// 2. External API call
// 3. Response received
// 4. Data processed
// 5. Response returned

// All these steps will have the same correlation ID
๐Ÿ“‹ Telemetry Data Captured
Metric Description Use Case
CorrelationId Unique identifier for each request Trace requests across services and logs
RequestDurationMilliseconds Total time taken for the request Performance monitoring and SLA tracking
RequestStartTimestamp When the request started Time-based analysis and ordering
StatusCode HTTP status code returned Success rate monitoring
ErrorList Collection of errors encountered Error analysis and debugging
RequestContext Dictionary of additional context data Custom metrics and context propagation
Retries Number of retry attempts (with Polly) Reliability metrics
Key Benefits
  • Automatic Tracking: No manual instrumentation required - telemetry is built-in
  • Correlation IDs: Trace requests across distributed systems effortlessly
  • Performance Insights: Identify slow requests and optimize bottlenecks
  • Error Tracking: Comprehensive error information with context
  • OpenTelemetry Standard: Industry-standard observability framework
  • Multiple Exporters: Send telemetry to your preferred backend
  • Production Ready: Minimal overhead with maximum visibility
๐Ÿ”— Integration Options
Console Exporter

Great for development and debugging

.AddConsoleExporter()
Jaeger

Popular open-source distributed tracing

.AddJaegerExporter()
OTLP

OpenTelemetry Protocol for any backend

.AddOtlpExporter()

Application Insights

Azure's application monitoring service

.AddApplicationInsights()
Zipkin

Distributed tracing system

.AddZipkinExporter()
Custom

Build your own exporter

.AddProcessor(custom)