StackdriverMetricFindQuery.ts 2.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103
  1. import {
  2. extractServicesFromMetricDescriptors,
  3. getMetricTypesByService,
  4. getAlignmentOptionsByMetric,
  5. } from './functions';
  6. import has from 'lodash/has';
  7. export default class StackdriverMetricFindQuery {
  8. constructor(private datasource) {}
  9. async query(query: any) {
  10. switch (query.type) {
  11. case 'services':
  12. return this.handleServiceQueryType();
  13. case 'metricTypes':
  14. return this.handleMetricTypesQueryType(query);
  15. case 'metricLabels':
  16. case 'resourceLabels':
  17. return this.handleLabelQueryType(query);
  18. case 'resourceTypes':
  19. return this.handleResourceType(query);
  20. case 'alignerns':
  21. return this.handleAlignersType(query);
  22. default:
  23. return [];
  24. }
  25. }
  26. async handleServiceQueryType() {
  27. const metricDescriptors = await this.datasource.getMetricTypes(this.datasource.projectName);
  28. const services = extractServicesFromMetricDescriptors(metricDescriptors);
  29. return services.map(s => ({
  30. text: s.serviceShortName,
  31. value: s.name,
  32. expandable: true,
  33. }));
  34. }
  35. async handleMetricTypesQueryType({ service }) {
  36. if (!service) {
  37. return [];
  38. }
  39. const metricDescriptors = await this.datasource.getMetricTypes(this.datasource.projectName);
  40. return getMetricTypesByService(metricDescriptors, service).map(s => ({
  41. text: s.displayName,
  42. value: s.name,
  43. expandable: true,
  44. }));
  45. }
  46. getLabelKey({ type, metricLabelKey, resourceLabelKey }) {
  47. switch (type) {
  48. case 'metricLabels':
  49. return metricLabelKey;
  50. break;
  51. case 'resourceLabels':
  52. return resourceLabelKey;
  53. default:
  54. return '';
  55. }
  56. }
  57. async handleLabelQueryType({ type, metricType, metricLabelKey, resourceLabelKey, resourceTypeKey }) {
  58. if (!metricType) {
  59. return [];
  60. }
  61. const key = this.getLabelKey({ type, metricLabelKey, resourceLabelKey });
  62. const refId = 'handleLabelsQueryType';
  63. const response = await this.datasource.getLabels(metricType, refId);
  64. if (!has(response, `meta.${type}.${key}`)) {
  65. return [];
  66. }
  67. return response.meta[type][key].map(s => ({
  68. text: s,
  69. expandable: true,
  70. }));
  71. }
  72. async handleResourceType({ metricType }) {
  73. if (!metricType) {
  74. return [];
  75. }
  76. try {
  77. const refId = 'handleResourceTypeQueryType';
  78. const response = await this.datasource.getLabels(metricType, refId);
  79. return response.meta.resourceTypes.map(s => ({
  80. text: s,
  81. expandable: true,
  82. }));
  83. } catch (error) {
  84. return [];
  85. }
  86. }
  87. async handleAlignersType({ metricType }) {
  88. if (!metricType) {
  89. return [];
  90. }
  91. const metricDescriptors = await this.datasource.getMetricTypes(this.datasource.projectName);
  92. const { valueType, metricKind } = metricDescriptors.find(m => m.type === metricType);
  93. return getAlignmentOptionsByMetric(valueType, metricKind);
  94. }
  95. }