TemplateQueryComponent.tsx 4.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119
  1. import React, { PureComponent } from 'react';
  2. import ServiceSelector from './ServiceSelector';
  3. import MetricTypeSelector from './MetricTypeSelector';
  4. import MetricLabelKeySelector from './MetricLabelKeySelector';
  5. import { TemplateQueryProps } from 'app/types/plugins';
  6. import defaultsDeep from 'lodash/defaultsDeep';
  7. import has from 'lodash/has';
  8. export class StackdriverTemplateQueryComponent extends PureComponent<TemplateQueryProps, any> {
  9. queryTypes: Array<{ value: string; name: string }> = [
  10. { value: 'services', name: 'Services' },
  11. { value: 'metricTypes', name: 'Metric Types' },
  12. { value: 'metricLabels', name: 'Metric Labels' },
  13. { value: 'resourceLabels', name: 'Resource Labels' },
  14. { value: 'resourceTypes', name: 'Resource Types' },
  15. { value: 'aggregations', name: 'Aggregations' },
  16. { value: 'alignerns', name: 'Aligners' },
  17. { value: 'alignmentPeriods', name: 'Alignment Periods' },
  18. ];
  19. defaults = {
  20. type: undefined,
  21. metricDescriptors: [],
  22. service: undefined,
  23. metricType: undefined,
  24. metricLabels: [],
  25. metricLabelKey: undefined,
  26. };
  27. constructor(props: TemplateQueryProps) {
  28. super(props);
  29. this.handleQueryTypeChange = this.handleQueryTypeChange.bind(this);
  30. this.onServiceChange = this.onServiceChange.bind(this);
  31. this.onMetricTypeChange = this.onMetricTypeChange.bind(this);
  32. this.onMetricLabelKeyChange = this.onMetricLabelKeyChange.bind(this);
  33. this.state = defaultsDeep(this.props.query, this.defaults);
  34. }
  35. async componentDidMount() {
  36. const metricDescriptors = await this.props.datasource.getMetricTypes(this.props.datasource.projectName);
  37. this.setState({ metricDescriptors });
  38. }
  39. async loadTimeSeriesData() {
  40. const refId = 'StackdriverTemplateQueryComponent';
  41. const response = await this.props.datasource.getLabels(this.state.metricType, refId);
  42. if (has(response, 'meta.metricLabels')) {
  43. this.setState({ metricLabels: Object.keys(response.meta.metricLabels) });
  44. }
  45. }
  46. handleQueryTypeChange(event) {
  47. this.setState({ type: event.target.value });
  48. }
  49. onServiceChange(event) {
  50. this.setState({ service: event.target.value });
  51. }
  52. onMetricTypeChange(event) {
  53. this.setState({ metricType: event.target.value });
  54. this.loadTimeSeriesData();
  55. }
  56. onMetricLabelKeyChange(event) {
  57. this.setState({ metricLabelKey: event.target.value });
  58. }
  59. componentDidUpdate() {
  60. const { metricDescriptors, metricLabels, ...queryModel } = this.state;
  61. this.props.onChange(queryModel);
  62. }
  63. renderSwitch(queryType) {
  64. switch (queryType) {
  65. case 'metricTypes':
  66. return (
  67. <ServiceSelector metricDescriptors={this.state.metricDescriptors} onServiceChange={this.onServiceChange} />
  68. );
  69. case 'metricLabels':
  70. return (
  71. <React.Fragment>
  72. <ServiceSelector metricDescriptors={this.state.metricDescriptors} onServiceChange={this.onServiceChange} />
  73. <MetricTypeSelector
  74. selectedService={this.state.service}
  75. metricDescriptors={this.state.metricDescriptors}
  76. onMetricTypeChange={this.onMetricTypeChange}
  77. />
  78. <MetricLabelKeySelector
  79. metricLabelKey={this.state.metricLabelKey}
  80. metricLabels={this.state.metricLabels}
  81. onMetricLabelKeyChange={this.onMetricLabelKeyChange}
  82. />
  83. </React.Fragment>
  84. );
  85. default:
  86. return '';
  87. }
  88. }
  89. render() {
  90. return (
  91. <React.Fragment>
  92. <div className="gf-form max-width-21">
  93. <span className="gf-form-label width-7">Query Type</span>
  94. <div className="gf-form-select-wrapper max-width-14">
  95. <select className="gf-form-input" required onChange={this.handleQueryTypeChange}>
  96. {this.queryTypes.map((qt, i) => (
  97. <option key={i} value={qt.value} ng-if="false">
  98. {qt.name}
  99. </option>
  100. ))}
  101. </select>
  102. </div>
  103. </div>
  104. {this.renderSwitch(this.state.type)}
  105. </React.Fragment>
  106. );
  107. }
  108. }