기존 추적을 내부 이벤트 추적으로 이관하기

GitLab 내부 이벤트 추적은 폐기된 Snowplow 및 Redis/RedisHLL 이벤트 추적 옵션 위에 통합된 API를 노출합니다.

이 페이지에서는 기존 방법 중 하나에서 내부 이벤트 추적을 사용하도록 전환하는 방법을 설명합니다.

참고: Snowplow, Redis/RedisHLL을 통해 이벤트를 직접 추적하는 것은 폐기되었지만, 한동안 제거되지 않을 것입니다. 내부 이벤트 추적으로 마이그레이션하는 것을 권장하지만, 폐기된 방법은 기존 이벤트와 메트릭에 대해 계속 작동합니다.

기존 Snowplow 추적에서 마이그레이션하기

Snowplow에서 이미 이벤트를 추적하는 경우, 내부 이벤트 추적으로 전환하여 자체 관리 인스턴스에서도 메트릭을 수집할 수 있습니다.

내부 이벤트에 의해 트리거된 이벤트는 이전에 Snowplow를 통해 추적했을 때와 비교하여 특별한 속성을 가지고 있습니다:

  1. category는 이벤트가 발생한 위치로 자동 설정됩니다. 프론트엔드 이벤트의 경우 페이지 이름이며, 백엔드 이벤트의 경우 클래스 이름입니다. 페이지 이름이나 클래스 이름이 사용되지 않으면, "InternalEventTracking"의 기본값이 사용됩니다.

이 마이그레이션을 하기 전에 변화에 문제가 없는지 확인하고 대시보드를 그에 맞게 변경하세요.

백엔드

이미 Gitlab::Tracking.event를 사용하여 Snowplow 이벤트를 추적하고 있고 내부 이벤트 추적으로 마이그레이션하려면 다음과 같이 시작할 수 있습니다:

Gitlab::Tracking.event(name, 'ci_templates_unique', namespace: namespace,
                               project: project, context: [context], user: user, label: label)

위의 코드는 다음과 같이 대체될 수 있습니다:

include Gitlab::InternalEventsTracking

track_internal_event('ci_templates_unique', namespace: namespace, project: project, user: user, additional_properties: { label: label })

label, property, value 속성은 additional_properties 해시 내부로 전송되어야 합니다. 원래 호출에 포함되지 않았다면, additional_properties 인수는 생략될 수 있습니다.

또한, 추적하려는 메트릭에 대한 정의를 생성해야 합니다.

메트릭 정의를 생성하려면 생성기를 사용할 수 있습니다:

scripts/internal_events/cli.rb

생성기는 필요한 입력을 단계별로 안내합니다.

프론트엔드

Vue 컴포넌트에서 Tracking mixin을 사용 중이라면, InternalEvents mixin으로 교체할 수 있습니다.

예를 들어, 현재의 Vue 컴포넌트가 다음과 같은 경우:

import Tracking from '~/tracking';
...
mixins: [Tracking.mixin()]
...
...
this.track('some_label', options)

내부 이벤트 추적으로 변환한 후 다음과 같아야 합니다:

import { InternalEvents } from '~/tracking';
...
mixins: [InternalEvents.mixin()]
...
...
this.trackEvent('action', {}, 'category')

category를 현재 전달하고 있고 유지해야 하는 경우, 이전 예제에서와 같이 trackEvent 메서드의 세 번째 인수로 전달될 수 있습니다. 그러나 새로운 이벤트에서는 기본적으로 이벤트가 트리거된 위치에 대한 정보가 카테고리 필드에 채워지기 때문에 category 매개변수 사용을 강력히 권장하지 않습니다.

이 MR를 예로 사용할 수 있습니다. 이 MR은 devops_adoption_app 컴포넌트를 내부 이벤트 추적을 사용하도록 마이그레이션합니다.

Snowplow 추적에서 label, value, property를 사용 중이라면, trackEvent 함수의 세 번째 인수로 객체 형식으로 전달할 수 있습니다. 이는 선택적인 매개변수입니다.

Vue Mixin:

   this.trackEvent('i_code_review_user_apply_suggestion', {
    label: 'push_event',
    property: 'golang',
    value: 20
   });

원시 JavaScript:

   InternalEvents.trackEvent('i_code_review_user_apply_suggestion', {
    label: 'admin',
    property: 'system',
    value: 20
   });

