2018-10-29 23:27:53 +08:00
|
|
|
import {
|
|
|
|
|
extractServicesFromMetricDescriptors,
|
|
|
|
|
getMetricTypesByService,
|
|
|
|
|
getAlignmentOptionsByMetric,
|
|
|
|
|
} from './functions';
|
2018-10-26 21:57:01 +08:00
|
|
|
import has from 'lodash/has';
|
2018-10-26 20:03:05 +08:00
|
|
|
|
|
|
|
|
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':
|
2018-10-29 21:56:55 +08:00
|
|
|
case 'resourceLabels':
|
|
|
|
|
return this.handleLabelQueryType(query);
|
2018-10-29 22:41:11 +08:00
|
|
|
case 'resourceTypes':
|
|
|
|
|
return this.handleResourceType(query);
|
2018-10-29 23:27:53 +08:00
|
|
|
case 'alignerns':
|
|
|
|
|
return this.handleAlignersType(query);
|
2018-10-26 20:03:05 +08:00
|
|
|
default:
|
|
|
|
|
return [];
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
async handleServiceQueryType() {
|
|
|
|
|
const metricDescriptors = await this.datasource.getMetricTypes(this.datasource.projectName);
|
|
|
|
|
const services = extractServicesFromMetricDescriptors(metricDescriptors);
|
|
|
|
|
return services.map(s => ({
|
2018-10-26 22:35:12 +08:00
|
|
|
text: s.serviceShortName,
|
|
|
|
|
value: s.name,
|
2018-10-26 20:03:05 +08:00
|
|
|
expandable: true,
|
|
|
|
|
}));
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
async handleMetricTypesQueryType({ service }) {
|
|
|
|
|
if (!service) {
|
|
|
|
|
return [];
|
|
|
|
|
}
|
|
|
|
|
const metricDescriptors = await this.datasource.getMetricTypes(this.datasource.projectName);
|
|
|
|
|
return getMetricTypesByService(metricDescriptors, service).map(s => ({
|
2018-10-26 22:35:12 +08:00
|
|
|
text: s.displayName,
|
|
|
|
|
value: s.name,
|
2018-10-26 20:03:05 +08:00
|
|
|
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 }) {
|
2018-10-29 21:56:55 +08:00
|
|
|
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 });
|
2018-10-29 21:56:55 +08:00
|
|
|
const refId = 'handleLabelsQueryType';
|
2018-10-26 21:57:01 +08:00
|
|
|
const response = await this.datasource.getLabels(metricType, refId);
|
2018-10-29 21:56:55 +08:00
|
|
|
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 [];
|
|
|
|
|
}
|
|
|
|
|
}
|
2018-10-29 23:27:53 +08:00
|
|
|
|
|
|
|
|
async handleAlignersType({ metricType }) {
|
|
|
|
|
if (!metricType) {
|
|
|
|
|
return [];
|
|
|
|
|
}
|
|
|
|
|
const metricDescriptors = await this.datasource.getMetricTypes(this.datasource.projectName);
|
|
|
|
|
const { valueType, metricKind } = metricDescriptors.find(m => m.type === metricType);
|
|
|
|
|
return getAlignmentOptionsByMetric(valueType, metricKind);
|
|
|
|
|
}
|
2018-10-26 20:03:05 +08:00
|
|
|
}
|