1
0
mirror of https://github.com/Unleash/unleash.git synced 2025-03-18 00:19:49 +01:00

feat: expose postgres version (#7041)

Adds a postgres_version gauge to allow us to see postgres_version in
prometheus and to post it upstream when version checking. Depends on
https://github.com/bricks-software/version-function/pull/20 to be merged
first to ensure our version-function doesn't crash when given the
postgres-version data.
This commit is contained in:
Christopher Kolstad 2024-05-13 14:41:28 +02:00 committed by GitHub
parent dfc065500d
commit 8aa0616698
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
5 changed files with 38 additions and 2 deletions

View File

@ -14,6 +14,16 @@ export default class SettingStore implements ISettingStore {
this.logger = getLogger('settings-store.ts');
}
async postgresVersion(): Promise<string> {
try {
const showResult = await this.db.raw('SHOW server_version');
return showResult?.rows[0]?.server_version || '';
} catch (e) {
this.logger.warn('Failed to fetch postgres version', e);
return '';
}
}
async updateRow(name: string, content: any): Promise<void> {
return this.db(TABLE)
.where('name', name)

View File

@ -21,7 +21,7 @@ import {
PROJECT_ENVIRONMENT_REMOVED,
} from './types/events';
import type { IUnleashConfig } from './types/option';
import type { IUnleashStores } from './types/stores';
import type { ISettingStore, IUnleashStores } from './types/stores';
import { hoursToMilliseconds, minutesToMilliseconds } from 'date-fns';
import type { InstanceStatsService } from './features/instance-stats/instance-stats-service';
import type { ValidatedClientMetrics } from './features/metrics/shared/schema';
@ -651,7 +651,12 @@ export default class MetricsMonitor {
projectEnvironmentsDisabled.increment({ project_id: project });
});
await this.configureDbMetrics(db, eventBus, schedulerService);
await this.configureDbMetrics(
db,
eventBus,
schedulerService,
stores.settingStore,
);
return Promise.resolve();
}
@ -660,6 +665,7 @@ export default class MetricsMonitor {
db: Knex,
eventBus: EventEmitter,
schedulerService: SchedulerService,
settingStore: ISettingStore,
): Promise<void> {
if (db?.client) {
const dbPoolMin = createGauge({
@ -707,6 +713,13 @@ export default class MetricsMonitor {
'registerPoolMetrics',
0, // no jitter
);
const postgresVersion = await settingStore.postgresVersion();
const database_version = createGauge({
name: 'postgres_version',
help: 'Which version of postgres is running (SHOW server_version)',
labelNames: ['version'],
});
database_version.labels({ version: postgresVersion }).set(1);
}
}

View File

@ -65,6 +65,7 @@ export interface IFeatureUsageInfo {
productionChanges30: number;
productionChanges60: number;
productionChanges90: number;
postgresVersion: string;
}
export default class VersionService {
@ -260,6 +261,7 @@ export default class VersionService {
featureImports,
userActive,
productionChanges,
postgresVersion,
] = await Promise.all([
this.featureToggleStore.count({
archived: false,
@ -282,6 +284,7 @@ export default class VersionService {
this.eventStore.filteredCount({ type: FEATURES_IMPORTED }),
this.userStats(),
this.productionChanges(),
this.postgresVersion(),
]);
const versionInfo = await this.getVersionInfo();
const customStrategies =
@ -315,6 +318,7 @@ export default class VersionService {
productionChanges30: productionChanges.last30,
productionChanges60: productionChanges.last60,
productionChanges90: productionChanges.last90,
postgresVersion,
};
return featureInfo;
}
@ -336,6 +340,10 @@ export default class VersionService {
return this.getProductionChanges();
}
async postgresVersion(): Promise<string> {
return this.settingStore.postgresVersion();
}
async hasOIDC(): Promise<boolean> {
const settings = await this.settingStore.get<{ enabled: boolean }>(
'unleash.enterprise.auth.oidc',

View File

@ -8,5 +8,6 @@ export interface ISettingInsert {
export interface ISettingStore extends Store<any, string> {
insert<T>(name: string, content: T): Promise<void>;
updateRow(name: string, content: any): Promise<void>;
postgresVersion(): Promise<string>;
get<T>(name: string): Promise<T | undefined>;
}

View File

@ -38,4 +38,8 @@ export default class FakeSettingStore implements ISettingStore {
async updateRow(name: string, content: any): Promise<void> {
this.settings.set(name, content);
}
async postgresVersion(): Promise<string> {
return Promise.resolve('fake-postgres-version');
}
}