QueryEditor.tsx 4.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177
  1. import React from 'react';
  2. import _ from 'lodash';
  3. import { Metrics } from './Metrics';
  4. import { Filter } from './Filter';
  5. import { Aggregations } from './Aggregations';
  6. import { Alignments } from './Alignments';
  7. import { Target } 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. }
  19. const DefaultTarget: Target = {
  20. defaultProject: 'loading project...',
  21. metricType: '',
  22. metricKind: '',
  23. valueType: '',
  24. refId: '',
  25. service: '',
  26. unit: '',
  27. aggregation: {
  28. crossSeriesReducer: 'REDUCE_MEAN',
  29. alignmentPeriod: 'stackdriver-auto',
  30. perSeriesAligner: 'ALIGN_MEAN',
  31. groupBys: [],
  32. },
  33. filters: [],
  34. aliasBy: '',
  35. };
  36. export class QueryEditor extends React.Component<Props, State> {
  37. state: State = { target: DefaultTarget };
  38. componentDidMount() {
  39. this.setState({ target: this.props.target });
  40. }
  41. handleMetricTypeChange({ valueType, metricKind, type, unit }) {
  42. this.setState(
  43. {
  44. target: {
  45. ...this.state.target,
  46. ...{
  47. metricType: type,
  48. unit,
  49. valueType,
  50. metricKind,
  51. },
  52. },
  53. },
  54. () => {
  55. // this.props.onQueryChange(this.state.target);
  56. this.props.onExecuteQuery();
  57. }
  58. );
  59. }
  60. handleFilterChange(value) {
  61. this.setState(
  62. {
  63. target: {
  64. ...this.state.target,
  65. filters: value,
  66. },
  67. },
  68. () => {
  69. this.props.onQueryChange(this.state.target);
  70. this.props.onExecuteQuery();
  71. }
  72. );
  73. }
  74. handleGroupBysChange(value) {
  75. this.setState(
  76. {
  77. target: {
  78. ...this.state.target,
  79. aggregation: {
  80. ...this.state.target.aggregation,
  81. groupBys: value,
  82. },
  83. },
  84. },
  85. () => {
  86. this.props.onQueryChange(this.state.target);
  87. this.props.onExecuteQuery();
  88. }
  89. );
  90. }
  91. handleAggregationChange(value) {
  92. const target = {
  93. ...this.state.target,
  94. aggregation: {
  95. ...this.state.target.aggregation,
  96. crossSeriesReducer: value,
  97. },
  98. };
  99. this.setState({ target }, () => {
  100. this.props.onQueryChange(target);
  101. this.props.onExecuteQuery();
  102. });
  103. }
  104. handleAlignmentChange(value) {
  105. const target = {
  106. ...this.state.target,
  107. aggregation: {
  108. ...this.state.target.aggregation,
  109. perSeriesAligner: value,
  110. },
  111. };
  112. this.setState({ target }, () => {
  113. this.props.onQueryChange(target);
  114. this.props.onExecuteQuery();
  115. });
  116. }
  117. render() {
  118. const { target } = this.state;
  119. const { defaultProject, metricType, aggregation } = target;
  120. const { templateSrv, datasource, uiSegmentSrv } = this.props;
  121. return (
  122. <React.Fragment>
  123. <Metrics
  124. defaultProject={defaultProject}
  125. metricType={metricType}
  126. templateSrv={templateSrv}
  127. datasource={datasource}
  128. onChange={value => this.handleMetricTypeChange(value)}
  129. >
  130. {metric => (
  131. <React.Fragment>
  132. <Filter
  133. filtersChanged={value => this.handleFilterChange(value)}
  134. groupBysChanged={value => this.handleGroupBysChange(value)}
  135. target={target}
  136. uiSegmentSrv={uiSegmentSrv}
  137. templateSrv={templateSrv}
  138. datasource={datasource}
  139. metricType={metric ? metric.type : ''}
  140. />
  141. <Aggregations
  142. metricDescriptor={metric}
  143. templateSrv={templateSrv}
  144. aggregation={aggregation}
  145. onChange={value => this.handleAggregationChange(value)}
  146. >
  147. {displayAdvancedOptions =>
  148. displayAdvancedOptions && (
  149. <Alignments
  150. metricDescriptor={metric}
  151. templateSrv={templateSrv}
  152. perSeriesAligner={aggregation.perSeriesAligner}
  153. onChange={value => this.handleAlignmentChange(value)}
  154. />
  155. )
  156. }
  157. </Aggregations>
  158. </React.Fragment>
  159. )}
  160. </Metrics>
  161. </React.Fragment>
  162. );
  163. }
  164. }