Начало Ρ€Π°Π±ΠΎΡ‚Ρ‹
ΠžΠ±Π·ΠΎΡ€ Быстрый старт

Session Replay

Session Replay позволяСт ΡƒΠ²ΠΈΠ΄Π΅Ρ‚ΡŒ Π² точности Ρ‚ΠΎ, Ρ‡Ρ‚ΠΎ ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΠΈ Π΄Π΅Π»Π°Π»ΠΈ Π½Π° вашСм сайтС, записывая ΠΈΡ… взаимодСйствия, двиТСния ΠΌΡ‹ΡˆΠΈ, ΠΏΡ€ΠΎΠΊΡ€ΡƒΡ‚ΠΊΡƒ ΠΈ ΠΊΠ»ΠΈΠΊΠΈ.

ΠžΠ±Π·ΠΎΡ€

StatusRadar ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ rrweb для ΠΊΠΎΠ½Ρ„ΠΈΠ΄Π΅Π½Ρ†ΠΈΠ°Π»ΡŒΠ½ΠΎΠΉ записи сСссий с ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΊΠΎΠΉ:

  • Π‘Π½ΠΈΠΌΠΊΠΎΠ² DOM: фиксируСт структуру страницы ΠΈ Π΅Ρ‘ измСнСния
  • Записи событий: двиТСния ΠΌΡ‹ΡˆΠΈ, ΠΊΠ»ΠΈΠΊΠΈ, ΠΏΡ€ΠΎΠΊΡ€ΡƒΡ‚ΠΊΠ°, Π²Π²ΠΎΠ΄
  • ΠšΠΎΠ½Ρ‚Ρ€ΠΎΠ»Ρ ΠΊΠΎΠ½Ρ„ΠΈΠ΄Π΅Π½Ρ†ΠΈΠ°Π»ΡŒΠ½ΠΎΡΡ‚ΠΈ: автоматичСски маскируСт Ρ‡ΡƒΠ²ΡΡ‚Π²ΠΈΡ‚Π΅Π»ΡŒΠ½Ρ‹Π΅ Π΄Π°Π½Π½Ρ‹Π΅
  • БТатия: gzip-сТатиС для эффСктивного хранСния

Π’ΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΠ΅ Session Replay

Π¨Π°Π³ 1: Π’ΠΊΠ»ΡŽΡ‡ΠΈΡ‚Π΅ Π² настройках прилоТСния

  1. ΠŸΠ΅Ρ€Π΅ΠΉΠ΄ΠΈΡ‚Π΅ Π² Dashboard β†’ Observability β†’ Apps
  2. ΠžΡ‚ΠΊΡ€ΠΎΠΉΡ‚Π΅ своё ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ β†’ Settings
  3. Π’ΠΊΠ»ΡŽΡ‡ΠΈΡ‚Π΅ Β«Session ReplayΒ»
  4. НастройтС Replay Storage Quota (Π“Π‘/мСсяц)
  5. Π‘ΠΎΡ…Ρ€Π°Π½ΠΈΡ‚Π΅ настройки

Π¨Π°Π³ 2: Π’ΠΊΠ»ΡŽΡ‡ΠΈΡ‚Π΅ Π² SDK

import { StatusRadarRUM } from '@statusradar/rum';

const rum = new StatusRadarRUM({
  apiKey: 'your-api-key-here',
  appId: 'your-app-id-here',
  endpoint: 'https://rum.statusradar.dev/v1/ingest',

  // Enable session replay
  sessionReplay: {
    enabled: true,
    sampleRate: 1.0,              // Record 100% of sessions
    maskAllInputs: true,          // Mask all input fields
    maskTextSelector: '.sensitive', // Mask elements with class
    blockSelector: '.private',    // Block elements from recording
    ignoreClass: 'sr-ignore',     // Ignore elements with class
    inlineStylesheet: true,       // Inline CSS for accuracy
    recordCanvas: false           // Don't record canvas elements
  }
});

rum.start();

ΠŸΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Ρ‹ ΠΊΠΎΠ½Ρ„ΠΈΠ³ΡƒΡ€Π°Ρ†ΠΈΠΈ

Частота Π²Ρ‹Π±ΠΎΡ€ΠΊΠΈ (Sample Rate)

УправляйтС Ρ‚Π΅ΠΌ, ΠΊΠ°ΠΊΠΎΠΉ ΠΏΡ€ΠΎΡ†Π΅Π½Ρ‚ сСссий Π·Π°ΠΏΠΈΡΡ‹Π²Π°Ρ‚ΡŒ:

