@grafana/scenes 5.25.1--canary.967.11837797508.0 → 5.25.1--canary.858.11930656504.0
Sign up to get free protection for your applications and to get access to all the features.
- package/CHANGELOG.md +6 -6
- package/dist/esm/behaviors/SceneQueryController.js +60 -5
- package/dist/esm/behaviors/SceneQueryController.js.map +1 -1
- package/dist/esm/behaviors/SceneRenderProfiler.js +169 -0
- package/dist/esm/behaviors/SceneRenderProfiler.js.map +1 -0
- package/dist/esm/components/SceneRefreshPicker.js +6 -1
- package/dist/esm/components/SceneRefreshPicker.js.map +1 -1
- package/dist/esm/components/VizPanel/VizPanel.js +9 -6
- package/dist/esm/components/VizPanel/VizPanel.js.map +1 -1
- package/dist/esm/core/SceneTimeRange.js +3 -0
- package/dist/esm/core/SceneTimeRange.js.map +1 -1
- package/dist/esm/core/sceneGraph/getQueryController.js +19 -0
- package/dist/esm/core/sceneGraph/getQueryController.js.map +1 -0
- package/dist/esm/core/sceneGraph/index.js +3 -3
- package/dist/esm/core/sceneGraph/index.js.map +1 -1
- package/dist/esm/core/sceneGraph/sceneGraph.js +1 -26
- package/dist/esm/core/sceneGraph/sceneGraph.js.map +1 -1
- package/dist/esm/core/sceneGraph/utils.js +0 -2
- package/dist/esm/core/sceneGraph/utils.js.map +1 -1
- package/dist/esm/index.js.map +1 -1
- package/dist/esm/querying/SceneQueryRunner.js +1 -3
- package/dist/esm/querying/SceneQueryRunner.js.map +1 -1
- package/dist/esm/querying/registerQueryWithController.js +18 -2
- package/dist/esm/querying/registerQueryWithController.js.map +1 -1
- package/dist/esm/utils/getDataSource.js +17 -1
- package/dist/esm/utils/getDataSource.js.map +1 -1
- package/dist/esm/variables/adhoc/AdHocFilterRenderer.js +12 -8
- package/dist/esm/variables/adhoc/AdHocFilterRenderer.js.map +1 -1
- package/dist/esm/variables/adhoc/AdHocFiltersVariableUrlSyncHandler.js +1 -4
- package/dist/esm/variables/adhoc/AdHocFiltersVariableUrlSyncHandler.js.map +1 -1
- package/dist/esm/variables/components/VariableValueSelect.js +5 -0
- package/dist/esm/variables/components/VariableValueSelect.js.map +1 -1
- package/dist/esm/variables/utils.js.map +1 -1
- package/dist/esm/variables/variants/TestVariable.js.map +1 -1
- package/dist/index.d.ts +44 -32
- package/dist/index.js +480 -232
- package/dist/index.js.map +1 -1
- package/package.json +2 -2
package/CHANGELOG.md
CHANGED
@@ -455,7 +455,7 @@
|
|
455
455
|
|
456
456
|
#### UrlSync: Support browser history steps, remove singleton ([#878](https://github.com/grafana/scenes/pull/878))
|
457
457
|
|
458
|
-
getUrlSyncManager is no longer exported as UrlSyncManager is now no longer global singleton but local to the UrlSyncContextProvider.
|
458
|
+
getUrlSyncManager is no longer exported as UrlSyncManager is now no longer global singleton but local to the UrlSyncContextProvider.
|
459
459
|
If you called getUrlSyncManager().getUrlState that util function is available via the exported object sceneUtils.
|
460
460
|
|
461
461
|
---
|
@@ -671,7 +671,7 @@ Brings a fix for [variables interpolation bug](https://github.com/grafana/scenes
|
|
671
671
|
|
672
672
|
#### 🚀 Enhancement
|
673
673
|
|
674
|
-
- Allow setting _skipOnLayoutChange in SceneGridLayout [#849](https://github.com/grafana/scenes/pull/849) ([@kaydelaney](https://github.com/kaydelaney))
|
674
|
+
- Allow setting \_skipOnLayoutChange in SceneGridLayout [#849](https://github.com/grafana/scenes/pull/849) ([@kaydelaney](https://github.com/kaydelaney))
|
675
675
|
|
676
676
|
#### Authors: 1
|
677
677
|
|
@@ -707,7 +707,7 @@ Brings a fix for [variables interpolation bug](https://github.com/grafana/scenes
|
|
707
707
|
|
708
708
|
#### 🚀 Enhancement
|
709
709
|
|
710
|
-
- Wrap
|
710
|
+
- Wrap \_\_sceneObject scoped var in an serialisable wrapper [#828](https://github.com/grafana/scenes/pull/828) ([@dprokop](https://github.com/dprokop))
|
711
711
|
|
712
712
|
#### Authors: 1
|
713
713
|
|
@@ -1035,7 +1035,7 @@ Brings a fix for [variables interpolation bug](https://github.com/grafana/scenes
|
|
1035
1035
|
|
1036
1036
|
#### 🚀 Enhancement
|
1037
1037
|
|
1038
|
-
- Variables: Add support to read only variables
|
1038
|
+
- Variables: Add support to read only variables and expose missing types for custom variables in core grafana [#781](https://github.com/grafana/scenes/pull/781) ([@axelavargas](https://github.com/axelavargas))
|
1039
1039
|
|
1040
1040
|
#### Authors: 1
|
1041
1041
|
|
@@ -1556,7 +1556,7 @@ Brings a fix for [variables interpolation bug](https://github.com/grafana/scenes
|
|
1556
1556
|
|
1557
1557
|
#### 🚀 Enhancement
|
1558
1558
|
|
1559
|
-
- Fix ${
|
1559
|
+
- Fix ${\_\_all_variables} not updating their value in panels [#698](https://github.com/grafana/scenes/pull/698) ([@axelavargas](https://github.com/axelavargas))
|
1560
1560
|
|
1561
1561
|
#### Authors: 1
|
1562
1562
|
|
@@ -1664,7 +1664,7 @@ Brings a fix for [variables interpolation bug](https://github.com/grafana/scenes
|
|
1664
1664
|
|
1665
1665
|
#### 🐛 Bug Fix
|
1666
1666
|
|
1667
|
-
- Clone SceneQueryRunner together with _results [#681](https://github.com/grafana/scenes/pull/681) ([@mdvictor](https://github.com/mdvictor))
|
1667
|
+
- Clone SceneQueryRunner together with \_results [#681](https://github.com/grafana/scenes/pull/681) ([@mdvictor](https://github.com/mdvictor))
|
1668
1668
|
|
1669
1669
|
#### Authors: 1
|
1670
1670
|
|
@@ -1,5 +1,26 @@
|
|
1
1
|
import { SceneObjectBase } from '../core/SceneObjectBase.js';
|
2
|
+
import { writeSceneLog } from '../utils/writeSceneLog.js';
|
3
|
+
import { SceneRenderProfiler } from './SceneRenderProfiler.js';
|
2
4
|
|
5
|
+
var __defProp = Object.defineProperty;
|
6
|
+
var __defProps = Object.defineProperties;
|
7
|
+
var __getOwnPropDescs = Object.getOwnPropertyDescriptors;
|
8
|
+
var __getOwnPropSymbols = Object.getOwnPropertySymbols;
|
9
|
+
var __hasOwnProp = Object.prototype.hasOwnProperty;
|
10
|
+
var __propIsEnum = Object.prototype.propertyIsEnumerable;
|
11
|
+
var __defNormalProp = (obj, key, value) => key in obj ? __defProp(obj, key, { enumerable: true, configurable: true, writable: true, value }) : obj[key] = value;
|
12
|
+
var __spreadValues = (a, b) => {
|
13
|
+
for (var prop in b || (b = {}))
|
14
|
+
if (__hasOwnProp.call(b, prop))
|
15
|
+
__defNormalProp(a, prop, b[prop]);
|
16
|
+
if (__getOwnPropSymbols)
|
17
|
+
for (var prop of __getOwnPropSymbols(b)) {
|
18
|
+
if (__propIsEnum.call(b, prop))
|
19
|
+
__defNormalProp(a, prop, b[prop]);
|
20
|
+
}
|
21
|
+
return a;
|
22
|
+
};
|
23
|
+
var __spreadProps = (a, b) => __defProps(a, __getOwnPropDescs(b));
|
3
24
|
var __accessCheck = (obj, member, msg) => {
|
4
25
|
if (!member.has(obj))
|
5
26
|
throw TypeError("Cannot " + msg);
|
@@ -13,22 +34,38 @@ var __privateAdd = (obj, member, value) => {
|
|
13
34
|
throw TypeError("Cannot add the same private member more than once");
|
14
35
|
member instanceof WeakSet ? member.add(obj) : member.set(obj, value);
|
15
36
|
};
|
16
|
-
var
|
37
|
+
var __privateSet = (obj, member, value, setter) => {
|
38
|
+
__accessCheck(obj, member, "write to private field");
|
39
|
+
setter ? setter.call(obj, value) : member.set(obj, value);
|
40
|
+
return value;
|
41
|
+
};
|
42
|
+
var _running, _tryCompleteProfileFrameId;
|
17
43
|
function isQueryController(s) {
|
18
44
|
return "isQueryController" in s;
|
19
45
|
}
|
20
46
|
class SceneQueryController extends SceneObjectBase {
|
21
|
-
constructor() {
|
22
|
-
super({ isRunning: false });
|
47
|
+
constructor(state = {}) {
|
48
|
+
super(__spreadProps(__spreadValues({}, state), { isRunning: false }));
|
23
49
|
this.isQueryController = true;
|
50
|
+
this.profiler = new SceneRenderProfiler(this);
|
24
51
|
__privateAdd(this, _running, /* @__PURE__ */ new Set());
|
52
|
+
__privateAdd(this, _tryCompleteProfileFrameId, null);
|
53
|
+
this.runningQueriesCount = () => {
|
54
|
+
return __privateGet(this, _running).size;
|
55
|
+
};
|
25
56
|
this.addActivationHandler(() => {
|
26
57
|
return () => __privateGet(this, _running).clear();
|
27
58
|
});
|
28
59
|
}
|
60
|
+
startProfile(source) {
|
61
|
+
if (!this.state.enableProfiling) {
|
62
|
+
return;
|
63
|
+
}
|
64
|
+
this.profiler.startProfile(source.constructor.name);
|
65
|
+
}
|
29
66
|
queryStarted(entry) {
|
30
67
|
__privateGet(this, _running).add(entry);
|
31
|
-
this.changeRunningQueryCount(1);
|
68
|
+
this.changeRunningQueryCount(1, entry);
|
32
69
|
if (!this.state.isRunning) {
|
33
70
|
this.setState({ isRunning: true });
|
34
71
|
}
|
@@ -43,9 +80,26 @@ class SceneQueryController extends SceneObjectBase {
|
|
43
80
|
this.setState({ isRunning: false });
|
44
81
|
}
|
45
82
|
}
|
46
|
-
changeRunningQueryCount(dir) {
|
83
|
+
changeRunningQueryCount(dir, entry) {
|
47
84
|
var _a;
|
48
85
|
window.__grafanaRunningQueryCount = ((_a = window.__grafanaRunningQueryCount) != null ? _a : 0) + dir;
|
86
|
+
if (dir === 1 && this.state.enableProfiling) {
|
87
|
+
if (entry) {
|
88
|
+
this.profiler.addCrumb(`${entry.origin.constructor.name}/${entry.type}`);
|
89
|
+
}
|
90
|
+
if (this.profiler.isTailRecording()) {
|
91
|
+
writeSceneLog(this.constructor.name, "New query started, cancelling tail recording");
|
92
|
+
this.profiler.cancelTailRecording();
|
93
|
+
}
|
94
|
+
}
|
95
|
+
if (this.state.enableProfiling) {
|
96
|
+
if (__privateGet(this, _tryCompleteProfileFrameId)) {
|
97
|
+
cancelAnimationFrame(__privateGet(this, _tryCompleteProfileFrameId));
|
98
|
+
}
|
99
|
+
__privateSet(this, _tryCompleteProfileFrameId, requestAnimationFrame(() => {
|
100
|
+
this.profiler.tryCompletingProfile();
|
101
|
+
}));
|
102
|
+
}
|
49
103
|
}
|
50
104
|
cancelAll() {
|
51
105
|
var _a;
|
@@ -55,6 +109,7 @@ class SceneQueryController extends SceneObjectBase {
|
|
55
109
|
}
|
56
110
|
}
|
57
111
|
_running = new WeakMap();
|
112
|
+
_tryCompleteProfileFrameId = new WeakMap();
|
58
113
|
|
59
114
|
export { SceneQueryController, isQueryController };
|
60
115
|
//# sourceMappingURL=SceneQueryController.js.map
|
@@ -1 +1 @@
|
|
1
|
-
{"version":3,"file":"SceneQueryController.js","sources":["../../../src/behaviors/SceneQueryController.ts"],"sourcesContent":["import { SceneObjectBase } from '../core/SceneObjectBase';\nimport { SceneObject,
|
1
|
+
{"version":3,"file":"SceneQueryController.js","sources":["../../../src/behaviors/SceneQueryController.ts"],"sourcesContent":["import { SceneObjectBase } from '../core/SceneObjectBase';\nimport { SceneObject, SceneStatelessBehavior } from '../core/types';\nimport { writeSceneLog } from '../utils/writeSceneLog';\nimport { SceneRenderProfiler } from './SceneRenderProfiler';\nimport { SceneQueryControllerEntry, SceneQueryControllerLike, SceneQueryStateControllerState } from './types';\n\nexport function isQueryController(s: SceneObject | SceneStatelessBehavior): s is SceneQueryControllerLike {\n return 'isQueryController' in s;\n}\n\nexport class SceneQueryController\n extends SceneObjectBase<SceneQueryStateControllerState>\n implements SceneQueryControllerLike\n{\n public isQueryController: true = true;\n private profiler = new SceneRenderProfiler(this);\n\n #running = new Set<SceneQueryControllerEntry>();\n\n #tryCompleteProfileFrameId: number | null = null;\n\n // lastFrameTime: number = 0;\n\n public constructor(state: Partial<SceneQueryStateControllerState> = {}) {\n super({ ...state, isRunning: false });\n\n // Clear running state on deactivate\n this.addActivationHandler(() => {\n return () => this.#running.clear();\n });\n }\n\n public runningQueriesCount = () => {\n return this.#running.size;\n };\n public startProfile(source: SceneObject) {\n if (!this.state.enableProfiling) {\n return;\n }\n this.profiler.startProfile(source.constructor.name);\n }\n\n public queryStarted(entry: SceneQueryControllerEntry) {\n this.#running.add(entry);\n this.changeRunningQueryCount(1, entry);\n\n if (!this.state.isRunning) {\n this.setState({ isRunning: true });\n }\n }\n\n public queryCompleted(entry: SceneQueryControllerEntry) {\n if (!this.#running.has(entry)) {\n return;\n }\n\n this.#running.delete(entry);\n\n this.changeRunningQueryCount(-1);\n\n if (this.#running.size === 0) {\n this.setState({ isRunning: false });\n }\n }\n\n private changeRunningQueryCount(dir: 1 | -1, entry?: SceneQueryControllerEntry) {\n /**\n * Used by grafana-image-renderer to know when all queries are completed.\n */\n (window as any).__grafanaRunningQueryCount = ((window as any).__grafanaRunningQueryCount ?? 0) + dir;\n\n // console.log('\\tRunning queries:', (window as any).__grafanaRunningQueryCount);\n if (dir === 1 && this.state.enableProfiling) {\n if (entry) {\n // Collect profile crumbs, variables, annotations, queries and plugins\n this.profiler.addCrumb(`${entry.origin.constructor.name}/${entry.type}`);\n }\n if (this.profiler.isTailRecording()) {\n writeSceneLog(this.constructor.name, 'New query started, cancelling tail recording');\n this.profiler.cancelTailRecording();\n }\n }\n\n if (this.state.enableProfiling) {\n // Delegate to next frame to check if all queries are completed\n // This is to account for scenarios when there's \"yet another\" query that's started\n if (this.#tryCompleteProfileFrameId) {\n cancelAnimationFrame(this.#tryCompleteProfileFrameId);\n }\n\n this.#tryCompleteProfileFrameId = requestAnimationFrame(() => {\n this.profiler.tryCompletingProfile();\n });\n }\n }\n\n public cancelAll() {\n for (const entry of this.#running.values()) {\n entry.cancel?.();\n }\n }\n}\n"],"names":[],"mappings":"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"}
|
@@ -0,0 +1,169 @@
|
|
1
|
+
import { writeSceneLog } from '../utils/writeSceneLog.js';
|
2
|
+
|
3
|
+
var __accessCheck = (obj, member, msg) => {
|
4
|
+
if (!member.has(obj))
|
5
|
+
throw TypeError("Cannot " + msg);
|
6
|
+
};
|
7
|
+
var __privateGet = (obj, member, getter) => {
|
8
|
+
__accessCheck(obj, member, "read from private field");
|
9
|
+
return getter ? getter.call(obj) : member.get(obj);
|
10
|
+
};
|
11
|
+
var __privateAdd = (obj, member, value) => {
|
12
|
+
if (member.has(obj))
|
13
|
+
throw TypeError("Cannot add the same private member more than once");
|
14
|
+
member instanceof WeakSet ? member.add(obj) : member.set(obj, value);
|
15
|
+
};
|
16
|
+
var __privateSet = (obj, member, value, setter) => {
|
17
|
+
__accessCheck(obj, member, "write to private field");
|
18
|
+
setter ? setter.call(obj, value) : member.set(obj, value);
|
19
|
+
return value;
|
20
|
+
};
|
21
|
+
var _profileInProgress, _profileStartTs, _trailAnimationFrameId, _recordedTrailingSpans;
|
22
|
+
const POST_STORM_WINDOW = 2e3;
|
23
|
+
const SPAN_THRESHOLD = 30;
|
24
|
+
class SceneRenderProfiler {
|
25
|
+
constructor(queryController) {
|
26
|
+
this.queryController = queryController;
|
27
|
+
__privateAdd(this, _profileInProgress, null);
|
28
|
+
__privateAdd(this, _profileStartTs, null);
|
29
|
+
__privateAdd(this, _trailAnimationFrameId, null);
|
30
|
+
__privateAdd(this, _recordedTrailingSpans, []);
|
31
|
+
this.lastFrameTime = 0;
|
32
|
+
this.measureTrailingFrames = (measurementStartTs, lastFrameTime, profileStartTs) => {
|
33
|
+
const currentFrameTime = performance.now();
|
34
|
+
const frameLength = currentFrameTime - lastFrameTime;
|
35
|
+
__privateGet(this, _recordedTrailingSpans).push(frameLength);
|
36
|
+
if (currentFrameTime - measurementStartTs < POST_STORM_WINDOW) {
|
37
|
+
__privateSet(this, _trailAnimationFrameId, requestAnimationFrame(
|
38
|
+
() => this.measureTrailingFrames(measurementStartTs, currentFrameTime, profileStartTs)
|
39
|
+
));
|
40
|
+
} else {
|
41
|
+
const slowFrames = processRecordedSpans(__privateGet(this, _recordedTrailingSpans));
|
42
|
+
const slowFramesTime = slowFrames.reduce((acc, val) => acc + val, 0);
|
43
|
+
writeSceneLog(
|
44
|
+
this.constructor.name,
|
45
|
+
"Profile tail recorded, slow frames duration:",
|
46
|
+
slowFramesTime,
|
47
|
+
slowFrames,
|
48
|
+
__privateGet(this, _profileInProgress)
|
49
|
+
);
|
50
|
+
__privateSet(this, _recordedTrailingSpans, []);
|
51
|
+
const profileDuration = measurementStartTs - profileStartTs;
|
52
|
+
writeSceneLog(
|
53
|
+
this.constructor.name,
|
54
|
+
"Stoped recording, total measured time (network included):",
|
55
|
+
profileDuration + slowFramesTime
|
56
|
+
);
|
57
|
+
__privateSet(this, _trailAnimationFrameId, null);
|
58
|
+
const profileEndTs = profileStartTs + profileDuration + slowFramesTime;
|
59
|
+
performance.measure("DashboardInteraction", {
|
60
|
+
start: profileStartTs,
|
61
|
+
end: profileEndTs
|
62
|
+
});
|
63
|
+
const networkDuration = captureNetwork(profileStartTs, profileEndTs);
|
64
|
+
if (this.queryController.state.onProfileComplete) {
|
65
|
+
this.queryController.state.onProfileComplete({
|
66
|
+
origin: __privateGet(this, _profileInProgress).origin,
|
67
|
+
crumbs: __privateGet(this, _profileInProgress).crumbs,
|
68
|
+
duration: profileDuration + slowFramesTime,
|
69
|
+
networkDuration,
|
70
|
+
jsHeapSizeLimit: performance.memory ? performance.memory.jsHeapSizeLimit : 0,
|
71
|
+
usedJSHeapSize: performance.memory ? performance.memory.usedJSHeapSize : 0,
|
72
|
+
totalJSHeapSize: performance.memory ? performance.memory.totalJSHeapSize : 0
|
73
|
+
});
|
74
|
+
}
|
75
|
+
if (window.__runs) {
|
76
|
+
window.__runs += `${Date.now()}, ${profileDuration + slowFramesTime}
|
77
|
+
`;
|
78
|
+
} else {
|
79
|
+
window.__runs = `${Date.now()}, ${profileDuration + slowFramesTime}
|
80
|
+
`;
|
81
|
+
}
|
82
|
+
}
|
83
|
+
};
|
84
|
+
}
|
85
|
+
startProfile(name) {
|
86
|
+
if (__privateGet(this, _trailAnimationFrameId)) {
|
87
|
+
cancelAnimationFrame(__privateGet(this, _trailAnimationFrameId));
|
88
|
+
__privateSet(this, _trailAnimationFrameId, null);
|
89
|
+
writeSceneLog(this.constructor.name, "New profile: Stopped recording frames");
|
90
|
+
}
|
91
|
+
__privateSet(this, _profileInProgress, { origin: name, crumbs: [] });
|
92
|
+
__privateSet(this, _profileStartTs, performance.now());
|
93
|
+
writeSceneLog(this.constructor.name, "Profile started:", __privateGet(this, _profileInProgress), __privateGet(this, _profileStartTs));
|
94
|
+
}
|
95
|
+
recordProfileTail(measurementStartTime, profileStartTs) {
|
96
|
+
__privateSet(this, _trailAnimationFrameId, requestAnimationFrame(
|
97
|
+
() => this.measureTrailingFrames(measurementStartTime, measurementStartTime, profileStartTs)
|
98
|
+
));
|
99
|
+
}
|
100
|
+
tryCompletingProfile() {
|
101
|
+
writeSceneLog(this.constructor.name, "Trying to complete profile", __privateGet(this, _profileInProgress));
|
102
|
+
if (this.queryController.runningQueriesCount() === 0 && __privateGet(this, _profileInProgress)) {
|
103
|
+
writeSceneLog(this.constructor.name, "All queries completed, stopping profile");
|
104
|
+
this.recordProfileTail(performance.now(), __privateGet(this, _profileStartTs));
|
105
|
+
}
|
106
|
+
}
|
107
|
+
isTailRecording() {
|
108
|
+
return Boolean(__privateGet(this, _trailAnimationFrameId));
|
109
|
+
}
|
110
|
+
cancelTailRecording() {
|
111
|
+
if (__privateGet(this, _trailAnimationFrameId)) {
|
112
|
+
cancelAnimationFrame(__privateGet(this, _trailAnimationFrameId));
|
113
|
+
__privateSet(this, _trailAnimationFrameId, null);
|
114
|
+
writeSceneLog(this.constructor.name, "Cancelled recording frames, new profile started");
|
115
|
+
}
|
116
|
+
}
|
117
|
+
addCrumb(crumb) {
|
118
|
+
if (__privateGet(this, _profileInProgress)) {
|
119
|
+
__privateGet(this, _profileInProgress).crumbs.push(crumb);
|
120
|
+
}
|
121
|
+
}
|
122
|
+
}
|
123
|
+
_profileInProgress = new WeakMap();
|
124
|
+
_profileStartTs = new WeakMap();
|
125
|
+
_trailAnimationFrameId = new WeakMap();
|
126
|
+
_recordedTrailingSpans = new WeakMap();
|
127
|
+
function processRecordedSpans(spans) {
|
128
|
+
for (let i = spans.length - 1; i >= 0; i--) {
|
129
|
+
if (spans[i] > SPAN_THRESHOLD) {
|
130
|
+
return spans.slice(0, i + 1);
|
131
|
+
}
|
132
|
+
}
|
133
|
+
return [spans[0]];
|
134
|
+
}
|
135
|
+
function captureNetwork(startTs, endTs) {
|
136
|
+
const entries = performance.getEntriesByType("resource");
|
137
|
+
performance.clearResourceTimings();
|
138
|
+
const networkEntries = entries.filter((entry) => entry.startTime >= startTs && entry.startTime <= endTs);
|
139
|
+
for (const entry of networkEntries) {
|
140
|
+
performance.measure("Network entry " + entry.name, {
|
141
|
+
start: entry.startTime,
|
142
|
+
end: entry.responseEnd
|
143
|
+
});
|
144
|
+
}
|
145
|
+
return calculateNetworkTime(networkEntries);
|
146
|
+
}
|
147
|
+
function calculateNetworkTime(requests) {
|
148
|
+
if (requests.length === 0) {
|
149
|
+
return 0;
|
150
|
+
}
|
151
|
+
requests.sort((a, b) => a.startTime - b.startTime);
|
152
|
+
let totalNetworkTime = 0;
|
153
|
+
let currentStart = requests[0].startTime;
|
154
|
+
let currentEnd = requests[0].responseEnd;
|
155
|
+
for (let i = 1; i < requests.length; i++) {
|
156
|
+
if (requests[i].startTime <= currentEnd) {
|
157
|
+
currentEnd = Math.max(currentEnd, requests[i].responseEnd);
|
158
|
+
} else {
|
159
|
+
totalNetworkTime += currentEnd - currentStart;
|
160
|
+
currentStart = requests[i].startTime;
|
161
|
+
currentEnd = requests[i].responseEnd;
|
162
|
+
}
|
163
|
+
}
|
164
|
+
totalNetworkTime += currentEnd - currentStart;
|
165
|
+
return totalNetworkTime;
|
166
|
+
}
|
167
|
+
|
168
|
+
export { SceneRenderProfiler, calculateNetworkTime, processRecordedSpans };
|
169
|
+
//# sourceMappingURL=SceneRenderProfiler.js.map
|
@@ -0,0 +1 @@
|
|
1
|
+
{"version":3,"file":"SceneRenderProfiler.js","sources":["../../../src/behaviors/SceneRenderProfiler.ts"],"sourcesContent":["import { writeSceneLog } from '../utils/writeSceneLog';\nimport { SceneQueryControllerLike } from './types';\n\nconst POST_STORM_WINDOW = 2000; // Time after last query to observe slow frames\nconst SPAN_THRESHOLD = 30; // Frames longer than this will be considered slow\n\nexport class SceneRenderProfiler {\n #profileInProgress: {\n // Profile origin, i.e. scene refresh picker\n origin: string;\n crumbs: string[];\n } | null = null;\n\n #profileStartTs: number | null = null;\n #trailAnimationFrameId: number | null = null;\n\n // Will keep measured lengths trailing frames\n #recordedTrailingSpans: number[] = [];\n\n lastFrameTime: number = 0;\n\n public constructor(private queryController: SceneQueryControllerLike) {}\n\n public startProfile(name: string) {\n if (this.#trailAnimationFrameId) {\n cancelAnimationFrame(this.#trailAnimationFrameId);\n this.#trailAnimationFrameId = null;\n\n writeSceneLog(this.constructor.name, 'New profile: Stopped recording frames');\n }\n\n this.#profileInProgress = { origin: name, crumbs: [] };\n this.#profileStartTs = performance.now();\n writeSceneLog(this.constructor.name, 'Profile started:', this.#profileInProgress, this.#profileStartTs);\n }\n\n private recordProfileTail(measurementStartTime: number, profileStartTs: number) {\n this.#trailAnimationFrameId = requestAnimationFrame(() =>\n this.measureTrailingFrames(measurementStartTime, measurementStartTime, profileStartTs)\n );\n }\n\n private measureTrailingFrames = (measurementStartTs: number, lastFrameTime: number, profileStartTs: number) => {\n const currentFrameTime = performance.now();\n const frameLength = currentFrameTime - lastFrameTime;\n this.#recordedTrailingSpans.push(frameLength);\n\n if (currentFrameTime - measurementStartTs! < POST_STORM_WINDOW) {\n this.#trailAnimationFrameId = requestAnimationFrame(() =>\n this.measureTrailingFrames(measurementStartTs, currentFrameTime, profileStartTs)\n );\n } else {\n const slowFrames = processRecordedSpans(this.#recordedTrailingSpans);\n const slowFramesTime = slowFrames.reduce((acc, val) => acc + val, 0);\n\n writeSceneLog(\n this.constructor.name,\n 'Profile tail recorded, slow frames duration:',\n slowFramesTime,\n slowFrames,\n this.#profileInProgress\n );\n\n this.#recordedTrailingSpans = [];\n\n const profileDuration = measurementStartTs - profileStartTs;\n\n writeSceneLog(\n this.constructor.name,\n 'Stoped recording, total measured time (network included):',\n profileDuration + slowFramesTime\n );\n this.#trailAnimationFrameId = null;\n\n // performance.measure('DashboardInteraction tail', {\n // start: measurementStartTs,\n // end: measurementStartTs + n,\n // });\n\n const profileEndTs = profileStartTs + profileDuration + slowFramesTime;\n\n performance.measure('DashboardInteraction', {\n start: profileStartTs,\n end: profileEndTs,\n });\n\n const networkDuration = captureNetwork(profileStartTs, profileEndTs);\n\n if (this.queryController.state.onProfileComplete) {\n this.queryController.state.onProfileComplete({\n origin: this.#profileInProgress!.origin,\n crumbs: this.#profileInProgress!.crumbs,\n duration: profileDuration + slowFramesTime,\n networkDuration,\n // @ts-ignore\n jsHeapSizeLimit: performance.memory ? performance.memory.jsHeapSizeLimit : 0,\n // @ts-ignore\n usedJSHeapSize: performance.memory ? performance.memory.usedJSHeapSize : 0,\n // @ts-ignore\n totalJSHeapSize: performance.memory ? performance.memory.totalJSHeapSize : 0,\n });\n }\n // @ts-ignore\n if (window.__runs) {\n // @ts-ignore\n window.__runs += `${Date.now()}, ${profileDuration + slowFramesTime}\\n`;\n } else {\n // @ts-ignore\n window.__runs = `${Date.now()}, ${profileDuration + slowFramesTime}\\n`;\n }\n }\n };\n\n public tryCompletingProfile() {\n writeSceneLog(this.constructor.name, 'Trying to complete profile', this.#profileInProgress);\n\n if (this.queryController.runningQueriesCount() === 0 && this.#profileInProgress) {\n writeSceneLog(this.constructor.name, 'All queries completed, stopping profile');\n this.recordProfileTail(performance.now(), this.#profileStartTs!);\n }\n }\n\n public isTailRecording() {\n return Boolean(this.#trailAnimationFrameId);\n }\n public cancelTailRecording() {\n if (this.#trailAnimationFrameId) {\n cancelAnimationFrame(this.#trailAnimationFrameId);\n this.#trailAnimationFrameId = null;\n writeSceneLog(this.constructor.name, 'Cancelled recording frames, new profile started');\n }\n }\n\n public addCrumb(crumb: string) {\n if (this.#profileInProgress) {\n this.#profileInProgress.crumbs.push(crumb);\n }\n }\n}\n\nexport function processRecordedSpans(spans: number[]) {\n // identify last span in spans that's bigger than SPAN_THRESHOLD\n for (let i = spans.length - 1; i >= 0; i--) {\n if (spans[i] > SPAN_THRESHOLD) {\n return spans.slice(0, i + 1);\n }\n }\n return [spans[0]];\n}\n\nfunction captureNetwork(startTs: number, endTs: number) {\n const entries = performance.getEntriesByType('resource');\n performance.clearResourceTimings();\n const networkEntries = entries.filter((entry) => entry.startTime >= startTs && entry.startTime <= endTs);\n for (const entry of networkEntries) {\n performance.measure('Network entry ' + entry.name, {\n start: entry.startTime,\n end: entry.responseEnd,\n });\n }\n\n return calculateNetworkTime(networkEntries);\n}\n\n// Will calculate total time spent on Network\nexport function calculateNetworkTime(requests: PerformanceResourceTiming[]): number {\n if (requests.length === 0) {\n return 0;\n }\n\n // Step 1: Sort the requests by startTs\n requests.sort((a, b) => a.startTime - b.startTime);\n\n // Step 2: Initialize variables\n let totalNetworkTime = 0;\n let currentStart = requests[0].startTime;\n let currentEnd = requests[0].responseEnd;\n\n // Step 3: Iterate through the sorted list and merge overlapping intervals\n for (let i = 1; i < requests.length; i++) {\n if (requests[i].startTime <= currentEnd) {\n // Overlapping intervals, merge them\n currentEnd = Math.max(currentEnd, requests[i].responseEnd);\n } else {\n // Non-overlapping interval, add the duration to total time\n totalNetworkTime += currentEnd - currentStart;\n\n // Update current interval\n currentStart = requests[i].startTime;\n currentEnd = requests[i].responseEnd;\n }\n }\n\n // Step 4: Add the last interval\n totalNetworkTime += currentEnd - currentStart;\n\n return totalNetworkTime;\n}\n"],"names":[],"mappings":"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"}
|
@@ -50,6 +50,7 @@ class SceneRefreshPicker extends SceneObjectBase {
|
|
50
50
|
this._autoRefreshBlocked = false;
|
51
51
|
this.onRefresh = () => {
|
52
52
|
const queryController = sceneGraph.getQueryController(this);
|
53
|
+
queryController == null ? void 0 : queryController.startProfile(this);
|
53
54
|
if (queryController == null ? void 0 : queryController.state.isRunning) {
|
54
55
|
queryController.cancelAll();
|
55
56
|
return;
|
@@ -105,6 +106,8 @@ class SceneRefreshPicker extends SceneObjectBase {
|
|
105
106
|
}
|
106
107
|
this._intervalTimer = setInterval(() => {
|
107
108
|
if (this.isTabVisible()) {
|
109
|
+
const queryController = sceneGraph.getQueryController(this);
|
110
|
+
queryController == null ? void 0 : queryController.startProfile(this);
|
108
111
|
timeRange.onRefresh();
|
109
112
|
} else {
|
110
113
|
this._autoRefreshBlocked = true;
|
@@ -178,7 +181,9 @@ function SceneRefreshPickerRenderer({ model }) {
|
|
178
181
|
tooltip,
|
179
182
|
width,
|
180
183
|
text,
|
181
|
-
onRefresh:
|
184
|
+
onRefresh: () => {
|
185
|
+
model.onRefresh();
|
186
|
+
},
|
182
187
|
primary,
|
183
188
|
onIntervalChanged: model.onIntervalChanged,
|
184
189
|
isLoading: isRunning,
|
@@ -1 +1 @@
|
|
1
|
-
{"version":3,"file":"SceneRefreshPicker.js","sources":["../../../src/components/SceneRefreshPicker.tsx"],"sourcesContent":["import React from 'react';\nimport { Unsubscribable } from 'rxjs';\nimport { rangeUtil } from '@grafana/data';\nimport { config } from '@grafana/runtime';\nimport { RefreshPicker } from '@grafana/ui';\n\nimport { SceneObjectBase } from '../core/SceneObjectBase';\nimport { sceneGraph } from '../core/sceneGraph';\nimport { SceneComponentProps, SceneObject, SceneObjectState, SceneObjectUrlValues } from '../core/types';\nimport { SceneObjectUrlSyncConfig } from '../services/SceneObjectUrlSyncConfig';\n\nexport const DEFAULT_INTERVALS = ['5s', '10s', '30s', '1m', '5m', '15m', '30m', '1h', '2h', '1d'];\n\nexport interface SceneRefreshPickerState extends SceneObjectState {\n /**\n * Refresh interval, e.g. 5s, 1m, 2h\n */\n refresh: string;\n autoEnabled?: boolean;\n autoMinInterval?: string;\n autoValue?: string;\n /**\n * List of allowed refresh intervals, e.g. ['5s', '1m']\n */\n intervals?: string[];\n isOnCanvas?: boolean;\n primary?: boolean;\n withText?: boolean;\n /**\n * Overrides the default minRefreshInterval from the grafana config. Can be set to \"0s\" to remove the minimum refresh interval.\n */\n minRefreshInterval?: string;\n}\n\nexport class SceneRefreshPicker extends SceneObjectBase<SceneRefreshPickerState> {\n public static Component = SceneRefreshPickerRenderer;\n protected _urlSync = new SceneObjectUrlSyncConfig(this, { keys: ['refresh'] });\n private _intervalTimer: ReturnType<typeof setInterval> | undefined;\n private _autoTimeRangeListener: Unsubscribable | undefined;\n private _autoRefreshBlocked: boolean = false;\n\n public constructor(state: Partial<SceneRefreshPickerState>) {\n const filterDissalowedIntervals = (i: string) => {\n const minInterval = state.minRefreshInterval ?? config.minRefreshInterval;\n try {\n return minInterval ? rangeUtil.intervalToMs(i) >= rangeUtil.intervalToMs(minInterval) : true;\n } catch (e) {\n // Unable to parse interval\n return false;\n }\n };\n\n super({\n refresh: '',\n ...state,\n autoValue: undefined,\n autoEnabled: state.autoEnabled ?? true,\n autoMinInterval: state.autoMinInterval ?? config.minRefreshInterval,\n intervals: (state.intervals ?? DEFAULT_INTERVALS).filter(filterDissalowedIntervals),\n });\n\n this.addActivationHandler(() => {\n this.setupIntervalTimer();\n\n const onVisibilityChange = () => {\n if (this._autoRefreshBlocked && document.visibilityState === 'visible') {\n this._autoRefreshBlocked = false;\n this.onRefresh();\n }\n };\n\n document.addEventListener('visibilitychange', onVisibilityChange);\n\n return () => {\n if (this._intervalTimer) {\n clearInterval(this._intervalTimer);\n }\n\n document.removeEventListener('visibilitychange', onVisibilityChange);\n this._autoTimeRangeListener?.unsubscribe();\n };\n });\n }\n\n public onRefresh = () => {\n const queryController = sceneGraph.getQueryController(this);\n if (queryController?.state.isRunning) {\n queryController.cancelAll();\n return;\n }\n\n const timeRange = sceneGraph.getTimeRange(this);\n\n if (this._intervalTimer) {\n clearInterval(this._intervalTimer);\n }\n\n timeRange.onRefresh();\n this.setupIntervalTimer();\n };\n\n public onIntervalChanged = (interval: string) => {\n this.setState({ refresh: interval });\n this.setupIntervalTimer();\n };\n\n public getUrlState() {\n let refresh: string | undefined = this.state.refresh;\n\n if (typeof refresh !== 'string' || refresh.length === 0) {\n refresh = undefined;\n }\n\n return { refresh };\n }\n\n public updateFromUrl(values: SceneObjectUrlValues) {\n const { intervals } = this.state;\n let refresh = values.refresh;\n\n if (typeof refresh === 'string' && isIntervalString(refresh)) {\n if (intervals?.includes(refresh)) {\n this.setState({ refresh });\n } else {\n this.setState({\n // Default to the first refresh interval if the interval from the URL is not allowed, just like in the old architecture.\n refresh: intervals ? intervals[0] : undefined,\n });\n }\n }\n }\n\n private setupAutoTimeRangeListener = () => {\n // If the time range has changed, we need to recalculate the auto interval but prevent unnecessary processing\n return sceneGraph.getTimeRange(this).subscribeToState((newState, prevState) => {\n if (newState.from !== prevState.from || newState.to !== prevState.to) {\n this.setupIntervalTimer();\n }\n });\n };\n\n private calculateAutoRefreshInterval = () => {\n const timeRange = sceneGraph.getTimeRange(this);\n const resolution = window?.innerWidth ?? 2000;\n return rangeUtil.calculateInterval(timeRange.state.value, resolution, this.state.autoMinInterval);\n };\n\n private isTabVisible() {\n return document.visibilityState === undefined || document.visibilityState === 'visible';\n }\n\n private setupIntervalTimer = () => {\n const timeRange = sceneGraph.getTimeRange(this);\n const { refresh, intervals } = this.state;\n\n if (this._intervalTimer || refresh === '') {\n clearInterval(this._intervalTimer);\n }\n\n if (refresh === '') {\n return;\n }\n\n // If the provided interval is not allowed\n if (refresh !== RefreshPicker.autoOption.value && intervals && !intervals.includes(refresh)) {\n return;\n }\n\n let intervalMs: number;\n\n // Unsubscribe from previous listener no matter what\n this._autoTimeRangeListener?.unsubscribe();\n\n if (refresh === RefreshPicker.autoOption.value) {\n const autoRefreshInterval = this.calculateAutoRefreshInterval();\n\n intervalMs = autoRefreshInterval.intervalMs;\n\n this._autoTimeRangeListener = this.setupAutoTimeRangeListener();\n\n if (autoRefreshInterval.interval !== this.state.autoValue) {\n this.setState({ autoValue: autoRefreshInterval.interval });\n }\n } else {\n intervalMs = rangeUtil.intervalToMs(refresh);\n }\n\n this._intervalTimer = setInterval(() => {\n if (this.isTabVisible()) {\n timeRange.onRefresh();\n } else {\n this._autoRefreshBlocked = true;\n }\n }, intervalMs);\n };\n}\n\nexport function SceneRefreshPickerRenderer({ model }: SceneComponentProps<SceneRefreshPicker>) {\n const { refresh, intervals, autoEnabled, autoValue, isOnCanvas, primary, withText } = model.useState();\n const isRunning = useQueryControllerState(model);\n\n let text = refresh === RefreshPicker.autoOption?.value ? autoValue : withText ? 'Refresh' : undefined;\n let tooltip: string | undefined;\n let width: string | undefined;\n\n if (isRunning) {\n tooltip = 'Cancel all queries';\n\n if (withText) {\n text = 'Cancel';\n }\n }\n\n if (withText) {\n width = '96px';\n }\n\n return (\n <RefreshPicker\n showAutoInterval={autoEnabled}\n value={refresh}\n intervals={intervals}\n tooltip={tooltip}\n width={width}\n text={text}\n onRefresh={model.onRefresh}\n primary={primary}\n onIntervalChanged={model.onIntervalChanged}\n isLoading={isRunning}\n isOnCanvas={isOnCanvas ?? true}\n />\n );\n}\n\nfunction useQueryControllerState(model: SceneObject): boolean {\n const queryController = sceneGraph.getQueryController(model);\n if (!queryController) {\n return false;\n }\n\n return queryController.useState().isRunning;\n}\n\nfunction isIntervalString(str: string): boolean {\n try {\n const res = rangeUtil.describeInterval(str);\n return res.count > 0;\n } catch {\n return false;\n }\n}\n"],"names":["_a"],"mappings":"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"}
|
1
|
+
{"version":3,"file":"SceneRefreshPicker.js","sources":["../../../src/components/SceneRefreshPicker.tsx"],"sourcesContent":["import React from 'react';\nimport { Unsubscribable } from 'rxjs';\nimport { rangeUtil } from '@grafana/data';\nimport { config } from '@grafana/runtime';\nimport { RefreshPicker } from '@grafana/ui';\n\nimport { SceneObjectBase } from '../core/SceneObjectBase';\nimport { sceneGraph } from '../core/sceneGraph';\nimport { SceneComponentProps, SceneObject, SceneObjectState, SceneObjectUrlValues } from '../core/types';\nimport { SceneObjectUrlSyncConfig } from '../services/SceneObjectUrlSyncConfig';\n\nexport const DEFAULT_INTERVALS = ['5s', '10s', '30s', '1m', '5m', '15m', '30m', '1h', '2h', '1d'];\n\nexport interface SceneRefreshPickerState extends SceneObjectState {\n /**\n * Refresh interval, e.g. 5s, 1m, 2h\n */\n refresh: string;\n autoEnabled?: boolean;\n autoMinInterval?: string;\n autoValue?: string;\n /**\n * List of allowed refresh intervals, e.g. ['5s', '1m']\n */\n intervals?: string[];\n isOnCanvas?: boolean;\n primary?: boolean;\n withText?: boolean;\n /**\n * Overrides the default minRefreshInterval from the grafana config. Can be set to \"0s\" to remove the minimum refresh interval.\n */\n minRefreshInterval?: string;\n}\n\nexport class SceneRefreshPicker extends SceneObjectBase<SceneRefreshPickerState> {\n public static Component = SceneRefreshPickerRenderer;\n protected _urlSync = new SceneObjectUrlSyncConfig(this, { keys: ['refresh'] });\n private _intervalTimer: ReturnType<typeof setInterval> | undefined;\n private _autoTimeRangeListener: Unsubscribable | undefined;\n private _autoRefreshBlocked: boolean = false;\n\n public constructor(state: Partial<SceneRefreshPickerState>) {\n const filterDissalowedIntervals = (i: string) => {\n const minInterval = state.minRefreshInterval ?? config.minRefreshInterval;\n try {\n return minInterval ? rangeUtil.intervalToMs(i) >= rangeUtil.intervalToMs(minInterval) : true;\n } catch (e) {\n // Unable to parse interval\n return false;\n }\n };\n\n super({\n refresh: '',\n ...state,\n autoValue: undefined,\n autoEnabled: state.autoEnabled ?? true,\n autoMinInterval: state.autoMinInterval ?? config.minRefreshInterval,\n intervals: (state.intervals ?? DEFAULT_INTERVALS).filter(filterDissalowedIntervals),\n });\n\n this.addActivationHandler(() => {\n this.setupIntervalTimer();\n\n const onVisibilityChange = () => {\n if (this._autoRefreshBlocked && document.visibilityState === 'visible') {\n this._autoRefreshBlocked = false;\n this.onRefresh();\n }\n };\n\n document.addEventListener('visibilitychange', onVisibilityChange);\n\n return () => {\n if (this._intervalTimer) {\n clearInterval(this._intervalTimer);\n }\n\n document.removeEventListener('visibilitychange', onVisibilityChange);\n this._autoTimeRangeListener?.unsubscribe();\n };\n });\n }\n\n public onRefresh = () => {\n const queryController = sceneGraph.getQueryController(this);\n\n queryController?.startProfile(this);\n\n if (queryController?.state.isRunning) {\n queryController.cancelAll();\n return;\n }\n\n const timeRange = sceneGraph.getTimeRange(this);\n\n if (this._intervalTimer) {\n clearInterval(this._intervalTimer);\n }\n\n timeRange.onRefresh();\n this.setupIntervalTimer();\n };\n\n public onIntervalChanged = (interval: string) => {\n this.setState({ refresh: interval });\n this.setupIntervalTimer();\n };\n\n public getUrlState() {\n let refresh: string | undefined = this.state.refresh;\n\n if (typeof refresh !== 'string' || refresh.length === 0) {\n refresh = undefined;\n }\n\n return { refresh };\n }\n\n public updateFromUrl(values: SceneObjectUrlValues) {\n const { intervals } = this.state;\n let refresh = values.refresh;\n\n if (typeof refresh === 'string' && isIntervalString(refresh)) {\n if (intervals?.includes(refresh)) {\n this.setState({ refresh });\n } else {\n this.setState({\n // Default to the first refresh interval if the interval from the URL is not allowed, just like in the old architecture.\n refresh: intervals ? intervals[0] : undefined,\n });\n }\n }\n }\n\n private setupAutoTimeRangeListener = () => {\n // If the time range has changed, we need to recalculate the auto interval but prevent unnecessary processing\n return sceneGraph.getTimeRange(this).subscribeToState((newState, prevState) => {\n if (newState.from !== prevState.from || newState.to !== prevState.to) {\n this.setupIntervalTimer();\n }\n });\n };\n\n private calculateAutoRefreshInterval = () => {\n const timeRange = sceneGraph.getTimeRange(this);\n const resolution = window?.innerWidth ?? 2000;\n return rangeUtil.calculateInterval(timeRange.state.value, resolution, this.state.autoMinInterval);\n };\n\n private isTabVisible() {\n return document.visibilityState === undefined || document.visibilityState === 'visible';\n }\n\n private setupIntervalTimer = () => {\n const timeRange = sceneGraph.getTimeRange(this);\n const { refresh, intervals } = this.state;\n\n if (this._intervalTimer || refresh === '') {\n clearInterval(this._intervalTimer);\n }\n\n if (refresh === '') {\n return;\n }\n\n // If the provided interval is not allowed\n if (refresh !== RefreshPicker.autoOption.value && intervals && !intervals.includes(refresh)) {\n return;\n }\n\n let intervalMs: number;\n\n // Unsubscribe from previous listener no matter what\n this._autoTimeRangeListener?.unsubscribe();\n\n if (refresh === RefreshPicker.autoOption.value) {\n const autoRefreshInterval = this.calculateAutoRefreshInterval();\n\n intervalMs = autoRefreshInterval.intervalMs;\n\n this._autoTimeRangeListener = this.setupAutoTimeRangeListener();\n\n if (autoRefreshInterval.interval !== this.state.autoValue) {\n this.setState({ autoValue: autoRefreshInterval.interval });\n }\n } else {\n intervalMs = rangeUtil.intervalToMs(refresh);\n }\n\n this._intervalTimer = setInterval(() => {\n if (this.isTabVisible()) {\n const queryController = sceneGraph.getQueryController(this);\n queryController?.startProfile(this);\n timeRange.onRefresh();\n } else {\n this._autoRefreshBlocked = true;\n }\n }, intervalMs);\n };\n}\n\nexport function SceneRefreshPickerRenderer({ model }: SceneComponentProps<SceneRefreshPicker>) {\n const { refresh, intervals, autoEnabled, autoValue, isOnCanvas, primary, withText } = model.useState();\n const isRunning = useQueryControllerState(model);\n\n let text = refresh === RefreshPicker.autoOption?.value ? autoValue : withText ? 'Refresh' : undefined;\n let tooltip: string | undefined;\n let width: string | undefined;\n\n if (isRunning) {\n tooltip = 'Cancel all queries';\n\n if (withText) {\n text = 'Cancel';\n }\n }\n\n if (withText) {\n width = '96px';\n }\n\n return (\n <RefreshPicker\n showAutoInterval={autoEnabled}\n value={refresh}\n intervals={intervals}\n tooltip={tooltip}\n width={width}\n text={text}\n onRefresh={() => {\n model.onRefresh();\n }}\n primary={primary}\n onIntervalChanged={model.onIntervalChanged}\n isLoading={isRunning}\n isOnCanvas={isOnCanvas ?? true}\n />\n );\n}\n\nfunction useQueryControllerState(model: SceneObject): boolean {\n const queryController = sceneGraph.getQueryController(model);\n if (!queryController) {\n return false;\n }\n\n return queryController.useState().isRunning;\n}\n\nfunction isIntervalString(str: string): boolean {\n try {\n const res = rangeUtil.describeInterval(str);\n return res.count > 0;\n } catch {\n return false;\n }\n}\n"],"names":["_a"],"mappings":"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"}
|
@@ -13,6 +13,7 @@ import { mergeWith, cloneDeep, isArray, merge, isEmpty } from 'lodash';
|
|
13
13
|
import { UserActionEvent } from '../../core/events.js';
|
14
14
|
import { evaluateTimeRange } from '../../utils/evaluateTimeRange.js';
|
15
15
|
import { LiveNowTimer } from '../../behaviors/LiveNowTimer.js';
|
16
|
+
import { wrapPromiseInStateObservable, registerQueryWithController } from '../../querying/registerQueryWithController.js';
|
16
17
|
|
17
18
|
var __defProp = Object.defineProperty;
|
18
19
|
var __defProps = Object.defineProperties;
|
@@ -209,7 +210,13 @@ class VizPanel extends SceneObjectBase {
|
|
209
210
|
} else {
|
210
211
|
const { importPanelPlugin } = getPluginImportUtils();
|
211
212
|
try {
|
212
|
-
const
|
213
|
+
const panelPromise = importPanelPlugin(pluginId);
|
214
|
+
const queryControler = sceneGraph.getQueryController(this);
|
215
|
+
if (queryControler && queryControler.state.enableProfiling) {
|
216
|
+
wrapPromiseInStateObservable(panelPromise).pipe(registerQueryWithController({ type: "plugin", origin: this })).subscribe(() => {
|
217
|
+
});
|
218
|
+
}
|
219
|
+
const result = await panelPromise;
|
213
220
|
this._pluginLoaded(result, overwriteOptions, overwriteFieldConfig, isAfterPluginChange);
|
214
221
|
} catch (err) {
|
215
222
|
this._pluginLoaded(getPanelPluginNotFound(pluginId));
|
@@ -278,11 +285,7 @@ class VizPanel extends SceneObjectBase {
|
|
278
285
|
}
|
279
286
|
async changePluginType(pluginId, newOptions, newFieldConfig) {
|
280
287
|
var _a, _b;
|
281
|
-
const {
|
282
|
-
options: prevOptions,
|
283
|
-
fieldConfig: prevFieldConfig,
|
284
|
-
pluginId: prevPluginId
|
285
|
-
} = this.state;
|
288
|
+
const { options: prevOptions, fieldConfig: prevFieldConfig, pluginId: prevPluginId } = this.state;
|
286
289
|
this._dataWithFieldConfig = void 0;
|
287
290
|
const isAfterPluginChange = this.state.pluginId !== pluginId;
|
288
291
|
await this._loadPlugin(pluginId, newOptions != null ? newOptions : {}, newFieldConfig, isAfterPluginChange);
|