From 2b415ecb58c1a221f2ffb824ed4e89924fc625b0 Mon Sep 17 00:00:00 2001 From: Daniel Griesser Date: Thu, 21 Sep 2023 10:46:50 +0200 Subject: [PATCH 1/8] fix conflight --- packages/browser/src/client.ts | 27 ++++- packages/core/src/envelope.ts | 6 +- packages/node/src/sdk.ts | 3 + packages/node/src/spotlight.ts | 206 +++++++++++++++++++++++++++++++++ packages/utils/src/envelope.ts | 4 +- 5 files changed, 235 insertions(+), 11 deletions(-) create mode 100644 packages/node/src/spotlight.ts diff --git a/packages/browser/src/client.ts b/packages/browser/src/client.ts index 5027c4f0f1a4..72c08e79d6d2 100644 --- a/packages/browser/src/client.ts +++ b/packages/browser/src/client.ts @@ -4,14 +4,16 @@ import type { BrowserClientProfilingOptions, BrowserClientReplayOptions, ClientOptions, + Envelope, Event, EventHint, Options, Severity, SeverityLevel, + TransportMakeRequestResponse, UserFeedback, } from '@sentry/types'; -import { createClientReportEnvelope, dsnToString, getSDKSource, logger } from '@sentry/utils'; +import { createClientReportEnvelope, dsnToString, getSDKSource, logger, serializeEnvelope } from '@sentry/utils'; import { eventFromException, eventFromMessage } from './eventbuilder'; import { WINDOW } from './helpers'; @@ -95,11 +97,6 @@ export class BrowserClient extends BaseClient { * Sends user feedback to Sentry. */ public captureUserFeedback(feedback: UserFeedback): void { - if (!this._isEnabled()) { - __DEBUG_BUILD__ && logger.warn('SDK not enabled, will not capture user feedback.'); - return; - } - const envelope = createUserFeedbackEnvelope(feedback, { metadata: this.getSdkMetadata(), dsn: this.getDsn(), @@ -116,6 +113,24 @@ export class BrowserClient extends BaseClient { return super._prepareEvent(event, hint, scope); } + // TODO(dcramer): we need a clean abstraction to http or otherwise transports... + protected _sendEnvelope(envelope: Envelope): PromiseLike | void { + return fetch('http://localhost:8969/stream', { + method: 'POST', + body: serializeEnvelope(envelope), + headers: { + 'Content-Type': 'application/x-sentry-envelope', + }, + mode: 'cors', + }) + .catch(err => { + console.error(err); + }) + .then(() => { + return super._sendEnvelope(envelope); + }); + } + /** * Sends client reports as an envelope. */ diff --git a/packages/core/src/envelope.ts b/packages/core/src/envelope.ts index 5e79d1707d67..9ec29c9d2a7e 100644 --- a/packages/core/src/envelope.ts +++ b/packages/core/src/envelope.ts @@ -36,7 +36,7 @@ function enhanceEventWithSdkInfo(event: Event, sdkInfo?: SdkInfo): Event { /** Creates an envelope from a Session */ export function createSessionEnvelope( session: Session | SessionAggregates, - dsn: DsnComponents, + dsn?: DsnComponents, metadata?: SdkMetadata, tunnel?: string, ): SessionEnvelope { @@ -44,7 +44,7 @@ export function createSessionEnvelope( const envelopeHeaders = { sent_at: new Date().toISOString(), ...(sdkInfo && { sdk: sdkInfo }), - ...(!!tunnel && { dsn: dsnToString(dsn) }), + ...(!!tunnel && dsn && { dsn: dsnToString(dsn) }), }; const envelopeItem: SessionItem = @@ -58,7 +58,7 @@ export function createSessionEnvelope( */ export function createEventEnvelope( event: Event, - dsn: DsnComponents, + dsn?: DsnComponents, metadata?: SdkMetadata, tunnel?: string, ): EventEnvelope { diff --git a/packages/node/src/sdk.ts b/packages/node/src/sdk.ts index 20e8160b7985..1b11ae304656 100644 --- a/packages/node/src/sdk.ts +++ b/packages/node/src/sdk.ts @@ -33,6 +33,7 @@ import { import { getModuleFromFilename } from './module'; import { makeNodeTransport } from './transports'; import type { NodeClientOptions, NodeOptions } from './types'; +import { setupSidecar } from './spotlight'; export const defaultIntegrations = [ // Common @@ -174,6 +175,8 @@ export function init(options: NodeOptions = {}): void { } updateScopeFromEnvVariables(); + + setupSidecar(clientOptions); } /** diff --git a/packages/node/src/spotlight.ts b/packages/node/src/spotlight.ts new file mode 100644 index 000000000000..9af7ef15220f --- /dev/null +++ b/packages/node/src/spotlight.ts @@ -0,0 +1,206 @@ +import { Server, ServerResponse, createServer } from 'http'; +import { NodeClientOptions } from './types'; + +const defaultResponse = ` + + + pipe + + +

+        
+
+`;
+
+function generate_uuidv4() {
+  let dt = new Date().getTime();
+  return 'xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx'.replace(/[xy]/g, function (c) {
+    let rnd = Math.random() * 16;
+    rnd = (dt + rnd) % 16 | 0;
+    dt = Math.floor(dt / 16);
+    return (c === 'x' ? rnd : (rnd & 0x3) | 0x8).toString(16);
+  });
+}
+
+class MessageBuffer {
+  private _size: number;
+  private _items: [number, T][];
+  private _writePos: number = 0;
+  private _head: number = 0;
+  private _timeout: number = 10;
+  private _readers: Map void>;
+
+  public constructor(size = 100) {
+    this._size = size;
+    this._items = new Array(size);
+    this._readers = new Map void>();
+  }
+
+  public put(item: T): void {
+    const curTime = new Date().getTime();
+    this._items[this._writePos % this._size] = [curTime, item];
+    this._writePos += 1;
+    if (this._head === this._writePos) {
+      this._head += 1;
+    }
+
+    const minTime = curTime - this._timeout * 1000;
+    let atItem;
+    while (this._head < this._writePos) {
+      atItem = this._items[this._head % this._size];
+      if (atItem === undefined) break;
+      if (atItem[0] > minTime) break;
+      this._head += 1;
+    }
+  }
+
+  public subscribe(callback: (item: T) => void): string {
+    const readerId = generate_uuidv4();
+    this._readers.set(readerId, callback);
+    setTimeout(() => this.stream(readerId));
+    return readerId;
+  }
+
+  public unsubscribe(readerId: string): void {
+    this._readers.delete(readerId);
+  }
+
+  public stream(readerId: string, readPos?: number): void {
+    const cb = this._readers.get(readerId);
+    if (!cb) return;
+
+    let atReadPos = typeof readPos === 'undefined' ? this._head : readPos;
+    let item;
+    while (true) {
+      item = this._items[atReadPos % this._size];
+      if (typeof item === 'undefined') {
+        break;
+      }
+      cb(item[1]);
+      atReadPos += 1;
+    }
+    setTimeout(() => this.stream(readerId, atReadPos), 500);
+  }
+}
+
+const ENVELOPE = 'envelope';
+const EVENT = 'event';
+
+type Payload = [string, string];
+
+let serverInstance: Server;
+
+function getCorsHeader(): { [name: string]: string } {
+  return {
+    'Access-Control-Allow-Origin': '*',
+    'Access-Control-Allow-Credentials': 'true',
+    'Access-Control-Allow-Headers': '*',
+  };
+}
+
+function startServer(buffer: MessageBuffer, port: number): Server {
+  const server = createServer((req, res) => {
+    console.log(`[spotlight] Received request ${req.method} ${req.url}`);
+    if (req.headers.accept && req.headers.accept == 'text/event-stream') {
+      if (req.url == '/stream') {
+        res.writeHead(200, {
+          'Content-Type': 'text/event-stream',
+          'Cache-Control': 'no-cache',
+          ...getCorsHeader(),
+          Connection: 'keep-alive',
+        });
+        res.flushHeaders();
+
+        const sub = buffer.subscribe(([payloadType, data]) => {
+          res.write(`event:${payloadType}\n`);
+          data.split('\n').forEach(line => {
+            res.write(`data:${line}\n`);
+          });
+          res.write('\n');
+        });
+
+        req.on('close', () => {
+          buffer.unsubscribe(sub);
+        });
+      } else {
+        res.writeHead(404);
+        res.end();
+      }
+    } else {
+      if (req.url == '/stream') {
+        if (req.method === 'OPTIONS') {
+          res.writeHead(204, {
+            'Cache-Control': 'no-cache',
+            ...getCorsHeader(),
+          });
+          res.end();
+        } else if (req.method === 'POST') {
+          let body: string = '';
+          req.on('readable', () => {
+            const chunk = req.read();
+            if (chunk !== null) body += chunk;
+          });
+          req.on('end', () => {
+            const payloadType = req.headers['content-type'] === 'application/x-sentry-envelope' ? ENVELOPE : EVENT;
+            buffer.put([payloadType, body]);
+            res.writeHead(204, {
+              'Cache-Control': 'no-cache',
+              ...getCorsHeader(),
+              Connection: 'keep-alive',
+            });
+            res.end();
+          });
+        } else {
+          res.writeHead(200, {
+            'Content-Type': 'text/html',
+          });
+          res.write(defaultResponse);
+          res.end();
+        }
+      } else {
+        res.writeHead(404);
+        res.end();
+      }
+    }
+  });
+  server.on('error', e => {
+    if ('code' in e && e.code === 'EADDRINUSE') {
+      // console.error('[Spotlight] Address in use, retrying...');
+      setTimeout(() => {
+        server.close();
+        server.listen(port);
+      }, 5000);
+    }
+  });
+  server.listen(port, () => {
+    console.log(`[Spotlight] Sidecar listening on ${port}`);
+  });
+
+  return server;
+}
+
+export function setupSidecar(options: NodeClientOptions): void {
+  const buffer: MessageBuffer = new MessageBuffer();
+
+  if (!serverInstance) {
+    serverInstance = startServer(buffer, 8969);
+  }
+}
+
+function shutdown() {
+  if (serverInstance) {
+    console.log('[Spotlight] Shutting down server');
+    serverInstance.close();
+  }
+}
+
+process.on('SIGTERM', () => {
+  shutdown();
+});
diff --git a/packages/utils/src/envelope.ts b/packages/utils/src/envelope.ts
index e91aefdbab5b..e249564eca51 100644
--- a/packages/utils/src/envelope.ts
+++ b/packages/utils/src/envelope.ts
@@ -234,14 +234,14 @@ export function createEventEnvelopeHeaders(
   event: Event,
   sdkInfo: SdkInfo | undefined,
   tunnel: string | undefined,
-  dsn: DsnComponents,
+  dsn?: DsnComponents,
 ): EventEnvelopeHeaders {
   const dynamicSamplingContext = event.sdkProcessingMetadata && event.sdkProcessingMetadata.dynamicSamplingContext;
   return {
     event_id: event.event_id as string,
     sent_at: new Date().toISOString(),
     ...(sdkInfo && { sdk: sdkInfo }),
-    ...(!!tunnel && { dsn: dsnToString(dsn) }),
+    ...(!!tunnel && dsn && { dsn: dsnToString(dsn) }),
     ...(dynamicSamplingContext && {
       trace: dropUndefinedKeys({ ...dynamicSamplingContext }),
     }),

From e49b078f78235e9583c270f7ea7072d162a08c71 Mon Sep 17 00:00:00 2001
From: Daniel Griesser 
Date: Thu, 21 Sep 2023 11:42:33 +0200
Subject: [PATCH 2/8] feat: Add Spotlight Client

---
 packages/browser/src/client.ts               | 19 +--------
 packages/browser/src/transports/spotlight.ts | 44 ++++++++++++++++++++
 packages/core/src/baseclient.ts              | 22 +++++++---
 packages/types/src/transport.ts              |  2 +
 4 files changed, 63 insertions(+), 24 deletions(-)
 create mode 100644 packages/browser/src/transports/spotlight.ts

diff --git a/packages/browser/src/client.ts b/packages/browser/src/client.ts
index 72c08e79d6d2..309a0ac5196b 100644
--- a/packages/browser/src/client.ts
+++ b/packages/browser/src/client.ts
@@ -113,24 +113,6 @@ export class BrowserClient extends BaseClient {
     return super._prepareEvent(event, hint, scope);
   }
 
-  // TODO(dcramer): we need a clean abstraction to http or otherwise transports...
-  protected _sendEnvelope(envelope: Envelope): PromiseLike | void {
-    return fetch('http://localhost:8969/stream', {
-      method: 'POST',
-      body: serializeEnvelope(envelope),
-      headers: {
-        'Content-Type': 'application/x-sentry-envelope',
-      },
-      mode: 'cors',
-    })
-      .catch(err => {
-        console.error(err);
-      })
-      .then(() => {
-        return super._sendEnvelope(envelope);
-      });
-  }
-
   /**
    * Sends client reports as an envelope.
    */
@@ -142,6 +124,7 @@ export class BrowserClient extends BaseClient {
       return;
     }
 
+    // This is really the only place where we want to check for a DSN and only send outcomes then
     if (!this._dsn) {
       __DEBUG_BUILD__ && logger.log('No dsn provided, will not send outcomes');
       return;
diff --git a/packages/browser/src/transports/spotlight.ts b/packages/browser/src/transports/spotlight.ts
new file mode 100644
index 000000000000..c822c4ac7e50
--- /dev/null
+++ b/packages/browser/src/transports/spotlight.ts
@@ -0,0 +1,44 @@
+import { createTransport } from '@sentry/core';
+import type { Transport, TransportMakeRequestResponse, TransportRequest } from '@sentry/types';
+import { rejectedSyncPromise } from '@sentry/utils';
+
+import type { BrowserTransportOptions } from './types';
+import type { FetchImpl } from './utils';
+import { clearCachedFetchImplementation, getNativeFetchImplementation } from './utils';
+
+/**
+ * Creates a Transport that uses the Fetch API to send events to Sentry.
+ */
+export function makeSpotlightTransport(
+  options: BrowserTransportOptions,
+  nativeFetch: FetchImpl = getNativeFetchImplementation(),
+): Transport {
+  function makeRequest(request: TransportRequest): PromiseLike {
+    const requestOptions: RequestInit = {
+      body: request.body,
+      method: 'POST',
+      referrerPolicy: 'origin',
+      headers: options.headers,
+      ...options.fetchOptions,
+    };
+
+    try {
+      return nativeFetch('http://localhost:8969/stream', requestOptions).then(response => {
+        return {
+          statusCode: response.status,
+          headers: {
+            'x-sentry-rate-limits': response.headers.get('X-Sentry-Rate-Limits'),
+            'retry-after': response.headers.get('Retry-After'),
+          },
+        };
+      });
+    } catch (e) {
+      clearCachedFetchImplementation();
+      return rejectedSyncPromise(e);
+    }
+  }
+
+  const transport = createTransport(options, makeRequest);
+  transport.providesUrl = true;
+  return transport;
+}
diff --git a/packages/core/src/baseclient.ts b/packages/core/src/baseclient.ts
index 1a15c4bc37bd..e6c8007a3756 100644
--- a/packages/core/src/baseclient.ts
+++ b/packages/core/src/baseclient.ts
@@ -137,6 +137,16 @@ export abstract class BaseClient implements Client {
         ...options.transportOptions,
         url,
       });
+    } else {
+      // User provided no DSN, we check if the transport provided is a local client and use this instead
+      const transport = options.transport({
+        recordDroppedEvent: this.recordDroppedEvent.bind(this),
+        ...options.transportOptions,
+        url: '',
+      });
+      if (transport.providesUrl) {
+        this._transport = transport;
+      }
     }
   }
 
@@ -336,9 +346,9 @@ export abstract class BaseClient implements Client {
    * @inheritDoc
    */
   public sendEvent(event: Event, hint: EventHint = {}): void {
-    this.emit('beforeSendEvent', event, hint);
+    if (this._isEnabled()) {
+      this.emit('beforeSendEvent', event, hint);
 
-    if (this._dsn) {
       let env = createEventEnvelope(event, this._dsn, this._options._metadata, this._options.tunnel);
 
       for (const attachment of hint.attachments || []) {
@@ -362,7 +372,7 @@ export abstract class BaseClient implements Client {
    * @inheritDoc
    */
   public sendSession(session: Session | SessionAggregates): void {
-    if (this._dsn) {
+    if (this._isEnabled()) {
       const env = createSessionEnvelope(session, this._dsn, this._options._metadata, this._options.tunnel);
       void this._sendEnvelope(env);
     }
@@ -531,9 +541,9 @@ export abstract class BaseClient implements Client {
     });
   }
 
-  /** Determines whether this SDK is enabled and a valid Dsn is present. */
+  /** Determines whether this SDK is enabled and a transport is present. */
   protected _isEnabled(): boolean {
-    return this.getOptions().enabled !== false && this._dsn !== undefined;
+    return this.getOptions().enabled !== false && this._transport !== undefined;
   }
 
   /**
@@ -738,7 +748,7 @@ export abstract class BaseClient implements Client {
    * @inheritdoc
    */
   protected _sendEnvelope(envelope: Envelope): PromiseLike | void {
-    if (this._transport && this._dsn) {
+    if (this._transport) {
       this.emit('beforeEnvelope', envelope);
 
       return this._transport.send(envelope).then(null, reason => {
diff --git a/packages/types/src/transport.ts b/packages/types/src/transport.ts
index 05638b67228e..77a987747b02 100644
--- a/packages/types/src/transport.ts
+++ b/packages/types/src/transport.ts
@@ -29,6 +29,8 @@ export interface BaseTransportOptions extends InternalBaseTransportOptions {
 }
 
 export interface Transport {
+  /** If set to true, the transport provides it's own url */
+  providesUrl?: boolean;
   // TODO (v8) Remove void from return as it was only retained to avoid a breaking change
   send(request: Envelope): PromiseLike;
   flush(timeout?: number): PromiseLike;

From ab4fdd19269ede3dad1721e19b34f277ae8b17e6 Mon Sep 17 00:00:00 2001
From: Daniel Griesser 
Date: Thu, 21 Sep 2023 11:45:18 +0200
Subject: [PATCH 3/8] fix: Imports

---
 packages/browser/src/client.ts | 9 ++++++---
 1 file changed, 6 insertions(+), 3 deletions(-)

diff --git a/packages/browser/src/client.ts b/packages/browser/src/client.ts
index 309a0ac5196b..4c0ace57547b 100644
--- a/packages/browser/src/client.ts
+++ b/packages/browser/src/client.ts
@@ -4,16 +4,14 @@ import type {
   BrowserClientProfilingOptions,
   BrowserClientReplayOptions,
   ClientOptions,
-  Envelope,
   Event,
   EventHint,
   Options,
   Severity,
   SeverityLevel,
-  TransportMakeRequestResponse,
   UserFeedback,
 } from '@sentry/types';
-import { createClientReportEnvelope, dsnToString, getSDKSource, logger, serializeEnvelope } from '@sentry/utils';
+import { createClientReportEnvelope, dsnToString, getSDKSource, logger } from '@sentry/utils';
 
 import { eventFromException, eventFromMessage } from './eventbuilder';
 import { WINDOW } from './helpers';
@@ -97,6 +95,11 @@ export class BrowserClient extends BaseClient {
    * Sends user feedback to Sentry.
    */
   public captureUserFeedback(feedback: UserFeedback): void {
+    if (!this._isEnabled()) {
+      __DEBUG_BUILD__ && logger.warn('SDK not enabled, will not capture user feedback.');
+      return;
+    }
+
     const envelope = createUserFeedbackEnvelope(feedback, {
       metadata: this.getSdkMetadata(),
       dsn: this.getDsn(),

From c135853022c5cfdcda3e0aa03c3a5f577faa10a0 Mon Sep 17 00:00:00 2001
From: Daniel Griesser 
Date: Thu, 21 Sep 2023 14:38:16 +0200
Subject: [PATCH 4/8] ref: Move sidecar to Spotlight

---
 packages/browser/src/index.ts                |   1 +
 packages/browser/src/transports/spotlight.ts |   5 +-
 packages/core/src/baseclient.ts              |   1 +
 packages/node/src/integrations/http.ts       |  45 ++--
 packages/node/src/module.ts                  |   8 +-
 packages/node/src/sdk.ts                     |   3 -
 packages/node/src/spotlight.ts               | 206 -------------------
 7 files changed, 36 insertions(+), 233 deletions(-)
 delete mode 100644 packages/node/src/spotlight.ts

diff --git a/packages/browser/src/index.ts b/packages/browser/src/index.ts
index 60a2bef7a2f9..b2e827395004 100644
--- a/packages/browser/src/index.ts
+++ b/packages/browser/src/index.ts
@@ -52,5 +52,6 @@ export {
 export type { SpanStatusType } from '@sentry/core';
 export type { Span } from '@sentry/types';
 export { makeBrowserOfflineTransport } from './transports/offline';
+export { makeSpotlightTransport } from './transports/spotlight';
 export { onProfilingStartRouteTransaction } from './profiling/hubextensions';
 export { BrowserProfilingIntegration } from './profiling/integration';
diff --git a/packages/browser/src/transports/spotlight.ts b/packages/browser/src/transports/spotlight.ts
index c822c4ac7e50..c30e0ca30d2a 100644
--- a/packages/browser/src/transports/spotlight.ts
+++ b/packages/browser/src/transports/spotlight.ts
@@ -18,7 +18,10 @@ export function makeSpotlightTransport(
       body: request.body,
       method: 'POST',
       referrerPolicy: 'origin',
-      headers: options.headers,
+      headers: {
+        ...options.headers,
+        'Content-Type': 'application/x-sentry-envelope',
+      },
       ...options.fetchOptions,
     };
 
diff --git a/packages/core/src/baseclient.ts b/packages/core/src/baseclient.ts
index e6c8007a3756..3a91ed08b059 100644
--- a/packages/core/src/baseclient.ts
+++ b/packages/core/src/baseclient.ts
@@ -145,6 +145,7 @@ export abstract class BaseClient implements Client {
         url: '',
       });
       if (transport.providesUrl) {
+        __DEBUG_BUILD__ && logger.info('Loaded SDK locally');
         this._transport = transport;
       }
     }
diff --git a/packages/node/src/integrations/http.ts b/packages/node/src/integrations/http.ts
index 95b68e2c8eb3..8607cc9ff3be 100644
--- a/packages/node/src/integrations/http.ts
+++ b/packages/node/src/integrations/http.ts
@@ -115,32 +115,35 @@ export class Http implements Integration {
       this._tracing?.shouldCreateSpanForRequest || clientOptions?.shouldCreateSpanForRequest;
     // eslint-disable-next-line deprecation/deprecation
     const tracePropagationTargets = clientOptions?.tracePropagationTargets || this._tracing?.tracePropagationTargets;
-
-    // eslint-disable-next-line @typescript-eslint/no-var-requires
-    const httpModule = require('http');
-    const wrappedHttpHandlerMaker = _createWrappedRequestMethodFactory(
-      httpModule,
-      this._breadcrumbs,
-      shouldCreateSpanForRequest,
-      tracePropagationTargets,
-    );
-    fill(httpModule, 'get', wrappedHttpHandlerMaker);
-    fill(httpModule, 'request', wrappedHttpHandlerMaker);
-
-    // NOTE: Prior to Node 9, `https` used internals of `http` module, thus we don't patch it.
-    // If we do, we'd get double breadcrumbs and double spans for `https` calls.
-    // It has been changed in Node 9, so for all versions equal and above, we patch `https` separately.
-    if (NODE_VERSION.major && NODE_VERSION.major > 8) {
+    try {
       // eslint-disable-next-line @typescript-eslint/no-var-requires
-      const httpsModule = require('https');
-      const wrappedHttpsHandlerMaker = _createWrappedRequestMethodFactory(
-        httpsModule,
+      const httpModule = require('http');
+      const wrappedHttpHandlerMaker = _createWrappedRequestMethodFactory(
+        httpModule,
         this._breadcrumbs,
         shouldCreateSpanForRequest,
         tracePropagationTargets,
       );
-      fill(httpsModule, 'get', wrappedHttpsHandlerMaker);
-      fill(httpsModule, 'request', wrappedHttpsHandlerMaker);
+      fill(httpModule, 'get', wrappedHttpHandlerMaker);
+      fill(httpModule, 'request', wrappedHttpHandlerMaker);
+
+      // NOTE: Prior to Node 9, `https` used internals of `http` module, thus we don't patch it.
+      // If we do, we'd get double breadcrumbs and double spans for `https` calls.
+      // It has been changed in Node 9, so for all versions equal and above, we patch `https` separately.
+      if (NODE_VERSION.major && NODE_VERSION.major > 8) {
+        // eslint-disable-next-line @typescript-eslint/no-var-requires
+        const httpsModule = require('https');
+        const wrappedHttpsHandlerMaker = _createWrappedRequestMethodFactory(
+          httpsModule,
+          this._breadcrumbs,
+          shouldCreateSpanForRequest,
+          tracePropagationTargets,
+        );
+        fill(httpsModule, 'get', wrappedHttpsHandlerMaker);
+        fill(httpsModule, 'request', wrappedHttpsHandlerMaker);
+      }
+    } catch (e) {
+      // TODO: require is not defined
     }
   }
 }
diff --git a/packages/node/src/module.ts b/packages/node/src/module.ts
index 44bff87a02d2..adf297731bb5 100644
--- a/packages/node/src/module.ts
+++ b/packages/node/src/module.ts
@@ -22,8 +22,12 @@ export function getModuleFromFilename(
 
   // eslint-disable-next-line prefer-const
   let { root, dir, base: basename, ext } = posix.parse(normalizedFilename);
-
-  const base = (require && require.main && require.main.filename && dir) || global.process.cwd();
+  let base = '';
+  try {
+    base = (require && require.main && require.main.filename && dir) || global.process.cwd();
+  } catch (e) {
+    // TODO: require is not defined
+  }
 
   const normalizedBase = `${base}/`;
 
diff --git a/packages/node/src/sdk.ts b/packages/node/src/sdk.ts
index 1b11ae304656..20e8160b7985 100644
--- a/packages/node/src/sdk.ts
+++ b/packages/node/src/sdk.ts
@@ -33,7 +33,6 @@ import {
 import { getModuleFromFilename } from './module';
 import { makeNodeTransport } from './transports';
 import type { NodeClientOptions, NodeOptions } from './types';
-import { setupSidecar } from './spotlight';
 
 export const defaultIntegrations = [
   // Common
@@ -175,8 +174,6 @@ export function init(options: NodeOptions = {}): void {
   }
 
   updateScopeFromEnvVariables();
-
-  setupSidecar(clientOptions);
 }
 
 /**
diff --git a/packages/node/src/spotlight.ts b/packages/node/src/spotlight.ts
deleted file mode 100644
index 9af7ef15220f..000000000000
--- a/packages/node/src/spotlight.ts
+++ /dev/null
@@ -1,206 +0,0 @@
-import { Server, ServerResponse, createServer } from 'http';
-import { NodeClientOptions } from './types';
-
-const defaultResponse = `
-
-
-        pipe
-
-
-        

-        
-
-`;
-
-function generate_uuidv4() {
-  let dt = new Date().getTime();
-  return 'xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx'.replace(/[xy]/g, function (c) {
-    let rnd = Math.random() * 16;
-    rnd = (dt + rnd) % 16 | 0;
-    dt = Math.floor(dt / 16);
-    return (c === 'x' ? rnd : (rnd & 0x3) | 0x8).toString(16);
-  });
-}
-
-class MessageBuffer {
-  private _size: number;
-  private _items: [number, T][];
-  private _writePos: number = 0;
-  private _head: number = 0;
-  private _timeout: number = 10;
-  private _readers: Map void>;
-
-  public constructor(size = 100) {
-    this._size = size;
-    this._items = new Array(size);
-    this._readers = new Map void>();
-  }
-
-  public put(item: T): void {
-    const curTime = new Date().getTime();
-    this._items[this._writePos % this._size] = [curTime, item];
-    this._writePos += 1;
-    if (this._head === this._writePos) {
-      this._head += 1;
-    }
-
-    const minTime = curTime - this._timeout * 1000;
-    let atItem;
-    while (this._head < this._writePos) {
-      atItem = this._items[this._head % this._size];
-      if (atItem === undefined) break;
-      if (atItem[0] > minTime) break;
-      this._head += 1;
-    }
-  }
-
-  public subscribe(callback: (item: T) => void): string {
-    const readerId = generate_uuidv4();
-    this._readers.set(readerId, callback);
-    setTimeout(() => this.stream(readerId));
-    return readerId;
-  }
-
-  public unsubscribe(readerId: string): void {
-    this._readers.delete(readerId);
-  }
-
-  public stream(readerId: string, readPos?: number): void {
-    const cb = this._readers.get(readerId);
-    if (!cb) return;
-
-    let atReadPos = typeof readPos === 'undefined' ? this._head : readPos;
-    let item;
-    while (true) {
-      item = this._items[atReadPos % this._size];
-      if (typeof item === 'undefined') {
-        break;
-      }
-      cb(item[1]);
-      atReadPos += 1;
-    }
-    setTimeout(() => this.stream(readerId, atReadPos), 500);
-  }
-}
-
-const ENVELOPE = 'envelope';
-const EVENT = 'event';
-
-type Payload = [string, string];
-
-let serverInstance: Server;
-
-function getCorsHeader(): { [name: string]: string } {
-  return {
-    'Access-Control-Allow-Origin': '*',
-    'Access-Control-Allow-Credentials': 'true',
-    'Access-Control-Allow-Headers': '*',
-  };
-}
-
-function startServer(buffer: MessageBuffer, port: number): Server {
-  const server = createServer((req, res) => {
-    console.log(`[spotlight] Received request ${req.method} ${req.url}`);
-    if (req.headers.accept && req.headers.accept == 'text/event-stream') {
-      if (req.url == '/stream') {
-        res.writeHead(200, {
-          'Content-Type': 'text/event-stream',
-          'Cache-Control': 'no-cache',
-          ...getCorsHeader(),
-          Connection: 'keep-alive',
-        });
-        res.flushHeaders();
-
-        const sub = buffer.subscribe(([payloadType, data]) => {
-          res.write(`event:${payloadType}\n`);
-          data.split('\n').forEach(line => {
-            res.write(`data:${line}\n`);
-          });
-          res.write('\n');
-        });
-
-        req.on('close', () => {
-          buffer.unsubscribe(sub);
-        });
-      } else {
-        res.writeHead(404);
-        res.end();
-      }
-    } else {
-      if (req.url == '/stream') {
-        if (req.method === 'OPTIONS') {
-          res.writeHead(204, {
-            'Cache-Control': 'no-cache',
-            ...getCorsHeader(),
-          });
-          res.end();
-        } else if (req.method === 'POST') {
-          let body: string = '';
-          req.on('readable', () => {
-            const chunk = req.read();
-            if (chunk !== null) body += chunk;
-          });
-          req.on('end', () => {
-            const payloadType = req.headers['content-type'] === 'application/x-sentry-envelope' ? ENVELOPE : EVENT;
-            buffer.put([payloadType, body]);
-            res.writeHead(204, {
-              'Cache-Control': 'no-cache',
-              ...getCorsHeader(),
-              Connection: 'keep-alive',
-            });
-            res.end();
-          });
-        } else {
-          res.writeHead(200, {
-            'Content-Type': 'text/html',
-          });
-          res.write(defaultResponse);
-          res.end();
-        }
-      } else {
-        res.writeHead(404);
-        res.end();
-      }
-    }
-  });
-  server.on('error', e => {
-    if ('code' in e && e.code === 'EADDRINUSE') {
-      // console.error('[Spotlight] Address in use, retrying...');
-      setTimeout(() => {
-        server.close();
-        server.listen(port);
-      }, 5000);
-    }
-  });
-  server.listen(port, () => {
-    console.log(`[Spotlight] Sidecar listening on ${port}`);
-  });
-
-  return server;
-}
-
-export function setupSidecar(options: NodeClientOptions): void {
-  const buffer: MessageBuffer = new MessageBuffer();
-
-  if (!serverInstance) {
-    serverInstance = startServer(buffer, 8969);
-  }
-}
-
-function shutdown() {
-  if (serverInstance) {
-    console.log('[Spotlight] Shutting down server');
-    serverInstance.close();
-  }
-}
-
-process.on('SIGTERM', () => {
-  shutdown();
-});

From 278c6da5c0f754594ecabc6acdc5ab242f5259ee Mon Sep 17 00:00:00 2001
From: Daniel Griesser 
Date: Sat, 23 Sep 2023 23:10:54 +0200
Subject: [PATCH 5/8] ref: Don't have a spotlight transport

---
 packages/browser/src/index.ts                |  1 -
 packages/browser/src/transports/spotlight.ts | 47 -----------------
 packages/core/src/baseclient.ts              | 55 +++++++-------------
 packages/types/src/client.ts                 |  2 +-
 packages/types/src/transport.ts              |  2 -
 5 files changed, 20 insertions(+), 87 deletions(-)
 delete mode 100644 packages/browser/src/transports/spotlight.ts

diff --git a/packages/browser/src/index.ts b/packages/browser/src/index.ts
index b2e827395004..60a2bef7a2f9 100644
--- a/packages/browser/src/index.ts
+++ b/packages/browser/src/index.ts
@@ -52,6 +52,5 @@ export {
 export type { SpanStatusType } from '@sentry/core';
 export type { Span } from '@sentry/types';
 export { makeBrowserOfflineTransport } from './transports/offline';
-export { makeSpotlightTransport } from './transports/spotlight';
 export { onProfilingStartRouteTransaction } from './profiling/hubextensions';
 export { BrowserProfilingIntegration } from './profiling/integration';
diff --git a/packages/browser/src/transports/spotlight.ts b/packages/browser/src/transports/spotlight.ts
deleted file mode 100644
index c30e0ca30d2a..000000000000
--- a/packages/browser/src/transports/spotlight.ts
+++ /dev/null
@@ -1,47 +0,0 @@
-import { createTransport } from '@sentry/core';
-import type { Transport, TransportMakeRequestResponse, TransportRequest } from '@sentry/types';
-import { rejectedSyncPromise } from '@sentry/utils';
-
-import type { BrowserTransportOptions } from './types';
-import type { FetchImpl } from './utils';
-import { clearCachedFetchImplementation, getNativeFetchImplementation } from './utils';
-
-/**
- * Creates a Transport that uses the Fetch API to send events to Sentry.
- */
-export function makeSpotlightTransport(
-  options: BrowserTransportOptions,
-  nativeFetch: FetchImpl = getNativeFetchImplementation(),
-): Transport {
-  function makeRequest(request: TransportRequest): PromiseLike {
-    const requestOptions: RequestInit = {
-      body: request.body,
-      method: 'POST',
-      referrerPolicy: 'origin',
-      headers: {
-        ...options.headers,
-        'Content-Type': 'application/x-sentry-envelope',
-      },
-      ...options.fetchOptions,
-    };
-
-    try {
-      return nativeFetch('http://localhost:8969/stream', requestOptions).then(response => {
-        return {
-          statusCode: response.status,
-          headers: {
-            'x-sentry-rate-limits': response.headers.get('X-Sentry-Rate-Limits'),
-            'retry-after': response.headers.get('Retry-After'),
-          },
-        };
-      });
-    } catch (e) {
-      clearCachedFetchImplementation();
-      return rejectedSyncPromise(e);
-    }
-  }
-
-  const transport = createTransport(options, makeRequest);
-  transport.providesUrl = true;
-  return transport;
-}
diff --git a/packages/core/src/baseclient.ts b/packages/core/src/baseclient.ts
index 3a91ed08b059..69314ecb957f 100644
--- a/packages/core/src/baseclient.ts
+++ b/packages/core/src/baseclient.ts
@@ -127,7 +127,7 @@ export abstract class BaseClient implements Client {
     if (options.dsn) {
       this._dsn = makeDsn(options.dsn);
     } else {
-      __DEBUG_BUILD__ && logger.warn('No DSN provided, client will not do anything.');
+      __DEBUG_BUILD__ && logger.warn('No DSN provided, client will not send events.');
     }
 
     if (this._dsn) {
@@ -137,17 +137,6 @@ export abstract class BaseClient implements Client {
         ...options.transportOptions,
         url,
       });
-    } else {
-      // User provided no DSN, we check if the transport provided is a local client and use this instead
-      const transport = options.transport({
-        recordDroppedEvent: this.recordDroppedEvent.bind(this),
-        ...options.transportOptions,
-        url: '',
-      });
-      if (transport.providesUrl) {
-        __DEBUG_BUILD__ && logger.info('Loaded SDK locally');
-        this._transport = transport;
-      }
     }
   }
 
@@ -308,8 +297,8 @@ export abstract class BaseClient implements Client {
   /**
    * Sets up the integrations
    */
-  public setupIntegrations(): void {
-    if (this._isEnabled() && !this._integrationsInitialized) {
+  public setupIntegrations(forceInitialize?: boolean): void {
+    if ((forceInitialize && !this._integrationsInitialized) || (this._isEnabled() && !this._integrationsInitialized)) {
       this._integrations = setupIntegrations(this, this._options.integrations);
       this._integrationsInitialized = true;
     }
@@ -347,25 +336,23 @@ export abstract class BaseClient implements Client {
    * @inheritDoc
    */
   public sendEvent(event: Event, hint: EventHint = {}): void {
-    if (this._isEnabled()) {
-      this.emit('beforeSendEvent', event, hint);
+    this.emit('beforeSendEvent', event, hint);
 
-      let env = createEventEnvelope(event, this._dsn, this._options._metadata, this._options.tunnel);
+    let env = createEventEnvelope(event, this._dsn, this._options._metadata, this._options.tunnel);
 
-      for (const attachment of hint.attachments || []) {
-        env = addItemToEnvelope(
-          env,
-          createAttachmentEnvelopeItem(
-            attachment,
-            this._options.transportOptions && this._options.transportOptions.textEncoder,
-          ),
-        );
-      }
+    for (const attachment of hint.attachments || []) {
+      env = addItemToEnvelope(
+        env,
+        createAttachmentEnvelopeItem(
+          attachment,
+          this._options.transportOptions && this._options.transportOptions.textEncoder,
+        ),
+      );
+    }
 
-      const promise = this._sendEnvelope(env);
-      if (promise) {
-        promise.then(sendResponse => this.emit('afterSendEvent', event, sendResponse), null);
-      }
+    const promise = this._sendEnvelope(env);
+    if (promise) {
+      promise.then(sendResponse => this.emit('afterSendEvent', event, sendResponse), null);
     }
   }
 
@@ -646,10 +633,6 @@ export abstract class BaseClient implements Client {
     const options = this.getOptions();
     const { sampleRate } = options;
 
-    if (!this._isEnabled()) {
-      return rejectedSyncPromise(new SentryError('SDK not enabled, will not capture event.', 'log'));
-    }
-
     const isTransaction = isTransactionEvent(event);
     const isError = isErrorEvent(event);
     const eventType = event.type || 'error';
@@ -749,9 +732,9 @@ export abstract class BaseClient implements Client {
    * @inheritdoc
    */
   protected _sendEnvelope(envelope: Envelope): PromiseLike | void {
-    if (this._transport) {
-      this.emit('beforeEnvelope', envelope);
+    this.emit('beforeEnvelope', envelope);
 
+    if (this._transport) {
       return this._transport.send(envelope).then(null, reason => {
         __DEBUG_BUILD__ && logger.error('Error while sending event:', reason);
       });
diff --git a/packages/types/src/client.ts b/packages/types/src/client.ts
index 1b7b78066f0c..8aeabaa6cc8d 100644
--- a/packages/types/src/client.ts
+++ b/packages/types/src/client.ts
@@ -149,7 +149,7 @@ export interface Client {
   addIntegration?(integration: Integration): void;
 
   /** This is an internal function to setup all integrations that should run on the client */
-  setupIntegrations(): void;
+  setupIntegrations(forceInitialize?: boolean): void;
 
   /** Creates an {@link Event} from all inputs to `captureException` and non-primitive inputs to `captureMessage`. */
   // eslint-disable-next-line @typescript-eslint/no-explicit-any
diff --git a/packages/types/src/transport.ts b/packages/types/src/transport.ts
index 77a987747b02..05638b67228e 100644
--- a/packages/types/src/transport.ts
+++ b/packages/types/src/transport.ts
@@ -29,8 +29,6 @@ export interface BaseTransportOptions extends InternalBaseTransportOptions {
 }
 
 export interface Transport {
-  /** If set to true, the transport provides it's own url */
-  providesUrl?: boolean;
   // TODO (v8) Remove void from return as it was only retained to avoid a breaking change
   send(request: Envelope): PromiseLike;
   flush(timeout?: number): PromiseLike;

From 55d4895d3101ca1702783fbe6fe8617a8fb85140 Mon Sep 17 00:00:00 2001
From: Daniel Griesser 
Date: Tue, 26 Sep 2023 11:37:46 +0200
Subject: [PATCH 6/8] ref: Make enabled consistent

---
 packages/core/src/baseclient.ts | 11 ++---------
 1 file changed, 2 insertions(+), 9 deletions(-)

diff --git a/packages/core/src/baseclient.ts b/packages/core/src/baseclient.ts
index 69314ecb957f..ca389472af39 100644
--- a/packages/core/src/baseclient.ts
+++ b/packages/core/src/baseclient.ts
@@ -216,11 +216,6 @@ export abstract class BaseClient implements Client {
    * @inheritDoc
    */
   public captureSession(session: Session): void {
-    if (!this._isEnabled()) {
-      __DEBUG_BUILD__ && logger.warn('SDK not enabled, will not capture session.');
-      return;
-    }
-
     if (!(typeof session.release === 'string')) {
       __DEBUG_BUILD__ && logger.warn('Discarded session because of missing or non-string release');
     } else {
@@ -360,10 +355,8 @@ export abstract class BaseClient implements Client {
    * @inheritDoc
    */
   public sendSession(session: Session | SessionAggregates): void {
-    if (this._isEnabled()) {
-      const env = createSessionEnvelope(session, this._dsn, this._options._metadata, this._options.tunnel);
-      void this._sendEnvelope(env);
-    }
+    const env = createSessionEnvelope(session, this._dsn, this._options._metadata, this._options.tunnel);
+    void this._sendEnvelope(env);
   }
 
   /**

From c777b6950b3df62c26ef3dbb45a26bca9bad56a2 Mon Sep 17 00:00:00 2001
From: Daniel Griesser 
Date: Tue, 26 Sep 2023 12:42:47 +0200
Subject: [PATCH 7/8] fix: Tests

---
 packages/core/src/baseclient.ts               |  2 +-
 packages/core/test/lib/base.test.ts           | 45 +++----------------
 packages/sveltekit/test/server/handle.test.ts |  2 +-
 3 files changed, 8 insertions(+), 41 deletions(-)

diff --git a/packages/core/src/baseclient.ts b/packages/core/src/baseclient.ts
index ca389472af39..c811c4f827a3 100644
--- a/packages/core/src/baseclient.ts
+++ b/packages/core/src/baseclient.ts
@@ -727,7 +727,7 @@ export abstract class BaseClient implements Client {
   protected _sendEnvelope(envelope: Envelope): PromiseLike | void {
     this.emit('beforeEnvelope', envelope);
 
-    if (this._transport) {
+    if (this._isEnabled() && this._transport) {
       return this._transport.send(envelope).then(null, reason => {
         __DEBUG_BUILD__ && logger.error('Error while sending event:', reason);
       });
diff --git a/packages/core/test/lib/base.test.ts b/packages/core/test/lib/base.test.ts
index dd0906921fa3..27e34a1402d4 100644
--- a/packages/core/test/lib/base.test.ts
+++ b/packages/core/test/lib/base.test.ts
@@ -398,30 +398,6 @@ describe('BaseClient', () => {
   });
 
   describe('captureEvent() / prepareEvent()', () => {
-    test('skips when disabled', () => {
-      expect.assertions(1);
-
-      const options = getDefaultTestClientOptions({ enabled: false, dsn: PUBLIC_DSN });
-      const client = new TestClient(options);
-      const scope = new Scope();
-
-      client.captureEvent({}, undefined, scope);
-
-      expect(TestClient.instance!.event).toBeUndefined();
-    });
-
-    test('skips without a Dsn', () => {
-      expect.assertions(1);
-
-      const options = getDefaultTestClientOptions({});
-      const client = new TestClient(options);
-      const scope = new Scope();
-
-      client.captureEvent({}, undefined, scope);
-
-      expect(TestClient.instance!.event).toBeUndefined();
-    });
-
     test.each([
       ['`Error` instance', new Error('Will I get caught twice?')],
       ['plain object', { 'Will I': 'get caught twice?' }],
@@ -1616,9 +1592,9 @@ describe('BaseClient', () => {
 
     test('close', async () => {
       jest.useRealTimers();
-      expect.assertions(2);
+      expect.assertions(4);
 
-      const { makeTransport, delay } = makeFakeTransport(300);
+      const { makeTransport, delay, getSentCount } = makeFakeTransport(300);
 
       const client = new TestClient(
         getDefaultTestClientOptions({
@@ -1630,9 +1606,12 @@ describe('BaseClient', () => {
       expect(client.captureMessage('test')).toBeTruthy();
 
       await client.close(delay);
+      expect(getSentCount()).toBe(1);
 
+      expect(client.captureMessage('test')).toBeTruthy();
+      await client.close(delay);
       // Sends after close shouldn't work anymore
-      expect(client.captureMessage('test')).toBeFalsy();
+      expect(getSentCount()).toBe(1);
     });
 
     test('multiple concurrent flush calls should just work', async () => {
@@ -1798,18 +1777,6 @@ describe('BaseClient', () => {
 
       expect(TestClient.instance!.session).toEqual(session);
     });
-
-    test('skips when disabled', () => {
-      expect.assertions(1);
-
-      const options = getDefaultTestClientOptions({ enabled: false, dsn: PUBLIC_DSN });
-      const client = new TestClient(options);
-      const session = makeSession({ release: 'test' });
-
-      client.captureSession(session);
-
-      expect(TestClient.instance!.session).toBeUndefined();
-    });
   });
 
   describe('recordDroppedEvent()/_clearOutcomes()', () => {
diff --git a/packages/sveltekit/test/server/handle.test.ts b/packages/sveltekit/test/server/handle.test.ts
index eb0276b7f95d..23528dcf6870 100644
--- a/packages/sveltekit/test/server/handle.test.ts
+++ b/packages/sveltekit/test/server/handle.test.ts
@@ -296,7 +296,7 @@ describe('handleSentry', () => {
       } catch (e) {
         expect(mockCaptureException).toBeCalledTimes(1);
         expect(addEventProcessorSpy).toBeCalledTimes(1);
-        expect(mockAddExceptionMechanism).toBeCalledTimes(1);
+        expect(mockAddExceptionMechanism).toBeCalledTimes(2);
         expect(mockAddExceptionMechanism).toBeCalledWith(
           {},
           { handled: false, type: 'sveltekit', data: { function: 'handle' } },

From 7f83c3572a5859f5ff0709ce126df6eaa83214ef Mon Sep 17 00:00:00 2001
From: Daniel Griesser 
Date: Tue, 26 Sep 2023 15:29:42 +0200
Subject: [PATCH 8/8] ref: Remove try/catch

---
 packages/node/src/integrations/http.ts | 45 ++++++++++++--------------
 packages/node/src/module.ts            |  8 ++---
 2 files changed, 23 insertions(+), 30 deletions(-)

diff --git a/packages/node/src/integrations/http.ts b/packages/node/src/integrations/http.ts
index 8607cc9ff3be..95b68e2c8eb3 100644
--- a/packages/node/src/integrations/http.ts
+++ b/packages/node/src/integrations/http.ts
@@ -115,35 +115,32 @@ export class Http implements Integration {
       this._tracing?.shouldCreateSpanForRequest || clientOptions?.shouldCreateSpanForRequest;
     // eslint-disable-next-line deprecation/deprecation
     const tracePropagationTargets = clientOptions?.tracePropagationTargets || this._tracing?.tracePropagationTargets;
-    try {
+
+    // eslint-disable-next-line @typescript-eslint/no-var-requires
+    const httpModule = require('http');
+    const wrappedHttpHandlerMaker = _createWrappedRequestMethodFactory(
+      httpModule,
+      this._breadcrumbs,
+      shouldCreateSpanForRequest,
+      tracePropagationTargets,
+    );
+    fill(httpModule, 'get', wrappedHttpHandlerMaker);
+    fill(httpModule, 'request', wrappedHttpHandlerMaker);
+
+    // NOTE: Prior to Node 9, `https` used internals of `http` module, thus we don't patch it.
+    // If we do, we'd get double breadcrumbs and double spans for `https` calls.
+    // It has been changed in Node 9, so for all versions equal and above, we patch `https` separately.
+    if (NODE_VERSION.major && NODE_VERSION.major > 8) {
       // eslint-disable-next-line @typescript-eslint/no-var-requires
-      const httpModule = require('http');
-      const wrappedHttpHandlerMaker = _createWrappedRequestMethodFactory(
-        httpModule,
+      const httpsModule = require('https');
+      const wrappedHttpsHandlerMaker = _createWrappedRequestMethodFactory(
+        httpsModule,
         this._breadcrumbs,
         shouldCreateSpanForRequest,
         tracePropagationTargets,
       );
-      fill(httpModule, 'get', wrappedHttpHandlerMaker);
-      fill(httpModule, 'request', wrappedHttpHandlerMaker);
-
-      // NOTE: Prior to Node 9, `https` used internals of `http` module, thus we don't patch it.
-      // If we do, we'd get double breadcrumbs and double spans for `https` calls.
-      // It has been changed in Node 9, so for all versions equal and above, we patch `https` separately.
-      if (NODE_VERSION.major && NODE_VERSION.major > 8) {
-        // eslint-disable-next-line @typescript-eslint/no-var-requires
-        const httpsModule = require('https');
-        const wrappedHttpsHandlerMaker = _createWrappedRequestMethodFactory(
-          httpsModule,
-          this._breadcrumbs,
-          shouldCreateSpanForRequest,
-          tracePropagationTargets,
-        );
-        fill(httpsModule, 'get', wrappedHttpsHandlerMaker);
-        fill(httpsModule, 'request', wrappedHttpsHandlerMaker);
-      }
-    } catch (e) {
-      // TODO: require is not defined
+      fill(httpsModule, 'get', wrappedHttpsHandlerMaker);
+      fill(httpsModule, 'request', wrappedHttpsHandlerMaker);
     }
   }
 }
diff --git a/packages/node/src/module.ts b/packages/node/src/module.ts
index adf297731bb5..44bff87a02d2 100644
--- a/packages/node/src/module.ts
+++ b/packages/node/src/module.ts
@@ -22,12 +22,8 @@ export function getModuleFromFilename(
 
   // eslint-disable-next-line prefer-const
   let { root, dir, base: basename, ext } = posix.parse(normalizedFilename);
-  let base = '';
-  try {
-    base = (require && require.main && require.main.filename && dir) || global.process.cwd();
-  } catch (e) {
-    // TODO: require is not defined
-  }
+
+  const base = (require && require.main && require.main.filename && dir) || global.process.cwd();
 
   const normalizedBase = `${base}/`;