You're Invited:Meet the Socket Team at BlackHat and DEF CON in Las Vegas, Aug 7-8.RSVP
Socket
Socket
Sign inDemoInstall

@sentry-internal/replay

Package Overview
Dependencies
4
Maintainers
9
Versions
37
Alerts
File Explorer

Advanced tools

Install Socket

Detect and block malicious and high-risk dependencies

Install

@sentry-internal/replay

User replays for Sentry


Version published
Maintainers
9
Created

Changelog

Source

8.5.0

Important Changes

  • feat(react): Add React 19 to peer deps (#12207)

This release adds support for React 19 in the @sentry/react SDK package.

  • feat(node): Add @sentry/node/preload hook (#12213)

This release adds a new way to initialize @sentry/node, which allows you to use the SDK with performance instrumentation even if you cannot call Sentry.init() at the very start of your app.

First, run the SDK like this:

node --require @sentry/node/preload ./app.js

Now, you can initialize and import the rest of the SDK later or asynchronously:

const express = require('express');
const Sentry = require('@sentry/node');

const dsn = await getSentryDsn();
Sentry.init({ dsn });

For more details, head over to the PR Description of the new feature. Our docs will be updated soon with a new guide.

Other Changes

  • feat(browser): Do not include metrics in base CDN bundle (#12230)
  • feat(core): Add startNewTrace API (#12138)
  • feat(core): Allow to pass custom scope to captureFeedback() (#12216)
  • feat(core): Only allow SerializedSession in session envelope items (#11979)
  • feat(nextjs): Use Vercel's waitUntil to defer freezing of Vercel Lambdas (#12133)
  • feat(node): Ensure manual OTEL setup works (#12214)
  • fix(aws-serverless): Avoid minifying Module._resolveFilename in Lambda layer bundle (#12232)
  • fix(aws-serverless): Ensure lambda layer uses default export from ImportInTheMiddle (#12233)
  • fix(browser): Improve browser extension error message check (#12146)
  • fix(browser): Remove optional chaining in INP code (#12196)
  • fix(nextjs): Don't report React postpone errors (#12194)
  • fix(nextjs): Use global scope for generic event filters (#12205)
  • fix(node): Add origin to redis span (#12201)
  • fix(node): Change import of @prisma/instrumentation to use default import (#12185)
  • fix(node): Only import inspector asynchronously (#12231)
  • fix(replay): Update matcher for hydration error detection to new React docs (#12209)
  • ref(profiling-node): Add warning when using non-LTS node (#12211)

Readme

Source

Sentry

Sentry Session Replay

npm version npm dm npm dt

This is an internal package that is being re-exported in @sentry/browser and other browser-related SDKs like @sentry/react or @sentry/vue.

Pre-requisites

@sentry-internal/replay requires Node 14+, and browsers newer than IE11.

Installation

Replay can be imported from @sentry/browser, or a respective SDK package like @sentry/react or @sentry/vue. You don't need to install anything in order to use Session Replay. The minimum version that includes Replay is 7.27.0.

For details on using Replay when using Sentry via the CDN bundles, see CDN bundle.

Setup

To set up the integration, add the following to your Sentry initialization. Several options are supported and passable via the integration constructor. See the configuration section below for more details.

import * as Sentry from '@sentry/browser';
// or e.g. import * as Sentry from '@sentry/react';

Sentry.init({
  dsn: '__DSN__',

  // This sets the sample rate to be 10%. You may want this to be 100% while
  // in development and sample at a lower rate in production
  replaysSessionSampleRate: 0.1,

  // If the entire session is not sampled, use the below sample rate to sample
  // sessions when an error occurs.
  replaysOnErrorSampleRate: 1.0,

  integrations: [
    Sentry.replayIntegration({
      // Additional SDK configuration goes in here, for example:
      maskAllText: true,
      blockAllMedia: true,
      // See below for all available options
    }),
  ],
  // ...
});

Lazy loading Replay

Replay will start automatically when you add the integration. If you do not want to start Replay immediately (e.g. if you want to lazy-load it), you can also use addIntegration to load it later:

import * as Sentry from "@sentry/react";
import { BrowserClient } from "@sentry/browser";

Sentry.init({
  // Do not load it initially
  integrations: []
});

// Sometime later
const { Replay } = await import('@sentry/browser');
const client = Sentry.getClient<BrowserClient>();

// Client can be undefined
client?.addIntegration(Sentry.replayIntegration());

Identifying Users

If you have only followed the above instructions to setup session replays, you will only see IP addresses in Sentry's UI. In order to associate a user identity to a session replay, use setUser.

import * as Sentry from '@sentry/browser';

Sentry.setUser({ email: 'jane.doe@example.com' });

Stopping & starting Replays manually

Replay recording only starts when it is included in the integrations array when calling Sentry.init or calling addIntegration from the a Sentry client instance. To stop recording you can call stop().

import * as Sentry from "@sentry/react";
import { BrowserClient } from "@sentry/browser";

const replay = Sentry.replayIntegration();

Sentry.init({
  integrations: [replay]
});

const client = Sentry.getClient<BrowserClient>();

// Add replay integration, will start recoring
client?.addIntegration(replay);

// Stop recording
replay.stop();

When both replaysSessionSampleRate and replaysOnErrorSampleRate are 0, recording will not start. In this case, you can manually start recording:

replay.start(); // Will start a session in "session" mode, regardless of sample rates
replay.startBuffering(); // Will start a session in "buffer" mode, regardless of sample rates

Loading Replay as a CDN Bundle

As an alternative to the NPM package, you can use Replay as a CDN bundle. Please refer to the Session Replay installation guide for CDN bundle instructions.

Deprecated Replay integration bundle Installing the replay integration as a secondary integration bundle to the SDK bundle was deprecated in favour of complete CDN bundles that already contain the replay integration. No need to keep two bundles in sync anymore. The `replay.(min.)js` bundle will be removed in v8 of the JS SDKs.
<script src="https://browser.sentry-cdn.com/7.41.0/bundle.min.js" crossorigin="anonymous"></script>
<script src="https://browser.sentry-cdn.com/7.41.0/replay.min.js" crossorigin="anonymous"></script>

Sessions

A session starts when the Session Replay SDK is first loaded and initialized. The session will continue until 5 minutes passes without any user interactions1 with the application OR until a maximum of 30 minutes have elapsed. Closing the browser tab will end the session immediately according to the rules for SessionStorage.

Accessing the Replay Session ID

You can get the ID of the currently running session via replay.getReplayId(). This will return undefined if no session is ongoing.

Replay Captures Only on Errors

Alternatively, rather than recording an entire session, you can capture a replay only when an error occurs. In this case, the integration will buffer up to one minute worth of events prior to the error being thrown. It will continue to record the session following the rules above regarding session life and activity. Read the sampling section for configuration options.

Sampling

Sampling allows you to control how much of your website's traffic will result in a Session Replay. There are two sample rates you can adjust to get the replays more relevant to your interests:

  • replaysSessionSampleRate - The sample rate for replays that begin recording immediately and last the entirety of the user's session.
  • replaysOnErrorSampleRate - The sample rate for replays that are recorded when an error happens. This type of replay will record up to a minute of events prior to the error and continue recording until the session ends.

When Replay is initialized, we check the replaysSessionSampleRate. If it is sampled, then we start recording & sending Replay data immediately. Else, if replaysOnErrorSampleRate > 0, we'll start recording in buffering mode. In this mode, whenever an error occurs we'll check replaysOnErrorSampleRate. If it is sampled, when we'll upload the Replay to Sentry and continue recording normally.

Configuration

SDK Configuration

The following options can be configured on the root level of your browser-based Sentry SDK, in init({}):

keytypedefaultdescription
replaysSessionSampleRatenumber0The sample rate for replays that begin recording immediately and last the entirety of the user's session. 1.0 will collect all replays, 0 will collect no replays.
replaysOnErrorSampleRatenumber0The sample rate for replays that are recorded when an error happens. This type of replay will record up to a minute of events prior to the error and continue recording until the session ends. 1.0 capturing all sessions with an error, and 0 capturing none.

General Integration Configuration

The following options can be configured as options to the integration, in Sentry.replayIntegration({}):

keytypedefaultdescription
stickySessionbooleantrueKeep track of the user across page loads. Note a single user using multiple tabs will result in multiple sessions. Closing a tab will result in the session being closed as well.

Privacy Configuration

The following options can be configured as options to the integration, in Sentry.replayIntegration({}):

keytypedefaultdescription
maskAllTextbooleantrueMask all text content. Will pass text content through maskFn before sending to server.
maskAllInputsbooleantrueMask values of <input> elements. Passes input values through maskInputFn before sending to server.
blockAllMediabooleantrueBlock all media elements (img, svg, video, object, picture, embed, map, audio)
maskFn(text: string) => string(text) => '*'.repeat(text.length)Function to customize how text content is masked before sending to server. By default, masks text with *.
blockArray.sentry-block, [data-sentry-block]Redact any elements that match the DOM selectors. See privacy section for an example.
unblockArray[]Do not redact any elements that match the DOM selectors. Useful when using blockAllMedia. See privacy section for an example.
maskArray.sentry-mask, [data-sentry-mask]Mask all elements that match the given DOM selectors. See privacy section for an example.
unmaskArray[]Unmask all elements that match the given DOM selectors. Useful when using maskAllText. See privacy section for an example.
ignoreArray.sentry-ignore, [data-sentry-ignore]Ignores all events on the matching input fields. See privacy section for an example.

Privacy

There are several ways to deal with PII. By default, the integration will mask all text content with * and block all media elements (img, svg, video, object, picture, embed, map, audio). This can be disabled by setting maskAllText to false. It is also possible to add the following CSS classes to specific DOM elements to prevent recording its contents: sentry-block, sentry-ignore, and sentry-mask. The following sections will show examples of how content is handled by the differing methods.

Masking

Masking replaces the text content with something else. The default masking behavior is to replace each character with a *. In this example the relevant html code is: <table class="sentry-mask">...</table>. Masking example

Blocking

Blocking replaces the element with a placeholder that has the same dimensions. The recording will show an empty space where the content was. In this example the relevant html code is: <table data-sentry-block>...</table>. Blocking example

Ignoring

Ignoring only applies to form inputs. Events will be ignored on the input element so that the replay does not show what occurs inside of the input. In the below example, notice how the results in the table below the input changes, but no text is visible in the input.

https://user-images.githubusercontent.com/79684/192815134-a6451c3f-d3cb-455f-a699-7c3fe04d0a2e.mov

Error Linking

Currently, errors that happen on the page while a replay is running are linked to the Replay, making it as easy as possible to jump between related issues/replays. However, please note that it is possible that the error count reported on the Replay Detail page does not match the actual errors that have been captured. The reason for that is that errors can be lost, e.g. a network request fails, or similar. This should not happen to often, but be aware that it is theoretically possible.

Manually sending replay data

You can use replay.flush() to immediately send all currently captured replay data. When Replay is currently in buffering mode, this will send up to the last 60 seconds of replay data, and also continue sending afterwards, similar to when an error happens & is recorded.

Footnotes

  1. An 'interaction' refers to either a mouse click or a browser navigation event.

FAQs

Package last updated on 27 May 2024

Did you know?

Socket

Socket for GitHub automatically highlights issues in each pull request and monitors the health of all your open source dependencies. Discover the contents of your packages and block harmful activity before you install or update your dependencies.

Install

Related posts

SocketSocket SOC 2 Logo

Product

  • Package Alerts
  • Integrations
  • Docs
  • Pricing
  • FAQ
  • Roadmap
  • Changelog

Packages

Stay in touch

Get open source security insights delivered straight into your inbox.


  • Terms
  • Privacy
  • Security

Made with ⚡️ by Socket Inc