The open and composable observability and data visualization platform. Visualize metrics, logs, and traces from multiple sources like Prometheus, Loki, Elasticsearch, InfluxDB, Postgres and many more.
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
grafana/public/app/core/utils/rangeutil.ts

145 lines
5.0 KiB

///<reference path="../../headers/common.d.ts" />
import moment = require('moment');
import _ = require('lodash');
import angular = require('angular');
10 years ago
import * as dateMath from './datemath';
var spans = {
's': {display: 'second'},
'm': {display: 'minute'},
'h': {display: 'hour'},
'd': {display: 'day'},
'w': {display: 'week'},
'M': {display: 'month'},
'y': {display: 'year'},
};
var rangeOptions = [
{ from: 'now/d', to: 'now/d', display: 'Today', section: 2 },
{ from: 'now/d', to: 'now', display: 'Today so far', section: 2 },
{ from: 'now/w', to: 'now/w', display: 'This week', section: 2 },
{ from: 'now/w', to: 'now', display: 'This week so far', section: 2 },
{ from: 'now/M', to: 'now/M', display: 'This month', section: 2 },
{ from: 'now/y', to: 'now/y', display: 'This year', section: 2 },
{ from: 'now-1d/d', to: 'now-1d/d', display: 'Yesterday', section: 1 },
{ from: 'now-2d/d', to: 'now-2d/d', display: 'Day before yesterday', section: 1 },
{ from: 'now-7d/d', to: 'now-7d/d', display: 'This day last week', section: 1 },
{ from: 'now-1w/w', to: 'now-1w/w', display: 'Previous week', section: 1 },
{ from: 'now-1M/M', to: 'now-1M/M', display: 'Previous month', section: 1 },
{ from: 'now-1y/y', to: 'now-1y/y', display: 'Previous year', section: 1 },
{ from: 'now-5m', to: 'now', display: 'Last 5 minutes', section: 3 },
{ from: 'now-15m', to: 'now', display: 'Last 15 minutes', section: 3 },
{ from: 'now-30m', to: 'now', display: 'Last 30 minutes', section: 3 },
{ from: 'now-1h', to: 'now', display: 'Last 1 hour', section: 3 },
{ from: 'now-3h', to: 'now', display: 'Last 3 hours', section: 3 },
{ from: 'now-6h', to: 'now', display: 'Last 6 hours', section: 3 },
{ from: 'now-12h', to: 'now', display: 'Last 12 hours', section: 3 },
{ from: 'now-24h', to: 'now', display: 'Last 24 hours', section: 3 },
{ from: 'now-7d', to: 'now', display: 'Last 7 days', section: 0 },
{ from: 'now-30d', to: 'now', display: 'Last 30 days', section: 0 },
{ from: 'now-60d', to: 'now', display: 'Last 60 days', section: 0 },
{ from: 'now-90d', to: 'now', display: 'Last 90 days', section: 0 },
{ from: 'now-6M', to: 'now', display: 'Last 6 months', section: 0 },
{ from: 'now-1y', to: 'now', display: 'Last 1 year', section: 0 },
{ from: 'now-2y', to: 'now', display: 'Last 2 years', section: 0 },
{ from: 'now-5y', to: 'now', display: 'Last 5 years', section: 0 },
];
var absoluteFormat = 'MMM D, YYYY HH:mm:ss';
var rangeIndex = {};
_.each(rangeOptions, function (frame) {
rangeIndex[frame.from + ' to ' + frame.to] = frame;
});
10 years ago
export function getRelativeTimesList(timepickerSettings, currentDisplay) {
var groups = _.groupBy(rangeOptions, (option: any) => {
option.active = option.display === currentDisplay;
return option.section;
});
10 years ago
// _.each(timepickerSettings.time_options, (duration: string) => {
// let info = describeTextRange(duration);
// if (info.section) {
// groups[info.section].push(info);
// }
// });
10 years ago
return groups;
}
10 years ago
function formatDate(date) {
return date.format(absoluteFormat);
}
10 years ago
// handles expressions like
// 5m
// 5m to now/d
// now/d to now
// now/d
// if no to <expr> then to now is assumed
export function describeTextRange(expr: any) {
if (expr.indexOf('now') === -1) {
expr = 'now-' + expr;
}
10 years ago
let opt = rangeIndex[expr + ' to now'];
if (opt) {
return opt;
}
10 years ago
opt = {from: expr, to: 'now'};
let parts = /^now-(\d+)(\w)/.exec(expr);
if (parts) {
let unit = parts[2];
let amount = parseInt(parts[1]);
let span = spans[unit];
if (span) {
opt.display = 'Last ' + amount + ' ' + span.display;
opt.section = span.section;
if (amount > 1) {
opt.display += 's';
}
}
10 years ago
} else {
opt.display = opt.from + ' to ' + opt.to;
opt.invalid = true;
}
10 years ago
return opt;
}
10 years ago
export function describeTimeRange(range) {
var option = rangeIndex[range.from.toString() + ' to ' + range.to.toString()];
if (option) {
return option.display;
}
10 years ago
if (moment.isMoment(range.from) && moment.isMoment(range.to)) {
return formatDate(range.from) + ' to ' + formatDate(range.to);
}
10 years ago
if (moment.isMoment(range.from)) {
var toMoment = dateMath.parse(range.to, true);
return formatDate(range.from) + ' to ' + toMoment.fromNow();
}
10 years ago
if (moment.isMoment(range.to)) {
var from = dateMath.parse(range.from, false);
return from.fromNow() + ' to ' + formatDate(range.to);
}
10 years ago
if (range.to.toString() === 'now') {
var res = describeTextRange(range.from);
return res.display;
}
10 years ago
return range.from.toString() + ' to ' + range.to.toString();
}