From 83b4165e6138a51854313f52f14264a59b381c06 Mon Sep 17 00:00:00 2001 From: Grace Guo Date: Wed, 6 May 2020 09:03:04 -0700 Subject: [PATCH] [perf logging] Add extra logging for new/editMode dash (#9745) * [perf logging] Add extra logging for new/editMode dash * fix review comments --- .../dashboard/util/isDashboardEmpty_spec.ts | 42 +++++++++++++++++++ .../src/dashboard/components/Dashboard.jsx | 8 +++- .../src/dashboard/util/isDashboardEmpty.ts | 28 +++++++++++++ 3 files changed, 77 insertions(+), 1 deletion(-) create mode 100644 superset-frontend/spec/javascripts/dashboard/util/isDashboardEmpty_spec.ts create mode 100644 superset-frontend/src/dashboard/util/isDashboardEmpty.ts diff --git a/superset-frontend/spec/javascripts/dashboard/util/isDashboardEmpty_spec.ts b/superset-frontend/spec/javascripts/dashboard/util/isDashboardEmpty_spec.ts new file mode 100644 index 000000000..70bab0266 --- /dev/null +++ b/superset-frontend/spec/javascripts/dashboard/util/isDashboardEmpty_spec.ts @@ -0,0 +1,42 @@ +/** + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ +import isDashboardEmpty from '../../../../src/dashboard/util/isDashboardEmpty'; +import getEmptyLayout from '../../../../src/dashboard/util/getEmptyLayout'; + +describe('isDashboardEmpty', () => { + const emptyLayout: object = getEmptyLayout(); + const testLayout: object = { + ...emptyLayout, + 'MARKDOWN-IhTGLhyiTd': { + children: [], + id: 'MARKDOWN-IhTGLhyiTd', + meta: { code: 'test me', height: 50, width: 4 }, + parents: ['ROOT_ID', 'GRID_ID', 'ROW-uPjcKNYJQy'], + type: 'MARKDOWN', + }, + }; + + it('should return true for empty dashboard', () => { + expect(isDashboardEmpty(emptyLayout)).toBe(true); + }); + + it('should return false for non-empty dashboard', () => { + expect(isDashboardEmpty(testLayout)).toBe(false); + }); +}); diff --git a/superset-frontend/src/dashboard/components/Dashboard.jsx b/superset-frontend/src/dashboard/components/Dashboard.jsx index 4da142874..34e0f125e 100644 --- a/superset-frontend/src/dashboard/components/Dashboard.jsx +++ b/superset-frontend/src/dashboard/components/Dashboard.jsx @@ -39,6 +39,7 @@ import { areObjectsEqual } from '../../reduxUtils'; import '../stylesheets/index.less'; import getLocationHash from '../util/getLocationHash'; +import isDashboardEmpty from '../util/isDashboardEmpty'; const propTypes = { actions: PropTypes.shape({ @@ -90,7 +91,12 @@ class Dashboard extends React.PureComponent { } componentDidMount() { - const eventData = {}; + const { dashboardState, layout } = this.props; + const eventData = { + is_edit_mode: dashboardState.editMode, + mount_duration: Logger.getTimestamp(), + is_empty: isDashboardEmpty(layout), + }; const directLinkComponentId = getLocationHash(); if (directLinkComponentId) { eventData.target_id = directLinkComponentId; diff --git a/superset-frontend/src/dashboard/util/isDashboardEmpty.ts b/superset-frontend/src/dashboard/util/isDashboardEmpty.ts new file mode 100644 index 000000000..78481c503 --- /dev/null +++ b/superset-frontend/src/dashboard/util/isDashboardEmpty.ts @@ -0,0 +1,28 @@ +/** + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ +import { CHART_TYPE, MARKDOWN_TYPE } from './componentTypes'; + +const USER_CONTENT_COMPONENT_TYPE: string[] = [CHART_TYPE, MARKDOWN_TYPE]; +export default function isDashboardEmpty(layout: any): boolean { + // has at least one chart or markdown component + return !Object.values(layout).some( + ({ type }: { type?: string }) => + type && USER_CONTENT_COMPONENT_TYPE.includes(type), + ); +}