| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173 |
- import React, { PureComponent } from 'react';
- import ServiceSelector from './ServiceSelector';
- import MetricTypeSelector from './MetricTypeSelector';
- import SimpleDropdown from './SimpleDropdown';
- import { TemplateQueryProps } from 'app/types/plugins';
- import defaultsDeep from 'lodash/defaultsDeep';
- import has from 'lodash/has';
- import { MetricFindQueryTypes } from '../types';
- export class StackdriverTemplateQueryComponent extends PureComponent<TemplateQueryProps, any> {
- queryTypes: Array<{ value: string; name: string }> = [
- { value: MetricFindQueryTypes.Services, name: 'Services' },
- { value: MetricFindQueryTypes.MetricTypes, name: 'Metric Types' },
- { value: MetricFindQueryTypes.MetricLabels, name: 'Metric Labels' },
- { value: MetricFindQueryTypes.ResourceLabels, name: 'Resource Labels' },
- { value: MetricFindQueryTypes.ResourceTypes, name: 'Resource Types' },
- { value: MetricFindQueryTypes.Aggregations, name: 'Aggregations' },
- { value: MetricFindQueryTypes.Alignerns, name: 'Aligners' },
- { value: MetricFindQueryTypes.AlignmentPeriods, name: 'Alignment Periods' },
- ];
- defaults = {
- type: undefined,
- metricDescriptors: [],
- service: undefined,
- metricType: undefined,
- metricLabels: [],
- resourceLabels: [],
- metricLabelKey: undefined,
- resourceLabelKey: undefined,
- };
- constructor(props: TemplateQueryProps) {
- super(props);
- this.handleQueryTypeChange = this.handleQueryTypeChange.bind(this);
- this.onServiceChange = this.onServiceChange.bind(this);
- this.onMetricTypeChange = this.onMetricTypeChange.bind(this);
- this.onMetricLabelKeyChange = this.onMetricLabelKeyChange.bind(this);
- this.onResourceLabelKeyChange = this.onResourceLabelKeyChange.bind(this);
- this.state = defaultsDeep(this.props.query, this.defaults);
- }
- async componentDidMount() {
- const metricDescriptors = await this.props.datasource.getMetricTypes(this.props.datasource.projectName);
- this.setState({ metricDescriptors });
- }
- isLabelQuery(queryType) {
- return [MetricFindQueryTypes.MetricLabels, MetricFindQueryTypes.ResourceLabels].indexOf(queryType) !== -1;
- }
- async loadTimeSeriesData() {
- const refId = 'StackdriverTemplateQueryComponent';
- const response = await this.props.datasource.getLabels(this.state.metricType, refId);
- if (this.isLabelQuery(this.state.type) && has(response, `meta.${this.state.type}`)) {
- this.setState({ [this.state.type]: Object.keys(response.meta[this.state.type]) });
- }
- }
- handleQueryTypeChange(event) {
- this.setState({ type: event.target.value });
- if (this.isLabelQuery(event.target.value)) {
- this.loadTimeSeriesData();
- }
- }
- onServiceChange(event) {
- this.setState({ service: event.target.value });
- }
- onMetricTypeChange(event) {
- this.setState({ metricType: event.target.value });
- if (this.isLabelQuery(this.state.type)) {
- this.loadTimeSeriesData();
- }
- }
- onMetricLabelKeyChange(event) {
- this.setState({ metricLabelKey: event.target.value });
- }
- onResourceLabelKeyChange(event) {
- this.setState({ resourceLabelKey: event.target.value });
- }
- componentDidUpdate() {
- const { metricDescriptors, metricLabels, resourceLabels, ...queryModel } = this.state;
- this.props.onChange(queryModel);
- }
- switchMetaType(queryType) {
- switch (queryType) {
- case MetricFindQueryTypes.ResourceLabels:
- return (
- <SimpleDropdown
- value={this.state.resourceLabelKey}
- options={this.state.resourceLabels}
- onValueChange={this.onResourceLabelKeyChange}
- label="Resource Labels"
- />
- );
- case MetricFindQueryTypes.MetricLabels:
- return (
- <SimpleDropdown
- value={this.state.metricLabelKey}
- options={this.state.metricLabels}
- onValueChange={this.onMetricLabelKeyChange}
- label="Metric Labels"
- />
- );
- default:
- return '';
- }
- }
- renderSwitch(queryType) {
- switch (queryType) {
- case MetricFindQueryTypes.MetricTypes:
- return (
- <ServiceSelector metricDescriptors={this.state.metricDescriptors} onServiceChange={this.onServiceChange} />
- );
- case MetricFindQueryTypes.MetricLabels:
- case MetricFindQueryTypes.ResourceLabels:
- case MetricFindQueryTypes.ResourceTypes:
- const dropdown = this.switchMetaType(queryType);
- return (
- <React.Fragment>
- <ServiceSelector metricDescriptors={this.state.metricDescriptors} onServiceChange={this.onServiceChange} />
- <MetricTypeSelector
- selectedService={this.state.service}
- metricDescriptors={this.state.metricDescriptors}
- onMetricTypeChange={this.onMetricTypeChange}
- />
- {dropdown}
- </React.Fragment>
- );
- case MetricFindQueryTypes.Alignerns:
- case MetricFindQueryTypes.Aggregations:
- return (
- <React.Fragment>
- <ServiceSelector metricDescriptors={this.state.metricDescriptors} onServiceChange={this.onServiceChange} />
- <MetricTypeSelector
- selectedService={this.state.service}
- metricDescriptors={this.state.metricDescriptors}
- onMetricTypeChange={this.onMetricTypeChange}
- />
- </React.Fragment>
- );
- default:
- return '';
- }
- }
- render() {
- return (
- <React.Fragment>
- <div className="gf-form max-width-21">
- <span className="gf-form-label width-7">Query Type</span>
- <div className="gf-form-select-wrapper max-width-14">
- <select className="gf-form-input" required onChange={this.handleQueryTypeChange}>
- {this.queryTypes.map((qt, i) => (
- <option key={i} value={qt.value} ng-if="false">
- {qt.name}
- </option>
- ))}
- </select>
- </div>
- </div>
- {this.renderSwitch(this.state.type)}
- </React.Fragment>
- );
- }
- }
|