@grafana/scenes 6.40.0--canary.1280.18680778214.0 → 6.40.0--canary.1265.18710211578.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/behaviors/SceneInteractionTracker.js.map +1 -1
- package/dist/esm/behaviors/SceneQueryController.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 +0 -2
- package/dist/esm/components/SceneTimeRangeCompare.js.map +1 -1
- package/dist/esm/components/VizPanel/VizPanel.js +26 -0
- package/dist/esm/components/VizPanel/VizPanel.js.map +1 -1
- package/dist/esm/components/VizPanel/VizPanelRenderer.js +18 -1
- 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 +5 -3
- package/dist/esm/index.js.map +1 -1
- package/dist/esm/{behaviors → performance}/LongFrameDetector.js +11 -11
- package/dist/esm/performance/LongFrameDetector.js.map +1 -0
- package/dist/esm/performance/PanelProfilingManager.js +65 -0
- package/dist/esm/performance/PanelProfilingManager.js.map +1 -0
- package/dist/esm/performance/ScenePerformanceTracker.js +78 -0
- package/dist/esm/performance/ScenePerformanceTracker.js.map +1 -0
- package/dist/esm/{behaviors → performance}/SceneRenderProfiler.js +87 -132
- package/dist/esm/performance/SceneRenderProfiler.js.map +1 -0
- package/dist/esm/performance/VizPanelRenderProfiler.js +316 -0
- package/dist/esm/performance/VizPanelRenderProfiler.js.map +1 -0
- package/dist/esm/performance/index.js +3 -0
- package/dist/esm/performance/index.js.map +1 -0
- package/dist/esm/performance/interactionConstants.js +13 -0
- package/dist/esm/performance/interactionConstants.js.map +1 -0
- package/dist/esm/querying/SceneDataTransformer.js +57 -0
- package/dist/esm/querying/SceneDataTransformer.js.map +1 -1
- package/dist/esm/querying/SceneQueryRunner.js +11 -6
- package/dist/esm/querying/SceneQueryRunner.js.map +1 -1
- package/dist/esm/querying/registerQueryWithController.js +39 -2
- package/dist/esm/querying/registerQueryWithController.js.map +1 -1
- package/dist/esm/services/UniqueUrlKeyMapper.js +0 -1
- package/dist/esm/services/UniqueUrlKeyMapper.js.map +1 -1
- package/dist/esm/services/UrlSyncManager.js +0 -1
- package/dist/esm/services/UrlSyncManager.js.map +1 -1
- package/dist/esm/utils/findPanelProfiler.js +18 -0
- package/dist/esm/utils/findPanelProfiler.js.map +1 -0
- package/dist/esm/utils/writePerformanceLog.js +12 -0
- package/dist/esm/utils/writePerformanceLog.js.map +1 -0
- package/dist/esm/utils/writeSceneLog.js +1 -10
- 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 +324 -95
- package/dist/index.js +6691 -6130
- package/dist/index.js.map +1 -1
- package/package.json +2 -2
- package/dist/esm/behaviors/LongFrameDetector.js.map +0 -1
- package/dist/esm/behaviors/SceneRenderProfiler.js.map +0 -1
|
@@ -0,0 +1,316 @@
|
|
|
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
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"VizPanelRenderProfiler.js","sources":["../../../src/performance/VizPanelRenderProfiler.ts"],"sourcesContent":["import { SceneObjectBase } from '../core/SceneObjectBase';\nimport { SceneObjectState } from '../core/types';\nimport { VizPanel } from '../components/VizPanel/VizPanel';\nimport { writeSceneLog } from '../utils/writeSceneLog';\nimport { sceneGraph } from '../core/sceneGraph';\nimport { SceneQueryControllerEntry } from '../behaviors/types';\nimport { QueryProfilerLike } from '../querying/registerQueryWithController';\nimport {\n QueryCompletionCallback,\n PluginLoadCompletionCallback,\n FieldConfigCompletionCallback,\n RenderCompletionCallback,\n DataTransformCompletionCallback,\n} from './types';\nimport { getScenePerformanceTracker, generateOperationId } from './ScenePerformanceTracker';\n\nexport interface VizPanelRenderProfilerState extends SceneObjectState {}\n\n/**\n * Tracks performance metrics for individual VizPanel instances using observer pattern.\n *\n * Performance events are sent to ScenePerformanceTracker observers, which are consumed\n * by Grafana's ScenePerformanceLogger and DashboardAnalyticsAggregator.\n */\n\nexport class VizPanelRenderProfiler extends SceneObjectBase<VizPanelRenderProfilerState> implements QueryProfilerLike {\n private _panelKey?: string;\n private _panelId?: string;\n private _pluginId?: string;\n private _pluginVersion?: string;\n private _isTracking = false;\n private _loadPluginStartTime?: number;\n private _applyFieldConfigStartTime?: number;\n private _activeQueries = new Map<string, { entry: SceneQueryControllerEntry; startTime: number }>();\n\n public constructor(state: Partial<VizPanelRenderProfilerState> = {}) {\n super({\n ...state,\n });\n\n this.addActivationHandler(() => {\n return this._onActivate();\n });\n }\n\n private _onActivate() {\n let panel: VizPanel | undefined;\n\n try {\n panel = sceneGraph.getAncestor(this, VizPanel);\n } catch (error) {\n writeSceneLog('VizPanelRenderProfiler', 'Failed to find VizPanel ancestor', error);\n return;\n }\n\n if (!panel) {\n writeSceneLog('VizPanelRenderProfiler', 'Not attached to a VizPanel');\n return;\n }\n\n if (!panel.state.key) {\n writeSceneLog('VizPanelRenderProfiler', 'Panel has no key, skipping tracking');\n return;\n }\n\n this._panelKey = panel.state.key;\n this._panelId = String(panel.getLegacyPanelId());\n this._pluginId = panel.state.pluginId;\n const plugin = panel.getPlugin();\n this._pluginVersion = plugin?.meta?.info?.version;\n\n this._subs.add(\n panel.subscribeToState((newState, prevState) => {\n this._handlePanelStateChange(panel, newState, prevState);\n })\n );\n\n return () => {\n this._cleanup();\n };\n }\n\n private _handlePanelStateChange(panel: VizPanel, newState: any, prevState: any) {\n if (newState.pluginId !== prevState.pluginId) {\n this._onPluginChange(panel, newState.pluginId);\n }\n }\n\n /**\n * Track query execution with operation ID correlation\n */\n public onQueryStarted(\n timestamp: number,\n entry: SceneQueryControllerEntry,\n queryId: string\n ): QueryCompletionCallback | null {\n if (!this._panelKey) {\n return null;\n }\n\n this._activeQueries.set(queryId, { entry, startTime: timestamp });\n\n const operationId = generateOperationId('query');\n\n // ✅ Use panel operation tracking for panel queries\n getScenePerformanceTracker().notifyPanelOperationStart({\n operationId,\n panelId: this._panelId!,\n panelKey: this._panelKey,\n pluginId: this._pluginId!,\n pluginVersion: this._pluginVersion,\n operation: 'query',\n timestamp,\n metadata: {\n queryId: queryId,\n queryType: entry.type,\n },\n });\n\n // Return end callback with captured operationId and query context\n return (endTimestamp: number, error?: any) => {\n if (!this._panelKey) {\n return;\n }\n\n const queryInfo = this._activeQueries.get(queryId);\n if (!queryInfo) {\n return;\n }\n\n const duration = endTimestamp - queryInfo.startTime;\n this._activeQueries.delete(queryId);\n\n getScenePerformanceTracker().notifyPanelOperationComplete({\n operationId,\n panelId: this._panelId!,\n panelKey: this._panelKey,\n pluginId: this._pluginId!,\n pluginVersion: this._pluginVersion,\n operation: 'query',\n timestamp: endTimestamp,\n duration: duration,\n metadata: {\n queryId: queryId,\n queryType: entry.type,\n },\n error: error ? error?.message || String(error) || 'Unknown error' : undefined,\n });\n };\n }\n\n /**\n * Track plugin loading with operation ID correlation\n */\n public onPluginLoadStart(pluginId: string): PluginLoadCompletionCallback | null {\n // Initialize early since plugin loading happens before _onActivate\n if (!this._panelKey) {\n let panel: VizPanel | undefined;\n\n try {\n panel = sceneGraph.getAncestor(this, VizPanel);\n } catch (error) {\n return null;\n }\n\n if (panel && !this._panelKey && panel.state.key) {\n this._panelKey = panel.state.key;\n this._panelId = String(panel.getLegacyPanelId());\n this._pluginId = pluginId;\n }\n }\n\n if (!this._panelKey) {\n return null;\n }\n\n if (!this._isTracking) {\n this._startTracking();\n }\n\n this._loadPluginStartTime = performance.now();\n\n const operationId = generateOperationId('pluginLoad');\n getScenePerformanceTracker().notifyPanelOperationStart({\n operationId,\n panelId: this._panelId!,\n panelKey: this._panelKey,\n pluginId: this._pluginId!,\n operation: 'plugin-load',\n timestamp: this._loadPluginStartTime,\n metadata: {\n pluginId,\n },\n });\n\n // Return end callback with captured operationId and panel context\n return (plugin: any, fromCache = false) => {\n if (!this._panelKey || !this._loadPluginStartTime) {\n return;\n }\n\n const duration = performance.now() - this._loadPluginStartTime;\n\n getScenePerformanceTracker().notifyPanelOperationComplete({\n operationId,\n panelId: this._panelId!,\n panelKey: this._panelKey,\n pluginId: this._pluginId!,\n operation: 'plugin-load',\n timestamp: performance.now(),\n duration,\n metadata: {\n pluginId: this._pluginId!,\n fromCache,\n pluginLoadTime: duration,\n },\n });\n\n this._loadPluginStartTime = undefined;\n };\n }\n\n /**\n * Track field config processing with operation ID correlation\n */\n public onFieldConfigStart(timestamp: number): FieldConfigCompletionCallback | null {\n if (!this._panelKey) {\n return null;\n }\n\n this._applyFieldConfigStartTime = timestamp;\n\n const operationId = generateOperationId('fieldConfig');\n getScenePerformanceTracker().notifyPanelOperationStart({\n operationId,\n panelId: this._panelId!,\n panelKey: this._panelKey,\n pluginId: this._pluginId!,\n operation: 'fieldConfig',\n timestamp: this._applyFieldConfigStartTime,\n metadata: {},\n });\n\n // Return end callback with captured operationId and panel context\n return (endTimestamp: number, dataPointsCount?: number, seriesCount?: number) => {\n if (!this._panelKey || !this._applyFieldConfigStartTime) {\n return;\n }\n\n const duration = endTimestamp - this._applyFieldConfigStartTime;\n\n getScenePerformanceTracker().notifyPanelOperationComplete({\n operationId,\n panelId: this._panelId!,\n panelKey: this._panelKey,\n pluginId: this._pluginId!,\n operation: 'fieldConfig',\n timestamp: endTimestamp,\n duration,\n metadata: {},\n });\n\n this._applyFieldConfigStartTime = undefined;\n };\n }\n\n /**\n * Get panel info for logging - truncates long titles for readability\n */\n private _getPanelInfo(): string {\n let panel: VizPanel | undefined;\n\n try {\n panel = sceneGraph.getAncestor(this, VizPanel);\n } catch (error) {\n // If we can't find the panel, use fallback info\n }\n\n let panelTitle = panel?.state.title || this._panelKey || 'No-key panel';\n\n if (panelTitle.length > 30) {\n panelTitle = panelTitle.substring(0, 27) + '...';\n }\n\n return `VizPanelRenderProfiler [${panelTitle}]`;\n }\n\n /**\n * Track simple render timing with operation ID correlation\n */\n public onSimpleRenderStart(timestamp: number): RenderCompletionCallback | undefined {\n if (!this._panelKey) {\n return undefined;\n }\n\n const operationId = generateOperationId('render');\n getScenePerformanceTracker().notifyPanelOperationStart({\n operationId,\n panelId: this._panelId || 'unknown',\n panelKey: this._panelKey,\n pluginId: this._pluginId || 'unknown',\n pluginVersion: this._pluginVersion,\n operation: 'render',\n timestamp,\n metadata: {},\n });\n\n // Return end callback with captured operationId and panel context\n return (endTimestamp: number, duration: number) => {\n if (!this._panelKey) {\n return;\n }\n\n getScenePerformanceTracker().notifyPanelOperationComplete({\n operationId,\n panelId: this._panelId || 'unknown',\n panelKey: this._panelKey,\n pluginId: this._pluginId || 'unknown',\n pluginVersion: this._pluginVersion,\n operation: 'render',\n duration,\n timestamp: endTimestamp,\n metadata: {},\n });\n };\n }\n\n /** Handle plugin changes */\n private _onPluginChange(panel: VizPanel, newPluginId: string) {\n this._pluginId = newPluginId;\n const plugin = panel.getPlugin();\n this._pluginVersion = plugin?.meta?.info?.version;\n\n writeSceneLog(this._getPanelInfo(), `Plugin changed to ${newPluginId}`);\n }\n\n /** Start tracking this panel */\n private _startTracking() {\n if (!this._panelKey || !this._pluginId || this._isTracking) {\n return;\n }\n\n this._isTracking = true;\n }\n\n /** Cleanup when behavior is deactivated */\n private _cleanup() {\n this._activeQueries.clear();\n this._isTracking = false;\n writeSceneLog(this._getPanelInfo(), 'Cleaned up');\n }\n\n /**\n * Track data transformation with operation ID correlation\n */\n public onDataTransformStart(\n timestamp: number,\n transformationId: string,\n metrics: {\n transformationCount: number;\n seriesTransformationCount: number;\n annotationTransformationCount: number;\n }\n ): DataTransformCompletionCallback | null {\n if (!this._panelKey) {\n return null;\n }\n\n const operationId = generateOperationId('transform');\n getScenePerformanceTracker().notifyPanelOperationStart({\n operationId,\n panelId: this._panelId!,\n panelKey: this._panelKey,\n pluginId: this._pluginId!,\n operation: 'transform',\n timestamp,\n metadata: {\n transformationId,\n transformationCount: metrics.transformationCount,\n seriesTransformationCount: metrics.seriesTransformationCount,\n annotationTransformationCount: metrics.annotationTransformationCount,\n },\n });\n\n // Return end callback with captured operationId and panel context\n return (\n endTimestamp: number,\n duration: number,\n success: boolean,\n result?: {\n outputSeriesCount?: number;\n outputAnnotationsCount?: number;\n error?: string;\n }\n ) => {\n if (!this._panelKey) {\n return;\n }\n\n getScenePerformanceTracker().notifyPanelOperationComplete({\n operationId,\n panelId: this._panelId!,\n panelKey: this._panelKey,\n pluginId: this._pluginId!,\n operation: 'transform',\n timestamp: endTimestamp,\n duration,\n metadata: {\n transformationId,\n transformationCount: metrics.transformationCount,\n seriesTransformationCount: metrics.seriesTransformationCount,\n annotationTransformationCount: metrics.annotationTransformationCount,\n success,\n error: result?.error || (!success ? 'Transform operation failed' : undefined),\n },\n });\n };\n }\n}\n"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sources":[],"sourcesContent":[],"names":[],"mappings":";"}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
const REFRESH_INTERACTION = "refresh";
|
|
2
|
+
const TIME_RANGE_CHANGE_INTERACTION = "time_range_change";
|
|
3
|
+
const FILTER_REMOVED_INTERACTION = "filter_removed";
|
|
4
|
+
const FILTER_CHANGED_INTERACTION = "filter_changed";
|
|
5
|
+
const FILTER_RESTORED_INTERACTION = "filter_restored";
|
|
6
|
+
const VARIABLE_VALUE_CHANGED_INTERACTION = "variable_value_changed";
|
|
7
|
+
const SCOPES_CHANGED_INTERACTION = "scopes_changed";
|
|
8
|
+
const ADHOC_KEYS_DROPDOWN_INTERACTION = "adhoc_keys_dropdown";
|
|
9
|
+
const ADHOC_VALUES_DROPDOWN_INTERACTION = "adhoc_values_dropdown";
|
|
10
|
+
const GROUPBY_DIMENSIONS_INTERACTION = "groupby_dimensions";
|
|
11
|
+
|
|
12
|
+
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, TIME_RANGE_CHANGE_INTERACTION, VARIABLE_VALUE_CHANGED_INTERACTION };
|
|
13
|
+
//# sourceMappingURL=interactionConstants.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"interactionConstants.js","sources":["../../../src/performance/interactionConstants.ts"],"sourcesContent":["/**\n * Constants for different types of dashboard interactions tracked by SceneRenderProfiler\n */\n\nexport const REFRESH_INTERACTION = 'refresh';\nexport const TIME_RANGE_CHANGE_INTERACTION = 'time_range_change';\nexport const FILTER_ADDED_INTERACTION = 'filter_added';\nexport const FILTER_REMOVED_INTERACTION = 'filter_removed';\nexport const FILTER_CHANGED_INTERACTION = 'filter_changed';\nexport const FILTER_RESTORED_INTERACTION = 'filter_restored';\nexport const VARIABLE_VALUE_CHANGED_INTERACTION = 'variable_value_changed';\nexport const SCOPES_CHANGED_INTERACTION = 'scopes_changed';\nexport const ADHOC_KEYS_DROPDOWN_INTERACTION = 'adhoc_keys_dropdown';\nexport const ADHOC_VALUES_DROPDOWN_INTERACTION = 'adhoc_values_dropdown';\nexport const GROUPBY_DIMENSIONS_INTERACTION = 'groupby_dimensions';\n"],"names":[],"mappings":"AAIO,MAAM,mBAAsB,GAAA;AAC5B,MAAM,6BAAgC,GAAA;AAEtC,MAAM,0BAA6B,GAAA;AACnC,MAAM,0BAA6B,GAAA;AACnC,MAAM,2BAA8B,GAAA;AACpC,MAAM,kCAAqC,GAAA;AAC3C,MAAM,0BAA6B,GAAA;AACnC,MAAM,+BAAkC,GAAA;AACxC,MAAM,iCAAoC,GAAA;AAC1C,MAAM,8BAAiC,GAAA;;;;"}
|
|
@@ -5,6 +5,7 @@ import { sceneGraph } from '../core/sceneGraph/index.js';
|
|
|
5
5
|
import { SceneObjectBase } from '../core/SceneObjectBase.js';
|
|
6
6
|
import { VariableDependencyConfig } from '../variables/VariableDependencyConfig.js';
|
|
7
7
|
import { SceneDataLayerSet } from './SceneDataLayerSet.js';
|
|
8
|
+
import { findPanelProfiler } from '../utils/findPanelProfiler.js';
|
|
8
9
|
|
|
9
10
|
class SceneDataTransformer extends SceneObjectBase {
|
|
10
11
|
constructor(state) {
|
|
@@ -61,6 +62,29 @@ class SceneDataTransformer extends SceneObjectBase {
|
|
|
61
62
|
reprocessTransformations() {
|
|
62
63
|
this.transform(this.getSourceData().state.data, true);
|
|
63
64
|
}
|
|
65
|
+
/**
|
|
66
|
+
* S3.1: Calculate transformation complexity metrics
|
|
67
|
+
*/
|
|
68
|
+
_calculateTransformationMetrics(data, transformations) {
|
|
69
|
+
const transformationCount = transformations.length;
|
|
70
|
+
const seriesTransformationCount = transformations.filter((transformation) => {
|
|
71
|
+
if ("options" in transformation || "topic" in transformation) {
|
|
72
|
+
return transformation.topic == null || transformation.topic === DataTopic.Series;
|
|
73
|
+
}
|
|
74
|
+
return true;
|
|
75
|
+
}).length;
|
|
76
|
+
const annotationTransformationCount = transformations.filter((transformation) => {
|
|
77
|
+
if ("options" in transformation || "topic" in transformation) {
|
|
78
|
+
return transformation.topic === DataTopic.Annotations;
|
|
79
|
+
}
|
|
80
|
+
return false;
|
|
81
|
+
}).length;
|
|
82
|
+
return {
|
|
83
|
+
transformationCount,
|
|
84
|
+
seriesTransformationCount,
|
|
85
|
+
annotationTransformationCount
|
|
86
|
+
};
|
|
87
|
+
}
|
|
64
88
|
cancelQuery() {
|
|
65
89
|
var _a, _b;
|
|
66
90
|
(_b = (_a = this.getSourceData()).cancelQuery) == null ? void 0 : _b.call(_a);
|
|
@@ -101,6 +125,11 @@ class SceneDataTransformer extends SceneObjectBase {
|
|
|
101
125
|
}
|
|
102
126
|
transform(data, force = false) {
|
|
103
127
|
var _a;
|
|
128
|
+
const timestamp = performance.now();
|
|
129
|
+
const profiler = findPanelProfiler(this);
|
|
130
|
+
const transformStartTime = performance.now();
|
|
131
|
+
let transformationId;
|
|
132
|
+
let endTransformCallback = null;
|
|
104
133
|
if (this.state.transformations.length === 0 || !data) {
|
|
105
134
|
this._prevDataFromSource = data;
|
|
106
135
|
this.setState({ data });
|
|
@@ -112,6 +141,18 @@ class SceneDataTransformer extends SceneObjectBase {
|
|
|
112
141
|
if (!force && this.haveAlreadyTransformedData(data)) {
|
|
113
142
|
return;
|
|
114
143
|
}
|
|
144
|
+
if (profiler) {
|
|
145
|
+
const transformationTypes = this.state.transformations.map((t) => {
|
|
146
|
+
if ("id" in t) {
|
|
147
|
+
return t.id;
|
|
148
|
+
} else {
|
|
149
|
+
return "customTransformation";
|
|
150
|
+
}
|
|
151
|
+
}).join("+");
|
|
152
|
+
transformationId = transformationTypes || "no-transforms";
|
|
153
|
+
const metrics = this._calculateTransformationMetrics(data, this.state.transformations);
|
|
154
|
+
endTransformCallback = profiler.onDataTransformStart(timestamp, transformationId, metrics);
|
|
155
|
+
}
|
|
115
156
|
const interpolatedTransformations = this._interpolateVariablesInTransformationConfigs(data);
|
|
116
157
|
const seriesTransformations = this._filterAndPrepareTransformationsByTopic(
|
|
117
158
|
interpolatedTransformations,
|
|
@@ -160,6 +201,13 @@ class SceneDataTransformer extends SceneObjectBase {
|
|
|
160
201
|
}),
|
|
161
202
|
catchError((err) => {
|
|
162
203
|
var _a2;
|
|
204
|
+
const timestamp2 = performance.now();
|
|
205
|
+
const duration = timestamp2 - transformStartTime;
|
|
206
|
+
if (endTransformCallback) {
|
|
207
|
+
endTransformCallback(timestamp2, duration, false, {
|
|
208
|
+
error: err.message || err
|
|
209
|
+
});
|
|
210
|
+
}
|
|
163
211
|
console.error("Error transforming data: ", err);
|
|
164
212
|
const sourceErr = ((_a2 = this.getSourceData().state.data) == null ? void 0 : _a2.errors) || [];
|
|
165
213
|
const transformationError = toDataQueryError(err);
|
|
@@ -173,6 +221,15 @@ class SceneDataTransformer extends SceneObjectBase {
|
|
|
173
221
|
return of(result);
|
|
174
222
|
})
|
|
175
223
|
).subscribe((transformedData) => {
|
|
224
|
+
var _a2;
|
|
225
|
+
const timestamp2 = performance.now();
|
|
226
|
+
const duration = timestamp2 - transformStartTime;
|
|
227
|
+
if (endTransformCallback) {
|
|
228
|
+
endTransformCallback(timestamp2, duration, true, {
|
|
229
|
+
outputSeriesCount: transformedData.series.length,
|
|
230
|
+
outputAnnotationsCount: ((_a2 = transformedData.annotations) == null ? void 0 : _a2.length) || 0
|
|
231
|
+
});
|
|
232
|
+
}
|
|
176
233
|
this.setState({ data: transformedData });
|
|
177
234
|
this._results.next({ origin: this, data: transformedData });
|
|
178
235
|
this._prevDataFromSource = data;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"SceneDataTransformer.js","sources":["../../../src/querying/SceneDataTransformer.ts"],"sourcesContent":["import {\n CustomTransformOperator,\n DataFrame,\n DataTopic,\n DataTransformerConfig,\n LoadingState,\n PanelData,\n ScopedVars,\n transformDataFrame,\n} from '@grafana/data';\nimport { toDataQueryError } from '@grafana/runtime';\nimport { catchError, forkJoin, map, of, ReplaySubject, Unsubscribable } from 'rxjs';\nimport { sceneGraph } from '../core/sceneGraph';\nimport { SceneObjectBase } from '../core/SceneObjectBase';\nimport { CustomTransformerDefinition, SceneDataProvider, SceneDataProviderResult, SceneDataState } from '../core/types';\nimport { VariableDependencyConfig } from '../variables/VariableDependencyConfig';\nimport { SceneDataLayerSet } from './SceneDataLayerSet';\n\nexport interface SceneDataTransformerState extends SceneDataState {\n /**\n * Array of standard transformation configs and custom transform operators\n */\n transformations: Array<DataTransformerConfig | CustomTransformerDefinition>;\n}\n\n/**\n * You can use this as a $data object. It can either transform an inner $data DataProvider or if that is not set it will\n * subscribe to a DataProvider higher up in the scene graph and transform its data.\n *\n * The transformations array supports custom (runtime defined) transformation as well as declarative core transformations.\n * You can manually re-process the transformations by calling reprocessTransformations(). This is useful if you have\n * transformations that depend on other scene object states.\n */\nexport class SceneDataTransformer extends SceneObjectBase<SceneDataTransformerState> implements SceneDataProvider {\n private _transformSub?: Unsubscribable;\n private _results = new ReplaySubject<SceneDataProviderResult>(1);\n private _prevDataFromSource?: PanelData;\n\n /**\n * Scan transformations for variable usage and re-process transforms when a variable values change\n */\n protected _variableDependency: VariableDependencyConfig<SceneDataTransformerState> = new VariableDependencyConfig(\n this,\n {\n statePaths: ['transformations'],\n onReferencedVariableValueChanged: () => this.reprocessTransformations(),\n }\n );\n\n public constructor(state: SceneDataTransformerState) {\n super(state);\n\n this.addActivationHandler(() => this.activationHandler());\n }\n\n private activationHandler() {\n const sourceData = this.getSourceData();\n\n this._subs.add(sourceData.subscribeToState((state) => this.transform(state.data)));\n\n if (sourceData.state.data) {\n this.transform(sourceData.state.data);\n }\n\n return () => {\n if (this._transformSub) {\n this._transformSub.unsubscribe();\n }\n };\n }\n\n private getSourceData(): SceneDataProvider {\n if (this.state.$data) {\n if (this.state.$data instanceof SceneDataLayerSet) {\n throw new Error('SceneDataLayerSet can not be used as data provider for SceneDataTransformer.');\n }\n return this.state.$data;\n }\n\n if (!this.parent || !this.parent.parent) {\n throw new Error('SceneDataTransformer must either have $data set on it or have a parent.parent with $data');\n }\n\n return sceneGraph.getData(this.parent.parent);\n }\n\n public setContainerWidth(width: number) {\n if (this.state.$data && this.state.$data.setContainerWidth) {\n this.state.$data.setContainerWidth(width);\n }\n }\n\n public isDataReadyToDisplay() {\n const dataObject = this.getSourceData();\n if (dataObject.isDataReadyToDisplay) {\n return dataObject.isDataReadyToDisplay();\n }\n\n return true;\n }\n\n public reprocessTransformations() {\n this.transform(this.getSourceData().state.data, true);\n }\n\n public cancelQuery() {\n this.getSourceData().cancelQuery?.();\n }\n\n public getResultsStream() {\n return this._results;\n }\n\n public clone(withState?: Partial<SceneDataTransformerState>) {\n const clone = super.clone(withState);\n\n if (this._prevDataFromSource) {\n clone['_prevDataFromSource'] = this._prevDataFromSource;\n }\n\n return clone;\n }\n\n public isInViewChanged(isInView: boolean) {\n this.state.$data?.isInViewChanged?.(isInView);\n }\n\n public bypassIsInViewChanged(bypassIsInView: boolean) {\n this.state.$data?.bypassIsInViewChanged?.(bypassIsInView);\n }\n\n private haveAlreadyTransformedData(data: PanelData) {\n if (!this._prevDataFromSource) {\n return false;\n }\n\n if (data === this._prevDataFromSource) {\n return true;\n }\n\n const { series, annotations } = this._prevDataFromSource;\n\n if (data.series === series && data.annotations === annotations) {\n if (this.state.data && data.state !== this.state.data.state) {\n this.setState({ data: { ...this.state.data, state: data.state } });\n }\n return true;\n }\n\n return false;\n }\n\n private transform(data: PanelData | undefined, force = false) {\n if (this.state.transformations.length === 0 || !data) {\n this._prevDataFromSource = data;\n this.setState({ data });\n\n if (data) {\n this._results.next({ origin: this, data });\n }\n return;\n }\n\n // Skip transform step if we have already transformed this data\n if (!force && this.haveAlreadyTransformedData(data)) {\n return;\n }\n\n const interpolatedTransformations = this._interpolateVariablesInTransformationConfigs(data);\n\n const seriesTransformations = this._filterAndPrepareTransformationsByTopic(\n interpolatedTransformations,\n (transformation) => {\n if ('options' in transformation || 'topic' in transformation) {\n return transformation.topic == null || transformation.topic === DataTopic.Series;\n }\n return true;\n }\n );\n const annotationsTransformations = this._filterAndPrepareTransformationsByTopic(\n interpolatedTransformations,\n (transformation) => {\n if ('options' in transformation || 'topic' in transformation) {\n return transformation.topic === DataTopic.Annotations;\n }\n return false;\n }\n );\n\n if (this._transformSub) {\n this._transformSub.unsubscribe();\n }\n\n const ctx = {\n interpolate: (value: string, scopedVars?: ScopedVars) => {\n return sceneGraph.interpolate(this, value, { ...data.request?.scopedVars, ...scopedVars });\n },\n };\n\n const seriesStream = transformDataFrame(seriesTransformations, data.series, ctx);\n const annotationsStream = transformDataFrame(annotationsTransformations, data.annotations ?? []);\n\n let series: DataFrame[] = [];\n let annotations: DataFrame[] = [];\n\n this._transformSub = forkJoin([seriesStream, annotationsStream])\n .pipe(\n map((results) => {\n // this strategy allows transformations to take in series frames and produce anno frames\n // we look at each transformation's result and put it in the correct place\n results.forEach((frames) => {\n for (const frame of frames) {\n if (frame.meta?.dataTopic === DataTopic.Annotations) {\n annotations.push(frame);\n } else {\n series.push(frame);\n }\n }\n });\n\n return { ...data, series, annotations };\n }),\n catchError((err) => {\n console.error('Error transforming data: ', err);\n const sourceErr = this.getSourceData().state.data?.errors || [];\n\n const transformationError = toDataQueryError(err);\n transformationError.message = `Error transforming data: ${transformationError.message}`;\n\n const result: PanelData = {\n ...data,\n state: LoadingState.Error,\n // Combine transformation error with upstream errors\n errors: [...sourceErr, transformationError],\n };\n\n return of(result);\n })\n )\n .subscribe((transformedData) => {\n this.setState({ data: transformedData });\n this._results.next({ origin: this, data: transformedData });\n this._prevDataFromSource = data;\n });\n }\n\n private _interpolateVariablesInTransformationConfigs(\n data: PanelData\n ): Array<DataTransformerConfig | CustomTransformerDefinition> {\n const transformations = this.state.transformations;\n\n if (this._variableDependency.getNames().size === 0) {\n return transformations;\n }\n\n const onlyObjects = transformations.every((t) => typeof t === 'object');\n\n // If all transformations are config object we can interpolate them all at once\n if (onlyObjects) {\n return JSON.parse(sceneGraph.interpolate(this, JSON.stringify(transformations), data.request?.scopedVars));\n }\n\n return transformations.map((t) => {\n return typeof t === 'object'\n ? JSON.parse(sceneGraph.interpolate(this, JSON.stringify(t), data.request?.scopedVars))\n : t;\n });\n }\n\n private _filterAndPrepareTransformationsByTopic(\n interpolatedTransformations: Array<DataTransformerConfig<any> | CustomTransformerDefinition>,\n transformationFilter: (transformation: DataTransformerConfig<any> | CustomTransformerDefinition) => boolean\n ): Array<DataTransformerConfig<any> | CustomTransformOperator> {\n return interpolatedTransformations\n .filter(transformationFilter)\n .map((transformation) => ('operator' in transformation ? transformation.operator : transformation));\n }\n}\n"],"names":["_a"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"SceneDataTransformer.js","sources":["../../../src/querying/SceneDataTransformer.ts"],"sourcesContent":["import {\n CustomTransformOperator,\n DataFrame,\n DataTopic,\n DataTransformerConfig,\n LoadingState,\n PanelData,\n ScopedVars,\n transformDataFrame,\n} from '@grafana/data';\nimport { toDataQueryError } from '@grafana/runtime';\nimport { catchError, forkJoin, map, of, ReplaySubject, Unsubscribable } from 'rxjs';\nimport { sceneGraph } from '../core/sceneGraph';\nimport { SceneObjectBase } from '../core/SceneObjectBase';\nimport { CustomTransformerDefinition, SceneDataProvider, SceneDataProviderResult, SceneDataState } from '../core/types';\nimport { VariableDependencyConfig } from '../variables/VariableDependencyConfig';\nimport { SceneDataLayerSet } from './SceneDataLayerSet';\nimport { findPanelProfiler } from '../utils/findPanelProfiler';\n\nexport interface SceneDataTransformerState extends SceneDataState {\n /**\n * Array of standard transformation configs and custom transform operators\n */\n transformations: Array<DataTransformerConfig | CustomTransformerDefinition>;\n}\n\n/**\n * You can use this as a $data object. It can either transform an inner $data DataProvider or if that is not set it will\n * subscribe to a DataProvider higher up in the scene graph and transform its data.\n *\n * The transformations array supports custom (runtime defined) transformation as well as declarative core transformations.\n * You can manually re-process the transformations by calling reprocessTransformations(). This is useful if you have\n * transformations that depend on other scene object states.\n */\nexport class SceneDataTransformer extends SceneObjectBase<SceneDataTransformerState> implements SceneDataProvider {\n private _transformSub?: Unsubscribable;\n private _results = new ReplaySubject<SceneDataProviderResult>(1);\n private _prevDataFromSource?: PanelData;\n\n /**\n * Scan transformations for variable usage and re-process transforms when a variable values change\n */\n protected _variableDependency: VariableDependencyConfig<SceneDataTransformerState> = new VariableDependencyConfig(\n this,\n {\n statePaths: ['transformations'],\n onReferencedVariableValueChanged: () => this.reprocessTransformations(),\n }\n );\n\n public constructor(state: SceneDataTransformerState) {\n super(state);\n\n this.addActivationHandler(() => this.activationHandler());\n }\n\n private activationHandler() {\n const sourceData = this.getSourceData();\n\n this._subs.add(sourceData.subscribeToState((state) => this.transform(state.data)));\n\n if (sourceData.state.data) {\n this.transform(sourceData.state.data);\n }\n\n return () => {\n if (this._transformSub) {\n this._transformSub.unsubscribe();\n }\n };\n }\n\n private getSourceData(): SceneDataProvider {\n if (this.state.$data) {\n if (this.state.$data instanceof SceneDataLayerSet) {\n throw new Error('SceneDataLayerSet can not be used as data provider for SceneDataTransformer.');\n }\n return this.state.$data;\n }\n\n if (!this.parent || !this.parent.parent) {\n throw new Error('SceneDataTransformer must either have $data set on it or have a parent.parent with $data');\n }\n\n return sceneGraph.getData(this.parent.parent);\n }\n\n public setContainerWidth(width: number) {\n if (this.state.$data && this.state.$data.setContainerWidth) {\n this.state.$data.setContainerWidth(width);\n }\n }\n\n public isDataReadyToDisplay() {\n const dataObject = this.getSourceData();\n if (dataObject.isDataReadyToDisplay) {\n return dataObject.isDataReadyToDisplay();\n }\n\n return true;\n }\n\n public reprocessTransformations() {\n this.transform(this.getSourceData().state.data, true);\n }\n\n /**\n * S3.1: Calculate transformation complexity metrics\n */\n private _calculateTransformationMetrics(\n data: PanelData,\n transformations: Array<DataTransformerConfig | CustomTransformerDefinition>\n ): {\n transformationCount: number;\n seriesTransformationCount: number;\n annotationTransformationCount: number;\n } {\n const transformationCount = transformations.length;\n\n // Count transformations by topic (series vs annotations)\n const seriesTransformationCount = transformations.filter((transformation) => {\n if ('options' in transformation || 'topic' in transformation) {\n return transformation.topic == null || transformation.topic === DataTopic.Series;\n }\n return true; // Custom transformations default to series\n }).length;\n\n const annotationTransformationCount = transformations.filter((transformation) => {\n if ('options' in transformation || 'topic' in transformation) {\n return transformation.topic === DataTopic.Annotations;\n }\n return false;\n }).length;\n\n return {\n transformationCount,\n seriesTransformationCount,\n annotationTransformationCount,\n };\n }\n\n public cancelQuery() {\n this.getSourceData().cancelQuery?.();\n }\n\n public getResultsStream() {\n return this._results;\n }\n\n public clone(withState?: Partial<SceneDataTransformerState>) {\n const clone = super.clone(withState);\n\n if (this._prevDataFromSource) {\n clone['_prevDataFromSource'] = this._prevDataFromSource;\n }\n\n return clone;\n }\n\n public isInViewChanged(isInView: boolean) {\n this.state.$data?.isInViewChanged?.(isInView);\n }\n\n public bypassIsInViewChanged(bypassIsInView: boolean) {\n this.state.$data?.bypassIsInViewChanged?.(bypassIsInView);\n }\n\n private haveAlreadyTransformedData(data: PanelData) {\n if (!this._prevDataFromSource) {\n return false;\n }\n\n if (data === this._prevDataFromSource) {\n return true;\n }\n\n const { series, annotations } = this._prevDataFromSource;\n\n if (data.series === series && data.annotations === annotations) {\n if (this.state.data && data.state !== this.state.data.state) {\n this.setState({ data: { ...this.state.data, state: data.state } });\n }\n return true;\n }\n\n return false;\n }\n\n private transform(data: PanelData | undefined, force = false) {\n const timestamp = performance.now();\n // S3.1: Performance tracking entry point\n const profiler = findPanelProfiler(this);\n const transformStartTime = performance.now();\n let transformationId: string | undefined;\n let endTransformCallback:\n | ((\n endTimestamp: number,\n duration: number,\n success: boolean,\n result?: {\n outputSeriesCount?: number;\n outputAnnotationsCount?: number;\n error?: string;\n }\n ) => void)\n | null = null;\n\n if (this.state.transformations.length === 0 || !data) {\n this._prevDataFromSource = data;\n this.setState({ data });\n\n if (data) {\n this._results.next({ origin: this, data });\n }\n return;\n }\n\n // Skip transform step if we have already transformed this data\n if (!force && this.haveAlreadyTransformedData(data)) {\n return;\n }\n\n // S3.1: Start transformation tracking\n if (profiler) {\n // Create meaningful transformation identifier from actual transformations\n const transformationTypes = this.state.transformations\n .map((t) => {\n if ('id' in t) {\n // Standard DataTransformerConfig\n return t.id;\n } else {\n // CustomTransformerDefinition\n return 'customTransformation';\n }\n })\n .join('+');\n transformationId = transformationTypes || 'no-transforms';\n\n // Calculate transformation complexity metrics\n const metrics = this._calculateTransformationMetrics(data, this.state.transformations);\n\n // Start the DataProcessing phase with centralized logging - get end callback\n endTransformCallback = profiler.onDataTransformStart(timestamp, transformationId, metrics);\n }\n\n const interpolatedTransformations = this._interpolateVariablesInTransformationConfigs(data);\n\n const seriesTransformations = this._filterAndPrepareTransformationsByTopic(\n interpolatedTransformations,\n (transformation) => {\n if ('options' in transformation || 'topic' in transformation) {\n return transformation.topic == null || transformation.topic === DataTopic.Series;\n }\n return true;\n }\n );\n const annotationsTransformations = this._filterAndPrepareTransformationsByTopic(\n interpolatedTransformations,\n (transformation) => {\n if ('options' in transformation || 'topic' in transformation) {\n return transformation.topic === DataTopic.Annotations;\n }\n return false;\n }\n );\n\n if (this._transformSub) {\n this._transformSub.unsubscribe();\n }\n\n const ctx = {\n interpolate: (value: string, scopedVars?: ScopedVars) => {\n return sceneGraph.interpolate(this, value, { ...data.request?.scopedVars, ...scopedVars });\n },\n };\n\n const seriesStream = transformDataFrame(seriesTransformations, data.series, ctx);\n const annotationsStream = transformDataFrame(annotationsTransformations, data.annotations ?? []);\n\n let series: DataFrame[] = [];\n let annotations: DataFrame[] = [];\n\n this._transformSub = forkJoin([seriesStream, annotationsStream])\n .pipe(\n map((results) => {\n // this strategy allows transformations to take in series frames and produce anno frames\n // we look at each transformation's result and put it in the correct place\n results.forEach((frames) => {\n for (const frame of frames) {\n if (frame.meta?.dataTopic === DataTopic.Annotations) {\n annotations.push(frame);\n } else {\n series.push(frame);\n }\n }\n });\n\n return { ...data, series, annotations };\n }),\n catchError((err) => {\n const timestamp = performance.now();\n // S3.1: Performance tracking for transformation errors\n const duration = timestamp - transformStartTime;\n\n if (endTransformCallback) {\n // End the DataProcessing phase with centralized logging using callback\n endTransformCallback(timestamp, duration, false, {\n error: err.message || err,\n });\n }\n\n console.error('Error transforming data: ', err);\n const sourceErr = this.getSourceData().state.data?.errors || [];\n\n const transformationError = toDataQueryError(err);\n transformationError.message = `Error transforming data: ${transformationError.message}`;\n\n const result: PanelData = {\n ...data,\n state: LoadingState.Error,\n // Combine transformation error with upstream errors\n errors: [...sourceErr, transformationError],\n };\n\n return of(result);\n })\n )\n .subscribe((transformedData) => {\n const timestamp = performance.now();\n const duration = timestamp - transformStartTime;\n if (endTransformCallback) {\n // End the DataProcessing phase with centralized logging using callback\n endTransformCallback(timestamp, duration, true, {\n outputSeriesCount: transformedData.series.length,\n outputAnnotationsCount: transformedData.annotations?.length || 0,\n });\n }\n this.setState({ data: transformedData });\n this._results.next({ origin: this, data: transformedData });\n this._prevDataFromSource = data;\n });\n }\n\n private _interpolateVariablesInTransformationConfigs(\n data: PanelData\n ): Array<DataTransformerConfig | CustomTransformerDefinition> {\n const transformations = this.state.transformations;\n\n if (this._variableDependency.getNames().size === 0) {\n return transformations;\n }\n\n const onlyObjects = transformations.every((t) => typeof t === 'object');\n\n // If all transformations are config object we can interpolate them all at once\n if (onlyObjects) {\n return JSON.parse(sceneGraph.interpolate(this, JSON.stringify(transformations), data.request?.scopedVars));\n }\n\n return transformations.map((t) => {\n return typeof t === 'object'\n ? JSON.parse(sceneGraph.interpolate(this, JSON.stringify(t), data.request?.scopedVars))\n : t;\n });\n }\n\n private _filterAndPrepareTransformationsByTopic(\n interpolatedTransformations: Array<DataTransformerConfig<any> | CustomTransformerDefinition>,\n transformationFilter: (transformation: DataTransformerConfig<any> | CustomTransformerDefinition) => boolean\n ): Array<DataTransformerConfig<any> | CustomTransformOperator> {\n return interpolatedTransformations\n .filter(transformationFilter)\n .map((transformation) => ('operator' in transformation ? transformation.operator : transformation));\n }\n}\n"],"names":["_a","timestamp"],"mappings":"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"}
|
|
@@ -17,6 +17,7 @@ import { filterAnnotations } from './layers/annotations/filterAnnotations.js';
|
|
|
17
17
|
import { getEnrichedDataRequest } from './getEnrichedDataRequest.js';
|
|
18
18
|
import { registerQueryWithController } from './registerQueryWithController.js';
|
|
19
19
|
import { GroupByVariable } from '../variables/groupby/GroupByVariable.js';
|
|
20
|
+
import { findPanelProfiler } from '../utils/findPanelProfiler.js';
|
|
20
21
|
import { AdHocFiltersVariable } from '../variables/adhoc/AdHocFiltersVariable.js';
|
|
21
22
|
import { DataLayersMerger } from './DataLayersMerger.js';
|
|
22
23
|
import { interpolate } from '../core/sceneGraph/sceneGraph.js';
|
|
@@ -309,13 +310,17 @@ class SceneQueryRunner extends SceneObjectBase {
|
|
|
309
310
|
const op = extraQueryProcessingOperator(processors);
|
|
310
311
|
stream = forkJoin([stream, ...secondaryStreams]).pipe(op);
|
|
311
312
|
}
|
|
313
|
+
const panelProfiler = findPanelProfiler(this);
|
|
312
314
|
stream = stream.pipe(
|
|
313
|
-
registerQueryWithController(
|
|
314
|
-
|
|
315
|
-
|
|
316
|
-
|
|
317
|
-
|
|
318
|
-
|
|
315
|
+
registerQueryWithController(
|
|
316
|
+
{
|
|
317
|
+
type: "SceneQueryRunner/runQueries",
|
|
318
|
+
request: primary,
|
|
319
|
+
origin: this,
|
|
320
|
+
cancel: () => this.cancelQuery()
|
|
321
|
+
},
|
|
322
|
+
panelProfiler
|
|
323
|
+
)
|
|
319
324
|
);
|
|
320
325
|
this._querySub = stream.subscribe(this.onDataReceived);
|
|
321
326
|
} catch (err) {
|