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:
parent
8ac834a1b7
commit
5574d27861
10855
coverage/clover.xml
10855
coverage/clover.xml
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
20183
coverage/lcov.info
20183
coverage/lcov.info
File diff suppressed because it is too large
Load Diff
@ -39,6 +39,8 @@ export const InstanceStats: VFC = () => {
|
||||
{ title: 'Groups', value: stats?.groups },
|
||||
{ title: 'Context fields', value: stats?.contextFields },
|
||||
{ title: 'Strategies', value: stats?.strategies },
|
||||
{ title: 'Feature exports', value: stats?.featureExports },
|
||||
{ title: 'Feature imports', value: stats?.featureImports },
|
||||
];
|
||||
|
||||
if (stats?.versionEnterprise) {
|
||||
|
@ -17,6 +17,8 @@ interface InstanceStats {
|
||||
environments: number;
|
||||
segments: number;
|
||||
strategies: number;
|
||||
featureExports: number;
|
||||
featureImports: number;
|
||||
SAMLenabled: boolean;
|
||||
OIDCenabled: boolean;
|
||||
}
|
||||
|
@ -1,7 +1,11 @@
|
||||
import { sha256 } from 'js-sha256';
|
||||
import { Logger } from '../logger';
|
||||
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 { IEnvironmentStore } from '../types/stores/environment-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 VersionService from './version-service';
|
||||
import { ISettingStore } from '../types/stores/settings-store';
|
||||
import { FEATURES_EXPORTED, FEATURES_IMPORTED } from '../types';
|
||||
|
||||
type TimeRange = 'allTime' | '30d' | '7d';
|
||||
|
||||
@ -26,6 +31,8 @@ export interface InstanceStats {
|
||||
projects: number;
|
||||
contextFields: number;
|
||||
roles: number;
|
||||
featureExports: number;
|
||||
featureImports: number;
|
||||
groups: number;
|
||||
environments: number;
|
||||
segments: number;
|
||||
@ -60,6 +67,8 @@ export class InstanceStatsService {
|
||||
|
||||
private roleStore: IRoleStore;
|
||||
|
||||
private eventStore: IEventStore;
|
||||
|
||||
private versionService: VersionService;
|
||||
|
||||
private settingStore: ISettingStore;
|
||||
@ -83,6 +92,7 @@ export class InstanceStatsService {
|
||||
roleStore,
|
||||
settingStore,
|
||||
clientInstanceStore,
|
||||
eventStore,
|
||||
}: Pick<
|
||||
IUnleashStores,
|
||||
| 'featureToggleStore'
|
||||
@ -96,6 +106,7 @@ export class InstanceStatsService {
|
||||
| 'roleStore'
|
||||
| 'settingStore'
|
||||
| 'clientInstanceStore'
|
||||
| 'eventStore'
|
||||
>,
|
||||
{ getLogger }: Pick<IUnleashConfig, 'getLogger'>,
|
||||
versionService: VersionService,
|
||||
@ -111,6 +122,7 @@ export class InstanceStatsService {
|
||||
this.roleStore = roleStore;
|
||||
this.versionService = versionService;
|
||||
this.settingStore = settingStore;
|
||||
this.eventStore = eventStore;
|
||||
this.clientInstanceStore = clientInstanceStore;
|
||||
this.logger = getLogger('services/stats-service.js');
|
||||
}
|
||||
@ -171,6 +183,8 @@ export class InstanceStatsService {
|
||||
SAMLenabled,
|
||||
OIDCenabled,
|
||||
clientApps,
|
||||
featureExports,
|
||||
featureImports,
|
||||
] = await Promise.all([
|
||||
this.getToggleCount(),
|
||||
this.userStore.count(),
|
||||
@ -184,6 +198,8 @@ export class InstanceStatsService {
|
||||
this.hasSAML(),
|
||||
this.hasOIDC(),
|
||||
this.getLabeledAppCounts(),
|
||||
this.eventStore.filteredCount({ type: FEATURES_EXPORTED }),
|
||||
this.eventStore.filteredCount({ type: FEATURES_IMPORTED }),
|
||||
]);
|
||||
|
||||
return {
|
||||
@ -203,6 +219,8 @@ export class InstanceStatsService {
|
||||
SAMLenabled,
|
||||
OIDCenabled,
|
||||
clientApps,
|
||||
featureExports,
|
||||
featureImports,
|
||||
};
|
||||
}
|
||||
|
||||
|
@ -104,8 +104,8 @@ export const FEATURE_FAVORITED = 'feature-favorited';
|
||||
export const FEATURE_UNFAVORITED = 'feature-unfavorited';
|
||||
export const PROJECT_FAVORITED = 'project-favorited';
|
||||
export const PROJECT_UNFAVORITED = 'project-unfavorited';
|
||||
|
||||
export const FEATURES_EXPORTED = 'features-exported';
|
||||
export const FEATURES_IMPORTED = 'features-imported';
|
||||
|
||||
export interface IBaseEvent {
|
||||
type: string;
|
||||
|
6
src/test/fixtures/fake-event-store.ts
vendored
6
src/test/fixtures/fake-event-store.ts
vendored
@ -2,6 +2,7 @@ import { IEventStore } from '../../lib/types/stores/event-store';
|
||||
import { IEvent } from '../../lib/types/events';
|
||||
import { AnyEventEmitter } from '../../lib/util/anyEventEmitter';
|
||||
import { IQueryOperations } from 'lib/db/event-store';
|
||||
import { SearchEventsSchema } from '../../lib/openapi';
|
||||
|
||||
class FakeEventStore extends AnyEventEmitter implements IEventStore {
|
||||
events: IEvent[];
|
||||
@ -45,8 +46,9 @@ class FakeEventStore extends AnyEventEmitter implements IEventStore {
|
||||
return Promise.resolve(this.events.length);
|
||||
}
|
||||
|
||||
filteredCount(): Promise<number> {
|
||||
throw new Error('Method not implemented');
|
||||
// eslint-disable-next-line @typescript-eslint/no-unused-vars
|
||||
filteredCount(search: SearchEventsSchema): Promise<number> {
|
||||
return Promise.resolve(0);
|
||||
}
|
||||
|
||||
destroy(): void {}
|
||||
|
Loading…
Reference in New Issue
Block a user