@grafana/scenes 6.39.2--canary.1264.18315947032.0 → 6.40.0--canary.1265.18325783397.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (54) hide show
  1. package/dist/esm/behaviors/LongFrameDetector.js +11 -11
  2. package/dist/esm/behaviors/LongFrameDetector.js.map +1 -1
  3. package/dist/esm/behaviors/PanelProfilingManager.js +65 -0
  4. package/dist/esm/behaviors/PanelProfilingManager.js.map +1 -0
  5. package/dist/esm/behaviors/ScenePerformanceTracker.js +78 -0
  6. package/dist/esm/behaviors/ScenePerformanceTracker.js.map +1 -0
  7. package/dist/esm/behaviors/SceneRenderProfiler.js +88 -132
  8. package/dist/esm/behaviors/SceneRenderProfiler.js.map +1 -1
  9. package/dist/esm/behaviors/VizPanelRenderProfiler.js +328 -0
  10. package/dist/esm/behaviors/VizPanelRenderProfiler.js.map +1 -0
  11. package/dist/esm/behaviors/index.js +3 -0
  12. package/dist/esm/behaviors/index.js.map +1 -1
  13. package/dist/esm/behaviors/interactionConstants.js +14 -0
  14. package/dist/esm/behaviors/interactionConstants.js.map +1 -0
  15. package/dist/esm/components/SceneRefreshPicker.js +1 -1
  16. package/dist/esm/components/SceneRefreshPicker.js.map +1 -1
  17. package/dist/esm/components/VizPanel/VizPanel.js +36 -1
  18. package/dist/esm/components/VizPanel/VizPanel.js.map +1 -1
  19. package/dist/esm/components/VizPanel/VizPanelRenderer.js +20 -2
  20. package/dist/esm/components/VizPanel/VizPanelRenderer.js.map +1 -1
  21. package/dist/esm/core/SceneTimeRange.js +1 -1
  22. package/dist/esm/core/SceneTimeRange.js.map +1 -1
  23. package/dist/esm/index.js +3 -0
  24. package/dist/esm/index.js.map +1 -1
  25. package/dist/esm/querying/SceneDataTransformer.js +64 -0
  26. package/dist/esm/querying/SceneDataTransformer.js.map +1 -1
  27. package/dist/esm/querying/SceneQueryRunner.js +11 -6
  28. package/dist/esm/querying/SceneQueryRunner.js.map +1 -1
  29. package/dist/esm/querying/layers/SceneDataLayerControls.js +1 -13
  30. package/dist/esm/querying/layers/SceneDataLayerControls.js.map +1 -1
  31. package/dist/esm/querying/registerQueryWithController.js +39 -2
  32. package/dist/esm/querying/registerQueryWithController.js.map +1 -1
  33. package/dist/esm/utils/findPanelProfiler.js +18 -0
  34. package/dist/esm/utils/findPanelProfiler.js.map +1 -0
  35. package/dist/esm/utils/writePerformanceLog.js +12 -0
  36. package/dist/esm/utils/writePerformanceLog.js.map +1 -0
  37. package/dist/esm/utils/writeSceneLog.js +1 -10
  38. package/dist/esm/utils/writeSceneLog.js.map +1 -1
  39. package/dist/esm/variables/adhoc/AdHocFiltersCombobox/AdHocFiltersCombobox.js +1 -1
  40. package/dist/esm/variables/adhoc/AdHocFiltersCombobox/AdHocFiltersCombobox.js.map +1 -1
  41. package/dist/esm/variables/adhoc/AdHocFiltersVariable.js +1 -1
  42. package/dist/esm/variables/adhoc/AdHocFiltersVariable.js.map +1 -1
  43. package/dist/esm/variables/components/VariableValueSelect.js +1 -1
  44. package/dist/esm/variables/components/VariableValueSelect.js.map +1 -1
  45. package/dist/esm/variables/groupby/GroupByVariable.js +1 -1
  46. package/dist/esm/variables/groupby/GroupByVariable.js.map +1 -1
  47. package/dist/esm/variables/variants/MultiValueVariable.js +1 -1
  48. package/dist/esm/variables/variants/MultiValueVariable.js.map +1 -1
  49. package/dist/esm/variables/variants/ScopesVariable.js +1 -1
  50. package/dist/esm/variables/variants/ScopesVariable.js.map +1 -1
  51. package/dist/index.d.ts +369 -85
  52. package/dist/index.js +7436 -6831
  53. package/dist/index.js.map +1 -1
  54. package/package.json +2 -2
