Skip to main content

Metrics

IMetricsCollector records per-request metrics: duration, success/failure counts, and error types.

Built-in Implementations

ImplementationDescription
NoOpMetricsCollectorDoes nothing — default if no collector registered
ConsoleMetricsCollectorPrints metrics to stdout — useful for development

Using ConsoleMetricsCollector

builder.Services.AddObservability(config =>
{
config.UseMetricsCollector<ConsoleMetricsCollector>();
});

Custom IMetricsCollector

Implement IMetricsCollector to integrate with Prometheus, Application Insights, or any other metrics system:

public class PrometheusMetricsCollector : IMetricsCollector
{
private static readonly Counter RequestsTotal = Metrics.CreateCounter(
"mediator_requests_total",
"Total mediator requests",
new CounterConfiguration { LabelNames = new[] { "handler", "success" } });

private static readonly Histogram RequestDuration = Metrics.CreateHistogram(
"mediator_request_duration_seconds",
"Mediator request duration",
new HistogramConfiguration { LabelNames = new[] { "handler" } });

public void RecordRequestStarted(string requestName)
{
// Optionally track in-flight requests
}

public void RecordRequestCompleted(string requestName, TimeSpan duration, bool success, string? errorType)
{
RequestsTotal.WithLabels(requestName, success.ToString()).Inc();
RequestDuration.WithLabels(requestName).Observe(duration.TotalSeconds);
}

public void RecordRequestFailed(string requestName, TimeSpan duration, Exception exception)
{
RequestsTotal.WithLabels(requestName, "false").Inc();
RequestDuration.WithLabels(requestName).Observe(duration.TotalSeconds);
}
}

Registration

// Register custom collector
builder.Services.AddSingleton<IMetricsCollector, PrometheusMetricsCollector>();

// Or via AddObservability config
builder.Services.AddObservability(config =>
{
config.UseMetricsCollector<PrometheusMetricsCollector>();
});

Application Insights Example

public class AppInsightsMetricsCollector : IMetricsCollector
{
private readonly TelemetryClient _client;

public AppInsightsMetricsCollector(TelemetryClient client)
{
_client = client;
}

public void RecordRequestStarted(string requestName) { }

public void RecordRequestCompleted(string requestName, TimeSpan duration, bool success, string? errorType)
{
_client.TrackDependency(
dependencyTypeName: "Mediator",
dependencyName: requestName,
data: requestName,
startTime: DateTimeOffset.UtcNow - duration,
duration: duration,
success: success);
}

public void RecordRequestFailed(string requestName, TimeSpan duration, Exception exception)
{
_client.TrackException(exception, new Dictionary<string, string>
{
{ "handler", requestName }
});
}
}