|
|
|
@ -1,11 +1,10 @@ |
|
|
|
import React from 'react'; |
|
|
|
import React from 'react'; |
|
|
|
import _ from 'lodash'; |
|
|
|
import _ from 'lodash'; |
|
|
|
import appEvents from 'app/core/app_events'; |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
import { Metrics } from './Metrics'; |
|
|
|
import { Metrics } from './Metrics'; |
|
|
|
import { Filter } from './Filter'; |
|
|
|
import { Filter } from './Filter'; |
|
|
|
import { Aggregations } from './Aggregations'; |
|
|
|
import { Aggregations } from './Aggregations'; |
|
|
|
import { Target, QueryMeta } from '../types'; |
|
|
|
import { Target } from '../types'; |
|
|
|
|
|
|
|
|
|
|
|
export interface Props { |
|
|
|
export interface Props { |
|
|
|
onQueryChange: (target: Target) => void; |
|
|
|
onQueryChange: (target: Target) => void; |
|
|
|
@ -18,8 +17,6 @@ export interface Props { |
|
|
|
|
|
|
|
|
|
|
|
interface State { |
|
|
|
interface State { |
|
|
|
target: Target; |
|
|
|
target: Target; |
|
|
|
labelData: QueryMeta; |
|
|
|
|
|
|
|
loadLabelsPromise: Promise<any>; |
|
|
|
|
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
const DefaultTarget: Target = { |
|
|
|
const DefaultTarget: Target = { |
|
|
|
@ -41,85 +38,79 @@ const DefaultTarget: Target = { |
|
|
|
}; |
|
|
|
}; |
|
|
|
|
|
|
|
|
|
|
|
export class QueryEditor extends React.Component<Props, State> { |
|
|
|
export class QueryEditor extends React.Component<Props, State> { |
|
|
|
state: State = { labelData: null, loadLabelsPromise: new Promise(() => {}), target: DefaultTarget }; |
|
|
|
state: State = { target: DefaultTarget }; |
|
|
|
|
|
|
|
|
|
|
|
componentDidMount() { |
|
|
|
componentDidMount() { |
|
|
|
this.getLabels(); |
|
|
|
|
|
|
|
this.setState({ target: this.props.target }); |
|
|
|
this.setState({ target: this.props.target }); |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
async getLabels() { |
|
|
|
|
|
|
|
const loadLabelsPromise = new Promise(async resolve => { |
|
|
|
|
|
|
|
try { |
|
|
|
|
|
|
|
const { meta } = await this.props.datasource.getLabels(this.props.target.metricType, this.props.target.refId); |
|
|
|
|
|
|
|
this.setState({ labelData: meta }); |
|
|
|
|
|
|
|
resolve(); |
|
|
|
|
|
|
|
} catch (error) { |
|
|
|
|
|
|
|
appEvents.emit('alert-error', ['Error', 'Error loading metric labels for ' + this.props.target.metricType]); |
|
|
|
|
|
|
|
resolve(); |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
}); |
|
|
|
|
|
|
|
this.setState({ loadLabelsPromise }); |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
handleMetricTypeChange({ valueType, metricKind, type, unit }) { |
|
|
|
handleMetricTypeChange({ valueType, metricKind, type, unit }) { |
|
|
|
this.setState({ |
|
|
|
this.setState( |
|
|
|
target: { |
|
|
|
{ |
|
|
|
...this.state.target, |
|
|
|
target: { |
|
|
|
...{ |
|
|
|
...this.state.target, |
|
|
|
metricType: type, |
|
|
|
...{ |
|
|
|
unit, |
|
|
|
metricType: type, |
|
|
|
valueType, |
|
|
|
unit, |
|
|
|
metricKind, |
|
|
|
valueType, |
|
|
|
|
|
|
|
metricKind, |
|
|
|
|
|
|
|
}, |
|
|
|
}, |
|
|
|
}, |
|
|
|
}, |
|
|
|
}, |
|
|
|
}); |
|
|
|
() => { |
|
|
|
|
|
|
|
this.props.onQueryChange(this.state.target); |
|
|
|
// this.$rootScope.$broadcast('metricTypeChanged');
|
|
|
|
this.props.onExecuteQuery(); |
|
|
|
this.getLabels(); |
|
|
|
} |
|
|
|
this.props.onQueryChange(this.state.target); |
|
|
|
); |
|
|
|
this.props.onExecuteQuery(); |
|
|
|
|
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
handleFilterChange(value) { |
|
|
|
handleFilterChange(value) { |
|
|
|
this.setState({ |
|
|
|
this.setState( |
|
|
|
target: { |
|
|
|
{ |
|
|
|
...this.state.target, |
|
|
|
target: { |
|
|
|
filters: value, |
|
|
|
...this.state.target, |
|
|
|
|
|
|
|
filters: value, |
|
|
|
|
|
|
|
}, |
|
|
|
}, |
|
|
|
}, |
|
|
|
}); |
|
|
|
() => { |
|
|
|
this.props.onQueryChange(this.state.target); |
|
|
|
this.props.onQueryChange(this.state.target); |
|
|
|
this.props.onExecuteQuery(); |
|
|
|
this.props.onExecuteQuery(); |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
); |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
handleGroupBysChange(value) { |
|
|
|
handleGroupBysChange(value) { |
|
|
|
this.setState({ |
|
|
|
this.setState( |
|
|
|
target: { |
|
|
|
{ |
|
|
|
...this.state.target, |
|
|
|
target: { |
|
|
|
groupBys: value, |
|
|
|
...this.state.target, |
|
|
|
|
|
|
|
groupBys: value, |
|
|
|
|
|
|
|
}, |
|
|
|
}, |
|
|
|
}, |
|
|
|
}); |
|
|
|
() => { |
|
|
|
this.props.onQueryChange(this.state.target); |
|
|
|
this.props.onQueryChange(this.state.target); |
|
|
|
this.props.onExecuteQuery(); |
|
|
|
this.props.onExecuteQuery(); |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
); |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
handleAggregationChange(value) { |
|
|
|
handleAggregationChange(value) { |
|
|
|
this.setState({ |
|
|
|
const target = { |
|
|
|
target: { |
|
|
|
...this.state.target, |
|
|
|
...this.state.target, |
|
|
|
aggregation: { |
|
|
|
aggregation: { |
|
|
|
...this.state.target.aggregation, |
|
|
|
...this.state.target.aggregation, |
|
|
|
crossSeriesReducer: value, |
|
|
|
crossSeriesReducer: value, |
|
|
|
|
|
|
|
}, |
|
|
|
|
|
|
|
}, |
|
|
|
}, |
|
|
|
|
|
|
|
}; |
|
|
|
|
|
|
|
this.setState({ target }, () => { |
|
|
|
|
|
|
|
this.props.onQueryChange(target); |
|
|
|
|
|
|
|
this.props.onExecuteQuery(); |
|
|
|
}); |
|
|
|
}); |
|
|
|
this.props.onQueryChange(this.state.target); |
|
|
|
|
|
|
|
this.props.onExecuteQuery(); |
|
|
|
|
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
render() { |
|
|
|
render() { |
|
|
|
const { labelData, loadLabelsPromise, target } = this.state; |
|
|
|
const { target } = this.state; |
|
|
|
const { defaultProject, metricType, valueType, metricKind, aggregation } = target; |
|
|
|
const { defaultProject, metricType, aggregation } = target; |
|
|
|
const { templateSrv, datasource, uiSegmentSrv } = this.props; |
|
|
|
const { templateSrv, datasource, uiSegmentSrv } = this.props; |
|
|
|
|
|
|
|
|
|
|
|
return ( |
|
|
|
return ( |
|
|
|
@ -130,46 +121,27 @@ export class QueryEditor extends React.Component<Props, State> { |
|
|
|
templateSrv={templateSrv} |
|
|
|
templateSrv={templateSrv} |
|
|
|
datasource={datasource} |
|
|
|
datasource={datasource} |
|
|
|
onChange={value => this.handleMetricTypeChange(value)} |
|
|
|
onChange={value => this.handleMetricTypeChange(value)} |
|
|
|
/> |
|
|
|
> |
|
|
|
<Filter |
|
|
|
{metric => ( |
|
|
|
filtersChanged={value => this.handleFilterChange(value)} |
|
|
|
<React.Fragment> |
|
|
|
groupBysChanged={value => this.handleGroupBysChange(value)} |
|
|
|
<Filter |
|
|
|
target={target} |
|
|
|
filtersChanged={value => this.handleFilterChange(value)} |
|
|
|
uiSegmentSrv={uiSegmentSrv} |
|
|
|
groupBysChanged={value => this.handleGroupBysChange(value)} |
|
|
|
labelData={labelData} |
|
|
|
target={target} |
|
|
|
templateSrv={templateSrv} |
|
|
|
uiSegmentSrv={uiSegmentSrv} |
|
|
|
loading={loadLabelsPromise} |
|
|
|
templateSrv={templateSrv} |
|
|
|
/> |
|
|
|
datasource={datasource} |
|
|
|
<Aggregations |
|
|
|
metricType={metric ? metric.type : ''} |
|
|
|
valueType={valueType} |
|
|
|
/> |
|
|
|
metricKind={metricKind} |
|
|
|
<Aggregations |
|
|
|
templateSrv={templateSrv} |
|
|
|
metricDescriptor={metric} |
|
|
|
aggregation={aggregation} |
|
|
|
templateSrv={templateSrv} |
|
|
|
onChange={value => this.handleAggregationChange(value)} |
|
|
|
aggregation={aggregation} |
|
|
|
/> |
|
|
|
onChange={value => this.handleAggregationChange(value)} |
|
|
|
{/* target="ctrl.target" refresh="ctrl.refresh()" loading="ctrl.loadLabelsPromise" label-data="ctrl.labelData" */} |
|
|
|
/> |
|
|
|
{/* <stackdriver-filter |
|
|
|
</React.Fragment> |
|
|
|
target="target" |
|
|
|
)} |
|
|
|
refresh="target.refresh()" |
|
|
|
</Metrics> |
|
|
|
loading="target.loadLabelsPromise" |
|
|
|
|
|
|
|
label-data="target.labelData" |
|
|
|
|
|
|
|
/> |
|
|
|
|
|
|
|
<aggregation-picker |
|
|
|
|
|
|
|
value-type="target.target.valueType" |
|
|
|
|
|
|
|
metric-kind="target.target.metricKind" |
|
|
|
|
|
|
|
aggregation="target.target.aggregation" |
|
|
|
|
|
|
|
alignment-period="target.lastQueryMeta.alignmentPeriod" |
|
|
|
|
|
|
|
refresh="target.refresh()" |
|
|
|
|
|
|
|
template-srv="target.templateSrv" |
|
|
|
|
|
|
|
datasource="target.datasource" |
|
|
|
|
|
|
|
on-change="target.handleAggregationChange" |
|
|
|
|
|
|
|
/> |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
<stackdriver-aggregation |
|
|
|
|
|
|
|
target="target.target" |
|
|
|
|
|
|
|
alignment-period="target.lastQueryMeta.alignmentPeriod" |
|
|
|
|
|
|
|
refresh="target.refresh()" |
|
|
|
|
|
|
|
/> */} |
|
|
|
|
|
|
|
</React.Fragment> |
|
|
|
</React.Fragment> |
|
|
|
); |
|
|
|
); |
|
|
|
} |
|
|
|
} |
|
|
|
|