@@ -0,0 +1,328 @@
1
+ import { SceneObjectBase } from '../core/SceneObjectBase.js';
2
+ import { VizPanel } from '../components/VizPanel/VizPanel.js';
3
+ import { writeSceneLog } from '../utils/writeSceneLog.js';
4
+ import { sceneGraph } from '../core/sceneGraph/index.js';
5
+ import { generateOperationId, getScenePerformanceTracker } from './ScenePerformanceTracker.js';
6
+
7
+ class VizPanelRenderProfiler extends SceneObjectBase {
8
+ constructor(state = {}) {
9
+ super({
10
+ ...state
11
+ });
12
+ this._isTracking = false;
13
+ this._activeQueries = /* @__PURE__ */ new Map();
14
+ this.addActivationHandler(() => {
15
+ return this._onActivate();
16
+ });
17
+ }
18
+ _onActivate() {
19
+ var _a, _b;
20
+ let panel;
21
+ try {
22
+ panel = sceneGraph.getAncestor(this, VizPanel);
23
+ } catch (error) {
24
+ writeSceneLog("VizPanelRenderProfiler", "Failed to find VizPanel ancestor", error);
25
+ return;
26
+ }
27
+ if (!panel) {
28
+ writeSceneLog("VizPanelRenderProfiler", "Not attached to a VizPanel");
29
+ return;
30
+ }
31
+ if (!panel.state.key) {
32
+ writeSceneLog("VizPanelRenderProfiler", "Panel has no key, skipping tracking");
33
+ return;
34
+ }
35
+ this._panelKey = panel.state.key;
36
+ this._panelId = String(panel.getLegacyPanelId());
37
+ this._pluginId = panel.state.pluginId;
38
+ const plugin = panel.getPlugin();
39
+ this._pluginVersion = (_b = (_a = plugin == null ? void 0 : plugin.meta) == null ? void 0 : _a.info) == null ? void 0 : _b.version;
40
+ this._subs.add(
41
+ panel.subscribeToState((newState, prevState) => {
42
+ this._handlePanelStateChange(panel, newState, prevState);
43
+ })
44
+ );
45
+ return () => {
46
+ this._cleanup();
47
+ };
48
+ }
49
+ _handlePanelStateChange(panel, newState, prevState) {
50
+ if (newState.pluginId !== prevState.pluginId) {
51
+ this._onPluginChange(panel, newState.pluginId);
52
+ }
53
+ }
54
+ /**
55
+ * Track query execution with operation ID correlation
56
+ */
57
+ onQueryStarted(timestamp, entry, queryId) {
58
+ if (!this._panelKey) {
59
+ return null;
60
+ }
61
+ this._activeQueries.set(queryId, { entry, startTime: timestamp });
62
+ const operationId = generateOperationId("query");
63
+ getScenePerformanceTracker().notifyPanelOperationStart({
64
+ operationId,
65
+ panelId: this._panelId,
66
+ panelKey: this._panelKey,
67
+ pluginId: this._pluginId,
68
+ pluginVersion: this._pluginVersion,
69
+ operation: "query",
70
+ timestamp,
71
+ metadata: {
72
+ queryId,
73
+ queryType: entry.type
74
+ }
75
+ });
76
+ const callback = (endTimestamp, error) => {
77
+ if (!this._panelKey) {
78
+ return;
79
+ }
80
+ const queryInfo = this._activeQueries.get(queryId);
81
+ if (!queryInfo) {
82
+ return;
83
+ }
84
+ const duration = endTimestamp - queryInfo.startTime;
85
+ this._activeQueries.delete(queryId);
86
+ getScenePerformanceTracker().notifyPanelOperationComplete({
87
+ operationId,
88
+ panelId: this._panelId,
89
+ panelKey: this._panelKey,
90
+ pluginId: this._pluginId,
91
+ pluginVersion: this._pluginVersion,
92
+ operation: "query",
93
+ timestamp: endTimestamp,
94
+ duration,
95
+ metadata: {
96
+ queryId,
97
+ queryType: entry.type
98
+ },
99
+ error: error ? (error == null ? void 0 : error.message) || String(error) || "Unknown error" : void 0
100
+ });
101
+ };
102
+ return callback;
103
+ }
104
+ /**
105
+ * Track plugin loading with operation ID correlation
106
+ */
107
+ onPluginLoadStart(pluginId) {
108
+ if (!this._panelKey) {
109
+ let panel;
110
+ try {
111
+ panel = sceneGraph.getAncestor(this, VizPanel);
112
+ } catch (error) {
113
+ return null;
114
+ }
115
+ if (panel && !this._panelKey && panel.state.key) {
116
+ this._panelKey = panel.state.key;
117
+ this._panelId = String(panel.getLegacyPanelId());
118
+ this._pluginId = pluginId;
119
+ }
120
+ }
121
+ if (!this._panelKey) {
122
+ return null;
123
+ }
124
+ if (!this._isTracking) {
125
+ this._startTracking();
126
+ }
127
+ this._loadPluginStartTime = performance.now();
128
+ const operationId = generateOperationId("pluginLoad");
129
+ getScenePerformanceTracker().notifyPanelOperationStart({
130
+ operationId,
131
+ panelId: this._panelId,
132
+ panelKey: this._panelKey,
133
+ pluginId: this._pluginId,
134
+ operation: "plugin-load",
135
+ timestamp: this._loadPluginStartTime,
136
+ metadata: {
137
+ pluginId
138
+ }
139
+ });
140
+ const callback = (plugin, fromCache = false) => {
141
+ if (!this._panelKey || !this._loadPluginStartTime) {
142
+ return;
143
+ }
144
+ const duration = performance.now() - this._loadPluginStartTime;
145
+ getScenePerformanceTracker().notifyPanelOperationComplete({
146
+ operationId,
147
+ panelId: this._panelId,
148
+ panelKey: this._panelKey,
149
+ pluginId: this._pluginId,
150
+ operation: "plugin-load",
151
+ timestamp: performance.now(),
152
+ duration,
153
+ metadata: {
154
+ pluginId: this._pluginId,
155
+ fromCache,
156
+ pluginLoadTime: duration
157
+ }
158
+ });
159
+ this._loadPluginStartTime = void 0;
160
+ };
161
+ return callback;
162
+ }
163
+ /**
164
+ * Track field config processing with operation ID correlation
165
+ */
166
+ onFieldConfigStart(timestamp) {
167
+ if (!this._panelKey) {
168
+ return null;
169
+ }
170
+ this._applyFieldConfigStartTime = timestamp;
171
+ const operationId = generateOperationId("fieldConfig");
172
+ getScenePerformanceTracker().notifyPanelOperationStart({
173
+ operationId,
174
+ panelId: this._panelId,
175
+ panelKey: this._panelKey,
176
+ pluginId: this._pluginId,
177
+ operation: "fieldConfig",
178
+ timestamp: this._applyFieldConfigStartTime,
179
+ metadata: {
180
+ // Initial metadata - will be updated on completion with actual counts
181
+ }
182
+ });
183
+ const callback = (endTimestamp, dataPointsCount, seriesCount) => {
184
+ if (!this._panelKey || !this._applyFieldConfigStartTime) {
185
+ return;
186
+ }
187
+ const duration = endTimestamp - this._applyFieldConfigStartTime;
188
+ getScenePerformanceTracker().notifyPanelOperationComplete({
189
+ operationId,
190
+ panelId: this._panelId,
191
+ panelKey: this._panelKey,
192
+ pluginId: this._pluginId,
193
+ operation: "fieldConfig",
194
+ timestamp: endTimestamp,
195
+ duration,
196
+ metadata: {}
197
+ });
198
+ this._applyFieldConfigStartTime = void 0;
199
+ };
200
+ return callback;
201
+ }
202
+ /**
203
+ * Get panel info for logging - truncates long titles for readability
204
+ */
205
+ _getPanelInfo() {
206
+ let panel;
207
+ try {
208
+ panel = sceneGraph.getAncestor(this, VizPanel);
209
+ } catch (error) {
210
+ }
211
+ let panelTitle = (panel == null ? void 0 : panel.state.title) || this._panelKey || "No-key panel";
212
+ if (panelTitle.length > 30) {
213
+ panelTitle = panelTitle.substring(0, 27) + "...";
214
+ }
215
+ return `VizPanelRenderProfiler [${panelTitle}]`;
216
+ }
217
+ /**
218
+ * Track simple render timing with operation ID correlation
219
+ */
220
+ onSimpleRenderStart(timestamp) {
221
+ if (!this._panelKey) {
222
+ return void 0;
223
+ }
224
+ const operationId = generateOperationId("render");
225
+ getScenePerformanceTracker().notifyPanelOperationStart({
226
+ operationId,
227
+ panelId: this._panelId || "unknown",
228
+ panelKey: this._panelKey,
229
+ pluginId: this._pluginId || "unknown",
230
+ pluginVersion: this._pluginVersion,
231
+ operation: "render",
232
+ timestamp,
233
+ metadata: {}
234
+ });
235
+ return (endTimestamp, duration) => {
236
+ if (!this._panelKey) {
237
+ return;
238
+ }
239
+ getScenePerformanceTracker().notifyPanelOperationComplete({
240
+ operationId,
241
+ panelId: this._panelId || "unknown",
242
+ panelKey: this._panelKey,
243
+ pluginId: this._pluginId || "unknown",
244
+ pluginVersion: this._pluginVersion,
245
+ operation: "render",
246
+ duration,
247
+ timestamp: endTimestamp,
248
+ metadata: {}
249
+ });
250
+ };
251
+ }
252
+ /** Handle plugin changes */
253
+ _onPluginChange(panel, newPluginId) {
254
+ var _a, _b;
255
+ this._pluginId = newPluginId;
256
+ const plugin = panel.getPlugin();
257
+ this._pluginVersion = (_b = (_a = plugin == null ? void 0 : plugin.meta) == null ? void 0 : _a.info) == null ? void 0 : _b.version;
258
+ writeSceneLog(this._getPanelInfo(), `Plugin changed to ${newPluginId}`);
259
+ }
260
+ /** Start tracking this panel */
261
+ _startTracking() {
262
+ if (!this._panelKey || !this._pluginId || this._isTracking) {
263
+ return;
264
+ }
265
+ this._isTracking = true;
266
+ }
267
+ /** Cleanup when behavior is deactivated */
268
+ _cleanup() {
269
+ this._activeQueries.clear();
270
+ this._isTracking = false;
271
+ writeSceneLog(this._getPanelInfo(), "Cleaned up");
272
+ }
273
+ /**
274
+ * Track data transformation with operation ID correlation
275
+ */
276
+ onDataTransformStart(timestamp, transformationId, metrics) {
277
+ if (!this._panelKey) {
278
+ return null;
279
+ }
280
+ const operationId = generateOperationId("transform");
281
+ getScenePerformanceTracker().notifyPanelOperationStart({
282
+ operationId,
283
+ panelId: this._panelId,
284
+ panelKey: this._panelKey,
285
+ pluginId: this._pluginId,
286
+ operation: "transform",
287
+ timestamp,
288
+ metadata: {
289
+ transformationId,
290
+ transformationCount: metrics.transformationCount,
291
+ // dataFrameCount: metrics.dataFrameCount,
292
+ // totalDataPoints: metrics.totalDataPoints,
293
+ seriesTransformationCount: metrics.seriesTransformationCount,
294
+ annotationTransformationCount: metrics.annotationTransformationCount
295
+ }
296
+ });
297
+ const callback = (endTimestamp, duration, success, result) => {
298
+ if (!this._panelKey) {
299
+ return;
300
+ }
301
+ getScenePerformanceTracker().notifyPanelOperationComplete({
302
+ operationId,
303
+ panelId: this._panelId,
304
+ panelKey: this._panelKey,
305
+ pluginId: this._pluginId,
306
+ operation: "transform",
307
+ timestamp: endTimestamp,
308
+ duration,
309
+ metadata: {
310
+ transformationId,
311
+ transformationCount: metrics.transformationCount,
312
+ seriesTransformationCount: metrics.seriesTransformationCount,
313
+ annotationTransformationCount: metrics.annotationTransformationCount,
314
+ success,
315
+ error: (result == null ? void 0 : result.error) || (!success ? "Transform operation failed" : void 0)
316
+ // dataFrameCount: metrics.dataFrameCount,
317
+ // totalDataPoints: metrics.totalDataPoints,
318
+ // outputSeriesCount: result?.outputSeriesCount,
319
+ // outputAnnotationsCount: result?.outputAnnotationsCount,
320
+ }
321
+ });
322
+ };
323
+ return callback;
324
+ }
325
+ }
326
+
327
+ export { VizPanelRenderProfiler };
328
+ //# sourceMappingURL=VizPanelRenderProfiler.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"VizPanelRenderProfiler.js","sources":["../../../src/behaviors/VizPanelRenderProfiler.ts"],"sourcesContent":["import { SceneObjectBase } from '../core/SceneObjectBase';\nimport { SceneObjectState } from '../core/types';\nimport { VizPanel } from '../components/VizPanel/VizPanel';\nimport { writeSceneLog } from '../utils/writeSceneLog';\nimport { sceneGraph } from '../core/sceneGraph';\nimport { SceneQueryControllerEntry } from './types';\nimport { QueryProfilerLike } from '../querying/registerQueryWithController';\nimport { getScenePerformanceTracker, generateOperationId } from './ScenePerformanceTracker';\n\nexport interface VizPanelRenderProfilerState extends SceneObjectState {}\n\n/**\n * Tracks performance metrics for individual VizPanel instances using observer pattern.\n *\n * Performance events are sent to ScenePerformanceTracker observers, which are consumed\n * by Grafana's ScenePerformanceLogger and DashboardAnalyticsAggregator.\n */\n\nexport class VizPanelRenderProfiler extends SceneObjectBase<VizPanelRenderProfilerState> implements QueryProfilerLike {\n private _panelKey?: string;\n private _panelId?: string;\n private _pluginId?: string;\n private _pluginVersion?: string;\n private _isTracking = false;\n private _loadPluginStartTime?: number;\n private _applyFieldConfigStartTime?: number;\n private _activeQueries = new Map<string, { entry: SceneQueryControllerEntry; startTime: number }>();\n\n public constructor(state: Partial<VizPanelRenderProfilerState> = {}) {\n super({\n ...state,\n });\n\n this.addActivationHandler(() => {\n return this._onActivate();\n });\n }\n\n private _onActivate() {\n let panel: VizPanel | undefined;\n\n try {\n panel = sceneGraph.getAncestor(this, VizPanel);\n } catch (error) {\n writeSceneLog('VizPanelRenderProfiler', 'Failed to find VizPanel ancestor', error);\n return;\n }\n\n if (!panel) {\n writeSceneLog('VizPanelRenderProfiler', 'Not attached to a VizPanel');\n return;\n }\n\n if (!panel.state.key) {\n writeSceneLog('VizPanelRenderProfiler', 'Panel has no key, skipping tracking');\n return;\n }\n\n this._panelKey = panel.state.key;\n this._panelId = String(panel.getLegacyPanelId());\n this._pluginId = panel.state.pluginId;\n const plugin = panel.getPlugin();\n this._pluginVersion = plugin?.meta?.info?.version;\n\n this._subs.add(\n panel.subscribeToState((newState, prevState) => {\n this._handlePanelStateChange(panel, newState, prevState);\n })\n );\n\n return () => {\n this._cleanup();\n };\n }\n\n private _handlePanelStateChange(panel: VizPanel, newState: any, prevState: any) {\n if (newState.pluginId !== prevState.pluginId) {\n this._onPluginChange(panel, newState.pluginId);\n }\n }\n\n /**\n * Track query execution with operation ID correlation\n */\n public onQueryStarted(\n timestamp: number,\n entry: SceneQueryControllerEntry,\n queryId: string\n ): ((endTimestamp: number, error?: any) => void) | null {\n if (!this._panelKey) {\n return null;\n }\n\n this._activeQueries.set(queryId, { entry, startTime: timestamp });\n\n const operationId = generateOperationId('query');\n\n // ✅ Use panel operation tracking for panel queries\n getScenePerformanceTracker().notifyPanelOperationStart({\n operationId,\n panelId: this._panelId!,\n panelKey: this._panelKey,\n pluginId: this._pluginId!,\n pluginVersion: this._pluginVersion,\n operation: 'query',\n timestamp,\n metadata: {\n queryId: queryId,\n queryType: entry.type,\n },\n });\n\n // Return end callback with captured operationId and query context\n const callback = (endTimestamp: number, error?: any) => {\n if (!this._panelKey) {\n return;\n }\n\n const queryInfo = this._activeQueries.get(queryId);\n if (!queryInfo) {\n return;\n }\n\n const duration = endTimestamp - queryInfo.startTime;\n this._activeQueries.delete(queryId);\n\n getScenePerformanceTracker().notifyPanelOperationComplete({\n operationId,\n panelId: this._panelId!,\n panelKey: this._panelKey,\n pluginId: this._pluginId!,\n pluginVersion: this._pluginVersion,\n operation: 'query',\n timestamp: endTimestamp,\n duration: duration,\n metadata: {\n queryId: queryId,\n queryType: entry.type,\n },\n error: error ? error?.message || String(error) || 'Unknown error' : undefined,\n });\n };\n return callback;\n }\n\n /**\n * Track plugin loading with operation ID correlation\n */\n public onPluginLoadStart(pluginId: string): ((plugin: any, fromCache?: boolean) => void) | null {\n // Initialize early since plugin loading happens before _onActivate\n if (!this._panelKey) {\n let panel: VizPanel | undefined;\n\n try {\n panel = sceneGraph.getAncestor(this, VizPanel);\n } catch (error) {\n return null;\n }\n\n if (panel && !this._panelKey && panel.state.key) {\n this._panelKey = panel.state.key;\n this._panelId = String(panel.getLegacyPanelId());\n this._pluginId = pluginId;\n }\n }\n\n if (!this._panelKey) {\n return null;\n }\n\n if (!this._isTracking) {\n this._startTracking();\n }\n\n this._loadPluginStartTime = performance.now();\n\n const operationId = generateOperationId('pluginLoad');\n getScenePerformanceTracker().notifyPanelOperationStart({\n operationId,\n panelId: this._panelId!,\n panelKey: this._panelKey,\n pluginId: this._pluginId!,\n operation: 'plugin-load',\n timestamp: this._loadPluginStartTime,\n metadata: {\n pluginId,\n },\n });\n\n // Return end callback with captured operationId and panel context\n const callback = (plugin: any, fromCache = false) => {\n if (!this._panelKey || !this._loadPluginStartTime) {\n return;\n }\n\n const duration = performance.now() - this._loadPluginStartTime;\n\n getScenePerformanceTracker().notifyPanelOperationComplete({\n operationId,\n panelId: this._panelId!,\n panelKey: this._panelKey,\n pluginId: this._pluginId!,\n operation: 'plugin-load',\n timestamp: performance.now(),\n duration,\n metadata: {\n pluginId: this._pluginId!,\n fromCache,\n pluginLoadTime: duration,\n },\n });\n\n this._loadPluginStartTime = undefined;\n };\n return callback;\n }\n\n /**\n * Track field config processing with operation ID correlation\n */\n public onFieldConfigStart(\n timestamp: number\n ): ((endTimestamp: number, dataPointsCount?: number, seriesCount?: number) => void) | null {\n if (!this._panelKey) {\n return null;\n }\n\n this._applyFieldConfigStartTime = timestamp;\n\n const operationId = generateOperationId('fieldConfig');\n getScenePerformanceTracker().notifyPanelOperationStart({\n operationId,\n panelId: this._panelId!,\n panelKey: this._panelKey,\n pluginId: this._pluginId!,\n operation: 'fieldConfig',\n timestamp: this._applyFieldConfigStartTime,\n metadata: {\n // Initial metadata - will be updated on completion with actual counts\n },\n });\n\n // Return end callback with captured operationId and panel context\n const callback = (endTimestamp: number, dataPointsCount?: number, seriesCount?: number) => {\n if (!this._panelKey || !this._applyFieldConfigStartTime) {\n return;\n }\n\n const duration = endTimestamp - this._applyFieldConfigStartTime;\n\n getScenePerformanceTracker().notifyPanelOperationComplete({\n operationId,\n panelId: this._panelId!,\n panelKey: this._panelKey,\n pluginId: this._pluginId!,\n operation: 'fieldConfig',\n timestamp: endTimestamp,\n duration,\n metadata: {},\n });\n\n this._applyFieldConfigStartTime = undefined;\n };\n return callback;\n }\n\n /**\n * Get panel info for logging - truncates long titles for readability\n */\n private _getPanelInfo(): string {\n let panel: VizPanel | undefined;\n\n try {\n panel = sceneGraph.getAncestor(this, VizPanel);\n } catch (error) {\n // If we can't find the panel, use fallback info\n }\n\n let panelTitle = panel?.state.title || this._panelKey || 'No-key panel';\n\n if (panelTitle.length > 30) {\n panelTitle = panelTitle.substring(0, 27) + '...';\n }\n\n return `VizPanelRenderProfiler [${panelTitle}]`;\n }\n\n /**\n * Track simple render timing with operation ID correlation\n */\n public onSimpleRenderStart(timestamp: number): ((endTimestamp: number, duration: number) => void) | undefined {\n if (!this._panelKey) {\n return undefined;\n }\n\n const operationId = generateOperationId('render');\n getScenePerformanceTracker().notifyPanelOperationStart({\n operationId,\n panelId: this._panelId || 'unknown',\n panelKey: this._panelKey,\n pluginId: this._pluginId || 'unknown',\n pluginVersion: this._pluginVersion,\n operation: 'render',\n timestamp,\n metadata: {},\n });\n\n // Return end callback with captured operationId and panel context\n return (endTimestamp: number, duration: number) => {\n if (!this._panelKey) {\n return;\n }\n\n getScenePerformanceTracker().notifyPanelOperationComplete({\n operationId,\n panelId: this._panelId || 'unknown',\n panelKey: this._panelKey,\n pluginId: this._pluginId || 'unknown',\n pluginVersion: this._pluginVersion,\n operation: 'render',\n duration,\n timestamp: endTimestamp,\n metadata: {},\n });\n };\n }\n\n /** Handle plugin changes */\n private _onPluginChange(panel: VizPanel, newPluginId: string) {\n this._pluginId = newPluginId;\n const plugin = panel.getPlugin();\n this._pluginVersion = plugin?.meta?.info?.version;\n\n writeSceneLog(this._getPanelInfo(), `Plugin changed to ${newPluginId}`);\n }\n\n /** Start tracking this panel */\n private _startTracking() {\n if (!this._panelKey || !this._pluginId || this._isTracking) {\n return;\n }\n\n this._isTracking = true;\n }\n\n /** Cleanup when behavior is deactivated */\n private _cleanup() {\n this._activeQueries.clear();\n this._isTracking = false;\n writeSceneLog(this._getPanelInfo(), 'Cleaned up');\n }\n\n /**\n * Track data transformation with operation ID correlation\n */\n public onDataTransformStart(\n timestamp: number,\n transformationId: string,\n metrics: {\n transformationCount: number;\n // dataFrameCount: number;\n // totalDataPoints: number;\n seriesTransformationCount: number;\n annotationTransformationCount: number;\n }\n ):\n | ((\n endTimestamp: number,\n duration: number,\n success: boolean,\n result?: {\n // outputSeriesCount?: number;\n // outputAnnotationsCount?: number;\n error?: string;\n }\n ) => void)\n | null {\n if (!this._panelKey) {\n return null;\n }\n\n const operationId = generateOperationId('transform');\n getScenePerformanceTracker().notifyPanelOperationStart({\n operationId,\n panelId: this._panelId!,\n panelKey: this._panelKey,\n pluginId: this._pluginId!,\n operation: 'transform',\n timestamp,\n metadata: {\n transformationId,\n transformationCount: metrics.transformationCount,\n // dataFrameCount: metrics.dataFrameCount,\n // totalDataPoints: metrics.totalDataPoints,\n seriesTransformationCount: metrics.seriesTransformationCount,\n annotationTransformationCount: metrics.annotationTransformationCount,\n },\n });\n\n // Return end callback with captured operationId and panel context\n const callback = (\n endTimestamp: number,\n duration: number,\n success: boolean,\n result?: {\n outputSeriesCount?: number;\n outputAnnotationsCount?: number;\n error?: string;\n }\n ) => {\n if (!this._panelKey) {\n return;\n }\n\n getScenePerformanceTracker().notifyPanelOperationComplete({\n operationId,\n panelId: this._panelId!,\n panelKey: this._panelKey,\n pluginId: this._pluginId!,\n operation: 'transform',\n timestamp: endTimestamp,\n duration,\n metadata: {\n transformationId,\n transformationCount: metrics.transformationCount,\n seriesTransformationCount: metrics.seriesTransformationCount,\n annotationTransformationCount: metrics.annotationTransformationCount,\n success,\n error: result?.error || (!success ? 'Transform operation failed' : undefined),\n // dataFrameCount: metrics.dataFrameCount,\n // totalDataPoints: metrics.totalDataPoints,\n // outputSeriesCount: result?.outputSeriesCount,\n // outputAnnotationsCount: result?.outputAnnotationsCount,\n },\n });\n };\n return callback;\n }\n}\n"],"names":[],"mappings":"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"}
@@ -3,4 +3,7 @@ export { CursorSync } from './CursorSync.js';
3
3
  export { SceneQueryController } from './SceneQueryController.js';
