| 
									
										
										
										
											2018-12-13 23:40:14 +08:00
										 |  |  | import React from 'react'; | 
					
						
							|  |  |  | import _ from 'lodash'; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2019-01-11 20:53:04 +08:00
										 |  |  | import { TemplateSrv } from 'app/features/templating/template_srv'; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-12-19 21:29:00 +08:00
										 |  |  | import { Metrics } from './Metrics'; | 
					
						
							| 
									
										
										
										
											2018-12-13 23:40:14 +08:00
										 |  |  | import { Filter } from './Filter'; | 
					
						
							| 
									
										
										
										
											2018-12-19 21:29:00 +08:00
										 |  |  | import { Aggregations } from './Aggregations'; | 
					
						
							| 
									
										
										
										
											2018-12-20 00:12:50 +08:00
										 |  |  | import { Alignments } from './Alignments'; | 
					
						
							| 
									
										
										
										
											2018-12-20 20:36:10 +08:00
										 |  |  | import { AlignmentPeriods } from './AlignmentPeriods'; | 
					
						
							| 
									
										
										
										
											2018-12-20 22:59:21 +08:00
										 |  |  | import { AliasBy } from './AliasBy'; | 
					
						
							| 
									
										
										
										
											2018-12-20 23:55:02 +08:00
										 |  |  | import { Help } from './Help'; | 
					
						
							| 
									
										
										
										
											2019-01-08 21:03:52 +08:00
										 |  |  | import { Target, MetricDescriptor } from '../types'; | 
					
						
							| 
									
										
										
										
											2018-12-20 18:26:05 +08:00
										 |  |  | import { getAlignmentPickerData } from '../functions'; | 
					
						
							| 
									
										
										
										
											2018-12-13 23:40:14 +08:00
										 |  |  | 
 | 
					
						
							|  |  |  | export interface Props { | 
					
						
							| 
									
										
										
										
											2018-12-19 21:19:27 +08:00
										 |  |  |   onQueryChange: (target: Target) => void; | 
					
						
							| 
									
										
										
										
											2019-01-08 20:52:19 +08:00
										 |  |  |   onExecuteQuery: () => void; | 
					
						
							| 
									
										
										
										
											2018-12-13 23:40:14 +08:00
										 |  |  |   target: Target; | 
					
						
							| 
									
										
										
										
											2018-12-22 04:38:46 +08:00
										 |  |  |   events: any; | 
					
						
							| 
									
										
										
										
											2018-12-13 23:40:14 +08:00
										 |  |  |   datasource: any; | 
					
						
							| 
									
										
										
										
											2019-01-11 20:53:04 +08:00
										 |  |  |   templateSrv: TemplateSrv; | 
					
						
							| 
									
										
										
										
											2018-12-13 23:40:14 +08:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-12-20 18:26:05 +08:00
										 |  |  | interface State extends Target { | 
					
						
							|  |  |  |   alignOptions: any[]; | 
					
						
							| 
									
										
										
										
											2018-12-22 04:38:46 +08:00
										 |  |  |   lastQuery: string; | 
					
						
							| 
									
										
										
										
											2018-12-22 05:04:46 +08:00
										 |  |  |   lastQueryError: string; | 
					
						
							| 
									
										
										
										
											2018-12-22 06:07:46 +08:00
										 |  |  |   [key: string]: any; | 
					
						
							| 
									
										
										
										
											2018-12-20 18:26:05 +08:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2019-01-03 22:12:03 +08:00
										 |  |  | export const DefaultTarget: State = { | 
					
						
							| 
									
										
										
										
											2018-12-13 23:40:14 +08:00
										 |  |  |   defaultProject: 'loading project...', | 
					
						
							|  |  |  |   metricType: '', | 
					
						
							| 
									
										
										
										
											2018-12-19 21:19:27 +08:00
										 |  |  |   metricKind: '', | 
					
						
							|  |  |  |   valueType: '', | 
					
						
							| 
									
										
										
										
											2018-12-13 23:40:14 +08:00
										 |  |  |   refId: '', | 
					
						
							|  |  |  |   service: '', | 
					
						
							|  |  |  |   unit: '', | 
					
						
							| 
									
										
										
										
											2018-12-20 18:00:16 +08:00
										 |  |  |   crossSeriesReducer: 'REDUCE_MEAN', | 
					
						
							|  |  |  |   alignmentPeriod: 'stackdriver-auto', | 
					
						
							|  |  |  |   perSeriesAligner: 'ALIGN_MEAN', | 
					
						
							|  |  |  |   groupBys: [], | 
					
						
							| 
									
										
										
										
											2018-12-13 23:40:14 +08:00
										 |  |  |   filters: [], | 
					
						
							|  |  |  |   aliasBy: '', | 
					
						
							| 
									
										
										
										
											2018-12-20 18:26:05 +08:00
										 |  |  |   alignOptions: [], | 
					
						
							| 
									
										
										
										
											2018-12-22 04:38:46 +08:00
										 |  |  |   lastQuery: '', | 
					
						
							| 
									
										
										
										
											2018-12-22 05:04:46 +08:00
										 |  |  |   lastQueryError: '', | 
					
						
							| 
									
										
										
										
											2018-12-13 23:40:14 +08:00
										 |  |  | }; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-12-20 18:26:05 +08:00
										 |  |  | export class QueryEditor extends React.Component<Props, State> { | 
					
						
							|  |  |  |   state: State = DefaultTarget; | 
					
						
							| 
									
										
										
										
											2018-12-13 23:40:14 +08:00
										 |  |  | 
 | 
					
						
							|  |  |  |   componentDidMount() { | 
					
						
							| 
									
										
										
										
											2019-01-08 20:52:19 +08:00
										 |  |  |     const { events, target, templateSrv } = this.props; | 
					
						
							| 
									
										
										
										
											2018-12-22 04:38:46 +08:00
										 |  |  |     events.on('data-received', this.onDataReceived.bind(this)); | 
					
						
							|  |  |  |     events.on('data-error', this.onDataError.bind(this)); | 
					
						
							| 
									
										
										
										
											2019-01-08 20:52:19 +08:00
										 |  |  |     const { perSeriesAligner, alignOptions } = getAlignmentPickerData(target, templateSrv); | 
					
						
							| 
									
										
										
										
											2018-12-20 18:26:05 +08:00
										 |  |  |     this.setState({ | 
					
						
							|  |  |  |       ...this.props.target, | 
					
						
							|  |  |  |       alignOptions, | 
					
						
							|  |  |  |       perSeriesAligner, | 
					
						
							|  |  |  |     }); | 
					
						
							| 
									
										
										
										
											2018-12-13 23:40:14 +08:00
										 |  |  |   } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-12-29 02:45:24 +08:00
										 |  |  |   componentWillUnmount() { | 
					
						
							| 
									
										
										
										
											2019-01-09 20:56:15 +08:00
										 |  |  |     this.props.events.off('data-received', this.onDataReceived); | 
					
						
							|  |  |  |     this.props.events.off('data-error', this.onDataError); | 
					
						
							| 
									
										
										
										
											2018-12-29 02:45:24 +08:00
										 |  |  |   } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-12-22 04:38:46 +08:00
										 |  |  |   onDataReceived(dataList) { | 
					
						
							| 
									
										
										
										
											2018-12-22 06:07:46 +08:00
										 |  |  |     const series = dataList.find(item => item.refId === this.props.target.refId); | 
					
						
							|  |  |  |     if (series) { | 
					
						
							|  |  |  |       this.setState({ lastQuery: decodeURIComponent(series.meta.rawQuery), lastQueryError: '' }); | 
					
						
							| 
									
										
										
										
											2018-12-22 04:38:46 +08:00
										 |  |  |     } | 
					
						
							|  |  |  |   } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   onDataError(err) { | 
					
						
							| 
									
										
										
										
											2018-12-22 06:07:46 +08:00
										 |  |  |     let lastQuery; | 
					
						
							|  |  |  |     let lastQueryError; | 
					
						
							|  |  |  |     if (err.data && err.data.error) { | 
					
						
							|  |  |  |       lastQueryError = this.props.datasource.formatStackdriverError(err); | 
					
						
							|  |  |  |     } else if (err.data && err.data.results) { | 
					
						
							|  |  |  |       const queryRes = err.data.results[this.props.target.refId]; | 
					
						
							|  |  |  |       lastQuery = decodeURIComponent(queryRes.meta.rawQuery); | 
					
						
							|  |  |  |       if (queryRes && queryRes.error) { | 
					
						
							|  |  |  |         try { | 
					
						
							|  |  |  |           lastQueryError = JSON.parse(queryRes.error).error.message; | 
					
						
							|  |  |  |         } catch { | 
					
						
							|  |  |  |           lastQueryError = queryRes.error; | 
					
						
							| 
									
										
										
										
											2018-12-22 05:04:46 +08:00
										 |  |  |         } | 
					
						
							|  |  |  |       } | 
					
						
							|  |  |  |     } | 
					
						
							| 
									
										
										
										
											2018-12-22 06:07:46 +08:00
										 |  |  |     this.setState({ lastQuery, lastQueryError }); | 
					
						
							| 
									
										
										
										
											2018-12-22 04:38:46 +08:00
										 |  |  |   } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2019-01-08 21:03:52 +08:00
										 |  |  |   onMetricTypeChange({ valueType, metricKind, type, unit }: MetricDescriptor) { | 
					
						
							| 
									
										
										
										
											2019-01-08 20:52:19 +08:00
										 |  |  |     const { templateSrv, onQueryChange, onExecuteQuery } = this.props; | 
					
						
							| 
									
										
										
										
											2018-12-20 18:26:05 +08:00
										 |  |  |     const { perSeriesAligner, alignOptions } = getAlignmentPickerData( | 
					
						
							|  |  |  |       { valueType, metricKind, perSeriesAligner: this.state.perSeriesAligner }, | 
					
						
							| 
									
										
										
										
											2019-01-08 20:52:19 +08:00
										 |  |  |       templateSrv | 
					
						
							| 
									
										
										
										
											2018-12-20 18:26:05 +08:00
										 |  |  |     ); | 
					
						
							| 
									
										
										
										
											2018-12-19 22:54:45 +08:00
										 |  |  |     this.setState( | 
					
						
							|  |  |  |       { | 
					
						
							| 
									
										
										
										
											2018-12-20 18:26:05 +08:00
										 |  |  |         alignOptions, | 
					
						
							|  |  |  |         perSeriesAligner, | 
					
						
							| 
									
										
										
										
											2018-12-20 18:00:16 +08:00
										 |  |  |         metricType: type, | 
					
						
							|  |  |  |         unit, | 
					
						
							|  |  |  |         valueType, | 
					
						
							|  |  |  |         metricKind, | 
					
						
							| 
									
										
										
										
											2018-12-13 23:40:14 +08:00
										 |  |  |       }, | 
					
						
							| 
									
										
										
										
											2018-12-19 22:54:45 +08:00
										 |  |  |       () => { | 
					
						
							| 
									
										
										
										
											2018-12-22 06:21:55 +08:00
										 |  |  |         onQueryChange(this.state); | 
					
						
							|  |  |  |         onExecuteQuery(); | 
					
						
							| 
									
										
										
										
											2018-12-19 22:54:45 +08:00
										 |  |  |       } | 
					
						
							|  |  |  |     ); | 
					
						
							| 
									
										
										
										
											2018-12-13 23:40:14 +08:00
										 |  |  |   } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2019-01-08 20:37:08 +08:00
										 |  |  |   onPropertyChange(prop, value) { | 
					
						
							| 
									
										
										
										
											2018-12-22 06:07:46 +08:00
										 |  |  |     this.setState({ [prop]: value }, () => { | 
					
						
							| 
									
										
										
										
											2018-12-20 22:59:21 +08:00
										 |  |  |       this.props.onQueryChange(this.state); | 
					
						
							|  |  |  |       this.props.onExecuteQuery(); | 
					
						
							|  |  |  |     }); | 
					
						
							|  |  |  |   } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-12-13 23:40:14 +08:00
										 |  |  |   render() { | 
					
						
							| 
									
										
										
										
											2018-12-20 20:36:10 +08:00
										 |  |  |     const { | 
					
						
							|  |  |  |       defaultProject, | 
					
						
							|  |  |  |       metricType, | 
					
						
							|  |  |  |       crossSeriesReducer, | 
					
						
							|  |  |  |       groupBys, | 
					
						
							| 
									
										
										
										
											2018-12-29 02:45:24 +08:00
										 |  |  |       filters, | 
					
						
							| 
									
										
										
										
											2018-12-20 20:36:10 +08:00
										 |  |  |       perSeriesAligner, | 
					
						
							|  |  |  |       alignOptions, | 
					
						
							|  |  |  |       alignmentPeriod, | 
					
						
							| 
									
										
										
										
											2018-12-20 22:59:21 +08:00
										 |  |  |       aliasBy, | 
					
						
							| 
									
										
										
										
											2018-12-22 04:38:46 +08:00
										 |  |  |       lastQuery, | 
					
						
							| 
									
										
										
										
											2018-12-22 05:04:46 +08:00
										 |  |  |       lastQueryError, | 
					
						
							| 
									
										
										
										
											2018-12-29 02:45:24 +08:00
										 |  |  |       refId, | 
					
						
							| 
									
										
										
										
											2018-12-20 20:36:10 +08:00
										 |  |  |     } = this.state; | 
					
						
							| 
									
										
										
										
											2019-01-08 20:52:19 +08:00
										 |  |  |     const { datasource, templateSrv } = this.props; | 
					
						
							| 
									
										
										
										
											2018-12-13 23:40:14 +08:00
										 |  |  | 
 | 
					
						
							|  |  |  |     return ( | 
					
						
							| 
									
										
										
										
											2019-01-08 20:00:31 +08:00
										 |  |  |       <> | 
					
						
							| 
									
										
										
										
											2018-12-19 21:29:00 +08:00
										 |  |  |         <Metrics | 
					
						
							| 
									
										
										
										
											2018-12-13 23:40:14 +08:00
										 |  |  |           defaultProject={defaultProject} | 
					
						
							|  |  |  |           metricType={metricType} | 
					
						
							| 
									
										
										
										
											2019-01-08 20:52:19 +08:00
										 |  |  |           templateSrv={templateSrv} | 
					
						
							| 
									
										
										
										
											2018-12-13 23:40:14 +08:00
										 |  |  |           datasource={datasource} | 
					
						
							| 
									
										
										
										
											2019-01-08 20:37:08 +08:00
										 |  |  |           onChange={value => this.onMetricTypeChange(value)} | 
					
						
							| 
									
										
										
										
											2018-12-19 22:54:45 +08:00
										 |  |  |         > | 
					
						
							|  |  |  |           {metric => ( | 
					
						
							| 
									
										
										
										
											2019-01-08 20:00:31 +08:00
										 |  |  |             <> | 
					
						
							| 
									
										
										
										
											2018-12-19 22:54:45 +08:00
										 |  |  |               <Filter | 
					
						
							| 
									
										
										
										
											2019-01-08 20:37:08 +08:00
										 |  |  |                 filtersChanged={value => this.onPropertyChange('filters', value)} | 
					
						
							|  |  |  |                 groupBysChanged={value => this.onPropertyChange('groupBys', value)} | 
					
						
							| 
									
										
										
										
											2018-12-29 02:45:24 +08:00
										 |  |  |                 filters={filters} | 
					
						
							|  |  |  |                 groupBys={groupBys} | 
					
						
							|  |  |  |                 refId={refId} | 
					
						
							|  |  |  |                 hideGroupBys={false} | 
					
						
							| 
									
										
										
										
											2019-01-08 20:52:19 +08:00
										 |  |  |                 templateSrv={templateSrv} | 
					
						
							| 
									
										
										
										
											2018-12-19 22:54:45 +08:00
										 |  |  |                 datasource={datasource} | 
					
						
							|  |  |  |                 metricType={metric ? metric.type : ''} | 
					
						
							|  |  |  |               /> | 
					
						
							|  |  |  |               <Aggregations | 
					
						
							|  |  |  |                 metricDescriptor={metric} | 
					
						
							| 
									
										
										
										
											2019-01-08 20:52:19 +08:00
										 |  |  |                 templateSrv={templateSrv} | 
					
						
							| 
									
										
										
										
											2018-12-20 18:00:16 +08:00
										 |  |  |                 crossSeriesReducer={crossSeriesReducer} | 
					
						
							|  |  |  |                 groupBys={groupBys} | 
					
						
							| 
									
										
										
										
											2019-01-08 20:37:08 +08:00
										 |  |  |                 onChange={value => this.onPropertyChange('crossSeriesReducer', value)} | 
					
						
							| 
									
										
										
										
											2018-12-19 23:08:18 +08:00
										 |  |  |               > | 
					
						
							| 
									
										
										
										
											2018-12-20 18:26:05 +08:00
										 |  |  |                 {displayAdvancedOptions => | 
					
						
							|  |  |  |                   displayAdvancedOptions && ( | 
					
						
							|  |  |  |                     <Alignments | 
					
						
							|  |  |  |                       alignOptions={alignOptions} | 
					
						
							| 
									
										
										
										
											2019-01-08 20:52:19 +08:00
										 |  |  |                       templateSrv={templateSrv} | 
					
						
							| 
									
										
										
										
											2018-12-20 18:26:05 +08:00
										 |  |  |                       perSeriesAligner={perSeriesAligner} | 
					
						
							| 
									
										
										
										
											2019-01-08 20:37:08 +08:00
										 |  |  |                       onChange={value => this.onPropertyChange('perSeriesAligner', value)} | 
					
						
							| 
									
										
										
										
											2018-12-20 18:26:05 +08:00
										 |  |  |                     /> | 
					
						
							|  |  |  |                   ) | 
					
						
							|  |  |  |                 } | 
					
						
							| 
									
										
										
										
											2018-12-19 23:08:18 +08:00
										 |  |  |               </Aggregations> | 
					
						
							| 
									
										
										
										
											2019-01-08 20:37:08 +08:00
										 |  |  |               <AliasBy value={aliasBy} onChange={value => this.onPropertyChange('aliasBy', value)} /> | 
					
						
							| 
									
										
										
										
											2018-12-22 04:38:46 +08:00
										 |  |  |               <AlignmentPeriods | 
					
						
							| 
									
										
										
										
											2019-01-08 20:52:19 +08:00
										 |  |  |                 templateSrv={templateSrv} | 
					
						
							| 
									
										
										
										
											2018-12-22 04:38:46 +08:00
										 |  |  |                 alignmentPeriod={alignmentPeriod} | 
					
						
							| 
									
										
										
										
											2019-01-08 20:37:08 +08:00
										 |  |  |                 onChange={value => this.onPropertyChange('alignmentPeriod', value)} | 
					
						
							| 
									
										
										
										
											2018-12-22 04:38:46 +08:00
										 |  |  |               /> | 
					
						
							| 
									
										
										
										
											2018-12-22 05:04:46 +08:00
										 |  |  |               <Help datasource={datasource} rawQuery={lastQuery} lastQueryError={lastQueryError} /> | 
					
						
							| 
									
										
										
										
											2019-01-08 20:00:31 +08:00
										 |  |  |             </> | 
					
						
							| 
									
										
										
										
											2018-12-19 22:54:45 +08:00
										 |  |  |           )} | 
					
						
							|  |  |  |         </Metrics> | 
					
						
							| 
									
										
										
										
											2019-01-08 20:00:31 +08:00
										 |  |  |       </> | 
					
						
							| 
									
										
										
										
											2018-12-13 23:40:14 +08:00
										 |  |  |     ); | 
					
						
							|  |  |  |   } | 
					
						
							|  |  |  | } |