sessionReplay: {
  enabled: true,
  sampleRate: 0.1  // Record 10% of sessions
}

ΠšΠΎΠ½Ρ‚Ρ€ΠΎΠ»ΡŒ ΠΊΠΎΠ½Ρ„ΠΈΠ΄Π΅Π½Ρ†ΠΈΠ°Π»ΡŒΠ½ΠΎΡΡ‚ΠΈ

ΠœΠ°ΡΠΊΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅ всСх ΠΏΠΎΠ»Π΅ΠΉ Π²Π²ΠΎΠ΄Π°

sessionReplay: {
  maskAllInputs: true  // Masks all <input>, <textarea>, <select>
}

ΠœΠ°ΡΠΊΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅ ΠΊΠΎΠ½ΠΊΡ€Π΅Ρ‚Π½Ρ‹Ρ… элСмСнтов

sessionReplay: {
  maskTextSelector: '.password, .credit-card, .ssn'
}

Π˜ΡΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΠ΅ элСмСнтов ΠΈΠ· записи

sessionReplay: {
  blockSelector: '.admin-panel, [data-sensitive]'
}

HTML-Π°Ρ‚Ρ€ΠΈΠ±ΡƒΡ‚Ρ‹

ΠŸΠΎΠΌΠ΅Ρ‡Π°ΠΉΡ‚Π΅ элСмСнты прямо Π² HTML:

<!-- Mask this input -->
<input type="text" class="sr-mask" />

<!-- Block this section from recording -->
<div class="sr-block">
  Sensitive content here
</div>

<!-- Ignore this element completely -->
<div class="sr-ignore">
  Never recorded
</div>

ΠŸΡ€ΠΎΡΠΌΠΎΡ‚Ρ€ записСй

Навигация Π² Dashboard

  1. ΠŸΠ΅Ρ€Π΅ΠΉΠ΄ΠΈΡ‚Π΅ Π² Dashboard β†’ Observability β†’ Apps β†’ [Your App]
  2. ΠžΡ‚ΠΊΡ€ΠΎΠΉΡ‚Π΅ Π²ΠΊΠ»Π°Π΄ΠΊΡƒ Β«SessionsΒ»
  3. НаТмитС Π½Π° Π»ΡŽΠ±ΡƒΡŽ сСссию, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΏΠΎΡΠΌΠΎΡ‚Ρ€Π΅Ρ‚ΡŒ запись

Π­Π»Π΅ΠΌΠ΅Π½Ρ‚Ρ‹ управлСния ΠΏΠ»Π΅Π΅Ρ€ΠΎΠΌ записСй

  • Play/Pause: ΠΏΡ€ΠΎΠ±Π΅Π» ΠΈΠ»ΠΈ ΠΊΠ»ΠΈΠΊ ΠΏΠΎ ΠΊΠ½ΠΎΠΏΠΊΠ΅
  • Π‘ΠΊΠΎΡ€ΠΎΡΡ‚ΡŒ: воспроизвСдСниС 1x, 2x, 4x
  • ΠŸΡ€ΠΎΠΏΡƒΡΠΊ бСздСйствия: автоматичСский пропуск Π΄ΠΎΠ»Π³ΠΈΡ… ΠΏΠ°ΡƒΠ·
  • Π Π΅ΠΆΠΈΠΌ инспСкции: ΠΊΠ»ΠΈΠΊ ΠΏΠΎ элСмСнтам для просмотра Π΄Π΅Ρ‚Π°Π»Π΅ΠΉ
  • Π’Π°ΠΉΠΌΠ»Π°ΠΉΠ½: ΠΏΠ΅Ρ€Π΅Ρ…ΠΎΠ΄ ΠΊ ΠΊΠΎΠ½ΠΊΡ€Π΅Ρ‚Π½ΠΎΠΉ ΠΌΠ΅Ρ‚ΠΊΠ΅ Π²Ρ€Π΅ΠΌΠ΅Π½ΠΈ

ΠœΠ΅Ρ‚Π°Π΄Π°Π½Π½Ρ‹Π΅ сСссии

