diff --git a/.changeset/pool-logger-context.md b/.changeset/pool-logger-context.md new file mode 100644 index 00000000..4f69a9fc --- /dev/null +++ b/.changeset/pool-logger-context.md @@ -0,0 +1,5 @@ +--- +"slonik": patch +--- + +Add support for the `poolName` configuration property to make it easier to distinguish logs and traces when using multiple pools in the same application. diff --git a/packages/slonik/src/factories/createConnectionPool.ts b/packages/slonik/src/factories/createConnectionPool.ts index 48c684bd..e845c00a 100644 --- a/packages/slonik/src/factories/createConnectionPool.ts +++ b/packages/slonik/src/factories/createConnectionPool.ts @@ -87,6 +87,7 @@ export const createConnectionPool = ({ maximumConnectionAge, maximumPoolSize, minimumPoolSize, + poolName, }: { driver: Driver; events: DatabasePoolEventEmitter; @@ -102,6 +103,7 @@ export const createConnectionPool = ({ maximumConnectionAge: number; maximumPoolSize: number; minimumPoolSize: number; + poolName?: string; }): ConnectionPool => { // See test "waits for all connections to be established before attempting to terminate the pool" // for explanation of why `pendingConnections` is needed. @@ -478,6 +480,9 @@ export const createConnectionPool = ({ return tracer.startActiveSpan("slonik.connection.acquire", async (span) => { try { span.setAttribute("slonik.pool.id", id); + if (poolName) { + span.setAttribute("slonik.pool.name", poolName); + } span.setAttribute("slonik.pool.connections.total", connections.size); span.setAttribute("slonik.pool.connections.pending", pendingConnections.size); span.setAttribute("slonik.pool.waitingClients", waitingClients.length); @@ -623,6 +628,8 @@ export const createConnectionPool = ({ maximumPoolSize, minimumPoolSize, pendingConnections: pendingConnections.size, + poolId: id, + poolName, waitingClients: waitingClients.length, }, `connection pool full; client has been queued`, diff --git a/packages/slonik/src/factories/createPool.ts b/packages/slonik/src/factories/createPool.ts index f0f69c45..b51646a5 100644 --- a/packages/slonik/src/factories/createPool.ts +++ b/packages/slonik/src/factories/createPool.ts @@ -38,6 +38,7 @@ export const createPool = async ( events, Logger.child({ poolId: pool.id(), + poolName: clientConfiguration.poolName, }), pool, clientConfiguration, diff --git a/packages/slonik/src/factories/createPoolConfiguration.ts b/packages/slonik/src/factories/createPoolConfiguration.ts index b0ca09ac..f017272f 100644 --- a/packages/slonik/src/factories/createPoolConfiguration.ts +++ b/packages/slonik/src/factories/createPoolConfiguration.ts @@ -11,6 +11,7 @@ type PoolConfiguration = { maximumConnectionAge: number; maximumPoolSize: number; minimumPoolSize: number; + poolName?: string; }; /** @@ -66,5 +67,9 @@ export const createPoolConfiguration = ( poolConfiguration.minimumPoolSize = clientConfiguration.minimumPoolSize; } + if (clientConfiguration.poolName) { + poolConfiguration.poolName = clientConfiguration.poolName; + } + return poolConfiguration; }; diff --git a/packages/slonik/src/types.ts b/packages/slonik/src/types.ts index 6cf43c81..fed14b7d 100644 --- a/packages/slonik/src/types.ts +++ b/packages/slonik/src/types.ts @@ -64,6 +64,11 @@ export type ClientConfiguration = { * Ensure that at least this many connections are available in the pool. (Default: 0) */ readonly minimumPoolSize?: number; + /** + * Human-readable identifier for distinguishing multiple pools within the same application, + * e.g. "read", "write", "replica-us-east-1". + */ + readonly poolName?: string; /** * Number of times a query failing with Transaction Rollback class error, that doesn't belong to a transaction, is retried. (Default: 5) */