@grafana/scenes 5.11.2 → 5.11.3--canary.858.10679390033.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (33) hide show
  1. package/CHANGELOG.md +5 -5
  2. package/dist/esm/behaviors/SceneQueryController.js +60 -5
  3. package/dist/esm/behaviors/SceneQueryController.js.map +1 -1
  4. package/dist/esm/behaviors/SceneRenderProfiler.js +168 -0
  5. package/dist/esm/behaviors/SceneRenderProfiler.js.map +1 -0
  6. package/dist/esm/components/SceneRefreshPicker.js +4 -1
  7. package/dist/esm/components/SceneRefreshPicker.js.map +1 -1
  8. package/dist/esm/components/VizPanel/VizPanel.js +9 -6
  9. package/dist/esm/components/VizPanel/VizPanel.js.map +1 -1
  10. package/dist/esm/core/SceneTimeRange.js +3 -0
  11. package/dist/esm/core/SceneTimeRange.js.map +1 -1
  12. package/dist/esm/core/sceneGraph/getQueryController.js +19 -0
  13. package/dist/esm/core/sceneGraph/getQueryController.js.map +1 -0
  14. package/dist/esm/core/sceneGraph/index.js +2 -1
  15. package/dist/esm/core/sceneGraph/index.js.map +1 -1
  16. package/dist/esm/core/sceneGraph/sceneGraph.js +1 -16
  17. package/dist/esm/core/sceneGraph/sceneGraph.js.map +1 -1
  18. package/dist/esm/index.js.map +1 -1
  19. package/dist/esm/querying/SceneQueryRunner.js +1 -3
  20. package/dist/esm/querying/SceneQueryRunner.js.map +1 -1
  21. package/dist/esm/querying/registerQueryWithController.js +19 -2
  22. package/dist/esm/querying/registerQueryWithController.js.map +1 -1
  23. package/dist/esm/services/useUrlSync.js.map +1 -1
  24. package/dist/esm/utils/getDataSource.js +17 -1
  25. package/dist/esm/utils/getDataSource.js.map +1 -1
  26. package/dist/esm/variables/components/VariableValueSelect.js +5 -0
  27. package/dist/esm/variables/components/VariableValueSelect.js.map +1 -1
  28. package/dist/esm/variables/variants/MultiValueVariable.js.map +1 -1
  29. package/dist/esm/variables/variants/TestVariable.js.map +1 -1
  30. package/dist/index.d.ts +43 -25
  31. package/dist/index.js +464 -206
  32. package/dist/index.js.map +1 -1
  33. package/package.json +2 -2
package/dist/index.js CHANGED
@@ -41,19 +41,19 @@ var React__default = /*#__PURE__*/_interopDefaultLegacy(React);
41
41
  var uFuzzy__default = /*#__PURE__*/_interopDefaultLegacy(uFuzzy);
42
42
  var ReactGridLayout__default = /*#__PURE__*/_interopDefaultLegacy(ReactGridLayout);
43
43
 
