QueryEditor.tsx 4.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176
  1. import React from 'react';
  2. import _ from 'lodash';
  3. import appEvents from 'app/core/app_events';
  4. import { MetricPicker } from './MetricPicker';
  5. import { Filter } from './Filter';
  6. import { AggregationPicker } from './AggregationPicker';
  7. import { Target, QueryMeta } from '../types';
  8. export interface Props {
  9. onQueryChange: (target: Target) => void;
  10. onExecuteQuery?: () => void;
  11. target: Target;
  12. datasource: any;
  13. templateSrv: any;
  14. uiSegmentSrv: any;
  15. }
  16. interface State {
  17. target: Target;
  18. labelData: QueryMeta;
  19. loadLabelsPromise: Promise<any>;
  20. }
  21. const DefaultTarget: Target = {
  22. defaultProject: 'loading project...',
  23. metricType: '',
  24. metricKind: '',
  25. valueType: '',
  26. refId: '',
  27. service: '',
  28. unit: '',
  29. aggregation: {
  30. crossSeriesReducer: 'REDUCE_MEAN',
  31. alignmentPeriod: 'stackdriver-auto',
  32. perSeriesAligner: 'ALIGN_MEAN',
  33. groupBys: [],
  34. },
  35. filters: [],
  36. aliasBy: '',
  37. };
  38. export class QueryEditor extends React.Component<Props, State> {
  39. state: State = { labelData: null, loadLabelsPromise: new Promise(() => {}), target: DefaultTarget };
  40. componentDidMount() {
  41. this.getLabels();
  42. this.setState({ target: this.props.target });
  43. }
  44. async getLabels() {
  45. const loadLabelsPromise = new Promise(async resolve => {
  46. try {
  47. const { meta } = await this.props.datasource.getLabels(this.props.target.metricType, this.props.target.refId);
  48. this.setState({ labelData: meta });
  49. resolve();
  50. } catch (error) {
  51. appEvents.emit('alert-error', ['Error', 'Error loading metric labels for ' + this.props.target.metricType]);
  52. resolve();
  53. }
  54. });
  55. this.setState({ loadLabelsPromise });
  56. }
  57. handleMetricTypeChange({ valueType, metricKind, type, unit }) {
  58. this.setState({
  59. target: {
  60. ...this.state.target,
  61. ...{
  62. metricType: type,
  63. unit,
  64. valueType,
  65. metricKind,
  66. },
  67. },
  68. });
  69. // this.$rootScope.$broadcast('metricTypeChanged');
  70. this.getLabels();
  71. this.props.onQueryChange(this.state.target);
  72. this.props.onExecuteQuery();
  73. }
  74. handleFilterChange(value) {
  75. this.setState({
  76. target: {
  77. ...this.state.target,
  78. filters: value,
  79. },
  80. });
  81. this.props.onQueryChange(this.state.target);
  82. this.props.onExecuteQuery();
  83. }
  84. handleGroupBysChange(value) {
  85. this.setState({
  86. target: {
  87. ...this.state.target,
  88. groupBys: value,
  89. },
  90. });
  91. this.props.onQueryChange(this.state.target);
  92. this.props.onExecuteQuery();
  93. }
  94. handleAggregationChange(value) {
  95. this.setState({
  96. target: {
  97. ...this.state.target,
  98. aggregation: {
  99. ...this.state.target.aggregation,
  100. crossSeriesReducer: value,
  101. },
  102. },
  103. });
  104. this.props.onQueryChange(this.state.target);
  105. this.props.onExecuteQuery();
  106. }
  107. render() {
  108. const { labelData, loadLabelsPromise, target } = this.state;
  109. const { defaultProject, metricType, valueType, metricKind, aggregation } = target;
  110. const { templateSrv, datasource, uiSegmentSrv } = this.props;
  111. return (
  112. <React.Fragment>
  113. <MetricPicker
  114. defaultProject={defaultProject}
  115. metricType={metricType}
  116. templateSrv={templateSrv}
  117. datasource={datasource}
  118. onChange={value => this.handleMetricTypeChange(value)}
  119. />
  120. <Filter
  121. filtersChanged={value => this.handleFilterChange(value)}
  122. groupBysChanged={value => this.handleGroupBysChange(value)}
  123. target={target}
  124. uiSegmentSrv={uiSegmentSrv}
  125. labelData={labelData}
  126. templateSrv={templateSrv}
  127. loading={loadLabelsPromise}
  128. />
  129. <AggregationPicker
  130. valueType={valueType}
  131. metricKind={metricKind}
  132. templateSrv={templateSrv}
  133. aggregation={aggregation}
  134. onChange={value => this.handleAggregationChange(value)}
  135. />
  136. {/* target="ctrl.target" refresh="ctrl.refresh()" loading="ctrl.loadLabelsPromise" label-data="ctrl.labelData" */}
  137. {/* <stackdriver-filter
  138. target="target"
  139. refresh="target.refresh()"
  140. loading="target.loadLabelsPromise"
  141. label-data="target.labelData"
  142. />
  143. <aggregation-picker
  144. value-type="target.target.valueType"
  145. metric-kind="target.target.metricKind"
  146. aggregation="target.target.aggregation"
  147. alignment-period="target.lastQueryMeta.alignmentPeriod"
  148. refresh="target.refresh()"
  149. template-srv="target.templateSrv"
  150. datasource="target.datasource"
  151. on-change="target.handleAggregationChange"
  152. />
  153. <stackdriver-aggregation
  154. target="target.target"
  155. alignment-period="target.lastQueryMeta.alignmentPeriod"
  156. refresh="target.refresh()"
  157. /> */}
  158. </React.Fragment>
  159. );
  160. }
  161. }