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

feat: Instance stats for export/import (#3121)

feat: instance stats for export/import
This commit is contained in:
Jaanus Sellin 2023-02-15 14:39:16 +02:00 committed by GitHub
parent 8ac834a1b7
commit 5574d27861
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
8 changed files with 9108 additions and 109078 deletions

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

View File

@ -39,6 +39,8 @@ export const InstanceStats: VFC = () => {
{ title: 'Groups', value: stats?.groups }, { title: 'Groups', value: stats?.groups },
{ title: 'Context fields', value: stats?.contextFields }, { title: 'Context fields', value: stats?.contextFields },
{ title: 'Strategies', value: stats?.strategies }, { title: 'Strategies', value: stats?.strategies },
{ title: 'Feature exports', value: stats?.featureExports },
{ title: 'Feature imports', value: stats?.featureImports },
]; ];
if (stats?.versionEnterprise) { if (stats?.versionEnterprise) {

View File

@ -17,6 +17,8 @@ interface InstanceStats {
environments: number; environments: number;
segments: number; segments: number;
strategies: number; strategies: number;
featureExports: number;
featureImports: number;
SAMLenabled: boolean; SAMLenabled: boolean;
OIDCenabled: boolean; OIDCenabled: boolean;
} }

View File

@ -1,7 +1,11 @@
import { sha256 } from 'js-sha256'; import { sha256 } from 'js-sha256';
import { Logger } from '../logger'; import { Logger } from '../logger';
import { IUnleashConfig } from '../types/option'; import { IUnleashConfig } from '../types/option';
import { IClientInstanceStore, IUnleashStores } from '../types/stores'; import {
IClientInstanceStore,
IEventStore,
IUnleashStores,
} from '../types/stores';
import { IContextFieldStore } from '../types/stores/context-field-store'; import { IContextFieldStore } from '../types/stores/context-field-store';
import { IEnvironmentStore } from '../types/stores/environment-store'; import { IEnvironmentStore } from '../types/stores/environment-store';
import { IFeatureToggleStore } from '../types/stores/feature-toggle-store'; import { IFeatureToggleStore } from '../types/stores/feature-toggle-store';
@ -13,6 +17,7 @@ import { ISegmentStore } from '../types/stores/segment-store';
import { IRoleStore } from '../types/stores/role-store'; import { IRoleStore } from '../types/stores/role-store';
import VersionService from './version-service'; import VersionService from './version-service';
import { ISettingStore } from '../types/stores/settings-store'; import { ISettingStore } from '../types/stores/settings-store';
import { FEATURES_EXPORTED, FEATURES_IMPORTED } from '../types';
type TimeRange = 'allTime' | '30d' | '7d'; type TimeRange = 'allTime' | '30d' | '7d';
@ -26,6 +31,8 @@ export interface InstanceStats {
projects: number; projects: number;
contextFields: number; contextFields: number;
roles: number; roles: number;
featureExports: number;
featureImports: number;
groups: number; groups: number;
environments: number; environments: number;
segments: number; segments: number;
@ -60,6 +67,8 @@ export class InstanceStatsService {
private roleStore: IRoleStore; private roleStore: IRoleStore;
private eventStore: IEventStore;
private versionService: VersionService; private versionService: VersionService;
private settingStore: ISettingStore; private settingStore: ISettingStore;
@ -83,6 +92,7 @@ export class InstanceStatsService {
roleStore, roleStore,
settingStore, settingStore,
clientInstanceStore, clientInstanceStore,
eventStore,
}: Pick< }: Pick<
IUnleashStores, IUnleashStores,
| 'featureToggleStore' | 'featureToggleStore'
@ -96,6 +106,7 @@ export class InstanceStatsService {
| 'roleStore' | 'roleStore'
| 'settingStore' | 'settingStore'
| 'clientInstanceStore' | 'clientInstanceStore'
| 'eventStore'
>, >,
{ getLogger }: Pick<IUnleashConfig, 'getLogger'>, { getLogger }: Pick<IUnleashConfig, 'getLogger'>,
versionService: VersionService, versionService: VersionService,
@ -111,6 +122,7 @@ export class InstanceStatsService {
this.roleStore = roleStore; this.roleStore = roleStore;
this.versionService = versionService; this.versionService = versionService;
this.settingStore = settingStore; this.settingStore = settingStore;
this.eventStore = eventStore;
this.clientInstanceStore = clientInstanceStore; this.clientInstanceStore = clientInstanceStore;
this.logger = getLogger('services/stats-service.js'); this.logger = getLogger('services/stats-service.js');
} }
@ -171,6 +183,8 @@ export class InstanceStatsService {
SAMLenabled, SAMLenabled,
OIDCenabled, OIDCenabled,
clientApps, clientApps,
featureExports,
featureImports,
] = await Promise.all([ ] = await Promise.all([
this.getToggleCount(), this.getToggleCount(),
this.userStore.count(), this.userStore.count(),
@ -184,6 +198,8 @@ export class InstanceStatsService {
this.hasSAML(), this.hasSAML(),
this.hasOIDC(), this.hasOIDC(),
this.getLabeledAppCounts(), this.getLabeledAppCounts(),
this.eventStore.filteredCount({ type: FEATURES_EXPORTED }),
this.eventStore.filteredCount({ type: FEATURES_IMPORTED }),
]); ]);
return { return {
@ -203,6 +219,8 @@ export class InstanceStatsService {
SAMLenabled, SAMLenabled,
OIDCenabled, OIDCenabled,
clientApps, clientApps,
featureExports,
featureImports,
}; };
} }

View File

@ -104,8 +104,8 @@ export const FEATURE_FAVORITED = 'feature-favorited';
export const FEATURE_UNFAVORITED = 'feature-unfavorited'; export const FEATURE_UNFAVORITED = 'feature-unfavorited';
export const PROJECT_FAVORITED = 'project-favorited'; export const PROJECT_FAVORITED = 'project-favorited';
export const PROJECT_UNFAVORITED = 'project-unfavorited'; export const PROJECT_UNFAVORITED = 'project-unfavorited';
export const FEATURES_EXPORTED = 'features-exported'; export const FEATURES_EXPORTED = 'features-exported';
export const FEATURES_IMPORTED = 'features-imported';
export interface IBaseEvent { export interface IBaseEvent {
type: string; type: string;

View File

@ -2,6 +2,7 @@ import { IEventStore } from '../../lib/types/stores/event-store';
import { IEvent } from '../../lib/types/events'; import { IEvent } from '../../lib/types/events';
import { AnyEventEmitter } from '../../lib/util/anyEventEmitter'; import { AnyEventEmitter } from '../../lib/util/anyEventEmitter';
import { IQueryOperations } from 'lib/db/event-store'; import { IQueryOperations } from 'lib/db/event-store';
import { SearchEventsSchema } from '../../lib/openapi';
class FakeEventStore extends AnyEventEmitter implements IEventStore { class FakeEventStore extends AnyEventEmitter implements IEventStore {
events: IEvent[]; events: IEvent[];
@ -45,8 +46,9 @@ class FakeEventStore extends AnyEventEmitter implements IEventStore {
return Promise.resolve(this.events.length); return Promise.resolve(this.events.length);
} }
filteredCount(): Promise<number> { // eslint-disable-next-line @typescript-eslint/no-unused-vars
throw new Error('Method not implemented'); filteredCount(search: SearchEventsSchema): Promise<number> {
return Promise.resolve(0);
} }
destroy(): void {} destroy(): void {}