unleash-server
Version:
Unleash is an enterprise ready feature flag service. It provides different strategies for handling feature flags.
79 lines • 3.79 kB
JavaScript
import Controller from '../../../routes/controller.js';
import { NONE } from '../../../types/permissions.js';
import { createResponseSchema } from '../../../openapi/util/create-response-schema.js';
import { serializeDates } from '../../../types/serialize-dates.js';
import { featureUsageSchema, } from '../../../openapi/spec/feature-usage-schema.js';
import { featureMetricsSchema, } from '../../../openapi/spec/feature-metrics-schema.js';
import { getStandardResponses } from '../../../openapi/index.js';
class ClientMetricsController extends Controller {
static { this.HOURS_BACK_MIN = 1; }
static { this.HOURS_BACK_MAX = 48; }
static { this.HOURS_BACK_MAX_V2 = 24 * 91; } // 91 days
constructor(config, { clientMetricsServiceV2, openApiService, }) {
super(config);
this.metrics = clientMetricsServiceV2;
this.openApiService = openApiService;
this.flagResolver = config.flagResolver;
this.route({
method: 'get',
path: '/features/:name/raw',
handler: this.getRawToggleMetrics,
permission: NONE,
middleware: [
openApiService.validPath({
operationId: 'getRawFeatureMetrics',
tags: ['Metrics'],
summary: 'Get feature metrics',
description: 'Get usage metrics for a specific feature for the last 48 hours, grouped by hour',
responses: {
200: createResponseSchema('featureMetricsSchema'),
...getStandardResponses(401, 403, 404),
},
}),
],
});
this.route({
method: 'get',
path: '/features/:name',
handler: this.getToggleMetricsSummary,
permission: NONE,
middleware: [
openApiService.validPath({
operationId: 'getFeatureUsageSummary',
tags: ['Metrics'],
summary: `Last hour of usage and a list of applications that have reported seeing this feature flag`,
description: 'Separate counts for yes (enabled), no (disabled), as well as how many times each variant was selected during the last hour',
responses: {
200: createResponseSchema('featureUsageSchema'),
...getStandardResponses(401, 403, 404),
},
}),
],
});
}
async getRawToggleMetrics(req, res) {
const { name } = req.params;
const { hoursBack } = req.query;
const data = await this.metrics.getClientMetricsForToggle(name, this.parseHoursBackQueryParam(hoursBack));
this.openApiService.respondWithValidation(200, res, featureMetricsSchema.$id, { version: 1, maturity: 'stable', data: serializeDates(data) });
}
async getToggleMetricsSummary(req, res) {
const { name } = req.params;
const data = await this.metrics.getFeatureToggleMetricsSummary(name);
this.openApiService.respondWithValidation(200, res, featureUsageSchema.$id, { version: 1, maturity: 'stable', ...serializeDates(data) });
}
parseHoursBackQueryParam(param) {
if (typeof param !== 'string') {
return undefined;
}
const parsed = Number(param);
const max = this.flagResolver.isEnabled('extendedUsageMetrics')
? ClientMetricsController.HOURS_BACK_MAX_V2
: ClientMetricsController.HOURS_BACK_MAX;
if (parsed >= ClientMetricsController.HOURS_BACK_MIN && parsed <= max) {
return parsed;
}
}
}
export default ClientMetricsController;
//# sourceMappingURL=client-metrics.js.map