105 lines
3.2 KiB
C#
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
|