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: '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) {
|
||||||
|
@ -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;
|
||||||
}
|
}
|
||||||
|
@ -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,
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -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;
|
||||||
|
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 { 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 {}
|
||||||
|
Loading…
Reference in New Issue
Block a user