dotnet-cqrs/Svrnty.CQRS.Events/Metrics/OpenTelemetryMetricsExample.cs

105 lines
3.2 KiB
C#

/*
using Svrnty.CQRS.Events.Subscriptions;
using Svrnty.CQRS.Events.Abstractions.Models;
* EXAMPLE: OpenTelemetry Integration with Prometheus Exporter
*
* This file demonstrates how to integrate Svrnty.CQRS.Events metrics
* with OpenTelemetry and expose them via Prometheus endpoint.
*
* INSTALLATION:
*
* dotnet add package OpenTelemetry.Extensions.Hosting
* dotnet add package OpenTelemetry.Instrumentation.AspNetCore
* dotnet add package OpenTelemetry.Exporter.Prometheus.AspNetCore --prerelease
*
* USAGE in Program.cs:
*/
#if FALSE // This is example code, not compiled
using OpenTelemetry.Metrics;
var builder = WebApplication.CreateBuilder(args);
// Register event streaming with metrics
builder.Services.AddSvrntyEvents();
builder.Services.AddEventStreamMetrics(); // Phase 6: Add metrics collection
// Configure OpenTelemetry with Prometheus exporter
builder.Services.AddOpenTelemetry()
.WithMetrics(metrics => metrics
// Add ASP.NET Core instrumentation
.AddAspNetCoreInstrumentation()
// Add Svrnty.CQRS.Events metrics
.AddMeter("Svrnty.CQRS.Events")
// Export to Prometheus (scraping endpoint)
.AddPrometheusExporter());
var app = builder.Build();
// Map Prometheus scraping endpoint at /metrics
app.MapPrometheusScrapingEndpoint();
// ... rest of your configuration
app.Run();
/*
* PROMETHEUS CONFIGURATION (prometheus.yml):
*
* scrape_configs:
* - job_name: 'svrnty-cqrs-events'
* scrape_interval: 5s
* static_configs:
* - targets: ['localhost:6001']
*
* AVAILABLE METRICS:
*
* Counters (cumulative):
* - svrnty_cqrs_events_published_total{stream="UserWorkflow",event_type="UserAddedEvent"}
* - svrnty_cqrs_events_consumed_total{stream="UserWorkflow",subscription="user-analytics",event_type="UserAddedEvent"}
* - svrnty_cqrs_events_errors_total{stream="UserWorkflow",subscription="...",error_type="ValidationError"}
* - svrnty_cqrs_events_retries_total{stream="UserWorkflow",subscription="...",attempt="1"}
*
* Histograms (distributions):
* - svrnty_cqrs_events_processing_latency_milliseconds{stream="UserWorkflow",subscription="..."}
* - _bucket{le="10"}
* - _bucket{le="50"}
* - _bucket{le="100"}
* - _bucket{le="500"}
* - _bucket{le="1000"}
* - _bucket{le="+Inf"}
* - _sum
* - _count
*
* Gauges (current values):
* - svrnty_cqrs_events_consumer_lag{stream="UserWorkflow",subscription="user-analytics"}
* - svrnty_cqrs_events_stream_length{stream="UserWorkflow"}
* - svrnty_cqrs_events_active_consumers{stream="UserWorkflow",subscription="user-analytics"}
*
* GRAFANA DASHBOARD EXAMPLE QUERIES:
*
* Event Publish Rate (events/sec):
* rate(svrnty_cqrs_events_published_total[5m])
*
* Event Consumption Rate by Subscription:
* rate(svrnty_cqrs_events_consumed_total{subscription="user-analytics"}[5m])
*
* Consumer Lag (current):
* svrnty_cqrs_events_consumer_lag
*
* P95 Processing Latency:
* histogram_quantile(0.95,
* rate(svrnty_cqrs_events_processing_latency_milliseconds_bucket[5m]))
*
* Error Rate:
* rate(svrnty_cqrs_events_errors_total[5m])
*
* Active Consumers:
* svrnty_cqrs_events_active_consumers
*/
#endif