getsentry / getsentry/sentry-javascript

Setup in shared environments creates global `__SENTRY__` carrier (logging, scopes)

Ouverte
#19,324 1 commentaire 0 réactions 1 personne assignée Réclamée par @s1gr1d Voir sur GitHub
Bug
Langage dominant
TypeScript
Étoiles
8.7k
Forks
1.8k
Merge moyen
1 j 17 h
PR mergées (30 j)
515

Description

### Description

It's recommended to set up Sentry in shared environments like shown below, and only use methods on the `scope`:

```js
const client = new BrowserClient({ /* options */ });

const scope = new Scope();
scope.setClient(client);
client.init();

// No usage of global methods like `Sentry.captureException`, only on scope
scope.captureException(new Error("example"));
```

## Problem

### Logger

On SDK initialization, the logger is set up and if you didn't set `__SENTRY_DEBUG__: false` for your build, the SDK will always act on the global singleton (the `__SENTRY__` carrier).

https://github.com/getsentry/sentry-javascript/blob/337f53839102275cba0e511408fb055429715b21/packages/core/src/utils/debug-logger.ts#L112-L118

### Scopes

Calling `scope.captureException()` will also initialize the scopes on the global `__SENTRY__` carrier, which is a bigger problem as it can potentially leak scope data if there are multiple Sentry instances.

`scope.captureException()` calls the global `getIsolationScope()`. This was introduced in the following PR, in order to use the session from the isolation scope: https://github.com/getsentry/sentry-javascript/pull/14860

What happens, is that `scope.captureException()` calls `captureException` with 3 paramters:
https://github.com/getsentry/sentry-javascript/blob/337f53839102275cba0e511408fb055429715b21/packages/core/src/scope.ts#L708-L717

Eventually, this is forwarded until `_captureEvent`, where by default, the 4th parameter calls `getIsolationScope()`:
https://github.com/getsentry/sentry-javascript/blob/eb4382c82f4bc621953d9d9ae6acc97341ce37f2/packages/core/src/client.ts#L1235-L1240

## Reproduction

https://github.com/Lms24/repro-js-shared-environments

## Ideas

- `scope.captureException` could receive an optional `scope` as a third parameter which will be used as the `isolationScope`. But then, the usage would be `scope.captureException(new Error(), {}, scope)`.
- Adding a `sharedEnvSetup: boolean` to the initialization options which would allow us to conditionally use certain APIs (or for example, store the logger settings in the module scope, instead of a global scope)

Guide de contribution

Ouvrir le guide de contribution

Évaluation

Cette issue n'a pas encore été évaluée.

Recevez les nouvelles issues par e-mail

Un résumé court des issues GitHub adaptées aux débutants.