1
0
mirror of https://github.com/Unleash/unleash.git synced 2025-11-10 01:19:53 +01:00
unleash.unleash/src/lib/features/metrics/client-metrics/fake-client-metrics-store-v2.ts
Ivar Conradi Østhus d1b9ca00a0
fix: Killwitch to block usage-metrics from non-exiting flag-names (#9266)
Adds a killswitch called "filterExistingFlagNames". When enabled it will
filter out reported SDK metrics and remove all reported metrics for
names that does not match an exiting feature flag in Unleash.

This have proven critical in the rare case of an SDK that start sending
random flag-names back to unleash, and thus filling up the database. At
some point the database will start slowing down due to the noisy data.

In order to not resolve the flagNames all the time we have added a small
cache (10s) for feature flag names. This gives a small delay (10s) from
flag is created until we start allow metrics for the flag when
kill-switch is enabled. We should probably listen to the event-stream
and use that invalidate the cache when a flag is created.
2025-02-09 22:45:44 +01:00

101 lines
2.8 KiB
TypeScript

/* eslint-disable @typescript-eslint/lines-between-class-members */
/* eslint-disable @typescript-eslint/no-unused-vars */
import EventEmitter from 'events';
import type {
IClientMetricsEnv,
IClientMetricsEnvKey,
IClientMetricsStoreV2,
} from './client-metrics-store-v2-type';
export default class FakeClientMetricsStoreV2
extends EventEmitter
implements IClientMetricsStoreV2
{
metrics: IClientMetricsEnv[] = [];
constructor() {
super();
this.setMaxListeners(0);
}
getFeatureFlagNames(): Promise<string[]> {
throw new Error('Method not implemented.');
}
getSeenTogglesForApp(
appName: string,
hoursBack?: number,
): Promise<string[]> {
throw new Error('Method not implemented.');
}
clearMetrics(hoursBack: number): Promise<void> {
return Promise.resolve();
}
clearDailyMetrics(daysBack: number): Promise<void> {
return Promise.resolve();
}
countPreviousDayHourlyMetricsBuckets(): Promise<{
enabledCount: number;
variantCount: number;
}> {
return Promise.resolve({ enabledCount: 0, variantCount: 0 });
}
countPreviousDayMetricsBuckets(): Promise<{
enabledCount: number;
variantCount: number;
}> {
return Promise.resolve({ enabledCount: 0, variantCount: 0 });
}
aggregateDailyMetrics(): Promise<void> {
return Promise.resolve();
}
getSeenAppsForFeatureToggle(
featureName: string,
hoursBack?: number,
): Promise<string[]> {
throw new Error('Method not implemented.');
}
getMetricsForFeatureToggle(
featureName: string,
hoursBack?: number,
): Promise<IClientMetricsEnv[]> {
throw new Error('Method not implemented.');
}
getMetricsForFeatureToggleV2(
featureName: string,
hoursBack?: number,
): Promise<IClientMetricsEnv[]> {
throw new Error('Method not implemented.');
}
batchInsertMetrics(metrics: IClientMetricsEnv[]): Promise<void> {
metrics.forEach((m) => this.metrics.push(m));
return Promise.resolve();
}
get(key: IClientMetricsEnvKey): Promise<IClientMetricsEnv> {
throw new Error('Method not implemented.');
}
getAll(query?: Object): Promise<IClientMetricsEnv[]> {
throw new Error('Method not implemented.');
}
exists(key: IClientMetricsEnvKey): Promise<boolean> {
throw new Error('Method not implemented.');
}
delete(key: IClientMetricsEnvKey): Promise<void> {
throw new Error('Method not implemented.');
}
async getMetricsLastHour(): Promise<[]> {
return Promise.resolve([]);
}
async insert(): Promise<void> {
return Promise.resolve();
}
async deleteAll(): Promise<void> {
return Promise.resolve(undefined);
}
destroy(): void {}
}