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

161 lines
4.9 KiB

///<reference path="../../headers/common.d.ts" />
import _ from "lodash";
import moment from "moment";
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/M", to: "now", display: "This month so far", section: 2 },
{ from: "now/y", to: "now/y", display: "This year", section: 2 },
{ from: "now/y", to: "now", display: "This year so far", 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-2d", to: "now", display: "Last 2 days", section: 0 },
{ from: "now-7d", to: "now", display: "Last 7 days", section: 0 },
{ from: "now-30d", to: "now", display: "Last 30 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;
});
export function getRelativeTimesList(timepickerSettings, currentDisplay) {
10 years ago
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) {
let isLast = expr.indexOf("+") !== 0;
if (expr.indexOf("now") === -1) {
expr = (isLast ? "now-" : "now") + expr;
10 years ago
}
let opt = rangeIndex[expr + " to now"];
10 years ago
if (opt) {
return opt;
}
if (isLast) {
opt = { from: expr, to: "now" };
} else {
opt = { from: "now", to: expr };
}
10 years ago
let parts = /^now([-+])(\d+)(\w)/.exec(expr);
10 years ago
if (parts) {
let unit = parts[3];
let amount = parseInt(parts[2]);
10 years ago
let span = spans[unit];
if (span) {
opt.display = isLast ? "Last " : "Next ";
opt.display += amount + " " + span.display;
10 years ago
opt.section = span.section;
if (amount > 1) {
opt.display += "s";
}
}
10 years ago
} else {
opt.display = opt.from + " to " + opt.to;
10 years ago
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()];
10 years ago
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
}
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
}
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") {
10 years ago
var res = describeTextRange(range.from);
return res.display;
}
return range.from.toString() + " to " + range.to.toString();
}