๐ 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)