mirror of
https://github.com/Unleash/unleash.git
synced 2025-11-10 01:19:53 +01:00
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.
101 lines
2.8 KiB
TypeScript
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 {}
|
|
}
|