roach-storm
Version:
Apache Kafka to Google Pub/Sub Gateway, API controlled
101 lines (100 loc) • 3.07 kB
JavaScript
"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;