4
4
  export { SceneInteractionTracker } from './SceneInteractionTracker.js';
5
5
  export { LiveNowTimer } from './LiveNowTimer.js';
6
+ export { VizPanelRenderProfiler } from './VizPanelRenderProfiler.js';
7
+ export { ScenePerformanceTracker, getScenePerformanceTracker } from './ScenePerformanceTracker.js';
8
+ export { ADHOC_KEYS_DROPDOWN_INTERACTION, ADHOC_VALUES_DROPDOWN_INTERACTION, FILTER_ADDED_INTERACTION, FILTER_CHANGED_INTERACTION, FILTER_REMOVED_INTERACTION, FILTER_RESTORED_INTERACTION, GROUPBY_DIMENSIONS_INTERACTION, REFRESH_INTERACTION, SCOPES_CHANGED_INTERACTION, TIME_RANGE_CHANGE_INTERACTION, VARIABLE_VALUE_CHANGED_INTERACTION } from './interactionConstants.js';
6
9
  //# sourceMappingURL=index.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sources":[],"sourcesContent":[],"names":[],"mappings":";;;;"}
1
+ {"version":3,"file":"index.js","sources":[],"sourcesContent":[],"names":[],"mappings":";;;;;;;"}
@@ -0,0 +1,14 @@
1
+ const REFRESH_INTERACTION = "refresh";
2
+ const TIME_RANGE_CHANGE_INTERACTION = "time_range_change";
3
+ const FILTER_ADDED_INTERACTION = "filter_added";
4
+ const FILTER_REMOVED_INTERACTION = "filter_removed";
5
+ const FILTER_CHANGED_INTERACTION = "filter_changed";
6
+ const FILTER_RESTORED_INTERACTION = "filter_restored";
7
+ const VARIABLE_VALUE_CHANGED_INTERACTION = "variable_value_changed";
8
+ const SCOPES_CHANGED_INTERACTION = "scopes_changed";
9
+ const ADHOC_KEYS_DROPDOWN_INTERACTION = "adhoc_keys_dropdown";
10
+ const ADHOC_VALUES_DROPDOWN_INTERACTION = "adhoc_values_dropdown";
11
+ const GROUPBY_DIMENSIONS_INTERACTION = "groupby_dimensions";
12
+
13
+ export { ADHOC_KEYS_DROPDOWN_INTERACTION, ADHOC_VALUES_DROPDOWN_INTERACTION, FILTER_ADDED_INTERACTION, FILTER_CHANGED_INTERACTION, FILTER_REMOVED_INTERACTION, FILTER_RESTORED_INTERACTION, GROUPBY_DIMENSIONS_INTERACTION, REFRESH_INTERACTION, SCOPES_CHANGED_INTERACTION, TIME_RANGE_CHANGE_INTERACTION, VARIABLE_VALUE_CHANGED_INTERACTION };
14
+ //# sourceMappingURL=interactionConstants.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"interactionConstants.js","sources":["../../../src/behaviors/interactionConstants.ts"],"sourcesContent":["/**\n * Constants for different types of dashboard interactions tracked by SceneRenderProfiler\n */\n\nexport const REFRESH_INTERACTION = 'refresh';\nexport const TIME_RANGE_CHANGE_INTERACTION = 'time_range_change';\nexport const FILTER_ADDED_INTERACTION = 'filter_added';\nexport const FILTER_REMOVED_INTERACTION = 'filter_removed';\nexport const FILTER_CHANGED_INTERACTION = 'filter_changed';\nexport const FILTER_RESTORED_INTERACTION = 'filter_restored';\nexport const VARIABLE_VALUE_CHANGED_INTERACTION = 'variable_value_changed';\nexport const SCOPES_CHANGED_INTERACTION = 'scopes_changed';\nexport const ADHOC_KEYS_DROPDOWN_INTERACTION = 'adhoc_keys_dropdown';\nexport const ADHOC_VALUES_DROPDOWN_INTERACTION = 'adhoc_values_dropdown';\nexport const GROUPBY_DIMENSIONS_INTERACTION = 'groupby_dimensions';\n"],"names":[],"mappings":"AAIO,MAAM,mBAAsB,GAAA;AAC5B,MAAM,6BAAgC,GAAA;AACtC,MAAM,wBAA2B,GAAA;AACjC,MAAM,0BAA6B,GAAA;AACnC,MAAM,0BAA6B,GAAA;AACnC,MAAM,2BAA8B,GAAA;AACpC,MAAM,kCAAqC,GAAA;AAC3C,MAAM,0BAA6B,GAAA;AACnC,MAAM,+BAAkC,GAAA;AACxC,MAAM,iCAAoC,GAAA;AAC1C,MAAM,8BAAiC,GAAA;;;;"}
@@ -5,7 +5,7 @@ import { RefreshPicker } from '@grafana/ui';
5
5
  import { SceneObjectBase } from '../core/SceneObjectBase.js';
