Session Replay
Session Replay ΠΏΠΎΠ·Π²ΠΎΠ»ΡΠ΅Ρ ΡΠ²ΠΈΠ΄Π΅ΡΡ Π² ΡΠΎΡΠ½ΠΎΡΡΠΈ ΡΠΎ, ΡΡΠΎ ΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΠ΅Π»ΠΈ Π΄Π΅Π»Π°Π»ΠΈ Π½Π° Π²Π°ΡΠ΅ΠΌ ΡΠ°ΠΉΡΠ΅, Π·Π°ΠΏΠΈΡΡΠ²Π°Ρ ΠΈΡ Π²Π·Π°ΠΈΠΌΠΎΠ΄Π΅ΠΉΡΡΠ²ΠΈΡ, Π΄Π²ΠΈΠΆΠ΅Π½ΠΈΡ ΠΌΡΡΠΈ, ΠΏΡΠΎΠΊΡΡΡΠΊΡ ΠΈ ΠΊΠ»ΠΈΠΊΠΈ.
ΠΠ±Π·ΠΎΡ
StatusRadar ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΠ΅Ρ rrweb Π΄Π»Ρ ΠΊΠΎΠ½ΡΠΈΠ΄Π΅Π½ΡΠΈΠ°Π»ΡΠ½ΠΎΠΉ Π·Π°ΠΏΠΈΡΠΈ ΡΠ΅ΡΡΠΈΠΉ Ρ ΠΏΠΎΠ΄Π΄Π΅ΡΠΆΠΊΠΎΠΉ:
- Π‘Π½ΠΈΠΌΠΊΠΎΠ² DOM: ΡΠΈΠΊΡΠΈΡΡΠ΅Ρ ΡΡΡΡΠΊΡΡΡΡ ΡΡΡΠ°Π½ΠΈΡΡ ΠΈ Π΅Ρ ΠΈΠ·ΠΌΠ΅Π½Π΅Π½ΠΈΡ
- ΠΠ°ΠΏΠΈΡΠΈ ΡΠΎΠ±ΡΡΠΈΠΉ: Π΄Π²ΠΈΠΆΠ΅Π½ΠΈΡ ΠΌΡΡΠΈ, ΠΊΠ»ΠΈΠΊΠΈ, ΠΏΡΠΎΠΊΡΡΡΠΊΠ°, Π²Π²ΠΎΠ΄
- ΠΠΎΠ½ΡΡΠΎΠ»Ρ ΠΊΠΎΠ½ΡΠΈΠ΄Π΅Π½ΡΠΈΠ°Π»ΡΠ½ΠΎΡΡΠΈ: Π°Π²ΡΠΎΠΌΠ°ΡΠΈΡΠ΅ΡΠΊΠΈ ΠΌΠ°ΡΠΊΠΈΡΡΠ΅Ρ ΡΡΠ²ΡΡΠ²ΠΈΡΠ΅Π»ΡΠ½ΡΠ΅ Π΄Π°Π½Π½ΡΠ΅
- Π‘ΠΆΠ°ΡΠΈΡ: gzip-ΡΠΆΠ°ΡΠΈΠ΅ Π΄Π»Ρ ΡΡΡΠ΅ΠΊΡΠΈΠ²Π½ΠΎΠ³ΠΎ Ρ ΡΠ°Π½Π΅Π½ΠΈΡ
ΠΠΊΠ»ΡΡΠ΅Π½ΠΈΠ΅ Session Replay
Π¨Π°Π³ 1: ΠΠΊΠ»ΡΡΠΈΡΠ΅ Π² Π½Π°ΡΡΡΠΎΠΉΠΊΠ°Ρ ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΡ
- ΠΠ΅ΡΠ΅ΠΉΠ΄ΠΈΡΠ΅ Π² Dashboard β Observability β Apps
- ΠΡΠΊΡΠΎΠΉΡΠ΅ ΡΠ²ΠΎΡ ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ β Settings
- ΠΠΊΠ»ΡΡΠΈΡΠ΅ Β«Session ReplayΒ»
- ΠΠ°ΡΡΡΠΎΠΉΡΠ΅ Replay Storage Quota (ΠΠ/ΠΌΠ΅ΡΡΡ)
- Π‘ΠΎΡ ΡΠ°Π½ΠΈΡΠ΅ Π½Π°ΡΡΡΠΎΠΉΠΊΠΈ
Π¨Π°Π³ 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
- ΠΠ΅ΡΠ΅ΠΉΠ΄ΠΈΡΠ΅ Π² Dashboard β Observability β Apps β [Your App]
- ΠΡΠΊΡΠΎΠΉΡΠ΅ Π²ΠΊΠ»Π°Π΄ΠΊΡ Β«SessionsΒ»
- ΠΠ°ΠΆΠΌΠΈΡΠ΅ Π½Π° Π»ΡΠ±ΡΡ ΡΠ΅ΡΡΠΈΡ, ΡΡΠΎΠ±Ρ ΠΏΠΎΡΠΌΠΎΡΡΠ΅ΡΡ Π·Π°ΠΏΠΈΡΡ
ΠΠ»Π΅ΠΌΠ΅Π½ΡΡ ΡΠΏΡΠ°Π²Π»Π΅Π½ΠΈΡ ΠΏΠ»Π΅Π΅ΡΠΎΠΌ Π·Π°ΠΏΠΈΡΠ΅ΠΉ
- Play/Pause: ΠΏΡΠΎΠ±Π΅Π» ΠΈΠ»ΠΈ ΠΊΠ»ΠΈΠΊ ΠΏΠΎ ΠΊΠ½ΠΎΠΏΠΊΠ΅
- Π‘ΠΊΠΎΡΠΎΡΡΡ: Π²ΠΎΡΠΏΡΠΎΠΈΠ·Π²Π΅Π΄Π΅Π½ΠΈΠ΅ 1x, 2x, 4x
- ΠΡΠΎΠΏΡΡΠΊ Π±Π΅Π·Π΄Π΅ΠΉΡΡΠ²ΠΈΡ: Π°Π²ΡΠΎΠΌΠ°ΡΠΈΡΠ΅ΡΠΊΠΈΠΉ ΠΏΡΠΎΠΏΡΡΠΊ Π΄ΠΎΠ»Π³ΠΈΡ ΠΏΠ°ΡΠ·
- Π Π΅ΠΆΠΈΠΌ ΠΈΠ½ΡΠΏΠ΅ΠΊΡΠΈΠΈ: ΠΊΠ»ΠΈΠΊ ΠΏΠΎ ΡΠ»Π΅ΠΌΠ΅Π½ΡΠ°ΠΌ Π΄Π»Ρ ΠΏΡΠΎΡΠΌΠΎΡΡΠ° Π΄Π΅ΡΠ°Π»Π΅ΠΉ
- Π’Π°ΠΉΠΌΠ»Π°ΠΉΠ½: ΠΏΠ΅ΡΠ΅Ρ ΠΎΠ΄ ΠΊ ΠΊΠΎΠ½ΠΊΡΠ΅ΡΠ½ΠΎΠΉ ΠΌΠ΅ΡΠΊΠ΅ Π²ΡΠ΅ΠΌΠ΅Π½ΠΈ
ΠΠ΅ΡΠ°Π΄Π°Π½Π½ΡΠ΅ ΡΠ΅ΡΡΠΈΠΈ
ΠΠ°ΠΆΠ΄Π°Ρ ΡΠ΅ΡΡΠΈΡ Π²ΠΊΠ»ΡΡΠ°Π΅Ρ:
- ΠΠ»ΠΈΡΠ΅Π»ΡΠ½ΠΎΡΡΡ: ΠΎΠ±ΡΠ°Ρ ΠΏΡΠΎΠ΄ΠΎΠ»ΠΆΠΈΡΠ΅Π»ΡΠ½ΠΎΡΡΡ ΡΠ΅ΡΡΠΈΠΈ
- ΠΡΠΎΡΠΌΠΎΡΡΡ ΡΡΡΠ°Π½ΠΈΡ: ΠΏΠΎΡΠ΅ΡΡΠ½Π½ΡΠ΅ ΡΡΡΠ°Π½ΠΈΡΡ
- ΠΡΠΈΠ±ΠΊΠΈ: JavaScript-ΠΎΡΠΈΠ±ΠΊΠΈ Π²ΠΎ Π²ΡΠ΅ΠΌΡ ΡΠ΅ΡΡΠΈΠΈ
- ΠΡΠ°ΡΠ·Π΅Ρ: user agent, ΠΠ‘, ΡΡΡΡΠΎΠΉΡΡΠ²ΠΎ
- ΠΠ΅ΠΎΠ³ΡΠ°ΡΠΈΡ: ΡΡΡΠ°Π½Π°, Π³ΠΎΡΠΎΠ΄ (Π΅ΡΠ»ΠΈ Π΄ΠΎΡΡΡΠΏΠ½ΠΎ)
- ΠΡΠΎΠΈΠ·Π²ΠΎΠ΄ΠΈΡΠ΅Π»ΡΠ½ΠΎΡΡΡ: ΡΡΠ΅Π΄Π½Π΅Π΅ Π²ΡΠ΅ΠΌΡ Π·Π°Π³ΡΡΠ·ΠΊΠΈ ΡΡΡΠ°Π½ΠΈΡΡ
Π‘ΡΠ΅Π½Π°ΡΠΈΠΈ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°Π½ΠΈΡ
ΠΡΠ»Π°Π΄ΠΊΠ° ΠΏΡΠΎΠ±Π»Π΅ΠΌ, ΠΎ ΠΊΠΎΡΠΎΡΡΡ ΡΠΎΠΎΠ±ΡΠΈΠ»ΠΈ ΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΠ΅Π»ΠΈ
ΠΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΠ΅Π»Ρ: Β«ΠΠ½ΠΎΠΏΠΊΠ° ΠΎΡΠΎΡΠΌΠ»Π΅Π½ΠΈΡ Π·Π°ΠΊΠ°Π·Π° Π½Π΅ ΡΠ°Π±ΠΎΡΠ°Π΅ΡΒ»
- ΠΠ°ΠΉΠ΄ΠΈΡΠ΅ ΡΠ΅ΡΡΠΈΠΈ ΠΏΠΎ ID ΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΠ΅Π»Ρ ΠΈΠ»ΠΈ email
- ΠΠΎΡΠΌΠΎΡΡΠΈΡΠ΅ Π·Π°ΠΏΠΈΡΡ, ΡΡΠΎΠ±Ρ ΡΠ²ΠΈΠ΄Π΅ΡΡ ΡΠΎΡΠ½ΠΎΠ΅ ΠΏΠΎΠ²Π΅Π΄Π΅Π½ΠΈΠ΅
- ΠΡΡΠ²ΠΈΡΠ΅ ΠΏΡΠΎΠ±Π»Π΅ΠΌΡ (ΠΊΠ½ΠΎΠΏΠΊΠ° ΡΠΊΡΡΡΠ°, 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
});
});
Π£ΡΡΡΠ°Π½Π΅Π½ΠΈΠ΅ Π½Π΅ΠΏΠΎΠ»Π°Π΄ΠΎΠΊ
ΠΠ°ΠΏΠΈΡΡ Π½Π΅ Π²Π΅Π΄ΡΡΡΡ
- ΠΡΠΎΠ²Π΅ΡΡΡΠ΅ ΠΊΠ²ΠΎΡΡ: Dashboard β Observability β Apps β Usage
- Π£Π±Π΅Π΄ΠΈΡΠ΅ΡΡ, ΡΡΠΎ
sessionReplay.enabled = true - ΠΡΠΎΠ²Π΅ΡΡΡΠ΅ ΠΊΠΎΠ½ΡΠΎΠ»Ρ Π±ΡΠ°ΡΠ·Π΅ΡΠ° Π½Π° ΠΎΡΠΈΠ±ΠΊΠΈ
- Π£Π±Π΅Π΄ΠΈΡΠ΅ΡΡ, ΡΡΠΎ sample rate > 0
Π Π·Π°ΠΏΠΈΡΠΈ ΠΎΡΡΡΡΡΡΠ²ΡΡΡ ΡΡΠΈΠ»ΠΈ
sessionReplay: {
inlineStylesheet: true, // Inline CSS
inlineImages: true // Inline small images
}
Π‘Π»ΠΈΡΠΊΠΎΠΌ Π±ΠΎΠ»ΡΡΠΎΠΉ ΡΠ°Π·ΠΌΠ΅Ρ ΡΠ°ΠΉΠ»Π° Π·Π°ΠΏΠΈΡΠΈ
- Π‘Π½ΠΈΠ·ΡΡΠ΅ sample rate
- ΠΡΠΊΠ»ΡΡΠΈΡΠ΅ Π·Π°ΠΏΠΈΡΡ canvas
- ΠΡΠΊΠ»ΡΡΠΈΡΠ΅ ΡΡΠΆΡΠ»ΡΠ΅ ΡΠ»Π΅ΠΌΠ΅Π½ΡΡ (ΡΠ΅ΠΊΠ»Π°ΠΌΠ°, Π²ΠΈΠ΄Π΅ΠΎ)
- Π‘Π½ΠΈΠ·ΡΡΠ΅ 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);
ΠΠ°Π»ΡΠ½Π΅ΠΉΡΠΈΠ΅ ΡΠ°Π³ΠΈ
- ΠΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΠ΅Π»ΡΡΠΊΠΈΠ΅ ΡΠΎΠ±ΡΡΠΈΡ β ΠΎΡΡΠ»Π΅ΠΆΠΈΠ²Π°ΠΉΡΠ΅ ΡΠΎΠ±ΡΡΠΈΡ ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΡ
- ΠΡΡΠ»Π΅ΠΆΠΈΠ²Π°Π½ΠΈΠ΅ ΠΎΡΠΈΠ±ΠΎΠΊ β ΠΎΡΠ»Π°Π΄ΠΊΠ° Ρ ΠΊΠΎΠ½ΡΠ΅ΠΊΡΡΠΎΠΌ Π·Π°ΠΏΠΈΡΠ΅ΠΉ
- Π£ΠΏΡΠ°Π²Π»Π΅Π½ΠΈΠ΅ ΠΊΠ²ΠΎΡΠ°ΠΌΠΈ β ΡΠ»Π΅Π΄ΠΈΡΠ΅ Π·Π° ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°Π½ΠΈΠ΅ΠΌ Ρ ΡΠ°Π½ΠΈΠ»ΠΈΡΠ°
- ΠΠ±Π·ΠΎΡ
- ΠΠΊΠ»ΡΡΠ΅Π½ΠΈΠ΅ Session Replay
- Π¨Π°Π³ 1: ΠΠΊΠ»ΡΡΠΈΡΠ΅ Π² Π½Π°ΡΡΡΠΎΠΉΠΊΠ°Ρ ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΡ
- Π¨Π°Π³ 2: ΠΠΊΠ»ΡΡΠΈΡΠ΅ Π² SDK
- ΠΠ°ΡΠ°ΠΌΠ΅ΡΡΡ ΠΊΠΎΠ½ΡΠΈΠ³ΡΡΠ°ΡΠΈΠΈ
- Π§Π°ΡΡΠΎΡΠ° Π²ΡΠ±ΠΎΡΠΊΠΈ (Sample Rate)
- ΠΠΎΠ½ΡΡΠΎΠ»Ρ ΠΊΠΎΠ½ΡΠΈΠ΄Π΅Π½ΡΠΈΠ°Π»ΡΠ½ΠΎΡΡΠΈ
- HTML-Π°ΡΡΠΈΠ±ΡΡΡ
- ΠΡΠΎΡΠΌΠΎΡΡ Π·Π°ΠΏΠΈΡΠ΅ΠΉ
- ΠΠ°Π²ΠΈΠ³Π°ΡΠΈΡ Π² Dashboard
- ΠΠ»Π΅ΠΌΠ΅Π½ΡΡ ΡΠΏΡΠ°Π²Π»Π΅Π½ΠΈΡ ΠΏΠ»Π΅Π΅ΡΠΎΠΌ Π·Π°ΠΏΠΈΡΠ΅ΠΉ
- ΠΠ΅ΡΠ°Π΄Π°Π½Π½ΡΠ΅ ΡΠ΅ΡΡΠΈΠΈ
- Π‘ΡΠ΅Π½Π°ΡΠΈΠΈ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°Π½ΠΈΡ
- ΠΡΠ»Π°Π΄ΠΊΠ° ΠΏΡΠΎΠ±Π»Π΅ΠΌ, ΠΎ ΠΊΠΎΡΠΎΡΡΡ ΡΠΎΠΎΠ±ΡΠΈΠ»ΠΈ ΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΠ΅Π»ΠΈ
- ΠΠΏΡΠΈΠΌΠΈΠ·Π°ΡΠΈΡ UX
- ΠΠ½Π°Π»ΠΈΠ· Π²ΠΎΡΠΎΠ½ΠΎΠΊ ΠΊΠΎΠ½Π²Π΅ΡΡΠΈΠΈ
- ΠΠΎΠ½ΡΠΈΠ΄Π΅Π½ΡΠΈΠ°Π»ΡΠ½ΠΎΡΡΡ ΠΈ ΡΠΎΠΎΡΠ²Π΅ΡΡΡΠ²ΠΈΠ΅ ΡΡΠ΅Π±ΠΎΠ²Π°Π½ΠΈΡΠΌ
- ΠΠ²ΡΠΎΠΌΠ°ΡΠΈΡΠ΅ΡΠΊΠΎΠ΅ ΠΌΠ°ΡΠΊΠΈΡΠΎΠ²Π°Π½ΠΈΠ΅
- Π‘ΠΎΠΎΡΠ²Π΅ΡΡΡΠ²ΠΈΠ΅ GDPR
- Π₯ΡΠ°Π½Π΅Π½ΠΈΠ΅ Π΄Π°Π½Π½ΡΡ
- ΠΠ²ΠΎΡΡ Ρ ΡΠ°Π½ΠΈΠ»ΠΈΡΠ°
- ΠΠ»ΠΈΡΠ½ΠΈΠ΅ Π½Π° ΠΏΡΠΎΠΈΠ·Π²ΠΎΠ΄ΠΈΡΠ΅Π»ΡΠ½ΠΎΡΡΡ
- Π Π°ΡΡΠΈΡΠ΅Π½Π½Π°Ρ ΠΊΠΎΠ½ΡΠΈΠ³ΡΡΠ°ΡΠΈΡ
- Π£ΡΠ»ΠΎΠ²Π½Π°Ρ Π·Π°ΠΏΠΈΡΡ
- ΠΠ°ΠΏΠΈΡΡ canvas
- Π‘ΠΊΡΠΈΠ½ΡΠΎΡ ΠΏΡΠΈ ΠΎΡΠΈΠ±ΠΊΠ΅
- Π£ΡΡΡΠ°Π½Π΅Π½ΠΈΠ΅ Π½Π΅ΠΏΠΎΠ»Π°Π΄ΠΎΠΊ
- ΠΠ°ΠΏΠΈΡΡ Π½Π΅ Π²Π΅Π΄ΡΡΡΡ
- Π Π·Π°ΠΏΠΈΡΠΈ ΠΎΡΡΡΡΡΡΠ²ΡΡΡ ΡΡΠΈΠ»ΠΈ
- Π‘Π»ΠΈΡΠΊΠΎΠΌ Π±ΠΎΠ»ΡΡΠΎΠΉ ΡΠ°Π·ΠΌΠ΅Ρ ΡΠ°ΠΉΠ»Π° Π·Π°ΠΏΠΈΡΠΈ
- Π‘ΠΏΡΠ°Π²ΠΎΡΠ½ΠΈΠΊ ΠΏΠΎ API
- ΠΠ°ΠΏΡΡΠΊ/ΠΎΡΡΠ°Π½ΠΎΠ²ΠΊΠ° Π·Π°ΠΏΠΈΡΠΈ
- ΠΠΎΠ»ΡΡΠ΅Π½ΠΈΠ΅ URL ΡΠ΅ΡΡΠΈΠΈ
- ΠΠ°Π»ΡΠ½Π΅ΠΉΡΠΈΠ΅ ΡΠ°Π³ΠΈ