panelHelper.js 3.6 KB

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