mirror of
https://github.com/Unleash/unleash.git
synced 2025-10-27 11:02:16 +01:00
* fix: filter empty metrics before we collect last seen toggles. fixes: #2104 * fix: add a last-seen service to batch last-seen toggle updates Co-authored-by: Fredrik Strand Oseberg <fredrik.no@gmail.com>
59 lines
1.8 KiB
TypeScript
59 lines
1.8 KiB
TypeScript
import { secondsToMilliseconds } from 'date-fns';
|
|
import { Logger } from '../../logger';
|
|
import { IUnleashConfig } from '../../server-impl';
|
|
import { IUnleashStores } from '../../types';
|
|
import { IClientMetricsEnv } from '../../types/stores/client-metrics-store-v2';
|
|
import { IFeatureToggleStore } from '../../types/stores/feature-toggle-store';
|
|
|
|
export class LastSeenService {
|
|
private timers: NodeJS.Timeout[] = [];
|
|
|
|
private lastSeenToggles: Set<string> = new Set();
|
|
|
|
private logger: Logger;
|
|
|
|
private featureToggleStore: IFeatureToggleStore;
|
|
|
|
constructor(
|
|
{ featureToggleStore }: Pick<IUnleashStores, 'featureToggleStore'>,
|
|
config: IUnleashConfig,
|
|
lastSeenInterval = secondsToMilliseconds(30),
|
|
) {
|
|
this.featureToggleStore = featureToggleStore;
|
|
this.logger = config.getLogger(
|
|
'/services/client-metrics/last-seen-service.ts',
|
|
);
|
|
|
|
this.timers.push(
|
|
setInterval(() => this.store(), lastSeenInterval).unref(),
|
|
);
|
|
}
|
|
|
|
async store(): Promise<number> {
|
|
const count = this.lastSeenToggles.size;
|
|
if (count > 0) {
|
|
const lastSeenToggles = [...this.lastSeenToggles];
|
|
this.lastSeenToggles = new Set();
|
|
this.logger.debug(
|
|
`Updating last seen for ${lastSeenToggles.length} toggles`,
|
|
);
|
|
await this.featureToggleStore.setLastSeen(lastSeenToggles);
|
|
}
|
|
return count;
|
|
}
|
|
|
|
updateLastSeen(clientMetrics: IClientMetricsEnv[]): void {
|
|
clientMetrics
|
|
.filter(
|
|
(clientMetric) => clientMetric.yes > 0 || clientMetric.no > 0,
|
|
)
|
|
.forEach((clientMetric) =>
|
|
this.lastSeenToggles.add(clientMetric.featureName),
|
|
);
|
|
}
|
|
|
|
destroy(): void {
|
|
this.timers.forEach(clearInterval);
|
|
}
|
|
}
|