Commit 0f2f4ddc authored by Scott Hampton's avatar Scott Hampton

Merge branch '10687-track-load-performance-widget-expansions' into 'master'

Track load performance widget expansions via usage ping

See merge request gitlab-org/gitlab!52688
parents 9903c502 4ed2dadb
---
name: usage_data_i_testing_load_performance_widget_total
introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/merge_requests/52688
rollout_issue_url:
milestone: '13.9'
type: development
group: group::testing
default_enabled: true
<script>
import { componentNames } from 'ee/reports/components/issue_body';
import ReportSection from '~/reports/components/report_section.vue';
import glFeatureFlagsMixin from '~/vue_shared/mixins/gl_feature_flags_mixin';
import api from '~/api';
export default {
name: 'GroupedLoadPerformanceReportsApp',
components: {
ReportSection,
},
mixins: [glFeatureFlagsMixin()],
props: {
status: {
type: String,
required: true,
},
loadingText: {
type: String,
required: true,
},
errorText: {
type: String,
required: true,
},
successText: {
type: String,
required: true,
},
unresolvedIssues: {
type: Array,
required: true,
},
resolvedIssues: {
type: Array,
required: true,
},
neutralIssues: {
type: Array,
required: true,
},
hasIssues: {
type: Boolean,
required: true,
},
},
componentNames,
methods: {
handleLoadPerformanceToggleEvent() {
if (this.glFeatures.usageDataITestingLoadPerformanceWidgetTotal) {
api.trackRedisHllUserEvent(this.$options.expandEvent);
}
},
},
expandEvent: 'i_testing_load_performance_widget_total',
};
</script>
<template>
<report-section
:status="status"
:loading-text="loadingText"
:error-text="errorText"
:success-text="successText"
:unresolved-issues="unresolvedIssues"
:resolved-issues="resolvedIssues"
:neutral-issues="neutralIssues"
:has-issues="hasIssues"
:component="$options.componentNames.PerformanceIssueBody"
should-emit-toggle-event
class="js-load-performance-widget mr-widget-border-top mr-report"
@toggleEvent.once="handleLoadPerformanceToggleEvent"
/>
</template>
...@@ -2,6 +2,7 @@ ...@@ -2,6 +2,7 @@
import { GlSafeHtmlDirective } from '@gitlab/ui'; import { GlSafeHtmlDirective } from '@gitlab/ui';
import GroupedMetricsReportsApp from 'ee/vue_shared/metrics_reports/grouped_metrics_reports_app.vue'; import GroupedMetricsReportsApp from 'ee/vue_shared/metrics_reports/grouped_metrics_reports_app.vue';
import GroupedBrowserPerformanceReportsApp from 'ee/reports/browser_performance_report/grouped_browser_performance_reports_app.vue'; import GroupedBrowserPerformanceReportsApp from 'ee/reports/browser_performance_report/grouped_browser_performance_reports_app.vue';
import GroupedLoadPerformanceReportsApp from 'ee/reports/load_performance_report/grouped_load_performance_reports_app.vue';
import reportsMixin from 'ee/vue_shared/security_reports/mixins/reports_mixin'; import reportsMixin from 'ee/vue_shared/security_reports/mixins/reports_mixin';
import { componentNames } from 'ee/reports/components/issue_body'; import { componentNames } from 'ee/reports/components/issue_body';
import MrWidgetLicenses from 'ee/vue_shared/license_compliance/mr_widget_license_report.vue'; import MrWidgetLicenses from 'ee/vue_shared/license_compliance/mr_widget_license_report.vue';
...@@ -22,6 +23,7 @@ export default { ...@@ -22,6 +23,7 @@ export default {
import('ee/vue_shared/security_reports/grouped_security_reports_app.vue'), import('ee/vue_shared/security_reports/grouped_security_reports_app.vue'),
GroupedMetricsReportsApp, GroupedMetricsReportsApp,
GroupedBrowserPerformanceReportsApp, GroupedBrowserPerformanceReportsApp,
GroupedLoadPerformanceReportsApp,
ReportSection, ReportSection,
}, },
directives: { directives: {
...@@ -292,7 +294,7 @@ export default { ...@@ -292,7 +294,7 @@ export default {
:neutral-issues="mr.browserPerformanceMetrics.same" :neutral-issues="mr.browserPerformanceMetrics.same"
:has-issues="hasBrowserPerformanceMetrics" :has-issues="hasBrowserPerformanceMetrics"
/> />
<report-section <grouped-load-performance-reports-app
v-if="hasLoadPerformancePaths" v-if="hasLoadPerformancePaths"
:status="loadPerformanceStatus" :status="loadPerformanceStatus"
:loading-text="translateText('load-performance').loading" :loading-text="translateText('load-performance').loading"
...@@ -302,8 +304,6 @@ export default { ...@@ -302,8 +304,6 @@ export default {
:resolved-issues="mr.loadPerformanceMetrics.improved" :resolved-issues="mr.loadPerformanceMetrics.improved"
:neutral-issues="mr.loadPerformanceMetrics.same" :neutral-issues="mr.loadPerformanceMetrics.same"
:has-issues="hasLoadPerformanceMetrics" :has-issues="hasLoadPerformanceMetrics"
:component="$options.componentNames.PerformanceIssueBody"
class="js-load-performance-widget mr-widget-border-top mr-report"
/> />
<grouped-metrics-reports-app <grouped-metrics-reports-app
v-if="mr.metricsReportsPath" v-if="mr.metricsReportsPath"
......
...@@ -13,6 +13,7 @@ module EE ...@@ -13,6 +13,7 @@ module EE
push_frontend_feature_flag(:missing_mr_security_scan_types, @project) push_frontend_feature_flag(:missing_mr_security_scan_types, @project)
push_frontend_feature_flag(:usage_data_i_testing_metrics_report_widget_total, @project, default_enabled: true) push_frontend_feature_flag(:usage_data_i_testing_metrics_report_widget_total, @project, default_enabled: true)
push_frontend_feature_flag(:usage_data_i_testing_web_performance_widget_total, @project, default_enabled: true) push_frontend_feature_flag(:usage_data_i_testing_web_performance_widget_total, @project, default_enabled: true)
push_frontend_feature_flag(:usage_data_i_testing_load_performance_widget_total, @project, default_enabled: true)
end end
before_action :whitelist_query_limiting_ee_merge, only: [:merge] before_action :whitelist_query_limiting_ee_merge, only: [:merge]
......
---
title: Track load performance widget expansions via usage ping
merge_request: 52688
author:
type: added
...@@ -7,11 +7,10 @@ jest.mock('~/api.js'); ...@@ -7,11 +7,10 @@ jest.mock('~/api.js');
const localVue = createLocalVue(); const localVue = createLocalVue();
describe('Grouped test reports app', () => { describe('Grouped test reports app', () => {
const Component = localVue.extend(GroupedBrowserPerformanceReportsApp);
let wrapper; let wrapper;
const mountComponent = ({ usageDataITestingWebPerformanceWidgetTotal = false } = {}) => { const mountComponent = ({ usageDataITestingWebPerformanceWidgetTotal = false } = {}) => {
wrapper = mount(Component, { wrapper = mount(GroupedBrowserPerformanceReportsApp, {
localVue, localVue,
propsData: { propsData: {
status: '', status: '',
......
import { mount, createLocalVue } from '@vue/test-utils';
import GroupedLoadPerformanceReportsApp from 'ee/reports/load_performance_report/grouped_load_performance_reports_app.vue';
import Api from '~/api';
jest.mock('~/api.js');
const localVue = createLocalVue();
describe('Grouped load performance reports app', () => {
let wrapper;
const mountComponent = ({ usageDataITestingLoadPerformanceWidgetTotal = false } = {}) => {
wrapper = mount(GroupedLoadPerformanceReportsApp, {
localVue,
propsData: {
status: '',
loadingText: '',
errorText: '',
successText: '',
unresolvedIssues: [{}, {}],
resolvedIssues: [],
neutralIssues: [],
hasIssues: true,
},
provide: {
glFeatures: {
usageDataITestingLoadPerformanceWidgetTotal,
},
},
});
};
afterEach(() => {
wrapper.destroy();
wrapper = null;
});
describe('usage ping events', () => {
describe('when feature flag is enabled', () => {
beforeEach(() => {
mountComponent({ usageDataITestingLoadPerformanceWidgetTotal: true });
});
it('tracks an event when the widget is expanded', () => {
wrapper.find('[data-testid="report-section-expand-button"]').trigger('click');
expect(Api.trackRedisHllUserEvent).toHaveBeenCalledWith(wrapper.vm.$options.expandEvent);
});
});
describe('when feature flag is disabled', () => {
beforeEach(() => {
mountComponent({ usageDataITestingLoadPerformanceWidgetTotal: false });
});
it('tracks an event when the widget is expanded', () => {
wrapper.find('[data-testid="report-section-expand-button"]').trigger('click');
expect(Api.trackRedisHllUserEvent).not.toHaveBeenCalled();
});
});
});
});
...@@ -3,6 +3,7 @@ import MockAdapter from 'axios-mock-adapter'; ...@@ -3,6 +3,7 @@ import MockAdapter from 'axios-mock-adapter';
import Vue, { nextTick } from 'vue'; import Vue, { nextTick } from 'vue';
import VueApollo from 'vue-apollo'; import VueApollo from 'vue-apollo';
import MrWidgetOptions from 'ee/vue_merge_request_widget/mr_widget_options.vue'; import MrWidgetOptions from 'ee/vue_merge_request_widget/mr_widget_options.vue';
import PerformanceIssueBody from 'ee/vue_merge_request_widget/components/performance_issue_body.vue';
import { import {
sastDiffSuccessMock, sastDiffSuccessMock,
dastDiffSuccessMock, dastDiffSuccessMock,
...@@ -370,6 +371,13 @@ describe('ee merge request widget options', () => { ...@@ -370,6 +371,13 @@ describe('ee merge request widget options', () => {
}); });
}); });
it('should render performance issue body component', (done) => {
setImmediate(() => {
expect(wrapper.find(PerformanceIssueBody).exists()).toBe(true);
done();
});
});
describe('text connector', () => { describe('text connector', () => {
it('should only render information about fixed issues', (done) => { it('should only render information about fixed issues', (done) => {
setImmediate(() => { setImmediate(() => {
...@@ -527,6 +535,10 @@ describe('ee merge request widget options', () => { ...@@ -527,6 +535,10 @@ describe('ee merge request widget options', () => {
); );
}); });
it('should render performance issue body component', () => {
expect(wrapper.find(PerformanceIssueBody).exists()).toBe(true);
});
describe('text connector', () => { describe('text connector', () => {
it('should only render information about fixed issues', (done) => { it('should only render information about fixed issues', (done) => {
wrapper.vm.mr.loadPerformanceMetrics.degraded = []; wrapper.vm.mr.loadPerformanceMetrics.degraded = [];
......
...@@ -273,6 +273,11 @@ ...@@ -273,6 +273,11 @@
redis_slot: testing redis_slot: testing
aggregation: weekly aggregation: weekly
feature_flag: usage_data_i_testing_group_code_coverage_project_click_total feature_flag: usage_data_i_testing_group_code_coverage_project_click_total
- name: i_testing_load_performance_widget_total
category: testing
redis_slot: testing
aggregation: weekly
feature_flag: usage_data_i_testing_load_performance_widget_total
# Project Management group # Project Management group
- name: g_project_management_issue_title_changed - name: g_project_management_issue_title_changed
category: issues_edit category: issues_edit
......
...@@ -9,7 +9,6 @@ const localVue = createLocalVue(); ...@@ -9,7 +9,6 @@ const localVue = createLocalVue();
localVue.use(Vuex); localVue.use(Vuex);
describe('Grouped code quality reports app', () => { describe('Grouped code quality reports app', () => {
const Component = localVue.extend(GroupedCodequalityReportsApp);
let wrapper; let wrapper;
let mockStore; let mockStore;
...@@ -22,7 +21,7 @@ describe('Grouped code quality reports app', () => { ...@@ -22,7 +21,7 @@ describe('Grouped code quality reports app', () => {
}; };
const mountComponent = (props = {}) => { const mountComponent = (props = {}) => {
wrapper = mount(Component, { wrapper = mount(GroupedCodequalityReportsApp, {
store: mockStore, store: mockStore,
localVue, localVue,
propsData: { propsData: {
......
...@@ -18,12 +18,11 @@ localVue.use(Vuex); ...@@ -18,12 +18,11 @@ localVue.use(Vuex);
describe('Grouped test reports app', () => { describe('Grouped test reports app', () => {
const endpoint = 'endpoint.json'; const endpoint = 'endpoint.json';
const pipelinePath = '/path/to/pipeline'; const pipelinePath = '/path/to/pipeline';
const Component = localVue.extend(GroupedTestReportsApp);
let wrapper; let wrapper;
let mockStore; let mockStore;
const mountComponent = ({ props = { pipelinePath } } = {}) => { const mountComponent = ({ props = { pipelinePath } } = {}) => {
wrapper = mount(Component, { wrapper = mount(GroupedTestReportsApp, {
store: mockStore, store: mockStore,
localVue, localVue,
propsData: { propsData: {
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment