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

fix: add user and project counters

This commit is contained in:
Ivar Conradi Østhus 2021-08-27 10:10:14 +02:00
parent 14857b01c8
commit aab4602029
No known key found for this signature in database
GPG Key ID: 31AC596886B0BD09
7 changed files with 58 additions and 9 deletions

View File

@ -231,6 +231,13 @@ class ProjectStore implements IProjectStore {
return [];
}
async count(): Promise<number> {
return this.db
.count('*')
.from(TABLE)
.then((res) => Number(res[0].count));
}
// eslint-disable-next-line @typescript-eslint/explicit-module-boundary-types
private getEnvironment(r: any): IEnvironmentOverview {
return {

View File

@ -176,6 +176,13 @@ class UserStore implements IUserStore {
await this.db(TABLE).del();
}
async count(): Promise<number> {
return this.db
.count('*')
.from(TABLE)
.then((res) => Number(res[0].count));
}
destroy(): void {}
async exists(id: number): Promise<boolean> {

View File

@ -13,7 +13,7 @@ import { IUnleashConfig } from './types/option';
import { IUnleashStores } from './types/stores';
import Timer = NodeJS.Timer;
const THREE_HOURS = 3 * 60 * 60 * 1000;
const TWO_HOURS = 2 * 60 * 60 * 1000;
const ONE_MINUTE = 60 * 1000;
export default class MetricsMonitor {
@ -37,7 +37,13 @@ export default class MetricsMonitor {
return;
}
const { eventStore, clientMetricsStore, featureToggleStore } = stores;
const {
eventStore,
clientMetricsStore,
featureToggleStore,
userStore,
projectStore,
} = stores;
client.collectDefaultMetrics();
@ -68,25 +74,44 @@ export default class MetricsMonitor {
help: 'Number of feature toggles',
labelNames: ['version'],
});
const usersTotal = new client.Gauge({
name: 'users_total',
help: 'Number of users',
});
const projectsTotal = new client.Gauge({
name: 'projects_total',
help: 'Number of projects',
});
async function collectFeatureToggleMetrics() {
featureTogglesTotal.reset();
let togglesCount;
async function collectStaticCounters() {
let togglesCount: number = 0;
let usersCount: number;
let projectsCount: number;
try {
togglesCount = await featureToggleStore.count({
archived: false,
});
usersCount = await userStore.count();
projectsCount = await projectStore.count();
// eslint-disable-next-line no-empty
} catch (e) {}
togglesCount = togglesCount || 0;
featureTogglesTotal.reset();
featureTogglesTotal.labels(version).set(togglesCount);
if (usersCount) {
usersTotal.reset();
usersTotal.set(usersCount);
}
if (projectsCount) {
projectsTotal.reset();
projectsTotal.set(usersCount);
}
}
collectFeatureToggleMetrics();
collectStaticCounters();
this.timer = setInterval(
() => collectFeatureToggleMetrics(),
THREE_HOURS,
() => collectStaticCounters(),
TWO_HOURS,
).unref();
eventBus.on(

View File

@ -31,4 +31,5 @@ export interface IProjectStore extends Store<IProject, string> {
projectId: string,
archived: boolean,
): Promise<IFeatureOverview[]>;
count(): Promise<number>;
}

View File

@ -37,4 +37,5 @@ export interface IUserStore extends Store<IUser, number> {
setPasswordHash(userId: number, passwordHash: string): Promise<void>;
incLoginAttempts(user: IUser): Promise<void>;
successfullyLogin(user: IUser): Promise<void>;
count(): Promise<number>;
}

View File

@ -64,6 +64,10 @@ export default class FakeProjectStore implements IProjectStore {
destroy(): void {}
async count(): Promise<number> {
return this.projects.length;
}
async exists(key: string): Promise<boolean> {
return this.projects.some((p) => p.id === key);
}

View File

@ -38,6 +38,10 @@ class UserStoreMock implements IUserStore {
return this.data.some((u) => u.id === key);
}
async count(): Promise<number> {
return this.data.length;
}
async get(key: number): Promise<IUser> {
return this.data.find((u) => u.id === key);
}