Commit 02427ef8 by David Kaltschmidt

Explore: calculate query interval based on available width

- classic dashboard panels inject a dynamic query interval as part of
  the query options. Explore did not have that.
- this PR adds the interval calculation to Explore
- interval based on Explore container's width
- ensure min interval if set in datasource
parent e318489b
......@@ -2,16 +2,18 @@ import React from 'react';
import { hot } from 'react-hot-loader';
import Select from 'react-select';
import kbn from 'app/core/utils/kbn';
import colors from 'app/core/utils/colors';
import TimeSeries from 'app/core/time_series2';
import { decodePathComponent } from 'app/core/utils/location_util';
import { parse as parseDate } from 'app/core/utils/datemath';
import ElapsedTime from './ElapsedTime';
import QueryRows from './QueryRows';
import Graph from './Graph';
import Table from './Table';
import TimePicker, { DEFAULT_RANGE } from './TimePicker';
import { buildQueryOptions, ensureQueries, generateQueryKey, hasQuery } from './utils/query';
import { ensureQueries, generateQueryKey, hasQuery } from './utils/query';
function makeTimeSeriesList(dataList, options) {
return dataList.map((seriesData, index) => {
......@@ -63,8 +65,9 @@ interface IExploreState {
tableResult: any;
}
// @observer
export class Explore extends React.Component<any, IExploreState> {
el: any;
constructor(props) {
super(props);
const { datasource, queries, range } = parseInitialState(props.routeParams.initial);
......@@ -132,6 +135,10 @@ export class Explore extends React.Component<any, IExploreState> {
}
}
getRef = el => {
this.el = el;
};
handleAddQueryRow = index => {
const { queries } = this.state;
const nextQueries = [
......@@ -214,20 +221,33 @@ export class Explore extends React.Component<any, IExploreState> {
}
};
async runGraphQuery() {
buildQueryOptions(targetOptions: { format: string; instant: boolean }) {
const { datasource, queries, range } = this.state;
const resolution = this.el.offsetWidth;
const absoluteRange = {
from: parseDate(range.from, false),
to: parseDate(range.to, true),
};
const { interval } = kbn.calculateInterval(absoluteRange, resolution, datasource.interval);
const targets = queries.map(q => ({
...targetOptions,
expr: q.query,
}));
return {
interval,
range,
targets,
};
}
async runGraphQuery() {
const { datasource, queries } = this.state;
if (!hasQuery(queries)) {
return;
}
this.setState({ latency: 0, loading: true, graphResult: null, queryError: null });
const now = Date.now();
const options = buildQueryOptions({
format: 'time_series',
interval: datasource.interval,
instant: false,
range,
queries: queries.map(q => q.query),
});
const options = this.buildQueryOptions({ format: 'time_series', instant: false });
try {
const res = await datasource.query(options);
const result = makeTimeSeriesList(res.data, options);
......@@ -241,18 +261,15 @@ export class Explore extends React.Component<any, IExploreState> {
}
async runTableQuery() {
const { datasource, queries, range } = this.state;
const { datasource, queries } = this.state;
if (!hasQuery(queries)) {
return;
}
this.setState({ latency: 0, loading: true, queryError: null, tableResult: null });
const now = Date.now();
const options = buildQueryOptions({
const options = this.buildQueryOptions({
format: 'table',
interval: datasource.interval,
instant: true,
range,
queries: queries.map(q => q.query),
});
try {
const res = await datasource.query(options);
......@@ -301,7 +318,7 @@ export class Explore extends React.Component<any, IExploreState> {
const selectedDatasource = datasource ? datasource.name : undefined;
return (
<div className={exploreClass}>
<div className={exploreClass} ref={this.getRef}>
<div className="navbar">
{position === 'left' ? (
<div>
......
export function buildQueryOptions({ format, interval, instant, range, queries }) {
return {
interval,
range,
targets: queries.map(expr => ({
expr,
format,
instant,
})),
};
}
export function generateQueryKey(index = 0) {
return `Q-${Date.now()}-${Math.random()}-${index}`;
}
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment