From 6cb7eed842fa7dbac32bec94bf2ea83538d3e81d Mon Sep 17 00:00:00 2001 From: Michael Todorovic Date: Tue, 17 Jun 2025 09:07:51 +0200 Subject: [PATCH] feat: add support for PGAPPNAME to set application name Signed-off-by: Michael Todorovic --- src/Npgsql/Internal/NpgsqlConnector.cs | 5 ++-- src/Npgsql/PostgresEnvironment.cs | 2 ++ test/Npgsql.Tests/ConnectionTests.cs | 41 ++++++++++++++++++++++++++ 3 files changed, 46 insertions(+), 2 deletions(-) diff --git a/src/Npgsql/Internal/NpgsqlConnector.cs b/src/Npgsql/Internal/NpgsqlConnector.cs index c8916acd0a..7f720f5882 100644 --- a/src/Npgsql/Internal/NpgsqlConnector.cs +++ b/src/Npgsql/Internal/NpgsqlConnector.cs @@ -833,8 +833,9 @@ void WriteStartupMessage(string username) if (Settings.Database is not null) startupParams["database"] = Settings.Database; - if (Settings.ApplicationName?.Length > 0) - startupParams["application_name"] = Settings.ApplicationName; + var applicationName = Settings.ApplicationName ?? PostgresEnvironment.AppName; + if (applicationName?.Length > 0) + startupParams["application_name"] = applicationName; if (Settings.SearchPath?.Length > 0) startupParams["search_path"] = Settings.SearchPath; diff --git a/src/Npgsql/PostgresEnvironment.cs b/src/Npgsql/PostgresEnvironment.cs index 558f6cfe9f..3ba874ae4c 100644 --- a/src/Npgsql/PostgresEnvironment.cs +++ b/src/Npgsql/PostgresEnvironment.cs @@ -54,6 +54,8 @@ internal static string? SslCertRootDefault internal static string? RequireAuth => Environment.GetEnvironmentVariable("PGREQUIREAUTH"); + internal static string? AppName => Environment.GetEnvironmentVariable("PGAPPNAME"); + static string? GetHomeDir() => Environment.GetEnvironmentVariable(RuntimeInformation.IsOSPlatform(OSPlatform.Windows) ? "APPDATA" : "HOME"); diff --git a/test/Npgsql.Tests/ConnectionTests.cs b/test/Npgsql.Tests/ConnectionTests.cs index 90dbd4ecf1..ac97daf101 100644 --- a/test/Npgsql.Tests/ConnectionTests.cs +++ b/test/Npgsql.Tests/ConnectionTests.cs @@ -391,6 +391,47 @@ public async Task Timezone_connection_param() #endregion Timezone + #region Application Name + + [Test, IssueLink("https://github.com/npgsql/npgsql/issues/6133")] + [NonParallelizable] // Sets environment variable + public async Task Application_name_env_var() + { + const string testAppName = "MyTestApp"; + + // Note that the pool is unaware of the environment variable, so if a connection is + // returned from the pool it may contain the wrong application name + using var _ = SetEnvironmentVariable("PGAPPNAME", testAppName); + await using var dataSource = CreateDataSource(); + await using var conn = await dataSource.OpenConnectionAsync(); + Assert.That(conn.PostgresParameters["application_name"], Is.EqualTo(testAppName)); + } + + [Test] + public async Task Application_name_connection_param() + { + const string testAppName = "MyTestApp2"; + + await using var dataSource = CreateDataSource(csb => csb.ApplicationName = testAppName); + await using var conn = await dataSource.OpenConnectionAsync(); + Assert.That(conn.PostgresParameters["application_name"], Is.EqualTo(testAppName)); + } + + [Test] + [NonParallelizable] // Sets environment variable + public async Task Application_name_connection_param_overrides_env_var() + { + const string envAppName = "EnvApp"; + const string connAppName = "ConnApp"; + + using var _ = SetEnvironmentVariable("PGAPPNAME", envAppName); + await using var dataSource = CreateDataSource(csb => csb.ApplicationName = connAppName); + await using var conn = await dataSource.OpenConnectionAsync(); + Assert.That(conn.PostgresParameters["application_name"], Is.EqualTo(connAppName)); + } + + #endregion Application Name + #region ConnectionString - Host [TestCase("127.0.0.1", ExpectedResult = new [] { "127.0.0.1:5432" })]