Uwaga
Dostęp do tej strony wymaga autoryzacji. Może spróbować zalogować się lub zmienić katalogi.
Dostęp do tej strony wymaga autoryzacji. Możesz spróbować zmienić katalogi.
Obejmuje: integrację hostingu —
Client
PostgreSQL to zaawansowany, relacyjny system baz danych typu open source z wieloma latami aktywnego programowania, który zdobył silną reputację niezawodności, niezawodności funkcji i wydajności. Integracja .NET AspirePostgreSQLEntity Framework Core umożliwia łączenie się z istniejącymi bazami danych PostgreSQL lub tworzenie nowych instancji z .NET za pomocą obrazu kontenera docker.io/library/postgres
.
Integracja hostingu
PostgreSQL modele integracji hostingu różne zasoby PostgreSQL klasyfikują jako następujące typy.
Aby uzyskać dostęp do tych typów i interfejsów API, aby wyrazić je jako zasoby w projekcie hosta aplikacji
dotnet add package Aspire.Hosting.PostgreSQL
Aby uzyskać więcej informacji, zobacz dotnet add package lub Zarządzanie zależnościami pakietów w aplikacjach .NET.
Dodawanie zasobu serwera PostgreSQL
W projekcie hosta aplikacji wywołaj AddPostgres w wystąpieniu builder
, aby dodać zasób serwera PostgreSQL, a następnie wywołaj AddDatabase w wystąpieniu postgres
, aby dodać zasób bazy danych, jak pokazano w poniższym przykładzie:
var builder = DistributedApplication.CreateBuilder(args);
var postgres = builder.AddPostgres("postgres");
var postgresdb = postgres.AddDatabase("postgresdb");
var exampleProject = builder.AddProject<Projects.ExampleProject>()
.WithReference(postgresdb);
// After adding all resources, run the app...
Gdy .NET.NET Aspire dodaje obraz kontenera do hosta aplikacji, jak pokazano w poprzednim przykładzie z obrazem docker.io/library/postgres
, tworzy nowe wystąpienie serwera PostgreSQL na komputerze lokalnym. Odwołanie do PostgreSQL serwera i instancji bazy danych (zmiennej postgresdb
) służy do dodawania zależności do ExampleProject
.
Podczas dodawania zasobu bazy danych do modelu aplikacji baza danych jest tworzona, jeśli jeszcze nie istnieje. Tworzenie bazy danych opiera się na interfejsach API do obsługi zdarzeń hosta aplikacji, w szczególności ResourceReadyEvent. Innymi słowy, gdy zasób postgres
jest gotowy, zostaje wywołane zdarzenie i tworzony jest zasób bazy danych.
Zasób serwera PostgreSQL zawiera domyślne poświadczenia oparte na username
"postgres"
oraz losowo generowane password
przy użyciu metody CreateDefaultPasswordParameter.
Metoda WithReference konfiguruje połączenie w ExampleProject
o nazwie "messaging"
. Aby uzyskać więcej informacji, zobacz Cykl życia zasobów kontenera.
Wskazówka
Jeśli wolisz nawiązać połączenie z istniejącym serwerem PostgreSQL, wywołaj AddConnectionString zamiast tego. Aby uzyskać więcej informacji, zobacz Odwołaj się do istniejących zasobów.
Dodawanie PostgreSQL zasobu za pomocą skryptów bazy danych
Domyślnie podczas dodawania PostgresDatabaseResource, program bazuje na następującym skrypcie w celu utworzenia bazy danych.
CREATE DATABASE "<QUOTED_DATABASE_NAME>"
Aby zmienić skrypt domyślny, dodaj wywołanie metody WithCreationScript
do konstruktora zasobów bazy danych:
var builder = DistributedApplication.CreateBuilder(args);
var postgres = builder.AddPostgres("postgres");
var databaseName = "app_db";
var creationScript = $$"""
-- Create the database
CREATE DATABASE {{databaseName}};
""";
var db = postgres.AddDatabase(databaseName)
.WithCreationScript(creationScript);
builder.AddProject<Projects.ExampleProject>()
.WithReference(db)
.WaitFor(db);
// After adding all resources, run the app...
Powyższy przykład tworzy bazę danych o nazwie app_db
. Skrypt jest uruchamiany po utworzeniu zasobu bazy danych. Skrypt jest przekazywany jako ciąg do WithCreationScript
metody, która jest następnie uruchamiana w kontekście PostgreSQL zasobu.
Uwaga
Nawiązywanie połączenia z poleceniem bazy danych (\c
) nie jest obsługiwane podczas korzystania ze skryptu tworzenia.
Dodawanie zasobu PostgreSQL pgAdmin
Podczas dodawania zasobów PostgreSQL do builder
metodą AddPostgres
, można połączyć wywołania do WithPgAdmin w celu dodania kontenera dpage/pgadmin4. Ten kontener jest międzyplatformowym klientem PostgreSQL baz danych, który obsługuje internetowy pulpit nawigacyjny administratora. Rozważmy następujący przykład:
var builder = DistributedApplication.CreateBuilder(args);
var postgres = builder.AddPostgres("postgres")
.WithPgAdmin();
var postgresdb = postgres.AddDatabase("postgresdb");
var exampleProject = builder.AddProject<Projects.ExampleProject>()
.WithReference(postgresdb);
// After adding all resources, run the app...
Powyższy kod dodaje kontener w oparciu o obraz docker.io/dpage/pgadmin4
. Kontener służy do zarządzania zasobami serwera PostgreSQL i bazy danych. Metoda WithPgAdmin
dodaje kontener obsługujący internetowy pulpit nawigacyjny administratora dla baz danych PostgreSQL.
Konfigurowanie portu hosta pgAdmin
Aby skonfigurować port hosta dla kontenera pgAdmin, wywołaj metodę WithHostPort w zasobie serwera PostgreSQL. W poniższym przykładzie pokazano, jak skonfigurować port hosta dla kontenera pgAdmin:
var builder = DistributedApplication.CreateBuilder(args);
var postgres = builder.AddPostgres("postgres")
.WithPgAdmin(pgAdmin => pgAdmin.WithHostPort(5050));
var postgresdb = postgres.AddDatabase("postgresdb");
var exampleProject = builder.AddProject<Projects.ExampleProject>()
.WithReference(postgresdb);
// After adding all resources, run the app...
Powyższy kod dodaje i konfiguruje port hosta dla kontenera pgAdmin. Port hosta jest w przeciwnym razie losowo przypisany.
Dodawanie zasobu PostgreSQL pgWeb
Podczas dodawania zasobów PostgreSQL do builder
za pomocą metody AddPostgres
można łączyć wywołania funkcji WithPgWeb, aby dodać kontener sosedoff/pgweb. Ten kontener jest międzyplatformowym klientem PostgreSQL baz danych, który obsługuje internetowy pulpit nawigacyjny administratora. Rozważmy następujący przykład:
var builder = DistributedApplication.CreateBuilder(args);
var postgres = builder.AddPostgres("postgres")
.WithPgWeb();
var postgresdb = postgres.AddDatabase("postgresdb");
var exampleProject = builder.AddProject<Projects.ExampleProject>()
.WithReference(postgresdb);
// After adding all resources, run the app...
Powyższy kod dodaje kontener w oparciu o obraz docker.io/sosedoff/pgweb
. Wszystkie zarejestrowane wystąpienia PostgresDatabaseResource są używane do tworzenia pliku konfiguracji dla każdego wystąpienia, a każda konfiguracja jest powiązana z folderem zakładek w kontenerze pgweb. Aby uzyskać więcej informacji, zobacz dokumentację PgWeb: Server zakładki połączeń.
Konfigurowanie portu hosta pgWeb
Aby skonfigurować port hosta dla kontenera pgWeb, wywołaj metodę WithHostPort w zasobie serwera PostgreSQL. W poniższym przykładzie pokazano, jak skonfigurować port hosta dla kontenera pgAdmin:
var builder = DistributedApplication.CreateBuilder(args);
var postgres = builder.AddPostgres("postgres")
.WithPgWeb(pgWeb => pgWeb.WithHostPort(5050));
var postgresdb = postgres.AddDatabase("postgresdb");
var exampleProject = builder.AddProject<Projects.ExampleProject>()
.WithReference(postgresdb);
// After adding all resources, run the app...
Powyższy kod dodaje i konfiguruje port hosta dla kontenera pgWeb. Port hosta jest w przeciwnym razie losowo przypisany.
Dodaj zasób serwera PostgreSQL z woluminem danych
Aby dodać wolumin danych do zasobu serwera PostgreSQL, wywołaj metodę WithDataVolume w zasobie serwera PostgreSQL:
var builder = DistributedApplication.CreateBuilder(args);
var postgres = builder.AddPostgres("postgres")
.WithDataVolume(isReadOnly: false);
var postgresdb = postgres.AddDatabase("postgresdb");
var exampleProject = builder.AddProject<Projects.ExampleProject>()
.WithReference(postgresdb);
// After adding all resources, run the app...
Wolumin danych jest używany do utrwalania danych serwera PostgreSQL poza cyklem życia kontenera. Wolumin danych jest instalowany w ścieżce /var/lib/postgresql/data
w kontenerze serwera PostgreSQL, a gdy nie podano parametru name
, nazwa jest generowana losowo. Aby uzyskać więcej informacji na temat woluminów danych oraz powodów ich preferowania nad montowaniem wiązań , zobacz dokumentację Docker: Woluminy.
Ważny
Niektóre integracje bazy danych, w tym integracja .NET AspirePostgreSQL, nie mogą pomyślnie używać woluminów danych po wdrożeniu do Azure Container Apps (ACA). Dzieje się tak, ponieważ usługa ACA używa Server bloku komunikatów (SMB) do łączenia kontenerów z woluminami danych, a niektóre systemy nie mogą używać tego połączenia. Na pulpicie Aspire nawigacyjnym baza danych, której dotyczy ten problem, ma stan Aktywowanie lub Aktywacja nie powiodła się, ale nigdy nie jest wyświetlana jako Uruchomiona.
Problem można rozwiązać, korzystając z zarządzanej usługi Azure Baza danych dla PostgreSQL do hostowania wdrożonej bazy danych zamiast kontenera w usłudze ACA, co jest zalecanym podejściem niezależnie od tego problemu. Poniższy kod hosta aplikacji pokazuje, jak wdrożyć bazę danych w Azure usłudze Database for PostgreSQL, ale uruchomić ją jako kontener z wolumenem danych podczas tworzenia.
var builder = DistributedApplication.CreateBuilder(args);
var postgres = builder.AddAzurePostgresFlexibleServer("postgres")
.RunAsContainer(container =>
{
container.WithDataVolume();
});
builder.Build().Run();
Dodaj zasób serwera PostgreSQL z montowaniem danych za pomocą powiązania bind mount
Aby dodać powiązanie danych do zasobu serwera PostgreSQL, wywołaj metodę WithDataBindMount:
var builder = DistributedApplication.CreateBuilder(args);
var postgres = builder.AddPostgres("postgres")
.WithDataBindMount(
source: @"C:\PostgreSQL\Data",
isReadOnly: false);
var postgresdb = postgres.AddDatabase("postgresdb");
var exampleProject = builder.AddProject<Projects.ExampleProject>()
.WithReference(postgresdb);
// After adding all resources, run the app...
Ważny
Montowania danych z powiązaniem mają ograniczoną funkcjonalność w porównaniu do woluminów, które oferują lepszą wydajność, przenośność i bezpieczeństwo, co czyni je bardziej odpowiednimi dla środowisk produkcyjnych. Jednak montowanie wiązane umożliwia bezpośredni dostęp i modyfikację plików w systemie hosta, idealne w przypadku programowania i testowania, gdzie potrzebne są zmiany w czasie rzeczywistym.
Montowanie powiązań danych polega na wykorzystaniu systemu plików maszyny hosta, aby zachować dane serwera PostgreSQL podczas ponownych uruchomień kontenera. Powiązanie danych jest montowane w C:\PostgreSQL\Data
w systemie Windows (lub w /PostgreSQL/Data
na Unix), w ścieżce na maszynie hosta, w kontenerze serwera PostgreSQL. Aby uzyskać więcej informacji na temat podłączeń danych za pomocą bind, zobacz dokumentację Docker: Bind mounts.
Dodaj zasób serwera PostgreSQL z zamontowaniem przez powiązanie init
Aby dodać montowanie typu init do zasobu serwera PostgreSQL, wywołaj metodę WithInitBindMount.
var builder = DistributedApplication.CreateBuilder(args);
var postgres = builder.AddPostgres("postgres")
.WithInitBindMount(@"C:\PostgreSQL\Init");
var postgresdb = postgres.AddDatabase("postgresdb");
var exampleProject = builder.AddProject<Projects.ExampleProject>()
.WithReference(postgresdb);
// After adding all resources, run the app...
Powiązanie montowania init opiera się na systemie plików maszyny hosta w celu inicjalizacji bazy danych serwera PostgreSQL z folderem init kontenera. Ten folder jest używany do inicjowania oraz uruchamiania skryptów powłoki wykonywalnych lub plików poleceń .sql po utworzeniu folderu postgres-data. Powiązanie init jest zamontowane w C:\PostgreSQL\Init
w systemie Windows (lub /PostgreSQL/Init
na ścieżce Unix) na maszynie hosta w kontenerze serwera PostgreSQL.
Dodawanie zasobu serwera PostgreSQL z parametrami
Jeśli chcesz jawnie podać nazwę użytkownika i hasło używane przez obraz kontenera, możesz przekazać te dane uwierzytelniające jako parametry. Rozważmy następujący przykład alternatywny:
var builder = DistributedApplication.CreateBuilder(args);
var username = builder.AddParameter("username", secret: true);
var password = builder.AddParameter("password", secret: true);
var postgres = builder.AddPostgres("postgres", username, password);
var postgresdb = postgres.AddDatabase("postgresdb");
var exampleProject = builder.AddProject<Projects.ExampleProject>()
.WithReference(postgresdb);
// After adding all resources, run the app...
Aby uzyskać więcej informacji na temat udostępniania parametrów, zobacz Parametry zewnętrzne.
Kontrole kondycji integracji hostingu
Integracja hostowania PostgreSQL automatycznie dodaje kontrolę kondycji zasobu serwera PostgreSQL. Sprawdzanie kondycji sprawdza, czy serwer PostgreSQL jest uruchomiony i czy można nawiązać z nim połączenie.
Integracja hostingu opiera się na pakiecie NuGet 📦 AspNetCore.HealthChecks.Npgsql.
integracja Client
Aby rozpocząć pracę z integracją klienta .NET AspirePostgreSQLEntity Framework Core, zainstaluj pakiet NuGet 📦Aspire.Npgsql.EntityFrameworkCore.PostgreSQL w projekcie korzystającym z klienta, czyli w projekcie aplikacji, która używa klienta PostgreSQL. Integracja dla klienta .NET AspirePostgreSQLEntity Framework Core rejestruje żądane wystąpienia podklasy DbContext
, które można wykorzystać do interakcji z PostgreSQL.
dotnet add package Aspire.Npgsql.EntityFrameworkCore.PostgreSQL
Dodawanie kontekstu bazy danych Npgsql
W pliku Program.cs projektu korzystającego z klienta wywołaj metodę rozszerzenia AddNpgsqlDbContext na dowolnym IHostApplicationBuilder, aby zarejestrować podklasę DbContext do użycia za pośrednictwem kontenera wstrzykiwania zależności. Metoda przyjmuje parametr nazwy połączenia.
builder.AddNpgsqlDbContext<YourDbContext>(connectionName: "postgresdb");
Wskazówka
Parametr connectionName
musi być zgodny z nazwą używaną podczas dodawania zasobu serwera PostgreSQL w projekcie hosta aplikacji. Aby uzyskać więcej informacji, zobacz Dodaj PostgreSQL zasób serwera.
Po dodaniu YourDbContext
do buildera, można uzyskać wystąpienie YourDbContext
przy użyciu wstrzykiwania zależności. Na przykład aby pobrać obiekt źródła danych z przykładowej usługi, zdefiniuj go jako parametr konstruktora i upewnij się, że klasa ExampleService
jest zarejestrowana w kontenerze iniekcji zależności:
public class ExampleService(YourDbContext context)
{
// Use context...
}
Aby uzyskać więcej informacji na temat wstrzykiwania zależności, zobacz .NET wstrzykiwanie zależności.
Wzbogacanie kontekstu bazy danych Npgsql
Wolisz użyć standardowej metody Entity Framework, aby uzyskać kontekst bazy danych i dodać go do kontenera iniekcji zależności:
builder.Services.AddDbContext<YourDbContext>(options =>
options.UseNpgsql(builder.Configuration.GetConnectionString("postgresdb")
?? throw new InvalidOperationException("Connection string 'postgresdb' not found.")));
Uwaga
Nazwa parametrów połączenia przekazywana do metody GetConnectionString musi być zgodna z nazwą używaną podczas dodawania zasobu serwera PostgreSQL w projekcie hosta aplikacji. Aby uzyskać więcej informacji, zobacz Dodaj PostgreSQL zasób serwera.
Masz większą elastyczność podczas tworzenia kontekstu bazy danych w ten sposób, na przykład:
- Możesz ponownie użyć istniejącego kodu konfiguracji dla kontekstu bazy danych bez ponownego zapisywania go dla .NET.NET Aspire.
- Przechwytywacze Entity Framework Core można używać do modyfikowania operacji bazy danych.
- Możesz zdecydować się nie używać Entity Framework Core łączenia kontekstów, co w niektórych warunkach może zapewnić lepszą wydajność.
Jeśli używasz tej metody, możesz ulepszyć kontekst bazy danych za pomocą ponawiania prób dostępu w stylu .NET.NET Aspire, kontroli stanu zdrowia, logowania i funkcji telemetrii, wywołując metodę EnrichNpgsqlDbContext:
builder.EnrichNpgsqlDbContext<YourDbContext>(
configureSettings: settings =>
{
settings.DisableRetry = false;
settings.CommandTimeout = 30;
});
Parametr settings
jest wystąpieniem klasy NpgsqlEntityFrameworkCorePostgreSQLSettings.
Konfiguracja
Integracja .NET AspirePostgreSQLEntity Framework Core zapewnia wiele metod konfiguracji i opcji spełniających wymagania i konwencje projektu.
Użycie ciągu połączenia
W przypadku używania parametrów połączenia z sekcji konfiguracji ConnectionStrings
należy podać nazwę parametrów połączenia podczas wywoływania metody AddNpgsqlDbContext:
builder.AddNpgsqlDbContext<MyDbContext>("pgdb");
Parametry połączenia są pobierane z sekcji konfiguracji ConnectionStrings
:
{
"ConnectionStrings": {
"pgdb": "Host=myserver;Database=test"
}
}
EnrichNpgsqlDbContext
nie będzie korzystać z sekcji konfiguracji ConnectionStrings
, ponieważ oczekuje ona zarejestrowania DbContext
w momencie jego wywołania.
Aby uzyskać więcej informacji, zobacz ConnectionString.
Korzystanie z dostawców konfiguracji
Integracja .NET AspirePostgreSQLEntity Framework Core obsługuje Microsoft.Extensions.Configuration. Ładuje NpgsqlEntityFrameworkCorePostgreSQLSettings z plików konfiguracji, takich jak appsettings.json przy użyciu klucza Aspire:Npgsql:EntityFrameworkCore:PostgreSQL
. Jeśli konfiguracje zostały skonfigurowane w sekcji Aspire:Npgsql:EntityFrameworkCore:PostgreSQL
, możesz wywołać metodę bez przekazywania żadnego parametru.
W poniższym przykładzie przedstawiono plik appsettings.json, który konfiguruje niektóre z dostępnych opcji:
{
"Aspire": {
"Npgsql": {
"EntityFrameworkCore": {
"PostgreSQL": {
"ConnectionString": "Host=myserver;Database=postgresdb",
"DisableHealthChecks": true,
"DisableTracing": true
}
}
}
}
}
Aby uzyskać pełny schemat integracji klienta PostgreSQLEntity Framework CoreJSON, zobacz Aspire.Npgsql.EntityFrameworkCore.PostgreSQL/ConfigurationSchema.json.
Używaj delegatów wbudowanych
Możesz również przekazać delegata Action<NpgsqlEntityFrameworkCorePostgreSQLSettings>
, aby skonfigurować niektóre lub wszystkie opcje bezpośrednio w kodzie, na przykład w celu ustawienia ConnectionString
:
builder.AddNpgsqlDbContext<YourDbContext>(
"pgdb",
static settings => settings.ConnectionString = "<YOUR CONNECTION STRING>");
Konfigurowanie wielu klas DbContext
Jeśli chcesz zarejestrować więcej niż jedną DbContext w innej konfiguracji, możesz użyć nazwy sekcji konfiguracji $"Aspire:Npgsql:EntityFrameworkCore:PostgreSQL:{typeof(TContext).Name}"
. Konfiguracja json wygląda następująco:
{
"Aspire": {
"Npgsql": {
"EntityFrameworkCore": {
"PostgreSQL": {
"ConnectionString": "<YOUR CONNECTION STRING>",
"DisableHealthChecks": true,
"DisableTracing": true,
"AnotherDbContext": {
"ConnectionString": "<ANOTHER CONNECTION STRING>",
"DisableTracing": false
}
}
}
}
}
}
Następnie wywołanie metody AddNpgsqlDbContext przy użyciu parametru typu AnotherDbContext
spowoduje załadowanie ustawień z sekcji Aspire:Npgsql:EntityFrameworkCore:PostgreSQL:AnotherDbContext
.
builder.AddNpgsqlDbContext<AnotherDbContext>();
Client kontrole stanu integracji
Domyślnie .NET.NET Aspireintegracje klienta mają kontrole stanu włączone dla wszystkich usług. Podobnie, wiele .NET.NET Aspireintegracji hostingowych również umożliwiają punkty końcowe sprawdzania kondycji. Aby uzyskać więcej informacji, zobacz:
- .NET sprawdzanie kondycji aplikacji w języku C#
- kontrole kondycji w ASP.NET Core
Domyślnie integracja .NET AspirePostgreSQLEntity Framework Core obsługuje następujące elementy:
- Dodaje
DbContextHealthCheck
, który wywołuje metodę EF Core obiektu CanConnectAsync. Nazwa sprawdzania kondycji odpowiada nazwie typuTContext
. - Integruje się z punktem końcowym HTTP
/health
, który określa, że wszystkie zarejestrowane testy kondycji muszą zostać pomyślnie zakończone, aby aplikacja była uznana za gotową do przyjmowania ruchu.
Obserwowanie i telemetria
.NET
.NET Aspire integracje automatycznie konfigurują rejestrowanie, śledzenie i metryki, które są czasami nazywane filarami obserwowalności. Aby uzyskać więcej informacji na temat możliwości obserwacji integracji i telemetrii, zobacz omówienie integracji .NET.NET Aspire. W zależności od usługi pomocniczej niektóre integracje mogą obsługiwać tylko niektóre z tych funkcji. Na przykład niektóre integracje obsługują rejestrowanie i śledzenie, ale nie metryki. Funkcje telemetrii można również wyłączyć przy użyciu technik przedstawionych w sekcji konfiguracji
Rejestrowanie
Integracja .NET AspirePostgreSQLEntity Framework Core używa następujących kategorii dzienników:
Microsoft.EntityFrameworkCore.ChangeTracking
Microsoft.EntityFrameworkCore.Database.Command
Microsoft.EntityFrameworkCore.Database.Connection
Microsoft.EntityFrameworkCore.Database.Transaction
Microsoft.EntityFrameworkCore.Migrations
Microsoft.EntityFrameworkCore.Infrastructure
Microsoft.EntityFrameworkCore.Migrations
Microsoft.EntityFrameworkCore.Model
Microsoft.EntityFrameworkCore.Model.Validation
Microsoft.EntityFrameworkCore.Query
Microsoft.EntityFrameworkCore.Update
Śledzenie
Integracja .NET AspirePostgreSQLEntity Framework Core spowoduje emitowanie następujących działań śledzenia przy użyciu OpenTelemetry:
Npgsql
Wskaźniki
Integracja .NET AspirePostgreSQLEntity Framework Core będzie emitować następujące metryki przy użyciu OpenTelemetry:
Microsoft.EntityFrameworkCore:
ec_Microsoft_EntityFrameworkCore_active_db_contexts
ec_Microsoft_EntityFrameworkCore_total_queries
ec_Microsoft_EntityFrameworkCore_queries_per_second
ec_Microsoft_EntityFrameworkCore_total_save_changes
ec_Microsoft_EntityFrameworkCore_save_changes_per_second
ec_Microsoft_EntityFrameworkCore_compiled_query_cache_hit_rate
ec_Microsoft_Entity_total_execution_strategy_operation_failures
ec_Microsoft_E_execution_strategy_operation_failures_per_second
ec_Microsoft_EntityFramew_total_optimistic_concurrency_failures
ec_Microsoft_EntityF_optimistic_concurrency_failures_per_second
Npgsql:
ec_Npgsql_bytes_written_per_second
ec_Npgsql_bytes_read_per_second
ec_Npgsql_commands_per_second
ec_Npgsql_total_commands
ec_Npgsql_current_commands
ec_Npgsql_failed_commands
ec_Npgsql_prepared_commands_ratio
ec_Npgsql_connection_pools
ec_Npgsql_multiplexing_average_commands_per_batch
ec_Npgsql_multiplexing_average_write_time_per_batch