КаТдая сСссия Π²ΠΊΠ»ΡŽΡ‡Π°Π΅Ρ‚:

  • Π”Π»ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎΡΡ‚ΡŒ: общая ΠΏΡ€ΠΎΠ΄ΠΎΠ»ΠΆΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎΡΡ‚ΡŒ сСссии
  • ΠŸΡ€ΠΎΡΠΌΠΎΡ‚Ρ€Ρ‹ страниц: посСщённыС страницы
  • Ошибки: JavaScript-ошибки Π²ΠΎ врСмя сСссии
  • Π‘Ρ€Π°ΡƒΠ·Π΅Ρ€: user agent, ОБ, устройство
  • ГСография: страна, Π³ΠΎΡ€ΠΎΠ΄ (Ссли доступно)
  • ΠŸΡ€ΠΎΠΈΠ·Π²ΠΎΠ΄ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎΡΡ‚ΡŒ: срСднСС врСмя Π·Π°Π³Ρ€ΡƒΠ·ΠΊΠΈ страницы

Π‘Ρ†Π΅Π½Π°Ρ€ΠΈΠΈ использования

ΠžΡ‚Π»Π°Π΄ΠΊΠ° ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌ, ΠΎ ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Ρ… сообщили ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΠΈ

ΠŸΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒ: «Кнопка оформлСния Π·Π°ΠΊΠ°Π·Π° Π½Π΅ Ρ€Π°Π±ΠΎΡ‚Π°Π΅Ρ‚Β»

  1. НайдитС сСссии ΠΏΠΎ ID ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»Ρ ΠΈΠ»ΠΈ email
  2. ΠŸΠΎΡΠΌΠΎΡ‚Ρ€ΠΈΡ‚Π΅ запись, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΡƒΠ²ΠΈΠ΄Π΅Ρ‚ΡŒ Ρ‚ΠΎΡ‡Π½ΠΎΠ΅ ΠΏΠΎΠ²Π΅Π΄Π΅Π½ΠΈΠ΅
  3. ВыявитС ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΡƒ (ΠΊΠ½ΠΎΠΏΠΊΠ° скрыта, JS-ошибка ΠΈ Ρ‚. Π΄.)

ΠžΠΏΡ‚ΠΈΠΌΠΈΠ·Π°Ρ†ΠΈΡ UX

ΠŸΡ€ΠΎΡΠΌΠ°Ρ‚Ρ€ΠΈΠ²Π°ΠΉΡ‚Π΅ записи, Ρ‡Ρ‚ΠΎΠ±Ρ‹ Π²Ρ‹ΡΠ²ΠΈΡ‚ΡŒ:

  • Rage clicks (ΠΏΠΎΠ²Ρ‚ΠΎΡ€Π½Ρ‹Π΅ ΠΊΠ»ΠΈΠΊΠΈ ΠΏΠΎ элСмСнтам, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ Π½Π΅ Ρ€Π΅Π°Π³ΠΈΡ€ΡƒΡŽΡ‚)
  • Dead clicks (ΠΊΠ»ΠΈΠΊΠΈ Π±Π΅Π· ΠΊΠ°ΠΊΠΎΠ³ΠΎ-Π»ΠΈΠ±ΠΎ дСйствия)
  • ΠŸΠ°Ρ‚Ρ‚Π΅Ρ€Π½Ρ‹ ΠΎΡ‚ΠΊΠ°Π·Π° ΠΎΡ‚ заполнСния Ρ„ΠΎΡ€ΠΌ
  • Π—Π°ΠΏΡƒΡ‚Π°Π½Π½Ρ‹Π΅ сцСнарии Π½Π°Π²ΠΈΠ³Π°Ρ†ΠΈΠΈ

Анализ Π²ΠΎΡ€ΠΎΠ½ΠΎΠΊ конвСрсии

Π€ΠΈΠ»ΡŒΡ‚Ρ€ΡƒΠΉΡ‚Π΅ сСссии ΠΏΠΎ:

  • ΠšΠΎΠ½Π²Π΅Ρ€Ρ‚ΠΈΡ€ΠΎΠ²Π°Π²ΡˆΠΈΠ΅ vs ΠΎΡ‚ΠΊΠ°Π·Π°Π²ΡˆΠΈΠ΅ΡΡ
  • Π‘Ρ‚Ρ€Π°Π½ΠΈΡ†Π° Π²Ρ…ΠΎΠ΄Π°
  • Π‘Ρ‚Ρ€Π°Π½ΠΈΡ†Π° Π²Ρ‹Ρ…ΠΎΠ΄Π°
  • ВрСмя Π½Π° сайтС

ΠšΠΎΠ½Ρ„ΠΈΠ΄Π΅Π½Ρ†ΠΈΠ°Π»ΡŒΠ½ΠΎΡΡ‚ΡŒ ΠΈ соотвСтствиС трСбованиям

