QueryEditor.tsx 3.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141
  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. onChange: (target: Target) => void;
  10. target: Target;
  11. datasource: any;
  12. templateSrv: any;
  13. uiSegmentSrv: any;
  14. }
  15. interface State {
  16. target: Target;
  17. labelData: QueryMeta;
  18. loadLabelsPromise: Promise<any>;
  19. }
  20. const DefaultTarget: Target = {
  21. defaultProject: 'loading project...',
  22. metricType: '',
  23. refId: '',
  24. service: '',
  25. unit: '',
  26. aggregation: {
  27. crossSeriesReducer: 'REDUCE_MEAN',
  28. alignmentPeriod: 'stackdriver-auto',
  29. perSeriesAligner: 'ALIGN_MEAN',
  30. groupBys: [],
  31. },
  32. filters: [],
  33. aliasBy: '',
  34. metricKind: '',
  35. valueType: '',
  36. };
  37. export class QueryEditor extends React.Component<Props, State> {
  38. state: State = { labelData: null, loadLabelsPromise: null, target: DefaultTarget };
  39. constructor(props) {
  40. super(props);
  41. this.handleMetricTypeChange = this.handleMetricTypeChange.bind(this);
  42. this.handleAggregationChange = this.handleAggregationChange.bind(this);
  43. }
  44. componentDidMount() {
  45. this.setState({ target: this.props.target });
  46. this.getLabels();
  47. }
  48. async getLabels() {
  49. const loadLabelsPromise = new Promise(async resolve => {
  50. try {
  51. const { meta } = await this.props.datasource.getLabels(this.props.target.metricType, this.props.target.refId);
  52. this.setState({ labelData: meta });
  53. resolve();
  54. } catch (error) {
  55. appEvents.emit('alert-error', ['Error', 'Error loading metric labels for ' + this.props.target.metricType]);
  56. resolve();
  57. }
  58. });
  59. this.setState({ loadLabelsPromise });
  60. }
  61. handleMetricTypeChange({ valueType, metricKind, type, unit }) {
  62. this.setState({
  63. target: {
  64. ...this.state.target,
  65. ...{
  66. metricType: type,
  67. unit,
  68. valueType,
  69. metricKind,
  70. },
  71. },
  72. });
  73. // this.$rootScope.$broadcast('metricTypeChanged');
  74. // this.getLabels();
  75. // this.refresh();
  76. }
  77. handleAggregationChange(crossSeriesReducer) {
  78. // this.target.aggregation.crossSeriesReducer = crossSeriesReducer;
  79. // this.refresh();
  80. }
  81. render() {
  82. const { labelData, loadLabelsPromise, target } = this.state;
  83. const { defaultProject, metricType } = target;
  84. const { templateSrv, datasource, uiSegmentSrv } = this.props;
  85. return (
  86. <React.Fragment>
  87. <MetricPicker
  88. defaultProject={defaultProject}
  89. metricType={metricType}
  90. templateSrv={templateSrv}
  91. datasource={datasource}
  92. onChange={value => this.handleMetricTypeChange(value)}
  93. />
  94. <Filter
  95. onChange={() => console.log('change filter')}
  96. target={target}
  97. uiSegmentSrv={uiSegmentSrv}
  98. labelData={labelData}
  99. templateSrv={templateSrv}
  100. loading={loadLabelsPromise}
  101. />
  102. {/* target="ctrl.target" refresh="ctrl.refresh()" loading="ctrl.loadLabelsPromise" label-data="ctrl.labelData" */}
  103. {/* <stackdriver-filter
  104. target="target"
  105. refresh="target.refresh()"
  106. loading="target.loadLabelsPromise"
  107. label-data="target.labelData"
  108. />
  109. <aggregation-picker
  110. value-type="target.target.valueType"
  111. metric-kind="target.target.metricKind"
  112. aggregation="target.target.aggregation"
  113. alignment-period="target.lastQueryMeta.alignmentPeriod"
  114. refresh="target.refresh()"
  115. template-srv="target.templateSrv"
  116. datasource="target.datasource"
  117. on-change="target.handleAggregationChange"
  118. />
  119. <stackdriver-aggregation
  120. target="target.target"
  121. alignment-period="target.lastQueryMeta.alignmentPeriod"
  122. refresh="target.refresh()"
  123. /> */}
  124. </React.Fragment>
  125. );
  126. }
  127. }