|
|
@@ -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>
|