StackdriverMetricFindQuery.ts 3.7 KB

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