StackdriverMetricFindQuery.ts 2.4 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788
  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. case 'resourceTypes':
  15. return this.handleResourceType(query);
  16. default:
  17. return [];
  18. }
  19. }
  20. async handleServiceQueryType() {
  21. const metricDescriptors = await this.datasource.getMetricTypes(this.datasource.projectName);
  22. const services = extractServicesFromMetricDescriptors(metricDescriptors);
  23. return services.map(s => ({
  24. text: s.serviceShortName,
  25. value: s.name,
  26. expandable: true,
  27. }));
  28. }
  29. async handleMetricTypesQueryType({ service }) {
  30. if (!service) {
  31. return [];
  32. }
  33. const metricDescriptors = await this.datasource.getMetricTypes(this.datasource.projectName);
  34. return getMetricTypesByService(metricDescriptors, service).map(s => ({
  35. text: s.displayName,
  36. value: s.name,
  37. expandable: true,
  38. }));
  39. }
  40. getLabelKey({ type, metricLabelKey, resourceLabelKey }) {
  41. switch (type) {
  42. case 'metricLabels':
  43. return metricLabelKey;
  44. break;
  45. case 'resourceLabels':
  46. return resourceLabelKey;
  47. default:
  48. return '';
  49. }
  50. }
  51. async handleLabelQueryType({ type, metricType, metricLabelKey, resourceLabelKey, resourceTypeKey }) {
  52. if (!metricType) {
  53. return [];
  54. }
  55. const key = this.getLabelKey({ type, metricLabelKey, resourceLabelKey });
  56. const refId = 'handleLabelsQueryType';
  57. const response = await this.datasource.getLabels(metricType, refId);
  58. if (!has(response, `meta.${type}.${key}`)) {
  59. return [];
  60. }
  61. return response.meta[type][key].map(s => ({
  62. text: s,
  63. expandable: true,
  64. }));
  65. }
  66. async handleResourceType({ metricType }) {
  67. if (!metricType) {
  68. return [];
  69. }
  70. try {
  71. const refId = 'handleResourceTypeQueryType';
  72. const response = await this.datasource.getLabels(metricType, refId);
  73. return response.meta.resourceTypes.map(s => ({
  74. text: s,
  75. expandable: true,
  76. }));
  77. } catch (error) {
  78. return [];
  79. }
  80. }
  81. }