컴포넌트에서 data-track-action을 사용 중인 경우, 내부 이벤트 추적으로 마이그레이션하려면 data-track-actiondata-event-tracking으로 변경해야 합니다. data-event-label, data-event-propertydata-event-value와 같은 추가 추적 속성이 있는 경우 이를 각각 data-event-label, data-event-property, data-event-value로 바꿀 수 있습니다. 사용자 정의 키-값 쌍으로 추가 속성을 전달하려는 경우 data-event-additional 속성을 사용할 수 있습니다.

예를 들어, 버튼이 다음과 같이 정의된 경우:

 <gl-button
  :href="diffFile.external_url"
  :title="externalUrlLabel"
  :aria-label="externalUrlLabel"
  target="_blank"
  data-track-action="click_toggle_external_button"
  data-track-label="diff_toggle_external_button"
  data-track-property="diff_toggle_external"
  icon="external-link"

이것은 다음처럼 내부 이벤트 추적으로 변환될 수 있습니다:

 <gl-button
  :href="diffFile.external_url"
  :title="externalUrlLabel"
  :aria-label="externalUrlLabel"
  target="_blank"
  data-event-tracking="click_toggle_external_button"
  data-event-label="diff_toggle_external_button"
  data-event-property="diff_toggle_external"
  data-event-additional='{"key1": "value1", "key2": "value2"}'
  icon="external-link"

참고로, data-event-tracking 속성에는 이벤트를 전달하려는 동작만 전달하면 되며, 이러한 정보는 Snowplow와 RedisHLL에 모두 전달됩니다.

RedisHLL 추적에서 마이그레이션하기

백엔드

현재 RedisHLL에서 메트릭을 추적하는 경우, 다음과 같이 내부 이벤트 추적을 사용하기로 전환할 수 있습니다:

  Gitlab::UsageDataCounters::HLLRedisCounter.track_event(:git_write_action, values: current_user.id)

내부 이벤트 추적을 사용하기 시작하려면 다음 단계를 따르세요:

  1. 이벤트가 Snowplow에 전송되지 않는 경우, 명명 규칙을 충족시키기 위해 이름을 변경해보세요.
  2. git_write_action을 설명하는 이벤트 정의를 만드세요(가이드).
  3. 이벤트 섹션에서 git_write_action이 나열된 메트릭 정의를 찾으세요(20210216182041_action_monthly_active_users_git_write.yml20210216184045_git_write_action_weekly.yml).
  4. 메트릭 정의 파일의 data_sourceredis_hll에서 internal_events로 변경하세요.
  5. instrumentation_class 프로퍼티를 제거하세요. 내부 이벤트 메트릭에 사용되지 않습니다.
  6. 양쪽 메트릭 정의 파일에 events 섹션을 추가하세요.

    events:
      - name: git_write_action
        unique: user.id
    

    사용자.id 외에도 고유 사용자가 아닌 다른 것도 계산하는 경우, project.id 또는 namespace.id를 사용하세요.

  7. 두 메트릭 정의 파일 모두에서 options 섹션을 제거하세요.
  8. HLLRedisCounter.track_event 대신에 Gitlab::InternalEventsTracking 모듈을 포함하고 track_internal_event를 호출하세요.

    - Gitlab::UsageDataCounters::HLLRedisCounter.track_event(:git_write_action, values: current_user.id)
    + include Gitlab::InternalEventsTracking
    + track_internal_event('project_created', user: current_user)
    
  9. 선택적으로 이벤트에 추가 값을 추가하세요. 일반적으로 데이터 웨어하우스에 유용한 정보인 projectnamespace를 추가할 수 있습니다.

    - Gitlab::UsageDataCounters::HLLRedisCounter.track_event(:git_write_action, values: current_user.id)
    + include Gitlab::InternalEventsTracking
    + track_internal_event('project_created', user: current_user, project: project, namespace: namespace)
    
  10. 내부 이벤트 추적에 대한 테스트를 업데이트하세요.

  11. hll_redis_legacy_events에서 이벤트 이름을 제거하세요.

  12. hll_redis_key_overrides 파일에 이벤트를 추가하세요. 이 파일에서 사용된 형식은 project_created-user: 'project_created'로, 여기서 project_created는 이벤트 이름이고 user는 메트릭 정의 파일에서 지정된 고유한 값입니다.

프론트엔드

프론트엔드에서 trackRedisHllUserEvent를 호출하여 프론트엔드 이벤트를 추적하는 경우, mixin, 원시 JavaScript 또는 데이터 추적 속성을 사용하여 내부 이벤트로 변환할 수 있습니다.

각 방법에 대한 예제가 있는 빠른 시작 가이드를 참조하세요.