StackdriverMetricFindQuery.ts 1.7 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758
  1. import { extractServicesFromMetricDescriptors, getMetricTypesByService } from './functions';
  2. import has from 'lodash/has';
  3. export default class StackdriverMetricFindQuery {
  4. constructor(private datasource) {}
  5. async query(query: any) {
  6. switch (query.type) {
  7. case 'services':
  8. return this.handleServiceQueryType();
  9. case 'metricTypes':
  10. return this.handleMetricTypesQueryType(query);
  11. case 'metricLabels':
  12. case 'resourceLabels':
  13. return this.handleLabelQueryType(query);
  14. default:
  15. return [];
  16. }
  17. }
  18. async handleServiceQueryType() {
  19. const metricDescriptors = await this.datasource.getMetricTypes(this.datasource.projectName);
  20. const services = extractServicesFromMetricDescriptors(metricDescriptors);
  21. return services.map(s => ({
  22. text: s.serviceShortName,
  23. value: s.name,
  24. expandable: true,
  25. }));
  26. }
  27. async handleMetricTypesQueryType({ service }) {
  28. if (!service) {
  29. return [];
  30. }
  31. const metricDescriptors = await this.datasource.getMetricTypes(this.datasource.projectName);
  32. return getMetricTypesByService(metricDescriptors, service).map(s => ({
  33. text: s.displayName,
  34. value: s.name,
  35. expandable: true,
  36. }));
  37. }
  38. async handleLabelQueryType({ type, metricType, metricLabelKey, resourceLabelKey }) {
  39. if (!metricType) {
  40. return [];
  41. }
  42. const key = type === 'metricLabels' ? metricLabelKey : resourceLabelKey;
  43. const refId = 'handleLabelsQueryType';
  44. const response = await this.datasource.getLabels(metricType, refId);
  45. if (!has(response, `meta.${type}.${key}`)) {
  46. return [];
  47. }
  48. return response.meta[type][key].map(s => ({
  49. text: s,
  50. expandable: true,
  51. }));
  52. }
  53. }