StackdriverMetricFindQuery.ts 3.2 KB

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