UNPKG

unleash-server

Version:

Unleash is an enterprise ready feature flag service. It provides different strategies for handling feature flags.

122 lines 4.85 kB
import { Parser } from 'json2csv'; import Controller from '../controller.js'; import { NONE } from '../../types/permissions.js'; import { createCsvResponseSchema, createResponseSchema, } from '../../openapi/util/create-response-schema.js'; import { serializeDates } from '../../types/index.js'; class InstanceAdminController extends Controller { constructor(config, { instanceStatsService, openApiService, }) { super(config); this.jsonCsvParser = new Parser(); this.openApiService = openApiService; this.instanceStatsService = instanceStatsService; this.route({ method: 'get', path: '/statistics/csv', handler: this.getStatisticsCSV, permission: NONE, middleware: [ openApiService.validPath({ tags: ['Instance Admin'], summary: 'Instance usage statistics', description: 'Provides statistics about various features of Unleash to allow for reporting of usage for self-hosted customers. The response contains data such as the number of users, groups, features, strategies, versions, etc.', operationId: 'getInstanceAdminStatsCsv', responses: { 200: createCsvResponseSchema('instanceAdminStatsSchemaCsv', this.jsonCsvParser.parse(this.instanceStatsExample())), }, }), ], }); this.route({ method: 'get', path: '/statistics', handler: this.getStatistics, permission: NONE, middleware: [ openApiService.validPath({ tags: ['Instance Admin'], operationId: 'getInstanceAdminStats', summary: 'Instance usage statistics', description: 'Provides statistics about various features of Unleash to allow for reporting of usage for self-hosted customers. The response contains data such as the number of users, groups, features, strategies, versions, etc.', responses: { 200: createResponseSchema('instanceAdminStatsSchema'), }, }), ], }); } instanceStatsExample() { return { OIDCenabled: true, SAMLenabled: false, passwordAuthEnabled: true, SCIMenabled: false, clientApps: [ { range: 'allTime', count: 15 }, { range: '30d', count: 9 }, { range: '7d', count: 5 }, ], contextFields: 6, environments: 2, featureExports: 0, featureImports: 0, featureToggles: 29, archivedFeatureToggles: 10, groups: 3, instanceId: 'ed3861ae-78f9-4e8c-8e57-b57efc15f82b', projects: 4, roles: 5, customRootRoles: 2, customRootRolesInUse: 1, segments: 2, strategies: 8, sum: 'some-sha256-hash', timestamp: new Date(2023, 6, 12, 10, 0, 0, 0), users: 10, licensedUsers: 12, serviceAccounts: 2, apiTokens: new Map([]), versionEnterprise: '5.1.7', versionOSS: '5.1.7', activeUsers: { last90: 15, last60: 12, last30: 10, last7: 5, }, productionChanges: { last30: 100, last60: 200, last90: 200, }, previousDayMetricsBucketsCount: { variantCount: 100, enabledCount: 200, }, maxEnvironmentStrategies: 20, maxConstraints: 17, maxConstraintValues: 123, }; } serializeStats(instanceStats) { const apiTokensObj = Object.fromEntries(instanceStats.apiTokens.entries()); return serializeDates({ ...instanceStats, apiTokens: apiTokensObj, }); } async getStatistics(_, res) { const instanceStats = await this.instanceStatsService.getSignedStats(); res.json(this.serializeStats(instanceStats)); } async getStatisticsCSV(_, res) { const instanceStats = await this.instanceStatsService.getSignedStats(); const fileName = `unleash-${instanceStats.instanceId}-${Date.now()}.csv`; const json2csvParser = new Parser(); const csv = json2csvParser.parse(this.serializeStats(instanceStats)); res.contentType('csv'); res.attachment(fileName); res.send(csv); } } export default InstanceAdminController; //# sourceMappingURL=instance-admin.js.map