grafana/public/app/plugins/datasource/stackdriver/StackdriverMetricFindQuery.ts

111 lines
4.1 KiB
TypeScript
Raw Normal View History

2018-10-31 20:55:40 +08:00
import isString from 'lodash/isString';
import { alignmentPeriods } from './constants';
import { MetricFindQueryTypes } from './types';
import { getMetricTypesByService, getAlignmentOptionsByMetric, getAggregationOptionsByMetric } from './functions';
export default class StackdriverMetricFindQuery {
constructor(private datasource) {}
2018-11-09 20:48:57 +08:00
async execute(query: any) {
try {
2018-10-31 20:36:41 +08:00
switch (query.selectedQueryType) {
case MetricFindQueryTypes.MetricTypes:
return this.handleMetricTypesQuery(query);
case MetricFindQueryTypes.LabelKeys:
return this.handleLabelKeysQuery(query);
case MetricFindQueryTypes.LabelValues:
return this.handleLabelValuesQuery(query);
case MetricFindQueryTypes.ResourceTypes:
return this.handleResourceTypeQuery(query);
2018-11-09 21:36:04 +08:00
case MetricFindQueryTypes.Aligners:
return this.handleAlignersQuery(query);
case MetricFindQueryTypes.AlignmentPeriods:
return this.handleAlignmentPeriodQuery();
case MetricFindQueryTypes.Aggregations:
return this.handleAggregationQuery(query);
default:
return [];
}
} catch (error) {
console.error(`Could not run StackdriverMetricFindQuery ${query}`, error);
return [];
}
}
2018-10-31 20:36:41 +08:00
async handleMetricTypesQuery({ selectedService }) {
if (!selectedService) {
return [];
}
const metricDescriptors = await this.datasource.getMetricTypes(this.datasource.projectName);
2018-10-31 20:36:41 +08:00
return getMetricTypesByService(metricDescriptors, selectedService).map(s => ({
text: s.displayName,
2018-11-01 20:31:01 +08:00
value: s.type,
expandable: true,
}));
}
2018-10-26 21:57:01 +08:00
async handleLabelKeysQuery({ selectedQueryType, selectedMetricType, labelKey }) {
2018-10-31 20:36:41 +08:00
if (!selectedMetricType) {
2018-10-26 21:57:01 +08:00
return [];
}
const refId = 'handleLabelKeysQuery';
2018-10-31 20:36:41 +08:00
const response = await this.datasource.getLabels(selectedMetricType, refId);
const labelKeys = response.meta
? [...Object.keys(response.meta.resourceLabels), ...Object.keys(response.meta.metricLabels)]
: [];
return labelKeys.map(this.toFindQueryResult);
}
async handleLabelValuesQuery({ selectedQueryType, selectedMetricType, labelKey }) {
if (!selectedMetricType) {
return [];
}
const refId = 'handleLabelValuesQuery';
const response = await this.datasource.getLabels(selectedMetricType, refId);
let values = [];
if (response.meta && response.meta.metricLabels && response.meta.metricLabels.hasOwnProperty(labelKey)) {
values = response.meta.metricLabels[labelKey];
} else if (response.meta && response.meta.resourceLabels && response.meta.resourceLabels.hasOwnProperty(labelKey)) {
values = response.meta.resourceLabels[labelKey];
}
return values.map(this.toFindQueryResult);
2018-10-26 21:57:01 +08:00
}
2018-10-29 22:41:11 +08:00
2018-10-31 20:36:41 +08:00
async handleResourceTypeQuery({ selectedMetricType }) {
if (!selectedMetricType) {
2018-10-29 22:41:11 +08:00
return [];
}
const refId = 'handleResourceTypeQueryQueryType';
const response = await this.datasource.getLabels(selectedMetricType, refId);
return response.meta.resourceTypes ? response.meta.resourceTypes.map(this.toFindQueryResult) : [];
2018-10-29 22:41:11 +08:00
}
2018-10-29 23:27:53 +08:00
2018-10-31 20:36:41 +08:00
async handleAlignersQuery({ selectedMetricType }) {
if (!selectedMetricType) {
2018-10-29 23:27:53 +08:00
return [];
}
const metricDescriptors = await this.datasource.getMetricTypes(this.datasource.projectName);
2018-10-31 20:36:41 +08:00
const { valueType, metricKind } = metricDescriptors.find(m => m.type === selectedMetricType);
2018-10-30 00:38:43 +08:00
return getAlignmentOptionsByMetric(valueType, metricKind).map(this.toFindQueryResult);
2018-10-29 23:40:59 +08:00
}
2018-10-31 20:36:41 +08:00
async handleAggregationQuery({ selectedMetricType }) {
if (!selectedMetricType) {
2018-10-29 23:57:07 +08:00
return [];
}
const metricDescriptors = await this.datasource.getMetricTypes(this.datasource.projectName);
2018-10-31 20:36:41 +08:00
const { valueType, metricKind } = metricDescriptors.find(m => m.type === selectedMetricType);
2018-10-30 00:38:43 +08:00
return getAggregationOptionsByMetric(valueType, metricKind).map(this.toFindQueryResult);
2018-10-29 23:57:07 +08:00
}
2018-10-30 00:38:43 +08:00
handleAlignmentPeriodQuery() {
return alignmentPeriods.map(this.toFindQueryResult);
}
toFindQueryResult(x) {
return isString(x) ? { text: x, expandable: true } : { ...x, expandable: true };
}
}