131 lines
2.6 KiB
JavaScript
Executable File
131 lines
2.6 KiB
JavaScript
Executable File
'use strict';
|
|
|
|
exports.getValueAsString = function getValueString(value) {
|
|
if (Number.isNaN(value)) {
|
|
return 'Nan';
|
|
} else if (!Number.isFinite(value)) {
|
|
if (value < 0) {
|
|
return '-Inf';
|
|
} else {
|
|
return '+Inf';
|
|
}
|
|
} else {
|
|
return `${value}`;
|
|
}
|
|
};
|
|
|
|
exports.removeLabels = function removeLabels(
|
|
hashMap,
|
|
labels,
|
|
sortedLabelNames,
|
|
) {
|
|
const hash = hashObject(labels, sortedLabelNames);
|
|
delete hashMap[hash];
|
|
};
|
|
|
|
exports.setValue = function setValue(hashMap, value, labels) {
|
|
const hash = hashObject(labels);
|
|
hashMap[hash] = {
|
|
value: typeof value === 'number' ? value : 0,
|
|
labels: labels || {},
|
|
};
|
|
return hashMap;
|
|
};
|
|
|
|
exports.setValueDelta = function setValueDelta(
|
|
hashMap,
|
|
deltaValue,
|
|
labels,
|
|
hash = '',
|
|
) {
|
|
const value = typeof deltaValue === 'number' ? deltaValue : 0;
|
|
if (hashMap[hash]) {
|
|
hashMap[hash].value += value;
|
|
} else {
|
|
hashMap[hash] = { value, labels };
|
|
}
|
|
return hashMap;
|
|
};
|
|
|
|
exports.getLabels = function (labelNames, args) {
|
|
if (typeof args[0] === 'object') {
|
|
return args[0];
|
|
}
|
|
|
|
if (labelNames.length !== args.length) {
|
|
throw new Error(
|
|
`Invalid number of arguments (${args.length}): "${args.join(
|
|
', ',
|
|
)}" for label names (${labelNames.length}): "${labelNames.join(', ')}".`,
|
|
);
|
|
}
|
|
|
|
const acc = {};
|
|
for (let i = 0; i < labelNames.length; i++) {
|
|
acc[labelNames[i]] = args[i];
|
|
}
|
|
return acc;
|
|
};
|
|
|
|
function fastHashObject(keys, labels) {
|
|
if (keys.length === 0) {
|
|
return '';
|
|
}
|
|
|
|
let hash = '';
|
|
|
|
for (let i = 0; i < keys.length; i++) {
|
|
const key = keys[i];
|
|
const value = labels[key];
|
|
if (value === undefined) continue;
|
|
|
|
hash += `${key}:${value},`;
|
|
}
|
|
|
|
return hash;
|
|
}
|
|
|
|
function hashObject(labels, labelNames) {
|
|
// We don't actually need a hash here. We just need a string that
|
|
// is unique for each possible labels object and consistent across
|
|
// calls with equivalent labels objects.
|
|
|
|
if (labelNames) {
|
|
return fastHashObject(labelNames, labels);
|
|
}
|
|
|
|
const keys = Object.keys(labels);
|
|
if (keys.length > 1) {
|
|
keys.sort(); // need consistency across calls
|
|
}
|
|
|
|
return fastHashObject(keys, labels);
|
|
}
|
|
exports.hashObject = hashObject;
|
|
|
|
exports.isObject = function isObject(obj) {
|
|
return obj !== null && typeof obj === 'object';
|
|
};
|
|
|
|
exports.nowTimestamp = function nowTimestamp() {
|
|
return Date.now() / 1000;
|
|
};
|
|
|
|
class Grouper extends Map {
|
|
/**
|
|
* Adds the `value` to the `key`'s array of values.
|
|
* @param {*} key Key to set.
|
|
* @param {*} value Value to add to `key`'s array.
|
|
* @returns {undefined} undefined.
|
|
*/
|
|
add(key, value) {
|
|
if (this.has(key)) {
|
|
this.get(key).push(value);
|
|
} else {
|
|
this.set(key, [value]);
|
|
}
|
|
}
|
|
}
|
|
|
|
exports.Grouper = Grouper;
|