1
0
mirror of https://github.com/Unleash/unleash.git synced 2025-02-23 00:22:19 +01:00

feat: rework application overview db query (#8518)

Previously we were returning all instance names from database, but now
we count them in database.
This commit is contained in:
Jaanus Sellin 2024-10-23 16:05:01 +03:00 committed by GitHub
parent f2ee02ed9e
commit 9839b77008
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194

View File

@ -313,28 +313,38 @@ export default class ClientApplicationsStore
), ),
]) ])
.from('client_metrics_env as cme') .from('client_metrics_env as cme')
.where('cme.app_name', appName)
.leftJoin('features as f', 'f.name', 'cme.feature_name') .leftJoin('features as f', 'f.name', 'cme.feature_name')
.groupBy('cme.app_name', 'cme.environment', 'f.project'); .groupBy('cme.app_name', 'cme.environment', 'f.project');
}) })
.with('instances', (qb) => {
qb.select([
'ci.app_name',
'ci.environment',
this.db.raw(
'COUNT(DISTINCT ci.instance_id) as unique_instance_count',
),
this.db.raw(
'ARRAY_AGG(DISTINCT ci.sdk_version) as sdk_versions',
),
this.db.raw('MAX(ci.last_seen) as latest_last_seen'),
])
.from('client_instances as ci')
.where('ci.app_name', appName)
.groupBy('ci.app_name', 'ci.environment');
})
.select([ .select([
'm.project', 'm.project',
'm.environment', 'm.environment',
'm.features', 'm.features',
'ci.instance_id', 'i.unique_instance_count',
'ci.sdk_version', 'i.sdk_versions',
'ci.last_seen', 'i.latest_last_seen',
'a.strategies', 'ca.strategies',
]) ])
.from({ a: 'client_applications' }) .from('client_applications as ca')
.leftJoin('metrics as m', 'm.app_name', 'a.app_name') .leftJoin('metrics as m', 'm.app_name', 'ca.app_name')
.leftJoin('client_instances as ci', function () { .leftJoin('instances as i', 'i.environment', 'm.environment')
this.on('ci.app_name', '=', 'm.app_name').andOn(
'ci.environment',
'=',
'm.environment',
);
})
.where('a.app_name', appName)
.orderBy('m.environment', 'asc'); .orderBy('m.environment', 'asc');
const rows = await query; const rows = await query;
stopTimer(); stopTimer();
@ -358,9 +368,9 @@ export default class ClientApplicationsStore
const environments = rows.reduce((acc, row) => { const environments = rows.reduce((acc, row) => {
const { const {
environment, environment,
instance_id, unique_instance_count,
sdk_version, sdk_versions,
last_seen, latest_last_seen,
project, project,
features, features,
strategies, strategies,
@ -383,12 +393,9 @@ export default class ClientApplicationsStore
if (!env) { if (!env) {
env = { env = {
name: environment, name: environment,
instanceCount: instance_id ? 1 : 0, instanceCount: Number(unique_instance_count),
sdks: sdk_version ? [sdk_version] : [], sdks: sdk_versions,
lastSeen: last_seen, lastSeen: latest_last_seen,
uniqueInstanceIds: new Set(
instance_id ? [instance_id] : [],
),
issues: { issues: {
missingFeatures: featuresNotMappedToProject missingFeatures: featuresNotMappedToProject
? features ? features
@ -397,25 +404,14 @@ export default class ClientApplicationsStore
}; };
acc.push(env); acc.push(env);
} else { } else {
if (instance_id) {
env.uniqueInstanceIds.add(instance_id);
env.instanceCount = env.uniqueInstanceIds.size;
}
if (featuresNotMappedToProject) { if (featuresNotMappedToProject) {
env.issues.missingFeatures = features; env.issues.missingFeatures = features;
} }
if (sdk_version && !env.sdks.includes(sdk_version)) {
env.sdks.push(sdk_version);
}
if (new Date(last_seen) > new Date(env.lastSeen)) {
env.lastSeen = last_seen;
}
} }
return acc; return acc;
}, []); }, []);
environments.forEach((env) => { environments.forEach((env) => {
delete env.uniqueInstanceIds;
env.sdks.sort(); env.sdks.sort();
}); });