linkerd2/web/app/js/components/util/MetricUtils.js

103 lines
2.7 KiB
JavaScript

import _ from 'lodash';
const gaugeAccessor = ["datapoints", 0, "value", "gauge"];
const latencyAccessor = ["datapoints", 0, "value", "histogram", "values"];
const convertTs = rawTs => {
return _.map(rawTs, metric => {
return {
timestamp: metric.timestampMs,
value: _.get(metric, "value.gauge")
};
});
};
const convertLatencyTs = rawTs => {
let latencies = _.flatMap(rawTs, metric => {
return _.map(_.get(metric, ["value", "histogram", "values"]), hist => {
return {
timestamp: metric.timestampMs,
value: hist.value,
label: hist.label
};
});
});
// this could be made more efficient by combining this with the map
return _.groupBy(latencies, 'label');
};
export const getPodsByDeployment = pods => {
return _(pods)
.reject(p => _.isEmpty(p.deployment) || p.controlPlane)
.groupBy('deployment')
.map((componentPods, name) => {
return {
name: name,
added: _.every(componentPods, 'added'),
pods: componentPods
};
})
.sortBy('name')
.value();
};
export const processTimeseriesMetrics = (rawTs, targetEntity) => {
let tsbyEntity = _.groupBy(rawTs, "metadata." + targetEntity);
return _.reduce(tsbyEntity, (mem, metrics, entity) => {
mem[entity] = mem[entity] || {};
_.each(metrics, metric => {
if (metric.name !== "LATENCY") {
mem[entity][metric.name] = convertTs(metric.datapoints);
} else {
mem[entity][metric.name] = convertLatencyTs(metric.datapoints);
}
});
return mem;
}, {});
};
export const processRollupMetrics = (rawMetrics, targetEntity) => {
let byEntity = _.groupBy(rawMetrics, "metadata." + targetEntity);
let metrics = _.map(byEntity, (data, entity) => {
if (!entity) return;
let requestRate = 0;
let successRate = 0;
let latency = {};
_.each(data, datum => {
if (datum.name === "REQUEST_RATE") {
requestRate = _.round(_.get(datum, gaugeAccessor, 0), 2);
} else if (datum.name === "SUCCESS_RATE") {
successRate = _.get(datum, gaugeAccessor);
} else if (datum.name === "LATENCY") {
let latencies = _.get(datum, latencyAccessor);
latency = _.reduce(latencies, (mem, ea) => {
mem[ea.label] = _.isNil(ea.value) ? null : parseInt(ea.value, 10);
return mem;
}, {});
}
});
return {
name: entity,
requestRate: requestRate,
successRate: successRate,
latency: latency,
added: true
};
});
return _.compact(_.sortBy(metrics, "name"));
};
export const emptyMetric = (name, added) => {
return {
name: name,
requestRate: null,
successRate: null,
latency: null,
added: added
};
};