Skip to content

Commit

Permalink
feat: Instance stats for export/import (#3121)
Browse files Browse the repository at this point in the history
feat: instance stats for export/import
  • Loading branch information
sjaanus committed Feb 15, 2023
1 parent 8ac834a commit 5574d27
Show file tree
Hide file tree
Showing 8 changed files with 10,084 additions and 110,054 deletions.
10,811 changes: 1,477 additions & 9,334 deletions coverage/clover.xml

Large diffs are not rendered by default.

89,060 changes: 6,034 additions & 83,026 deletions coverage/coverage-final.json

Large diffs are not rendered by default.

20,235 changes: 2,545 additions & 17,690 deletions coverage/lcov.info

Large diffs are not rendered by default.

Expand Up @@ -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) {
Expand Down
Expand Up @@ -17,6 +17,8 @@ interface InstanceStats {
environments: number;
segments: number;
strategies: number;
featureExports: number;
featureImports: number;
SAMLenabled: boolean;
OIDCenabled: boolean;
}
Expand Down
20 changes: 19 additions & 1 deletion src/lib/services/instance-stats-service.ts
@@ -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';
Expand All @@ -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';

Expand All @@ -26,6 +31,8 @@ export interface InstanceStats {
projects: number;
contextFields: number;
roles: number;
featureExports: number;
featureImports: number;
groups: number;
environments: number;
segments: number;
Expand Down Expand Up @@ -60,6 +67,8 @@ export class InstanceStatsService {

private roleStore: IRoleStore;

private eventStore: IEventStore;

private versionService: VersionService;

private settingStore: ISettingStore;
Expand All @@ -83,6 +92,7 @@ export class InstanceStatsService {
roleStore,
settingStore,
clientInstanceStore,
eventStore,
}: Pick<
IUnleashStores,
| 'featureToggleStore'
Expand All @@ -96,6 +106,7 @@ export class InstanceStatsService {
| 'roleStore'
| 'settingStore'
| 'clientInstanceStore'
| 'eventStore'
>,
{ getLogger }: Pick<IUnleashConfig, 'getLogger'>,
versionService: VersionService,
Expand All @@ -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');
}
Expand Down Expand Up @@ -171,6 +183,8 @@ export class InstanceStatsService {
SAMLenabled,
OIDCenabled,
clientApps,
featureExports,
featureImports,
] = await Promise.all([
this.getToggleCount(),
this.userStore.count(),
Expand All @@ -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 {
Expand All @@ -203,6 +219,8 @@ export class InstanceStatsService {
SAMLenabled,
OIDCenabled,
clientApps,
featureExports,
featureImports,
};
}

Expand Down
2 changes: 1 addition & 1 deletion src/lib/types/events.ts
Expand Up @@ -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;
Expand Down
6 changes: 4 additions & 2 deletions src/test/fixtures/fake-event-store.ts
Expand Up @@ -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[];
Expand Down Expand Up @@ -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 {}
Expand Down

0 comments on commit 5574d27

Please sign in to comment.