АвтоматичСскоС маскированиС

StatusRadar автоматичСски маскируСт:

  • Поля ΠΏΠ°Ρ€ΠΎΠ»Π΅ΠΉ (type="password")
  • Поля Π²Π²ΠΎΠ΄Π° Π΄Π°Π½Π½Ρ‹Ρ… ΠΊΠ°Ρ€Ρ‚ (ΠΎΠΏΡ€Π΅Π΄Π΅Π»ΡΡŽΡ‚ΡΡ ΠΏΠΎ ΡˆΠ°Π±Π»ΠΎΠ½Ρƒ)
  • НомСра ΡΠΎΡ†ΠΈΠ°Π»ΡŒΠ½ΠΎΠ³ΠΎ страхования
  • Email-адрСса (Ссли настроСно)

БоотвСтствиС GDPR

// Don't start replay until user consents
if (userHasConsented()) {
  rum.configure({
    sessionReplay: { enabled: true }
  });
}

Π₯Ρ€Π°Π½Π΅Π½ΠΈΠ΅ Π΄Π°Π½Π½Ρ‹Ρ…

НастройтС ΠΏΠ΅Ρ€ΠΈΠΎΠ΄ хранСния Π² настройках прилоТСния:

  • 7 Π΄Π½Π΅ΠΉ
  • 30 Π΄Π½Π΅ΠΉ
  • 90 Π΄Π½Π΅ΠΉ
  • ΠŸΡ€ΠΎΠΈΠ·Π²ΠΎΠ»ΡŒΠ½Ρ‹ΠΉ

ΠšΠ²ΠΎΡ‚Ρ‹ Ρ…Ρ€Π°Π½ΠΈΠ»ΠΈΡ‰Π°

Π”Π°Π½Π½Ρ‹Π΅ записСй ΡΠΆΠΈΠΌΠ°ΡŽΡ‚ΡΡ (gzip) ΠΏΠ΅Ρ€Π΅Π΄ Ρ…Ρ€Π°Π½Π΅Π½ΠΈΠ΅ΠΌ.

Π’ΠΈΠΏΠΈΡ‡Π½Ρ‹Π΅ Ρ€Π°Π·ΠΌΠ΅Ρ€Ρ‹ сСссий:

  • ΠŸΡ€ΠΎΡΡ‚Π°Ρ страница: 50–100 ΠšΠ‘
  • Π‘Π°ΠΉΡ‚ e-commerce: 200–500 ΠšΠ‘
  • НасыщСнный SPA: 500 ΠšΠ‘β€“2 ΠœΠ‘

ΠŸΡ€ΠΈΠΌΠ΅Ρ€: ΠΊΠ²ΠΎΡ‚Π° 1 Π“Π‘ β‰ˆ 2 000–10 000 сСссий Π² зависимости ΠΎΡ‚ слоТности

ВлияниС Π½Π° ΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ΄ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎΡΡ‚ΡŒ

Session Replay добавляСт ΠΌΠΈΠ½ΠΈΠΌΠ°Π»ΡŒΠ½Ρ‹Π΅ Π½Π°ΠΊΠ»Π°Π΄Π½Ρ‹Π΅ расходы:

  • ΠΠ°Ρ‡Π°Π»ΡŒΠ½Ρ‹ΠΉ Π±Π°Π½Π΄Π»: +3 ΠšΠ‘ gzip (лСнивая Π·Π°Π³Ρ€ΡƒΠ·ΠΊΠ°)
  • ΠŸΠ°ΠΌΡΡ‚ΡŒ: ~5 ΠœΠ‘ для 10-ΠΌΠΈΠ½ΡƒΡ‚Π½ΠΎΠΉ сСссии
  • CPU: <1% Π² соврСмСнных Π±Ρ€Π°ΡƒΠ·Π΅Ρ€Π°Ρ…
  • Π‘Π΅Ρ‚ΡŒ: ΠΏΠ°ΠΊΠ΅Ρ‚Π½Ρ‹Π΅ Π²Ρ‹Π³Ρ€ΡƒΠ·ΠΊΠΈ ΠΊΠ°ΠΆΠ΄Ρ‹Π΅ 10 сСкунд

Π Π°ΡΡˆΠΈΡ€Π΅Π½Π½Π°Ρ конфигурация

Условная запись

