forked from prometheus/client_js
-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathcounter.js
More file actions
102 lines (87 loc) · 2.19 KB
/
Copy pathcounter.js
File metadata and controls
102 lines (87 loc) · 2.19 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
/**
* Counter metric
*/
'use strict';
const util = require('util');
const type = 'counter';
const { hashObject, isObject, getLabels, removeLabels } = require('./util');
const { validateLabel } = require('./validation');
const { Metric } = require('./metric');
class Counter extends Metric {
/**
* Increment counter
* @param {object} labels - What label you want to be incremented
* @param {Number} value - Value to increment, if omitted increment with 1
* @returns {void}
*/
inc(labels, value) {
if (!isObject(labels)) {
return inc.call(this, null)(labels, value);
}
const hash = hashObject(labels);
return inc.call(this, labels, hash)(value);
}
/**
* Reset counter
* @returns {void}
*/
reset() {
return reset.call(this);
}
async get() {
if (this.collect) {
const v = this.collect();
if (v instanceof Promise) await v;
}
return {
help: this.help,
name: this.name,
type,
values: Object.values(this.hashMap),
aggregator: this.aggregator,
};
}
labels() {
const labels = getLabels(this.labelNames, arguments) || {};
validateLabel(this.labelNames, labels);
const hash = hashObject(labels);
return {
inc: inc.call(this, labels, hash),
};
}
remove() {
const labels = getLabels(this.labelNames, arguments) || {};
validateLabel(this.labelNames, labels);
return removeLabels.call(this, this.hashMap, labels);
}
}
const reset = function () {
this.hashMap = {};
if (this.labelNames.length === 0) {
this.hashMap = setValue({}, 0);
}
};
const inc = function (labels, hash) {
return value => {
if (value && !Number.isFinite(value)) {
throw new TypeError(`Value is not a valid number: ${util.format(value)}`);
}
if (value < 0) {
throw new Error('It is not possible to decrease a counter');
}
labels = labels || {};
validateLabel(this.labelNames, labels);
const incValue = value === null || value === undefined ? 1 : value;
this.hashMap = setValue(this.hashMap, incValue, labels, hash);
};
};
function setValue(hashMap, value, labels, hash) {
hash = hash || '';
if (hashMap[hash]) {
hashMap[hash].value += value;
} else {
hashMap[hash] = { value, labels: labels || {} };
}
return hashMap;
}
module.exports = Counter;