prometheus-net-contrib

March 23, 2021 ยท View on GitHub

Build status Nuget

A plugin for the prometheus-net package, exposing event counters and diagnostic listeners for .NET Core Runtime, ASP.NET Core, SignalR, GRPC, etc.

Installation

Supports .NET core v3.0+ only.

Add the package from nuget:

dotnet add package prometheus-net.Contrib

And then start the collectors:

public class Startup
{
    public void ConfigureServices(IServiceCollection services)
    {
        ...
        services.AddPrometheusCounters();
        services.AddPrometheusAspNetCoreMetrics();
        services.AddPrometheusHttpClientMetrics();
        services.AddPrometheusSqlClientMetrics();
    }
}

.NET Core 3.0 Event Counters

Runtime

NameTypeDescription
runtime_cpu_usage_ratioGaugeCPU usage in percents
runtime_memory_working_set_megabytesGaugeWorking Set in megabytes
runtime_gc_heap_size_megabytesGaugeGC Heap Size in megabytes
runtime_gc_countGaugeGC Count
runtime_exceptions_totalGaugeException Count
runtime_threadpool_threads_totalGaugeThreadPool Thread Count
runtime_lock_contention_totalGaugeMonitor Lock Contention Count
runtime_threadpool_queue_lengthGaugeThreadPool Queue Length
runtime_threadpool_completed_items_totalGaugeThreadPool Completed Work Item Count
runtime_time_in_gc_ratioGauge% Time in GC since last GC
runtime_gc_size_bytesGaugeGC size in bytes
runtime_allocation_rate_bytesGaugeAllocation Rate in bytes
runtime_assemblies_totalGaugeNumber of Assemblies Loaded
runtime_active_timers_totalGaugeNumber of Active Timers

ASP .NET Core

NameTypeDescription
aspnetcore_requests_per_secondGaugeRequest Rate
aspnetcore_requests_totalGaugeTotal Requests
aspnetcore_requests_current_totalGaugeCurrent Requests
aspnetcore_requests_failed_totalGaugeFailed Requests

ASP .NET Core SignalR

NameTypeDescription
signalr_connections_started_totalGaugeTotal Connections Started
signalr_connections_stopped_totalGaugeTotal Connections Stopped
signalr_connections_timed_out_totalGaugeTotal Connections Timed Out
signalr_connections_current_totalGaugeCurrent Connections
signalr_connections_duration_secondsGaugeAverage Connection Duration

ASP .NET Core GRPC Server

NameTypeDescription
grpc_server_calls_totalGaugeTotal Calls
grpc_server_calls_current_totalGaugeCurrent Calls
grpc_server_calls_failed_totalGaugeTotal Calls Failed
grpc_server_deadline_exceeded_totalGaugeTotal Calls Deadline Exceeded
grpc_server_messages_sent_totalGaugeTotal Messages Sent
grpc_server_messages_received_totalGaugeTotal Messages Received
grpc_server_calls_unimplemented_totalGaugeTotal Calls Unimplemented

ASP .NET Core GRPC Client

NameTypeDescription
grpc_client_calls_totalGaugeTotal Calls
grpc_client_calls_current_totalGaugeCurrent Calls
grpc_client_calls_failed_totalGaugeTotal Calls Failed
grpc_client_calls_deadline_exceeded_totalGaugeTotal Calls Deadline Exceeded
grpc_client_messages_sent_totalGaugeTotal Messages Sent
grpc_client_messages_received_totalGaugeTotal Messages Received

.NET Core Diagnostic Listeners

ASP .NET Core

NameTypeDescription
aspnetcore_requests_duration_secondsHistogramThe duration of HTTP requests processed by an ASP.NET Core application
aspnetcore_requests_errors_totalCounterTotal HTTP requests received errors

HTTP Client

NameTypeDescription
http_client_requests_duration_secondsHistogramTime between first byte of request headers sent to last byte of response received
http_client_requests_errors_totalCounterTotal HTTP requests sent errors

SQL Client

NameTypeDescription
sqlclient_commands_duration_secondsHistogramThe duration of DB requests processed by an application
sqlclient_commands_errors_totalCounterTotal DB command errors
sqlclient_connections_opened_totalCounterTotal opened DB connections
sqlclient_connections_closed_totalCounterTotal closed DB connections
sqlclient_connections_errors_totalCounterTotal DB connections errors
sqlclient_transactions_committed_totalCounterTotal committed transactions
sqlclient_transactions_rollback_totalCounterTotal rollback transactions
sqlclient_transactions_errors_totalCounterTotal DB transaction errors

