@grafana/scenes 6.35.0--canary.1240.17499066940.0 → 6.35.1--canary.1235.17607489973.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +26 -0
- package/dist/esm/behaviors/LongFrameDetector.js +185 -0
- package/dist/esm/behaviors/LongFrameDetector.js.map +1 -0
- package/dist/esm/behaviors/SceneRenderProfiler.js +103 -19
- package/dist/esm/behaviors/SceneRenderProfiler.js.map +1 -1
- package/dist/esm/behaviors/index.js +0 -1
- package/dist/esm/behaviors/index.js.map +1 -1
- package/dist/esm/components/layout/grid/SceneGridLayout.js +14 -0
- package/dist/esm/components/layout/grid/SceneGridLayout.js.map +1 -1
- package/dist/esm/components/layout/grid/SceneGridLayoutRenderer.js +8 -9
- package/dist/esm/components/layout/grid/SceneGridLayoutRenderer.js.map +1 -1
- package/dist/esm/core/sceneGraph/index.js +0 -2
- package/dist/esm/core/sceneGraph/index.js.map +1 -1
- package/dist/esm/index.js +1 -0
- package/dist/esm/index.js.map +1 -1
- package/dist/esm/locales/cs-CZ/grafana-scenes.json.js +4 -0
- package/dist/esm/locales/cs-CZ/grafana-scenes.json.js.map +1 -1
- package/dist/esm/locales/de-DE/grafana-scenes.json.js +4 -0
- package/dist/esm/locales/de-DE/grafana-scenes.json.js.map +1 -1
- package/dist/esm/locales/es-ES/grafana-scenes.json.js +4 -0
- package/dist/esm/locales/es-ES/grafana-scenes.json.js.map +1 -1
- package/dist/esm/locales/fr-FR/grafana-scenes.json.js +4 -0
- package/dist/esm/locales/fr-FR/grafana-scenes.json.js.map +1 -1
- package/dist/esm/locales/hu-HU/grafana-scenes.json.js +4 -0
- package/dist/esm/locales/hu-HU/grafana-scenes.json.js.map +1 -1
- package/dist/esm/locales/id-ID/grafana-scenes.json.js +4 -0
- package/dist/esm/locales/id-ID/grafana-scenes.json.js.map +1 -1
- package/dist/esm/locales/it-IT/grafana-scenes.json.js +4 -0
- package/dist/esm/locales/it-IT/grafana-scenes.json.js.map +1 -1
- package/dist/esm/locales/ja-JP/grafana-scenes.json.js +4 -0
- package/dist/esm/locales/ja-JP/grafana-scenes.json.js.map +1 -1
- package/dist/esm/locales/ko-KR/grafana-scenes.json.js +4 -0
- package/dist/esm/locales/ko-KR/grafana-scenes.json.js.map +1 -1
- package/dist/esm/locales/nl-NL/grafana-scenes.json.js +4 -0
- package/dist/esm/locales/nl-NL/grafana-scenes.json.js.map +1 -1
- package/dist/esm/locales/pl-PL/grafana-scenes.json.js +4 -0
- package/dist/esm/locales/pl-PL/grafana-scenes.json.js.map +1 -1
- package/dist/esm/locales/pt-BR/grafana-scenes.json.js +4 -0
- package/dist/esm/locales/pt-BR/grafana-scenes.json.js.map +1 -1
- package/dist/esm/locales/pt-PT/grafana-scenes.json.js +4 -0
- package/dist/esm/locales/pt-PT/grafana-scenes.json.js.map +1 -1
- package/dist/esm/locales/ru-RU/grafana-scenes.json.js +4 -0
- package/dist/esm/locales/ru-RU/grafana-scenes.json.js.map +1 -1
- package/dist/esm/locales/sv-SE/grafana-scenes.json.js +4 -0
- package/dist/esm/locales/sv-SE/grafana-scenes.json.js.map +1 -1
- package/dist/esm/locales/tr-TR/grafana-scenes.json.js +4 -0
- package/dist/esm/locales/tr-TR/grafana-scenes.json.js.map +1 -1
- package/dist/esm/locales/zh-Hans/grafana-scenes.json.js +4 -0
- package/dist/esm/locales/zh-Hans/grafana-scenes.json.js.map +1 -1
- package/dist/esm/locales/zh-Hant/grafana-scenes.json.js +4 -0
- package/dist/esm/locales/zh-Hant/grafana-scenes.json.js.map +1 -1
- package/dist/esm/utils/writeSceneLog.js +10 -1
- package/dist/esm/utils/writeSceneLog.js.map +1 -1
- package/dist/esm/variables/adhoc/AdHocFiltersCombobox/AdHocFiltersCombobox.js +0 -9
- package/dist/esm/variables/adhoc/AdHocFiltersCombobox/AdHocFiltersCombobox.js.map +1 -1
- package/dist/esm/variables/groupby/GroupByVariable.js +0 -8
- package/dist/esm/variables/groupby/GroupByVariable.js.map +1 -1
- package/dist/{grafana-scenes-CgIzGE5F.js → grafana-scenes-BbJq3cEa.js} +5 -1
- package/dist/{grafana-scenes-B0JDDOYY.js.map → grafana-scenes-BbJq3cEa.js.map} +1 -1
- package/dist/{grafana-scenes-B3ypGD5T.js → grafana-scenes-BbRDYrqK.js} +5 -1
- package/dist/{grafana-scenes-B3ypGD5T.js.map → grafana-scenes-BbRDYrqK.js.map} +1 -1
- package/dist/{grafana-scenes-CY85TD5F.js → grafana-scenes-BcDO8gk4.js} +5 -1
- package/dist/{grafana-scenes-BGCbMCFm.js.map → grafana-scenes-BcDO8gk4.js.map} +1 -1
- package/dist/{grafana-scenes-CqRf9pRc.js → grafana-scenes-BtGEpoZT.js} +5 -1
- package/dist/{grafana-scenes-Br6NPcwR.js.map → grafana-scenes-BtGEpoZT.js.map} +1 -1
- package/dist/{grafana-scenes-Br6NPcwR.js → grafana-scenes-BwQ_A3lk.js} +5 -1
- package/dist/grafana-scenes-BwQ_A3lk.js.map +1 -0
- package/dist/{grafana-scenes-B0JDDOYY.js → grafana-scenes-C-CibbsO.js} +5 -1
- package/dist/grafana-scenes-C-CibbsO.js.map +1 -0
- package/dist/{grafana-scenes-Dy2CLUY9.js → grafana-scenes-CMtHJ23j.js} +5 -1
- package/dist/grafana-scenes-CMtHJ23j.js.map +1 -0
- package/dist/{grafana-scenes-DObtL2WT.js → grafana-scenes-CS09sc_L.js} +5 -1
- package/dist/grafana-scenes-CS09sc_L.js.map +1 -0
- package/dist/{grafana-scenes-DXM1LI4B.js → grafana-scenes-CfoPR_PZ.js} +5 -1
- package/dist/grafana-scenes-CfoPR_PZ.js.map +1 -0
- package/dist/{grafana-scenes-Cub9Gl0n.js → grafana-scenes-CixWq8rH.js} +5 -1
- package/dist/grafana-scenes-CixWq8rH.js.map +1 -0
- package/dist/{grafana-scenes-DlUSL8jI.js → grafana-scenes-CoXR5Z7T.js} +5 -1
- package/dist/grafana-scenes-CoXR5Z7T.js.map +1 -0
- package/dist/{grafana-scenes-CeVkPanY.js → grafana-scenes-CqMfWT-f.js} +5 -1
- package/dist/grafana-scenes-CqMfWT-f.js.map +1 -0
- package/dist/{grafana-scenes-n10eQkNF.js → grafana-scenes-CzZTvOrf.js} +5 -1
- package/dist/grafana-scenes-CzZTvOrf.js.map +1 -0
- package/dist/{grafana-scenes-BGCbMCFm.js → grafana-scenes-VOzZRdKp.js} +5 -1
- package/dist/grafana-scenes-VOzZRdKp.js.map +1 -0
- package/dist/{grafana-scenes-CBRfJ-2H.js → grafana-scenes-cTJt4LR7.js} +5 -1
- package/dist/grafana-scenes-cTJt4LR7.js.map +1 -0
- package/dist/{grafana-scenes-D5qs_fc9.js → grafana-scenes-kfW02M-K.js} +5 -1
- package/dist/grafana-scenes-kfW02M-K.js.map +1 -0
- package/dist/{grafana-scenes-COr0P0oM.js → grafana-scenes-naZktXG6.js} +5 -1
- package/dist/grafana-scenes-naZktXG6.js.map +1 -0
- package/dist/{grafana-scenes-YMli37Xh.js → grafana-scenes-zGpJY4O3.js} +5 -1
- package/dist/grafana-scenes-zGpJY4O3.js.map +1 -0
- package/dist/index.d.ts +32 -31
- package/dist/index.js +720 -545
- package/dist/index.js.map +1 -1
- package/package.json +2 -2
- package/dist/esm/behaviors/SceneInteractionProfiler.js +0 -88
- package/dist/esm/behaviors/SceneInteractionProfiler.js.map +0 -1
- package/dist/esm/core/sceneGraph/getInteractionProfiler.js +0 -19
- package/dist/esm/core/sceneGraph/getInteractionProfiler.js.map +0 -1
- package/dist/grafana-scenes-CBRfJ-2H.js.map +0 -1
- package/dist/grafana-scenes-COr0P0oM.js.map +0 -1
- package/dist/grafana-scenes-CY85TD5F.js.map +0 -1
- package/dist/grafana-scenes-CeVkPanY.js.map +0 -1
- package/dist/grafana-scenes-CgIzGE5F.js.map +0 -1
- package/dist/grafana-scenes-CqRf9pRc.js.map +0 -1
- package/dist/grafana-scenes-Cub9Gl0n.js.map +0 -1
- package/dist/grafana-scenes-D5qs_fc9.js.map +0 -1
- package/dist/grafana-scenes-DObtL2WT.js.map +0 -1
- package/dist/grafana-scenes-DXM1LI4B.js.map +0 -1
- package/dist/grafana-scenes-DlUSL8jI.js.map +0 -1
- package/dist/grafana-scenes-Dy2CLUY9.js.map +0 -1
- package/dist/grafana-scenes-YMli37Xh.js.map +0 -1
- package/dist/grafana-scenes-n10eQkNF.js.map +0 -1
package/dist/index.js
CHANGED
|
@@ -599,6 +599,15 @@ function writeSceneLog(logger, message, ...rest) {
|
|
|
599
599
|
console.log(`${logger}: `, message, ...rest);
|
|
600
600
|
}
|
|
601
601
|
}
|
|
602
|
+
function writeSceneLogStyled(logger, message, style, ...rest) {
|
|
603
|
+
let loggingEnabled = false;
|
|
604
|
+
if (typeof window !== "undefined") {
|
|
605
|
+
loggingEnabled = localStorage.getItem("grafana.debug.scenes") === "true";
|
|
606
|
+
}
|
|
607
|
+
if (loggingEnabled) {
|
|
608
|
+
console.log(`%c${logger}: ${message}`, style, ...rest);
|
|
609
|
+
}
|
|
610
|
+
}
|
|
602
611
|
|
|
603
612
|
var __typeError$4 = (msg) => {
|
|
604
613
|
throw TypeError(msg);
|
|
@@ -607,352 +616,6 @@ var __accessCheck$4 = (obj, member, msg) => member.has(obj) || __typeError$4("Ca
|
|
|
607
616
|
var __privateGet$4 = (obj, member, getter) => (__accessCheck$4(obj, member, "read from private field"), getter ? getter.call(obj) : member.get(obj));
|
|
608
617
|
var __privateAdd$4 = (obj, member, value) => member.has(obj) ? __typeError$4("Cannot add the same private member more than once") : member instanceof WeakSet ? member.add(obj) : member.set(obj, value);
|
|
609
618
|
var __privateSet$4 = (obj, member, value, setter) => (__accessCheck$4(obj, member, "write to private field"), member.set(obj, value), value);
|
|
610
|
-
var _profileInProgress$1, _profileStartTs, _trailAnimationFrameId, _recordedTrailingSpans, _visibilityChangeHandler;
|
|
611
|
-
const POST_STORM_WINDOW = 2e3;
|
|
612
|
-
const SPAN_THRESHOLD = 30;
|
|
613
|
-
const TAB_INACTIVE_THRESHOLD = 1e3;
|
|
614
|
-
class SceneRenderProfiler {
|
|
615
|
-
constructor(queryController) {
|
|
616
|
-
this.queryController = queryController;
|
|
617
|
-
__privateAdd$4(this, _profileInProgress$1, null);
|
|
618
|
-
__privateAdd$4(this, _profileStartTs, null);
|
|
619
|
-
__privateAdd$4(this, _trailAnimationFrameId, null);
|
|
620
|
-
// Will keep measured lengths trailing frames
|
|
621
|
-
__privateAdd$4(this, _recordedTrailingSpans, []);
|
|
622
|
-
__privateAdd$4(this, _visibilityChangeHandler, null);
|
|
623
|
-
this.measureTrailingFrames = (measurementStartTs, lastFrameTime, profileStartTs) => {
|
|
624
|
-
var _a;
|
|
625
|
-
const currentFrameTime = performance.now();
|
|
626
|
-
const frameLength = currentFrameTime - lastFrameTime;
|
|
627
|
-
if (frameLength > TAB_INACTIVE_THRESHOLD) {
|
|
628
|
-
writeSceneLog("SceneRenderProfiler", "Tab was inactive, cancelling profile measurement");
|
|
629
|
-
this.cancelProfile();
|
|
630
|
-
return;
|
|
631
|
-
}
|
|
632
|
-
__privateGet$4(this, _recordedTrailingSpans).push(frameLength);
|
|
633
|
-
if (currentFrameTime - measurementStartTs < POST_STORM_WINDOW) {
|
|
634
|
-
if (__privateGet$4(this, _profileInProgress$1)) {
|
|
635
|
-
__privateSet$4(this, _trailAnimationFrameId, requestAnimationFrame(
|
|
636
|
-
() => this.measureTrailingFrames(measurementStartTs, currentFrameTime, profileStartTs)
|
|
637
|
-
));
|
|
638
|
-
}
|
|
639
|
-
} else {
|
|
640
|
-
const slowFrames = processRecordedSpans(__privateGet$4(this, _recordedTrailingSpans));
|
|
641
|
-
const slowFramesTime = slowFrames.reduce((acc, val) => acc + val, 0);
|
|
642
|
-
writeSceneLog(
|
|
643
|
-
this.constructor.name,
|
|
644
|
-
"Profile tail recorded, slow frames duration:",
|
|
645
|
-
slowFramesTime,
|
|
646
|
-
slowFrames,
|
|
647
|
-
__privateGet$4(this, _profileInProgress$1)
|
|
648
|
-
);
|
|
649
|
-
__privateSet$4(this, _recordedTrailingSpans, []);
|
|
650
|
-
const profileDuration = measurementStartTs - profileStartTs;
|
|
651
|
-
writeSceneLog(
|
|
652
|
-
this.constructor.name,
|
|
653
|
-
"Stoped recording, total measured time (network included):",
|
|
654
|
-
profileDuration + slowFramesTime
|
|
655
|
-
);
|
|
656
|
-
__privateSet$4(this, _trailAnimationFrameId, null);
|
|
657
|
-
const profileEndTs = profileStartTs + profileDuration + slowFramesTime;
|
|
658
|
-
if (!__privateGet$4(this, _profileInProgress$1)) {
|
|
659
|
-
return;
|
|
660
|
-
}
|
|
661
|
-
performance.measure(`DashboardInteraction ${__privateGet$4(this, _profileInProgress$1).origin}`, {
|
|
662
|
-
start: profileStartTs,
|
|
663
|
-
end: profileEndTs
|
|
664
|
-
});
|
|
665
|
-
const networkDuration = captureNetwork(profileStartTs, profileEndTs);
|
|
666
|
-
if (((_a = this.queryController) == null ? void 0 : _a.state.onProfileComplete) && __privateGet$4(this, _profileInProgress$1)) {
|
|
667
|
-
this.queryController.state.onProfileComplete({
|
|
668
|
-
origin: __privateGet$4(this, _profileInProgress$1).origin,
|
|
669
|
-
crumbs: __privateGet$4(this, _profileInProgress$1).crumbs,
|
|
670
|
-
duration: profileDuration + slowFramesTime,
|
|
671
|
-
networkDuration,
|
|
672
|
-
startTs: profileStartTs,
|
|
673
|
-
endTs: profileEndTs,
|
|
674
|
-
// @ts-ignore
|
|
675
|
-
jsHeapSizeLimit: performance.memory ? performance.memory.jsHeapSizeLimit : 0,
|
|
676
|
-
// @ts-ignore
|
|
677
|
-
usedJSHeapSize: performance.memory ? performance.memory.usedJSHeapSize : 0,
|
|
678
|
-
// @ts-ignore
|
|
679
|
-
totalJSHeapSize: performance.memory ? performance.memory.totalJSHeapSize : 0
|
|
680
|
-
});
|
|
681
|
-
__privateSet$4(this, _profileInProgress$1, null);
|
|
682
|
-
__privateSet$4(this, _trailAnimationFrameId, null);
|
|
683
|
-
}
|
|
684
|
-
if (window.__runs) {
|
|
685
|
-
window.__runs += `${Date.now()}, ${profileDuration + slowFramesTime}
|
|
686
|
-
`;
|
|
687
|
-
} else {
|
|
688
|
-
window.__runs = `${Date.now()}, ${profileDuration + slowFramesTime}
|
|
689
|
-
`;
|
|
690
|
-
}
|
|
691
|
-
}
|
|
692
|
-
};
|
|
693
|
-
this.setupVisibilityChangeHandler();
|
|
694
|
-
}
|
|
695
|
-
setQueryController(queryController) {
|
|
696
|
-
this.queryController = queryController;
|
|
697
|
-
}
|
|
698
|
-
setupVisibilityChangeHandler() {
|
|
699
|
-
if (__privateGet$4(this, _visibilityChangeHandler)) {
|
|
700
|
-
return;
|
|
701
|
-
}
|
|
702
|
-
__privateSet$4(this, _visibilityChangeHandler, () => {
|
|
703
|
-
if (document.hidden && __privateGet$4(this, _profileInProgress$1)) {
|
|
704
|
-
writeSceneLog("SceneRenderProfiler", "Tab became inactive, cancelling profile");
|
|
705
|
-
this.cancelProfile();
|
|
706
|
-
}
|
|
707
|
-
});
|
|
708
|
-
if (typeof document !== "undefined") {
|
|
709
|
-
document.addEventListener("visibilitychange", __privateGet$4(this, _visibilityChangeHandler));
|
|
710
|
-
}
|
|
711
|
-
}
|
|
712
|
-
cleanup() {
|
|
713
|
-
if (__privateGet$4(this, _visibilityChangeHandler) && typeof document !== "undefined") {
|
|
714
|
-
document.removeEventListener("visibilitychange", __privateGet$4(this, _visibilityChangeHandler));
|
|
715
|
-
__privateSet$4(this, _visibilityChangeHandler, null);
|
|
716
|
-
}
|
|
717
|
-
this.cancelProfile();
|
|
718
|
-
}
|
|
719
|
-
startProfile(name) {
|
|
720
|
-
if (document.hidden) {
|
|
721
|
-
writeSceneLog("SceneRenderProfiler", "Tab is inactive, skipping profile", name);
|
|
722
|
-
return;
|
|
723
|
-
}
|
|
724
|
-
if (__privateGet$4(this, _profileInProgress$1)) {
|
|
725
|
-
if (__privateGet$4(this, _trailAnimationFrameId)) {
|
|
726
|
-
this.cancelProfile();
|
|
727
|
-
this._startNewProfile(name, true);
|
|
728
|
-
} else {
|
|
729
|
-
this.addCrumb(name);
|
|
730
|
-
}
|
|
731
|
-
} else {
|
|
732
|
-
this._startNewProfile(name);
|
|
733
|
-
}
|
|
734
|
-
}
|
|
735
|
-
/**
|
|
736
|
-
* Starts a new profile for performance measurement.
|
|
737
|
-
*
|
|
738
|
-
* @param name - The origin/trigger of the profile (e.g., 'time_range_change', 'variable_value_changed')
|
|
739
|
-
* @param force - Whether this is a "forced" profile (true) or "clean" profile (false)
|
|
740
|
-
* - "forced": Started by canceling an existing profile that was recording trailing frames
|
|
741
|
-
* This happens when a new user interaction occurs before the previous one
|
|
742
|
-
* finished measuring its performance impact
|
|
743
|
-
* - "clean": Started when no profile is currently active
|
|
744
|
-
*/
|
|
745
|
-
_startNewProfile(name, force = false) {
|
|
746
|
-
__privateSet$4(this, _profileInProgress$1, { origin: name, crumbs: [] });
|
|
747
|
-
__privateSet$4(this, _profileStartTs, performance.now());
|
|
748
|
-
writeSceneLog(
|
|
749
|
-
"SceneRenderProfiler",
|
|
750
|
-
`Profile started[${force ? "forced" : "clean"}]`,
|
|
751
|
-
__privateGet$4(this, _profileInProgress$1),
|
|
752
|
-
__privateGet$4(this, _profileStartTs)
|
|
753
|
-
);
|
|
754
|
-
}
|
|
755
|
-
recordProfileTail(measurementStartTime, profileStartTs) {
|
|
756
|
-
__privateSet$4(this, _trailAnimationFrameId, requestAnimationFrame(
|
|
757
|
-
() => this.measureTrailingFrames(measurementStartTime, measurementStartTime, profileStartTs)
|
|
758
|
-
));
|
|
759
|
-
}
|
|
760
|
-
tryCompletingProfile() {
|
|
761
|
-
var _a;
|
|
762
|
-
writeSceneLog("SceneRenderProfiler", "Trying to complete profile", __privateGet$4(this, _profileInProgress$1));
|
|
763
|
-
if (((_a = this.queryController) == null ? void 0 : _a.runningQueriesCount()) === 0 && __privateGet$4(this, _profileInProgress$1)) {
|
|
764
|
-
writeSceneLog("SceneRenderProfiler", "All queries completed, stopping profile");
|
|
765
|
-
this.recordProfileTail(performance.now(), __privateGet$4(this, _profileStartTs));
|
|
766
|
-
}
|
|
767
|
-
}
|
|
768
|
-
isTailRecording() {
|
|
769
|
-
return Boolean(__privateGet$4(this, _trailAnimationFrameId));
|
|
770
|
-
}
|
|
771
|
-
cancelTailRecording() {
|
|
772
|
-
if (__privateGet$4(this, _trailAnimationFrameId)) {
|
|
773
|
-
cancelAnimationFrame(__privateGet$4(this, _trailAnimationFrameId));
|
|
774
|
-
__privateSet$4(this, _trailAnimationFrameId, null);
|
|
775
|
-
writeSceneLog("SceneRenderProfiler", "Cancelled recording frames, new profile started");
|
|
776
|
-
}
|
|
777
|
-
}
|
|
778
|
-
// cancel profile
|
|
779
|
-
cancelProfile() {
|
|
780
|
-
if (__privateGet$4(this, _profileInProgress$1)) {
|
|
781
|
-
writeSceneLog("SceneRenderProfiler", "Cancelling profile", __privateGet$4(this, _profileInProgress$1));
|
|
782
|
-
__privateSet$4(this, _profileInProgress$1, null);
|
|
783
|
-
if (__privateGet$4(this, _trailAnimationFrameId)) {
|
|
784
|
-
cancelAnimationFrame(__privateGet$4(this, _trailAnimationFrameId));
|
|
785
|
-
__privateSet$4(this, _trailAnimationFrameId, null);
|
|
786
|
-
}
|
|
787
|
-
__privateSet$4(this, _recordedTrailingSpans, []);
|
|
788
|
-
}
|
|
789
|
-
}
|
|
790
|
-
addCrumb(crumb) {
|
|
791
|
-
if (__privateGet$4(this, _profileInProgress$1)) {
|
|
792
|
-
writeSceneLog("SceneRenderProfiler", "Adding crumb:", crumb);
|
|
793
|
-
__privateGet$4(this, _profileInProgress$1).crumbs.push(crumb);
|
|
794
|
-
}
|
|
795
|
-
}
|
|
796
|
-
}
|
|
797
|
-
_profileInProgress$1 = new WeakMap();
|
|
798
|
-
_profileStartTs = new WeakMap();
|
|
799
|
-
_trailAnimationFrameId = new WeakMap();
|
|
800
|
-
_recordedTrailingSpans = new WeakMap();
|
|
801
|
-
_visibilityChangeHandler = new WeakMap();
|
|
802
|
-
function processRecordedSpans(spans) {
|
|
803
|
-
for (let i = spans.length - 1; i >= 0; i--) {
|
|
804
|
-
if (spans[i] > SPAN_THRESHOLD) {
|
|
805
|
-
return spans.slice(0, i + 1);
|
|
806
|
-
}
|
|
807
|
-
}
|
|
808
|
-
return [spans[0]];
|
|
809
|
-
}
|
|
810
|
-
function captureNetwork(startTs, endTs) {
|
|
811
|
-
const entries = performance.getEntriesByType("resource");
|
|
812
|
-
performance.clearResourceTimings();
|
|
813
|
-
const networkEntries = entries.filter(
|
|
814
|
-
(entry) => entry.startTime >= startTs && entry.startTime <= endTs && entry.responseEnd >= startTs && entry.responseEnd <= endTs
|
|
815
|
-
);
|
|
816
|
-
for (const entry of networkEntries) {
|
|
817
|
-
performance.measure("Network entry " + entry.name, {
|
|
818
|
-
start: entry.startTime,
|
|
819
|
-
end: entry.responseEnd
|
|
820
|
-
});
|
|
821
|
-
}
|
|
822
|
-
return calculateNetworkTime(networkEntries);
|
|
823
|
-
}
|
|
824
|
-
function calculateNetworkTime(requests) {
|
|
825
|
-
if (requests.length === 0) {
|
|
826
|
-
return 0;
|
|
827
|
-
}
|
|
828
|
-
requests.sort((a, b) => a.startTime - b.startTime);
|
|
829
|
-
let totalNetworkTime = 0;
|
|
830
|
-
let currentStart = requests[0].startTime;
|
|
831
|
-
let currentEnd = requests[0].responseEnd;
|
|
832
|
-
for (let i = 1; i < requests.length; i++) {
|
|
833
|
-
if (requests[i].startTime <= currentEnd) {
|
|
834
|
-
currentEnd = Math.max(currentEnd, requests[i].responseEnd);
|
|
835
|
-
} else {
|
|
836
|
-
totalNetworkTime += currentEnd - currentStart;
|
|
837
|
-
currentStart = requests[i].startTime;
|
|
838
|
-
currentEnd = requests[i].responseEnd;
|
|
839
|
-
}
|
|
840
|
-
}
|
|
841
|
-
totalNetworkTime += currentEnd - currentStart;
|
|
842
|
-
return totalNetworkTime;
|
|
843
|
-
}
|
|
844
|
-
const REFRESH_INTERACTION = "refresh";
|
|
845
|
-
const TIME_RANGE_CHANGE_INTERACTION = "time_range_change";
|
|
846
|
-
const FILTER_REMOVED_INTERACTION = "filter_removed";
|
|
847
|
-
const FILTER_CHANGED_INTERACTION = "filter_changed";
|
|
848
|
-
const FILTER_RESTORED_INTERACTION = "filter_restored";
|
|
849
|
-
const VARIABLE_VALUE_CHANGED_INTERACTION = "variable_value_changed";
|
|
850
|
-
const SCOPES_CHANGED_INTERACTION = "scopes_changed";
|
|
851
|
-
|
|
852
|
-
var __typeError$3 = (msg) => {
|
|
853
|
-
throw TypeError(msg);
|
|
854
|
-
};
|
|
855
|
-
var __accessCheck$3 = (obj, member, msg) => member.has(obj) || __typeError$3("Cannot " + msg);
|
|
856
|
-
var __privateGet$3 = (obj, member, getter) => (__accessCheck$3(obj, member, "read from private field"), member.get(obj));
|
|
857
|
-
var __privateAdd$3 = (obj, member, value) => member.has(obj) ? __typeError$3("Cannot add the same private member more than once") : member instanceof WeakSet ? member.add(obj) : member.set(obj, value);
|
|
858
|
-
var __privateSet$3 = (obj, member, value, setter) => (__accessCheck$3(obj, member, "write to private field"), member.set(obj, value), value);
|
|
859
|
-
var _profileInProgress;
|
|
860
|
-
function isInteractionProfiler(obj) {
|
|
861
|
-
return obj && typeof obj === "object" && "isInteractionProfiler" in obj;
|
|
862
|
-
}
|
|
863
|
-
class SceneInteractionProfiler extends SceneObjectBase {
|
|
864
|
-
constructor() {
|
|
865
|
-
super(...arguments);
|
|
866
|
-
this.isInteractionProfiler = true;
|
|
867
|
-
__privateAdd$3(this, _profileInProgress, null);
|
|
868
|
-
}
|
|
869
|
-
startProfile(interaction) {
|
|
870
|
-
if (!this.state.enableProfiling) {
|
|
871
|
-
return;
|
|
872
|
-
}
|
|
873
|
-
if (__privateGet$3(this, _profileInProgress)) {
|
|
874
|
-
this.cancelProfile();
|
|
875
|
-
}
|
|
876
|
-
__privateSet$3(this, _profileInProgress, {
|
|
877
|
-
interaction,
|
|
878
|
-
startTs: performance.now()
|
|
879
|
-
});
|
|
880
|
-
writeSceneLog("SceneInteractionProfiler", "Started profiling interaction:", interaction);
|
|
881
|
-
}
|
|
882
|
-
stopProfile() {
|
|
883
|
-
if (!__privateGet$3(this, _profileInProgress)) {
|
|
884
|
-
return;
|
|
885
|
-
}
|
|
886
|
-
const endTs = performance.now();
|
|
887
|
-
const interactionDuration = endTs - __privateGet$3(this, _profileInProgress).startTs;
|
|
888
|
-
const networkDuration = captureNetwork(__privateGet$3(this, _profileInProgress).startTs, endTs);
|
|
889
|
-
const result = {
|
|
890
|
-
interaction: __privateGet$3(this, _profileInProgress).interaction,
|
|
891
|
-
interactionDuration,
|
|
892
|
-
networkDuration,
|
|
893
|
-
startTs: __privateGet$3(this, _profileInProgress).startTs,
|
|
894
|
-
endTs
|
|
895
|
-
};
|
|
896
|
-
writeSceneLog("SceneInteractionProfiler", "Completed profile:", result);
|
|
897
|
-
if (this.state.onProfileComplete) {
|
|
898
|
-
this.state.onProfileComplete(result);
|
|
899
|
-
}
|
|
900
|
-
performance.mark(`${__privateGet$3(this, _profileInProgress).interaction}_start`, {
|
|
901
|
-
startTime: __privateGet$3(this, _profileInProgress).startTs
|
|
902
|
-
});
|
|
903
|
-
performance.mark(`${__privateGet$3(this, _profileInProgress).interaction}_end`, {
|
|
904
|
-
startTime: endTs
|
|
905
|
-
});
|
|
906
|
-
performance.measure(
|
|
907
|
-
`Interaction_${__privateGet$3(this, _profileInProgress).interaction}`,
|
|
908
|
-
`${__privateGet$3(this, _profileInProgress).interaction}_start`,
|
|
909
|
-
`${__privateGet$3(this, _profileInProgress).interaction}_end`
|
|
910
|
-
);
|
|
911
|
-
__privateSet$3(this, _profileInProgress, null);
|
|
912
|
-
}
|
|
913
|
-
cancelProfile() {
|
|
914
|
-
if (__privateGet$3(this, _profileInProgress)) {
|
|
915
|
-
writeSceneLog("SceneInteractionProfiler", "Cancelled profile:", __privateGet$3(this, _profileInProgress).interaction);
|
|
916
|
-
__privateSet$3(this, _profileInProgress, null);
|
|
917
|
-
}
|
|
918
|
-
}
|
|
919
|
-
isProfileActive() {
|
|
920
|
-
return __privateGet$3(this, _profileInProgress) !== null;
|
|
921
|
-
}
|
|
922
|
-
getCurrentInteraction() {
|
|
923
|
-
var _a, _b;
|
|
924
|
-
return (_b = (_a = __privateGet$3(this, _profileInProgress)) == null ? void 0 : _a.interaction) != null ? _b : null;
|
|
925
|
-
}
|
|
926
|
-
}
|
|
927
|
-
_profileInProgress = new WeakMap();
|
|
928
|
-
const USER_INTERACTIONS = {
|
|
929
|
-
ADHOC_KEYS_DROPDOWN: "adhoc_keys_dropdown",
|
|
930
|
-
ADHOC_VALUES_DROPDOWN: "adhoc_values_dropdown",
|
|
931
|
-
GROUPBY_DROPDOWN: "groupby_dropdown"
|
|
932
|
-
};
|
|
933
|
-
|
|
934
|
-
function getInteractionProfiler(sceneObject) {
|
|
935
|
-
let parent = sceneObject;
|
|
936
|
-
while (parent) {
|
|
937
|
-
if (parent.state.$behaviors) {
|
|
938
|
-
for (const behavior of parent.state.$behaviors) {
|
|
939
|
-
if (isInteractionProfiler(behavior)) {
|
|
940
|
-
return behavior;
|
|
941
|
-
}
|
|
942
|
-
}
|
|
943
|
-
}
|
|
944
|
-
parent = parent.parent;
|
|
945
|
-
}
|
|
946
|
-
return void 0;
|
|
947
|
-
}
|
|
948
|
-
|
|
949
|
-
var __typeError$2 = (msg) => {
|
|
950
|
-
throw TypeError(msg);
|
|
951
|
-
};
|
|
952
|
-
var __accessCheck$2 = (obj, member, msg) => member.has(obj) || __typeError$2("Cannot " + msg);
|
|
953
|
-
var __privateGet$2 = (obj, member, getter) => (__accessCheck$2(obj, member, "read from private field"), getter ? getter.call(obj) : member.get(obj));
|
|
954
|
-
var __privateAdd$2 = (obj, member, value) => member.has(obj) ? __typeError$2("Cannot add the same private member more than once") : member instanceof WeakSet ? member.add(obj) : member.set(obj, value);
|
|
955
|
-
var __privateSet$2 = (obj, member, value, setter) => (__accessCheck$2(obj, member, "write to private field"), member.set(obj, value), value);
|
|
956
619
|
var _running, _tryCompleteProfileFrameId;
|
|
957
620
|
function isQueryController(s) {
|
|
958
621
|
return "isQueryController" in s;
|
|
@@ -962,10 +625,10 @@ class SceneQueryController extends SceneObjectBase {
|
|
|
962
625
|
super({ ...state, isRunning: false });
|
|
963
626
|
this.profiler = profiler;
|
|
964
627
|
this.isQueryController = true;
|
|
965
|
-
__privateAdd$
|
|
966
|
-
__privateAdd$
|
|
628
|
+
__privateAdd$4(this, _running, /* @__PURE__ */ new Set());
|
|
629
|
+
__privateAdd$4(this, _tryCompleteProfileFrameId, null);
|
|
967
630
|
this.runningQueriesCount = () => {
|
|
968
|
-
return __privateGet$
|
|
631
|
+
return __privateGet$4(this, _running).size;
|
|
969
632
|
};
|
|
970
633
|
if (profiler) {
|
|
971
634
|
this.profiler = profiler;
|
|
@@ -974,7 +637,7 @@ class SceneQueryController extends SceneObjectBase {
|
|
|
974
637
|
this.addActivationHandler(() => {
|
|
975
638
|
var _a;
|
|
976
639
|
(_a = this.profiler) == null ? void 0 : _a.setQueryController(this);
|
|
977
|
-
return () => __privateGet$
|
|
640
|
+
return () => __privateGet$4(this, _running).clear();
|
|
978
641
|
});
|
|
979
642
|
}
|
|
980
643
|
startProfile(name) {
|
|
@@ -989,19 +652,19 @@ class SceneQueryController extends SceneObjectBase {
|
|
|
989
652
|
(_a = this.profiler) == null ? void 0 : _a.cancelProfile();
|
|
990
653
|
}
|
|
991
654
|
queryStarted(entry) {
|
|
992
|
-
__privateGet$
|
|
655
|
+
__privateGet$4(this, _running).add(entry);
|
|
993
656
|
this.changeRunningQueryCount(1, entry);
|
|
994
657
|
if (!this.state.isRunning) {
|
|
995
658
|
this.setState({ isRunning: true });
|
|
996
659
|
}
|
|
997
660
|
}
|
|
998
661
|
queryCompleted(entry) {
|
|
999
|
-
if (!__privateGet$
|
|
662
|
+
if (!__privateGet$4(this, _running).has(entry)) {
|
|
1000
663
|
return;
|
|
1001
664
|
}
|
|
1002
|
-
__privateGet$
|
|
665
|
+
__privateGet$4(this, _running).delete(entry);
|
|
1003
666
|
this.changeRunningQueryCount(-1);
|
|
1004
|
-
if (__privateGet$
|
|
667
|
+
if (__privateGet$4(this, _running).size === 0) {
|
|
1005
668
|
this.setState({ isRunning: false });
|
|
1006
669
|
}
|
|
1007
670
|
}
|
|
@@ -1018,186 +681,699 @@ class SceneQueryController extends SceneObjectBase {
|
|
|
1018
681
|
}
|
|
1019
682
|
}
|
|
1020
683
|
if (this.state.enableProfiling) {
|
|
1021
|
-
if (__privateGet$
|
|
1022
|
-
cancelAnimationFrame(__privateGet$
|
|
684
|
+
if (__privateGet$4(this, _tryCompleteProfileFrameId)) {
|
|
685
|
+
cancelAnimationFrame(__privateGet$4(this, _tryCompleteProfileFrameId));
|
|
1023
686
|
}
|
|
1024
|
-
__privateSet$
|
|
687
|
+
__privateSet$4(this, _tryCompleteProfileFrameId, requestAnimationFrame(() => {
|
|
1025
688
|
var _a2;
|
|
1026
689
|
(_a2 = this.profiler) == null ? void 0 : _a2.tryCompletingProfile();
|
|
1027
690
|
}));
|
|
1028
691
|
}
|
|
1029
692
|
}
|
|
1030
|
-
cancelAll() {
|
|
1031
|
-
var _a;
|
|
1032
|
-
for (const entry of __privateGet$
|
|
1033
|
-
(_a = entry.cancel) == null ? void 0 : _a.call(entry);
|
|
693
|
+
cancelAll() {
|
|
694
|
+
var _a;
|
|
695
|
+
for (const entry of __privateGet$4(this, _running).values()) {
|
|
696
|
+
(_a = entry.cancel) == null ? void 0 : _a.call(entry);
|
|
697
|
+
}
|
|
698
|
+
}
|
|
699
|
+
}
|
|
700
|
+
_running = new WeakMap();
|
|
701
|
+
_tryCompleteProfileFrameId = new WeakMap();
|
|
702
|
+
|
|
703
|
+
function getQueryController(sceneObject) {
|
|
704
|
+
let parent = sceneObject;
|
|
705
|
+
while (parent) {
|
|
706
|
+
if (parent.state.$behaviors) {
|
|
707
|
+
for (const behavior of parent.state.$behaviors) {
|
|
708
|
+
if (isQueryController(behavior)) {
|
|
709
|
+
return behavior;
|
|
710
|
+
}
|
|
711
|
+
}
|
|
712
|
+
}
|
|
713
|
+
parent = parent.parent;
|
|
714
|
+
}
|
|
715
|
+
return void 0;
|
|
716
|
+
}
|
|
717
|
+
|
|
718
|
+
class SceneDataNode extends SceneObjectBase {
|
|
719
|
+
constructor(state) {
|
|
720
|
+
super({
|
|
721
|
+
data: emptyPanelData,
|
|
722
|
+
...state
|
|
723
|
+
});
|
|
724
|
+
}
|
|
725
|
+
getResultsStream() {
|
|
726
|
+
const result = {
|
|
727
|
+
origin: this,
|
|
728
|
+
data: this.state.data
|
|
729
|
+
};
|
|
730
|
+
return rxjs.of(result);
|
|
731
|
+
}
|
|
732
|
+
}
|
|
733
|
+
const emptyPanelData = {
|
|
734
|
+
state: schema.LoadingState.Done,
|
|
735
|
+
series: [],
|
|
736
|
+
timeRange: data.getDefaultTimeRange()
|
|
737
|
+
};
|
|
738
|
+
|
|
739
|
+
class SceneObjectUrlSyncConfig {
|
|
740
|
+
constructor(_sceneObject, _options) {
|
|
741
|
+
this._sceneObject = _sceneObject;
|
|
742
|
+
this._nextChangeShouldAddHistoryStep = false;
|
|
743
|
+
this._keys = _options.keys;
|
|
744
|
+
}
|
|
745
|
+
getKeys() {
|
|
746
|
+
if (typeof this._keys === "function") {
|
|
747
|
+
return this._keys();
|
|
748
|
+
}
|
|
749
|
+
return this._keys;
|
|
750
|
+
}
|
|
751
|
+
getUrlState() {
|
|
752
|
+
return this._sceneObject.getUrlState();
|
|
753
|
+
}
|
|
754
|
+
updateFromUrl(values) {
|
|
755
|
+
this._sceneObject.updateFromUrl(values);
|
|
756
|
+
}
|
|
757
|
+
shouldCreateHistoryStep(values) {
|
|
758
|
+
return this._nextChangeShouldAddHistoryStep;
|
|
759
|
+
}
|
|
760
|
+
performBrowserHistoryAction(callback) {
|
|
761
|
+
this._nextChangeShouldAddHistoryStep = true;
|
|
762
|
+
callback();
|
|
763
|
+
this._nextChangeShouldAddHistoryStep = false;
|
|
764
|
+
}
|
|
765
|
+
}
|
|
766
|
+
|
|
767
|
+
function getClosest(sceneObject, extract) {
|
|
768
|
+
let curSceneObject = sceneObject;
|
|
769
|
+
let extracted = void 0;
|
|
770
|
+
while (curSceneObject && !extracted) {
|
|
771
|
+
extracted = extract(curSceneObject);
|
|
772
|
+
curSceneObject = curSceneObject.parent;
|
|
773
|
+
}
|
|
774
|
+
return extracted;
|
|
775
|
+
}
|
|
776
|
+
|
|
777
|
+
const INTERVAL_STRING_REGEX = /^\d+[yYmMsSwWhHdD]$/;
|
|
778
|
+
function parseUrlParam(value) {
|
|
779
|
+
if (typeof value !== "string") {
|
|
780
|
+
return null;
|
|
781
|
+
}
|
|
782
|
+
if (value.indexOf("now") !== -1) {
|
|
783
|
+
return value;
|
|
784
|
+
}
|
|
785
|
+
if (INTERVAL_STRING_REGEX.test(value)) {
|
|
786
|
+
return value;
|
|
787
|
+
}
|
|
788
|
+
if (value.length === 8) {
|
|
789
|
+
const utcValue = data.toUtc(value, "YYYYMMDD");
|
|
790
|
+
if (utcValue.isValid()) {
|
|
791
|
+
return utcValue.toISOString();
|
|
792
|
+
}
|
|
793
|
+
} else if (value.length === 15) {
|
|
794
|
+
const utcValue = data.toUtc(value, "YYYYMMDDTHHmmss");
|
|
795
|
+
if (utcValue.isValid()) {
|
|
796
|
+
return utcValue.toISOString();
|
|
797
|
+
}
|
|
798
|
+
} else if (value.length === 19) {
|
|
799
|
+
const utcValue = data.toUtc(value, "YYYY-MM-DD HH:mm:ss");
|
|
800
|
+
if (utcValue.isValid()) {
|
|
801
|
+
return utcValue.toISOString();
|
|
802
|
+
}
|
|
803
|
+
} else if (value.length === 24) {
|
|
804
|
+
const utcValue = data.toUtc(value);
|
|
805
|
+
return utcValue.toISOString();
|
|
806
|
+
}
|
|
807
|
+
const epoch = parseInt(value, 10);
|
|
808
|
+
if (!isNaN(epoch)) {
|
|
809
|
+
return data.toUtc(epoch).toISOString();
|
|
810
|
+
}
|
|
811
|
+
return null;
|
|
812
|
+
}
|
|
813
|
+
|
|
814
|
+
function evaluateTimeRange(from, to, timeZone, fiscalYearStartMonth, delay, weekStart) {
|
|
815
|
+
const hasDelay = delay && to === "now";
|
|
816
|
+
const now = Date.now();
|
|
817
|
+
if (weekStart) {
|
|
818
|
+
setWeekStartIfDifferent(weekStart);
|
|
819
|
+
}
|
|
820
|
+
const parseOrToDateTime = (val, options) => {
|
|
821
|
+
if (data.dateMath.toDateTime) {
|
|
822
|
+
return data.dateMath.toDateTime(val, options);
|
|
823
|
+
} else {
|
|
824
|
+
return data.dateMath.parse(val, options.roundUp, options.timezone, options.fiscalYearStartMonth);
|
|
825
|
+
}
|
|
826
|
+
};
|
|
827
|
+
return {
|
|
828
|
+
to: parseOrToDateTime(hasDelay ? "now-" + delay : to, {
|
|
829
|
+
roundUp: true,
|
|
830
|
+
timezone: timeZone,
|
|
831
|
+
fiscalYearStartMonth,
|
|
832
|
+
now
|
|
833
|
+
}),
|
|
834
|
+
from: parseOrToDateTime(from, {
|
|
835
|
+
roundUp: false,
|
|
836
|
+
timezone: timeZone,
|
|
837
|
+
fiscalYearStartMonth,
|
|
838
|
+
now
|
|
839
|
+
}),
|
|
840
|
+
raw: {
|
|
841
|
+
from,
|
|
842
|
+
to
|
|
843
|
+
}
|
|
844
|
+
};
|
|
845
|
+
}
|
|
846
|
+
let prevWeekStart;
|
|
847
|
+
function setWeekStartIfDifferent(weekStart) {
|
|
848
|
+
if (weekStart !== prevWeekStart) {
|
|
849
|
+
prevWeekStart = weekStart;
|
|
850
|
+
data.setWeekStart(weekStart);
|
|
851
|
+
}
|
|
852
|
+
}
|
|
853
|
+
|
|
854
|
+
function isValid$1(value, roundUp, timeZone) {
|
|
855
|
+
if (data.isDateTime(value)) {
|
|
856
|
+
return value.isValid();
|
|
857
|
+
}
|
|
858
|
+
if (data.dateMath.isMathString(value)) {
|
|
859
|
+
return data.dateMath.isValid(value);
|
|
860
|
+
}
|
|
861
|
+
const parsed = data.dateTimeParse(value, { roundUp, timeZone });
|
|
862
|
+
return parsed.isValid();
|
|
863
|
+
}
|
|
864
|
+
|
|
865
|
+
var __typeError$3 = (msg) => {
|
|
866
|
+
throw TypeError(msg);
|
|
867
|
+
};
|
|
868
|
+
var __accessCheck$3 = (obj, member, msg) => member.has(obj) || __typeError$3("Cannot " + msg);
|
|
869
|
+
var __privateGet$3 = (obj, member, getter) => (__accessCheck$3(obj, member, "read from private field"), getter ? getter.call(obj) : member.get(obj));
|
|
870
|
+
var __privateAdd$3 = (obj, member, value) => member.has(obj) ? __typeError$3("Cannot add the same private member more than once") : member instanceof WeakSet ? member.add(obj) : member.set(obj, value);
|
|
871
|
+
var __privateSet$3 = (obj, member, value, setter) => (__accessCheck$3(obj, member, "write to private field"), member.set(obj, value), value);
|
|
872
|
+
var _isTracking, _callback, _frameTrackingId, _lastFrameTime, _loafObserver;
|
|
873
|
+
const LONG_FRAME_THRESHOLD = 50;
|
|
874
|
+
class LongFrameDetector {
|
|
875
|
+
constructor() {
|
|
876
|
+
__privateAdd$3(this, _isTracking, false);
|
|
877
|
+
__privateAdd$3(this, _callback, null);
|
|
878
|
+
// Manual tracking state
|
|
879
|
+
__privateAdd$3(this, _frameTrackingId, null);
|
|
880
|
+
__privateAdd$3(this, _lastFrameTime, 0);
|
|
881
|
+
// LoAF tracking state
|
|
882
|
+
__privateAdd$3(this, _loafObserver, null);
|
|
883
|
+
/**
|
|
884
|
+
* Measure frame durations using requestAnimationFrame
|
|
885
|
+
*/
|
|
886
|
+
this.measureFrames = () => {
|
|
887
|
+
if (!__privateGet$3(this, _isTracking)) {
|
|
888
|
+
return;
|
|
889
|
+
}
|
|
890
|
+
const currentFrameTime = performance.now();
|
|
891
|
+
const frameLength = currentFrameTime - __privateGet$3(this, _lastFrameTime);
|
|
892
|
+
if (frameLength > LONG_FRAME_THRESHOLD) {
|
|
893
|
+
const event = {
|
|
894
|
+
duration: frameLength,
|
|
895
|
+
timestamp: currentFrameTime,
|
|
896
|
+
method: "manual"
|
|
897
|
+
};
|
|
898
|
+
if (__privateGet$3(this, _callback)) {
|
|
899
|
+
__privateGet$3(this, _callback).call(this, event);
|
|
900
|
+
}
|
|
901
|
+
if (typeof performance !== "undefined" && performance.mark && performance.measure) {
|
|
902
|
+
const frameId = `long-frame-manual-${currentFrameTime.toFixed(0)}`;
|
|
903
|
+
const startMarkName = `${frameId}-start`;
|
|
904
|
+
const endMarkName = `${frameId}-end`;
|
|
905
|
+
const measureName = `Long Frame (Manual): ${frameLength.toFixed(1)}ms`;
|
|
906
|
+
try {
|
|
907
|
+
performance.mark(startMarkName, { startTime: currentFrameTime - frameLength });
|
|
908
|
+
performance.mark(endMarkName, { startTime: currentFrameTime });
|
|
909
|
+
performance.measure(measureName, startMarkName, endMarkName);
|
|
910
|
+
} catch (e) {
|
|
911
|
+
performance.mark(measureName);
|
|
912
|
+
}
|
|
913
|
+
}
|
|
914
|
+
writeSceneLog(
|
|
915
|
+
"LongFrameDetector",
|
|
916
|
+
`Long frame detected (manual): ${frameLength}ms (threshold: ${LONG_FRAME_THRESHOLD}ms)`
|
|
917
|
+
);
|
|
918
|
+
}
|
|
919
|
+
__privateSet$3(this, _lastFrameTime, currentFrameTime);
|
|
920
|
+
if (__privateGet$3(this, _isTracking)) {
|
|
921
|
+
__privateSet$3(this, _frameTrackingId, requestAnimationFrame(this.measureFrames));
|
|
922
|
+
}
|
|
923
|
+
};
|
|
924
|
+
}
|
|
925
|
+
/**
|
|
926
|
+
* Check if LoAF API is available in the browser
|
|
927
|
+
*/
|
|
928
|
+
isLoAFAvailable() {
|
|
929
|
+
return typeof PerformanceObserver !== "undefined" && PerformanceObserver.supportedEntryTypes && PerformanceObserver.supportedEntryTypes.includes("long-animation-frame");
|
|
930
|
+
}
|
|
931
|
+
/**
|
|
932
|
+
* Start detecting long frames and call the provided callback when they occur
|
|
933
|
+
*/
|
|
934
|
+
start(callback) {
|
|
935
|
+
if (__privateGet$3(this, _isTracking)) {
|
|
936
|
+
writeSceneLog("LongFrameDetector", "Already tracking frames, stopping previous session");
|
|
937
|
+
this.stop();
|
|
938
|
+
}
|
|
939
|
+
__privateSet$3(this, _callback, callback);
|
|
940
|
+
__privateSet$3(this, _isTracking, true);
|
|
941
|
+
if (this.isLoAFAvailable()) {
|
|
942
|
+
this.startLoAFTracking();
|
|
943
|
+
} else {
|
|
944
|
+
this.startManualFrameTracking();
|
|
945
|
+
}
|
|
946
|
+
writeSceneLog(
|
|
947
|
+
"LongFrameDetector",
|
|
948
|
+
`Started tracking with ${this.isLoAFAvailable() ? "LoAF API" : "manual"} method, threshold: ${LONG_FRAME_THRESHOLD}ms`
|
|
949
|
+
);
|
|
950
|
+
}
|
|
951
|
+
/**
|
|
952
|
+
* Stop detecting long frames
|
|
953
|
+
*/
|
|
954
|
+
stop() {
|
|
955
|
+
if (!__privateGet$3(this, _isTracking)) {
|
|
956
|
+
return;
|
|
957
|
+
}
|
|
958
|
+
__privateSet$3(this, _isTracking, false);
|
|
959
|
+
__privateSet$3(this, _callback, null);
|
|
960
|
+
this.stopLoAFTracking();
|
|
961
|
+
this.stopManualFrameTracking();
|
|
962
|
+
}
|
|
963
|
+
/**
|
|
964
|
+
* Check if currently tracking frames
|
|
965
|
+
*/
|
|
966
|
+
isTracking() {
|
|
967
|
+
return __privateGet$3(this, _isTracking);
|
|
968
|
+
}
|
|
969
|
+
/**
|
|
970
|
+
* Start tracking using the Long Animation Frame API
|
|
971
|
+
* @see https://developer.mozilla.org/en-US/docs/Web/API/PerformanceLongAnimationFrameTiming
|
|
972
|
+
*/
|
|
973
|
+
startLoAFTracking() {
|
|
974
|
+
if (!this.isLoAFAvailable()) {
|
|
975
|
+
writeSceneLog("LongFrameDetector", "LoAF API not available, falling back to manual tracking");
|
|
976
|
+
this.startManualFrameTracking();
|
|
977
|
+
return;
|
|
978
|
+
}
|
|
979
|
+
try {
|
|
980
|
+
__privateSet$3(this, _loafObserver, new PerformanceObserver((list) => {
|
|
981
|
+
for (const entry of list.getEntries()) {
|
|
982
|
+
const event = {
|
|
983
|
+
duration: entry.duration,
|
|
984
|
+
timestamp: entry.startTime,
|
|
985
|
+
method: "loaf"
|
|
986
|
+
};
|
|
987
|
+
if (__privateGet$3(this, _callback)) {
|
|
988
|
+
__privateGet$3(this, _callback).call(this, event);
|
|
989
|
+
}
|
|
990
|
+
if (typeof performance !== "undefined" && performance.mark && performance.measure) {
|
|
991
|
+
const frameId = `long-frame-${entry.startTime.toFixed(0)}`;
|
|
992
|
+
const startMarkName = `${frameId}-start`;
|
|
993
|
+
const endMarkName = `${frameId}-end`;
|
|
994
|
+
const measureName = `Long Frame (LoAF): ${entry.duration.toFixed(1)}ms`;
|
|
995
|
+
try {
|
|
996
|
+
performance.mark(startMarkName, { startTime: entry.startTime });
|
|
997
|
+
performance.mark(endMarkName, { startTime: entry.startTime + entry.duration });
|
|
998
|
+
performance.measure(measureName, startMarkName, endMarkName);
|
|
999
|
+
} catch (e) {
|
|
1000
|
+
performance.mark(measureName);
|
|
1001
|
+
}
|
|
1002
|
+
}
|
|
1003
|
+
writeSceneLog("LongFrameDetector", `Long frame detected (LoAF): ${entry.duration}ms at ${entry.startTime}ms`);
|
|
1004
|
+
}
|
|
1005
|
+
}));
|
|
1006
|
+
__privateGet$3(this, _loafObserver).observe({ type: "long-animation-frame", buffered: false });
|
|
1007
|
+
} catch (error) {
|
|
1008
|
+
writeSceneLog("LongFrameDetector", "Failed to start LoAF tracking, falling back to manual:", error);
|
|
1009
|
+
this.startManualFrameTracking();
|
|
1010
|
+
}
|
|
1011
|
+
}
|
|
1012
|
+
/**
|
|
1013
|
+
* Stop LoAF tracking
|
|
1014
|
+
*/
|
|
1015
|
+
stopLoAFTracking() {
|
|
1016
|
+
if (__privateGet$3(this, _loafObserver)) {
|
|
1017
|
+
__privateGet$3(this, _loafObserver).disconnect();
|
|
1018
|
+
__privateSet$3(this, _loafObserver, null);
|
|
1019
|
+
writeSceneLog("LongFrameDetector", "Stopped LoAF tracking");
|
|
1020
|
+
}
|
|
1021
|
+
}
|
|
1022
|
+
/**
|
|
1023
|
+
* Start manual frame tracking using requestAnimationFrame
|
|
1024
|
+
*/
|
|
1025
|
+
startManualFrameTracking() {
|
|
1026
|
+
__privateSet$3(this, _lastFrameTime, performance.now());
|
|
1027
|
+
__privateSet$3(this, _frameTrackingId, requestAnimationFrame(() => this.measureFrames()));
|
|
1028
|
+
}
|
|
1029
|
+
/**
|
|
1030
|
+
* Stop manual frame tracking
|
|
1031
|
+
*/
|
|
1032
|
+
stopManualFrameTracking() {
|
|
1033
|
+
if (__privateGet$3(this, _frameTrackingId)) {
|
|
1034
|
+
cancelAnimationFrame(__privateGet$3(this, _frameTrackingId));
|
|
1035
|
+
__privateSet$3(this, _frameTrackingId, null);
|
|
1036
|
+
writeSceneLog("LongFrameDetector", "Stopped manual frame tracking");
|
|
1037
|
+
}
|
|
1038
|
+
}
|
|
1039
|
+
}
|
|
1040
|
+
_isTracking = new WeakMap();
|
|
1041
|
+
_callback = new WeakMap();
|
|
1042
|
+
_frameTrackingId = new WeakMap();
|
|
1043
|
+
_lastFrameTime = new WeakMap();
|
|
1044
|
+
_loafObserver = new WeakMap();
|
|
1045
|
+
|
|
1046
|
+
var __typeError$2 = (msg) => {
|
|
1047
|
+
throw TypeError(msg);
|
|
1048
|
+
};
|
|
1049
|
+
var __accessCheck$2 = (obj, member, msg) => member.has(obj) || __typeError$2("Cannot " + msg);
|
|
1050
|
+
var __privateGet$2 = (obj, member, getter) => (__accessCheck$2(obj, member, "read from private field"), getter ? getter.call(obj) : member.get(obj));
|
|
1051
|
+
var __privateAdd$2 = (obj, member, value) => member.has(obj) ? __typeError$2("Cannot add the same private member more than once") : member instanceof WeakSet ? member.add(obj) : member.set(obj, value);
|
|
1052
|
+
var __privateSet$2 = (obj, member, value, setter) => (__accessCheck$2(obj, member, "write to private field"), member.set(obj, value), value);
|
|
1053
|
+
var __privateWrapper = (obj, member, setter, getter) => ({
|
|
1054
|
+
set _(value) {
|
|
1055
|
+
__privateSet$2(obj, member, value);
|
|
1056
|
+
},
|
|
1057
|
+
get _() {
|
|
1058
|
+
return __privateGet$2(obj, member, getter);
|
|
1059
|
+
}
|
|
1060
|
+
});
|
|
1061
|
+
var _profileInProgress, _profileStartTs, _trailAnimationFrameId, _recordedTrailingSpans, _longFrameDetector, _longFramesCount, _longFramesTotalTime, _visibilityChangeHandler;
|
|
1062
|
+
const POST_STORM_WINDOW = 2e3;
|
|
1063
|
+
const DEFAULT_LONG_FRAME_THRESHOLD = 30;
|
|
1064
|
+
const TAB_INACTIVE_THRESHOLD = 1e3;
|
|
1065
|
+
class SceneRenderProfiler {
|
|
1066
|
+
constructor(queryController) {
|
|
1067
|
+
this.queryController = queryController;
|
|
1068
|
+
__privateAdd$2(this, _profileInProgress, null);
|
|
1069
|
+
__privateAdd$2(this, _profileStartTs, null);
|
|
1070
|
+
__privateAdd$2(this, _trailAnimationFrameId, null);
|
|
1071
|
+
// Will keep measured lengths trailing frames
|
|
1072
|
+
__privateAdd$2(this, _recordedTrailingSpans, []);
|
|
1073
|
+
// Long frame tracking
|
|
1074
|
+
__privateAdd$2(this, _longFrameDetector);
|
|
1075
|
+
__privateAdd$2(this, _longFramesCount, 0);
|
|
1076
|
+
__privateAdd$2(this, _longFramesTotalTime, 0);
|
|
1077
|
+
__privateAdd$2(this, _visibilityChangeHandler, null);
|
|
1078
|
+
this.measureTrailingFrames = (measurementStartTs, lastFrameTime, profileStartTs) => {
|
|
1079
|
+
var _a, _b, _c, _d;
|
|
1080
|
+
const currentFrameTime = performance.now();
|
|
1081
|
+
const frameLength = currentFrameTime - lastFrameTime;
|
|
1082
|
+
if (frameLength > TAB_INACTIVE_THRESHOLD) {
|
|
1083
|
+
writeSceneLog("SceneRenderProfiler", "Tab was inactive, cancelling profile measurement");
|
|
1084
|
+
this.cancelProfile();
|
|
1085
|
+
return;
|
|
1086
|
+
}
|
|
1087
|
+
__privateGet$2(this, _recordedTrailingSpans).push(frameLength);
|
|
1088
|
+
if (currentFrameTime - measurementStartTs < POST_STORM_WINDOW) {
|
|
1089
|
+
if (__privateGet$2(this, _profileInProgress)) {
|
|
1090
|
+
__privateSet$2(this, _trailAnimationFrameId, requestAnimationFrame(
|
|
1091
|
+
() => this.measureTrailingFrames(measurementStartTs, currentFrameTime, profileStartTs)
|
|
1092
|
+
));
|
|
1093
|
+
}
|
|
1094
|
+
} else {
|
|
1095
|
+
const slowFrames = processRecordedSpans(__privateGet$2(this, _recordedTrailingSpans));
|
|
1096
|
+
const slowFramesTime = slowFrames.reduce((acc, val) => acc + val, 0);
|
|
1097
|
+
writeSceneLog(
|
|
1098
|
+
"SceneRenderProfiler",
|
|
1099
|
+
`Profile tail recorded - Slow frames: ${slowFramesTime.toFixed(1)}ms (${slowFrames.length} frames)`
|
|
1100
|
+
);
|
|
1101
|
+
writeSceneLog("", ` \u251C\u2500 Origin: ${((_a = __privateGet$2(this, _profileInProgress)) == null ? void 0 : _a.origin) || "unknown"}`);
|
|
1102
|
+
writeSceneLog("", ` \u2514\u2500 Crumbs:`, ((_b = __privateGet$2(this, _profileInProgress)) == null ? void 0 : _b.crumbs) || []);
|
|
1103
|
+
__privateSet$2(this, _recordedTrailingSpans, []);
|
|
1104
|
+
const profileDuration = measurementStartTs - profileStartTs;
|
|
1105
|
+
if (typeof performance !== "undefined" && performance.mark) {
|
|
1106
|
+
const profileName = ((_c = __privateGet$2(this, _profileInProgress)) == null ? void 0 : _c.origin) || "unknown";
|
|
1107
|
+
const totalTime = profileDuration + slowFramesTime;
|
|
1108
|
+
performance.mark(`Dashboard Profile End: ${profileName}`);
|
|
1109
|
+
const startMarkName = `Dashboard Profile Start: ${profileName}`;
|
|
1110
|
+
try {
|
|
1111
|
+
performance.measure(
|
|
1112
|
+
`Dashboard Profile: ${profileName} (${totalTime.toFixed(1)}ms)`,
|
|
1113
|
+
startMarkName,
|
|
1114
|
+
`Dashboard Profile End: ${profileName}`
|
|
1115
|
+
);
|
|
1116
|
+
} catch (e) {
|
|
1117
|
+
performance.mark(`Dashboard Profile Complete: ${profileName} (${totalTime.toFixed(1)}ms)`);
|
|
1118
|
+
}
|
|
1119
|
+
if (slowFrames.length > 0) {
|
|
1120
|
+
const slowFramesMarkName = `Slow Frames Summary: ${slowFrames.length} frames (${slowFramesTime.toFixed(
|
|
1121
|
+
1
|
|
1122
|
+
)}ms)`;
|
|
1123
|
+
performance.mark(slowFramesMarkName);
|
|
1124
|
+
slowFrames.forEach((frameTime, index) => {
|
|
1125
|
+
if (frameTime > 16) {
|
|
1126
|
+
try {
|
|
1127
|
+
const frameStartTime = __privateGet$2(this, _profileStartTs) + profileDuration + (index > 0 ? slowFrames.slice(0, index).reduce((sum, t) => sum + t, 0) : 0);
|
|
1128
|
+
const frameId = `slow-frame-${index}`;
|
|
1129
|
+
const frameStartMark = `${frameId}-start`;
|
|
1130
|
+
const frameEndMark = `${frameId}-end`;
|
|
1131
|
+
performance.mark(frameStartMark, { startTime: frameStartTime });
|
|
1132
|
+
performance.mark(frameEndMark, { startTime: frameStartTime + frameTime });
|
|
1133
|
+
performance.measure(`Slow Frame ${index + 1}: ${frameTime.toFixed(1)}ms`, frameStartMark, frameEndMark);
|
|
1134
|
+
} catch (e) {
|
|
1135
|
+
performance.mark(`Slow Frame ${index + 1}: ${frameTime.toFixed(1)}ms`);
|
|
1136
|
+
}
|
|
1137
|
+
}
|
|
1138
|
+
});
|
|
1139
|
+
}
|
|
1140
|
+
}
|
|
1141
|
+
const completionTimestamp = performance.now();
|
|
1142
|
+
writeSceneLog("SceneRenderProfiler", "Profile completed");
|
|
1143
|
+
writeSceneLog("", ` \u251C\u2500 Timestamp: ${completionTimestamp.toFixed(1)}ms`);
|
|
1144
|
+
writeSceneLog("", ` \u251C\u2500 Total time: ${(profileDuration + slowFramesTime).toFixed(1)}ms`);
|
|
1145
|
+
writeSceneLog("", ` \u251C\u2500 Slow frames: ${slowFramesTime}ms (${slowFrames.length} frames)`);
|
|
1146
|
+
writeSceneLog("", ` \u2514\u2500 Long frames: ${__privateGet$2(this, _longFramesTotalTime)}ms (${__privateGet$2(this, _longFramesCount)} frames)`);
|
|
1147
|
+
__privateGet$2(this, _longFrameDetector).stop();
|
|
1148
|
+
writeSceneLogStyled(
|
|
1149
|
+
"SceneRenderProfiler",
|
|
1150
|
+
`Stopped long frame detection - profile complete at ${completionTimestamp.toFixed(1)}ms`,
|
|
1151
|
+
"color: #00CC00; font-weight: bold;"
|
|
1152
|
+
);
|
|
1153
|
+
__privateSet$2(this, _trailAnimationFrameId, null);
|
|
1154
|
+
const profileEndTs = profileStartTs + profileDuration + slowFramesTime;
|
|
1155
|
+
if (!__privateGet$2(this, _profileInProgress)) {
|
|
1156
|
+
return;
|
|
1157
|
+
}
|
|
1158
|
+
performance.measure(`DashboardInteraction ${__privateGet$2(this, _profileInProgress).origin}`, {
|
|
1159
|
+
start: profileStartTs,
|
|
1160
|
+
end: profileEndTs
|
|
1161
|
+
});
|
|
1162
|
+
const networkDuration = captureNetwork(profileStartTs, profileEndTs);
|
|
1163
|
+
if (((_d = this.queryController) == null ? void 0 : _d.state.onProfileComplete) && __privateGet$2(this, _profileInProgress)) {
|
|
1164
|
+
this.queryController.state.onProfileComplete({
|
|
1165
|
+
origin: __privateGet$2(this, _profileInProgress).origin,
|
|
1166
|
+
crumbs: __privateGet$2(this, _profileInProgress).crumbs,
|
|
1167
|
+
duration: profileDuration + slowFramesTime,
|
|
1168
|
+
networkDuration,
|
|
1169
|
+
startTs: profileStartTs,
|
|
1170
|
+
endTs: profileEndTs,
|
|
1171
|
+
longFramesCount: __privateGet$2(this, _longFramesCount),
|
|
1172
|
+
longFramesTotalTime: __privateGet$2(this, _longFramesTotalTime),
|
|
1173
|
+
// @ts-ignore
|
|
1174
|
+
jsHeapSizeLimit: performance.memory ? performance.memory.jsHeapSizeLimit : 0,
|
|
1175
|
+
// @ts-ignore
|
|
1176
|
+
usedJSHeapSize: performance.memory ? performance.memory.usedJSHeapSize : 0,
|
|
1177
|
+
// @ts-ignore
|
|
1178
|
+
totalJSHeapSize: performance.memory ? performance.memory.totalJSHeapSize : 0
|
|
1179
|
+
});
|
|
1180
|
+
__privateSet$2(this, _profileInProgress, null);
|
|
1181
|
+
__privateSet$2(this, _trailAnimationFrameId, null);
|
|
1182
|
+
}
|
|
1183
|
+
if (window.__runs) {
|
|
1184
|
+
window.__runs += `${Date.now()}, ${profileDuration + slowFramesTime}
|
|
1185
|
+
`;
|
|
1186
|
+
} else {
|
|
1187
|
+
window.__runs = `${Date.now()}, ${profileDuration + slowFramesTime}
|
|
1188
|
+
`;
|
|
1189
|
+
}
|
|
1190
|
+
}
|
|
1191
|
+
};
|
|
1192
|
+
__privateSet$2(this, _longFrameDetector, new LongFrameDetector());
|
|
1193
|
+
this.setupVisibilityChangeHandler();
|
|
1194
|
+
}
|
|
1195
|
+
setQueryController(queryController) {
|
|
1196
|
+
this.queryController = queryController;
|
|
1197
|
+
}
|
|
1198
|
+
setupVisibilityChangeHandler() {
|
|
1199
|
+
if (__privateGet$2(this, _visibilityChangeHandler)) {
|
|
1200
|
+
return;
|
|
1201
|
+
}
|
|
1202
|
+
__privateSet$2(this, _visibilityChangeHandler, () => {
|
|
1203
|
+
if (document.hidden && __privateGet$2(this, _profileInProgress)) {
|
|
1204
|
+
writeSceneLog("SceneRenderProfiler", "Tab became inactive, cancelling profile");
|
|
1205
|
+
this.cancelProfile();
|
|
1206
|
+
}
|
|
1207
|
+
});
|
|
1208
|
+
if (typeof document !== "undefined") {
|
|
1209
|
+
document.addEventListener("visibilitychange", __privateGet$2(this, _visibilityChangeHandler));
|
|
1210
|
+
}
|
|
1211
|
+
}
|
|
1212
|
+
cleanup() {
|
|
1213
|
+
if (__privateGet$2(this, _visibilityChangeHandler) && typeof document !== "undefined") {
|
|
1214
|
+
document.removeEventListener("visibilitychange", __privateGet$2(this, _visibilityChangeHandler));
|
|
1215
|
+
__privateSet$2(this, _visibilityChangeHandler, null);
|
|
1034
1216
|
}
|
|
1217
|
+
__privateGet$2(this, _longFrameDetector).stop();
|
|
1218
|
+
this.cancelProfile();
|
|
1035
1219
|
}
|
|
1036
|
-
|
|
1037
|
-
|
|
1038
|
-
|
|
1039
|
-
|
|
1040
|
-
|
|
1041
|
-
|
|
1042
|
-
|
|
1043
|
-
|
|
1044
|
-
|
|
1045
|
-
|
|
1046
|
-
|
|
1047
|
-
}
|
|
1220
|
+
startProfile(name) {
|
|
1221
|
+
if (document.hidden) {
|
|
1222
|
+
writeSceneLog("SceneRenderProfiler", "Tab is inactive, skipping profile", name);
|
|
1223
|
+
return;
|
|
1224
|
+
}
|
|
1225
|
+
if (__privateGet$2(this, _profileInProgress)) {
|
|
1226
|
+
if (__privateGet$2(this, _trailAnimationFrameId)) {
|
|
1227
|
+
this.cancelProfile();
|
|
1228
|
+
this._startNewProfile(name, true);
|
|
1229
|
+
} else {
|
|
1230
|
+
this.addCrumb(name);
|
|
1048
1231
|
}
|
|
1232
|
+
} else {
|
|
1233
|
+
this._startNewProfile(name);
|
|
1049
1234
|
}
|
|
1050
|
-
parent = parent.parent;
|
|
1051
1235
|
}
|
|
1052
|
-
|
|
1053
|
-
|
|
1054
|
-
|
|
1055
|
-
|
|
1056
|
-
|
|
1057
|
-
|
|
1058
|
-
|
|
1059
|
-
|
|
1236
|
+
/**
|
|
1237
|
+
* Starts a new profile for performance measurement.
|
|
1238
|
+
*
|
|
1239
|
+
* @param name - The origin/trigger of the profile (e.g., 'time_range_change', 'variable_value_changed')
|
|
1240
|
+
* @param force - Whether this is a "forced" profile (true) or "clean" profile (false)
|
|
1241
|
+
* - "forced": Started by canceling an existing profile that was recording trailing frames
|
|
1242
|
+
* This happens when a new user interaction occurs before the previous one
|
|
1243
|
+
* finished measuring its performance impact
|
|
1244
|
+
* - "clean": Started when no profile is currently active
|
|
1245
|
+
*/
|
|
1246
|
+
_startNewProfile(name, force = false) {
|
|
1247
|
+
var _a;
|
|
1248
|
+
__privateSet$2(this, _profileInProgress, { origin: name, crumbs: [] });
|
|
1249
|
+
__privateSet$2(this, _profileStartTs, performance.now());
|
|
1250
|
+
__privateSet$2(this, _longFramesCount, 0);
|
|
1251
|
+
__privateSet$2(this, _longFramesTotalTime, 0);
|
|
1252
|
+
if (typeof performance !== "undefined" && performance.mark) {
|
|
1253
|
+
const markName = `Dashboard Profile Start: ${name}`;
|
|
1254
|
+
performance.mark(markName);
|
|
1255
|
+
}
|
|
1256
|
+
writeSceneLogStyled(
|
|
1257
|
+
"SceneRenderProfiler",
|
|
1258
|
+
`Profile started[${force ? "forced" : "clean"}]`,
|
|
1259
|
+
"color: #FFCC00; font-weight: bold;"
|
|
1260
|
+
);
|
|
1261
|
+
writeSceneLog("", ` \u251C\u2500 Origin: ${((_a = __privateGet$2(this, _profileInProgress)) == null ? void 0 : _a.origin) || "unknown"}`);
|
|
1262
|
+
writeSceneLog("", ` \u2514\u2500 Timestamp: ${__privateGet$2(this, _profileStartTs).toFixed(1)}ms`);
|
|
1263
|
+
__privateGet$2(this, _longFrameDetector).start((event) => {
|
|
1264
|
+
if (!__privateGet$2(this, _profileInProgress) || !__privateGet$2(this, _profileStartTs)) {
|
|
1265
|
+
return;
|
|
1266
|
+
}
|
|
1267
|
+
if (event.timestamp < __privateGet$2(this, _profileStartTs)) {
|
|
1268
|
+
return;
|
|
1269
|
+
}
|
|
1270
|
+
__privateWrapper(this, _longFramesCount)._++;
|
|
1271
|
+
__privateSet$2(this, _longFramesTotalTime, __privateGet$2(this, _longFramesTotalTime) + event.duration);
|
|
1060
1272
|
});
|
|
1061
1273
|
}
|
|
1062
|
-
|
|
1063
|
-
|
|
1064
|
-
|
|
1065
|
-
|
|
1066
|
-
};
|
|
1067
|
-
return rxjs.of(result);
|
|
1068
|
-
}
|
|
1069
|
-
}
|
|
1070
|
-
const emptyPanelData = {
|
|
1071
|
-
state: schema.LoadingState.Done,
|
|
1072
|
-
series: [],
|
|
1073
|
-
timeRange: data.getDefaultTimeRange()
|
|
1074
|
-
};
|
|
1075
|
-
|
|
1076
|
-
class SceneObjectUrlSyncConfig {
|
|
1077
|
-
constructor(_sceneObject, _options) {
|
|
1078
|
-
this._sceneObject = _sceneObject;
|
|
1079
|
-
this._nextChangeShouldAddHistoryStep = false;
|
|
1080
|
-
this._keys = _options.keys;
|
|
1274
|
+
recordProfileTail(measurementStartTime, profileStartTs) {
|
|
1275
|
+
__privateSet$2(this, _trailAnimationFrameId, requestAnimationFrame(
|
|
1276
|
+
() => this.measureTrailingFrames(measurementStartTime, measurementStartTime, profileStartTs)
|
|
1277
|
+
));
|
|
1081
1278
|
}
|
|
1082
|
-
|
|
1083
|
-
|
|
1084
|
-
|
|
1279
|
+
tryCompletingProfile() {
|
|
1280
|
+
var _a;
|
|
1281
|
+
writeSceneLog("SceneRenderProfiler", "Trying to complete profile", __privateGet$2(this, _profileInProgress));
|
|
1282
|
+
if (((_a = this.queryController) == null ? void 0 : _a.runningQueriesCount()) === 0 && __privateGet$2(this, _profileInProgress)) {
|
|
1283
|
+
writeSceneLog("SceneRenderProfiler", "All queries completed, starting tail measurement");
|
|
1284
|
+
this.recordProfileTail(performance.now(), __privateGet$2(this, _profileStartTs));
|
|
1085
1285
|
}
|
|
1086
|
-
return this._keys;
|
|
1087
|
-
}
|
|
1088
|
-
getUrlState() {
|
|
1089
|
-
return this._sceneObject.getUrlState();
|
|
1090
1286
|
}
|
|
1091
|
-
|
|
1092
|
-
this
|
|
1287
|
+
isTailRecording() {
|
|
1288
|
+
return Boolean(__privateGet$2(this, _trailAnimationFrameId));
|
|
1093
1289
|
}
|
|
1094
|
-
|
|
1095
|
-
|
|
1290
|
+
cancelTailRecording() {
|
|
1291
|
+
if (__privateGet$2(this, _trailAnimationFrameId)) {
|
|
1292
|
+
cancelAnimationFrame(__privateGet$2(this, _trailAnimationFrameId));
|
|
1293
|
+
__privateSet$2(this, _trailAnimationFrameId, null);
|
|
1294
|
+
writeSceneLog("SceneRenderProfiler", "Cancelled recording frames, new profile started");
|
|
1295
|
+
}
|
|
1096
1296
|
}
|
|
1097
|
-
|
|
1098
|
-
|
|
1099
|
-
|
|
1100
|
-
|
|
1297
|
+
// cancel profile
|
|
1298
|
+
cancelProfile() {
|
|
1299
|
+
if (__privateGet$2(this, _profileInProgress)) {
|
|
1300
|
+
writeSceneLog("SceneRenderProfiler", "Cancelling profile", __privateGet$2(this, _profileInProgress));
|
|
1301
|
+
__privateSet$2(this, _profileInProgress, null);
|
|
1302
|
+
if (__privateGet$2(this, _trailAnimationFrameId)) {
|
|
1303
|
+
cancelAnimationFrame(__privateGet$2(this, _trailAnimationFrameId));
|
|
1304
|
+
__privateSet$2(this, _trailAnimationFrameId, null);
|
|
1305
|
+
}
|
|
1306
|
+
__privateGet$2(this, _longFrameDetector).stop();
|
|
1307
|
+
writeSceneLog("SceneRenderProfiler", "Stopped long frame detection - profile cancelled");
|
|
1308
|
+
__privateSet$2(this, _recordedTrailingSpans, []);
|
|
1309
|
+
__privateSet$2(this, _longFramesCount, 0);
|
|
1310
|
+
__privateSet$2(this, _longFramesTotalTime, 0);
|
|
1311
|
+
}
|
|
1101
1312
|
}
|
|
1102
|
-
|
|
1103
|
-
|
|
1104
|
-
|
|
1105
|
-
|
|
1106
|
-
|
|
1107
|
-
while (curSceneObject && !extracted) {
|
|
1108
|
-
extracted = extract(curSceneObject);
|
|
1109
|
-
curSceneObject = curSceneObject.parent;
|
|
1313
|
+
addCrumb(crumb) {
|
|
1314
|
+
if (__privateGet$2(this, _profileInProgress)) {
|
|
1315
|
+
writeSceneLog("SceneRenderProfiler", "Adding crumb:", crumb);
|
|
1316
|
+
__privateGet$2(this, _profileInProgress).crumbs.push(crumb);
|
|
1317
|
+
}
|
|
1110
1318
|
}
|
|
1111
|
-
return extracted;
|
|
1112
1319
|
}
|
|
1113
|
-
|
|
1114
|
-
|
|
1115
|
-
|
|
1116
|
-
|
|
1117
|
-
|
|
1118
|
-
|
|
1119
|
-
|
|
1120
|
-
|
|
1121
|
-
|
|
1122
|
-
|
|
1123
|
-
|
|
1124
|
-
|
|
1125
|
-
if (value.length === 8) {
|
|
1126
|
-
const utcValue = data.toUtc(value, "YYYYMMDD");
|
|
1127
|
-
if (utcValue.isValid()) {
|
|
1128
|
-
return utcValue.toISOString();
|
|
1129
|
-
}
|
|
1130
|
-
} else if (value.length === 15) {
|
|
1131
|
-
const utcValue = data.toUtc(value, "YYYYMMDDTHHmmss");
|
|
1132
|
-
if (utcValue.isValid()) {
|
|
1133
|
-
return utcValue.toISOString();
|
|
1134
|
-
}
|
|
1135
|
-
} else if (value.length === 19) {
|
|
1136
|
-
const utcValue = data.toUtc(value, "YYYY-MM-DD HH:mm:ss");
|
|
1137
|
-
if (utcValue.isValid()) {
|
|
1138
|
-
return utcValue.toISOString();
|
|
1320
|
+
_profileInProgress = new WeakMap();
|
|
1321
|
+
_profileStartTs = new WeakMap();
|
|
1322
|
+
_trailAnimationFrameId = new WeakMap();
|
|
1323
|
+
_recordedTrailingSpans = new WeakMap();
|
|
1324
|
+
_longFrameDetector = new WeakMap();
|
|
1325
|
+
_longFramesCount = new WeakMap();
|
|
1326
|
+
_longFramesTotalTime = new WeakMap();
|
|
1327
|
+
_visibilityChangeHandler = new WeakMap();
|
|
1328
|
+
function processRecordedSpans(spans) {
|
|
1329
|
+
for (let i = spans.length - 1; i >= 0; i--) {
|
|
1330
|
+
if (spans[i] > DEFAULT_LONG_FRAME_THRESHOLD) {
|
|
1331
|
+
return spans.slice(0, i + 1);
|
|
1139
1332
|
}
|
|
1140
|
-
} else if (value.length === 24) {
|
|
1141
|
-
const utcValue = data.toUtc(value);
|
|
1142
|
-
return utcValue.toISOString();
|
|
1143
1333
|
}
|
|
1144
|
-
|
|
1145
|
-
|
|
1146
|
-
|
|
1334
|
+
return [spans[0]];
|
|
1335
|
+
}
|
|
1336
|
+
function captureNetwork(startTs, endTs) {
|
|
1337
|
+
const entries = performance.getEntriesByType("resource");
|
|
1338
|
+
performance.clearResourceTimings();
|
|
1339
|
+
const networkEntries = entries.filter(
|
|
1340
|
+
(entry) => entry.startTime >= startTs && entry.startTime <= endTs && entry.responseEnd >= startTs && entry.responseEnd <= endTs
|
|
1341
|
+
);
|
|
1342
|
+
for (const entry of networkEntries) {
|
|
1343
|
+
performance.measure("Network entry " + entry.name, {
|
|
1344
|
+
start: entry.startTime,
|
|
1345
|
+
end: entry.responseEnd
|
|
1346
|
+
});
|
|
1147
1347
|
}
|
|
1148
|
-
return
|
|
1348
|
+
return calculateNetworkTime(networkEntries);
|
|
1149
1349
|
}
|
|
1150
|
-
|
|
1151
|
-
|
|
1152
|
-
|
|
1153
|
-
const now = Date.now();
|
|
1154
|
-
if (weekStart) {
|
|
1155
|
-
setWeekStartIfDifferent(weekStart);
|
|
1350
|
+
function calculateNetworkTime(requests) {
|
|
1351
|
+
if (requests.length === 0) {
|
|
1352
|
+
return 0;
|
|
1156
1353
|
}
|
|
1157
|
-
|
|
1158
|
-
|
|
1159
|
-
|
|
1354
|
+
requests.sort((a, b) => a.startTime - b.startTime);
|
|
1355
|
+
let totalNetworkTime = 0;
|
|
1356
|
+
let currentStart = requests[0].startTime;
|
|
1357
|
+
let currentEnd = requests[0].responseEnd;
|
|
1358
|
+
for (let i = 1; i < requests.length; i++) {
|
|
1359
|
+
if (requests[i].startTime <= currentEnd) {
|
|
1360
|
+
currentEnd = Math.max(currentEnd, requests[i].responseEnd);
|
|
1160
1361
|
} else {
|
|
1161
|
-
|
|
1162
|
-
|
|
1163
|
-
|
|
1164
|
-
return {
|
|
1165
|
-
to: parseOrToDateTime(hasDelay ? "now-" + delay : to, {
|
|
1166
|
-
roundUp: true,
|
|
1167
|
-
timezone: timeZone,
|
|
1168
|
-
fiscalYearStartMonth,
|
|
1169
|
-
now
|
|
1170
|
-
}),
|
|
1171
|
-
from: parseOrToDateTime(from, {
|
|
1172
|
-
roundUp: false,
|
|
1173
|
-
timezone: timeZone,
|
|
1174
|
-
fiscalYearStartMonth,
|
|
1175
|
-
now
|
|
1176
|
-
}),
|
|
1177
|
-
raw: {
|
|
1178
|
-
from,
|
|
1179
|
-
to
|
|
1362
|
+
totalNetworkTime += currentEnd - currentStart;
|
|
1363
|
+
currentStart = requests[i].startTime;
|
|
1364
|
+
currentEnd = requests[i].responseEnd;
|
|
1180
1365
|
}
|
|
1181
|
-
};
|
|
1182
|
-
}
|
|
1183
|
-
let prevWeekStart;
|
|
1184
|
-
function setWeekStartIfDifferent(weekStart) {
|
|
1185
|
-
if (weekStart !== prevWeekStart) {
|
|
1186
|
-
prevWeekStart = weekStart;
|
|
1187
|
-
data.setWeekStart(weekStart);
|
|
1188
|
-
}
|
|
1189
|
-
}
|
|
1190
|
-
|
|
1191
|
-
function isValid$1(value, roundUp, timeZone) {
|
|
1192
|
-
if (data.isDateTime(value)) {
|
|
1193
|
-
return value.isValid();
|
|
1194
|
-
}
|
|
1195
|
-
if (data.dateMath.isMathString(value)) {
|
|
1196
|
-
return data.dateMath.isValid(value);
|
|
1197
1366
|
}
|
|
1198
|
-
|
|
1199
|
-
return
|
|
1367
|
+
totalNetworkTime += currentEnd - currentStart;
|
|
1368
|
+
return totalNetworkTime;
|
|
1200
1369
|
}
|
|
1370
|
+
const REFRESH_INTERACTION = "refresh";
|
|
1371
|
+
const TIME_RANGE_CHANGE_INTERACTION = "time_range_change";
|
|
1372
|
+
const FILTER_REMOVED_INTERACTION = "filter_removed";
|
|
1373
|
+
const FILTER_CHANGED_INTERACTION = "filter_changed";
|
|
1374
|
+
const FILTER_RESTORED_INTERACTION = "filter_restored";
|
|
1375
|
+
const VARIABLE_VALUE_CHANGED_INTERACTION = "variable_value_changed";
|
|
1376
|
+
const SCOPES_CHANGED_INTERACTION = "scopes_changed";
|
|
1201
1377
|
|
|
1202
1378
|
class SceneTimeRange extends SceneObjectBase {
|
|
1203
1379
|
constructor(state = {}) {
|
|
@@ -3784,13 +3960,10 @@ function GroupByVariableRenderer({ model }) {
|
|
|
3784
3960
|
setUncommittedValue(newValue);
|
|
3785
3961
|
},
|
|
3786
3962
|
onOpenMenu: async () => {
|
|
3787
|
-
const profiler = getInteractionProfiler(model);
|
|
3788
|
-
profiler == null ? void 0 : profiler.startProfile(USER_INTERACTIONS.GROUPBY_DROPDOWN);
|
|
3789
3963
|
setIsFetchingOptions(true);
|
|
3790
3964
|
await rxjs.lastValueFrom(model.validateAndUpdate());
|
|
3791
3965
|
setIsFetchingOptions(false);
|
|
3792
3966
|
setIsOptionsOpen(true);
|
|
3793
|
-
profiler == null ? void 0 : profiler.stopProfile();
|
|
3794
3967
|
},
|
|
3795
3968
|
onCloseMenu: () => {
|
|
3796
3969
|
setIsOptionsOpen(false);
|
|
@@ -3840,13 +4013,10 @@ function GroupByVariableRenderer({ model }) {
|
|
|
3840
4013
|
}
|
|
3841
4014
|
},
|
|
3842
4015
|
onOpenMenu: async () => {
|
|
3843
|
-
const profiler = getInteractionProfiler(model);
|
|
3844
|
-
profiler == null ? void 0 : profiler.startProfile(USER_INTERACTIONS.GROUPBY_DROPDOWN);
|
|
3845
4016
|
setIsFetchingOptions(true);
|
|
3846
4017
|
await rxjs.lastValueFrom(model.validateAndUpdate());
|
|
3847
4018
|
setIsFetchingOptions(false);
|
|
3848
4019
|
setIsOptionsOpen(true);
|
|
3849
|
-
profiler == null ? void 0 : profiler.stopProfile();
|
|
3850
4020
|
},
|
|
3851
4021
|
onCloseMenu: () => {
|
|
3852
4022
|
setIsOptionsOpen(false);
|
|
@@ -5011,11 +5181,6 @@ const AdHocCombobox = React.forwardRef(function AdHocCombobox2({ filter, model,
|
|
|
5011
5181
|
const handleFetchOptions = React.useCallback(
|
|
5012
5182
|
async (inputType) => {
|
|
5013
5183
|
var _a2;
|
|
5014
|
-
const profiler = getInteractionProfiler(model);
|
|
5015
|
-
const interactionName = inputType === "key" ? USER_INTERACTIONS.ADHOC_KEYS_DROPDOWN : USER_INTERACTIONS.ADHOC_VALUES_DROPDOWN;
|
|
5016
|
-
if (inputType !== "operator") {
|
|
5017
|
-
profiler == null ? void 0 : profiler.startProfile(interactionName);
|
|
5018
|
-
}
|
|
5019
5184
|
setOptionsError(false);
|
|
5020
5185
|
setOptionsLoading(true);
|
|
5021
5186
|
setOptions([]);
|
|
@@ -5029,7 +5194,6 @@ const AdHocCombobox = React.forwardRef(function AdHocCombobox2({ filter, model,
|
|
|
5029
5194
|
options2 = await model._getValuesFor(filter);
|
|
5030
5195
|
}
|
|
5031
5196
|
if (filterInputTypeRef.current !== inputType) {
|
|
5032
|
-
profiler == null ? void 0 : profiler.stopProfile();
|
|
5033
5197
|
return;
|
|
5034
5198
|
}
|
|
5035
5199
|
setOptions(options2);
|
|
@@ -5042,7 +5206,6 @@ const AdHocCombobox = React.forwardRef(function AdHocCombobox2({ filter, model,
|
|
|
5042
5206
|
setOptionsError(true);
|
|
5043
5207
|
}
|
|
5044
5208
|
setOptionsLoading(false);
|
|
5045
|
-
profiler == null ? void 0 : profiler.stopProfile();
|
|
5046
5209
|
},
|
|
5047
5210
|
[filter, model]
|
|
5048
5211
|
);
|
|
@@ -8090,7 +8253,6 @@ const sceneGraph = {
|
|
|
8090
8253
|
findAllObjects,
|
|
8091
8254
|
getAncestor,
|
|
8092
8255
|
getQueryController,
|
|
8093
|
-
getInteractionProfiler,
|
|
8094
8256
|
findDescendents,
|
|
8095
8257
|
getScopes
|
|
8096
8258
|
};
|
|
@@ -9590,7 +9752,6 @@ var index$1 = /*#__PURE__*/Object.freeze({
|
|
|
9590
9752
|
ActWhenVariableChanged: ActWhenVariableChanged,
|
|
9591
9753
|
CursorSync: CursorSync,
|
|
9592
9754
|
LiveNowTimer: LiveNowTimer,
|
|
9593
|
-
SceneInteractionProfiler: SceneInteractionProfiler,
|
|
9594
9755
|
SceneQueryController: SceneQueryController
|
|
9595
9756
|
});
|
|
9596
9757
|
|
|
@@ -11634,15 +11795,14 @@ function SceneGridLayoutRenderer({ model }) {
|
|
|
11634
11795
|
))
|
|
11635
11796
|
);
|
|
11636
11797
|
};
|
|
11637
|
-
return /* @__PURE__ */ React__default.default.createElement(
|
|
11638
|
-
"div",
|
|
11639
|
-
{
|
|
11640
|
-
ref: outerDivRef,
|
|
11641
|
-
style: { flex: "1 1 auto", position: "relative", zIndex: 1, width: "100%" }
|
|
11642
|
-
},
|
|
11643
|
-
renderGrid(width, height)
|
|
11644
|
-
);
|
|
11798
|
+
return /* @__PURE__ */ React__default.default.createElement("div", { ref: outerDivRef, className: gridWrapperClass }, renderGrid(width, height));
|
|
11645
11799
|
}
|
|
11800
|
+
const gridWrapperClass = css.css({
|
|
11801
|
+
flex: "1 1 auto",
|
|
11802
|
+
position: "relative",
|
|
11803
|
+
zIndex: 1,
|
|
11804
|
+
width: "100%"
|
|
11805
|
+
});
|
|
11646
11806
|
const GridItemWrapper = React__default.default.forwardRef((props, ref) => {
|
|
11647
11807
|
var _a;
|
|
11648
11808
|
const { grid, layoutItem, index, totalCount, isLazy, style, onLoad, onChange, children, ...divProps } = props;
|
|
@@ -11847,6 +12007,20 @@ const _SceneGridLayout = class _SceneGridLayout extends SceneObjectBase {
|
|
|
11847
12007
|
}
|
|
11848
12008
|
};
|
|
11849
12009
|
}
|
|
12010
|
+
adjustYPositions(after, amount) {
|
|
12011
|
+
for (const child of this.state.children) {
|
|
12012
|
+
if (child.state.y > after) {
|
|
12013
|
+
child.setState({ y: child.state.y + amount });
|
|
12014
|
+
}
|
|
12015
|
+
if (child instanceof SceneGridRow) {
|
|
12016
|
+
for (const rowChild of child.state.children) {
|
|
12017
|
+
if (rowChild.state.y > after) {
|
|
12018
|
+
rowChild.setState({ y: rowChild.state.y + amount });
|
|
12019
|
+
}
|
|
12020
|
+
}
|
|
12021
|
+
}
|
|
12022
|
+
}
|
|
12023
|
+
}
|
|
11850
12024
|
toggleRow(row) {
|
|
11851
12025
|
var _a, _b;
|
|
11852
12026
|
const isCollapsed = row.state.isCollapsed;
|
|
@@ -14887,25 +15061,25 @@ const VizConfigBuilders = {
|
|
|
14887
15061
|
|
|
14888
15062
|
function __variableDynamicImportRuntime0__(path) {
|
|
14889
15063
|
switch (path) {
|
|
14890
|
-
case '../locales/cs-CZ/grafana-scenes.json': return Promise.resolve().then(function () { return require('./grafana-scenes-
|
|
14891
|
-
case '../locales/de-DE/grafana-scenes.json': return Promise.resolve().then(function () { return require('./grafana-scenes-
|
|
15064
|
+
case '../locales/cs-CZ/grafana-scenes.json': return Promise.resolve().then(function () { return require('./grafana-scenes-BcDO8gk4.js'); });
|
|
15065
|
+
case '../locales/de-DE/grafana-scenes.json': return Promise.resolve().then(function () { return require('./grafana-scenes-CzZTvOrf.js'); });
|
|
14892
15066
|
case '../locales/en-US/grafana-scenes.json': return Promise.resolve().then(function () { return require('./grafana-scenes-C_CT7peT.js'); });
|
|
14893
|
-
case '../locales/es-ES/grafana-scenes.json': return Promise.resolve().then(function () { return require('./grafana-scenes-
|
|
14894
|
-
case '../locales/fr-FR/grafana-scenes.json': return Promise.resolve().then(function () { return require('./grafana-scenes-
|
|
14895
|
-
case '../locales/hu-HU/grafana-scenes.json': return Promise.resolve().then(function () { return require('./grafana-scenes-
|
|
14896
|
-
case '../locales/id-ID/grafana-scenes.json': return Promise.resolve().then(function () { return require('./grafana-scenes-
|
|
14897
|
-
case '../locales/it-IT/grafana-scenes.json': return Promise.resolve().then(function () { return require('./grafana-scenes-
|
|
14898
|
-
case '../locales/ja-JP/grafana-scenes.json': return Promise.resolve().then(function () { return require('./grafana-scenes-
|
|
14899
|
-
case '../locales/ko-KR/grafana-scenes.json': return Promise.resolve().then(function () { return require('./grafana-scenes-
|
|
14900
|
-
case '../locales/nl-NL/grafana-scenes.json': return Promise.resolve().then(function () { return require('./grafana-scenes-
|
|
14901
|
-
case '../locales/pl-PL/grafana-scenes.json': return Promise.resolve().then(function () { return require('./grafana-scenes-
|
|
14902
|
-
case '../locales/pt-BR/grafana-scenes.json': return Promise.resolve().then(function () { return require('./grafana-scenes-
|
|
14903
|
-
case '../locales/pt-PT/grafana-scenes.json': return Promise.resolve().then(function () { return require('./grafana-scenes-
|
|
14904
|
-
case '../locales/ru-RU/grafana-scenes.json': return Promise.resolve().then(function () { return require('./grafana-scenes-
|
|
14905
|
-
case '../locales/sv-SE/grafana-scenes.json': return Promise.resolve().then(function () { return require('./grafana-scenes-
|
|
14906
|
-
case '../locales/tr-TR/grafana-scenes.json': return Promise.resolve().then(function () { return require('./grafana-scenes-
|
|
14907
|
-
case '../locales/zh-Hans/grafana-scenes.json': return Promise.resolve().then(function () { return require('./grafana-scenes-
|
|
14908
|
-
case '../locales/zh-Hant/grafana-scenes.json': return Promise.resolve().then(function () { return require('./grafana-scenes-
|
|
15067
|
+
case '../locales/es-ES/grafana-scenes.json': return Promise.resolve().then(function () { return require('./grafana-scenes-zGpJY4O3.js'); });
|
|
15068
|
+
case '../locales/fr-FR/grafana-scenes.json': return Promise.resolve().then(function () { return require('./grafana-scenes-CfoPR_PZ.js'); });
|
|
15069
|
+
case '../locales/hu-HU/grafana-scenes.json': return Promise.resolve().then(function () { return require('./grafana-scenes-CoXR5Z7T.js'); });
|
|
15070
|
+
case '../locales/id-ID/grafana-scenes.json': return Promise.resolve().then(function () { return require('./grafana-scenes-kfW02M-K.js'); });
|
|
15071
|
+
case '../locales/it-IT/grafana-scenes.json': return Promise.resolve().then(function () { return require('./grafana-scenes-CMtHJ23j.js'); });
|
|
15072
|
+
case '../locales/ja-JP/grafana-scenes.json': return Promise.resolve().then(function () { return require('./grafana-scenes-cTJt4LR7.js'); });
|
|
15073
|
+
case '../locales/ko-KR/grafana-scenes.json': return Promise.resolve().then(function () { return require('./grafana-scenes-BbJq3cEa.js'); });
|
|
15074
|
+
case '../locales/nl-NL/grafana-scenes.json': return Promise.resolve().then(function () { return require('./grafana-scenes-BwQ_A3lk.js'); });
|
|
15075
|
+
case '../locales/pl-PL/grafana-scenes.json': return Promise.resolve().then(function () { return require('./grafana-scenes-BbRDYrqK.js'); });
|
|
15076
|
+
case '../locales/pt-BR/grafana-scenes.json': return Promise.resolve().then(function () { return require('./grafana-scenes-naZktXG6.js'); });
|
|
15077
|
+
case '../locales/pt-PT/grafana-scenes.json': return Promise.resolve().then(function () { return require('./grafana-scenes-CixWq8rH.js'); });
|
|
15078
|
+
case '../locales/ru-RU/grafana-scenes.json': return Promise.resolve().then(function () { return require('./grafana-scenes-VOzZRdKp.js'); });
|
|
15079
|
+
case '../locales/sv-SE/grafana-scenes.json': return Promise.resolve().then(function () { return require('./grafana-scenes-BtGEpoZT.js'); });
|
|
15080
|
+
case '../locales/tr-TR/grafana-scenes.json': return Promise.resolve().then(function () { return require('./grafana-scenes-CqMfWT-f.js'); });
|
|
15081
|
+
case '../locales/zh-Hans/grafana-scenes.json': return Promise.resolve().then(function () { return require('./grafana-scenes-CS09sc_L.js'); });
|
|
15082
|
+
case '../locales/zh-Hant/grafana-scenes.json': return Promise.resolve().then(function () { return require('./grafana-scenes-C-CibbsO.js'); });
|
|
14909
15083
|
default: return new Promise(function(resolve, reject) {
|
|
14910
15084
|
(typeof queueMicrotask === 'function' ? queueMicrotask : setTimeout)(
|
|
14911
15085
|
reject.bind(null, new Error("Unknown variable dynamic import: " + path))
|
|
@@ -15028,6 +15202,7 @@ exports.VizPanelExploreButton = VizPanelExploreButton;
|
|
|
15028
15202
|
exports.VizPanelMenu = VizPanelMenu;
|
|
15029
15203
|
exports.behaviors = index$1;
|
|
15030
15204
|
exports.dataLayers = index;
|
|
15205
|
+
exports.escapeUrlPipeDelimiters = escapeUrlPipeDelimiters;
|
|
15031
15206
|
exports.formatRegistry = formatRegistry;
|
|
15032
15207
|
exports.getExploreURL = getExploreURL;
|
|
15033
15208
|
exports.isCustomVariableValue = isCustomVariableValue;
|