From 42ef0344e2a262db1acd8e98ca457e67b8cc9fd1 Mon Sep 17 00:00:00 2001 From: Brian Forbis Date: Tue, 18 Apr 2023 13:25:16 -0400 Subject: [PATCH 1/4] Default knex connection.application_name Signed-off-by: Brian Forbis --- packages/backend-common/src/database/DatabaseManager.ts | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/packages/backend-common/src/database/DatabaseManager.ts b/packages/backend-common/src/database/DatabaseManager.ts index 02f2c6b172..036cabde9f 100644 --- a/packages/backend-common/src/database/DatabaseManager.ts +++ b/packages/backend-common/src/database/DatabaseManager.ts @@ -268,6 +268,12 @@ export class DatabaseManager { client, ); + if (client === 'pg') { + ( + connection as Knex.PgConnectionConfig + ).application_name ||= `backstage_plugin_${pluginId}`; + } + return { // include base connection if client type has not been overridden ...(overridden ? {} : baseConnection), From 284db2250830239ae7738496562424e10ddb3aa6 Mon Sep 17 00:00:00 2001 From: Brian Forbis Date: Tue, 18 Apr 2023 13:35:42 -0400 Subject: [PATCH 2/4] add changeset Signed-off-by: Brian Forbis --- .changeset/eighty-olives-live.md | 5 +++++ 1 file changed, 5 insertions(+) create mode 100644 .changeset/eighty-olives-live.md diff --git a/.changeset/eighty-olives-live.md b/.changeset/eighty-olives-live.md new file mode 100644 index 0000000000..88dd768103 --- /dev/null +++ b/.changeset/eighty-olives-live.md @@ -0,0 +1,5 @@ +--- +'@backstage/backend-common': minor +--- + +Defaults the connection.application_name of the database connections created for each plugin. From 6609a1707bad5817d486165a788dcf8b818a06f0 Mon Sep 17 00:00:00 2001 From: bforbis Date: Wed, 19 Apr 2023 10:15:06 -0400 Subject: [PATCH 3/4] Apply suggestions from code review Co-authored-by: Johan Haals Signed-off-by: bforbis --- .changeset/eighty-olives-live.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.changeset/eighty-olives-live.md b/.changeset/eighty-olives-live.md index 88dd768103..16898701f4 100644 --- a/.changeset/eighty-olives-live.md +++ b/.changeset/eighty-olives-live.md @@ -1,5 +1,5 @@ --- -'@backstage/backend-common': minor +'@backstage/backend-common': patch --- -Defaults the connection.application_name of the database connections created for each plugin. +Updated the `DatabaseManager` to include the plugin id in the Postgres application name of the database connections created for each plugin. From 9955591788ee561b75a3df4c3f323807a5eb2425 Mon Sep 17 00:00:00 2001 From: Brian Forbis Date: Wed, 19 Apr 2023 12:01:26 -0400 Subject: [PATCH 4/4] add tests Signed-off-by: Brian Forbis --- .../src/database/DatabaseManager.test.ts | 79 +++++++++++++++++++ .../src/database/DatabaseManager.ts | 2 +- 2 files changed, 80 insertions(+), 1 deletion(-) diff --git a/packages/backend-common/src/database/DatabaseManager.test.ts b/packages/backend-common/src/database/DatabaseManager.test.ts index 336e5d499c..69386d77c5 100644 --- a/packages/backend-common/src/database/DatabaseManager.test.ts +++ b/packages/backend-common/src/database/DatabaseManager.test.ts @@ -165,6 +165,7 @@ describe('DatabaseManager', () => { user: 'foo', password: 'bar', port: '5432', + application_name: 'backstage_plugin_pluginwithoutconfig', }, }); @@ -741,5 +742,83 @@ describe('DatabaseManager', () => { expect(baseConfig.data.role).toEqual('backstage-plugin'); }); + + it('Defaults the application_name for postgres clients', async () => { + const testManager = DatabaseManager.fromConfig( + new ConfigReader({ + backend: { + database: { + client: 'pg', + connection: {}, + }, + }, + }), + ); + + await testManager.forPlugin('testplugin').getClient(); + const mockCalls = mocked(createDatabaseClient).mock.calls.splice(-1); + const [baseConfig, _] = mockCalls[0]; + expect(baseConfig.get()).toMatchObject({ + connection: { + application_name: 'backstage_plugin_testplugin', + }, + }); + }); + + it('Allows manually setting the application_name for postgres clients', async () => { + const testManager = DatabaseManager.fromConfig( + new ConfigReader({ + backend: { + database: { + client: 'pg', + connection: { + application_name: 'backstage_custom_app_name', + }, + }, + }, + }), + ); + + await testManager.forPlugin('testplugin').getClient(); + const mockCalls = mocked(createDatabaseClient).mock.calls.splice(-1); + const [baseConfig, overrides] = mockCalls[0]; + expect(baseConfig.get().connection.application_name).toBe( + 'backstage_custom_app_name', + ); + expect(overrides.connection.application_name).toBeUndefined(); + }); + + it('Allows manually setting the application_name for individual plugin client', async () => { + const testManager = DatabaseManager.fromConfig( + new ConfigReader({ + backend: { + database: { + client: 'pg', + connection: { + host: 'localhost', + user: 'foo', + password: 'bar', + database: 'foodb', + application_name: 'backstage_custom_app_name', + }, + plugin: { + overrideplugin: { + connection: { + application_name: 'custom_plugin', + }, + }, + }, + }, + }, + }), + ); + + await testManager.forPlugin('overrideplugin').getClient(); + const mockCalls = mocked(createDatabaseClient).mock.calls.splice(-1); + const [baseConfig, _] = mockCalls[0]; + expect(baseConfig.get().connection.application_name).toBe( + 'custom_plugin', + ); + }); }); }); diff --git a/packages/backend-common/src/database/DatabaseManager.ts b/packages/backend-common/src/database/DatabaseManager.ts index 036cabde9f..db5d36afad 100644 --- a/packages/backend-common/src/database/DatabaseManager.ts +++ b/packages/backend-common/src/database/DatabaseManager.ts @@ -270,7 +270,7 @@ export class DatabaseManager { if (client === 'pg') { ( - connection as Knex.PgConnectionConfig + baseConnection as Knex.PgConnectionConfig ).application_name ||= `backstage_plugin_${pluginId}`; }