6
6
  import { sceneGraph } from '../core/sceneGraph/index.js';
7
7
  import { SceneObjectUrlSyncConfig } from '../services/SceneObjectUrlSyncConfig.js';
8
- import { REFRESH_INTERACTION } from '../behaviors/SceneRenderProfiler.js';
8
+ import { REFRESH_INTERACTION } from '../behaviors/interactionConstants.js';
9
9
 
10
10
  const DEFAULT_INTERVALS = ["5s", "10s", "30s", "1m", "5m", "15m", "30m", "1h", "2h", "1d"];
11
11
  class SceneRefreshPicker extends SceneObjectBase {
@@ -1 +1 @@
1
- {"version":3,"file":"SceneRefreshPicker.js","sources":["../../../src/components/SceneRefreshPicker.tsx"],"sourcesContent":["import React from 'react';\nimport { Unsubscribable } from 'rxjs';\nimport { rangeUtil } from '@grafana/data';\nimport { config } from '@grafana/runtime';\nimport { RefreshPicker } from '@grafana/ui';\n\nimport { SceneObjectBase } from '../core/SceneObjectBase';\nimport { sceneGraph } from '../core/sceneGraph';\nimport { SceneComponentProps, SceneObject, SceneObjectState, SceneObjectUrlValues } from '../core/types';\nimport { SceneObjectUrlSyncConfig } from '../services/SceneObjectUrlSyncConfig';\nimport { REFRESH_INTERACTION } from '../behaviors/SceneRenderProfiler';\n\nexport const DEFAULT_INTERVALS = ['5s', '10s', '30s', '1m', '5m', '15m', '30m', '1h', '2h', '1d'];\n\nexport interface SceneRefreshPickerState extends SceneObjectState {\n /**\n * Refresh interval, e.g. 5s, 1m, 2h\n */\n refresh: string;\n autoEnabled?: boolean;\n autoMinInterval?: string;\n autoValue?: string;\n /**\n * List of allowed refresh intervals, e.g. ['5s', '1m']\n */\n intervals?: string[];\n isOnCanvas?: boolean;\n primary?: boolean;\n withText?: boolean;\n /**\n * Overrides the default minRefreshInterval from the grafana config. Can be set to \"0s\" to remove the minimum refresh interval.\n */\n minRefreshInterval?: string;\n}\n\nexport class SceneRefreshPicker extends SceneObjectBase<SceneRefreshPickerState> {\n public static Component = SceneRefreshPickerRenderer;\n protected _urlSync = new SceneObjectUrlSyncConfig(this, { keys: ['refresh'] });\n private _intervalTimer: ReturnType<typeof setInterval> | undefined;\n private _autoTimeRangeListener: Unsubscribable | undefined;\n private _autoRefreshBlocked = false;\n\n public constructor(state: Partial<SceneRefreshPickerState>) {\n const filterDissalowedIntervals = (i: string) => {\n const minInterval = state.minRefreshInterval ?? config.minRefreshInterval;\n try {\n return minInterval ? rangeUtil.intervalToMs(i) >= rangeUtil.intervalToMs(minInterval) : true;\n } catch (e) {\n // Unable to parse interval\n return false;\n }\n };\n\n super({\n refresh: '',\n ...state,\n autoValue: undefined,\n autoEnabled: state.autoEnabled ?? true,\n autoMinInterval: state.autoMinInterval ?? config.minRefreshInterval,\n intervals: (state.intervals ?? DEFAULT_INTERVALS).filter(filterDissalowedIntervals),\n });\n\n this.addActivationHandler(() => {\n this.setupIntervalTimer();\n\n const onVisibilityChange = () => {\n if (this._autoRefreshBlocked && document.visibilityState === 'visible') {\n this._autoRefreshBlocked = false;\n this.onRefresh();\n }\n };\n\n document.addEventListener('visibilitychange', onVisibilityChange);\n\n return () => {\n if (this._intervalTimer) {\n clearInterval(this._intervalTimer);\n }\n\n document.removeEventListener('visibilitychange', onVisibilityChange);\n this._autoTimeRangeListener?.unsubscribe();\n };\n });\n }\n\n public onRefresh = () => {\n const queryController = sceneGraph.getQueryController(this);\n\n if (queryController?.state.isRunning) {\n queryController.cancelAll();\n queryController.cancelProfile();\n return;\n }\n\n queryController?.startProfile(REFRESH_INTERACTION);\n\n const timeRange = sceneGraph.getTimeRange(this);\n\n if (this._intervalTimer) {\n clearInterval(this._intervalTimer);\n }\n\n timeRange.onRefresh();\n this.setupIntervalTimer();\n };\n\n public onIntervalChanged = (interval: string) => {\n this.setState({ refresh: interval });\n this.setupIntervalTimer();\n };\n\n public getUrlState() {\n let refresh: string | undefined = this.state.refresh;\n\n if (typeof refresh !== 'string' || refresh.length === 0) {\n refresh = undefined;\n }\n\n return { refresh };\n }\n\n public updateFromUrl(values: SceneObjectUrlValues) {\n const { intervals } = this.state;\n let refresh = values.refresh;\n\n if (typeof refresh === 'string' && isIntervalString(refresh)) {\n if (intervals?.includes(refresh)) {\n this.setState({ refresh });\n } else {\n this.setState({\n // Default to the first refresh interval if the interval from the URL is not allowed, just like in the old architecture.\n refresh: intervals ? intervals[0] : undefined,\n });\n }\n }\n }\n\n private setupAutoTimeRangeListener = () => {\n // If the time range has changed, we need to recalculate the auto interval but prevent unnecessary processing\n return sceneGraph.getTimeRange(this).subscribeToState((newState, prevState) => {\n if (newState.from !== prevState.from || newState.to !== prevState.to) {\n this.setupIntervalTimer();\n }\n });\n };\n\n private calculateAutoRefreshInterval = () => {\n const timeRange = sceneGraph.getTimeRange(this);\n const resolution = window?.innerWidth ?? 2000;\n return rangeUtil.calculateInterval(timeRange.state.value, resolution, this.state.autoMinInterval);\n };\n\n private isTabVisible() {\n return document.visibilityState === undefined || document.visibilityState === 'visible';\n }\n\n private setupIntervalTimer = () => {\n const timeRange = sceneGraph.getTimeRange(this);\n const { refresh, intervals } = this.state;\n\n if (this._intervalTimer || refresh === '') {\n clearInterval(this._intervalTimer);\n }\n\n if (refresh === '') {\n return;\n }\n\n // If the provided interval is not allowed\n if (refresh !== RefreshPicker.autoOption.value && intervals && !intervals.includes(refresh)) {\n return;\n }\n\n let intervalMs: number;\n\n // Unsubscribe from previous listener no matter what\n this._autoTimeRangeListener?.unsubscribe();\n\n if (refresh === RefreshPicker.autoOption.value) {\n const autoRefreshInterval = this.calculateAutoRefreshInterval();\n\n intervalMs = autoRefreshInterval.intervalMs;\n\n this._autoTimeRangeListener = this.setupAutoTimeRangeListener();\n\n if (autoRefreshInterval.interval !== this.state.autoValue) {\n this.setState({ autoValue: autoRefreshInterval.interval });\n }\n } else {\n intervalMs = rangeUtil.intervalToMs(refresh);\n }\n\n this._intervalTimer = setInterval(() => {\n if (this.isTabVisible()) {\n const queryController = sceneGraph.getQueryController(this);\n\n if (queryController?.state.isRunning) {\n queryController.cancelProfile();\n }\n\n queryController?.startProfile(REFRESH_INTERACTION);\n timeRange.onRefresh();\n } else {\n this._autoRefreshBlocked = true;\n }\n }, intervalMs);\n };\n}\n\nexport function SceneRefreshPickerRenderer({ model }: SceneComponentProps<SceneRefreshPicker>) {\n const { refresh, intervals, autoEnabled, autoValue, isOnCanvas, primary, withText } = model.useState();\n const isRunning = useQueryControllerState(model);\n\n let text = refresh === RefreshPicker.autoOption?.value ? autoValue : withText ? 'Refresh' : undefined;\n let tooltip: string | undefined;\n let width: string | undefined;\n\n if (isRunning) {\n tooltip = 'Cancel all queries';\n\n if (withText) {\n text = 'Cancel';\n }\n }\n\n if (withText) {\n width = '96px';\n }\n\n return (\n <RefreshPicker\n showAutoInterval={autoEnabled}\n value={refresh}\n intervals={intervals}\n tooltip={tooltip}\n width={width}\n text={text}\n onRefresh={() => {\n model.onRefresh();\n }}\n primary={primary}\n onIntervalChanged={model.onIntervalChanged}\n isLoading={isRunning}\n isOnCanvas={isOnCanvas ?? true}\n />\n );\n}\n\nfunction useQueryControllerState(model: SceneObject): boolean {\n const queryController = sceneGraph.getQueryController(model);\n if (!queryController) {\n return false;\n }\n\n return queryController.useState().isRunning;\n}\n\nfunction isIntervalString(str: string): boolean {\n try {\n const res = rangeUtil.describeInterval(str);\n return res.count > 0;\n } catch {\n return false;\n }\n}\n"],"names":["_a"],"mappings":";;;;;;;;;AAYa,MAAA,iBAAA,GAAoB,CAAC,IAAA,EAAM,KAAO,EAAA,KAAA,EAAO,IAAM,EAAA,IAAA,EAAM,KAAO,EAAA,KAAA,EAAO,IAAM,EAAA,IAAA,EAAM,IAAI;AAuBzF,MAAM,2BAA2B,eAAyC,CAAA;AAAA,EAOxE,YAAY,KAAyC,EAAA;AA1C9D,IAAA,IAAA,EAAA,EAAA,EAAA,EAAA,EAAA;AA2CI,IAAM,MAAA,yBAAA,GAA4B,CAAC,CAAc,KAAA;AA3CrD,MAAAA,IAAAA,GAAAA;AA4CM,MAAA,MAAM,eAAcA,GAAA,GAAA,KAAA,CAAM,kBAAN,KAAA,IAAA,GAAAA,MAA4B,MAAO,CAAA,kBAAA;AACvD,MAAI,IAAA;AACF,QAAO,OAAA,WAAA,GAAc,UAAU,YAAa,CAAA,CAAC,KAAK,SAAU,CAAA,YAAA,CAAa,WAAW,CAAI,GAAA,IAAA;AAAA,eACjF,CAAG,EAAA;AAEV,QAAO,OAAA,KAAA;AAAA;AACT,KACF;AAEA,IAAM,KAAA,CAAA;AAAA,MACJ,OAAS,EAAA,EAAA;AAAA,MACT,GAAG,KAAA;AAAA,MACH,SAAW,EAAA,MAAA;AAAA,MACX,WAAA,EAAA,CAAa,EAAM,GAAA,KAAA,CAAA,WAAA,KAAN,IAAqB,GAAA,EAAA,GAAA,IAAA;AAAA,MAClC,eAAiB,EAAA,CAAA,EAAA,GAAA,KAAA,CAAM,eAAN,KAAA,IAAA,GAAA,EAAA,GAAyB,MAAO,CAAA,kBAAA;AAAA,MACjD,aAAY,EAAM,GAAA,KAAA,CAAA,SAAA,KAAN,IAAmB,GAAA,EAAA,GAAA,iBAAA,EAAmB,OAAO,yBAAyB;AAAA,KACnF,CAAA;AAvBH,IAAU,IAAA,CAAA,QAAA,GAAW,IAAI,wBAAyB,CAAA,IAAA,EAAM,EAAE,IAAM,EAAA,CAAC,SAAS,CAAA,EAAG,CAAA;AAG7E,IAAA,IAAA,CAAQ,mBAAsB,GAAA,KAAA;AA6C9B,IAAA,IAAA,CAAO,YAAY,MAAM;AACvB,MAAM,MAAA,eAAA,GAAkB,UAAW,CAAA,kBAAA,CAAmB,IAAI,CAAA;AAE1D,MAAI,IAAA,eAAA,IAAA,IAAA,GAAA,MAAA,GAAA,eAAA,CAAiB,MAAM,SAAW,EAAA;AACpC,QAAA,eAAA,CAAgB,SAAU,EAAA;AAC1B,QAAA,eAAA,CAAgB,aAAc,EAAA;AAC9B,QAAA;AAAA;AAGF,MAAA,eAAA,IAAA,IAAA,GAAA,MAAA,GAAA,eAAA,CAAiB,YAAa,CAAA,mBAAA,CAAA;AAE9B,MAAM,MAAA,SAAA,GAAY,UAAW,CAAA,YAAA,CAAa,IAAI,CAAA;AAE9C,MAAA,IAAI,KAAK,cAAgB,EAAA;AACvB,QAAA,aAAA,CAAc,KAAK,cAAc,CAAA;AAAA;AAGnC,MAAA,SAAA,CAAU,SAAU,EAAA;AACpB,MAAA,IAAA,CAAK,kBAAmB,EAAA;AAAA,KAC1B;AAEA,IAAO,IAAA,CAAA,iBAAA,GAAoB,CAAC,QAAqB,KAAA;AAC/C,MAAA,IAAA,CAAK,QAAS,CAAA,EAAE,OAAS,EAAA,QAAA,EAAU,CAAA;AACnC,MAAA,IAAA,CAAK,kBAAmB,EAAA;AAAA,KAC1B;AA4BA,IAAA,IAAA,CAAQ,6BAA6B,MAAM;AAEzC,MAAA,OAAO,WAAW,YAAa,CAAA,IAAI,EAAE,gBAAiB,CAAA,CAAC,UAAU,SAAc,KAAA;AAC7E,QAAA,IAAI,SAAS,IAAS,KAAA,SAAA,CAAU,QAAQ,QAAS,CAAA,EAAA,KAAO,UAAU,EAAI,EAAA;AACpE,UAAA,IAAA,CAAK,kBAAmB,EAAA;AAAA;AAC1B,OACD,CAAA;AAAA,KACH;AAEA,IAAA,IAAA,CAAQ,+BAA+B,MAAM;AAlJ/C,MAAA,IAAA,EAAA;AAmJI,MAAM,MAAA,SAAA,GAAY,UAAW,CAAA,YAAA,CAAa,IAAI,CAAA;AAC9C,MAAM,MAAA,UAAA,GAAA,CAAa,EAAQ,GAAA,MAAA,IAAA,IAAA,GAAA,MAAA,GAAA,MAAA,CAAA,UAAA,KAAR,IAAsB,GAAA,EAAA,GAAA,GAAA;AACzC,MAAO,OAAA,SAAA,CAAU,kBAAkB,SAAU,CAAA,KAAA,CAAM,OAAO,UAAY,EAAA,IAAA,CAAK,MAAM,eAAe,CAAA;AAAA,KAClG;AAMA,IAAA,IAAA,CAAQ,qBAAqB,MAAM;AA5JrC,MAAA,IAAA,EAAA;AA6JI,MAAM,MAAA,SAAA,GAAY,UAAW,CAAA,YAAA,CAAa,IAAI,CAAA;AAC9C,MAAA,MAAM,EAAE,OAAA,EAAS,SAAU,EAAA,GAAI,IAAK,CAAA,KAAA;AAEpC,MAAI,IAAA,IAAA,CAAK,cAAkB,IAAA,OAAA,KAAY,EAAI,EAAA;AACzC,QAAA,aAAA,CAAc,KAAK,cAAc,CAAA;AAAA;AAGnC,MAAA,IAAI,YAAY,EAAI,EAAA;AAClB,QAAA;AAAA;AAIF,MAAI,IAAA,OAAA,KAAY,cAAc,UAAW,CAAA,KAAA,IAAS,aAAa,CAAC,SAAA,CAAU,QAAS,CAAA,OAAO,CAAG,EAAA;AAC3F,QAAA;AAAA;AAGF,MAAI,IAAA,UAAA;AAGJ,MAAA,CAAA,EAAA,GAAA,IAAA,CAAK,2BAAL,IAA6B,GAAA,MAAA,GAAA,EAAA,CAAA,WAAA,EAAA;AAE7B,MAAI,IAAA,OAAA,KAAY,aAAc,CAAA,UAAA,CAAW,KAAO,EAAA;AAC9C,QAAM,MAAA,mBAAA,GAAsB,KAAK,4BAA6B,EAAA;AAE9D,QAAA,UAAA,GAAa,mBAAoB,CAAA,UAAA;AAEjC,QAAK,IAAA,CAAA,sBAAA,GAAyB,KAAK,0BAA2B,EAAA;AAE9D,QAAA,IAAI,mBAAoB,CAAA,QAAA,KAAa,IAAK,CAAA,KAAA,CAAM,SAAW,EAAA;AACzD,UAAA,IAAA,CAAK,QAAS,CAAA,EAAE,SAAW,EAAA,mBAAA,CAAoB,UAAU,CAAA;AAAA;AAC3D,OACK,MAAA;AACL,QAAa,UAAA,GAAA,SAAA,CAAU,aAAa,OAAO,CAAA;AAAA;AAG7C,MAAK,IAAA,CAAA,cAAA,GAAiB,YAAY,MAAM;AACtC,QAAI,IAAA,IAAA,CAAK,cAAgB,EAAA;AACvB,UAAM,MAAA,eAAA,GAAkB,UAAW,CAAA,kBAAA,CAAmB,IAAI,CAAA;AAE1D,UAAI,IAAA,eAAA,IAAA,IAAA,GAAA,MAAA,GAAA,eAAA,CAAiB,MAAM,SAAW,EAAA;AACpC,YAAA,eAAA,CAAgB,aAAc,EAAA;AAAA;AAGhC,UAAA,eAAA,IAAA,IAAA,GAAA,MAAA,GAAA,eAAA,CAAiB,YAAa,CAAA,mBAAA,CAAA;AAC9B,UAAA,SAAA,CAAU,SAAU,EAAA;AAAA,SACf,MAAA;AACL,UAAA,IAAA,CAAK,mBAAsB,GAAA,IAAA;AAAA;AAC7B,SACC,UAAU,CAAA;AAAA,KACf;AAhJE,IAAA,IAAA,CAAK,qBAAqB,MAAM;AAC9B,MAAA,IAAA,CAAK,kBAAmB,EAAA;AAExB,MAAA,MAAM,qBAAqB,MAAM;AAC/B,QAAA,IAAI,IAAK,CAAA,mBAAA,IAAuB,QAAS,CAAA,eAAA,KAAoB,SAAW,EAAA;AACtE,UAAA,IAAA,CAAK,mBAAsB,GAAA,KAAA;AAC3B,UAAA,IAAA,CAAK,SAAU,EAAA;AAAA;AACjB,OACF;AAEA,MAAS,QAAA,CAAA,gBAAA,CAAiB,oBAAoB,kBAAkB,CAAA;AAEhE,MAAA,OAAO,MAAM;AA1EnB,QAAAA,IAAAA,GAAAA;AA2EQ,QAAA,IAAI,KAAK,cAAgB,EAAA;AACvB,UAAA,aAAA,CAAc,KAAK,cAAc,CAAA;AAAA;AAGnC,QAAS,QAAA,CAAA,mBAAA,CAAoB,oBAAoB,kBAAkB,CAAA;AACnE,QAAA,CAAAA,GAAA,GAAA,IAAA,CAAK,sBAAL,KAAA,IAAA,GAAA,MAAA,GAAAA,GAA6B,CAAA,WAAA,EAAA;AAAA,OAC/B;AAAA,KACD,CAAA;AAAA;AACH,EA4BO,WAAc,GAAA;AACnB,IAAI,IAAA,OAAA,GAA8B,KAAK,KAAM,CAAA,OAAA;AAE7C,IAAA,IAAI,OAAO,OAAA,KAAY,QAAY,IAAA,OAAA,CAAQ,WAAW,CAAG,EAAA;AACvD,MAAU,OAAA,GAAA,MAAA;AAAA;AAGZ,IAAA,OAAO,EAAE,OAAQ,EAAA;AAAA;AACnB,EAEO,cAAc,MAA8B,EAAA;AACjD,IAAM,MAAA,EAAE,SAAU,EAAA,GAAI,IAAK,CAAA,KAAA;AAC3B,IAAA,IAAI,UAAU,MAAO,CAAA,OAAA;AAErB,IAAA,IAAI,OAAO,OAAA,KAAY,QAAY,IAAA,gBAAA,CAAiB,OAAO,CAAG,EAAA;AAC5D,MAAI,IAAA,SAAA,IAAA,IAAA,GAAA,MAAA,GAAA,SAAA,CAAW,SAAS,OAAU,CAAA,EAAA;AAChC,QAAK,IAAA,CAAA,QAAA,CAAS,EAAE,OAAA,EAAS,CAAA;AAAA,OACpB,MAAA;AACL,QAAA,IAAA,CAAK,QAAS,CAAA;AAAA;AAAA,UAEZ,OAAS,EAAA,SAAA,GAAY,SAAU,CAAA,CAAC,CAAI,GAAA;AAAA,SACrC,CAAA;AAAA;AACH;AACF;AACF,EAiBQ,YAAe,GAAA;AACrB,IAAA,OAAO,QAAS,CAAA,eAAA,KAAoB,MAAa,IAAA,QAAA,CAAS,eAAoB,KAAA,SAAA;AAAA;AAsDlF;AA5Ka,kBAAA,CACG,SAAY,GAAA,0BAAA;AA6KZ,SAAA,0BAAA,CAA2B,EAAE,KAAA,EAAkD,EAAA;AAjN/F,EAAA,IAAA,EAAA;AAkNE,EAAM,MAAA,EAAE,OAAS,EAAA,SAAA,EAAW,WAAa,EAAA,SAAA,EAAW,YAAY,OAAS,EAAA,QAAA,EAAa,GAAA,KAAA,CAAM,QAAS,EAAA;AACrG,EAAM,MAAA,SAAA,GAAY,wBAAwB,KAAK,CAAA;AAE/C,EAAI,IAAA,IAAA,GAAO,cAAY,EAAc,GAAA,aAAA,CAAA,UAAA,KAAd,mBAA0B,KAAQ,CAAA,GAAA,SAAA,GAAY,WAAW,SAAY,GAAA,MAAA;AAC5F,EAAI,IAAA,OAAA;AACJ,EAAI,IAAA,KAAA;AAEJ,EAAA,IAAI,SAAW,EAAA;AACb,IAAU,OAAA,GAAA,oBAAA;AAEV,IAAA,IAAI,QAAU,EAAA;AACZ,MAAO,IAAA,GAAA,QAAA;AAAA;AACT;AAGF,EAAA,IAAI,QAAU,EAAA;AACZ,IAAQ,KAAA,GAAA,MAAA;AAAA;AAGV,EACE,uBAAA,KAAA,CAAA,aAAA;AAAA,IAAC,aAAA;AAAA,IAAA;AAAA,MACC,gBAAkB,EAAA,WAAA;AAAA,MAClB,KAAO,EAAA,OAAA;AAAA,MACP,SAAA;AAAA,MACA,OAAA;AAAA,MACA,KAAA;AAAA,MACA,IAAA;AAAA,MACA,WAAW,MAAM;AACf,QAAA,KAAA,CAAM,SAAU,EAAA;AAAA,OAClB;AAAA,MACA,OAAA;AAAA,MACA,mBAAmB,KAAM,CAAA,iBAAA;AAAA,MACzB,SAAW,EAAA,SAAA;AAAA,MACX,YAAY,UAAc,IAAA,IAAA,GAAA,UAAA,GAAA;AAAA;AAAA,GAC5B;AAEJ;AAEA,SAAS,wBAAwB,KAA6B,EAAA;AAC5D,EAAM,MAAA,eAAA,GAAkB,UAAW,CAAA,kBAAA,CAAmB,KAAK,CAAA;AAC3D,EAAA,IAAI,CAAC,eAAiB,EAAA;AACpB,IAAO,OAAA,KAAA;AAAA;AAGT,EAAO,OAAA,eAAA,CAAgB,UAAW,CAAA,SAAA;AACpC;AAEA,SAAS,iBAAiB,GAAsB,EAAA;AAC9C,EAAI,IAAA;AACF,IAAM,MAAA,GAAA,GAAM,SAAU,CAAA,gBAAA,CAAiB,GAAG,CAAA;AAC1C,IAAA,OAAO,IAAI,KAAQ,GAAA,CAAA;AAAA,GACb,CAAA,OAAA,CAAA,EAAA;AACN,IAAO,OAAA,KAAA;AAAA;AAEX;;;;"}
1
+ {"version":3,"file":"SceneRefreshPicker.js","sources":["../../../src/components/SceneRefreshPicker.tsx"],"sourcesContent":["import React from 'react';\nimport { Unsubscribable } from 'rxjs';\nimport { rangeUtil } from '@grafana/data';\nimport { config } from '@grafana/runtime';\nimport { RefreshPicker } from '@grafana/ui';\n\nimport { SceneObjectBase } from '../core/SceneObjectBase';\nimport { sceneGraph } from '../core/sceneGraph';\nimport { SceneComponentProps, SceneObject, SceneObjectState, SceneObjectUrlValues } from '../core/types';\nimport { SceneObjectUrlSyncConfig } from '../services/SceneObjectUrlSyncConfig';\nimport { REFRESH_INTERACTION } from '../behaviors/interactionConstants';\n\nexport const DEFAULT_INTERVALS = ['5s', '10s', '30s', '1m', '5m', '15m', '30m', '1h', '2h', '1d'];\n\nexport interface SceneRefreshPickerState extends SceneObjectState {\n /**\n * Refresh interval, e.g. 5s, 1m, 2h\n */\n refresh: string;\n autoEnabled?: boolean;\n autoMinInterval?: string;\n autoValue?: string;\n /**\n * List of allowed refresh intervals, e.g. ['5s', '1m']\n */\n intervals?: string[];\n isOnCanvas?: boolean;\n primary?: boolean;\n withText?: boolean;\n /**\n * Overrides the default minRefreshInterval from the grafana config. Can be set to \"0s\" to remove the minimum refresh interval.\n */\n minRefreshInterval?: string;\n}\n\nexport class SceneRefreshPicker extends SceneObjectBase<SceneRefreshPickerState> {\n public static Component = SceneRefreshPickerRenderer;\n protected _urlSync = new SceneObjectUrlSyncConfig(this, { keys: ['refresh'] });\n private _intervalTimer: ReturnType<typeof setInterval> | undefined;\n private _autoTimeRangeListener: Unsubscribable | undefined;\n private _autoRefreshBlocked = false;\n\n public constructor(state: Partial<SceneRefreshPickerState>) {\n const filterDissalowedIntervals = (i: string) => {\n const minInterval = state.minRefreshInterval ?? config.minRefreshInterval;\n try {\n return minInterval ? rangeUtil.intervalToMs(i) >= rangeUtil.intervalToMs(minInterval) : true;\n } catch (e) {\n // Unable to parse interval\n return false;\n }\n };\n\n super({\n refresh: '',\n ...state,\n autoValue: undefined,\n autoEnabled: state.autoEnabled ?? true,\n autoMinInterval: state.autoMinInterval ?? config.minRefreshInterval,\n intervals: (state.intervals ?? DEFAULT_INTERVALS).filter(filterDissalowedIntervals),\n });\n\n this.addActivationHandler(() => {\n this.setupIntervalTimer();\n\n const onVisibilityChange = () => {\n if (this._autoRefreshBlocked && document.visibilityState === 'visible') {\n this._autoRefreshBlocked = false;\n this.onRefresh();\n }\n };\n\n document.addEventListener('visibilitychange', onVisibilityChange);\n\n return () => {\n if (this._intervalTimer) {\n clearInterval(this._intervalTimer);\n }\n\n document.removeEventListener('visibilitychange', onVisibilityChange);\n this._autoTimeRangeListener?.unsubscribe();\n };\n });\n }\n\n public onRefresh = () => {\n const queryController = sceneGraph.getQueryController(this);\n\n if (queryController?.state.isRunning) {\n queryController.cancelAll();\n queryController.cancelProfile();\n return;\n }\n\n queryController?.startProfile(REFRESH_INTERACTION);\n\n const timeRange = sceneGraph.getTimeRange(this);\n\n if (this._intervalTimer) {\n clearInterval(this._intervalTimer);\n }\n\n timeRange.onRefresh();\n this.setupIntervalTimer();\n };\n\n public onIntervalChanged = (interval: string) => {\n this.setState({ refresh: interval });\n this.setupIntervalTimer();\n };\n\n public getUrlState() {\n let refresh: string | undefined = this.state.refresh;\n\n if (typeof refresh !== 'string' || refresh.length === 0) {\n refresh = undefined;\n }\n\n return { refresh };\n }\n\n public updateFromUrl(values: SceneObjectUrlValues) {\n const { intervals } = this.state;\n let refresh = values.refresh;\n\n if (typeof refresh === 'string' && isIntervalString(refresh)) {\n if (intervals?.includes(refresh)) {\n this.setState({ refresh });\n } else {\n this.setState({\n // Default to the first refresh interval if the interval from the URL is not allowed, just like in the old architecture.\n refresh: intervals ? intervals[0] : undefined,\n });\n }\n }\n }\n\n private setupAutoTimeRangeListener = () => {\n // If the time range has changed, we need to recalculate the auto interval but prevent unnecessary processing\n return sceneGraph.getTimeRange(this).subscribeToState((newState, prevState) => {\n if (newState.from !== prevState.from || newState.to !== prevState.to) {\n this.setupIntervalTimer();\n }\n });\n };\n\n private calculateAutoRefreshInterval = () => {\n const timeRange = sceneGraph.getTimeRange(this);\n const resolution = window?.innerWidth ?? 2000;\n return rangeUtil.calculateInterval(timeRange.state.value, resolution, this.state.autoMinInterval);\n };\n\n private isTabVisible() {\n return document.visibilityState === undefined || document.visibilityState === 'visible';\n }\n\n private setupIntervalTimer = () => {\n const timeRange = sceneGraph.getTimeRange(this);\n const { refresh, intervals } = this.state;\n\n if (this._intervalTimer || refresh === '') {\n clearInterval(this._intervalTimer);\n }\n\n if (refresh === '') {\n return;\n }\n\n // If the provided interval is not allowed\n if (refresh !== RefreshPicker.autoOption.value && intervals && !intervals.includes(refresh)) {\n return;\n }\n\n let intervalMs: number;\n\n // Unsubscribe from previous listener no matter what\n this._autoTimeRangeListener?.unsubscribe();\n\n if (refresh === RefreshPicker.autoOption.value) {\n const autoRefreshInterval = this.calculateAutoRefreshInterval();\n\n intervalMs = autoRefreshInterval.intervalMs;\n\n this._autoTimeRangeListener = this.setupAutoTimeRangeListener();\n\n if (autoRefreshInterval.interval !== this.state.autoValue) {\n this.setState({ autoValue: autoRefreshInterval.interval });\n }\n } else {\n intervalMs = rangeUtil.intervalToMs(refresh);\n }\n\n this._intervalTimer = setInterval(() => {\n if (this.isTabVisible()) {\n const queryController = sceneGraph.getQueryController(this);\n\n if (queryController?.state.isRunning) {\n queryController.cancelProfile();\n }\n\n queryController?.startProfile(REFRESH_INTERACTION);\n timeRange.onRefresh();\n } else {\n this._autoRefreshBlocked = true;\n }\n }, intervalMs);\n };\n}\n\nexport function SceneRefreshPickerRenderer({ model }: SceneComponentProps<SceneRefreshPicker>) {\n const { refresh, intervals, autoEnabled, autoValue, isOnCanvas, primary, withText } = model.useState();\n const isRunning = useQueryControllerState(model);\n\n let text = refresh === RefreshPicker.autoOption?.value ? autoValue : withText ? 'Refresh' : undefined;\n let tooltip: string | undefined;\n let width: string | undefined;\n\n if (isRunning) {\n tooltip = 'Cancel all queries';\n\n if (withText) {\n text = 'Cancel';\n }\n }\n\n if (withText) {\n width = '96px';\n }\n\n return (\n <RefreshPicker\n showAutoInterval={autoEnabled}\n value={refresh}\n intervals={intervals}\n tooltip={tooltip}\n width={width}\n text={text}\n onRefresh={() => {\n model.onRefresh();\n }}\n primary={primary}\n onIntervalChanged={model.onIntervalChanged}\n isLoading={isRunning}\n isOnCanvas={isOnCanvas ?? true}\n />\n );\n}\n\nfunction useQueryControllerState(model: SceneObject): boolean {\n const queryController = sceneGraph.getQueryController(model);\n if (!queryController) {\n return false;\n }\n\n return queryController.useState().isRunning;\n}\n\nfunction isIntervalString(str: string): boolean {\n try {\n const res = rangeUtil.describeInterval(str);\n return res.count > 0;\n } catch {\n return false;\n }\n}\n"],"names":["_a"],"mappings":";;;;;;;;;AAYa,MAAA,iBAAA,GAAoB,CAAC,IAAA,EAAM,KAAO,EAAA,KAAA,EAAO,IAAM,EAAA,IAAA,EAAM,KAAO,EAAA,KAAA,EAAO,IAAM,EAAA,IAAA,EAAM,IAAI;AAuBzF,MAAM,2BAA2B,eAAyC,CAAA;AAAA,EAOxE,YAAY,KAAyC,EAAA;AA1C9D,IAAA,IAAA,EAAA,EAAA,EAAA,EAAA,EAAA;AA2CI,IAAM,MAAA,yBAAA,GAA4B,CAAC,CAAc,KAAA;AA3CrD,MAAAA,IAAAA,GAAAA;AA4CM,MAAA,MAAM,eAAcA,GAAA,GAAA,KAAA,CAAM,kBAAN,KAAA,IAAA,GAAAA,MAA4B,MAAO,CAAA,kBAAA;AACvD,MAAI,IAAA;AACF,QAAO,OAAA,WAAA,GAAc,UAAU,YAAa,CAAA,CAAC,KAAK,SAAU,CAAA,YAAA,CAAa,WAAW,CAAI,GAAA,IAAA;AAAA,eACjF,CAAG,EAAA;AAEV,QAAO,OAAA,KAAA;AAAA;AACT,KACF;AAEA,IAAM,KAAA,CAAA;AAAA,MACJ,OAAS,EAAA,EAAA;AAAA,MACT,GAAG,KAAA;AAAA,MACH,SAAW,EAAA,MAAA;AAAA,MACX,WAAA,EAAA,CAAa,EAAM,GAAA,KAAA,CAAA,WAAA,KAAN,IAAqB,GAAA,EAAA,GAAA,IAAA;AAAA,MAClC,eAAiB,EAAA,CAAA,EAAA,GAAA,KAAA,CAAM,eAAN,KAAA,IAAA,GAAA,EAAA,GAAyB,MAAO,CAAA,kBAAA;AAAA,MACjD,aAAY,EAAM,GAAA,KAAA,CAAA,SAAA,KAAN,IAAmB,GAAA,EAAA,GAAA,iBAAA,EAAmB,OAAO,yBAAyB;AAAA,KACnF,CAAA;AAvBH,IAAU,IAAA,CAAA,QAAA,GAAW,IAAI,wBAAyB,CAAA,IAAA,EAAM,EAAE,IAAM,EAAA,CAAC,SAAS,CAAA,EAAG,CAAA;AAG7E,IAAA,IAAA,CAAQ,mBAAsB,GAAA,KAAA;AA6C9B,IAAA,IAAA,CAAO,YAAY,MAAM;AACvB,MAAM,MAAA,eAAA,GAAkB,UAAW,CAAA,kBAAA,CAAmB,IAAI,CAAA;AAE1D,MAAI,IAAA,eAAA,IAAA,IAAA,GAAA,MAAA,GAAA,eAAA,CAAiB,MAAM,SAAW,EAAA;AACpC,QAAA,eAAA,CAAgB,SAAU,EAAA;AAC1B,QAAA,eAAA,CAAgB,aAAc,EAAA;AAC9B,QAAA;AAAA;AAGF,MAAA,eAAA,IAAA,IAAA,GAAA,MAAA,GAAA,eAAA,CAAiB,YAAa,CAAA,mBAAA,CAAA;AAE9B,MAAM,MAAA,SAAA,GAAY,UAAW,CAAA,YAAA,CAAa,IAAI,CAAA;AAE9C,MAAA,IAAI,KAAK,cAAgB,EAAA;AACvB,QAAA,aAAA,CAAc,KAAK,cAAc,CAAA;AAAA;AAGnC,MAAA,SAAA,CAAU,SAAU,EAAA;AACpB,MAAA,IAAA,CAAK,kBAAmB,EAAA;AAAA,KAC1B;AAEA,IAAO,IAAA,CAAA,iBAAA,GAAoB,CAAC,QAAqB,KAAA;AAC/C,MAAA,IAAA,CAAK,QAAS,CAAA,EAAE,OAAS,EAAA,QAAA,EAAU,CAAA;AACnC,MAAA,IAAA,CAAK,kBAAmB,EAAA;AAAA,KAC1B;AA4BA,IAAA,IAAA,CAAQ,6BAA6B,MAAM;AAEzC,MAAA,OAAO,WAAW,YAAa,CAAA,IAAI,EAAE,gBAAiB,CAAA,CAAC,UAAU,SAAc,KAAA;AAC7E,QAAA,IAAI,SAAS,IAAS,KAAA,SAAA,CAAU,QAAQ,QAAS,CAAA,EAAA,KAAO,UAAU,EAAI,EAAA;AACpE,UAAA,IAAA,CAAK,kBAAmB,EAAA;AAAA;AAC1B,OACD,CAAA;AAAA,KACH;AAEA,IAAA,IAAA,CAAQ,+BAA+B,MAAM;AAlJ/C,MAAA,IAAA,EAAA;AAmJI,MAAM,MAAA,SAAA,GAAY,UAAW,CAAA,YAAA,CAAa,IAAI,CAAA;AAC9C,MAAM,MAAA,UAAA,GAAA,CAAa,EAAQ,GAAA,MAAA,IAAA,IAAA,GAAA,MAAA,GAAA,MAAA,CAAA,UAAA,KAAR,IAAsB,GAAA,EAAA,GAAA,GAAA;AACzC,MAAO,OAAA,SAAA,CAAU,kBAAkB,SAAU,CAAA,KAAA,CAAM,OAAO,UAAY,EAAA,IAAA,CAAK,MAAM,eAAe,CAAA;AAAA,KAClG;AAMA,IAAA,IAAA,CAAQ,qBAAqB,MAAM;AA5JrC,MAAA,IAAA,EAAA;AA6JI,MAAM,MAAA,SAAA,GAAY,UAAW,CAAA,YAAA,CAAa,IAAI,CAAA;AAC9C,MAAA,MAAM,EAAE,OAAA,EAAS,SAAU,EAAA,GAAI,IAAK,CAAA,KAAA;AAEpC,MAAI,IAAA,IAAA,CAAK,cAAkB,IAAA,OAAA,KAAY,EAAI,EAAA;AACzC,QAAA,aAAA,CAAc,KAAK,cAAc,CAAA;AAAA;AAGnC,MAAA,IAAI,YAAY,EAAI,EAAA;AAClB,QAAA;AAAA;AAIF,MAAI,IAAA,OAAA,KAAY,cAAc,UAAW,CAAA,KAAA,IAAS,aAAa,CAAC,SAAA,CAAU,QAAS,CAAA,OAAO,CAAG,EAAA;AAC3F,QAAA;AAAA;AAGF,MAAI,IAAA,UAAA;AAGJ,MAAA,CAAA,EAAA,GAAA,IAAA,CAAK,2BAAL,IAA6B,GAAA,MAAA,GAAA,EAAA,CAAA,WAAA,EAAA;AAE7B,MAAI,IAAA,OAAA,KAAY,aAAc,CAAA,UAAA,CAAW,KAAO,EAAA;AAC9C,QAAM,MAAA,mBAAA,GAAsB,KAAK,4BAA6B,EAAA;AAE9D,QAAA,UAAA,GAAa,mBAAoB,CAAA,UAAA;AAEjC,QAAK,IAAA,CAAA,sBAAA,GAAyB,KAAK,0BAA2B,EAAA;AAE9D,QAAA,IAAI,mBAAoB,CAAA,QAAA,KAAa,IAAK,CAAA,KAAA,CAAM,SAAW,EAAA;AACzD,UAAA,IAAA,CAAK,QAAS,CAAA,EAAE,SAAW,EAAA,mBAAA,CAAoB,UAAU,CAAA;AAAA;AAC3D,OACK,MAAA;AACL,QAAa,UAAA,GAAA,SAAA,CAAU,aAAa,OAAO,CAAA;AAAA;AAG7C,MAAK,IAAA,CAAA,cAAA,GAAiB,YAAY,MAAM;AACtC,QAAI,IAAA,IAAA,CAAK,cAAgB,EAAA;AACvB,UAAM,MAAA,eAAA,GAAkB,UAAW,CAAA,kBAAA,CAAmB,IAAI,CAAA;AAE1D,UAAI,IAAA,eAAA,IAAA,IAAA,GAAA,MAAA,GAAA,eAAA,CAAiB,MAAM,SAAW,EAAA;AACpC,YAAA,eAAA,CAAgB,aAAc,EAAA;AAAA;AAGhC,UAAA,eAAA,IAAA,IAAA,GAAA,MAAA,GAAA,eAAA,CAAiB,YAAa,CAAA,mBAAA,CAAA;AAC9B,UAAA,SAAA,CAAU,SAAU,EAAA;AAAA,SACf,MAAA;AACL,UAAA,IAAA,CAAK,mBAAsB,GAAA,IAAA;AAAA;AAC7B,SACC,UAAU,CAAA;AAAA,KACf;AAhJE,IAAA,IAAA,CAAK,qBAAqB,MAAM;AAC9B,MAAA,IAAA,CAAK,kBAAmB,EAAA;AAExB,MAAA,MAAM,qBAAqB,MAAM;AAC/B,QAAA,IAAI,IAAK,CAAA,mBAAA,IAAuB,QAAS,CAAA,eAAA,KAAoB,SAAW,EAAA;AACtE,UAAA,IAAA,CAAK,mBAAsB,GAAA,KAAA;AAC3B,UAAA,IAAA,CAAK,SAAU,EAAA;AAAA;AACjB,OACF;AAEA,MAAS,QAAA,CAAA,gBAAA,CAAiB,oBAAoB,kBAAkB,CAAA;AAEhE,MAAA,OAAO,MAAM;AA1EnB,QAAAA,IAAAA,GAAAA;AA2EQ,QAAA,IAAI,KAAK,cAAgB,EAAA;AACvB,UAAA,aAAA,CAAc,KAAK,cAAc,CAAA;AAAA;AAGnC,QAAS,QAAA,CAAA,mBAAA,CAAoB,oBAAoB,kBAAkB,CAAA;AACnE,QAAA,CAAAA,GAAA,GAAA,IAAA,CAAK,sBAAL,KAAA,IAAA,GAAA,MAAA,GAAAA,GAA6B,CAAA,WAAA,EAAA;AAAA,OAC/B;AAAA,KACD,CAAA;AAAA;AACH,EA4BO,WAAc,GAAA;AACnB,IAAI,IAAA,OAAA,GAA8B,KAAK,KAAM,CAAA,OAAA;AAE7C,IAAA,IAAI,OAAO,OAAA,KAAY,QAAY,IAAA,OAAA,CAAQ,WAAW,CAAG,EAAA;AACvD,MAAU,OAAA,GAAA,MAAA;AAAA;AAGZ,IAAA,OAAO,EAAE,OAAQ,EAAA;AAAA;AACnB,EAEO,cAAc,MAA8B,EAAA;AACjD,IAAM,MAAA,EAAE,SAAU,EAAA,GAAI,IAAK,CAAA,KAAA;AAC3B,IAAA,IAAI,UAAU,MAAO,CAAA,OAAA;AAErB,IAAA,IAAI,OAAO,OAAA,KAAY,QAAY,IAAA,gBAAA,CAAiB,OAAO,CAAG,EAAA;AAC5D,MAAI,IAAA,SAAA,IAAA,IAAA,GAAA,MAAA,GAAA,SAAA,CAAW,SAAS,OAAU,CAAA,EAAA;AAChC,QAAK,IAAA,CAAA,QAAA,CAAS,EAAE,OAAA,EAAS,CAAA;AAAA,OACpB,MAAA;AACL,QAAA,IAAA,CAAK,QAAS,CAAA;AAAA;AAAA,UAEZ,OAAS,EAAA,SAAA,GAAY,SAAU,CAAA,CAAC,CAAI,GAAA;AAAA,SACrC,CAAA;AAAA;AACH;AACF;AACF,EAiBQ,YAAe,GAAA;AACrB,IAAA,OAAO,QAAS,CAAA,eAAA,KAAoB,MAAa,IAAA,QAAA,CAAS,eAAoB,KAAA,SAAA;AAAA;AAsDlF;AA5Ka,kBAAA,CACG,SAAY,GAAA,0BAAA;AA6KZ,SAAA,0BAAA,CAA2B,EAAE,KAAA,EAAkD,EAAA;AAjN/F,EAAA,IAAA,EAAA;AAkNE,EAAM,MAAA,EAAE,OAAS,EAAA,SAAA,EAAW,WAAa,EAAA,SAAA,EAAW,YAAY,OAAS,EAAA,QAAA,EAAa,GAAA,KAAA,CAAM,QAAS,EAAA;AACrG,EAAM,MAAA,SAAA,GAAY,wBAAwB,KAAK,CAAA;AAE/C,EAAI,IAAA,IAAA,GAAO,cAAY,EAAc,GAAA,aAAA,CAAA,UAAA,KAAd,mBAA0B,KAAQ,CAAA,GAAA,SAAA,GAAY,WAAW,SAAY,GAAA,MAAA;AAC5F,EAAI,IAAA,OAAA;AACJ,EAAI,IAAA,KAAA;AAEJ,EAAA,IAAI,SAAW,EAAA;AACb,IAAU,OAAA,GAAA,oBAAA;AAEV,IAAA,IAAI,QAAU,EAAA;AACZ,MAAO,IAAA,GAAA,QAAA;AAAA;AACT;AAGF,EAAA,IAAI,QAAU,EAAA;AACZ,IAAQ,KAAA,GAAA,MAAA;AAAA;AAGV,EACE,uBAAA,KAAA,CAAA,aAAA;AAAA,IAAC,aAAA;AAAA,IAAA;AAAA,MACC,gBAAkB,EAAA,WAAA;AAAA,MAClB,KAAO,EAAA,OAAA;AAAA,MACP,SAAA;AAAA,MACA,OAAA;AAAA,MACA,KAAA;AAAA,MACA,IAAA;AAAA,MACA,WAAW,MAAM;AACf,QAAA,KAAA,CAAM,SAAU,EAAA;AAAA,OAClB;AAAA,MACA,OAAA;AAAA,MACA,mBAAmB,KAAM,CAAA,iBAAA;AAAA,MACzB,SAAW,EAAA,SAAA;AAAA,MACX,YAAY,UAAc,IAAA,IAAA,GAAA,UAAA,GAAA;AAAA;AAAA,GAC5B;AAEJ;AAEA,SAAS,wBAAwB,KAA6B,EAAA;AAC5D,EAAM,MAAA,eAAA,GAAkB,UAAW,CAAA,kBAAA,CAAmB,KAAK,CAAA;AAC3D,EAAA,IAAI,CAAC,eAAiB,EAAA;AACpB,IAAO,OAAA,KAAA;AAAA;AAGT,EAAO,OAAA,eAAA,CAAgB,UAAW,CAAA,SAAA;AACpC;AAEA,SAAS,iBAAiB,GAAsB,EAAA;AAC9C,EAAI,IAAA;AACF,IAAM,MAAA,GAAA,GAAM,SAAU,CAAA,gBAAA,CAAiB,GAAG,CAAA;AAC1C,IAAA,OAAO,IAAI,KAAQ,GAAA,CAAA;AAAA,GACb,CAAA,OAAA,CAAA,EAAA;AACN,IAAO,OAAA,KAAA;AAAA;AAEX;;;;"}
@@ -1,5 +1,5 @@
1
1
  import { t } from '@grafana/i18n';
2
- import { toUtc, getPanelOptionsWithDefaults, renderMarkdown, applyFieldOverrides, compareArrayValues, compareDataFrameStructures, CoreApp, DashboardCursorSync, PanelPlugin, PluginType } from '@grafana/data';
2
+ import { toUtc, getPanelOptionsWithDefaults, renderMarkdown, applyFieldOverrides, compareArrayValues, compareDataFrameStructures, FieldType, CoreApp, DashboardCursorSync, PanelPlugin, PluginType } from '@grafana/data';
3
3
  import { getPluginImportUtils, config, getAppEvents } from '@grafana/runtime';
4
4
  import { SceneObjectBase } from '../../core/SceneObjectBase.js';
5
5
  import { sceneGraph } from '../../core/sceneGraph/index.js';
@@ -14,6 +14,7 @@ import { mergeWith, cloneDeep, isArray, merge, isEmpty } from 'lodash';
14
14
  import { UserActionEvent } from '../../core/events.js';
15
15
  import { evaluateTimeRange } from '../../utils/evaluateTimeRange.js';
16
16
  import { LiveNowTimer } from '../../behaviors/LiveNowTimer.js';
17
+ import { VizPanelRenderProfiler } from '../../behaviors/VizPanelRenderProfiler.js';
17
18
  import { wrapPromiseInStateObservable, registerQueryWithController } from '../../querying/registerQueryWithController.js';
18
19
  import { SceneDataTransformer } from '../../querying/SceneDataTransformer.js';
19
20
  import { SceneQueryRunner } from '../../querying/SceneQueryRunner.js';
@@ -191,6 +192,20 @@ class VizPanel extends SceneObjectBase {
191
192
  this.publishEvent(new UserActionEvent({ origin: this, interaction: "panel-menu-shown" }), true);
192
193
  });
