From 8f56f1df98cd78a0383c53d96343f85818413a85 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ida=20=C5=A0tambuk?= Date: Wed, 1 Oct 2025 10:14:12 +0200 Subject: [PATCH] Dashboards: Add RS tracking for Dynamic Dashboards (#111102) --- .../edit-pane/EditPaneHeader.tsx | 2 +- .../pages/DashboardScenePageStateManager.ts | 2 +- .../saving/useSaveDashboard.ts | 16 +- .../dashboard-scene/scene/DashboardScene.tsx | 4 + .../scene/NavToolbarActions.test.tsx | 15 +- .../scene/NavToolbarActions.tsx | 4 +- .../actions/EditDashboardSwitch.tsx | 2 +- .../actions/MakeDashboardEditableButton.tsx | 2 +- .../DashboardSceneSerializer.test.ts | 140 +- .../serialization/DashboardSceneSerializer.ts | 154 ++- .../testfiles/nested_dashboard.json | 1159 +++++++++++++++++ .../dashboard-scene/utils/interactions.ts | 44 +- .../dashboard-scene/utils/test-utils.ts | 94 ++ .../dashboard-scene/utils/tracking.test.ts | 92 ++ .../dashboard-scene/utils/tracking.ts | 66 +- .../SaveDashboard/useDashboardSave.tsx | 16 +- .../app/features/dashboard/utils/tracking.ts | 28 +- 17 files changed, 1667 insertions(+), 173 deletions(-) create mode 100644 public/app/features/dashboard-scene/serialization/testfiles/nested_dashboard.json create mode 100644 public/app/features/dashboard-scene/utils/tracking.test.ts diff --git a/public/app/features/dashboard-scene/edit-pane/EditPaneHeader.tsx b/public/app/features/dashboard-scene/edit-pane/EditPaneHeader.tsx index e0e5a74a10a..b2a7a149715 100644 --- a/public/app/features/dashboard-scene/edit-pane/EditPaneHeader.tsx +++ b/public/app/features/dashboard-scene/edit-pane/EditPaneHeader.tsx @@ -4,7 +4,7 @@ import { GrafanaTheme2 } from '@grafana/data'; import { selectors } from '@grafana/e2e-selectors'; import { t } from '@grafana/i18n'; import { Button, Menu, Stack, Text, useStyles2, Dropdown, Icon, IconButton } from '@grafana/ui'; -import { trackDeleteDashboardElement } from 'app/features/dashboard/utils/tracking'; +import { trackDeleteDashboardElement } from 'app/features/dashboard-scene/utils/tracking'; import { EditableDashboardElement } from '../scene/types/EditableDashboardElement'; diff --git a/public/app/features/dashboard-scene/pages/DashboardScenePageStateManager.ts b/public/app/features/dashboard-scene/pages/DashboardScenePageStateManager.ts index 083a5e08799..00c02b5d727 100644 --- a/public/app/features/dashboard-scene/pages/DashboardScenePageStateManager.ts +++ b/public/app/features/dashboard-scene/pages/DashboardScenePageStateManager.ts @@ -20,7 +20,7 @@ import { isDashboardV2Resource, isDashboardV2Spec, isV2StoredVersion } from 'app import { dashboardLoaderSrv, DashboardLoaderSrvV2 } from 'app/features/dashboard/services/DashboardLoaderSrv'; import { getDashboardSrv } from 'app/features/dashboard/services/DashboardSrv'; import { emitDashboardViewEvent } from 'app/features/dashboard/state/analyticsProcessor'; -import { trackDashboardSceneLoaded } from 'app/features/dashboard/utils/tracking'; +import { trackDashboardSceneLoaded } from 'app/features/dashboard-scene/utils/tracking'; import { playlistSrv } from 'app/features/playlist/PlaylistSrv'; import { ProvisioningPreview } from 'app/features/provisioning/types'; import { dispatch } from 'app/store/store'; diff --git a/public/app/features/dashboard-scene/saving/useSaveDashboard.ts b/public/app/features/dashboard-scene/saving/useSaveDashboard.ts index e6ca31a2e9f..7bfc54a752b 100644 --- a/public/app/features/dashboard-scene/saving/useSaveDashboard.ts +++ b/public/app/features/dashboard-scene/saving/useSaveDashboard.ts @@ -2,7 +2,7 @@ import { useAsyncFn } from 'react-use'; import { locationUtil } from '@grafana/data'; import { t } from '@grafana/i18n'; -import { locationService, reportInteraction } from '@grafana/runtime'; +import { locationService } from '@grafana/runtime'; import { Dashboard } from '@grafana/schema'; import { Spec as DashboardV2Spec } from '@grafana/schema/dist/esm/schema/dashboard/v2'; import appEvents from 'app/core/app_events'; @@ -15,6 +15,8 @@ import { useDispatch } from 'app/types/store'; import { updateDashboardUidLastUsedDatasource } from '../../dashboard/utils/dashboard'; import { DashboardScene } from '../scene/DashboardScene'; +import { DashboardInteractions } from '../utils/interactions'; +import { trackDashboardSceneCreatedOrSaved } from '../utils/tracking'; export function useSaveDashboard(isCopy = false) { const dispatch = useDispatch(); @@ -73,18 +75,14 @@ export function useSaveDashboard(isCopy = false) { appEvents.publish(new DashboardSavedEvent()); notifyApp.success(t('dashboard-scene.use-save-dashboard.message-dashboard-saved', 'Dashboard saved')); - //Update local storage dashboard to handle things like last used datasource updateDashboardUidLastUsedDatasource(resultData.uid); if (isCopy) { - reportInteraction('grafana_dashboard_copied', { - name: saveModel.title, - url: resultData.url, - }); + DashboardInteractions.dashboardCopied({ name: saveModel.title || '', url: resultData.url }); } else { - reportInteraction(`grafana_dashboard_${options.isNew ? 'created' : 'saved'}`, { - name: saveModel.title, - url: resultData.url, + trackDashboardSceneCreatedOrSaved(!!options.isNew, scene, { + name: saveModel.title || '', + url: resultData.url || '', }); } diff --git a/public/app/features/dashboard-scene/scene/DashboardScene.tsx b/public/app/features/dashboard-scene/scene/DashboardScene.tsx index 867bfc5d22c..be793d5f1d1 100644 --- a/public/app/features/dashboard-scene/scene/DashboardScene.tsx +++ b/public/app/features/dashboard-scene/scene/DashboardScene.tsx @@ -716,6 +716,10 @@ export class DashboardScene extends SceneObjectBase impleme return this.serializer.getTrackingInformation(this); } + public getDynamicDashboardsTrackingInformation() { + return this.serializer.getDynamicDashboardsTrackingInformation(this); + } + public async onDashboardDelete() { // Need to mark it non dirty to navigate away without unsaved changes warning this.setState({ isDirty: false }); diff --git a/public/app/features/dashboard-scene/scene/NavToolbarActions.test.tsx b/public/app/features/dashboard-scene/scene/NavToolbarActions.test.tsx index 0a806693b3e..e42df99d74a 100644 --- a/public/app/features/dashboard-scene/scene/NavToolbarActions.test.tsx +++ b/public/app/features/dashboard-scene/scene/NavToolbarActions.test.tsx @@ -160,21 +160,30 @@ describe('NavToolbarActions', () => { it('should call DashboardInteractions.editButtonClicked with outlineExpanded:true if grafana.dashboard.edit-pane.outline.collapsed is undefined', async () => { setup(); await userEvent.click(await screen.findByTestId(selectors.components.NavToolbar.editDashboard.editButton)); - expect(DashboardInteractions.editButtonClicked).toHaveBeenCalledWith({ outlineExpanded: false }); + expect(DashboardInteractions.editButtonClicked).toHaveBeenCalledWith({ + dashboardUid: 'dash-1', + outlineExpanded: false, + }); }); it('should call DashboardInteractions.editButtonClicked with outlineExpanded:true if grafana.dashboard.edit-pane.outline.collapsed is false', async () => { localStorageMock.setItem('grafana.dashboard.edit-pane.outline.collapsed', 'false'); setup(); await userEvent.click(await screen.findByTestId(selectors.components.NavToolbar.editDashboard.editButton)); - expect(DashboardInteractions.editButtonClicked).toHaveBeenCalledWith({ outlineExpanded: true }); + expect(DashboardInteractions.editButtonClicked).toHaveBeenCalledWith({ + dashboardUid: 'dash-1', + outlineExpanded: true, + }); }); it('should call DashboardInteractions.editButtonClicked with outlineExpanded:false if grafana.dashboard.edit-pane.outline.collapsed is true', async () => { localStorageMock.setItem('grafana.dashboard.edit-pane.outline.collapsed', 'true'); setup(); await userEvent.click(await screen.findByTestId(selectors.components.NavToolbar.editDashboard.editButton)); - expect(DashboardInteractions.editButtonClicked).toHaveBeenCalledWith({ outlineExpanded: false }); + expect(DashboardInteractions.editButtonClicked).toHaveBeenCalledWith({ + dashboardUid: 'dash-1', + outlineExpanded: false, + }); }); }); }); diff --git a/public/app/features/dashboard-scene/scene/NavToolbarActions.tsx b/public/app/features/dashboard-scene/scene/NavToolbarActions.tsx index 210561d3654..4e8caac3bc6 100644 --- a/public/app/features/dashboard-scene/scene/NavToolbarActions.tsx +++ b/public/app/features/dashboard-scene/scene/NavToolbarActions.tsx @@ -321,7 +321,7 @@ export function ToolbarActions({ dashboard }: Props) { render: () => (