diff --git a/app/assets/javascripts/tracking/constants.js b/app/assets/javascripts/tracking/constants.js index 968e866eeddf4fae7b385362189964e830d5a497..0e440750fdb774745037ea7615c347157274f1c4 100644 --- a/app/assets/javascripts/tracking/constants.js +++ b/app/assets/javascripts/tracking/constants.js @@ -25,3 +25,7 @@ export const URLS_CACHE_STORAGE_KEY = 'gl-snowplow-pseudonymized-urls'; export const REFERRER_TTL = 24 * 60 * 60 * 1000; export const GOOGLE_ANALYTICS_ID_COOKIE_NAME = '_ga'; + +export const GITLAB_INTERNAL_EVENT_CATEGORY = 'InternalEventTracking'; + +export const SERVICE_PING_SCHEMA = 'iglu:com.gitlab/gitlab_service_ping/jsonschema/1-0-0'; diff --git a/app/assets/javascripts/tracking/index.js b/app/assets/javascripts/tracking/index.js index 472ce3c5bbf41970cbf9b5675904a891117052ef..6494838abac05a06a5a3cdc4244fa6a816b611f0 100644 --- a/app/assets/javascripts/tracking/index.js +++ b/app/assets/javascripts/tracking/index.js @@ -2,8 +2,10 @@ import { getAllExperimentContexts } from '~/experimentation/utils'; import { DEFAULT_SNOWPLOW_OPTIONS } from './constants'; import getStandardContext from './get_standard_context'; import Tracking from './tracking'; +import InternalEvents from './internal_events'; export { Tracking as default }; +export { InternalEvents }; /** * Tracker initialization as defined in: diff --git a/app/assets/javascripts/tracking/internal_events.js b/app/assets/javascripts/tracking/internal_events.js new file mode 100644 index 0000000000000000000000000000000000000000..a69f192f520419bbf6432256369a05a5e3cfe3c8 --- /dev/null +++ b/app/assets/javascripts/tracking/internal_events.js @@ -0,0 +1,36 @@ +import API from '~/api'; + +import Tracking from './tracking'; +import { GITLAB_INTERNAL_EVENT_CATEGORY, SERVICE_PING_SCHEMA } from './constants'; + +const InternalEvents = { + /** + * Returns an implementation of this class in the form of + * a Vue mixin. + * + * @param {Object} opts - default options for all events + * @returns {Object} + */ + mixin(opts = {}) { + return { + mixins: [Tracking.mixin(opts)], + methods: { + track_event(event) { + API.trackRedisHllUserEvent(event); + this.track(event, { + context: { + schema: SERVICE_PING_SCHEMA, + data: { + event_name: event, + data_source: 'redis_hll', + }, + }, + category: GITLAB_INTERNAL_EVENT_CATEGORY, + }); + }, + }, + }; + }, +}; + +export default InternalEvents; diff --git a/ee/app/assets/javascripts/analytics/devops_reports/devops_adoption/components/devops_adoption_app.vue b/ee/app/assets/javascripts/analytics/devops_reports/devops_adoption/components/devops_adoption_app.vue index 5feba44bebb0e4f69eb25c2eb853db6da6f2e4b2..4dc6e12c187e40e28db9e6c64400a7d59fdb9cef 100644 --- a/ee/app/assets/javascripts/analytics/devops_reports/devops_adoption/components/devops_adoption_app.vue +++ b/ee/app/assets/javascripts/analytics/devops_reports/devops_adoption/components/devops_adoption_app.vue @@ -2,10 +2,9 @@ import { GlAlert, GlTabs, GlTab } from '@gitlab/ui'; import * as Sentry from '@sentry/browser'; import DevopsScore from '~/analytics/devops_reports/components/devops_score.vue'; -import API from '~/api'; import dateformat from '~/lib/dateformat'; import { mergeUrlParams, updateHistory, getParameterValues } from '~/lib/utils/url_utility'; -import Tracking from '~/tracking'; +import { InternalEvents } from '~/tracking'; import { I18N_GROUPS_QUERY_ERROR, I18N_ENABLED_NAMESPACE_QUERY_ERROR, @@ -39,7 +38,7 @@ export default { GlTabs, GlTab, }, - mixins: [Tracking.mixin()], + mixins: [InternalEvents.mixin()], inject: { isGroup: { default: false, @@ -262,33 +261,17 @@ export default { }, trackDevopsScoreTabClick() { if (!this.devopsScoreTabClicked) { - API.trackRedisHllUserEvent(this.$options.trackDevopsScoreTabClickEvent); - this.trackSnowplowEvent(this.$options.trackDevopsScoreTabClickEvent); - + this.track_event(this.$options.trackDevopsScoreTabClickEvent); this.devopsScoreTabClicked = true; } }, trackDevopsTabClick() { if (!this.adoptionTabClicked) { - API.trackRedisHllUserEvent(this.$options.trackDevopsTabClickEvent); - this.trackSnowplowEvent(this.$options.trackDevopsTabClickEvent); - + this.track_event(this.$options.trackDevopsTabClickEvent); this.adoptionTabClicked = true; } }, - trackSnowplowEvent(event) { - this.track('click_tab', { - label: 'redis_hll_counters.analytics.analytics_total_unique_counts_monthly', - context: { - schema: 'iglu:com.gitlab/gitlab_service_ping/jsonschema/1-0-0', - data: { - event_name: event, - data_source: 'redis_hll', - }, - }, - }); - }, trackCardSelected(card) { const index = this.$options.devopsAdoptionTableConfiguration.findIndex( ({ key }) => card.key === key, diff --git a/ee/spec/frontend/analytics/devops_reports/devops_adoption/components/devops_adoption_app_spec.js b/ee/spec/frontend/analytics/devops_reports/devops_adoption/components/devops_adoption_app_spec.js index 327e185026b5e0d32f845cd696350a3651b0a070..cc6108e3230a186ed30350d86c81599a49e5c922 100644 --- a/ee/spec/frontend/analytics/devops_reports/devops_adoption/components/devops_adoption_app_spec.js +++ b/ee/spec/frontend/analytics/devops_reports/devops_adoption/components/devops_adoption_app_spec.js @@ -24,6 +24,7 @@ import { mockTracking } from 'helpers/tracking_helper'; import DevopsScore from '~/analytics/devops_reports/components/devops_score.vue'; import API from '~/api'; import { groupNodes, devopsAdoptionNamespaceData } from '../mock_data'; +import { GITLAB_INTERNAL_EVENT_CATEGORY } from '../../../../../../../app/assets/javascripts/tracking/constants'; jest.mock('ee/analytics/devops_reports/devops_adoption/utils/cache_updates', () => ({ addEnabledNamespacesToCache: jest.fn(), @@ -374,8 +375,8 @@ describe('DevopsAdoptionApp', () => { wrapper.findByTestId(testId).vm.$emit('click'); expect(API.trackRedisHllUserEvent).toHaveBeenCalledWith(event); - expect(trackingSpy).toHaveBeenCalledWith(undefined, 'click_tab', { - label: 'redis_hll_counters.analytics.analytics_total_unique_counts_monthly', + expect(trackingSpy).toHaveBeenCalledWith(GITLAB_INTERNAL_EVENT_CATEGORY, event, { + category: GITLAB_INTERNAL_EVENT_CATEGORY, context: { schema: 'iglu:com.gitlab/gitlab_service_ping/jsonschema/1-0-0', data: {