This is an automated email from the ASF dual-hosted git repository. michaelsmolina pushed a commit to branch 5.0 in repository https://gitbox.apache.org/repos/asf/superset.git
commit e593bc0a2e7e0063e1cebc2b90e04599376fd6f2 Author: JUST.in DO IT <[email protected]> AuthorDate: Tue Mar 25 10:18:55 2025 -0700 fix(log): store navigation path to get correct logging path (#32795) (cherry picked from commit 4a70065e5f6840fbcd657f50045c825a7b1d58d6) --- superset-frontend/src/middleware/logger.test.js | 22 +++- .../src/middleware/loggerMiddleware.js | 140 +++++++++++---------- 2 files changed, 92 insertions(+), 70 deletions(-) diff --git a/superset-frontend/src/middleware/logger.test.js b/superset-frontend/src/middleware/logger.test.js index 629940b969..0a28d42fde 100644 --- a/superset-frontend/src/middleware/logger.test.js +++ b/superset-frontend/src/middleware/logger.test.js @@ -20,7 +20,10 @@ import sinon from 'sinon'; import { SupersetClient } from '@superset-ui/core'; import logger from 'src/middleware/loggerMiddleware'; import { LOG_EVENT } from 'src/logger/actions'; -import { LOG_ACTIONS_LOAD_CHART } from 'src/logger/LogUtils'; +import { + LOG_ACTIONS_LOAD_CHART, + LOG_ACTIONS_SPA_NAVIGATION, +} from 'src/logger/LogUtils'; describe('logger middleware', () => { const dashboardId = 123; @@ -40,7 +43,6 @@ describe('logger middleware', () => { eventData: { key: 'value', start_offset: 100, - path: `/dashboard/${dashboardId}/`, }, }, }; @@ -82,11 +84,19 @@ describe('logger middleware', () => { }); it('should include ts, start_offset, event_name, impression_id, source, and source_id in every event', () => { - logger(mockStore)(next)(action); + const fetchLog = logger(mockStore)(next); + fetchLog({ + type: LOG_EVENT, + payload: { + eventName: LOG_ACTIONS_SPA_NAVIGATION, + eventData: { path: `/dashboard/${dashboardId}/` }, + }, + }); timeSandbox.clock.tick(2000); - - expect(SupersetClient.post.callCount).toBe(1); - const { events } = SupersetClient.post.getCall(0).args[0].postPayload; + fetchLog(action); + timeSandbox.clock.tick(2000); + expect(SupersetClient.post.callCount).toBe(2); + const { events } = SupersetClient.post.getCall(1).args[0].postPayload; const mockEventdata = action.payload.eventData; const mockEventname = action.payload.eventName; expect(events[0]).toMatchObject({ diff --git a/superset-frontend/src/middleware/loggerMiddleware.js b/superset-frontend/src/middleware/loggerMiddleware.js index a3eb629571..c008d027b3 100644 --- a/superset-frontend/src/middleware/loggerMiddleware.js +++ b/superset-frontend/src/middleware/loggerMiddleware.js @@ -23,7 +23,10 @@ import { SupersetClient } from '@superset-ui/core'; import { safeStringify } from '../utils/safeStringify'; import { LOG_EVENT } from '../logger/actions'; -import { LOG_EVENT_TYPE_TIMING } from '../logger/LogUtils'; +import { + LOG_EVENT_TYPE_TIMING, + LOG_ACTIONS_SPA_NAVIGATION, +} from '../logger/LogUtils'; import DebouncedMessageQueue from '../utils/DebouncedMessageQueue'; const LOG_ENDPOINT = '/superset/log/?explode=events'; @@ -67,78 +70,87 @@ const logMessageQueue = new DebouncedMessageQueue({ delayThreshold: 1000, }); let lastEventId = 0; -const loggerMiddleware = store => next => action => { - if (action.type !== LOG_EVENT) { - return next(action); - } +const loggerMiddleware = store => next => { + let navPath; + return action => { + if (action.type !== LOG_EVENT) { + return next(action); + } - const { dashboardInfo, explore, impressionId, dashboardLayout, sqlLab } = - store.getState(); - let logMetadata = { - impression_id: impressionId, - version: 'v2', - }; - const { eventName } = action.payload; - let { eventData = {} } = action.payload; + const { dashboardInfo, explore, impressionId, dashboardLayout, sqlLab } = + store.getState(); + let logMetadata = { + impression_id: impressionId, + version: 'v2', + }; + const { eventName } = action.payload; + let { eventData = {} } = action.payload; - const path = eventData.path || window?.location?.href; + if (eventName === LOG_ACTIONS_SPA_NAVIGATION) { + navPath = eventData.path; + } + const path = navPath || window?.location?.href; - if (dashboardInfo?.id && path?.includes('/dashboard/')) { - logMetadata = { - source: 'dashboard', - source_id: dashboardInfo.id, - dashboard_id: dashboardInfo.id, - ...logMetadata, - }; - } else if (explore?.slice) { - logMetadata = { - source: 'explore', - source_id: explore.slice ? explore.slice.slice_id : 0, - ...(explore.slice.slice_id && { slice_id: explore.slice.slice_id }), - ...logMetadata, - }; - } else if (path?.includes('/sqllab/')) { - const editor = sqlLab.queryEditors.find( - ({ id }) => id === sqlLab.tabHistory.slice(-1)[0], - ); - logMetadata = { - source: 'sqlLab', - source_id: editor?.id, - db_id: editor?.dbId, - schema: editor?.schema, - }; - } + if (dashboardInfo?.id && path?.includes('/dashboard/')) { + logMetadata = { + source: 'dashboard', + source_id: dashboardInfo.id, + dashboard_id: dashboardInfo.id, + ...logMetadata, + }; + } else if (explore?.slice) { + logMetadata = { + source: 'explore', + source_id: explore.slice ? explore.slice.slice_id : 0, + ...(explore.slice.slice_id && { slice_id: explore.slice.slice_id }), + ...logMetadata, + }; + } else if (path?.includes('/sqllab/')) { + const editor = sqlLab.queryEditors.find( + ({ id }) => id === sqlLab.tabHistory.slice(-1)[0], + ); + logMetadata = { + source: 'sqlLab', + source_id: editor?.id, + db_id: editor?.dbId, + schema: editor?.schema, + }; + } - eventData = { - ...logMetadata, - ts: new Date().getTime(), - event_name: eventName, - ...eventData, - }; - if (LOG_EVENT_TYPE_TIMING.has(eventName)) { - eventData = { - ...eventData, - event_type: 'timing', - trigger_event: lastEventId, - }; - } else { - lastEventId = nanoid(); eventData = { + ...logMetadata, + ts: new Date().getTime(), + event_name: eventName, ...eventData, - event_type: 'user', - event_id: lastEventId, - visibility: document.visibilityState, }; - } + if (LOG_EVENT_TYPE_TIMING.has(eventName)) { + eventData = { + ...eventData, + event_type: 'timing', + trigger_event: lastEventId, + }; + } else { + lastEventId = nanoid(); + eventData = { + ...eventData, + event_type: 'user', + event_id: lastEventId, + visibility: document.visibilityState, + }; + } - if (eventData.target_id && dashboardLayout?.present?.[eventData.target_id]) { - const { meta } = dashboardLayout.present[eventData.target_id]; - // chart name or tab/header text - eventData.target_name = meta.chartId ? meta.sliceName : meta.text; - } + if ( + eventData.target_id && + dashboardLayout?.present?.[eventData.target_id] + ) { + const { meta } = dashboardLayout.present[eventData.target_id]; + // chart name or tab/header text + eventData.target_name = meta.chartId ? meta.sliceName : meta.text; + } - logMessageQueue.append(eventData); - return eventData; + logMessageQueue.append(eventData); + return eventData; + }; }; export default loggerMiddleware;
