From e0ec5ed4b0715a703024644ea5598022000ec21f Mon Sep 17 00:00:00 2001 From: Jaanus Sellin Date: Wed, 24 Apr 2024 12:10:39 +0300 Subject: [PATCH] fix: now metrics in search will be aggregated across applications (#6915) --- .../feature-search/feature-search-store.ts | 54 ++++++++++++------- .../feature-search/feature.search.e2e.test.ts | 12 ++++- 2 files changed, 45 insertions(+), 21 deletions(-) diff --git a/src/lib/features/feature-search/feature-search-store.ts b/src/lib/features/feature-search/feature-search-store.ts index a376b54f50f..5ba2361a330 100644 --- a/src/lib/features/feature-search/feature-search-store.ts +++ b/src/lib/features/feature-search/feature-search-store.ts @@ -107,8 +107,6 @@ class FeatureSearchStore implements IFeatureSearchStore { 'ft.tag_value as tag_value', 'ft.tag_type as tag_type', 'segments.name as segment_name', - 'client_metrics_env.yes as yes', - 'client_metrics_env.no as no', ] as (string | Raw | Knex.QueryBuilder)[]; const lastSeenQuery = 'last_seen_at_metrics.last_seen_at'; @@ -212,23 +210,6 @@ class FeatureSearchStore implements IFeatureSearchStore { '=', 'features.name', ); - }) - .leftJoin('client_metrics_env', (qb) => { - qb.on( - 'client_metrics_env.environment', - '=', - 'environments.name', - ) - .andOn( - 'client_metrics_env.feature_name', - '=', - 'features.name', - ) - .andOn( - 'client_metrics_env.timestamp', - '>=', - this.db.raw("NOW() - INTERVAL '1 hour'"), - ); }); query.leftJoin('last_seen_at_metrics', function () { @@ -264,6 +245,30 @@ class FeatureSearchStore implements IFeatureSearchStore { 'total_features', this.db.raw('select count(*) as total from final_ranks'), ) + .with('metrics', (queryBuilder) => { + queryBuilder + .sum('yes as yes') + .sum('no as no') + .select([ + 'client_metrics_env.environment', + 'client_metrics_env.feature_name', + ]) + .from('client_metrics_env') + .innerJoin( + 'final_ranks', + 'client_metrics_env.feature_name', + 'final_ranks.feature_name', + ) + .where( + 'client_metrics_env.timestamp', + '>=', + this.db.raw("NOW() - INTERVAL '1 hour'"), + ) + .groupBy([ + 'client_metrics_env.feature_name', + 'client_metrics_env.environment', + ]); + }) .select('*') .from('ranked_features') .innerJoin( @@ -271,6 +276,17 @@ class FeatureSearchStore implements IFeatureSearchStore { 'ranked_features.feature_name', 'final_ranks.feature_name', ) + .leftJoin('metrics', (qb) => { + qb.on( + 'metrics.environment', + '=', + 'ranked_features.environment', + ).andOn( + 'metrics.feature_name', + '=', + 'ranked_features.feature_name', + ); + }) .joinRaw('CROSS JOIN total_features') .whereBetween('final_rank', [offset + 1, offset + limit]); const rows = await finalQuery; diff --git a/src/lib/features/feature-search/feature.search.e2e.test.ts b/src/lib/features/feature-search/feature.search.e2e.test.ts index 5294ef6dc31..4baf38288b6 100644 --- a/src/lib/features/feature-search/feature.search.e2e.test.ts +++ b/src/lib/features/feature-search/feature.search.e2e.test.ts @@ -939,6 +939,14 @@ test('should return environment usage metrics', async () => { yes: 5, no: 2, }, + { + featureName: `my_feature_b`, + appName: `web2`, + environment: 'development', + timestamp: new Date(), + yes: 5, + no: 2, + }, { featureName: `my_feature_b`, appName: `web`, @@ -964,8 +972,8 @@ test('should return environment usage metrics', async () => { }, { name: 'development', - yes: 5, - no: 2, + yes: 10, + no: 4, }, { name: 'production',