From 3350d874da3ba860e387bba8921a88eabe5d1f93 Mon Sep 17 00:00:00 2001 From: Eric Erhardt Date: Thu, 2 Nov 2023 09:31:07 -0500 Subject: [PATCH] Fix Npgsql Metrics (#658) * Restore disabled counter This was missed in #648 Addresses #645 * Add view to Npgsql's histograms because they are in seconds and not ms. Fix #641 --- ...gsql.EntityFrameworkCore.PostgreSQL.csproj | 4 +++ .../AspireEFPostgreSqlExtensions.cs | 3 +-- .../AspirePostgreSqlNpgsqlExtensions.cs | 10 +------ src/Components/Aspire.Npgsql/NpgsqlCommon.cs | 27 +++++++++++++++++++ 4 files changed, 33 insertions(+), 11 deletions(-) create mode 100644 src/Components/Aspire.Npgsql/NpgsqlCommon.cs diff --git a/src/Components/Aspire.Npgsql.EntityFrameworkCore.PostgreSQL/Aspire.Npgsql.EntityFrameworkCore.PostgreSQL.csproj b/src/Components/Aspire.Npgsql.EntityFrameworkCore.PostgreSQL/Aspire.Npgsql.EntityFrameworkCore.PostgreSQL.csproj index 9ad44ab009..47f0494300 100644 --- a/src/Components/Aspire.Npgsql.EntityFrameworkCore.PostgreSQL/Aspire.Npgsql.EntityFrameworkCore.PostgreSQL.csproj +++ b/src/Components/Aspire.Npgsql.EntityFrameworkCore.PostgreSQL/Aspire.Npgsql.EntityFrameworkCore.PostgreSQL.csproj @@ -8,6 +8,10 @@ $(SharedDir)PostgreSQL_logo.3colors.540x557.png + + + + diff --git a/src/Components/Aspire.Npgsql.EntityFrameworkCore.PostgreSQL/AspireEFPostgreSqlExtensions.cs b/src/Components/Aspire.Npgsql.EntityFrameworkCore.PostgreSQL/AspireEFPostgreSqlExtensions.cs index 6bb9e9c108..f68d6096fe 100644 --- a/src/Components/Aspire.Npgsql.EntityFrameworkCore.PostgreSQL/AspireEFPostgreSqlExtensions.cs +++ b/src/Components/Aspire.Npgsql.EntityFrameworkCore.PostgreSQL/AspireEFPostgreSqlExtensions.cs @@ -122,8 +122,7 @@ public static partial class AspireEFPostgreSqlExtensions eventCountersInstrumentationOptions.AddEventSources("Microsoft.EntityFrameworkCore"); }); - // https://github.com/npgsql/npgsql/blob/4c9921de2dfb48fb5a488787fc7422add3553f50/src/Npgsql/MetricsReporter.cs#L48 - meterProviderBuilder.AddMeter("Npgsql"); + NpgsqlCommon.AddNpgsqlMetrics(meterProviderBuilder); }); } diff --git a/src/Components/Aspire.Npgsql/AspirePostgreSqlNpgsqlExtensions.cs b/src/Components/Aspire.Npgsql/AspirePostgreSqlNpgsqlExtensions.cs index 5b11e3c7b9..666cb5e84f 100644 --- a/src/Components/Aspire.Npgsql/AspirePostgreSqlNpgsqlExtensions.cs +++ b/src/Components/Aspire.Npgsql/AspirePostgreSqlNpgsqlExtensions.cs @@ -9,7 +9,6 @@ using Microsoft.Extensions.Diagnostics.HealthChecks; using Microsoft.Extensions.Logging; using Npgsql; -using OpenTelemetry.Metrics; namespace Microsoft.Extensions.Hosting; @@ -98,14 +97,7 @@ private static void AddNpgsqlDataSource(IHostApplicationBuilder builder, string if (settings.Metrics) { builder.Services.AddOpenTelemetry() - .WithMetrics(meterProviderBuilder => - { - // https://github.com/npgsql/npgsql/blob/4c9921de2dfb48fb5a488787fc7422add3553f50/src/Npgsql/MetricsReporter.cs#L48 - meterProviderBuilder.AddMeter("Npgsql"); - - // disable "prepared_ratio" until https://github.com/dotnet/aspire/issues/629 is fixed. - meterProviderBuilder.AddView(instrumentName: "db.client.commands.prepared_ratio", MetricStreamConfiguration.Drop); - }); + .WithMetrics(NpgsqlCommon.AddNpgsqlMetrics); } } diff --git a/src/Components/Aspire.Npgsql/NpgsqlCommon.cs b/src/Components/Aspire.Npgsql/NpgsqlCommon.cs new file mode 100644 index 0000000000..fe877ee313 --- /dev/null +++ b/src/Components/Aspire.Npgsql/NpgsqlCommon.cs @@ -0,0 +1,27 @@ +// Licensed to the .NET Foundation under one or more agreements. +// The .NET Foundation licenses this file to you under the MIT license. + +using OpenTelemetry.Metrics; + +internal static class NpgsqlCommon +{ + public static void AddNpgsqlMetrics(MeterProviderBuilder meterProviderBuilder) + { + double[] secondsBuckets = [0, 0.005, 0.01, 0.025, 0.05, 0.075, 0.1, 0.25, 0.5, 0.75, 1, 2.5, 5, 7.5, 10]; + + // https://github.com/npgsql/npgsql/blob/4c9921de2dfb48fb5a488787fc7422add3553f50/src/Npgsql/MetricsReporter.cs#L48 + meterProviderBuilder + .AddMeter("Npgsql") + // Npgsql's histograms are in seconds, not milliseconds. + .AddView("db.client.commands.duration", + new ExplicitBucketHistogramConfiguration + { + Boundaries = secondsBuckets + }) + .AddView("db.client.connections.create_time", + new ExplicitBucketHistogramConfiguration + { + Boundaries = secondsBuckets + }); + } +}