inceptum
Version:
hipages take on the foundational library for enterprise-grade apps written in NodeJS
88 lines • 4.04 kB
JavaScript
;
Object.defineProperty(exports, "__esModule", { value: true });
const prometheus = require("prom-client");
const PreinstantiatedSingletonDefinition_1 = require("../ioc/objectdefinition/PreinstantiatedSingletonDefinition");
const LogManager_1 = require("../log/LogManager");
const logger = LogManager_1.LogManager.getLogger(__filename);
class MetricsServiceInternal {
constructor() {
this.counterCache = new Map();
this.gaugeCache = new Map();
this.histogramCache = new Map();
}
// tslint:disable-next-line:prefer-function-over-method
getOrCreate(map, name, creator) {
if (map.has(name)) {
return map.get(name);
}
const metric = creator();
map.set(name, metric);
return metric;
}
counter(metricName, labels = [], metricHelp) {
return this.getOrCreate(this.counterCache, `Counter:${metricName}:${labels.join(';')}`, () => new prometheus.Counter(metricName, metricHelp || metricName, labels));
}
gauge(metricName, labels = [], metricHelp) {
return this.getOrCreate(this.gaugeCache, `Gauge:${metricName}:${labels.join(';')}`, () => new prometheus.Gauge(metricName, metricHelp || metricName, labels));
}
/**
* Get a histogram to update
* @param metricName
* @param labels
* @param metricHelp
* @return {Summary}
*/
histogram(metricName, labels = [], metricHelp) {
return this.getOrCreate(this.histogramCache, `Histogram:${metricName}:${labels.join(';')}`, () => new prometheus.Summary(metricName, metricHelp || metricName, labels, {
percentiles: [0.5, 0.75, 0.9, 0.99, 0.999],
}));
}
}
exports.MetricsServiceInternal = MetricsServiceInternal;
exports.MetricsService = new MetricsServiceInternal();
class MetricsManager {
static setup(appName, context) {
const defaultMetrics = prometheus.defaultMetrics;
// Skip `osMemoryHeap` probe, and probe every 5th second.
const defaultInterval = defaultMetrics(['osMemoryHeap'], 10000);
process.on('exit', () => { clearInterval(defaultInterval); });
if (context.hasConfig('metrics.gateway') &&
context.hasConfig('metrics.gateway.active') &&
context.getConfig('metrics.gateway.active')) {
const gateway = new prometheus.Pushgateway(context.getConfig('metrics.gateway.hostport'));
const tags = {
jobName: 'msPush',
appName,
};
const interval = setInterval(() => {
gateway.pushAdd(tags, (err) => {
if (err) {
logger.error({ err }, `There was an error pushing stats to the metrics gateway: ${context.getConfig('metrics.gateway.hostport')}`);
}
});
});
process.on('exit', () => {
clearInterval(interval);
gateway.pushAdd(tags, (err) => {
if (err) {
logger.error({ err }, 'There was an error trying to push stats one last time. Will try to delete anyway');
}
gateway.delete(tags, (err2) => {
if (err2) {
logger.error({ err2 }, `There was an error deleting stats for ${JSON.stringify(tags)} ` +
`from the metrics gateway: ${context.getConfig('metrics.gateway.hostport')}`);
}
});
});
});
}
}
static registerSingletons(appName, context) {
MetricsManager.setup(appName, context);
// eslint-disable-next-line no-use-before-define
context.registerDefinition(new PreinstantiatedSingletonDefinition_1.PreinstantiatedSingletonDefinition(exports.MetricsService, 'MetricsService'));
}
}
exports.MetricsManager = MetricsManager;
// module.exports = { MetricsManager, MetricsService: SINGLETON };
//# sourceMappingURL=Metrics.js.map