UNPKG

inceptum

Version:

hipages take on the foundational library for enterprise-grade apps written in NodeJS

88 lines 4.04 kB
"use strict"; 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