193
194
  }
195
+ /**
196
+ * Get the VizPanelRenderProfiler behavior if attached
197
+ */
198
+ getProfiler() {
199
+ if (!this.state.$behaviors) {
200
+ return void 0;
201
+ }
202
+ for (const behavior of this.state.$behaviors) {
203
+ if (behavior instanceof VizPanelRenderProfiler) {
204
+ return behavior;
205
+ }
206
+ }
207
+ return void 0;
208
+ }
194
209
  _onActivate() {
195
210
  if (!this._plugin) {
196
211
  this._loadPlugin(this.state.pluginId);
@@ -201,12 +216,16 @@ class VizPanel extends SceneObjectBase {
201
216
  this.setState({ _renderCounter: ((_a = this.state._renderCounter) != null ? _a : 0) + 1 });
202
217
  }
203
218
  async _loadPlugin(pluginId, overwriteOptions, overwriteFieldConfig, isAfterPluginChange) {
219
+ const profiler = this.getProfiler();
204
220
  const plugin = loadPanelPluginSync(pluginId);
205
221
  if (plugin) {
222
+ const endPluginLoadCallback = profiler == null ? void 0 : profiler.onPluginLoadStart(pluginId);
223
+ endPluginLoadCallback == null ? void 0 : endPluginLoadCallback(plugin, true);
206
224
  this._pluginLoaded(plugin, overwriteOptions, overwriteFieldConfig, isAfterPluginChange);
207
225
  } else {
208
226
  const { importPanelPlugin } = getPluginImportUtils();
209
227
  try {
228
+ const endPluginLoadCallback = profiler == null ? void 0 : profiler.onPluginLoadStart(pluginId);
210
229
  const panelPromise = importPanelPlugin(pluginId);
211
230
  const queryControler = sceneGraph.getQueryController(this);
212
231
  if (queryControler && queryControler.state.enableProfiling) {
@@ -214,6 +233,7 @@ class VizPanel extends SceneObjectBase {
214
233
  });
215
234
  }
216
235
  const result = await panelPromise;
236
+ endPluginLoadCallback == null ? void 0 : endPluginLoadCallback(result, false);
217
237
  this._pluginLoaded(result, overwriteOptions, overwriteFieldConfig, isAfterPluginChange);
218
238
  } catch (err) {
219
239
  this._pluginLoaded(getPanelPluginNotFound(pluginId));
@@ -333,13 +353,16 @@ class VizPanel extends SceneObjectBase {
333
353
  */
334
354
  applyFieldConfig(rawData) {
335
355
  var _a, _b, _c, _d;
356
+ const timestamp = performance.now();
336
357
  const plugin = this._plugin;
358
+ const profiler = this.getProfiler();
337
359
  if (!plugin || plugin.meta.skipDataQuery || !rawData) {
338
360
  return emptyPanelData;
339
361
  }
340
362
  if (this._prevData === rawData && this._dataWithFieldConfig) {
341
363
  return this._dataWithFieldConfig;
342
364
  }
365
+ const endFieldConfigCallback = profiler == null ? void 0 : profiler.onFieldConfigStart(timestamp);
343
366
  const pluginDataSupport = plugin.dataSupport || { alertStates: false, annotations: false };
344
367
  const fieldConfigRegistry = plugin.fieldConfigRegistry;
345
368
  const prevFrames = (_b = (_a = this._dataWithFieldConfig) == null ? void 0 : _a.series) != null ? _b : [];
@@ -379,6 +402,18 @@ class VizPanel extends SceneObjectBase {
379
402
  this._dataWithFieldConfig.annotations = void 0;
380
403
  }
381
404
  this._prevData = rawData;
405
+ if (profiler) {
406
+ let dataPointsCount = 0;
407
+ let seriesCount = 0;
408
+ for (const frame of newFrames) {
409
+ if (frame.length && frame.fields.length) {
410
+ const numericFields = frame.fields.filter((field) => field.type === FieldType.number).length;
411
+ seriesCount += numericFields;
412
+ dataPointsCount += frame.fields.reduce((sum, field) => sum + field.values.length, 0);
413
+ }
414
+ }
415
+ endFieldConfigCallback == null ? void 0 : endFieldConfigCallback(performance.now(), dataPointsCount, seriesCount);
416
+ }
382
417
  return this._dataWithFieldConfig;
383
418
  }
384
419
  clone(withState) {