diff --git a/packages/twenty-server/src/engine/core-modules/metrics/metrics.service.ts b/packages/twenty-server/src/engine/core-modules/metrics/metrics.service.ts index a77062d008..668ad58402 100644 --- a/packages/twenty-server/src/engine/core-modules/metrics/metrics.service.ts +++ b/packages/twenty-server/src/engine/core-modules/metrics/metrics.service.ts @@ -80,6 +80,40 @@ export class MetricsService { return gauge; } + createInfoGauge({ + metricName, + options, + attributesCallback, + }: { + metricName: string; + options: MetricOptions; + attributesCallback: () => Attributes | Promise; + }): ObservableGauge { + const normalizedName = metricName.endsWith('_info') + ? metricName + : `${metricName}_info`; + + const gauge = this.getMeter().createObservableGauge( + normalizedName, + options, + ); + + gauge.addCallback(async (observableResult) => { + try { + const attributes = await attributesCallback(); + + observableResult.observe(1, attributes); + } catch (error) { + this.logger.error( + `Failed to collect info gauge ${normalizedName}`, + error, + ); + } + }); + + return gauge; + } + async incrementCounterForEvent({ key, eventId, diff --git a/packages/twenty-server/src/engine/core-modules/upgrade/upgrade-gauge.service.ts b/packages/twenty-server/src/engine/core-modules/upgrade/upgrade-gauge.service.ts index 3afae6bf49..b64a0080cf 100644 --- a/packages/twenty-server/src/engine/core-modules/upgrade/upgrade-gauge.service.ts +++ b/packages/twenty-server/src/engine/core-modules/upgrade/upgrade-gauge.service.ts @@ -92,6 +92,22 @@ export class UpgradeGaugeService implements OnModuleInit { }, cacheValue: true, }); + + this.metricsService.createInfoGauge({ + metricName: 'twenty_upgrade_instance', + options: { + description: + 'Inferred instance version (semver-ish, derived from the last applied upgrade migration), carried as the `version` attribute', + }, + attributesCallback: async () => { + const upgradeStatus = await this.getCachedUpgradeStatus(); + + return { + version: + upgradeStatus?.instanceUpgradeStatus.inferredVersion ?? 'unknown', + }; + }, + }); } private async getCachedUpgradeStatus(): Promise {