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

89 lines
2.4 KiB
TypeScript
Raw Normal View History

import { extractServicesFromMetricDescriptors, getMetricTypesByService } from './functions';
2018-10-26 21:57:01 +08:00
import has from 'lodash/has';
export default class StackdriverMetricFindQuery {
constructor(private datasource) {}
async query(query: any) {
switch (query.type) {
case 'services':
return this.handleServiceQueryType();
case 'metricTypes':
return this.handleMetricTypesQueryType(query);
2018-10-26 21:57:01 +08:00
case 'metricLabels':
case 'resourceLabels':
return this.handleLabelQueryType(query);
2018-10-29 22:41:11 +08:00
case 'resourceTypes':
return this.handleResourceType(query);
default:
return [];
}
}
async handleServiceQueryType() {
const metricDescriptors = await this.datasource.getMetricTypes(this.datasource.projectName);
const services = extractServicesFromMetricDescriptors(metricDescriptors);
return services.map(s => ({
text: s.serviceShortName,
value: s.name,
expandable: true,
}));
}
async handleMetricTypesQueryType({ service }) {
if (!service) {
return [];
}
const metricDescriptors = await this.datasource.getMetricTypes(this.datasource.projectName);
return getMetricTypesByService(metricDescriptors, service).map(s => ({
text: s.displayName,
value: s.name,
expandable: true,
}));
}
2018-10-26 21:57:01 +08:00
2018-10-29 22:41:11 +08:00
getLabelKey({ type, metricLabelKey, resourceLabelKey }) {
switch (type) {
case 'metricLabels':
return metricLabelKey;
break;
case 'resourceLabels':
return resourceLabelKey;
default:
return '';
}
}
async handleLabelQueryType({ type, metricType, metricLabelKey, resourceLabelKey, resourceTypeKey }) {
if (!metricType) {
2018-10-26 21:57:01 +08:00
return [];
}
2018-10-29 22:41:11 +08:00
const key = this.getLabelKey({ type, metricLabelKey, resourceLabelKey });
const refId = 'handleLabelsQueryType';
2018-10-26 21:57:01 +08:00
const response = await this.datasource.getLabels(metricType, refId);
if (!has(response, `meta.${type}.${key}`)) {
return [];
}
return response.meta[type][key].map(s => ({
text: s,
expandable: true,
}));
2018-10-26 21:57:01 +08:00
}
2018-10-29 22:41:11 +08:00
async handleResourceType({ metricType }) {
if (!metricType) {
return [];
}
try {
const refId = 'handleResourceTypeQueryType';
const response = await this.datasource.getLabels(metricType, refId);
return response.meta.resourceTypes.map(s => ({
text: s,
expandable: true,
}));
} catch (error) {
return [];
}
}
}