From 40c7c25db96f2b949fcdad9efe7a804ad1e72069 Mon Sep 17 00:00:00 2001 From: Simon Hornby Date: Thu, 19 Jun 2025 11:31:51 +0200 Subject: [PATCH] feat: ingest new impact metrics (#10169) Accepts the new impact metrics into the singleton registry and then does nothing with them. If the relevant flag is off, the metrics are stripped from the existing metrics data format and dropped on the floor --- src/lib/features/metrics/instance/metrics.ts | 26 +++++++++++++++----- src/lib/routes/client-api/index.ts | 9 ++++++- src/lib/types/experimental.ts | 4 +++ 3 files changed, 32 insertions(+), 7 deletions(-) diff --git a/src/lib/features/metrics/instance/metrics.ts b/src/lib/features/metrics/instance/metrics.ts index 649bdd12e8..577eed59ac 100644 --- a/src/lib/features/metrics/instance/metrics.ts +++ b/src/lib/features/metrics/instance/metrics.ts @@ -27,6 +27,7 @@ import { CLIENT_METRICS } from '../../../events/index.js'; import type { CustomMetricsSchema } from '../../../openapi/spec/custom-metrics-schema.js'; import type { StoredCustomMetric } from '../custom/custom-metrics-store.js'; import type { CustomMetricsService } from '../custom/custom-metrics-service.js'; +import type { MetricsTranslator } from '../impact/metrics-translator.js'; export default class ClientMetricsController extends Controller { logger: Logger; @@ -39,6 +40,8 @@ export default class ClientMetricsController extends Controller { customMetricsService: CustomMetricsService; + metricsTranslator: MetricsTranslator; + flagResolver: IFlagResolver; constructor( @@ -55,6 +58,7 @@ export default class ClientMetricsController extends Controller { | 'customMetricsService' >, config: IUnleashConfig, + metricsTranslator: MetricsTranslator, ) { super(config); const { getLogger } = config; @@ -65,6 +69,7 @@ export default class ClientMetricsController extends Controller { this.metricsV2 = clientMetricsServiceV2; this.customMetricsService = customMetricsService; this.flagResolver = config.flagResolver; + this.metricsTranslator = metricsTranslator; this.route({ method: 'post', @@ -150,16 +155,25 @@ export default class ClientMetricsController extends Controller { } else { try { const { body: data, ip: clientIp, user } = req; - data.environment = this.metricsV2.resolveMetricsEnvironment( - user, - data, - ); + const { impactMetrics, ...metricsData } = data; + metricsData.environment = + this.metricsV2.resolveMetricsEnvironment(user, metricsData); await this.clientInstanceService.registerInstance( - data, + metricsData, clientIp, ); - await this.metricsV2.registerClientMetrics(data, clientIp); + await this.metricsV2.registerClientMetrics( + metricsData, + clientIp, + ); + if ( + this.flagResolver.isEnabled('impactMetrics') && + impactMetrics + ) { + this.metricsTranslator.translateMetrics(impactMetrics); + } + res.getHeaderNames().forEach((header) => res.removeHeader(header), ); diff --git a/src/lib/routes/client-api/index.ts b/src/lib/routes/client-api/index.ts index b58dc6824f..cb7cf3cd0c 100644 --- a/src/lib/routes/client-api/index.ts +++ b/src/lib/routes/client-api/index.ts @@ -4,13 +4,20 @@ import MetricsController from '../../features/metrics/instance/metrics.js'; import RegisterController from '../../features/metrics/instance/register.js'; import type { IUnleashConfig } from '../../types/index.js'; import type { IUnleashServices } from '../../services/index.js'; +import { impactRegister } from '../../features/metrics/impact/impact-register.js'; +import { MetricsTranslator } from '../../features/metrics/impact/metrics-translator.js'; export default class ClientApi extends Controller { constructor(config: IUnleashConfig, services: IUnleashServices) { super(config); + const metricsTranslator = new MetricsTranslator(impactRegister); + this.use('/features', new FeatureController(services, config).router); - this.use('/metrics', new MetricsController(services, config).router); + this.use( + '/metrics', + new MetricsController(services, config, metricsTranslator).router, + ); this.use('/register', new RegisterController(services, config).router); } } diff --git a/src/lib/types/experimental.ts b/src/lib/types/experimental.ts index 41111f6c4a..cc3a22d432 100644 --- a/src/lib/types/experimental.ts +++ b/src/lib/types/experimental.ts @@ -292,6 +292,10 @@ const flags: IFlags = { process.env.UNLEASH_EXPERIMENTAL_IMPROVED_JSON_DIFF, false, ), + impactMetrics: parseEnvVarBoolean( + process.env.UNLEASH_EXPERIMENTAL_IMPACT_METRICS, + false, + ), }; export const defaultExperimentalOptions: IExperimentalOptions = {