Windshaft-cartodb/lib/api/middlewares/pubsub-metrics.js

79 lines
1.8 KiB
JavaScript
Raw Normal View History

'use strict';
const EVENT_VERSION = '1';
2020-02-26 20:24:46 +08:00
const MAX_LENGTH = 100;
function pubSubMetrics ({ enabled, metricsBackend }) {
if (!enabled) {
return function pubSubMetricsDisabledMiddleware (req, res, next) {
next();
};
}
return function pubSubMetricsMiddleware (req, res, next) {
res.on('finish', () => {
const { event, attributes } = getEventData(req, res);
if (event) {
metricsBackend.send(event, attributes);
}
});
return next();
};
}
function getEventData (req, res) {
2020-02-26 20:24:46 +08:00
const event = normalizedField(req.get('Carto-Event'));
const eventSource = normalizedField(req.get('Carto-Event-Source'));
const eventGroupId = normalizedField(req.get('Carto-Event-Group-Id'));
if (!event || !eventSource) {
return { event: undefined, attributes: undefined };
}
const attributes = {
event_source: eventSource,
user_id: res.locals.userId,
response_code: res.statusCode.toString(),
source_domain: req.hostname,
event_time: new Date().toISOString(),
event_version: EVENT_VERSION
};
if (eventGroupId) {
attributes.event_group_id = eventGroupId;
}
const responseTime = getResponseTime(res);
if (responseTime) {
attributes.response_time = responseTime.toString();
}
return { event, attributes };
}
2020-02-26 20:24:46 +08:00
function normalizedField (field) {
2020-02-27 00:41:41 +08:00
if (!field) {
return undefined;
}
2020-02-27 00:44:53 +08:00
2020-02-26 21:50:41 +08:00
return field.toString().trim().substr(0, MAX_LENGTH);
2020-02-26 20:24:46 +08:00
}
function getResponseTime (res) {
const profiler = res.get('X-Tiler-Profiler');
let stats;
try {
stats = JSON.parse(profiler);
} catch (e) {
return undefined;
}
return stats.total;
}
module.exports = pubSubMetrics;