query_ctrl.ts 3.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124
  1. import _ from 'lodash';
  2. import { QueryCtrl } from 'app/plugins/sdk';
  3. import './query_aggregation_ctrl';
  4. import './query_filter_ctrl';
  5. import { StackdriverPicker } from './components/StackdriverPicker';
  6. import { react2AngularDirective } from 'app/core/utils/react2angular';
  7. import { registerAngularDirectives } from './angular_wrappers';
  8. import { Target, QueryMeta } from './types';
  9. export const DefaultTarget = {
  10. defaultProject: 'loading project...',
  11. metricType: '',
  12. service: '',
  13. metric: '',
  14. unit: '',
  15. aggregation: {
  16. crossSeriesReducer: 'REDUCE_MEAN',
  17. alignmentPeriod: 'stackdriver-auto',
  18. perSeriesAligner: 'ALIGN_MEAN',
  19. groupBys: [],
  20. },
  21. filters: [],
  22. showAggregationOptions: false,
  23. aliasBy: '',
  24. metricKind: '',
  25. valueType: '',
  26. };
  27. export class StackdriverQueryCtrl extends QueryCtrl {
  28. static templateUrl = 'partials/query.editor.html';
  29. target: Target;
  30. defaults = {
  31. defaultProject: 'loading project...',
  32. metricType: '',
  33. service: '',
  34. metric: '',
  35. unit: '',
  36. aggregation: {
  37. crossSeriesReducer: 'REDUCE_MEAN',
  38. alignmentPeriod: 'stackdriver-auto',
  39. perSeriesAligner: 'ALIGN_MEAN',
  40. groupBys: [],
  41. },
  42. filters: [],
  43. showAggregationOptions: false,
  44. aliasBy: '',
  45. metricKind: '',
  46. valueType: '',
  47. };
  48. showHelp: boolean;
  49. showLastQuery: boolean;
  50. lastQueryMeta: QueryMeta;
  51. lastQueryError?: string;
  52. labelData: QueryMeta;
  53. loadLabelsPromise: Promise<any>;
  54. templateSrv: any;
  55. $rootScope: any;
  56. uiSegmentSrv: any;
  57. /** @ngInject */
  58. constructor($scope, $injector, templateSrv, $rootScope, uiSegmentSrv) {
  59. super($scope, $injector);
  60. this.templateSrv = templateSrv;
  61. this.$rootScope = $rootScope;
  62. this.uiSegmentSrv = uiSegmentSrv;
  63. _.defaultsDeep(this.target, this.defaults);
  64. this.panelCtrl.events.on('data-received', this.onDataReceived.bind(this), $scope);
  65. this.panelCtrl.events.on('data-error', this.onDataError.bind(this), $scope);
  66. react2AngularDirective('stackdriverPicker', StackdriverPicker, [
  67. 'options',
  68. 'onChange',
  69. 'selected',
  70. 'searchable',
  71. 'className',
  72. 'placeholder',
  73. 'groupName',
  74. ['templateVariables', { watchDepth: 'reference' }],
  75. ]);
  76. registerAngularDirectives();
  77. this.handleQueryChange = this.handleQueryChange.bind(this);
  78. this.handleExecuteQuery = this.handleExecuteQuery.bind(this);
  79. }
  80. handleQueryChange(target: Target) {
  81. Object.assign(this.target, target);
  82. }
  83. handleExecuteQuery() {
  84. this.$scope.ctrl.refresh();
  85. }
  86. onDataReceived(dataList) {
  87. this.lastQueryError = null;
  88. this.lastQueryMeta = null;
  89. const anySeriesFromQuery: any = _.find(dataList, { refId: this.target.refId });
  90. if (anySeriesFromQuery) {
  91. this.lastQueryMeta = anySeriesFromQuery.meta;
  92. this.lastQueryMeta.rawQueryString = decodeURIComponent(this.lastQueryMeta.rawQuery);
  93. }
  94. }
  95. onDataError(err) {
  96. if (err.data && err.data.results) {
  97. const queryRes = err.data.results[this.target.refId];
  98. if (queryRes && queryRes.error) {
  99. this.lastQueryMeta = queryRes.meta;
  100. this.lastQueryMeta.rawQueryString = decodeURIComponent(this.lastQueryMeta.rawQuery);
  101. let jsonBody;
  102. try {
  103. jsonBody = JSON.parse(queryRes.error);
  104. } catch {
  105. this.lastQueryError = queryRes.error;
  106. }
  107. this.lastQueryError = jsonBody.error.message;
  108. }
  109. }
  110. }
  111. }