44
- var __defProp$O = Object.defineProperty;
45
- var __getOwnPropSymbols$O = Object.getOwnPropertySymbols;
46
- var __hasOwnProp$O = Object.prototype.hasOwnProperty;
47
- var __propIsEnum$O = Object.prototype.propertyIsEnumerable;
48
- var __defNormalProp$O = (obj, key, value) => key in obj ? __defProp$O(obj, key, { enumerable: true, configurable: true, writable: true, value }) : obj[key] = value;
49
- var __spreadValues$O = (a, b) => {
44
+ var __defProp$P = Object.defineProperty;
45
+ var __getOwnPropSymbols$P = Object.getOwnPropertySymbols;
46
+ var __hasOwnProp$P = Object.prototype.hasOwnProperty;
47
+ var __propIsEnum$P = Object.prototype.propertyIsEnumerable;
48
+ var __defNormalProp$P = (obj, key, value) => key in obj ? __defProp$P(obj, key, { enumerable: true, configurable: true, writable: true, value }) : obj[key] = value;
49
+ var __spreadValues$P = (a, b) => {
50
50
  for (var prop in b || (b = {}))
51
- if (__hasOwnProp$O.call(b, prop))
52
- __defNormalProp$O(a, prop, b[prop]);
53
- if (__getOwnPropSymbols$O)
54
- for (var prop of __getOwnPropSymbols$O(b)) {
55
- if (__propIsEnum$O.call(b, prop))
56
- __defNormalProp$O(a, prop, b[prop]);
51
+ if (__hasOwnProp$P.call(b, prop))
52
+ __defNormalProp$P(a, prop, b[prop]);
53
+ if (__getOwnPropSymbols$P)
54
+ for (var prop of __getOwnPropSymbols$P(b)) {
55
+ if (__propIsEnum$P.call(b, prop))
56
+ __defNormalProp$P(a, prop, b[prop]);
57
57
  }
58
58
  return a;
59
59
  };
@@ -62,7 +62,7 @@ function useAppQueryParams() {
62
62
  return runtime.locationSearchToObject(location.search || "");
63
63
  }
64
64
  function getUrlWithAppState(path, preserveParams) {
65
- const paramsCopy = __spreadValues$O({}, runtime.locationService.getSearchObject());
65
+ const paramsCopy = __spreadValues$P({}, runtime.locationService.getSearchObject());
66
66
  if (preserveParams) {
67
67
  for (const key of Object.keys(paramsCopy)) {
68
68
  if (!preserveParams.includes(key)) {
@@ -76,31 +76,31 @@ function renderSceneComponentWithRouteProps(sceneObject, routeProps) {
76
76
  return React__default["default"].createElement(sceneObject.Component, { model: sceneObject, routeProps });
77
77
  }
78
78
 
79
- var __defProp$N = Object.defineProperty;
80
- var __defProps$u = Object.defineProperties;
81
- var __getOwnPropDescs$u = Object.getOwnPropertyDescriptors;
82
- var __getOwnPropSymbols$N = Object.getOwnPropertySymbols;
83
- var __hasOwnProp$N = Object.prototype.hasOwnProperty;
84
- var __propIsEnum$N = Object.prototype.propertyIsEnumerable;
85
- var __defNormalProp$N = (obj, key, value) => key in obj ? __defProp$N(obj, key, { enumerable: true, configurable: true, writable: true, value }) : obj[key] = value;
86
- var __spreadValues$N = (a, b) => {
79
+ var __defProp$O = Object.defineProperty;
80
+ var __defProps$v = Object.defineProperties;
81
+ var __getOwnPropDescs$v = Object.getOwnPropertyDescriptors;
82
+ var __getOwnPropSymbols$O = Object.getOwnPropertySymbols;
83
+ var __hasOwnProp$O = Object.prototype.hasOwnProperty;
84
+ var __propIsEnum$O = Object.prototype.propertyIsEnumerable;
85
+ var __defNormalProp$O = (obj, key, value) => key in obj ? __defProp$O(obj, key, { enumerable: true, configurable: true, writable: true, value }) : obj[key] = value;
86
+ var __spreadValues$O = (a, b) => {
87
87
  for (var prop in b || (b = {}))
88
- if (__hasOwnProp$N.call(b, prop))
89
- __defNormalProp$N(a, prop, b[prop]);
90
- if (__getOwnPropSymbols$N)
91
- for (var prop of __getOwnPropSymbols$N(b)) {
92
- if (__propIsEnum$N.call(b, prop))
93
- __defNormalProp$N(a, prop, b[prop]);
88
+ if (__hasOwnProp$O.call(b, prop))
89
+ __defNormalProp$O(a, prop, b[prop]);
90
+ if (__getOwnPropSymbols$O)
91
+ for (var prop of __getOwnPropSymbols$O(b)) {
92
+ if (__propIsEnum$O.call(b, prop))
93
+ __defNormalProp$O(a, prop, b[prop]);
94
94
  }
95
95
  return a;
96
96
  };
97
- var __spreadProps$u = (a, b) => __defProps$u(a, __getOwnPropDescs$u(b));
97
+ var __spreadProps$v = (a, b) => __defProps$v(a, __getOwnPropDescs$v(b));
98
98
  const runtimePanelPlugins = /* @__PURE__ */ new Map();
99
99
  function registerRuntimePanelPlugin({ pluginId, plugin }) {
100
100
  if (runtimePanelPlugins.has(pluginId)) {
101
101
  throw new Error(`A runtime panel plugin with id ${pluginId} has already been registered`);
102
102
  }
103
- plugin.meta = __spreadProps$u(__spreadValues$N({}, plugin.meta), {
103
+ plugin.meta = __spreadProps$v(__spreadValues$O({}, plugin.meta), {
104
104
  id: pluginId,
105
105
  name: pluginId,
106
106
  module: "runtime plugin",
@@ -128,33 +128,33 @@ function loadPanelPluginSync(pluginId) {
128
128
  return (_a = getPanelPluginFromCache(pluginId)) != null ? _a : runtimePanelPlugins.get(pluginId);
129
129
  }
130
130
 
131
- var __defProp$M = Object.defineProperty;
132
- var __defProps$t = Object.defineProperties;
133
- var __getOwnPropDescs$t = Object.getOwnPropertyDescriptors;
134
- var __getOwnPropSymbols$M = Object.getOwnPropertySymbols;
135
- var __hasOwnProp$M = Object.prototype.hasOwnProperty;
136
- var __propIsEnum$M = Object.prototype.propertyIsEnumerable;
137
- var __defNormalProp$M = (obj, key, value) => key in obj ? __defProp$M(obj, key, { enumerable: true, configurable: true, writable: true, value }) : obj[key] = value;
138
- var __spreadValues$M = (a, b) => {
131
+ var __defProp$N = Object.defineProperty;
132
+ var __defProps$u = Object.defineProperties;
133
+ var __getOwnPropDescs$u = Object.getOwnPropertyDescriptors;
134
+ var __getOwnPropSymbols$N = Object.getOwnPropertySymbols;
135
+ var __hasOwnProp$N = Object.prototype.hasOwnProperty;
136
+ var __propIsEnum$N = Object.prototype.propertyIsEnumerable;
137
+ var __defNormalProp$N = (obj, key, value) => key in obj ? __defProp$N(obj, key, { enumerable: true, configurable: true, writable: true, value }) : obj[key] = value;
138
+ var __spreadValues$N = (a, b) => {
139
139
  for (var prop in b || (b = {}))
140
- if (__hasOwnProp$M.call(b, prop))
141
- __defNormalProp$M(a, prop, b[prop]);
142
- if (__getOwnPropSymbols$M)
143
- for (var prop of __getOwnPropSymbols$M(b)) {
144
- if (__propIsEnum$M.call(b, prop))
145
- __defNormalProp$M(a, prop, b[prop]);
140
+ if (__hasOwnProp$N.call(b, prop))
141
+ __defNormalProp$N(a, prop, b[prop]);
142
+ if (__getOwnPropSymbols$N)
143
+ for (var prop of __getOwnPropSymbols$N(b)) {
144
+ if (__propIsEnum$N.call(b, prop))
145
+ __defNormalProp$N(a, prop, b[prop]);
146
146
  }
147
147
  return a;
148
148
  };
149
- var __spreadProps$t = (a, b) => __defProps$t(a, __getOwnPropDescs$t(b));
149
+ var __spreadProps$u = (a, b) => __defProps$u(a, __getOwnPropDescs$u(b));
150
150
  var __objRest$5 = (source, exclude) => {
151
151
  var target = {};
152
152
  for (var prop in source)
153
- if (__hasOwnProp$M.call(source, prop) && exclude.indexOf(prop) < 0)
153
+ if (__hasOwnProp$N.call(source, prop) && exclude.indexOf(prop) < 0)
154
154
  target[prop] = source[prop];
155
- if (source != null && __getOwnPropSymbols$M)
156
- for (var prop of __getOwnPropSymbols$M(source)) {
157
- if (exclude.indexOf(prop) < 0 && __propIsEnum$M.call(source, prop))
155
+ if (source != null && __getOwnPropSymbols$N)
156
+ for (var prop of __getOwnPropSymbols$N(source)) {
157
+ if (exclude.indexOf(prop) < 0 && __propIsEnum$N.call(source, prop))
158
158
  target[prop] = source[prop];
159
159
  }
160
160
  return target;
@@ -172,7 +172,7 @@ function SceneComponentWrapperWithoutMemo(_a) {
172
172
  if (!model.isActive) {
173
173
  return null;
174
174
  }
175
- return /* @__PURE__ */ React__default["default"].createElement(Component, __spreadProps$t(__spreadValues$M({}, otherProps), {
175
+ return /* @__PURE__ */ React__default["default"].createElement(Component, __spreadProps$u(__spreadValues$N({}, otherProps), {
176
176
  model
177
177
  }));
178
178
  }
@@ -188,49 +188,49 @@ class UserActionEvent extends data.BusEventWithPayload {
188
188
  }
189
189
  UserActionEvent.type = "scene-object-user-action";
190
190
 
191
- var __accessCheck$3 = (obj, member, msg) => {
191
+ var __accessCheck$4 = (obj, member, msg) => {
192
192
  if (!member.has(obj))
193
193
  throw TypeError("Cannot " + msg);
194
194
  };
195
- var __privateGet$3 = (obj, member, getter) => {
196
- __accessCheck$3(obj, member, "read from private field");
195
+ var __privateGet$4 = (obj, member, getter) => {
196
+ __accessCheck$4(obj, member, "read from private field");
197
197
  return getter ? getter.call(obj) : member.get(obj);
198
198
  };
199
- var __privateAdd$3 = (obj, member, value) => {
199
+ var __privateAdd$4 = (obj, member, value) => {
200
200
  if (member.has(obj))
201
201
  throw TypeError("Cannot add the same private member more than once");
202
202
  member instanceof WeakSet ? member.add(obj) : member.set(obj, value);
203
203
  };
204
- var __privateSet$2 = (obj, member, value, setter) => {
205
- __accessCheck$3(obj, member, "write to private field");
204
+ var __privateSet$4 = (obj, member, value, setter) => {
205
+ __accessCheck$4(obj, member, "write to private field");
206
206
  setter ? setter.call(obj, value) : member.set(obj, value);
207
207
  return value;
208
208
  };
209
209
  var _ref;
210
210
  class SceneObjectRef {
211
211
  constructor(ref) {
212
- __privateAdd$3(this, _ref, void 0);
213
- __privateSet$2(this, _ref, ref);
212
+ __privateAdd$4(this, _ref, void 0);
213
+ __privateSet$4(this, _ref, ref);
214
214
  }
215
215
  resolve() {
216
- return __privateGet$3(this, _ref);
216
+ return __privateGet$4(this, _ref);
217
217
  }
218
218
  }
219
219
  _ref = new WeakMap();
220
220
 
221
- var __defProp$L = Object.defineProperty;
222
- var __getOwnPropSymbols$L = Object.getOwnPropertySymbols;
223
- var __hasOwnProp$L = Object.prototype.hasOwnProperty;
224
- var __propIsEnum$L = Object.prototype.propertyIsEnumerable;
225
- var __defNormalProp$L = (obj, key, value) => key in obj ? __defProp$L(obj, key, { enumerable: true, configurable: true, writable: true, value }) : obj[key] = value;
226
- var __spreadValues$L = (a, b) => {
221
+ var __defProp$M = Object.defineProperty;
222
+ var __getOwnPropSymbols$M = Object.getOwnPropertySymbols;
223
+ var __hasOwnProp$M = Object.prototype.hasOwnProperty;
224
+ var __propIsEnum$M = Object.prototype.propertyIsEnumerable;
225
+ var __defNormalProp$M = (obj, key, value) => key in obj ? __defProp$M(obj, key, { enumerable: true, configurable: true, writable: true, value }) : obj[key] = value;
226
+ var __spreadValues$M = (a, b) => {
227
227
  for (var prop in b || (b = {}))
228
- if (__hasOwnProp$L.call(b, prop))
229
- __defNormalProp$L(a, prop, b[prop]);
230
- if (__getOwnPropSymbols$L)
231
- for (var prop of __getOwnPropSymbols$L(b)) {
232
- if (__propIsEnum$L.call(b, prop))
233
- __defNormalProp$L(a, prop, b[prop]);
228
+ if (__hasOwnProp$M.call(b, prop))
229
+ __defNormalProp$M(a, prop, b[prop]);
230
+ if (__getOwnPropSymbols$M)
231
+ for (var prop of __getOwnPropSymbols$M(b)) {
232
+ if (__propIsEnum$M.call(b, prop))
233
+ __defNormalProp$M(a, prop, b[prop]);
234
234
  }
235
235
  return a;
236
236
  };
@@ -290,7 +290,7 @@ class SceneObjectBase {
290
290
  }
291
291
  setState(update) {
292
292
  const prevState = this._state;
293
- const newState = __spreadValues$L(__spreadValues$L({}, this._state), update);
293
+ const newState = __spreadValues$M(__spreadValues$M({}, this._state), update);
294
294
  this._state = Object.freeze(newState);
295
295
  this._setParent(update);
296
296
  this._handleActivationOfChangedStateProps(prevState, newState);
@@ -486,19 +486,19 @@ function forEachChild(state, callback) {
486
486
  }
487
487
  }
488
488
 
489
- var __defProp$K = Object.defineProperty;
490
- var __getOwnPropSymbols$K = Object.getOwnPropertySymbols;
491
- var __hasOwnProp$K = Object.prototype.hasOwnProperty;
492
- var __propIsEnum$K = Object.prototype.propertyIsEnumerable;
493
- var __defNormalProp$K = (obj, key, value) => key in obj ? __defProp$K(obj, key, { enumerable: true, configurable: true, writable: true, value }) : obj[key] = value;
494
- var __spreadValues$K = (a, b) => {
489
+ var __defProp$L = Object.defineProperty;
490
+ var __getOwnPropSymbols$L = Object.getOwnPropertySymbols;
491
+ var __hasOwnProp$L = Object.prototype.hasOwnProperty;
492
+ var __propIsEnum$L = Object.prototype.propertyIsEnumerable;
493
+ var __defNormalProp$L = (obj, key, value) => key in obj ? __defProp$L(obj, key, { enumerable: true, configurable: true, writable: true, value }) : obj[key] = value;
494
+ var __spreadValues$L = (a, b) => {
495
495
  for (var prop in b || (b = {}))
496
- if (__hasOwnProp$K.call(b, prop))
497
- __defNormalProp$K(a, prop, b[prop]);
498
- if (__getOwnPropSymbols$K)
499
- for (var prop of __getOwnPropSymbols$K(b)) {
500
- if (__propIsEnum$K.call(b, prop))
501
- __defNormalProp$K(a, prop, b[prop]);
496
+ if (__hasOwnProp$L.call(b, prop))
497
+ __defNormalProp$L(a, prop, b[prop]);
498
+ if (__getOwnPropSymbols$L)
499
+ for (var prop of __getOwnPropSymbols$L(b)) {
500
+ if (__propIsEnum$L.call(b, prop))
501
+ __defNormalProp$L(a, prop, b[prop]);
502
502
  }
503
503
  return a;
504
504
  };
@@ -507,7 +507,7 @@ function cloneSceneObject(sceneObject, withState) {
507
507
  return new sceneObject.constructor(clonedState);
508
508
  }
509
509
  function cloneSceneObjectState(sceneState, withState) {
510
- const clonedState = __spreadValues$K({}, sceneState);
510
+ const clonedState = __spreadValues$L({}, sceneState);
511
511
  for (const key in clonedState) {
512
512
  const propValue = clonedState[key];
513
513
  if (propValue instanceof SceneObjectBase) {
@@ -604,6 +604,304 @@ function lookupVariable(name, sceneObject) {
604
604
  return null;
605
605
  }
606
606
 
607
+ function writeSceneLog(logger, message, ...rest) {
608
+ let loggingEnabled = false;
609
+ if (typeof window !== "undefined") {
610
+ loggingEnabled = localStorage.getItem("grafana.debug.scenes") === "true";
611
+ }
612
+ if (loggingEnabled) {
613
+ console.log(`${logger}: `, message, ...rest);
614
+ }
615
+ }
616
+
617
+ var __accessCheck$3 = (obj, member, msg) => {
618
+ if (!member.has(obj))
619
+ throw TypeError("Cannot " + msg);
620
+ };
621
+ var __privateGet$3 = (obj, member, getter) => {
622
+ __accessCheck$3(obj, member, "read from private field");
623
+ return getter ? getter.call(obj) : member.get(obj);
624
+ };
625
+ var __privateAdd$3 = (obj, member, value) => {
626
+ if (member.has(obj))
627
+ throw TypeError("Cannot add the same private member more than once");
628
+ member instanceof WeakSet ? member.add(obj) : member.set(obj, value);
629
+ };
630
+ var __privateSet$3 = (obj, member, value, setter) => {
631
+ __accessCheck$3(obj, member, "write to private field");
632
+ setter ? setter.call(obj, value) : member.set(obj, value);
633
+ return value;
634
+ };
635
+ var _profileInProgress, _profileStartTs, _trailAnimationFrameId, _recordedTrailingSpans;
636
+ const POST_STORM_WINDOW = 2e3;
637
+ const SPAN_THRESHOLD = 30;
638
+ class SceneRenderProfiler {
639
+ constructor(queryController) {
640
+ this.queryController = queryController;
641
+ __privateAdd$3(this, _profileInProgress, null);
642
+ __privateAdd$3(this, _profileStartTs, null);
643
+ __privateAdd$3(this, _trailAnimationFrameId, null);
644
+ __privateAdd$3(this, _recordedTrailingSpans, []);
645
+ this.lastFrameTime = 0;
646
+ this.measureTrailingFrames = (measurementStartTs, lastFrameTime, profileStartTs) => {
647
+ const currentFrameTime = performance.now();
648
+ const frameLength = currentFrameTime - lastFrameTime;
649
+ __privateGet$3(this, _recordedTrailingSpans).push(frameLength);
650
+ if (currentFrameTime - measurementStartTs < POST_STORM_WINDOW) {
651
+ __privateSet$3(this, _trailAnimationFrameId, requestAnimationFrame(
652
+ () => this.measureTrailingFrames(measurementStartTs, currentFrameTime, profileStartTs)
653
+ ));
654
+ } else {
655
+ const slowFrames = processRecordedSpans(__privateGet$3(this, _recordedTrailingSpans));
656
+ const slowFramesTime = slowFrames.reduce((acc, val) => acc + val, 0);
657
+ writeSceneLog(
658
+ this.constructor.name,
659
+ "Profile tail recorded, slow frames duration:",
660
+ slowFramesTime,
661
+ slowFrames,
662
+ __privateGet$3(this, _profileInProgress)
663
+ );
664
+ __privateSet$3(this, _recordedTrailingSpans, []);
665
+ const profileDuration = measurementStartTs - profileStartTs;
666
+ writeSceneLog(
667
+ this.constructor.name,
668
+ "Stoped recording, total measured time (network included):",
669
+ profileDuration + slowFramesTime
670
+ );
671
+ __privateSet$3(this, _trailAnimationFrameId, null);
672
+ const profileEndTs = profileStartTs + profileDuration + slowFramesTime;
673
+ performance.measure("DashboardInteraction", {
674
+ start: profileStartTs,
675
+ end: profileEndTs
676
+ });
677
+ const networkDuration = captureNetwork(profileStartTs, profileEndTs);
678
+ if (this.queryController.state.onProfileComplete) {
679
+ this.queryController.state.onProfileComplete({
680
+ origin: __privateGet$3(this, _profileInProgress).origin,
681
+ crumbs: __privateGet$3(this, _profileInProgress).crumbs,
682
+ duration: profileDuration + slowFramesTime,
683
+ networkDuration,
684
+ jsHeapSizeLimit: performance.memory ? performance.memory.jsHeapSizeLimit : 0,
685
+ usedJSHeapSize: performance.memory ? performance.memory.usedJSHeapSize : 0,
686
+ totalJSHeapSize: performance.memory ? performance.memory.totalJSHeapSize : 0
687
+ });
688
+ }
689
+ if (window.__runs) {
690
+ window.__runs += `${Date.now()}, ${profileDuration + slowFramesTime}
691
+ `;
692
+ } else {
693
+ window.__runs = `${Date.now()}, ${profileDuration + slowFramesTime}
694
+ `;
695
+ }
696
+ }
697
+ };
698
+ }
699
+ startProfile(name) {
700
+ if (__privateGet$3(this, _trailAnimationFrameId)) {
701
+ cancelAnimationFrame(__privateGet$3(this, _trailAnimationFrameId));
702
+ __privateSet$3(this, _trailAnimationFrameId, null);
703
+ writeSceneLog(this.constructor.name, "New profile: Stopped recording frames");
704
+ }
705
+ __privateSet$3(this, _profileInProgress, { origin: name, crumbs: [] });
706
+ __privateSet$3(this, _profileStartTs, performance.now());
707
+ writeSceneLog(this.constructor.name, "Profile started:", __privateGet$3(this, _profileInProgress), __privateGet$3(this, _profileStartTs));
708
+ }
709
+ recordProfileTail(measurementStartTime, profileStartTs) {
710
+ __privateSet$3(this, _trailAnimationFrameId, requestAnimationFrame(
711
+ () => this.measureTrailingFrames(measurementStartTime, measurementStartTime, profileStartTs)
712
+ ));
713
+ }
714
+ tryCompletingProfile() {
715
+ writeSceneLog(this.constructor.name, "Trying to complete profile", __privateGet$3(this, _profileInProgress));
716
+ if (this.queryController.runningQueriesCount() === 0 && __privateGet$3(this, _profileInProgress)) {
717
+ writeSceneLog(this.constructor.name, "All queries completed, stopping profile");
718
+ this.recordProfileTail(performance.now(), __privateGet$3(this, _profileStartTs));
719
+ }
720
+ }
721
+ isTailRecording() {
722
+ return Boolean(__privateGet$3(this, _trailAnimationFrameId));
723
+ }
724
+ cancelTailRecording() {
725
+ if (__privateGet$3(this, _trailAnimationFrameId)) {
726
+ cancelAnimationFrame(__privateGet$3(this, _trailAnimationFrameId));
727
+ __privateSet$3(this, _trailAnimationFrameId, null);
728
+ writeSceneLog(this.constructor.name, "Cancelled recording frames, new profile started");
729
+ }
730
+ }
731
+ addCrumb(crumb) {
732
+ if (__privateGet$3(this, _profileInProgress)) {
733
+ __privateGet$3(this, _profileInProgress).crumbs.push(crumb);
734
+ }
735
+ }
736
+ }
737
+ _profileInProgress = new WeakMap();
738
+ _profileStartTs = new WeakMap();
739
+ _trailAnimationFrameId = new WeakMap();
740
+ _recordedTrailingSpans = new WeakMap();
741
+ function processRecordedSpans(spans) {
742
+ for (let i = spans.length - 1; i >= 0; i--) {
743
+ if (spans[i] > SPAN_THRESHOLD) {
744
+ return spans.slice(0, i + 1);
745
+ }
746
+ }
747
+ return [spans[0]];
748
+ }
749
+ function captureNetwork(startTs, endTs) {
750
+ const entries = performance.getEntriesByType("resource");
751
+ const networkEntries = entries.filter((entry) => entry.startTime >= startTs && entry.startTime <= endTs);
752
+ for (const entry of networkEntries) {
753
+ performance.measure("Network entry " + entry.name, {
754
+ start: entry.startTime,
755
+ end: entry.responseEnd
756
+ });
757
+ }
758
+ return calculateNetworkTime(networkEntries);
759
+ }
760
+ function calculateNetworkTime(requests) {
761
+ if (requests.length === 0) {
762
+ return 0;
763
+ }
764
+ requests.sort((a, b) => a.startTime - b.startTime);
765
+ let totalNetworkTime = 0;
766
+ let currentStart = requests[0].startTime;
767
+ let currentEnd = requests[0].responseEnd;
768
+ for (let i = 1; i < requests.length; i++) {
769
+ if (requests[i].startTime <= currentEnd) {
770
+ currentEnd = Math.max(currentEnd, requests[i].responseEnd);
771
+ } else {
772
+ totalNetworkTime += currentEnd - currentStart;
773
+ currentStart = requests[i].startTime;
774
+ currentEnd = requests[i].responseEnd;
775
+ }
776
+ }
777
+ totalNetworkTime += currentEnd - currentStart;
778
+ return totalNetworkTime;
779
+ }
780
+
781
+ var __defProp$K = Object.defineProperty;
782
+ var __defProps$t = Object.defineProperties;
783
+ var __getOwnPropDescs$t = Object.getOwnPropertyDescriptors;
784
+ var __getOwnPropSymbols$K = Object.getOwnPropertySymbols;
785
+ var __hasOwnProp$K = Object.prototype.hasOwnProperty;
786
+ var __propIsEnum$K = Object.prototype.propertyIsEnumerable;
787
+ var __defNormalProp$K = (obj, key, value) => key in obj ? __defProp$K(obj, key, { enumerable: true, configurable: true, writable: true, value }) : obj[key] = value;
788
+ var __spreadValues$K = (a, b) => {
789
+ for (var prop in b || (b = {}))
790
+ if (__hasOwnProp$K.call(b, prop))
791
+ __defNormalProp$K(a, prop, b[prop]);
792
+ if (__getOwnPropSymbols$K)
793
+ for (var prop of __getOwnPropSymbols$K(b)) {
794
+ if (__propIsEnum$K.call(b, prop))
795
+ __defNormalProp$K(a, prop, b[prop]);
796
+ }
797
+ return a;
798
+ };
799
+ var __spreadProps$t = (a, b) => __defProps$t(a, __getOwnPropDescs$t(b));
800
+ var __accessCheck$2 = (obj, member, msg) => {
801
+ if (!member.has(obj))
802
+ throw TypeError("Cannot " + msg);
803
+ };
804
+ var __privateGet$2 = (obj, member, getter) => {
805
+ __accessCheck$2(obj, member, "read from private field");
806
+ return getter ? getter.call(obj) : member.get(obj);
807
+ };
808
+ var __privateAdd$2 = (obj, member, value) => {
809
+ if (member.has(obj))
810
+ throw TypeError("Cannot add the same private member more than once");
811
+ member instanceof WeakSet ? member.add(obj) : member.set(obj, value);
812
+ };
813
+ var __privateSet$2 = (obj, member, value, setter) => {
814
+ __accessCheck$2(obj, member, "write to private field");
815
+ setter ? setter.call(obj, value) : member.set(obj, value);
816
+ return value;
817
+ };
818
+ var _running, _tryCompleteProfileFrameId;
819
+ function isQueryController(s) {
820
+ return "isQueryController" in s;
821
+ }
822
+ class SceneQueryController extends SceneObjectBase {
823
+ constructor(state = {}) {
824
+ super(__spreadProps$t(__spreadValues$K({}, state), { isRunning: false }));
825
+ this.isQueryController = true;
826
+ this.profiler = new SceneRenderProfiler(this);
827
+ __privateAdd$2(this, _running, /* @__PURE__ */ new Set());
828
+ __privateAdd$2(this, _tryCompleteProfileFrameId, null);
829
+ this.runningQueriesCount = () => {
830
+ return __privateGet$2(this, _running).size;
831
+ };
832
+ this.addActivationHandler(() => {
833
+ return () => __privateGet$2(this, _running).clear();
834
+ });
835
+ }
836
+ startProfile(source) {
837
+ if (!this.state.enableProfiling) {
838
+ return;
839
+ }
840
+ this.profiler.startProfile(source.constructor.name);
841
+ }
842
+ queryStarted(entry) {
843
+ __privateGet$2(this, _running).add(entry);
844
+ this.changeRunningQueryCount(1, entry);
845
+ if (!this.state.isRunning) {
846
+ this.setState({ isRunning: true });
847
+ }
848
+ }
849
+ queryCompleted(entry) {
850
+ if (!__privateGet$2(this, _running).has(entry)) {
851
+ return;
852
+ }
853
+ __privateGet$2(this, _running).delete(entry);
854
+ this.changeRunningQueryCount(-1);
855
+ if (__privateGet$2(this, _running).size === 0) {
856
+ this.setState({ isRunning: false });
857
+ }
858
+ }
859
+ changeRunningQueryCount(dir, entry) {
860
+ var _a;
861
+ window.__grafanaRunningQueryCount = ((_a = window.__grafanaRunningQueryCount) != null ? _a : 0) + dir;
862
+ if (dir === 1 && this.state.enableProfiling) {
863
+ if (entry) {
864
+ this.profiler.addCrumb(`${entry.origin.constructor.name}/${entry.type}`);
865
+ }
866
+ if (this.profiler.isTailRecording()) {
867
+ writeSceneLog(this.constructor.name, "New query started, cancelling tail recording");
868
+ this.profiler.cancelTailRecording();
869
+ }
870
+ }
871
+ if (this.state.enableProfiling) {
872
+ if (__privateGet$2(this, _tryCompleteProfileFrameId)) {
873
+ cancelAnimationFrame(__privateGet$2(this, _tryCompleteProfileFrameId));
874
+ }
875
+ __privateSet$2(this, _tryCompleteProfileFrameId, requestAnimationFrame(() => {
876
+ this.profiler.tryCompletingProfile();
877
+ }));
878
+ }
879
+ }
880
+ cancelAll() {
881
+ var _a;
882
+ for (const entry of __privateGet$2(this, _running).values()) {
883
+ (_a = entry.cancel) == null ? void 0 : _a.call(entry);
884
+ }
885
+ }
886
+ }
887
+ _running = new WeakMap();
888
+ _tryCompleteProfileFrameId = new WeakMap();
889
+
890
+ function getQueryController(sceneObject) {
891
+ let parent = sceneObject;
892
+ while (parent) {
893
+ if (parent.state.$behaviors) {
894
+ for (const behavior of parent.state.$behaviors) {
895
+ if (isQueryController(behavior)) {
896
+ return behavior;
897
+ }
898
+ }
899
+ }
900
+ parent = parent.parent;
901
+ }
902
+ return void 0;
903
+ }
904
+
607
905
  var __defProp$J = Object.defineProperty;
608
906
  var __getOwnPropSymbols$J = Object.getOwnPropertySymbols;
609
907
  var __hasOwnProp$J = Object.prototype.hasOwnProperty;
@@ -760,6 +1058,8 @@ class SceneTimeRange extends SceneObjectBase {
760
1058
  this.state.UNSAFE_nowDelay
761
1059
  );
762
1060
  if (update.from !== this.state.from || update.to !== this.state.to) {
1061
+ const queryController = getQueryController(this);
1062
+ queryController == null ? void 0 : queryController.startProfile(this);
763
1063
  this.setState(update);
764
1064
  }
765
1065
  };
@@ -1782,70 +2082,56 @@ function isDataLayer(obj) {
1782
2082
  return "isDataLayer" in obj;
1783
2083
  }
1784
2084
 
1785
- var __accessCheck$2 = (obj, member, msg) => {
1786
- if (!member.has(obj))
1787
- throw TypeError("Cannot " + msg);
1788
- };
1789
- var __privateGet$2 = (obj, member, getter) => {
1790
- __accessCheck$2(obj, member, "read from private field");
1791
- return getter ? getter.call(obj) : member.get(obj);
1792
- };
1793
- var __privateAdd$2 = (obj, member, value) => {
1794
- if (member.has(obj))
1795
- throw TypeError("Cannot add the same private member more than once");
1796
- member instanceof WeakSet ? member.add(obj) : member.set(obj, value);
1797
- };
1798
- var _running;
1799
- function isQueryController(s) {
1800
- return "isQueryController" in s;
1801
- }
1802
- class SceneQueryController extends SceneObjectBase {
1803
- constructor() {
1804
- super({ isRunning: false });
1805
- this.isQueryController = true;
1806
- __privateAdd$2(this, _running, /* @__PURE__ */ new Set());
1807
- this.addActivationHandler(() => {
1808
- return () => __privateGet$2(this, _running).clear();
1809
- });
1810
- }
1811
- queryStarted(entry) {
1812
- __privateGet$2(this, _running).add(entry);
1813
- this.changeRunningQueryCount(1);
1814
- if (!this.state.isRunning) {
1815
- this.setState({ isRunning: true });
1816
- }
1817
- }
1818
- queryCompleted(entry) {
1819
- if (!__privateGet$2(this, _running).has(entry)) {
1820
- return;
1821
- }
1822
- __privateGet$2(this, _running).delete(entry);
1823
- this.changeRunningQueryCount(-1);
1824
- if (__privateGet$2(this, _running).size === 0) {
1825
- this.setState({ isRunning: false });
1826
- }
1827
- }
1828
- changeRunningQueryCount(dir) {
1829
- var _a;
1830
- window.__grafanaRunningQueryCount = ((_a = window.__grafanaRunningQueryCount) != null ? _a : 0) + dir;
1831
- }
1832
- cancelAll() {
1833
- var _a;
1834
- for (const entry of __privateGet$2(this, _running).values()) {
1835
- (_a = entry.cancel) == null ? void 0 : _a.call(entry);
2085
+ function registerQueryWithController(entry) {
2086
+ return (queryStream) => {
2087
+ const queryControler = sceneGraph.getQueryController(entry.origin);
2088
+ if (!queryControler) {
2089
+ return queryStream;
1836
2090
  }
1837
- }
2091
+ return new rxjs.Observable((observer) => {
2092
+ if (!entry.cancel) {
2093
+ entry.cancel = () => observer.complete();
2094
+ }
2095
+ queryControler.queryStarted(entry);
2096
+ let markedAsCompleted = false;
2097
+ const sub = queryStream.subscribe({
2098
+ next: (v) => {
2099
+ if (!markedAsCompleted && v.state !== schema.LoadingState.Loading) {
2100
+ markedAsCompleted = true;
2101
+ queryControler.queryCompleted(entry);
2102
+ }
2103
+ observer.next(v);
2104
+ },
2105
+ error: (e) => observer.error(e),
2106
+ complete: () => {
2107
+ observer.complete();
2108
+ }
2109
+ });
2110
+ return () => {
2111
+ sub.unsubscribe();
2112
+ if (!markedAsCompleted) {
2113
+ queryControler.queryCompleted(entry);
2114
+ }
2115
+ };
2116
+ });
2117
+ };
1838
2118
  }
1839
- _running = new WeakMap();
1840
-
1841
- function writeSceneLog(logger, message, ...rest) {
1842
- let loggingEnabled = false;
1843
- if (typeof window !== "undefined") {
1844
- loggingEnabled = localStorage.getItem("grafana.debug.scenes") === "true";
1845
- }
1846
- if (loggingEnabled) {
1847
- console.log(`${logger}: `, message, ...rest);
1848
- }
2119
+ function wrapPromiseInStateObservable(promise) {
2120
+ console.log("wrapPromiseInStateObservable", promise);
2121
+ return new rxjs.Observable((observer) => {
2122
+ observer.next({ state: schema.LoadingState.Loading });
2123
+ const promiseObservable = rxjs.from(promise);
2124
+ promiseObservable.pipe(
2125
+ rxjs.map(() => ({ state: schema.LoadingState.Done })),
2126
+ rxjs.catchError(() => {
2127
+ observer.next({ state: schema.LoadingState.Error });
2128
+ return [];
2129
+ })
2130
+ ).subscribe({
2131
+ next: (result) => observer.next(result),
2132
+ complete: () => observer.complete()
2133
+ });
2134
+ });
1849
2135
  }
1850
2136
 
1851
2137
  async function getDataSource(datasource, scopedVars) {
@@ -1858,7 +2144,21 @@ async function getDataSource(datasource, scopedVars) {
1858
2144
  if (datasource && datasource.query) {
1859
2145
  return datasource;
1860
2146
  }
1861
- return await runtime.getDataSourceSrv().get(datasource, scopedVars);
2147
+ const dsPromise = runtime.getDataSourceSrv().get(datasource, scopedVars);
2148
+ if (scopedVars.__sceneObject && scopedVars.__sceneObject.value.valueOf()) {
2149
+ const queryControler = sceneGraph.getQueryController(scopedVars.__sceneObject.value.valueOf());
2150
+ if (queryControler && queryControler.state.enableProfiling) {
2151
+ wrapPromiseInStateObservable(dsPromise).pipe(
2152
+ registerQueryWithController({
2153
+ type: "plugin",
2154
+ origin: scopedVars.__sceneObject.value.valueOf()
2155
+ })
2156
+ ).subscribe(() => {
2157
+ });
2158
+ }
2159
+ }
2160
+ const result = await dsPromise;
2161
+ return result;
1862
2162
  }
1863
2163
 
1864
2164
  class VariableValueRecorder {
@@ -2106,41 +2406,6 @@ function findActiveAdHocFilterVariableByUid(dsUid) {
2106
2406
  return void 0;
2107
2407
  }
2108
2408
 
2109
- function registerQueryWithController(entry) {
2110
- return (queryStream) => {
2111
- const queryControler = sceneGraph.getQueryController(entry.origin);
2112
- if (!queryControler) {
2113
- return queryStream;
2114
- }
2115
- return new rxjs.Observable((observer) => {
2116
- if (!entry.cancel) {
2117
- entry.cancel = () => observer.complete();
2118
- }
2119
- queryControler.queryStarted(entry);
2120
- let markedAsCompleted = false;
2121
- const sub = queryStream.subscribe({
2122
- next: (v) => {
2123
- if (!markedAsCompleted && v.state !== schema.LoadingState.Loading) {
2124
- markedAsCompleted = true;
2125
- queryControler.queryCompleted(entry);
2126
- }
2127
- observer.next(v);
2128
- },
2129
- error: (e) => observer.error(e),
2130
- complete: () => {
2131
- observer.complete();
2132
- }
2133
- });
2134
- return () => {
2135
- sub.unsubscribe();
2136
- if (!markedAsCompleted) {
2137
- queryControler.queryCompleted(entry);
2138
- }
2139
- };
2140
- });
2141
- };
2142
- }
2143
-
2144
2409
  const allActiveGroupByVariables = /* @__PURE__ */ new Set();
2145
2410
  function findActiveGroupByVariablesByUid(dsUid) {
2146
2411
  var _a;
@@ -2520,6 +2785,7 @@ function VariableValueSelect({ model }) {
2520
2785
  const [inputValue, setInputValue] = React.useState("");
2521
2786
  const [hasCustomValue, setHasCustomValue] = React.useState(false);
2522
2787
  const selectValue = toSelectableValue$2(value, String(text));
2788
+ const queryController = sceneGraph.getQueryController(model);
2523
2789
  const optionSearcher = React.useMemo(() => getOptionSearcher(options, includeAll), [options, includeAll]);
2524
2790
  const onInputChange = (value2, { action }) => {
2525
2791
  if (action === "input-change") {
@@ -2559,6 +2825,7 @@ function VariableValueSelect({ model }) {
2559
2825
  "data-testid": e2eSelectors.selectors.pages.Dashboard.SubMenu.submenuItemValueDropDownValueLinkTexts(`${value}`),
2560
2826
  onChange: (newValue) => {
2561
2827
  model.changeValueTo(newValue.value, newValue.label);
2828
+ queryController == null ? void 0 : queryController.startProfile(model);
2562
2829
  if (hasCustomValue !== newValue.__isNew__) {
2563
2830
  setHasCustomValue(newValue.__isNew__);
2564
2831
  }
@@ -2570,6 +2837,7 @@ function VariableValueSelectMulti({ model }) {
2570
2837
  const arrayValue = React.useMemo(() => lodash.isArray(value) ? value : [value], [value]);
2571
2838
  const [uncommittedValue, setUncommittedValue] = React.useState(arrayValue);
2572
2839
  const [inputValue, setInputValue] = React.useState("");
2840
+ const queryController = sceneGraph.getQueryController(model);
2573
2841
  const optionSearcher = React.useMemo(() => getOptionSearcher(options, includeAll), [options, includeAll]);
2574
2842
  React.useEffect(() => {
2575
2843
  setUncommittedValue(arrayValue);
@@ -2610,6 +2878,7 @@ function VariableValueSelectMulti({ model }) {
2610
2878
  onInputChange,
2611
2879
  onBlur: () => {
2612
2880
  model.changeValueTo(uncommittedValue);
2881
+ queryController == null ? void 0 : queryController.startProfile(model);
2613
2882
  },
2614
2883
  filterOption: filterNoOp$2,
2615
2884
  "data-testid": e2eSelectors.selectors.pages.Dashboard.SubMenu.submenuItemValueDropDownValueLinkTexts(`${uncommittedValue}`),
@@ -4715,9 +4984,7 @@ class SceneQueryRunner extends SceneObjectBase {
4715
4984
  })
4716
4985
  );
4717
4986
  }
4718
- this.subscribeToTimeRangeChanges(
4719
- timeRange
4720
- );
4987
+ this.subscribeToTimeRangeChanges(timeRange);
4721
4988
  if (this.shouldRunQueriesOnActivate()) {
4722
4989
  this.runQueries();
4723
4990
  }
@@ -5962,20 +6229,6 @@ function getAncestor(sceneObject, ancestorType) {
5962
6229
  }
5963
6230
  return parent;
5964
6231
  }
5965
- function getQueryController(sceneObject) {
5966
- let parent = sceneObject;
5967
- while (parent) {
5968
- if (parent.state.$behaviors) {
5969
- for (const behavior of parent.state.$behaviors) {
5970
- if (isQueryController(behavior)) {
5971
- return behavior;
5972
- }
5973
- }
5974
- }
5975
- parent = parent.parent;
5976
- }
5977
- return void 0;
5978
- }
5979
6232
 
5980
6233
  const sceneGraph = {
5981
6234
  getVariables,
@@ -6855,7 +7108,13 @@ class VizPanel extends SceneObjectBase {
6855
7108
  } else {
6856
7109
  const { importPanelPlugin } = runtime.getPluginImportUtils();
6857
7110
  try {
6858
- const result = await importPanelPlugin(pluginId);
7111
+ const panelPromise = importPanelPlugin(pluginId);
7112
+ const queryControler = sceneGraph.getQueryController(this);
7113
+ if (queryControler && queryControler.state.enableProfiling) {
7114
+ wrapPromiseInStateObservable(panelPromise).pipe(registerQueryWithController({ type: "plugin", origin: this })).subscribe(() => {
7115
+ });
7116
+ }
7117
+ const result = await panelPromise;
6859
7118
  this._pluginLoaded(result, overwriteOptions, overwriteFieldConfig, isAfterPluginChange);
6860
7119
  } catch (err) {
6861
7120
  this._pluginLoaded(getPanelPluginNotFound(pluginId));
@@ -6924,11 +7183,7 @@ class VizPanel extends SceneObjectBase {
6924
7183
  }
6925
7184
  async changePluginType(pluginId, newOptions, newFieldConfig) {
6926
7185
  var _a, _b;
6927
- const {
6928
- options: prevOptions,
6929
- fieldConfig: prevFieldConfig,
6930
- pluginId: prevPluginId
6931
- } = this.state;
7186
+ const { options: prevOptions, fieldConfig: prevFieldConfig, pluginId: prevPluginId } = this.state;
6932
7187
  this._dataWithFieldConfig = void 0;
6933
7188
  await this._loadPlugin(pluginId, newOptions != null ? newOptions : {}, newFieldConfig, true);
6934
7189
  const panel = {
@@ -10273,6 +10528,7 @@ class SceneRefreshPicker extends SceneObjectBase {
10273
10528
  this._autoRefreshBlocked = false;
10274
10529
  this.onRefresh = () => {
10275
10530
  const queryController = sceneGraph.getQueryController(this);
10531
+ queryController == null ? void 0 : queryController.startProfile(this);
10276
10532
  if (queryController == null ? void 0 : queryController.state.isRunning) {
10277
10533
  queryController.cancelAll();
10278
10534
  return;
@@ -10401,7 +10657,9 @@ function SceneRefreshPickerRenderer({ model }) {
10401
10657
  tooltip,
10402
10658
  width,
10403
10659
  text,
10404
- onRefresh: model.onRefresh,
10660
+ onRefresh: () => {
10661
+ model.onRefresh();
10662
+ },
10405
10663
  primary,
10406
10664
  onIntervalChanged: model.onIntervalChanged,
10407
10665
  isLoading: isRunning,