@opencensus/core
Version:
OpenCensus is a toolkit for collecting application performance and behavior data.
140 lines • 5.75 kB
JavaScript
;
/**
* Copyright 2018, OpenCensus Authors
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
Object.defineProperty(exports, "__esModule", { value: true });
exports.DerivedGauge = void 0;
const time_util_1 = require("../../common/time-util");
const validations_1 = require("../../common/validations");
const util = require("../utils");
/**
* DerivedGauge metric
*/
class DerivedGauge {
/**
* Constructs a new DerivedGauge instance.
*
* @param name The name of the metric.
* @param description The description of the metric.
* @param unit The unit of the metric.
* @param type The type of metric.
* @param labelKeys The list of the label keys.
* @param constantLabels The map of constant labels for the Metric.
*/
constructor(name, description, unit, type, labelKeys, constantLabels) {
this.constantLabels = constantLabels;
this.registeredPoints = new Map();
this.labelKeysLength = labelKeys.length;
const keysAndConstantKeys = [...labelKeys, ...constantLabels.keys()];
this.constantLabelValues = [...constantLabels.values()];
this.metricDescriptor = {
name,
description,
unit,
type,
labelKeys: keysAndConstantKeys,
};
}
/**
* Creates a TimeSeries. The value of a single point in the TimeSeries is
* observed from a obj or a function. The ValueExtractor is invoked whenever
* metrics are collected, meaning the reported value is up-to-date.
*
* @param labelValues The list of the label values.
* @param objOrFn obj The obj to get the size or length or value from. If
* multiple options are available, the value (ToValueInterface) takes
* precedence first, followed by length and size. e.g value -> length ->
* size.
* fn is the function that will be called to get the current value
* of the gauge.
*/
createTimeSeries(labelValues, objOrFn) {
validations_1.validateArrayElementsNotNull(validations_1.validateNotNull(labelValues, DerivedGauge.LABEL_VALUES), DerivedGauge.LABEL_VALUE);
validations_1.validateNotNull(objOrFn, DerivedGauge.OBJECT);
const hash = util.hashLabelValues(labelValues);
if (this.registeredPoints.has(hash)) {
throw new Error(DerivedGauge.ERROR_MESSAGE_DUPLICATE_TIME_SERIES);
}
if (this.labelKeysLength !== labelValues.length) {
throw new Error(DerivedGauge.ERROR_MESSAGE_INVALID_SIZE);
}
if (objOrFn instanceof Function) {
this.extractor = objOrFn;
}
else if (util.isToValueInterface(objOrFn)) {
this.extractor = () => objOrFn.getValue();
}
else if (util.isLengthAttributeInterface(objOrFn)) {
this.extractor = () => objOrFn.length;
}
else if (util.isLengthMethodInterface(objOrFn)) {
this.extractor = () => objOrFn.length();
}
else if (util.isSizeAttributeInterface(objOrFn)) {
this.extractor = () => objOrFn.size;
}
else if (util.isSizeMethodInterface(objOrFn)) {
this.extractor = () => objOrFn.size();
}
else {
throw new Error(DerivedGauge.ERROR_MESSAGE_UNKNOWN_INTERFACE);
}
this.registeredPoints.set(hash, { labelValues, extractor: this.extractor });
}
/**
* Removes the TimeSeries from the gauge metric, if it is present. i.e.
* references to previous Point objects are invalid (not part of the
* metric).
*
* @param labelValues The list of label values.
*/
removeTimeSeries(labelValues) {
validations_1.validateNotNull(labelValues, DerivedGauge.LABEL_VALUES);
this.registeredPoints.delete(util.hashLabelValues(labelValues));
}
/**
* Removes all TimeSeries from the gauge metric. i.e. references to all
* previous Point objects are invalid (not part of the metric).
*/
clear() {
this.registeredPoints.clear();
}
/**
* Provides a Metric with one or more TimeSeries.
*
* @returns The Metric, or null if TimeSeries is not present in Metric.
*/
getMetric() {
if (this.registeredPoints.size === 0) {
return null;
}
const timestamp = time_util_1.getTimestampWithProcessHRTime();
return {
descriptor: this.metricDescriptor,
timeseries: Array.from(this.registeredPoints, ([_, gaugeEntry]) => ({
labelValues: [...gaugeEntry.labelValues, ...this.constantLabelValues],
points: [{ value: gaugeEntry.extractor(), timestamp }],
})),
};
}
}
exports.DerivedGauge = DerivedGauge;
DerivedGauge.LABEL_VALUE = 'labelValue';
DerivedGauge.LABEL_VALUES = 'labelValues';
DerivedGauge.OBJECT = 'obj';
DerivedGauge.ERROR_MESSAGE_INVALID_SIZE = "Label Keys and Label Values don't have same size";
DerivedGauge.ERROR_MESSAGE_DUPLICATE_TIME_SERIES = 'A different time series with the same labels already exists.';
DerivedGauge.ERROR_MESSAGE_UNKNOWN_INTERFACE = 'Unknown interface/object type';
//# sourceMappingURL=derived-gauge.js.map