UNPKG

roach-storm

Version:

Apache Kafka to Google Pub/Sub Gateway, API controlled

101 lines (100 loc) 3.07 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); const promClient = require("prom-client"); const promDefaultMetrics = promClient.collectDefaultMetrics; const promRegistry = promClient.Registry; const UNDERSCORE_REGEX = /-/g; class Metrics { constructor(prefix = "", defaultCounterLabels = [], defaultGaugeLabels = []) { this.prefix = prefix; this.defaultCounterLabels = defaultCounterLabels; this.defaultGaugeLabels = defaultGaugeLabels; this.register = new promRegistry(); this.metrics = {}; } exportType() { return this.register.contentType; } exportMetrics() { return this.register.metrics(); } getRegister() { return this.register; } cleanMetricName(name) { return name.replace(UNDERSCORE_REGEX, "_"); } cleanLabels(labels) { Object.keys(labels).forEach((labelName) => { labels[labelName] = this.cleanMetricName(labels[labelName]); }); return labels; } getCounter(key) { if (this.metrics[key]) { return this.metrics[key]; } this.metrics[key] = new promClient.Counter({ name: `${key}`, help: `${key}_help`, registers: [this.register], labelNames: [...[], ...this.defaultCounterLabels], }); return this.metrics[key]; } getGauge(key) { // prefix key = `${key}_gauge`; if (this.metrics[key]) { return this.metrics[key]; } this.metrics[key] = new promClient.Gauge({ name: `${key}`, help: `${key}_help`, registers: [this.register], labelNames: [...[], ...this.defaultGaugeLabels], }); return this.metrics[key]; } inc(key, val = 1, labels = {}) { key = this.cleanMetricName(key); const prefix = this.prefix; const fullKey = prefix ? `${prefix}_${key}` : key; try { const counter = this.getCounter(fullKey); counter.inc(this.cleanLabels(labels), val, Date.now()); } catch (error) { // empty } } set(key, val, labels = {}) { if (val === null || val === undefined) { throw new Error(`Please provide value on set ${key}`); } key = this.cleanMetricName(key); const prefix = this.prefix; const fullKey = prefix ? `${prefix}_${key}` : key; try { const gauge = this.getGauge(fullKey); gauge.set(this.cleanLabels(labels), val, Date.now()); } catch (error) { // empty } } registerDefault() { this.defaultMetricsIntv = promDefaultMetrics({ register: this.register, timeout: 5000, }); } close() { if (this.defaultMetricsIntv) { clearInterval(this.defaultMetricsIntv); } this.metrics = {}; this.register.clear(); } } exports.Metrics = Metrics;