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

feat: instance stats for export/import
pull/3124/head
Jaanus Sellin 1 year ago committed by GitHub
parent 8ac834a1b7
commit 5574d27861
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
  1. 10811
      coverage/clover.xml
  2. 89060
      coverage/coverage-final.json
  3. 20235
      coverage/lcov.info
  4. 2
      frontend/src/component/admin/instance-admin/InstanceStats/InstanceStats.tsx
  5. 2
      frontend/src/hooks/api/getters/useInstanceStats/useInstanceStats.ts
  6. 20
      src/lib/services/instance-stats-service.ts
  7. 2
      src/lib/types/events.ts
  8. 6
      src/test/fixtures/fake-event-store.ts

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

@ -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;

@ -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…
Cancel
Save