재생 추적

Media CDN에서는 Google의 광범위한 로깅 인프라 및 지연 시간이 짧은 로그 전달을 이용해서 요청별 로그를 단일 재생 이벤트에 연결할 수 있습니다. 이렇게 하면 재생 수명 기간 전반에 걸쳐서 에지 위치, 네트워크 조건, 원본 선택, 기타 오류 등 트래픽 제공 방법을 이해하는 데 도움이 됩니다.

이 작업은 다음과 같이 수행됩니다.

  • 클라이언트에서 생성한 재생 ID를 여러 요청에 걸쳐서 사용할 수 있습니다.
  • Cloud Logging과 통합하여 재생 및 개별 요청 데이터를 쿼리합니다.
  • BigQuery 또는 다른 플랫폼을 사용하여 데이터를 내보내고 쿼리합니다. 확장된 데이터 분석을 통해 재생 기간 동안 제공되는 총 지연 시간 및 형식을 분석할 수 있습니다.

거의 실시간의 로깅과 조합된 재생 trace를 통해 재생 세션을 위치, 스트림, 클라이언트 네트워크에 기반한 전반적인 경험 품질과 연결하여 문제를 신속하게 해결할 수 있습니다.

재생 trace

여러 요청을 사용자 대상 재생 세션과 연결하기 위해 클라이언트에서 해당 재생에 대한 ID를 생성합니다. 재생 trace는 모든 연관된 요청 로그에 헤더 또는 쿼리 매개변수 값을 포함하는 방식으로 작동합니다.

Shaka, ExoPlayer, Apple AVPlayer와 같은 플레이어는 재생 시작 이벤트를 연결하고 쿼리 매개변수 및 HTTP 헤더를 스트리밍 미디어 소스에 대해 수행된 요청에 연결할 수 있게 해줍니다.

헤더 및 쿼리 매개변수는 다음과 같이 정의됩니다.

  • HTTP 요청 헤더: Playback-Trace-ID
  • URL 쿼리 매개변수: playback-trace-id=

둘 다 요청에 존재할 경우 쿼리 매개변수 대신 HTTP 헤더가 사용됩니다.

  • 재생 ID는 12바이트(96비트) 이상, 32바이트(256비트) 이하여야 하며, 무작위 소스에서 생성되어야 합니다.
  • 12바이트보다 짧은 재생 ID는 기록되지 않습니다. 이는 충돌을 방지하기 위한 것입니다.
  • 32바이트보다 긴 재생 ID는 처음 32바이트까지로 잘립니다.

재생 ID는 7일 기간 동안 고유해야 합니다. 7일이 지나면 재생 ID가 재사용되거나 충돌할 경우 각 요청 집합이 개별 재생으로 취급됩니다.

예시: Shaka 플레이어에서 재생 ID 생성

대규모 재생 trace의 이점을 얻기 위해서는 각 사용자 동영상 재생 시 세그먼트 및 선택적으로 매니페스트에 대한 모든 요청에 재생 ID가 포함되어야 합니다. 집계 통계를 롤업하기 위해서는 재생 내에서 모든 요청에 대해 이 재생 ID가 동일해야 합니다.

예를 들면 다음과 같습니다.

  • 동영상 로드 시 재생 ID를 생성합니다.
  • 매니페스트가 아닌 세그먼트 가져오기를 수행할 때만 전송합니다.

콘텐츠 관리 시스템 및 클라이언트 측 분석 도구에서 제공된 것과 같은 기존 재생 ID를 사용하려면 playbackSessionId에 해당 값을 채웁니다.

let playbackSessionId;

player.addEventListener('loading', () => {
  const randomBuffer = crypto.getRandomValues(new Uint8Array(16));
  playbackSessionId = shaka.util.Uint8ArrayUtils.toBase64(randomBuffer);
});

player.getNetworkingEngine().registerRequestFilter((type, request) => {
  // Remove this "type" check if you want the header on every request.
  // Alternately, you can check the request.uris array to send the
  // header to some servers and not others.
  if (type == shaka.net.NetworkingEngine.RequestType.SEGMENT) {
    request.headers['CPN'] = playbackSessionId;
  }
});