@grafana/scenes 6.40.0--canary.1265.18325783397.0 → 6.40.0--canary.1277.18545717336.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.
- package/CHANGELOG.md +72 -0
- package/dist/esm/behaviors/LongFrameDetector.js +11 -11
- package/dist/esm/behaviors/LongFrameDetector.js.map +1 -1
- package/dist/esm/behaviors/SceneRenderProfiler.js +131 -93
- package/dist/esm/behaviors/SceneRenderProfiler.js.map +1 -1
- package/dist/esm/behaviors/index.js +0 -3
- package/dist/esm/behaviors/index.js.map +1 -1
- package/dist/esm/components/SceneRefreshPicker.js +1 -1
- package/dist/esm/components/SceneRefreshPicker.js.map +1 -1
- package/dist/esm/components/SceneTimeRangeCompare.js +17 -14
- package/dist/esm/components/SceneTimeRangeCompare.js.map +1 -1
- package/dist/esm/components/VizPanel/VizPanel.js +1 -36
- package/dist/esm/components/VizPanel/VizPanel.js.map +1 -1
- package/dist/esm/components/VizPanel/VizPanelRenderer.js +2 -20
- package/dist/esm/components/VizPanel/VizPanelRenderer.js.map +1 -1
- package/dist/esm/core/SceneTimeRange.js +1 -1
- package/dist/esm/core/SceneTimeRange.js.map +1 -1
- package/dist/esm/index.js +3 -4
- package/dist/esm/index.js.map +1 -1
- package/dist/esm/querying/SceneDataTransformer.js +22 -79
- package/dist/esm/querying/SceneDataTransformer.js.map +1 -1
- package/dist/esm/querying/SceneQueryRunner.js +6 -11
- package/dist/esm/querying/SceneQueryRunner.js.map +1 -1
- package/dist/esm/querying/layers/SceneDataLayerControls.js +13 -1
- package/dist/esm/querying/layers/SceneDataLayerControls.js.map +1 -1
- package/dist/esm/querying/registerQueryWithController.js +2 -39
- package/dist/esm/querying/registerQueryWithController.js.map +1 -1
- package/dist/esm/utils/writeSceneLog.js +10 -1
- package/dist/esm/utils/writeSceneLog.js.map +1 -1
- package/dist/esm/variables/adhoc/AdHocFilterBuilder.js +13 -2
- package/dist/esm/variables/adhoc/AdHocFilterBuilder.js.map +1 -1
- package/dist/esm/variables/adhoc/AdHocFilterRenderer.js +6 -0
- package/dist/esm/variables/adhoc/AdHocFilterRenderer.js.map +1 -1
- package/dist/esm/variables/adhoc/AdHocFiltersCombobox/AdHocFiltersCombobox.js +1 -1
- package/dist/esm/variables/adhoc/AdHocFiltersCombobox/AdHocFiltersCombobox.js.map +1 -1
- package/dist/esm/variables/adhoc/AdHocFiltersVariable.js +1 -1
- package/dist/esm/variables/adhoc/AdHocFiltersVariable.js.map +1 -1
- package/dist/esm/variables/components/VariableValueSelect.js +1 -1
- package/dist/esm/variables/components/VariableValueSelect.js.map +1 -1
- package/dist/esm/variables/groupby/GroupByVariable.js +1 -1
- package/dist/esm/variables/groupby/GroupByVariable.js.map +1 -1
- package/dist/esm/variables/variants/CustomVariable.js +9 -4
- package/dist/esm/variables/variants/CustomVariable.js.map +1 -1
- package/dist/esm/variables/variants/MultiValueVariable.js +1 -1
- package/dist/esm/variables/variants/MultiValueVariable.js.map +1 -1
- package/dist/esm/variables/variants/ScopesVariable.js +1 -1
- package/dist/esm/variables/variants/ScopesVariable.js.map +1 -1
- package/dist/esm/variables/variants/SwitchVariable.js +108 -0
- package/dist/esm/variables/variants/SwitchVariable.js.map +1 -0
- package/dist/esm/variables/variants/guards.js +4 -1
- package/dist/esm/variables/variants/guards.js.map +1 -1
- package/dist/index.d.ts +115 -370
- package/dist/index.js +7066 -7543
- package/dist/index.js.map +1 -1
- package/package.json +2 -2
- package/dist/esm/behaviors/PanelProfilingManager.js +0 -65
- package/dist/esm/behaviors/PanelProfilingManager.js.map +0 -1
- package/dist/esm/behaviors/ScenePerformanceTracker.js +0 -78
- package/dist/esm/behaviors/ScenePerformanceTracker.js.map +0 -1
- package/dist/esm/behaviors/VizPanelRenderProfiler.js +0 -328
- package/dist/esm/behaviors/VizPanelRenderProfiler.js.map +0 -1
- package/dist/esm/behaviors/interactionConstants.js +0 -14
- package/dist/esm/behaviors/interactionConstants.js.map +0 -1
- package/dist/esm/utils/findPanelProfiler.js +0 -18
- package/dist/esm/utils/findPanelProfiler.js.map +0 -1
- package/dist/esm/utils/writePerformanceLog.js +0 -12
- package/dist/esm/utils/writePerformanceLog.js.map +0 -1
package/CHANGELOG.md
CHANGED
|
@@ -1,3 +1,75 @@
|
|
|
1
|
+
# v6.39.7 (Wed Oct 15 2025)
|
|
2
|
+
|
|
3
|
+
#### 🐛 Bug Fix
|
|
4
|
+
|
|
5
|
+
- SeneRenderProfiler: Remove tab inactive frame detection backup mechanism [#1276](https://github.com/grafana/scenes/pull/1276) ([@dprokop](https://github.com/dprokop))
|
|
6
|
+
|
|
7
|
+
#### Authors: 1
|
|
8
|
+
|
|
9
|
+
- Dominik Prokop ([@dprokop](https://github.com/dprokop))
|
|
10
|
+
|
|
11
|
+
---
|
|
12
|
+
|
|
13
|
+
# v6.39.6 (Wed Oct 15 2025)
|
|
14
|
+
|
|
15
|
+
#### 🐛 Bug Fix
|
|
16
|
+
|
|
17
|
+
- Fix rounding on old-style adhoc filters [#1271](https://github.com/grafana/scenes/pull/1271) ([@ashharrison90](https://github.com/ashharrison90))
|
|
18
|
+
|
|
19
|
+
#### Authors: 1
|
|
20
|
+
|
|
21
|
+
- Ashley Harrison ([@ashharrison90](https://github.com/ashharrison90))
|
|
22
|
+
|
|
23
|
+
---
|
|
24
|
+
|
|
25
|
+
# v6.39.5 (Fri Oct 10 2025)
|
|
26
|
+
|
|
27
|
+
#### 🐛 Bug Fix
|
|
28
|
+
|
|
29
|
+
- Annotations: Pass annotations through when transformations exist but none are annotations transformations [#1266](https://github.com/grafana/scenes/pull/1266) ([@fastfrwrd](https://github.com/fastfrwrd))
|
|
30
|
+
|
|
31
|
+
#### Authors: 1
|
|
32
|
+
|
|
33
|
+
- Paul Marbach ([@fastfrwrd](https://github.com/fastfrwrd))
|
|
34
|
+
|
|
35
|
+
---
|
|
36
|
+
|
|
37
|
+
# v6.39.4 (Fri Oct 10 2025)
|
|
38
|
+
|
|
39
|
+
#### 🐛 Bug Fix
|
|
40
|
+
|
|
41
|
+
- CustomVariable: Expose query parsing mechanism [#1269](https://github.com/grafana/scenes/pull/1269) ([@bfmatei](https://github.com/bfmatei))
|
|
42
|
+
|
|
43
|
+
#### Authors: 1
|
|
44
|
+
|
|
45
|
+
- Bogdan Matei ([@bfmatei](https://github.com/bfmatei))
|
|
46
|
+
|
|
47
|
+
---
|
|
48
|
+
|
|
49
|
+
# v6.39.3 (Thu Oct 09 2025)
|
|
50
|
+
|
|
51
|
+
#### 🐛 Bug Fix
|
|
52
|
+
|
|
53
|
+
- Variables: Introduce a new type called "switch" [#1258](https://github.com/grafana/scenes/pull/1258) ([@leventebalogh](https://github.com/leventebalogh))
|
|
54
|
+
|
|
55
|
+
#### Authors: 1
|
|
56
|
+
|
|
57
|
+
- Levente Balogh ([@leventebalogh](https://github.com/leventebalogh))
|
|
58
|
+
|
|
59
|
+
---
|
|
60
|
+
|
|
61
|
+
# v6.39.2 (Wed Oct 08 2025)
|
|
62
|
+
|
|
63
|
+
#### 🐛 Bug Fix
|
|
64
|
+
|
|
65
|
+
- Chore: Fix annotations switch to work with new border radius [#1264](https://github.com/grafana/scenes/pull/1264) ([@ashharrison90](https://github.com/ashharrison90))
|
|
66
|
+
|
|
67
|
+
#### Authors: 1
|
|
68
|
+
|
|
69
|
+
- Ashley Harrison ([@ashharrison90](https://github.com/ashharrison90))
|
|
70
|
+
|
|
71
|
+
---
|
|
72
|
+
|
|
1
73
|
# v6.39.1 (Thu Sep 25 2025)
|
|
2
74
|
|
|
3
75
|
#### 🐛 Bug Fix
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import { writeSceneLog } from '../utils/writeSceneLog.js';
|
|
2
2
|
|
|
3
3
|
var __typeError = (msg) => {
|
|
4
4
|
throw TypeError(msg);
|
|
@@ -49,8 +49,8 @@ class LongFrameDetector {
|
|
|
49
49
|
performance.mark(measureName);
|
|
50
50
|
}
|
|
51
51
|
}
|
|
52
|
-
|
|
53
|
-
"
|
|
52
|
+
writeSceneLog(
|
|
53
|
+
"LongFrameDetector",
|
|
54
54
|
`Long frame detected (manual): ${frameLength}ms (threshold: ${LONG_FRAME_THRESHOLD}ms)`
|
|
55
55
|
);
|
|
56
56
|
}
|
|
@@ -71,7 +71,7 @@ class LongFrameDetector {
|
|
|
71
71
|
*/
|
|
72
72
|
start(callback) {
|
|
73
73
|
if (__privateGet(this, _isTracking)) {
|
|
74
|
-
|
|
74
|
+
writeSceneLog("LongFrameDetector", "Already tracking frames, stopping previous session");
|
|
75
75
|
this.stop();
|
|
76
76
|
}
|
|
77
77
|
__privateSet(this, _callback, callback);
|
|
@@ -81,8 +81,8 @@ class LongFrameDetector {
|
|
|
81
81
|
} else {
|
|
82
82
|
this.startManualFrameTracking();
|
|
83
83
|
}
|
|
84
|
-
|
|
85
|
-
"
|
|
84
|
+
writeSceneLog(
|
|
85
|
+
"LongFrameDetector",
|
|
86
86
|
`Started tracking with ${this.isLoAFAvailable() ? "LoAF API" : "manual"} method, threshold: ${LONG_FRAME_THRESHOLD}ms`
|
|
87
87
|
);
|
|
88
88
|
}
|
|
@@ -110,7 +110,7 @@ class LongFrameDetector {
|
|
|
110
110
|
*/
|
|
111
111
|
startLoAFTracking() {
|
|
112
112
|
if (!this.isLoAFAvailable()) {
|
|
113
|
-
|
|
113
|
+
writeSceneLog("LongFrameDetector", "LoAF API not available, falling back to manual tracking");
|
|
114
114
|
this.startManualFrameTracking();
|
|
115
115
|
return;
|
|
116
116
|
}
|
|
@@ -138,12 +138,12 @@ class LongFrameDetector {
|
|
|
138
138
|
performance.mark(measureName);
|
|
139
139
|
}
|
|
140
140
|
}
|
|
141
|
-
|
|
141
|
+
writeSceneLog("LongFrameDetector", `Long frame detected (LoAF): ${entry.duration}ms at ${entry.startTime}ms`);
|
|
142
142
|
}
|
|
143
143
|
}));
|
|
144
144
|
__privateGet(this, _loafObserver).observe({ type: "long-animation-frame", buffered: false });
|
|
145
145
|
} catch (error) {
|
|
146
|
-
|
|
146
|
+
writeSceneLog("LongFrameDetector", "Failed to start LoAF tracking, falling back to manual:", error);
|
|
147
147
|
this.startManualFrameTracking();
|
|
148
148
|
}
|
|
149
149
|
}
|
|
@@ -154,7 +154,7 @@ class LongFrameDetector {
|
|
|
154
154
|
if (__privateGet(this, _loafObserver)) {
|
|
155
155
|
__privateGet(this, _loafObserver).disconnect();
|
|
156
156
|
__privateSet(this, _loafObserver, null);
|
|
157
|
-
|
|
157
|
+
writeSceneLog("LongFrameDetector", "Stopped LoAF tracking");
|
|
158
158
|
}
|
|
159
159
|
}
|
|
160
160
|
/**
|
|
@@ -171,7 +171,7 @@ class LongFrameDetector {
|
|
|
171
171
|
if (__privateGet(this, _frameTrackingId)) {
|
|
172
172
|
cancelAnimationFrame(__privateGet(this, _frameTrackingId));
|
|
173
173
|
__privateSet(this, _frameTrackingId, null);
|
|
174
|
-
|
|
174
|
+
writeSceneLog("LongFrameDetector", "Stopped manual frame tracking");
|
|
175
175
|
}
|
|
176
176
|
}
|
|
177
177
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"LongFrameDetector.js","sources":["../../../src/behaviors/LongFrameDetector.ts"],"sourcesContent":["import { writePerformanceLog } from '../utils/writePerformanceLog';\n\nconst LONG_FRAME_THRESHOLD = 50; // Threshold for both LoAF and manual tracking (ms)\n\nexport interface LongFrameEvent {\n duration: number; // Frame duration in milliseconds\n timestamp: number; // When the frame occurred\n method: 'manual' | 'loaf'; // Which detection method was used\n}\n\nexport type LongFrameCallback = (event: LongFrameEvent) => void;\n\n/**\n * LongFrameDetector is a module for detecting long animation frames.\n *\n * It supports two detection methods with automatic fallback:\n * 1. LoAF API (default when available): Uses Long Animation Frame API with 50ms threshold\n * 2. Manual tracking (fallback): Uses requestAnimationFrame with configurable threshold (default: 50ms)\n *\n * The detector automatically uses LoAF when available for better attribution and performance,\n * falling back to manual tracking for broader browser support.\n *\n * @see https://developer.mozilla.org/en-US/docs/Web/API/Performance_API/Long_animation_frame_timing\n */\nexport class LongFrameDetector {\n #isTracking = false;\n #callback: LongFrameCallback | null = null;\n\n // Manual tracking state\n #frameTrackingId: number | null = null;\n #lastFrameTime = 0;\n\n // LoAF tracking state\n #loafObserver: PerformanceObserver | null = null;\n\n /**\n * Check if LoAF API is available in the browser\n */\n private isLoAFAvailable(): boolean {\n return (\n typeof PerformanceObserver !== 'undefined' &&\n PerformanceObserver.supportedEntryTypes &&\n PerformanceObserver.supportedEntryTypes.includes('long-animation-frame')\n );\n }\n\n /**\n * Start detecting long frames and call the provided callback when they occur\n */\n public start(callback: LongFrameCallback): void {\n if (this.#isTracking) {\n writePerformanceLog('LFD', 'Already tracking frames, stopping previous session');\n this.stop();\n }\n\n this.#callback = callback;\n this.#isTracking = true;\n\n if (this.isLoAFAvailable()) {\n this.startLoAFTracking();\n } else {\n this.startManualFrameTracking();\n }\n\n writePerformanceLog(\n 'LFD',\n `Started tracking with ${\n this.isLoAFAvailable() ? 'LoAF API' : 'manual'\n } method, threshold: ${LONG_FRAME_THRESHOLD}ms`\n );\n }\n\n /**\n * Stop detecting long frames\n */\n public stop(): void {\n if (!this.#isTracking) {\n return;\n }\n\n this.#isTracking = false;\n this.#callback = null;\n\n // Stop both tracking methods to ensure cleanup\n this.stopLoAFTracking();\n this.stopManualFrameTracking();\n }\n\n /**\n * Check if currently tracking frames\n */\n public isTracking(): boolean {\n return this.#isTracking;\n }\n\n /**\n * Start tracking using the Long Animation Frame API\n * @see https://developer.mozilla.org/en-US/docs/Web/API/PerformanceLongAnimationFrameTiming\n */\n private startLoAFTracking(): void {\n if (!this.isLoAFAvailable()) {\n writePerformanceLog('LFD', 'LoAF API not available, falling back to manual tracking');\n this.startManualFrameTracking();\n return;\n }\n\n try {\n this.#loafObserver = new PerformanceObserver((list) => {\n for (const entry of list.getEntries()) {\n // No duration check needed - LoAF API already filters for long frames (>50ms)\n const event: LongFrameEvent = {\n duration: entry.duration,\n timestamp: entry.startTime,\n method: 'loaf',\n };\n\n if (this.#callback) {\n this.#callback(event);\n }\n\n // Add performance marks and measurements for debugging in dev tools\n if (typeof performance !== 'undefined' && performance.mark && performance.measure) {\n const frameId = `long-frame-${entry.startTime.toFixed(0)}`;\n const startMarkName = `${frameId}-start`;\n const endMarkName = `${frameId}-end`;\n const measureName = `Long Frame (LoAF): ${entry.duration.toFixed(1)}ms`;\n\n try {\n // Create start and end marks\n performance.mark(startMarkName, { startTime: entry.startTime });\n performance.mark(endMarkName, { startTime: entry.startTime + entry.duration });\n\n // Create measurement span\n performance.measure(measureName, startMarkName, endMarkName);\n } catch {\n // Fallback for browsers that don't support startTime option\n performance.mark(measureName);\n }\n }\n\n writePerformanceLog('LFD', `Long frame detected (LoAF): ${entry.duration}ms at ${entry.startTime}ms`);\n }\n });\n\n this.#loafObserver.observe({ type: 'long-animation-frame', buffered: false });\n } catch (error) {\n writePerformanceLog('LFD', 'Failed to start LoAF tracking, falling back to manual:', error);\n this.startManualFrameTracking();\n }\n }\n\n /**\n * Stop LoAF tracking\n */\n private stopLoAFTracking(): void {\n if (this.#loafObserver) {\n this.#loafObserver.disconnect();\n this.#loafObserver = null;\n writePerformanceLog('LFD', 'Stopped LoAF tracking');\n }\n }\n\n /**\n * Start manual frame tracking using requestAnimationFrame\n */\n private startManualFrameTracking(): void {\n this.#lastFrameTime = performance.now();\n this.#frameTrackingId = requestAnimationFrame(() => this.measureFrames());\n }\n\n /**\n * Stop manual frame tracking\n */\n private stopManualFrameTracking(): void {\n if (this.#frameTrackingId) {\n cancelAnimationFrame(this.#frameTrackingId);\n this.#frameTrackingId = null;\n writePerformanceLog('LFD', 'Stopped manual frame tracking');\n }\n }\n\n /**\n * Measure frame durations using requestAnimationFrame\n */\n private measureFrames = (): void => {\n if (!this.#isTracking) {\n return;\n }\n\n const currentFrameTime = performance.now();\n const frameLength = currentFrameTime - this.#lastFrameTime;\n\n // Check if frame exceeds threshold\n if (frameLength > LONG_FRAME_THRESHOLD) {\n const event: LongFrameEvent = {\n duration: frameLength,\n timestamp: currentFrameTime,\n method: 'manual',\n };\n\n if (this.#callback) {\n this.#callback(event);\n }\n\n // Add performance marks and measurements for debugging in dev tools\n if (typeof performance !== 'undefined' && performance.mark && performance.measure) {\n const frameId = `long-frame-manual-${currentFrameTime.toFixed(0)}`;\n const startMarkName = `${frameId}-start`;\n const endMarkName = `${frameId}-end`;\n const measureName = `Long Frame (Manual): ${frameLength.toFixed(1)}ms`;\n\n try {\n // Create start and end marks\n performance.mark(startMarkName, { startTime: currentFrameTime - frameLength });\n performance.mark(endMarkName, { startTime: currentFrameTime });\n\n // Create measurement span\n performance.measure(measureName, startMarkName, endMarkName);\n } catch {\n // Fallback for browsers that don't support startTime option\n performance.mark(measureName);\n }\n }\n\n writePerformanceLog(\n 'LFD',\n `Long frame detected (manual): ${frameLength}ms (threshold: ${LONG_FRAME_THRESHOLD}ms)`\n );\n }\n\n this.#lastFrameTime = currentFrameTime;\n\n // Continue tracking\n if (this.#isTracking) {\n this.#frameTrackingId = requestAnimationFrame(this.measureFrames);\n }\n };\n}\n"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"LongFrameDetector.js","sources":["../../../src/behaviors/LongFrameDetector.ts"],"sourcesContent":["import { writeSceneLog } from '../utils/writeSceneLog';\n\nconst LONG_FRAME_THRESHOLD = 50; // Threshold for both LoAF and manual tracking (ms)\n\nexport interface LongFrameEvent {\n duration: number; // Frame duration in milliseconds\n timestamp: number; // When the frame occurred\n method: 'manual' | 'loaf'; // Which detection method was used\n}\n\nexport type LongFrameCallback = (event: LongFrameEvent) => void;\n\n/**\n * LongFrameDetector is a module for detecting long animation frames.\n *\n * It supports two detection methods with automatic fallback:\n * 1. LoAF API (default when available): Uses Long Animation Frame API with 50ms threshold\n * 2. Manual tracking (fallback): Uses requestAnimationFrame with configurable threshold (default: 50ms)\n *\n * The detector automatically uses LoAF when available for better attribution and performance,\n * falling back to manual tracking for broader browser support.\n *\n * @see https://developer.mozilla.org/en-US/docs/Web/API/Performance_API/Long_animation_frame_timing\n */\nexport class LongFrameDetector {\n #isTracking = false;\n #callback: LongFrameCallback | null = null;\n\n // Manual tracking state\n #frameTrackingId: number | null = null;\n #lastFrameTime = 0;\n\n // LoAF tracking state\n #loafObserver: PerformanceObserver | null = null;\n\n /**\n * Check if LoAF API is available in the browser\n */\n private isLoAFAvailable(): boolean {\n return (\n typeof PerformanceObserver !== 'undefined' &&\n PerformanceObserver.supportedEntryTypes &&\n PerformanceObserver.supportedEntryTypes.includes('long-animation-frame')\n );\n }\n\n /**\n * Start detecting long frames and call the provided callback when they occur\n */\n public start(callback: LongFrameCallback): void {\n if (this.#isTracking) {\n writeSceneLog('LongFrameDetector', 'Already tracking frames, stopping previous session');\n this.stop();\n }\n\n this.#callback = callback;\n this.#isTracking = true;\n\n if (this.isLoAFAvailable()) {\n this.startLoAFTracking();\n } else {\n this.startManualFrameTracking();\n }\n\n writeSceneLog(\n 'LongFrameDetector',\n `Started tracking with ${\n this.isLoAFAvailable() ? 'LoAF API' : 'manual'\n } method, threshold: ${LONG_FRAME_THRESHOLD}ms`\n );\n }\n\n /**\n * Stop detecting long frames\n */\n public stop(): void {\n if (!this.#isTracking) {\n return;\n }\n\n this.#isTracking = false;\n this.#callback = null;\n\n // Stop both tracking methods to ensure cleanup\n this.stopLoAFTracking();\n this.stopManualFrameTracking();\n }\n\n /**\n * Check if currently tracking frames\n */\n public isTracking(): boolean {\n return this.#isTracking;\n }\n\n /**\n * Start tracking using the Long Animation Frame API\n * @see https://developer.mozilla.org/en-US/docs/Web/API/PerformanceLongAnimationFrameTiming\n */\n private startLoAFTracking(): void {\n if (!this.isLoAFAvailable()) {\n writeSceneLog('LongFrameDetector', 'LoAF API not available, falling back to manual tracking');\n this.startManualFrameTracking();\n return;\n }\n\n try {\n this.#loafObserver = new PerformanceObserver((list) => {\n for (const entry of list.getEntries()) {\n // No duration check needed - LoAF API already filters for long frames (>50ms)\n const event: LongFrameEvent = {\n duration: entry.duration,\n timestamp: entry.startTime,\n method: 'loaf',\n };\n\n if (this.#callback) {\n this.#callback(event);\n }\n\n // Add performance marks and measurements for debugging in dev tools\n if (typeof performance !== 'undefined' && performance.mark && performance.measure) {\n const frameId = `long-frame-${entry.startTime.toFixed(0)}`;\n const startMarkName = `${frameId}-start`;\n const endMarkName = `${frameId}-end`;\n const measureName = `Long Frame (LoAF): ${entry.duration.toFixed(1)}ms`;\n\n try {\n // Create start and end marks\n performance.mark(startMarkName, { startTime: entry.startTime });\n performance.mark(endMarkName, { startTime: entry.startTime + entry.duration });\n\n // Create measurement span\n performance.measure(measureName, startMarkName, endMarkName);\n } catch {\n // Fallback for browsers that don't support startTime option\n performance.mark(measureName);\n }\n }\n\n writeSceneLog('LongFrameDetector', `Long frame detected (LoAF): ${entry.duration}ms at ${entry.startTime}ms`);\n }\n });\n\n this.#loafObserver.observe({ type: 'long-animation-frame', buffered: false });\n } catch (error) {\n writeSceneLog('LongFrameDetector', 'Failed to start LoAF tracking, falling back to manual:', error);\n this.startManualFrameTracking();\n }\n }\n\n /**\n * Stop LoAF tracking\n */\n private stopLoAFTracking(): void {\n if (this.#loafObserver) {\n this.#loafObserver.disconnect();\n this.#loafObserver = null;\n writeSceneLog('LongFrameDetector', 'Stopped LoAF tracking');\n }\n }\n\n /**\n * Start manual frame tracking using requestAnimationFrame\n */\n private startManualFrameTracking(): void {\n this.#lastFrameTime = performance.now();\n this.#frameTrackingId = requestAnimationFrame(() => this.measureFrames());\n }\n\n /**\n * Stop manual frame tracking\n */\n private stopManualFrameTracking(): void {\n if (this.#frameTrackingId) {\n cancelAnimationFrame(this.#frameTrackingId);\n this.#frameTrackingId = null;\n writeSceneLog('LongFrameDetector', 'Stopped manual frame tracking');\n }\n }\n\n /**\n * Measure frame durations using requestAnimationFrame\n */\n private measureFrames = (): void => {\n if (!this.#isTracking) {\n return;\n }\n\n const currentFrameTime = performance.now();\n const frameLength = currentFrameTime - this.#lastFrameTime;\n\n // Check if frame exceeds threshold\n if (frameLength > LONG_FRAME_THRESHOLD) {\n const event: LongFrameEvent = {\n duration: frameLength,\n timestamp: currentFrameTime,\n method: 'manual',\n };\n\n if (this.#callback) {\n this.#callback(event);\n }\n\n // Add performance marks and measurements for debugging in dev tools\n if (typeof performance !== 'undefined' && performance.mark && performance.measure) {\n const frameId = `long-frame-manual-${currentFrameTime.toFixed(0)}`;\n const startMarkName = `${frameId}-start`;\n const endMarkName = `${frameId}-end`;\n const measureName = `Long Frame (Manual): ${frameLength.toFixed(1)}ms`;\n\n try {\n // Create start and end marks\n performance.mark(startMarkName, { startTime: currentFrameTime - frameLength });\n performance.mark(endMarkName, { startTime: currentFrameTime });\n\n // Create measurement span\n performance.measure(measureName, startMarkName, endMarkName);\n } catch {\n // Fallback for browsers that don't support startTime option\n performance.mark(measureName);\n }\n }\n\n writeSceneLog(\n 'LongFrameDetector',\n `Long frame detected (manual): ${frameLength}ms (threshold: ${LONG_FRAME_THRESHOLD}ms)`\n );\n }\n\n this.#lastFrameTime = currentFrameTime;\n\n // Continue tracking\n if (this.#isTracking) {\n this.#frameTrackingId = requestAnimationFrame(this.measureFrames);\n }\n };\n}\n"],"names":[],"mappings":"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"}
|
|
@@ -1,6 +1,4 @@
|
|
|
1
|
-
import {
|
|
2
|
-
import { generateOperationId, getScenePerformanceTracker } from './ScenePerformanceTracker.js';
|
|
3
|
-
import { PanelProfilingManager } from './PanelProfilingManager.js';
|
|
1
|
+
import { writeSceneLog, writeSceneLogStyled } from '../utils/writeSceneLog.js';
|
|
4
2
|
import { LongFrameDetector } from './LongFrameDetector.js';
|
|
5
3
|
|
|
6
4
|
var __typeError = (msg) => {
|
|
@@ -18,21 +16,17 @@ var __privateWrapper = (obj, member, setter, getter) => ({
|
|
|
18
16
|
return __privateGet(obj, member, getter);
|
|
19
17
|
}
|
|
20
18
|
});
|
|
21
|
-
var _profileInProgress, _interactionInProgress, _profileStartTs, _trailAnimationFrameId,
|
|
19
|
+
var _profileInProgress, _interactionInProgress, _profileStartTs, _trailAnimationFrameId, _recordedTrailingSpans, _longFrameDetector, _longFramesCount, _longFramesTotalTime, _visibilityChangeHandler, _onInteractionComplete;
|
|
22
20
|
const POST_STORM_WINDOW = 2e3;
|
|
23
21
|
const DEFAULT_LONG_FRAME_THRESHOLD = 30;
|
|
24
|
-
const TAB_INACTIVE_THRESHOLD = 1e3;
|
|
25
22
|
class SceneRenderProfiler {
|
|
26
|
-
constructor(
|
|
23
|
+
constructor(queryController) {
|
|
24
|
+
this.queryController = queryController;
|
|
27
25
|
__privateAdd(this, _profileInProgress, null);
|
|
28
26
|
__privateAdd(this, _interactionInProgress, null);
|
|
29
27
|
__privateAdd(this, _profileStartTs, null);
|
|
30
28
|
__privateAdd(this, _trailAnimationFrameId, null);
|
|
31
|
-
//
|
|
32
|
-
this.metadata = {};
|
|
33
|
-
// Operation ID for correlating dashboard interaction events
|
|
34
|
-
__privateAdd(this, _currentOperationId);
|
|
35
|
-
// Trailing frame measurements
|
|
29
|
+
// Will keep measured lengths trailing frames
|
|
36
30
|
__privateAdd(this, _recordedTrailingSpans, []);
|
|
37
31
|
// Long frame tracking
|
|
38
32
|
__privateAdd(this, _longFrameDetector);
|
|
@@ -41,13 +35,9 @@ class SceneRenderProfiler {
|
|
|
41
35
|
__privateAdd(this, _visibilityChangeHandler, null);
|
|
42
36
|
__privateAdd(this, _onInteractionComplete, null);
|
|
43
37
|
this.measureTrailingFrames = (measurementStartTs, lastFrameTime, profileStartTs) => {
|
|
38
|
+
var _a, _b, _c, _d;
|
|
44
39
|
const currentFrameTime = performance.now();
|
|
45
40
|
const frameLength = currentFrameTime - lastFrameTime;
|
|
46
|
-
if (frameLength > TAB_INACTIVE_THRESHOLD) {
|
|
47
|
-
writePerformanceLog("SRP", "Tab was inactive, cancelling profile measurement");
|
|
48
|
-
this.cancelProfile();
|
|
49
|
-
return;
|
|
50
|
-
}
|
|
51
41
|
__privateGet(this, _recordedTrailingSpans).push(frameLength);
|
|
52
42
|
if (currentFrameTime - measurementStartTs < POST_STORM_WINDOW) {
|
|
53
43
|
if (__privateGet(this, _profileInProgress)) {
|
|
@@ -58,73 +48,108 @@ class SceneRenderProfiler {
|
|
|
58
48
|
} else {
|
|
59
49
|
const slowFrames = processRecordedSpans(__privateGet(this, _recordedTrailingSpans));
|
|
60
50
|
const slowFramesTime = slowFrames.reduce((acc, val) => acc + val, 0);
|
|
61
|
-
|
|
62
|
-
"
|
|
63
|
-
|
|
64
|
-
slowFramesTime,
|
|
65
|
-
slowFrames,
|
|
66
|
-
__privateGet(this, _profileInProgress)
|
|
51
|
+
writeSceneLog(
|
|
52
|
+
"SceneRenderProfiler",
|
|
53
|
+
`Profile tail recorded - Slow frames: ${slowFramesTime.toFixed(1)}ms (${slowFrames.length} frames)`
|
|
67
54
|
);
|
|
55
|
+
writeSceneLog("", ` \u251C\u2500 Origin: ${((_a = __privateGet(this, _profileInProgress)) == null ? void 0 : _a.origin) || "unknown"}`);
|
|
56
|
+
writeSceneLog("", ` \u2514\u2500 Crumbs:`, ((_b = __privateGet(this, _profileInProgress)) == null ? void 0 : _b.crumbs) || []);
|
|
68
57
|
__privateSet(this, _recordedTrailingSpans, []);
|
|
69
58
|
const profileDuration = measurementStartTs - profileStartTs;
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
`
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
59
|
+
if (typeof performance !== "undefined" && performance.mark) {
|
|
60
|
+
const profileName = ((_c = __privateGet(this, _profileInProgress)) == null ? void 0 : _c.origin) || "unknown";
|
|
61
|
+
const totalTime = profileDuration + slowFramesTime;
|
|
62
|
+
performance.mark(`Dashboard Profile End: ${profileName}`);
|
|
63
|
+
const startMarkName = `Dashboard Profile Start: ${profileName}`;
|
|
64
|
+
try {
|
|
65
|
+
performance.measure(
|
|
66
|
+
`Dashboard Profile: ${profileName} (${totalTime.toFixed(1)}ms)`,
|
|
67
|
+
startMarkName,
|
|
68
|
+
`Dashboard Profile End: ${profileName}`
|
|
69
|
+
);
|
|
70
|
+
} catch (e) {
|
|
71
|
+
performance.mark(`Dashboard Profile Complete: ${profileName} (${totalTime.toFixed(1)}ms)`);
|
|
72
|
+
}
|
|
73
|
+
if (slowFrames.length > 0) {
|
|
74
|
+
const slowFramesMarkName = `Slow Frames Summary: ${slowFrames.length} frames (${slowFramesTime.toFixed(
|
|
75
|
+
1
|
|
76
|
+
)}ms)`;
|
|
77
|
+
performance.mark(slowFramesMarkName);
|
|
78
|
+
slowFrames.forEach((frameTime, index) => {
|
|
79
|
+
if (frameTime > 16) {
|
|
80
|
+
try {
|
|
81
|
+
const frameStartTime = __privateGet(this, _profileStartTs) + profileDuration + (index > 0 ? slowFrames.slice(0, index).reduce((sum, t) => sum + t, 0) : 0);
|
|
82
|
+
const frameId = `slow-frame-${index}`;
|
|
83
|
+
const frameStartMark = `${frameId}-start`;
|
|
84
|
+
const frameEndMark = `${frameId}-end`;
|
|
85
|
+
performance.mark(frameStartMark, { startTime: frameStartTime });
|
|
86
|
+
performance.mark(frameEndMark, { startTime: frameStartTime + frameTime });
|
|
87
|
+
performance.measure(`Slow Frame ${index + 1}: ${frameTime.toFixed(1)}ms`, frameStartMark, frameEndMark);
|
|
88
|
+
} catch (e) {
|
|
89
|
+
performance.mark(`Slow Frame ${index + 1}: ${frameTime.toFixed(1)}ms`);
|
|
90
|
+
}
|
|
91
|
+
}
|
|
92
|
+
});
|
|
93
|
+
}
|
|
94
|
+
}
|
|
95
|
+
const completionTimestamp = performance.now();
|
|
96
|
+
writeSceneLog("SceneRenderProfiler", "Profile completed");
|
|
97
|
+
writeSceneLog("", ` \u251C\u2500 Timestamp: ${completionTimestamp.toFixed(1)}ms`);
|
|
98
|
+
writeSceneLog("", ` \u251C\u2500 Total time: ${(profileDuration + slowFramesTime).toFixed(1)}ms`);
|
|
99
|
+
writeSceneLog("", ` \u251C\u2500 Slow frames: ${slowFramesTime}ms (${slowFrames.length} frames)`);
|
|
100
|
+
writeSceneLog("", ` \u2514\u2500 Long frames: ${__privateGet(this, _longFramesTotalTime)}ms (${__privateGet(this, _longFramesCount)} frames)`);
|
|
78
101
|
__privateGet(this, _longFrameDetector).stop();
|
|
102
|
+
writeSceneLogStyled(
|
|
103
|
+
"SceneRenderProfiler",
|
|
104
|
+
`Stopped long frame detection - profile complete at ${completionTimestamp.toFixed(1)}ms`,
|
|
105
|
+
"color: #00CC00; font-weight: bold;"
|
|
106
|
+
);
|
|
79
107
|
__privateSet(this, _trailAnimationFrameId, null);
|
|
80
108
|
const profileEndTs = profileStartTs + profileDuration + slowFramesTime;
|
|
81
109
|
if (!__privateGet(this, _profileInProgress)) {
|
|
82
110
|
return;
|
|
83
111
|
}
|
|
112
|
+
performance.measure(`DashboardInteraction ${__privateGet(this, _profileInProgress).origin}`, {
|
|
113
|
+
start: profileStartTs,
|
|
114
|
+
end: profileEndTs
|
|
115
|
+
});
|
|
84
116
|
const networkDuration = captureNetwork(profileStartTs, profileEndTs);
|
|
85
|
-
if (__privateGet(this, _profileInProgress)) {
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
timestamp: profileEndTs,
|
|
117
|
+
if (((_d = this.queryController) == null ? void 0 : _d.state.onProfileComplete) && __privateGet(this, _profileInProgress)) {
|
|
118
|
+
this.queryController.state.onProfileComplete({
|
|
119
|
+
origin: __privateGet(this, _profileInProgress).origin,
|
|
120
|
+
crumbs: __privateGet(this, _profileInProgress).crumbs,
|
|
90
121
|
duration: profileDuration + slowFramesTime,
|
|
91
122
|
networkDuration,
|
|
123
|
+
startTs: profileStartTs,
|
|
124
|
+
endTs: profileEndTs,
|
|
92
125
|
longFramesCount: __privateGet(this, _longFramesCount),
|
|
93
126
|
longFramesTotalTime: __privateGet(this, _longFramesTotalTime),
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
127
|
+
// @ts-ignore
|
|
128
|
+
jsHeapSizeLimit: performance.memory ? performance.memory.jsHeapSizeLimit : 0,
|
|
129
|
+
// @ts-ignore
|
|
130
|
+
usedJSHeapSize: performance.memory ? performance.memory.usedJSHeapSize : 0,
|
|
131
|
+
// @ts-ignore
|
|
132
|
+
totalJSHeapSize: performance.memory ? performance.memory.totalJSHeapSize : 0
|
|
133
|
+
});
|
|
98
134
|
__privateSet(this, _profileInProgress, null);
|
|
99
135
|
__privateSet(this, _trailAnimationFrameId, null);
|
|
100
136
|
}
|
|
137
|
+
if (window.__runs) {
|
|
138
|
+
window.__runs += `${Date.now()}, ${profileDuration + slowFramesTime}
|
|
139
|
+
`;
|
|
140
|
+
} else {
|
|
141
|
+
window.__runs = `${Date.now()}, ${profileDuration + slowFramesTime}
|
|
142
|
+
`;
|
|
143
|
+
}
|
|
101
144
|
}
|
|
102
145
|
};
|
|
103
146
|
__privateSet(this, _longFrameDetector, new LongFrameDetector());
|
|
104
147
|
this.setupVisibilityChangeHandler();
|
|
105
148
|
__privateSet(this, _interactionInProgress, null);
|
|
106
|
-
if (panelProfilingConfig) {
|
|
107
|
-
this._panelProfilingManager = new PanelProfilingManager(panelProfilingConfig);
|
|
108
|
-
}
|
|
109
|
-
}
|
|
110
|
-
/** Set generic metadata for observer notifications */
|
|
111
|
-
setMetadata(metadata) {
|
|
112
|
-
this.metadata = { ...metadata };
|
|
113
149
|
}
|
|
114
150
|
setQueryController(queryController) {
|
|
115
151
|
this.queryController = queryController;
|
|
116
152
|
}
|
|
117
|
-
/** Attach panel profiling to a scene object */
|
|
118
|
-
attachPanelProfiling(sceneObject) {
|
|
119
|
-
var _a;
|
|
120
|
-
(_a = this._panelProfilingManager) == null ? void 0 : _a.attachToScene(sceneObject);
|
|
121
|
-
}
|
|
122
|
-
/** Attach profiler to a specific panel */
|
|
123
|
-
attachProfilerToPanel(panel) {
|
|
124
|
-
var _a;
|
|
125
|
-
writePerformanceLog("SRP", "Attaching profiler to panel", panel.state.key);
|
|
126
|
-
(_a = this._panelProfilingManager) == null ? void 0 : _a.attachProfilerToPanel(panel);
|
|
127
|
-
}
|
|
128
153
|
setInteractionCompleteHandler(handler) {
|
|
129
154
|
__privateSet(this, _onInteractionComplete, handler != null ? handler : null);
|
|
130
155
|
}
|
|
@@ -134,7 +159,7 @@ class SceneRenderProfiler {
|
|
|
134
159
|
}
|
|
135
160
|
__privateSet(this, _visibilityChangeHandler, () => {
|
|
136
161
|
if (document.hidden && __privateGet(this, _profileInProgress)) {
|
|
137
|
-
|
|
162
|
+
writeSceneLog("SceneRenderProfiler", "Tab became inactive, cancelling profile");
|
|
138
163
|
this.cancelProfile();
|
|
139
164
|
}
|
|
140
165
|
});
|
|
@@ -143,18 +168,16 @@ class SceneRenderProfiler {
|
|
|
143
168
|
}
|
|
144
169
|
}
|
|
145
170
|
cleanup() {
|
|
146
|
-
var _a;
|
|
147
171
|
if (__privateGet(this, _visibilityChangeHandler) && typeof document !== "undefined") {
|
|
148
172
|
document.removeEventListener("visibilitychange", __privateGet(this, _visibilityChangeHandler));
|
|
149
173
|
__privateSet(this, _visibilityChangeHandler, null);
|
|
150
174
|
}
|
|
151
175
|
__privateGet(this, _longFrameDetector).stop();
|
|
152
176
|
this.cancelProfile();
|
|
153
|
-
(_a = this._panelProfilingManager) == null ? void 0 : _a.cleanup();
|
|
154
177
|
}
|
|
155
178
|
startProfile(name) {
|
|
156
179
|
if (document.hidden) {
|
|
157
|
-
|
|
180
|
+
writeSceneLog("SceneRenderProfiler", "Tab is inactive, skipping profile", name);
|
|
158
181
|
return;
|
|
159
182
|
}
|
|
160
183
|
if (__privateGet(this, _profileInProgress)) {
|
|
@@ -170,14 +193,14 @@ class SceneRenderProfiler {
|
|
|
170
193
|
}
|
|
171
194
|
startInteraction(interaction) {
|
|
172
195
|
if (__privateGet(this, _interactionInProgress)) {
|
|
173
|
-
|
|
196
|
+
writeSceneLog("profile", "Cancelled interaction:", __privateGet(this, _interactionInProgress));
|
|
174
197
|
__privateSet(this, _interactionInProgress, null);
|
|
175
198
|
}
|
|
176
199
|
__privateSet(this, _interactionInProgress, {
|
|
177
200
|
interaction,
|
|
178
201
|
startTs: performance.now()
|
|
179
202
|
});
|
|
180
|
-
|
|
203
|
+
writeSceneLog("SceneRenderProfiler", "Started interaction:", interaction);
|
|
181
204
|
}
|
|
182
205
|
stopInteraction() {
|
|
183
206
|
if (!__privateGet(this, _interactionInProgress)) {
|
|
@@ -186,10 +209,11 @@ class SceneRenderProfiler {
|
|
|
186
209
|
const endTs = performance.now();
|
|
187
210
|
const interactionDuration = endTs - __privateGet(this, _interactionInProgress).startTs;
|
|
188
211
|
const networkDuration = captureNetwork(__privateGet(this, _interactionInProgress).startTs, endTs);
|
|
189
|
-
|
|
190
|
-
|
|
191
|
-
|
|
192
|
-
);
|
|
212
|
+
writeSceneLog("SceneRenderProfiler", "Completed interaction:");
|
|
213
|
+
writeSceneLog("", ` \u251C\u2500 Total time: ${interactionDuration.toFixed(1)}ms`);
|
|
214
|
+
writeSceneLog("", ` \u251C\u2500 Network duration: ${networkDuration.toFixed(1)}ms`);
|
|
215
|
+
writeSceneLog("", ` \u251C\u2500 StartTs: ${__privateGet(this, _interactionInProgress).startTs.toFixed(1)}ms`);
|
|
216
|
+
writeSceneLog("", ` \u2514\u2500 EndTs: ${endTs.toFixed(1)}ms`);
|
|
193
217
|
if (__privateGet(this, _onInteractionComplete) && __privateGet(this, _profileInProgress)) {
|
|
194
218
|
__privateGet(this, _onInteractionComplete).call(this, {
|
|
195
219
|
origin: __privateGet(this, _interactionInProgress).interaction,
|
|
@@ -217,24 +241,32 @@ class SceneRenderProfiler {
|
|
|
217
241
|
return (_b = (_a = __privateGet(this, _interactionInProgress)) == null ? void 0 : _a.interaction) != null ? _b : null;
|
|
218
242
|
}
|
|
219
243
|
/**
|
|
220
|
-
*
|
|
221
|
-
*
|
|
222
|
-
* @param
|
|
244
|
+
* Starts a new profile for performance measurement.
|
|
245
|
+
*
|
|
246
|
+
* @param name - The origin/trigger of the profile (e.g., 'time_range_change', 'variable_value_changed')
|
|
247
|
+
* @param force - Whether this is a "forced" profile (true) or "clean" profile (false)
|
|
248
|
+
* - "forced": Started by canceling an existing profile that was recording trailing frames
|
|
249
|
+
* This happens when a new user interaction occurs before the previous one
|
|
250
|
+
* finished measuring its performance impact
|
|
251
|
+
* - "clean": Started when no profile is currently active
|
|
223
252
|
*/
|
|
224
253
|
_startNewProfile(name, force = false) {
|
|
225
|
-
|
|
226
|
-
writePerformanceLog("SRP", `[PROFILER] ${name} started (${profileType})`);
|
|
254
|
+
var _a;
|
|
227
255
|
__privateSet(this, _profileInProgress, { origin: name, crumbs: [] });
|
|
228
256
|
__privateSet(this, _profileStartTs, performance.now());
|
|
229
257
|
__privateSet(this, _longFramesCount, 0);
|
|
230
258
|
__privateSet(this, _longFramesTotalTime, 0);
|
|
231
|
-
|
|
232
|
-
|
|
233
|
-
|
|
234
|
-
|
|
235
|
-
|
|
236
|
-
|
|
237
|
-
|
|
259
|
+
if (typeof performance !== "undefined" && performance.mark) {
|
|
260
|
+
const markName = `Dashboard Profile Start: ${name}`;
|
|
261
|
+
performance.mark(markName);
|
|
262
|
+
}
|
|
263
|
+
writeSceneLogStyled(
|
|
264
|
+
"SceneRenderProfiler",
|
|
265
|
+
`Profile started[${force ? "forced" : "clean"}]`,
|
|
266
|
+
"color: #FFCC00; font-weight: bold;"
|
|
267
|
+
);
|
|
268
|
+
writeSceneLog("", ` \u251C\u2500 Origin: ${((_a = __privateGet(this, _profileInProgress)) == null ? void 0 : _a.origin) || "unknown"}`);
|
|
269
|
+
writeSceneLog("", ` \u2514\u2500 Timestamp: ${__privateGet(this, _profileStartTs).toFixed(1)}ms`);
|
|
238
270
|
__privateGet(this, _longFrameDetector).start((event) => {
|
|
239
271
|
if (!__privateGet(this, _profileInProgress) || !__privateGet(this, _profileStartTs)) {
|
|
240
272
|
return;
|
|
@@ -253,9 +285,12 @@ class SceneRenderProfiler {
|
|
|
253
285
|
}
|
|
254
286
|
tryCompletingProfile() {
|
|
255
287
|
var _a;
|
|
256
|
-
|
|
288
|
+
if (!__privateGet(this, _profileInProgress)) {
|
|
289
|
+
return;
|
|
290
|
+
}
|
|
291
|
+
writeSceneLog("SceneRenderProfiler", "Trying to complete profile", __privateGet(this, _profileInProgress));
|
|
257
292
|
if (((_a = this.queryController) == null ? void 0 : _a.runningQueriesCount()) === 0 && __privateGet(this, _profileInProgress)) {
|
|
258
|
-
|
|
293
|
+
writeSceneLog("SceneRenderProfiler", "All queries completed, starting tail measurement");
|
|
259
294
|
this.recordProfileTail(performance.now(), __privateGet(this, _profileStartTs));
|
|
260
295
|
}
|
|
261
296
|
}
|
|
@@ -266,20 +301,20 @@ class SceneRenderProfiler {
|
|
|
266
301
|
if (__privateGet(this, _trailAnimationFrameId)) {
|
|
267
302
|
cancelAnimationFrame(__privateGet(this, _trailAnimationFrameId));
|
|
268
303
|
__privateSet(this, _trailAnimationFrameId, null);
|
|
269
|
-
|
|
304
|
+
writeSceneLog("SceneRenderProfiler", "Cancelled recording frames, new profile started");
|
|
270
305
|
}
|
|
271
306
|
}
|
|
272
307
|
// cancel profile
|
|
273
308
|
cancelProfile() {
|
|
274
309
|
if (__privateGet(this, _profileInProgress)) {
|
|
275
|
-
|
|
310
|
+
writeSceneLog("SceneRenderProfiler", "Cancelling profile", __privateGet(this, _profileInProgress));
|
|
276
311
|
__privateSet(this, _profileInProgress, null);
|
|
277
312
|
if (__privateGet(this, _trailAnimationFrameId)) {
|
|
278
313
|
cancelAnimationFrame(__privateGet(this, _trailAnimationFrameId));
|
|
279
314
|
__privateSet(this, _trailAnimationFrameId, null);
|
|
280
315
|
}
|
|
281
316
|
__privateGet(this, _longFrameDetector).stop();
|
|
282
|
-
|
|
317
|
+
writeSceneLog("SceneRenderProfiler", "Stopped long frame detection - profile cancelled");
|
|
283
318
|
__privateSet(this, _recordedTrailingSpans, []);
|
|
284
319
|
__privateSet(this, _longFramesCount, 0);
|
|
285
320
|
__privateSet(this, _longFramesTotalTime, 0);
|
|
@@ -287,13 +322,7 @@ class SceneRenderProfiler {
|
|
|
287
322
|
}
|
|
288
323
|
addCrumb(crumb) {
|
|
289
324
|
if (__privateGet(this, _profileInProgress)) {
|
|
290
|
-
|
|
291
|
-
operationId: generateOperationId("dashboard-milestone"),
|
|
292
|
-
interactionType: __privateGet(this, _profileInProgress).origin,
|
|
293
|
-
timestamp: performance.now(),
|
|
294
|
-
milestone: crumb,
|
|
295
|
-
metadata: this.metadata
|
|
296
|
-
});
|
|
325
|
+
writeSceneLog("SceneRenderProfiler", "Adding crumb:", crumb);
|
|
297
326
|
__privateGet(this, _profileInProgress).crumbs.push(crumb);
|
|
298
327
|
}
|
|
299
328
|
}
|
|
@@ -302,7 +331,6 @@ _profileInProgress = new WeakMap();
|
|
|
302
331
|
_interactionInProgress = new WeakMap();
|
|
303
332
|
_profileStartTs = new WeakMap();
|
|
304
333
|
_trailAnimationFrameId = new WeakMap();
|
|
305
|
-
_currentOperationId = new WeakMap();
|
|
306
334
|
_recordedTrailingSpans = new WeakMap();
|
|
307
335
|
_longFrameDetector = new WeakMap();
|
|
308
336
|
_longFramesCount = new WeakMap();
|
|
@@ -351,6 +379,16 @@ function calculateNetworkTime(requests) {
|
|
|
351
379
|
totalNetworkTime += currentEnd - currentStart;
|
|
352
380
|
return totalNetworkTime;
|
|
353
381
|
}
|
|
382
|
+
const REFRESH_INTERACTION = "refresh";
|
|
383
|
+
const TIME_RANGE_CHANGE_INTERACTION = "time_range_change";
|
|
384
|
+
const FILTER_REMOVED_INTERACTION = "filter_removed";
|
|
385
|
+
const FILTER_CHANGED_INTERACTION = "filter_changed";
|
|
386
|
+
const FILTER_RESTORED_INTERACTION = "filter_restored";
|
|
387
|
+
const VARIABLE_VALUE_CHANGED_INTERACTION = "variable_value_changed";
|
|
388
|
+
const SCOPES_CHANGED_INTERACTION = "scopes_changed";
|
|
389
|
+
const ADHOC_KEYS_DROPDOWN_INTERACTION = "adhoc_keys_dropdown";
|
|
390
|
+
const ADHOC_VALUES_DROPDOWN_INTERACTION = "adhoc_values_dropdown";
|
|
391
|
+
const GROUPBY_DIMENSIONS_INTERACTION = "groupby_dimensions";
|
|
354
392
|
|
|
355
|
-
export { SceneRenderProfiler, calculateNetworkTime, captureNetwork, processRecordedSpans };
|
|
393
|
+
export { ADHOC_KEYS_DROPDOWN_INTERACTION, ADHOC_VALUES_DROPDOWN_INTERACTION, FILTER_CHANGED_INTERACTION, FILTER_REMOVED_INTERACTION, FILTER_RESTORED_INTERACTION, GROUPBY_DIMENSIONS_INTERACTION, REFRESH_INTERACTION, SCOPES_CHANGED_INTERACTION, SceneRenderProfiler, TIME_RANGE_CHANGE_INTERACTION, VARIABLE_VALUE_CHANGED_INTERACTION, calculateNetworkTime, captureNetwork, processRecordedSpans };
|
|
356
394
|
//# sourceMappingURL=SceneRenderProfiler.js.map
|