ЗаписывайтС Ρ‚ΠΎΠ»ΡŒΠΊΠΎ ΠΏΡ€ΠΈ ΠΎΠΏΡ€Π΅Π΄Π΅Π»Ρ‘Π½Π½Ρ‹Ρ… условиях:

const rum = new StatusRadarRUM({
  apiKey: 'your-api-key',
  appId: 'your-app-id',
  endpoint: 'https://rum.statusradar.dev/v1/ingest',

  sessionReplay: {
    enabled: true,
    // Only record if user encounters error
    startRecordingOn: 'error',
    // Or record after specific event
    startRecordingAfter: () => {
      return window.location.pathname.includes('/checkout');
    }
  }
});

Π—Π°ΠΏΠΈΡΡŒ canvas

Π’ΠΊΠ»ΡŽΡ‡ΠΈΡ‚Π΅ для ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠΉ с элСмСнтами canvas:

sessionReplay: {
  recordCanvas: true,
  sampling: {
    canvas: 15  // Record canvas at 15 FPS
  }
}

Π‘ΠΊΡ€ΠΈΠ½ΡˆΠΎΡ‚ ΠΏΡ€ΠΈ ошибкС

Π”Π΅Π»Π°ΠΉΡ‚Π΅ ΡΠΊΡ€ΠΈΠ½ΡˆΠΎΡ‚ ΠΏΡ€ΠΈ Π²ΠΎΠ·Π½ΠΈΠΊΠ½ΠΎΠ²Π΅Π½ΠΈΠΈ ошибки:

rum.on('error', (error) => {
  rum.captureScreenshot({
    includeInReplay: true
  });
});

УстранСниС Π½Π΅ΠΏΠΎΠ»Π°Π΄ΠΎΠΊ

Π—Π°ΠΏΠΈΡΡŒ Π½Π΅ вСдётся

  1. ΠŸΡ€ΠΎΠ²Π΅Ρ€ΡŒΡ‚Π΅ ΠΊΠ²ΠΎΡ‚Ρƒ: Dashboard β†’ Observability β†’ Apps β†’ Usage
  2. Π£Π±Π΅Π΄ΠΈΡ‚Π΅ΡΡŒ, Ρ‡Ρ‚ΠΎ sessionReplay.enabled = true
  3. ΠŸΡ€ΠΎΠ²Π΅Ρ€ΡŒΡ‚Π΅ консоль Π±Ρ€Π°ΡƒΠ·Π΅Ρ€Π° Π½Π° ошибки
  4. Π£Π±Π΅Π΄ΠΈΡ‚Π΅ΡΡŒ, Ρ‡Ρ‚ΠΎ sample rate > 0

Π’ записи ΠΎΡ‚ΡΡƒΡ‚ΡΡ‚Π²ΡƒΡŽΡ‚ стили

sessionReplay: {
  inlineStylesheet: true,  // Inline CSS
  inlineImages: true       // Inline small images
}

Блишком большой Ρ€Π°Π·ΠΌΠ΅Ρ€ Ρ„Π°ΠΉΠ»Π° записи

  1. Π‘Π½ΠΈΠ·ΡŒΡ‚Π΅ sample rate
  2. ΠžΡ‚ΠΊΠ»ΡŽΡ‡ΠΈΡ‚Π΅ запись canvas
  3. Π˜ΡΠΊΠ»ΡŽΡ‡ΠΈΡ‚Π΅ тяТёлыС элСмСнты (Ρ€Π΅ΠΊΠ»Π°ΠΌΠ°, Π²ΠΈΠ΄Π΅ΠΎ)
  4. Π‘Π½ΠΈΠ·ΡŒΡ‚Π΅ FPS записи
sessionReplay: {
  sampling: {
    scroll: 100,    // Record scroll every 100ms
    mousemove: 50,  // Record mouse move every 50ms
    input: 500      // Record input every 500ms
  }
}

Π‘ΠΏΡ€Π°Π²ΠΎΡ‡Π½ΠΈΠΊ ΠΏΠΎ API

Запуск/остановка записи

// Start recording
rum.startReplay();

// Stop recording
rum.stopReplay();

// Check if recording
if (rum.isReplayActive()) {
  console.log('Recording active');
}

ΠŸΠΎΠ»ΡƒΡ‡Π΅Π½ΠΈΠ΅ URL сСссии

const sessionUrl = rum.getSessionReplayUrl();
console.log('View replay:', sessionUrl);

Π”Π°Π»ΡŒΠ½Π΅ΠΉΡˆΠΈΠ΅ шаги

On this page