@grafana/scenes 6.40.0--canary.1265.18715274766.0 → 6.40.0--canary.1281.18720650291.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/dist/esm/{performance → behaviors}/LongFrameDetector.js +11 -11
- package/dist/esm/behaviors/LongFrameDetector.js.map +1 -0
- package/dist/esm/behaviors/SceneInteractionTracker.js.map +1 -1
- package/dist/esm/behaviors/SceneQueryController.js.map +1 -1
- package/dist/esm/{performance → behaviors}/SceneRenderProfiler.js +132 -87
- package/dist/esm/behaviors/SceneRenderProfiler.js.map +1 -0
- package/dist/esm/components/SceneRefreshPicker.js +1 -1
- package/dist/esm/components/SceneRefreshPicker.js.map +1 -1
- package/dist/esm/components/VizPanel/VizPanel.js +0 -26
- package/dist/esm/components/VizPanel/VizPanel.js.map +1 -1
- package/dist/esm/components/VizPanel/VizPanelRenderer.js +1 -18
- 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 -5
- package/dist/esm/index.js.map +1 -1
- package/dist/esm/querying/SceneDataTransformer.js +0 -57
- 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/registerQueryWithController.js +2 -39
- package/dist/esm/querying/registerQueryWithController.js.map +1 -1
- package/dist/esm/services/UniqueUrlKeyMapper.js +21 -12
- package/dist/esm/services/UniqueUrlKeyMapper.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/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/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/index.d.ts +95 -326
- package/dist/index.js +6384 -6942
- package/dist/index.js.map +1 -1
- package/package.json +2 -2
- package/dist/esm/performance/LongFrameDetector.js.map +0 -1
- package/dist/esm/performance/PanelProfilingManager.js +0 -65
- package/dist/esm/performance/PanelProfilingManager.js.map +0 -1
- package/dist/esm/performance/ScenePerformanceTracker.js +0 -82
- package/dist/esm/performance/ScenePerformanceTracker.js.map +0 -1
- package/dist/esm/performance/SceneRenderProfiler.js.map +0 -1
- package/dist/esm/performance/VizPanelRenderProfiler.js +0 -316
- package/dist/esm/performance/VizPanelRenderProfiler.js.map +0 -1
- package/dist/esm/performance/index.js +0 -3
- package/dist/esm/performance/index.js.map +0 -1
- package/dist/esm/performance/interactionConstants.js +0 -13
- package/dist/esm/performance/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/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@grafana/scenes",
|
|
3
|
-
"version": "6.40.0--canary.
|
|
3
|
+
"version": "6.40.0--canary.1281.18720650291.0",
|
|
4
4
|
"description": "Grafana framework for building dynamic dashboards",
|
|
5
5
|
"author": "Grafana Labs",
|
|
6
6
|
"license": "Apache-2.0",
|
|
@@ -125,5 +125,5 @@
|
|
|
125
125
|
"prettier --write"
|
|
126
126
|
]
|
|
127
127
|
},
|
|
128
|
-
"gitHead": "
|
|
128
|
+
"gitHead": "6aa833d374ac90a3fffecbd3eae22c136d928cf3"
|
|
129
129
|
}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"LongFrameDetector.js","sources":["../../../src/performance/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,65 +0,0 @@
|
|
|
1
|
-
import { VizPanel } from '../components/VizPanel/VizPanel.js';
|
|
2
|
-
import { VizPanelRenderProfiler } from './VizPanelRenderProfiler.js';
|
|
3
|
-
import { sceneGraph } from '../core/sceneGraph/index.js';
|
|
4
|
-
|
|
5
|
-
class PanelProfilingManager {
|
|
6
|
-
constructor(_config) {
|
|
7
|
-
this._config = _config;
|
|
8
|
-
this._subscriptions = [];
|
|
9
|
-
}
|
|
10
|
-
/**
|
|
11
|
-
* Attach panel profiling to a scene object
|
|
12
|
-
*/
|
|
13
|
-
attachToScene(sceneObject) {
|
|
14
|
-
this._sceneObject = sceneObject;
|
|
15
|
-
const subscription = sceneObject.subscribeToState((newState, prevState) => {
|
|
16
|
-
if (this._config.watchStateKey) {
|
|
17
|
-
if (newState[this._config.watchStateKey] !== prevState[this._config.watchStateKey]) {
|
|
18
|
-
this._attachProfilersToPanels();
|
|
19
|
-
}
|
|
20
|
-
} else {
|
|
21
|
-
this._attachProfilersToPanels();
|
|
22
|
-
}
|
|
23
|
-
});
|
|
24
|
-
this._subscriptions.push(subscription);
|
|
25
|
-
this._attachProfilersToPanels();
|
|
26
|
-
}
|
|
27
|
-
/**
|
|
28
|
-
* Attach VizPanelRenderProfiler to a specific panel if it doesn't already have one
|
|
29
|
-
* @param panel - The VizPanel to attach profiling to
|
|
30
|
-
*/
|
|
31
|
-
attachProfilerToPanel(panel) {
|
|
32
|
-
var _a;
|
|
33
|
-
const existingProfiler = (_a = panel.state.$behaviors) == null ? void 0 : _a.find((b) => b instanceof VizPanelRenderProfiler);
|
|
34
|
-
if (existingProfiler) {
|
|
35
|
-
return;
|
|
36
|
-
}
|
|
37
|
-
const profiler = new VizPanelRenderProfiler();
|
|
38
|
-
panel.setState({
|
|
39
|
-
$behaviors: [...panel.state.$behaviors || [], profiler]
|
|
40
|
-
});
|
|
41
|
-
}
|
|
42
|
-
/**
|
|
43
|
-
* Attach VizPanelRenderProfiler to all VizPanels that don't already have one
|
|
44
|
-
*/
|
|
45
|
-
_attachProfilersToPanels() {
|
|
46
|
-
if (!this._sceneObject) {
|
|
47
|
-
return;
|
|
48
|
-
}
|
|
49
|
-
const panels = sceneGraph.findAllObjects(this._sceneObject, (obj) => obj instanceof VizPanel);
|
|
50
|
-
panels.forEach((panel) => {
|
|
51
|
-
this.attachProfilerToPanel(panel);
|
|
52
|
-
});
|
|
53
|
-
}
|
|
54
|
-
/**
|
|
55
|
-
* Clean up subscriptions and references
|
|
56
|
-
*/
|
|
57
|
-
cleanup() {
|
|
58
|
-
this._subscriptions.forEach((sub) => sub.unsubscribe());
|
|
59
|
-
this._subscriptions = [];
|
|
60
|
-
this._sceneObject = void 0;
|
|
61
|
-
}
|
|
62
|
-
}
|
|
63
|
-
|
|
64
|
-
export { PanelProfilingManager };
|
|
65
|
-
//# sourceMappingURL=PanelProfilingManager.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"PanelProfilingManager.js","sources":["../../../src/performance/PanelProfilingManager.ts"],"sourcesContent":["import { Unsubscribable } from 'rxjs';\nimport { VizPanel } from '../components/VizPanel/VizPanel';\nimport { VizPanelRenderProfiler } from './VizPanelRenderProfiler';\nimport { SceneObject } from '../core/types';\nimport { sceneGraph } from '../core/sceneGraph';\n\nexport interface PanelProfilingConfig {\n watchStateKey?: string; // State property to watch for structural changes (e.g., 'body', 'children')\n}\n\n/**\n * Manages VizPanelRenderProfiler instances for all panels in a scene object.\n * Extracted from DashboardPanelProfilingBehavior to allow composition with SceneRenderProfiler.\n */\nexport class PanelProfilingManager {\n private _sceneObject?: SceneObject;\n private _subscriptions: Unsubscribable[] = [];\n\n public constructor(private _config: PanelProfilingConfig) {}\n\n /**\n * Attach panel profiling to a scene object\n */\n public attachToScene(sceneObject: SceneObject) {\n this._sceneObject = sceneObject;\n\n // Subscribe to scene state changes to add profilers to new panels\n const subscription = sceneObject.subscribeToState((newState: any, prevState: any) => {\n // If watchStateKey is specified, only react to changes in that specific property\n if (this._config.watchStateKey) {\n if (newState[this._config.watchStateKey] !== prevState[this._config.watchStateKey]) {\n this._attachProfilersToPanels();\n }\n } else {\n // Fallback: react to any state change\n this._attachProfilersToPanels();\n }\n });\n\n this._subscriptions.push(subscription);\n\n // Attach profilers to existing panels\n this._attachProfilersToPanels();\n }\n\n /**\n * Attach VizPanelRenderProfiler to a specific panel if it doesn't already have one\n * @param panel - The VizPanel to attach profiling to\n */\n public attachProfilerToPanel(panel: VizPanel): void {\n // Check if profiler already exists\n const existingProfiler = panel.state.$behaviors?.find((b) => b instanceof VizPanelRenderProfiler);\n\n if (existingProfiler) {\n return; // Already has a profiler\n }\n\n // Add profiler behavior\n const profiler = new VizPanelRenderProfiler();\n\n panel.setState({\n $behaviors: [...(panel.state.$behaviors || []), profiler],\n });\n }\n\n /**\n * Attach VizPanelRenderProfiler to all VizPanels that don't already have one\n */\n private _attachProfilersToPanels() {\n if (!this._sceneObject) {\n return;\n }\n\n // Use scene graph to find all VizPanels in the scene\n const panels = sceneGraph.findAllObjects(this._sceneObject, (obj) => obj instanceof VizPanel) as VizPanel[];\n\n panels.forEach((panel) => {\n this.attachProfilerToPanel(panel);\n });\n }\n\n /**\n * Clean up subscriptions and references\n */\n public cleanup() {\n this._subscriptions.forEach((sub) => sub.unsubscribe());\n this._subscriptions = [];\n this._sceneObject = undefined;\n }\n}\n"],"names":[],"mappings":";;;;AAcO,MAAM,qBAAsB,CAAA;AAAA,EAI1B,YAAoB,OAA+B,EAAA;AAA/B,IAAA,IAAA,CAAA,OAAA,GAAA,OAAA;AAF3B,IAAA,IAAA,CAAQ,iBAAmC,EAAC;AAAA;AAEe;AAAA;AAAA;AAAA,EAKpD,cAAc,WAA0B,EAAA;AAC7C,IAAA,IAAA,CAAK,YAAe,GAAA,WAAA;AAGpB,IAAA,MAAM,YAAe,GAAA,WAAA,CAAY,gBAAiB,CAAA,CAAC,UAAe,SAAmB,KAAA;AAEnF,MAAI,IAAA,IAAA,CAAK,QAAQ,aAAe,EAAA;AAC9B,QAAI,IAAA,QAAA,CAAS,KAAK,OAAQ,CAAA,aAAa,MAAM,SAAU,CAAA,IAAA,CAAK,OAAQ,CAAA,aAAa,CAAG,EAAA;AAClF,UAAA,IAAA,CAAK,wBAAyB,EAAA;AAAA;AAChC,OACK,MAAA;AAEL,QAAA,IAAA,CAAK,wBAAyB,EAAA;AAAA;AAChC,KACD,CAAA;AAED,IAAK,IAAA,CAAA,cAAA,CAAe,KAAK,YAAY,CAAA;AAGrC,IAAA,IAAA,CAAK,wBAAyB,EAAA;AAAA;AAChC;AAAA;AAAA;AAAA;AAAA,EAMO,sBAAsB,KAAuB,EAAA;AAjDtD,IAAA,IAAA,EAAA;AAmDI,IAAM,MAAA,gBAAA,GAAA,CAAmB,WAAM,KAAM,CAAA,UAAA,KAAZ,mBAAwB,IAAK,CAAA,CAAC,MAAM,CAAa,YAAA,sBAAA,CAAA;AAE1E,IAAA,IAAI,gBAAkB,EAAA;AACpB,MAAA;AAAA;AAIF,IAAM,MAAA,QAAA,GAAW,IAAI,sBAAuB,EAAA;AAE5C,IAAA,KAAA,CAAM,QAAS,CAAA;AAAA,MACb,UAAA,EAAY,CAAC,GAAI,KAAA,CAAM,MAAM,UAAc,IAAA,IAAK,QAAQ;AAAA,KACzD,CAAA;AAAA;AACH;AAAA;AAAA;AAAA,EAKQ,wBAA2B,GAAA;AACjC,IAAI,IAAA,CAAC,KAAK,YAAc,EAAA;AACtB,MAAA;AAAA;AAIF,IAAM,MAAA,MAAA,GAAS,WAAW,cAAe,CAAA,IAAA,CAAK,cAAc,CAAC,GAAA,KAAQ,eAAe,QAAQ,CAAA;AAE5F,IAAO,MAAA,CAAA,OAAA,CAAQ,CAAC,KAAU,KAAA;AACxB,MAAA,IAAA,CAAK,sBAAsB,KAAK,CAAA;AAAA,KACjC,CAAA;AAAA;AACH;AAAA;AAAA;AAAA,EAKO,OAAU,GAAA;AACf,IAAA,IAAA,CAAK,eAAe,OAAQ,CAAA,CAAC,GAAQ,KAAA,GAAA,CAAI,aAAa,CAAA;AACtD,IAAA,IAAA,CAAK,iBAAiB,EAAC;AACvB,IAAA,IAAA,CAAK,YAAe,GAAA,MAAA;AAAA;AAExB;;;;"}
|
|
@@ -1,82 +0,0 @@
|
|
|
1
|
-
function generateOperationId(prefix = "op") {
|
|
2
|
-
if (typeof crypto !== "undefined" && crypto.randomUUID) {
|
|
3
|
-
const uuid = crypto.randomUUID();
|
|
4
|
-
return `${prefix}-${uuid}`;
|
|
5
|
-
}
|
|
6
|
-
const randomPart = Math.random().toString(36).substring(2, 15) + Math.random().toString(36).substring(2, 15);
|
|
7
|
-
return `${prefix}-${randomPart}`;
|
|
8
|
-
}
|
|
9
|
-
const _ScenePerformanceTracker = class _ScenePerformanceTracker {
|
|
10
|
-
constructor() {
|
|
11
|
-
this.observers = [];
|
|
12
|
-
}
|
|
13
|
-
static getInstance() {
|
|
14
|
-
if (!_ScenePerformanceTracker.instance) {
|
|
15
|
-
_ScenePerformanceTracker.instance = new _ScenePerformanceTracker();
|
|
16
|
-
}
|
|
17
|
-
return _ScenePerformanceTracker.instance;
|
|
18
|
-
}
|
|
19
|
-
/**
|
|
20
|
-
* Register a performance observer
|
|
21
|
-
*/
|
|
22
|
-
addObserver(observer) {
|
|
23
|
-
this.observers.push(observer);
|
|
24
|
-
return () => {
|
|
25
|
-
const index = this.observers.indexOf(observer);
|
|
26
|
-
if (index > -1) {
|
|
27
|
-
this.observers.splice(index, 1);
|
|
28
|
-
}
|
|
29
|
-
};
|
|
30
|
-
}
|
|
31
|
-
/**
|
|
32
|
-
* Remove all observers (for testing)
|
|
33
|
-
*/
|
|
34
|
-
clearObservers() {
|
|
35
|
-
this.observers = [];
|
|
36
|
-
}
|
|
37
|
-
/**
|
|
38
|
-
* Get current observer count (for debugging)
|
|
39
|
-
*/
|
|
40
|
-
getObserverCount() {
|
|
41
|
-
return this.observers.length;
|
|
42
|
-
}
|
|
43
|
-
notifyObservers(methodName, data, errorContext) {
|
|
44
|
-
this.observers.forEach((observer) => {
|
|
45
|
-
try {
|
|
46
|
-
const method = observer[methodName];
|
|
47
|
-
method == null ? void 0 : method(data);
|
|
48
|
-
} catch (error) {
|
|
49
|
-
console.warn(`Error in ${errorContext} observer:`, error);
|
|
50
|
-
}
|
|
51
|
-
});
|
|
52
|
-
}
|
|
53
|
-
notifyDashboardInteractionStart(data) {
|
|
54
|
-
this.notifyObservers("onDashboardInteractionStart", data, "dashboard interaction start");
|
|
55
|
-
}
|
|
56
|
-
notifyDashboardInteractionMilestone(data) {
|
|
57
|
-
this.notifyObservers("onDashboardInteractionMilestone", data, "dashboard interaction milestone");
|
|
58
|
-
}
|
|
59
|
-
notifyDashboardInteractionComplete(data) {
|
|
60
|
-
this.notifyObservers("onDashboardInteractionComplete", data, "dashboard interaction complete");
|
|
61
|
-
}
|
|
62
|
-
notifyPanelOperationStart(data) {
|
|
63
|
-
this.notifyObservers("onPanelOperationStart", data, "panel operation start");
|
|
64
|
-
}
|
|
65
|
-
notifyPanelOperationComplete(data) {
|
|
66
|
-
this.notifyObservers("onPanelOperationComplete", data, "panel operation complete");
|
|
67
|
-
}
|
|
68
|
-
notifyQueryStart(data) {
|
|
69
|
-
this.notifyObservers("onQueryStart", data, "query start");
|
|
70
|
-
}
|
|
71
|
-
notifyQueryComplete(data) {
|
|
72
|
-
this.notifyObservers("onQueryComplete", data, "query complete");
|
|
73
|
-
}
|
|
74
|
-
};
|
|
75
|
-
_ScenePerformanceTracker.instance = null;
|
|
76
|
-
let ScenePerformanceTracker = _ScenePerformanceTracker;
|
|
77
|
-
function getScenePerformanceTracker() {
|
|
78
|
-
return ScenePerformanceTracker.getInstance();
|
|
79
|
-
}
|
|
80
|
-
|
|
81
|
-
export { ScenePerformanceTracker, generateOperationId, getScenePerformanceTracker };
|
|
82
|
-
//# sourceMappingURL=ScenePerformanceTracker.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"ScenePerformanceTracker.js","sources":["../../../src/performance/ScenePerformanceTracker.ts"],"sourcesContent":["/**\n * Centralized performance tracking system using observer pattern.\n * External systems (like Grafana) implement ScenePerformanceObserver to receive performance events.\n */\n\n/** Generate unique operation IDs for correlating start/complete events */\nexport function generateOperationId(prefix = 'op'): string {\n // Use crypto.randomUUID() for true uniqueness without global state\n if (typeof crypto !== 'undefined' && crypto.randomUUID) {\n const uuid = crypto.randomUUID();\n return `${prefix}-${uuid}`;\n }\n\n // Fallback for environments without crypto.randomUUID support\n const randomPart = Math.random().toString(36).substring(2, 15) + Math.random().toString(36).substring(2, 15);\n return `${prefix}-${randomPart}`;\n}\n\n/** Base interface for all performance events */\nexport interface BasePerformanceEvent {\n operationId: string; // Unique identifier for correlating start/complete events\n timestamp: number;\n duration?: number;\n error?: string;\n}\n\nexport interface DashboardInteractionStartData extends BasePerformanceEvent {\n interactionType: string;\n metadata?: Record<string, unknown>;\n}\n\nexport interface DashboardInteractionMilestoneData extends BasePerformanceEvent {\n interactionType: string;\n milestone: string;\n metadata?: Record<string, unknown>;\n}\n\nexport interface DashboardInteractionCompleteData extends BasePerformanceEvent {\n interactionType: string;\n networkDuration?: number;\n longFramesCount: number;\n longFramesTotalTime: number;\n metadata?: Record<string, unknown>;\n}\n\n/** Metadata interface for transform operations */\nexport interface TransformMetadata {\n transformationId: string;\n transformationCount: number;\n seriesTransformationCount: number;\n annotationTransformationCount: number;\n success?: boolean;\n error?: string;\n}\n\n/** Metadata interface for query operations */\nexport interface QueryMetadata {\n queryId: string;\n queryType: string;\n}\n\n/** Metadata interface for render operations */\nexport interface RenderMetadata {\n // Empty for now - can be extended later if needed\n}\n\n/** Metadata interface for plugin load operations */\nexport interface PluginLoadMetadata {\n pluginId: string;\n fromCache?: boolean;\n pluginLoadTime?: number;\n}\n\n/** Metadata interface for field config operations */\nexport interface FieldConfigMetadata {}\n\n/** Base interface for panel performance events */\ninterface BasePanelPerformanceData extends BasePerformanceEvent {\n panelId: string;\n panelKey: string;\n pluginId: string;\n pluginVersion?: string;\n panelTitle?: string;\n}\n\n/** Transform operation performance data */\nexport interface PanelTransformPerformanceData extends BasePanelPerformanceData {\n operation: 'transform';\n metadata: TransformMetadata;\n}\n\n/** Query operation performance data */\nexport interface PanelQueryPerformanceData extends BasePanelPerformanceData {\n operation: 'query';\n metadata: QueryMetadata;\n}\n\n/** Render operation performance data */\nexport interface PanelRenderPerformanceData extends BasePanelPerformanceData {\n operation: 'render';\n metadata: RenderMetadata;\n}\n\n/** Plugin load operation performance data */\nexport interface PanelPluginLoadPerformanceData extends BasePanelPerformanceData {\n operation: 'plugin-load';\n metadata: PluginLoadMetadata;\n}\n\n/** Field config operation performance data */\nexport interface PanelFieldConfigPerformanceData extends BasePanelPerformanceData {\n operation: 'fieldConfig';\n metadata: FieldConfigMetadata;\n}\n\n/** Discriminated union of all panel performance data types */\nexport type PanelPerformanceData =\n | PanelTransformPerformanceData\n | PanelQueryPerformanceData\n | PanelRenderPerformanceData\n | PanelPluginLoadPerformanceData\n | PanelFieldConfigPerformanceData;\n\n/** Non-panel query performance data for dashboard queries (annotations, variables, etc.) */\nexport interface QueryPerformanceData extends BasePerformanceEvent {\n queryId: string;\n queryType: string;\n origin: string; // e.g., \"AnnotationsDataLayer\", \"QueryVariable\", \"VizPanel/loadPlugin\"\n}\n\n/**\n * Observer interface for performance monitoring\n * External systems implement this to receive performance notifications\n */\nexport interface ScenePerformanceObserver {\n // Dashboard-level events\n onDashboardInteractionStart?(data: DashboardInteractionStartData): void;\n onDashboardInteractionMilestone?(data: DashboardInteractionMilestoneData): void;\n onDashboardInteractionComplete?(data: DashboardInteractionCompleteData): void;\n\n // Panel-level events\n onPanelOperationStart?(data: PanelPerformanceData): void;\n onPanelOperationComplete?(data: PanelPerformanceData): void;\n\n // Query-level events\n onQueryStart?(data: QueryPerformanceData): void;\n onQueryComplete?(data: QueryPerformanceData): void;\n}\n\n/**\n * Centralized performance tracker\n * Manages observers and provides methods for scene objects to report performance events\n */\nexport class ScenePerformanceTracker {\n private static instance: ScenePerformanceTracker | null = null;\n private observers: ScenePerformanceObserver[] = [];\n\n public static getInstance(): ScenePerformanceTracker {\n if (!ScenePerformanceTracker.instance) {\n ScenePerformanceTracker.instance = new ScenePerformanceTracker();\n }\n return ScenePerformanceTracker.instance;\n }\n\n /**\n * Register a performance observer\n */\n public addObserver(observer: ScenePerformanceObserver): () => void {\n this.observers.push(observer);\n\n // Return unsubscribe function\n return () => {\n const index = this.observers.indexOf(observer);\n if (index > -1) {\n this.observers.splice(index, 1);\n }\n };\n }\n\n /**\n * Remove all observers (for testing)\n */\n public clearObservers(): void {\n this.observers = [];\n }\n\n /**\n * Get current observer count (for debugging)\n */\n public getObserverCount(): number {\n return this.observers.length;\n }\n\n private notifyObservers<T>(methodName: keyof ScenePerformanceObserver, data: T, errorContext: string): void {\n this.observers.forEach((observer) => {\n try {\n const method = observer[methodName] as ((data: T) => void) | undefined;\n method?.(data);\n } catch (error) {\n console.warn(`Error in ${errorContext} observer:`, error);\n }\n });\n }\n\n public notifyDashboardInteractionStart(data: DashboardInteractionStartData): void {\n this.notifyObservers('onDashboardInteractionStart', data, 'dashboard interaction start');\n }\n\n public notifyDashboardInteractionMilestone(data: DashboardInteractionMilestoneData): void {\n this.notifyObservers('onDashboardInteractionMilestone', data, 'dashboard interaction milestone');\n }\n\n public notifyDashboardInteractionComplete(data: DashboardInteractionCompleteData): void {\n this.notifyObservers('onDashboardInteractionComplete', data, 'dashboard interaction complete');\n }\n\n public notifyPanelOperationStart(data: PanelPerformanceData): void {\n this.notifyObservers('onPanelOperationStart', data, 'panel operation start');\n }\n\n public notifyPanelOperationComplete(data: PanelPerformanceData): void {\n this.notifyObservers('onPanelOperationComplete', data, 'panel operation complete');\n }\n\n public notifyQueryStart(data: QueryPerformanceData): void {\n this.notifyObservers('onQueryStart', data, 'query start');\n }\n\n public notifyQueryComplete(data: QueryPerformanceData): void {\n this.notifyObservers('onQueryComplete', data, 'query complete');\n }\n}\n\n/**\n * Get the global performance tracker instance\n */\nexport function getScenePerformanceTracker(): ScenePerformanceTracker {\n return ScenePerformanceTracker.getInstance();\n}\n"],"names":[],"mappings":"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"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"SceneRenderProfiler.js","sources":["../../../src/performance/SceneRenderProfiler.ts"],"sourcesContent":["import { writePerformanceLog } from '../utils/writePerformanceLog';\nimport { SceneQueryControllerLike, LongFrameEvent, SceneComponentInteractionEvent } from '../behaviors/types';\nimport {\n getScenePerformanceTracker,\n generateOperationId,\n DashboardInteractionCompleteData,\n} from './ScenePerformanceTracker';\nimport { PanelProfilingManager, PanelProfilingConfig } from './PanelProfilingManager';\nimport { SceneObject } from '../core/types';\nimport { VizPanel } from '../components/VizPanel/VizPanel';\nimport { LongFrameDetector } from './LongFrameDetector';\n\nconst POST_STORM_WINDOW = 2000; // Time after last query to observe slow frames\nconst DEFAULT_LONG_FRAME_THRESHOLD = 30; // Threshold for tail recording slow frames\n\n/**\n * SceneRenderProfiler tracks dashboard interaction performance including:\n * - Total interaction duration\n * - Network time\n * - Long frame detection (50ms threshold) during interaction using LoAF API (default) or manual tracking (fallback)\n * - Slow frame detection (30ms threshold) for tail recording after interaction\n *\n * Long frame detection during interaction:\n * - 50ms threshold aligned with LoAF API default\n * - LoAF API preferred (Chrome 123+) with manual fallback\n * - Provides script attribution when using LoAF API\n *\n * Slow frame detection for tail recording:\n * - 30ms threshold for post-interaction monitoring\n * - Manual frame timing measurement\n * - Captures rendering delays after user interaction completes\n */\n\nexport class SceneRenderProfiler {\n #profileInProgress: {\n origin: string; // Profile trigger (e.g., 'time_range_change')\n crumbs: string[];\n } | null = null;\n\n #interactionInProgress: {\n interaction: string;\n startTs: number;\n } | null = null;\n\n #profileStartTs: number | null = null;\n #trailAnimationFrameId: number | null = null;\n\n // Generic metadata for observer notifications\n private metadata: Record<string, unknown> = {};\n\n // Operation ID for correlating dashboard interaction events\n #currentOperationId?: string;\n\n // Trailing frame measurements\n #recordedTrailingSpans: number[] = [];\n\n // Long frame tracking\n #longFrameDetector: LongFrameDetector;\n #longFramesCount = 0;\n #longFramesTotalTime = 0;\n\n #visibilityChangeHandler: (() => void) | null = null;\n #onInteractionComplete: ((event: SceneComponentInteractionEvent) => void) | null = null;\n\n // Panel profiling composition\n private _panelProfilingManager?: PanelProfilingManager;\n\n // Query controller for monitoring query completion\n private queryController?: SceneQueryControllerLike;\n\n public constructor(panelProfilingConfig?: PanelProfilingConfig) {\n this.#longFrameDetector = new LongFrameDetector();\n this.setupVisibilityChangeHandler();\n this.#interactionInProgress = null;\n\n // Compose with panel profiling manager if provided\n if (panelProfilingConfig) {\n this._panelProfilingManager = new PanelProfilingManager(panelProfilingConfig);\n }\n }\n\n /** Set generic metadata for observer notifications */\n public setMetadata(metadata: Record<string, unknown>) {\n this.metadata = { ...metadata };\n }\n\n public setQueryController(queryController: SceneQueryControllerLike) {\n this.queryController = queryController;\n }\n\n /** Attach panel profiling to a scene object */\n public attachPanelProfiling(sceneObject: SceneObject) {\n this._panelProfilingManager?.attachToScene(sceneObject);\n }\n\n /** Attach profiler to a specific panel */\n public attachProfilerToPanel(panel: VizPanel): void {\n writePerformanceLog('SRP', 'Attaching profiler to panel', panel.state.key);\n this._panelProfilingManager?.attachProfilerToPanel(panel);\n }\n\n public setInteractionCompleteHandler(handler?: (event: SceneComponentInteractionEvent) => void) {\n this.#onInteractionComplete = handler ?? null;\n }\n\n private setupVisibilityChangeHandler() {\n if (this.#visibilityChangeHandler) {\n return;\n }\n\n // Cancel profiling when tab becomes inactive\n this.#visibilityChangeHandler = () => {\n if (document.hidden && this.#profileInProgress) {\n writePerformanceLog('SRP', 'Tab became inactive, cancelling profile');\n this.cancelProfile();\n }\n };\n\n if (typeof document !== 'undefined') {\n document.addEventListener('visibilitychange', this.#visibilityChangeHandler);\n }\n }\n\n public cleanup() {\n if (this.#visibilityChangeHandler && typeof document !== 'undefined') {\n document.removeEventListener('visibilitychange', this.#visibilityChangeHandler);\n this.#visibilityChangeHandler = null;\n }\n\n // Cleanup long frame tracking\n this.#longFrameDetector.stop();\n\n // Cancel any ongoing profiling\n this.cancelProfile();\n\n // Cleanup composed panel profiling manager\n this._panelProfilingManager?.cleanup();\n }\n\n public startProfile(name: string) {\n // Skip profiling if tab is inactive\n if (document.hidden) {\n writePerformanceLog('SRP', 'Tab is inactive, skipping profile', name);\n return;\n }\n\n if (this.#profileInProgress) {\n if (this.#trailAnimationFrameId) {\n this.cancelProfile();\n this._startNewProfile(name, true);\n } else {\n this.addCrumb(name);\n }\n } else {\n this._startNewProfile(name);\n }\n }\n\n public startInteraction(interaction: string) {\n // Cancel any existing interaction recording\n if (this.#interactionInProgress) {\n writePerformanceLog('SRP', 'Cancelled interaction:', this.#interactionInProgress);\n this.#interactionInProgress = null;\n }\n\n this.#interactionInProgress = {\n interaction,\n startTs: performance.now(),\n };\n\n writePerformanceLog('SRP', 'Started interaction:', interaction);\n }\n\n public stopInteraction() {\n if (!this.#interactionInProgress) {\n return;\n }\n\n const endTs = performance.now();\n const interactionDuration = endTs - this.#interactionInProgress.startTs;\n\n // Capture network requests that occurred during the interaction\n const networkDuration = captureNetwork(this.#interactionInProgress.startTs, endTs);\n\n writePerformanceLog(\n 'SRP',\n `[INTERACTION] Complete: ${interactionDuration.toFixed(1)}ms total | ${networkDuration.toFixed(1)}ms network`\n );\n\n if (this.#onInteractionComplete && this.#profileInProgress) {\n this.#onInteractionComplete({\n origin: this.#interactionInProgress.interaction,\n duration: interactionDuration,\n networkDuration,\n startTs: this.#interactionInProgress.startTs,\n endTs,\n });\n }\n\n // Create performance marks for browser dev tools\n performance.mark(`${this.#interactionInProgress.interaction}_start`, {\n startTime: this.#interactionInProgress.startTs,\n });\n performance.mark(`${this.#interactionInProgress.interaction}_end`, {\n startTime: endTs,\n });\n performance.measure(\n `Interaction_${this.#interactionInProgress.interaction}`,\n `${this.#interactionInProgress.interaction}_start`,\n `${this.#interactionInProgress.interaction}_end`\n );\n\n this.#interactionInProgress = null;\n }\n\n public getCurrentInteraction(): string | null {\n return this.#interactionInProgress?.interaction ?? null;\n }\n\n /**\n * Start new performance profile\n * @param name - Profile trigger (e.g., 'time_range_change')\n * @param force - True if canceling existing profile, false if starting clean\n */\n private _startNewProfile(name: string, force = false) {\n const profileType = force ? 'forced' : 'clean';\n writePerformanceLog('SRP', `[PROFILER] ${name} started (${profileType})`);\n this.#profileInProgress = { origin: name, crumbs: [] };\n this.#profileStartTs = performance.now();\n this.#longFramesCount = 0;\n this.#longFramesTotalTime = 0;\n\n this.#currentOperationId = generateOperationId('dashboard');\n getScenePerformanceTracker().notifyDashboardInteractionStart({\n operationId: this.#currentOperationId,\n interactionType: name,\n timestamp: this.#profileStartTs,\n metadata: this.metadata,\n });\n\n // Start long frame detection with callback\n this.#longFrameDetector.start((event: LongFrameEvent) => {\n // Only record long frames during active profiling\n if (!this.#profileInProgress || !this.#profileStartTs) {\n return;\n }\n\n // Only record frames that occur after profile started\n if (event.timestamp < this.#profileStartTs) {\n return;\n }\n\n this.#longFramesCount++;\n this.#longFramesTotalTime += event.duration;\n });\n }\n\n private recordProfileTail(measurementStartTime: number, profileStartTs: number) {\n this.#trailAnimationFrameId = requestAnimationFrame(() =>\n this.measureTrailingFrames(measurementStartTime, measurementStartTime, profileStartTs)\n );\n }\n\n private measureTrailingFrames = (measurementStartTs: number, lastFrameTime: number, profileStartTs: number) => {\n const currentFrameTime = performance.now();\n const frameLength = currentFrameTime - lastFrameTime;\n\n this.#recordedTrailingSpans.push(frameLength);\n\n if (currentFrameTime - measurementStartTs! < POST_STORM_WINDOW) {\n if (this.#profileInProgress) {\n this.#trailAnimationFrameId = requestAnimationFrame(() =>\n this.measureTrailingFrames(measurementStartTs, currentFrameTime, profileStartTs)\n );\n }\n } else {\n const slowFrames = processRecordedSpans(this.#recordedTrailingSpans);\n const slowFramesTime = slowFrames.reduce((acc, val) => acc + val, 0);\n\n writePerformanceLog(\n 'SRP',\n 'Profile tail recorded, slow frames duration:',\n slowFramesTime,\n slowFrames,\n this.#profileInProgress\n );\n\n this.#recordedTrailingSpans = [];\n\n const profileDuration = measurementStartTs - profileStartTs;\n\n const slowFrameSummary =\n slowFrames.length > 0\n ? `${slowFramesTime.toFixed(1)}ms slow frames[tail recording] (${slowFrames.length}) ⚠️`\n : `${slowFramesTime.toFixed(1)}ms slow frames[tail recording] (${slowFrames.length})`;\n\n const longFrameSummary =\n this.#longFramesCount > 0\n ? `${this.#longFramesTotalTime.toFixed(1)}ms long frames[LoAF] (${this.#longFramesCount}) ⚠️`\n : `${this.#longFramesTotalTime.toFixed(1)}ms long frames[LoAF] (${this.#longFramesCount})`;\n\n writePerformanceLog(\n 'SRP',\n `[PROFILER] Complete: ${(profileDuration + slowFramesTime).toFixed(\n 1\n )}ms total | ${slowFrameSummary} | ${longFrameSummary}`\n );\n this.#longFrameDetector.stop();\n\n this.#trailAnimationFrameId = null;\n\n const profileEndTs = profileStartTs + profileDuration + slowFramesTime;\n\n // Guard against race condition where profile might be cancelled during execution\n if (!this.#profileInProgress) {\n return;\n }\n\n const networkDuration = captureNetwork(profileStartTs, profileEndTs);\n\n if (this.#profileInProgress) {\n // Notify performance observers of dashboard interaction completion\n const dashboardData: DashboardInteractionCompleteData = {\n operationId: this.#currentOperationId || generateOperationId('dashboard-fallback'),\n interactionType: this.#profileInProgress.origin,\n timestamp: profileEndTs,\n duration: profileDuration + slowFramesTime,\n networkDuration: networkDuration,\n longFramesCount: this.#longFramesCount,\n longFramesTotalTime: this.#longFramesTotalTime,\n metadata: this.metadata,\n };\n\n const tracker = getScenePerformanceTracker();\n tracker.notifyDashboardInteractionComplete(dashboardData);\n\n this.#profileInProgress = null;\n this.#trailAnimationFrameId = null;\n }\n }\n };\n\n public tryCompletingProfile() {\n writePerformanceLog('SRP', 'Trying to complete profile', this.#profileInProgress);\n if (this.queryController?.runningQueriesCount() === 0 && this.#profileInProgress) {\n writePerformanceLog('SRP', 'All queries completed, stopping profile');\n this.recordProfileTail(performance.now(), this.#profileStartTs!);\n }\n }\n\n public isTailRecording() {\n return Boolean(this.#trailAnimationFrameId);\n }\n\n public cancelTailRecording() {\n if (this.#trailAnimationFrameId) {\n cancelAnimationFrame(this.#trailAnimationFrameId);\n this.#trailAnimationFrameId = null;\n writePerformanceLog('SRP', 'Cancelled recording frames, new profile started');\n }\n }\n\n public cancelProfile() {\n if (this.#profileInProgress) {\n writePerformanceLog('SRP', 'Cancelling profile', this.#profileInProgress);\n\n this.#profileInProgress = null;\n // Cancel any pending animation frame to prevent accessing null profileInProgress\n if (this.#trailAnimationFrameId) {\n cancelAnimationFrame(this.#trailAnimationFrameId);\n this.#trailAnimationFrameId = null;\n }\n // Stop long frame tracking\n this.#longFrameDetector.stop();\n writePerformanceLog('SRP', 'Stopped long frame detection - profile cancelled');\n // Reset recorded spans to ensure complete cleanup\n this.#recordedTrailingSpans = [];\n this.#longFramesCount = 0;\n this.#longFramesTotalTime = 0;\n }\n }\n\n public addCrumb(crumb: string) {\n if (this.#profileInProgress) {\n // Notify performance observers of milestone\n getScenePerformanceTracker().notifyDashboardInteractionMilestone({\n operationId: generateOperationId('dashboard-milestone'),\n interactionType: this.#profileInProgress.origin,\n timestamp: performance.now(),\n milestone: crumb,\n metadata: this.metadata,\n });\n this.#profileInProgress.crumbs.push(crumb);\n }\n }\n}\n\nexport function processRecordedSpans(spans: number[]) {\n // identify last span in spans that's bigger than default threshold\n for (let i = spans.length - 1; i >= 0; i--) {\n if (spans[i] > DEFAULT_LONG_FRAME_THRESHOLD) {\n return spans.slice(0, i + 1);\n }\n }\n return [spans[0]];\n}\n\nexport function captureNetwork(startTs: number, endTs: number) {\n const entries = performance.getEntriesByType('resource') as PerformanceResourceTiming[];\n performance.clearResourceTimings();\n // Only include network entries that both started AND ended within the time window\n const networkEntries = entries.filter(\n (entry) =>\n entry.startTime >= startTs &&\n entry.startTime <= endTs &&\n entry.responseEnd >= startTs &&\n entry.responseEnd <= endTs\n );\n for (const entry of networkEntries) {\n performance.measure('Network entry ' + entry.name, {\n start: entry.startTime,\n end: entry.responseEnd,\n });\n }\n\n return calculateNetworkTime(networkEntries);\n}\n\n// Will calculate total time spent on Network\nexport function calculateNetworkTime(requests: PerformanceResourceTiming[]): number {\n if (requests.length === 0) {\n return 0;\n }\n\n // Step 1: Sort the requests by startTs\n requests.sort((a, b) => a.startTime - b.startTime);\n\n // Step 2: Initialize variables\n let totalNetworkTime = 0;\n let currentStart = requests[0].startTime;\n let currentEnd = requests[0].responseEnd;\n\n // Step 3: Iterate through the sorted list and merge overlapping intervals\n for (let i = 1; i < requests.length; i++) {\n if (requests[i].startTime <= currentEnd) {\n // Overlapping intervals, merge them\n currentEnd = Math.max(currentEnd, requests[i].responseEnd);\n } else {\n // Non-overlapping interval, add the duration to total time\n totalNetworkTime += currentEnd - currentStart;\n\n // Update current interval\n currentStart = requests[i].startTime;\n currentEnd = requests[i].responseEnd;\n }\n }\n\n // Step 4: Add the last interval\n totalNetworkTime += currentEnd - currentStart;\n\n return totalNetworkTime;\n}\n"],"names":[],"mappings":"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"}
|
|
@@ -1,316 +0,0 @@
|
|
|
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
|
-
return (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
|
-
}
|
|
103
|
-
/**
|
|
104
|
-
* Track plugin loading with operation ID correlation
|
|
105
|
-
*/
|
|
106
|
-
onPluginLoadStart(pluginId) {
|
|
107
|
-
if (!this._panelKey) {
|
|
108
|
-
let panel;
|
|
109
|
-
try {
|
|
110
|
-
panel = sceneGraph.getAncestor(this, VizPanel);
|
|
111
|
-
} catch (error) {
|
|
112
|
-
return null;
|
|
113
|
-
}
|
|
114
|
-
if (panel && !this._panelKey && panel.state.key) {
|
|
115
|
-
this._panelKey = panel.state.key;
|
|
116
|
-
this._panelId = String(panel.getLegacyPanelId());
|
|
117
|
-
this._pluginId = pluginId;
|
|
118
|
-
}
|
|
119
|
-
}
|
|
120
|
-
if (!this._panelKey) {
|
|
121
|
-
return null;
|
|
122
|
-
}
|
|
123
|
-
if (!this._isTracking) {
|
|
124
|
-
this._startTracking();
|
|
125
|
-
}
|
|
126
|
-
this._loadPluginStartTime = performance.now();
|
|
127
|
-
const operationId = generateOperationId("pluginLoad");
|
|
128
|
-
getScenePerformanceTracker().notifyPanelOperationStart({
|
|
129
|
-
operationId,
|
|
130
|
-
panelId: this._panelId,
|
|
131
|
-
panelKey: this._panelKey,
|
|
132
|
-
pluginId: this._pluginId,
|
|
133
|
-
operation: "plugin-load",
|
|
134
|
-
timestamp: this._loadPluginStartTime,
|
|
135
|
-
metadata: {
|
|
136
|
-
pluginId
|
|
137
|
-
}
|
|
138
|
-
});
|
|
139
|
-
return (plugin, fromCache = false) => {
|
|
140
|
-
if (!this._panelKey || !this._loadPluginStartTime) {
|
|
141
|
-
return;
|
|
142
|
-
}
|
|
143
|
-
const duration = performance.now() - this._loadPluginStartTime;
|
|
144
|
-
getScenePerformanceTracker().notifyPanelOperationComplete({
|
|
145
|
-
operationId,
|
|
146
|
-
panelId: this._panelId,
|
|
147
|
-
panelKey: this._panelKey,
|
|
148
|
-
pluginId: this._pluginId,
|
|
149
|
-
operation: "plugin-load",
|
|
150
|
-
timestamp: performance.now(),
|
|
151
|
-
duration,
|
|
152
|
-
metadata: {
|
|
153
|
-
pluginId: this._pluginId,
|
|
154
|
-
fromCache,
|
|
155
|
-
pluginLoadTime: duration
|
|
156
|
-
}
|
|
157
|
-
});
|
|
158
|
-
this._loadPluginStartTime = void 0;
|
|
159
|
-
};
|
|
160
|
-
}
|
|
161
|
-
/**
|
|
162
|
-
* Track field config processing with operation ID correlation
|
|
163
|
-
*/
|
|
164
|
-
onFieldConfigStart(timestamp) {
|
|
165
|
-
if (!this._panelKey) {
|
|
166
|
-
return null;
|
|
167
|
-
}
|
|
168
|
-
this._applyFieldConfigStartTime = timestamp;
|
|
169
|
-
const operationId = generateOperationId("fieldConfig");
|
|
170
|
-
getScenePerformanceTracker().notifyPanelOperationStart({
|
|
171
|
-
operationId,
|
|
172
|
-
panelId: this._panelId,
|
|
173
|
-
panelKey: this._panelKey,
|
|
174
|
-
pluginId: this._pluginId,
|
|
175
|
-
operation: "fieldConfig",
|
|
176
|
-
timestamp: this._applyFieldConfigStartTime,
|
|
177
|
-
metadata: {}
|
|
178
|
-
});
|
|
179
|
-
return (endTimestamp, dataPointsCount, seriesCount) => {
|
|
180
|
-
if (!this._panelKey || !this._applyFieldConfigStartTime) {
|
|
181
|
-
return;
|
|
182
|
-
}
|
|
183
|
-
const duration = endTimestamp - this._applyFieldConfigStartTime;
|
|
184
|
-
getScenePerformanceTracker().notifyPanelOperationComplete({
|
|
185
|
-
operationId,
|
|
186
|
-
panelId: this._panelId,
|
|
187
|
-
panelKey: this._panelKey,
|
|
188
|
-
pluginId: this._pluginId,
|
|
189
|
-
operation: "fieldConfig",
|
|
190
|
-
timestamp: endTimestamp,
|
|
191
|
-
duration,
|
|
192
|
-
metadata: {}
|
|
193
|
-
});
|
|
194
|
-
this._applyFieldConfigStartTime = void 0;
|
|
195
|
-
};
|
|
196
|
-
}
|
|
197
|
-
/**
|
|
198
|
-
* Get panel info for logging - truncates long titles for readability
|
|
199
|
-
*/
|
|
200
|
-
_getPanelInfo() {
|
|
201
|
-
let panel;
|
|
202
|
-
try {
|
|
203
|
-
panel = sceneGraph.getAncestor(this, VizPanel);
|
|
204
|
-
} catch (error) {
|
|
205
|
-
}
|
|
206
|
-
let panelTitle = (panel == null ? void 0 : panel.state.title) || this._panelKey || "No-key panel";
|
|
207
|
-
if (panelTitle.length > 30) {
|
|
208
|
-
panelTitle = panelTitle.substring(0, 27) + "...";
|
|
209
|
-
}
|
|
210
|
-
return `VizPanelRenderProfiler [${panelTitle}]`;
|
|
211
|
-
}
|
|
212
|
-
/**
|
|
213
|
-
* Track simple render timing with operation ID correlation
|
|
214
|
-
*/
|
|
215
|
-
onSimpleRenderStart(timestamp) {
|
|
216
|
-
if (!this._panelKey) {
|
|
217
|
-
return void 0;
|
|
218
|
-
}
|
|
219
|
-
const operationId = generateOperationId("render");
|
|
220
|
-
getScenePerformanceTracker().notifyPanelOperationStart({
|
|
221
|
-
operationId,
|
|
222
|
-
panelId: this._panelId || "unknown",
|
|
223
|
-
panelKey: this._panelKey,
|
|
224
|
-
pluginId: this._pluginId || "unknown",
|
|
225
|
-
pluginVersion: this._pluginVersion,
|
|
226
|
-
operation: "render",
|
|
227
|
-
timestamp,
|
|
228
|
-
metadata: {}
|
|
229
|
-
});
|
|
230
|
-
return (endTimestamp, duration) => {
|
|
231
|
-
if (!this._panelKey) {
|
|
232
|
-
return;
|
|
233
|
-
}
|
|
234
|
-
getScenePerformanceTracker().notifyPanelOperationComplete({
|
|
235
|
-
operationId,
|
|
236
|
-
panelId: this._panelId || "unknown",
|
|
237
|
-
panelKey: this._panelKey,
|
|
238
|
-
pluginId: this._pluginId || "unknown",
|
|
239
|
-
pluginVersion: this._pluginVersion,
|
|
240
|
-
operation: "render",
|
|
241
|
-
duration,
|
|
242
|
-
timestamp: endTimestamp,
|
|
243
|
-
metadata: {}
|
|
244
|
-
});
|
|
245
|
-
};
|
|
246
|
-
}
|
|
247
|
-
/** Handle plugin changes */
|
|
248
|
-
_onPluginChange(panel, newPluginId) {
|
|
249
|
-
var _a, _b;
|
|
250
|
-
this._pluginId = newPluginId;
|
|
251
|
-
const plugin = panel.getPlugin();
|
|
252
|
-
this._pluginVersion = (_b = (_a = plugin == null ? void 0 : plugin.meta) == null ? void 0 : _a.info) == null ? void 0 : _b.version;
|
|
253
|
-
writeSceneLog(this._getPanelInfo(), `Plugin changed to ${newPluginId}`);
|
|
254
|
-
}
|
|
255
|
-
/** Start tracking this panel */
|
|
256
|
-
_startTracking() {
|
|
257
|
-
if (!this._panelKey || !this._pluginId || this._isTracking) {
|
|
258
|
-
return;
|
|
259
|
-
}
|
|
260
|
-
this._isTracking = true;
|
|
261
|
-
}
|
|
262
|
-
/** Cleanup when behavior is deactivated */
|
|
263
|
-
_cleanup() {
|
|
264
|
-
this._activeQueries.clear();
|
|
265
|
-
this._isTracking = false;
|
|
266
|
-
writeSceneLog(this._getPanelInfo(), "Cleaned up");
|
|
267
|
-
}
|
|
268
|
-
/**
|
|
269
|
-
* Track data transformation with operation ID correlation
|
|
270
|
-
*/
|
|
271
|
-
onDataTransformStart(timestamp, transformationId, metrics) {
|
|
272
|
-
if (!this._panelKey) {
|
|
273
|
-
return null;
|
|
274
|
-
}
|
|
275
|
-
const operationId = generateOperationId("transform");
|
|
276
|
-
getScenePerformanceTracker().notifyPanelOperationStart({
|
|
277
|
-
operationId,
|
|
278
|
-
panelId: this._panelId,
|
|
279
|
-
panelKey: this._panelKey,
|
|
280
|
-
pluginId: this._pluginId,
|
|
281
|
-
operation: "transform",
|
|
282
|
-
timestamp,
|
|
283
|
-
metadata: {
|
|
284
|
-
transformationId,
|
|
285
|
-
transformationCount: metrics.transformationCount,
|
|
286
|
-
seriesTransformationCount: metrics.seriesTransformationCount,
|
|
287
|
-
annotationTransformationCount: metrics.annotationTransformationCount
|
|
288
|
-
}
|
|
289
|
-
});
|
|
290
|
-
return (endTimestamp, duration, success, result) => {
|
|
291
|
-
if (!this._panelKey) {
|
|
292
|
-
return;
|
|
293
|
-
}
|
|
294
|
-
getScenePerformanceTracker().notifyPanelOperationComplete({
|
|
295
|
-
operationId,
|
|
296
|
-
panelId: this._panelId,
|
|
297
|
-
panelKey: this._panelKey,
|
|
298
|
-
pluginId: this._pluginId,
|
|
299
|
-
operation: "transform",
|
|
300
|
-
timestamp: endTimestamp,
|
|
301
|
-
duration,
|
|
302
|
-
metadata: {
|
|
303
|
-
transformationId,
|
|
304
|
-
transformationCount: metrics.transformationCount,
|
|
305
|
-
seriesTransformationCount: metrics.seriesTransformationCount,
|
|
306
|
-
annotationTransformationCount: metrics.annotationTransformationCount,
|
|
307
|
-
success,
|
|
308
|
-
error: (result == null ? void 0 : result.error) || (!success ? "Transform operation failed" : void 0)
|
|
309
|
-
}
|
|
310
|
-
});
|
|
311
|
-
};
|
|
312
|
-
}
|
|
313
|
-
}
|
|
314
|
-
|
|
315
|
-
export { VizPanelRenderProfiler };
|
|
316
|
-
//# sourceMappingURL=VizPanelRenderProfiler.js.map
|