panelHelper.js 3.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129
  1. define([
  2. 'angular',
  3. 'app/core/utils/datemath',
  4. 'app/core/utils/rangeutil',
  5. 'lodash',
  6. 'kbn',
  7. 'jquery',
  8. ],
  9. function (angular, dateMath, rangeUtil, _, kbn, $) {
  10. 'use strict';
  11. var module = angular.module('grafana.services');
  12. module.service('panelHelper', function(timeSrv, $rootScope) {
  13. var self = this;
  14. this.setTimeQueryStart = function(scope) {
  15. scope.timing = {};
  16. scope.timing.queryStart = new Date().getTime();
  17. };
  18. this.setTimeQueryEnd = function(scope) {
  19. scope.timing.queryEnd = new Date().getTime();
  20. };
  21. this.setTimeRenderStart = function(scope) {
  22. scope.timing = scope.timing || {};
  23. scope.timing.renderStart = new Date().getTime();
  24. };
  25. this.setTimeRenderEnd = function(scope) {
  26. scope.timing.renderEnd = new Date().getTime();
  27. };
  28. this.broadcastRender = function(scope, data) {
  29. this.setTimeRenderStart(scope);
  30. scope.$broadcast('render', data);
  31. this.setTimeRenderEnd(scope);
  32. if ($rootScope.profilingEnabled) {
  33. $rootScope.performance.panels.push({
  34. panelId: scope.panel.id,
  35. query: scope.timing.queryEnd - scope.timing.queryStart,
  36. render: scope.timing.renderEnd - scope.timing.renderStart,
  37. });
  38. }
  39. };
  40. this.updateTimeRange = function(scope) {
  41. scope.range = timeSrv.timeRange();
  42. scope.rangeRaw = timeSrv.timeRange(false);
  43. this.applyPanelTimeOverrides(scope);
  44. if (scope.panel.maxDataPoints) {
  45. scope.resolution = scope.panel.maxDataPoints;
  46. }
  47. else {
  48. scope.resolution = Math.ceil($(window).width() * (scope.panel.span / 12));
  49. }
  50. scope.interval = kbn.calculateInterval(scope.range, scope.resolution, scope.panel.interval);
  51. };
  52. this.applyPanelTimeOverrides = function(scope) {
  53. scope.panelMeta.timeInfo = '';
  54. // check panel time overrrides
  55. if (scope.panel.timeFrom) {
  56. var timeFromInfo = rangeUtil.describeTextRange(scope.panel.timeFrom);
  57. if (timeFromInfo.invalid) {
  58. scope.panelMeta.timeFromInfo = 'invalid time override';
  59. return;
  60. }
  61. if (_.isString(scope.rangeRaw.from)) {
  62. var timeFromDate = dateMath.parse(timeFromInfo.from);
  63. scope.panelMeta.timeInfo = timeFromInfo.display;
  64. scope.rangeRaw.from = timeFromInfo.from;
  65. scope.rangeRaw.to = timeFromInfo.to;
  66. scope.range.from = timeFromDate;
  67. }
  68. }
  69. if (scope.panel.timeShift) {
  70. var timeShiftInfo = rangeUtil.describeTextRange(scope.panel.timeFrom);
  71. if (timeShiftInfo.invalid) {
  72. scope.panelMeta.timeInfo = 'invalid timeshift';
  73. return;
  74. }
  75. var timeShift = '-' + scope.panel.timeShift;
  76. scope.panelMeta.timeInfo += ' timeshift ' + timeShift;
  77. scope.range.from = dateMath.parseDateMath(timeShift, scope.range.from, false);
  78. scope.range.to = dateMath.parseDateMath(timeShift, scope.range.to, true);
  79. scope.rangeRaw = scope.range;
  80. }
  81. if (scope.panel.hideTimeOverride) {
  82. scope.panelMeta.timeInfo = '';
  83. }
  84. };
  85. this.issueMetricQuery = function(scope, datasource) {
  86. var metricsQuery = {
  87. range: scope.range,
  88. rangeRaw: scope.rangeRaw,
  89. interval: scope.interval,
  90. targets: scope.panel.targets,
  91. format: scope.panel.renderer === 'png' ? 'png' : 'json',
  92. maxDataPoints: scope.resolution,
  93. scopedVars: scope.panel.scopedVars,
  94. cacheTimeout: scope.panel.cacheTimeout
  95. };
  96. this.setTimeQueryStart(scope);
  97. return datasource.query(metricsQuery).then(function(results) {
  98. self.setTimeQueryEnd(scope);
  99. if (scope.dashboard.snapshot) {
  100. scope.panel.snapshotData = results;
  101. }
  102. return results;
  103. });
  104. };
  105. });
  106. });