open-nomad/ui/app/components/stats-time-series.js

Ignoring revisions in .git-blame-ignore-revs. Click here to bypass and see the normal blame view.

70 lines
1.8 KiB
JavaScript
Raw Normal View History

/**
* Copyright (c) HashiCorp, Inc.
* SPDX-License-Identifier: MPL-2.0
*/
import Component from '@glimmer/component';
import moment from 'moment';
import d3TimeFormat from 'd3-time-format';
import d3Format from 'd3-format';
import { scaleTime, scaleLinear } from 'd3-scale';
import d3Array from 'd3-array';
import formatDuration from 'nomad-ui/utils/format-duration';
export default class StatsTimeSeries extends Component {
get xFormat() {
return d3TimeFormat.timeFormat('%H:%M:%S');
}
get yFormat() {
return d3Format.format('.1~%');
}
get useDefaults() {
2021-03-22 06:02:28 +00:00
return !this.args.dataProp;
}
// Specific a11y descriptors
get description() {
const data = this.args.data;
2021-12-28 14:45:20 +00:00
const yRange = d3Array.extent(data, (d) => d.percent);
const xRange = d3Array.extent(data, (d) => d.timestamp);
const yFormatter = this.yFormat;
const duration = formatDuration(xRange[1] - xRange[0], 'ms', true);
return `Time series data for the last ${duration}, with values ranging from ${yFormatter(
yRange[0]
)} to ${yFormatter(yRange[1])}`;
}
xScale(data, yAxisOffset) {
const scale = scaleTime();
2021-12-28 14:45:20 +00:00
const [low, high] = d3Array.extent(data, (d) => d.timestamp);
const minLow = moment(high).subtract(5, 'minutes').toDate();
2018-09-19 23:32:53 +00:00
2021-12-28 16:08:12 +00:00
const extent = data.length
? [Math.min(low, minLow), high]
: [minLow, new Date()];
scale.rangeRound([10, yAxisOffset]).domain(extent);
return scale;
}
yScale(data, xAxisOffset) {
2021-12-28 16:08:12 +00:00
const yValues = (data || []).mapBy(
this.args.dataProp ? 'percentStack' : 'percent'
);
let [low, high] = [0, 1];
if (yValues.compact().length) {
[low, high] = d3Array.extent(yValues);
}
return scaleLinear()
.rangeRound([xAxisOffset, 10])
.domain([Math.min(0, low), Math.max(1, high)]);
}
}