diff --git a/public/app/features/dashboard/dashboardCtrl.js b/public/app/features/dashboard/dashboardCtrl.js index b6702631155..9f3e6da998f 100644 --- a/public/app/features/dashboard/dashboardCtrl.js +++ b/public/app/features/dashboard/dashboardCtrl.js @@ -60,6 +60,14 @@ function (angular, $, config, moment) { $scope.updateSubmenuVisibility(); $scope.setWindowTitleAndTheme(); + if ($scope.profilingEnabled) { + $scope.performance.panels = []; + $scope.performance.panelCount = 0; + $scope.dashboard.rows.forEach(function(row) { + $scope.performance.panelCount += row.panels.length; + }); + } + $scope.appEvent("dashboard-loaded", $scope.dashboard); }).catch(function(err) { if (err.data && err.data.message) { err.message = err.data.message; } diff --git a/public/app/features/dashboard/viewStateSrv.js b/public/app/features/dashboard/viewStateSrv.js index 2138dd37438..2a833b003c9 100644 --- a/public/app/features/dashboard/viewStateSrv.js +++ b/public/app/features/dashboard/viewStateSrv.js @@ -51,6 +51,13 @@ function (angular, _, $) { $scope.onAppEvent('panel-initialized', function(evt, payload) { self.registerPanel(payload.scope); + + if ($scope.profilingEnabled) { + $scope.performance.panelsInitialized++; + if ($scope.performance.panelsInitialized === $scope.performance.panelCount) { + $scope.performance.allPanelsInitialized = new Date().getTime(); + } + } }); this.update(this.getQueryStringState()); diff --git a/public/app/features/panel/metrics_panel_ctrl.ts b/public/app/features/panel/metrics_panel_ctrl.ts index 0bccee8ff35..edc744a5049 100644 --- a/public/app/features/panel/metrics_panel_ctrl.ts +++ b/public/app/features/panel/metrics_panel_ctrl.ts @@ -95,7 +95,6 @@ class MetricsPanelCtrl extends PanelCtrl { } setTimeQueryStart() { - this.timing = {}; this.timing.queryStart = new Date().getTime(); } diff --git a/public/app/features/panel/panel_ctrl.ts b/public/app/features/panel/panel_ctrl.ts index e47e3444564..df44559595b 100644 --- a/public/app/features/panel/panel_ctrl.ts +++ b/public/app/features/panel/panel_ctrl.ts @@ -31,6 +31,7 @@ export class PanelCtrl { height: any; containerHeight: any; events: Emitter; + timing: any; constructor($scope, $injector) { this.$injector = $injector; @@ -38,6 +39,7 @@ export class PanelCtrl { this.$timeout = $injector.get('$timeout'); this.editorTabIndex = 0; this.events = new Emitter(); + this.timing = {}; var plugin = config.panels[this.panel.type]; if (plugin) { @@ -58,6 +60,20 @@ export class PanelCtrl { renderingCompleted() { this.$scope.$root.performance.panelsRendered++; + this.timing.renderEnd = new Date().getTime(); + if (this.$scope.$root.profilingEnabled) { + this.$scope.$root.performance.panels.push({ + panelId: this.panel.id, + query: this.timing.queryEnd - this.timing.queryStart, + render: this.timing.renderEnd - this.timing.renderStart, + }); + + if (this.$scope.$root.performance.panelsRendered === this.$scope.$root.performance.panelCount) { + this.$scope.$root.performance.allPanelsRendered = new Date().getTime(); + var timeTaken = this.$scope.$root.performance.allPanelsRendered - this.$scope.$root.performance.dashboardLoadStart; + console.log("Dashboard::Performance - All panels rendered in " + timeTaken + " ms"); + } + } } refresh() { @@ -169,6 +185,7 @@ export class PanelCtrl { } this.calculatePanelHeight(); + this.timing.renderStart = new Date().getTime(); this.events.emit('render', payload); }