mirror of
				https://github.com/Unleash/unleash.git
				synced 2025-10-27 11:02:16 +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:
		
							parent
							
								
									dfc065500d
								
							
						
					
					
						commit
						8aa0616698
					
				@ -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)
 | 
			
		||||
 | 
			
		||||
@ -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);
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
@ -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',
 | 
			
		||||
 | 
			
		||||
@ -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>;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
							
								
								
									
										4
									
								
								src/test/fixtures/fake-setting-store.ts
									
									
									
									
										vendored
									
									
								
							
							
						
						
									
										4
									
								
								src/test/fixtures/fake-setting-store.ts
									
									
									
									
										vendored
									
									
								
							@ -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');
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
		Loading…
	
		Reference in New Issue
	
	Block a user