added keepalive to DatabaseManager

Signed-off-by: Fredrik Adelöw <freben@gmail.com>
This commit is contained in:
Fredrik Adelöw
2022-08-25 15:27:44 +02:00
parent 6f70113b57
commit c3c90280be
7 changed files with 62 additions and 3 deletions
+6
View File
@@ -0,0 +1,6 @@
---
'@backstage/backend-common': patch
---
Added a keep-alive refresh loop to the `DatabaseManager`, keeping the connection
pool up.
+6
View File
@@ -0,0 +1,6 @@
---
'@backstage/backend-common': patch
---
The options part of `DatabaseManager.fromConfig` now accepts an optional logger
field.
+18
View File
@@ -0,0 +1,18 @@
---
'@backstage/create-app': patch
---
The options part of `DatabaseManager.fromConfig` now accepts an optional logger
field. You may want to supply that logger in your backend initialization code to
ensure that you can get relevant logging data when things happen related to the
connection pool.
In `packages/backend/src/index.ts`:
```diff
function makeCreateEnv(config: Config) {
const root = getRootLogger();
...
- const databaseManager = DatabaseManager.fromConfig(config);
+ const databaseManager = DatabaseManager.fromConfig(config, { logger: root });
```
+1
View File
@@ -252,6 +252,7 @@ export class DatabaseManager {
// @public
export type DatabaseManagerOptions = {
migrations?: PluginDatabaseManager['migrations'];
logger?: Logger;
};
// @public
@@ -29,6 +29,8 @@ import {
} from './connection';
import { PluginDatabaseManager } from './types';
import path from 'path';
import { Logger } from 'winston';
import { stringifyError } from '@backstage/errors';
/**
* Provides a config lookup path for a plugin's config block.
@@ -44,6 +46,7 @@ function pluginPath(pluginId: string): string {
*/
export type DatabaseManagerOptions = {
migrations?: PluginDatabaseManager['migrations'];
logger?: Logger;
};
/**
@@ -339,6 +342,31 @@ export class DatabaseManager {
schemaOverrides,
);
return createDatabaseClient(pluginConfig, databaseClientOverrides);
const client = createDatabaseClient(pluginConfig, databaseClientOverrides);
this.startKeepaliveLoop(pluginId, client);
return client;
}
private startKeepaliveLoop(pluginId: string, client: Knex): void {
let lastKeepaliveFailed = false;
setInterval(() => {
client.raw('select 1').then(
() => {
lastKeepaliveFailed = false;
},
(error: unknown) => {
if (!lastKeepaliveFailed) {
lastKeepaliveFailed = true;
this.options?.logger?.warn(
`Database keepalive failed for plugin ${pluginId}, ${stringifyError(
error,
)}`,
);
}
},
);
}, 60 * 1000);
}
}
+1 -1
View File
@@ -69,7 +69,7 @@ function makeCreateEnv(config: Config) {
discovery,
tokenManager,
});
const databaseManager = DatabaseManager.fromConfig(config);
const databaseManager = DatabaseManager.fromConfig(config, { logger: root });
const cacheManager = CacheManager.fromConfig(config);
const taskScheduler = TaskScheduler.fromConfig(config);
@@ -36,7 +36,7 @@ function makeCreateEnv(config: Config) {
const reader = UrlReaders.default({ logger: root, config });
const discovery = SingleHostDiscovery.fromConfig(config);
const cacheManager = CacheManager.fromConfig(config);
const databaseManager = DatabaseManager.fromConfig(config);
const databaseManager = DatabaseManager.fromConfig(config, { logger: root });
const tokenManager = ServerTokenManager.noop();
const taskScheduler = TaskScheduler.fromConfig(config);
const permissions = ServerPermissionClient.fromConfig(config, {