SQL Client (Microsoft.Data.SqlClient 3.x)

NameTypeDescription
sqlclient_active_hard_connections_totalGaugeActual active connections are made to servers
sqlclient_hard_connects_per_secondGaugeActual connections are made to servers
sqlclient_hard_disconnects_per_secondGaugeActual disconnections are made to servers
sqlclient_active_soft_connections_totalGaugeActive connections got from connection pool
sqlclient_soft_connects_per_secondGaugeConnections got from connection pool
sqlclient_soft_disconnects_per_secondGaugeConnections returned to the connection pool
sqlclient_non_pooled_connections_totalGaugeNumber of connections are not using connection pooling
sqlclient_pooled_connections_totalGaugeNumber of connections are managed by connection pooler
sqlclient_active_connection_pool_groups_totalGaugeNumber of active unique connection strings
sqlclient_inactive_connection_pool_groups_totalGaugeNumber of unique connection strings waiting for pruning
sqlclient_active_connection_pools_totalGaugeNumber of active connection pools
sqlclient_inactive_connection_pools_totalGaugeActual connections are made to servers
sqlclient_active_connections_totalGaugeNumber of active connections
sqlclient_free_connections_totalGaugeNumber of free-ready connections
sqlclient_stasis_connections_totalGaugeNumber of connections currently waiting to be ready
sqlclient_reclaimed_connections_totalGaugeNumber of reclaimed connections from GC

GRPC Client

NameTypeDescription
grpc_client_requests_duration_secondsHistogramTime between first byte of request headers sent to last byte of response received
grpc_client_requests_errors_totalCounterTotal GRPC requests sent errors

Identity Server

dotnet add package prometheus-net.IdentityServer

And then start the collectors:

public class Startup
{
    public void ConfigureServices(IServiceCollection services)
    {
        services.AddIdentityServer(options =>
        {
            options.Events.RaiseErrorEvents = true;
            options.Events.RaiseFailureEvents = true;
            options.Events.RaiseInformationEvents = true;
            options.Events.RaiseSuccessEvents = true;
        });

        services.AddPrometheusIdentityServerMetrics();
    }
}
NameTypeDescription
idsrv_api_authentication_failure_totalCounterGets raised for successful API authentication at the introspection endpoint
idsrv_api_authentication_failure_totalCounterGets raised for failed API authentication at the introspection endpoint
idsrv_client_authentication_success_totalCounterGets raised for successful client authentication at the token endpoint
idsrv_client_authentication_failure_totalCounterGets raised for failed client authentication at the token endpoint
idsrv_token_issued_success_totalCounterGets raised for successful attempts to request access tokens
idsrv_token_issued_failure_totalCounterGets raised for failed attempts to request access tokens
idsrv_token_introspection_success_totalCounterGets raised for successful attempts to request identity tokens, access tokens, refresh tokens and authorization codes
idsrv_token_introspection_failure_totalCounterGets raised for failed attempts to request identity tokens, access tokens, refresh tokens and authorization codes
idsrv_token_revoked_success_totalCounterGets raised for successful token revocation requests.
idsrv_user_login_success_totalCounterGets raised by the UI for successful user logins
idsrv_user_login_failure_totalCounterGets raised by the UI for failed user logins
idsrv_user_logout_success_totalCounterGets raised for successful logout requests
idsrv_consent_granted_totalCounterGets raised in the consent UI
idsrv_consent_denied_totalCounterGets raised in the consent UI
idsrv_unhandled_exceptions_totalCounterGets raised for unhandled exceptions
idsrv_device_authorization_success_totalCounterGets raised for successful device authorization requests
idsrv_device_authorization_success_totalCounterGets raised for failed device authorization requests

Prometheus healthchecks

It is possible to publish all healthchecks results to a prometheus

public virtual void ConfigureServices(IServiceCollection services)
{
    services.AddHealthChecks()
        .AddSqlServer("<Connection String>", name: "sqlserver")

    services.AddSingleton<IHealthCheckPublisher, PrometheusHealthcheckPublisher>();

    return services;
}