mirror of https://github.com/linkerd/linkerd2.git
103 lines
2.7 KiB
JavaScript
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
|
|
};
|
|
};
|