From 0f10470c6ca71212b750f5b41b2ed3207dc9abc7 Mon Sep 17 00:00:00 2001
From: Francesco Novy <francesco.novy@sentry.io>
Date: Fri, 24 May 2024 15:12:46 +0200
Subject: [PATCH 1/2] feat(node): Ensure manual OTEL setup works

---
 packages/node/src/index.ts        |  2 ++
 packages/node/src/sdk/init.ts     | 14 +++++++++++---
 packages/node/src/sdk/initOtel.ts |  4 +---
 3 files changed, 14 insertions(+), 6 deletions(-)

diff --git a/packages/node/src/index.ts b/packages/node/src/index.ts
index 5cc16772189b..590ad7e82923 100644
--- a/packages/node/src/index.ts
+++ b/packages/node/src/index.ts
@@ -26,11 +26,13 @@ export { koaIntegration, setupKoaErrorHandler } from './integrations/tracing/koa
 export { connectIntegration, setupConnectErrorHandler } from './integrations/tracing/connect';
 export { spotlightIntegration } from './integrations/spotlight';
 
+export { SentryContextManager } from './otel/contextManager';
 export {
   init,
   getDefaultIntegrations,
   getDefaultIntegrationsWithoutPerformance,
   initWithoutDefaultIntegrations,
+  validateOpenTelemetrySetup,
 } from './sdk/init';
 export { initOpenTelemetry } from './sdk/initOtel';
 export { getAutoPerformanceIntegrations } from './integrations/tracing';
diff --git a/packages/node/src/sdk/init.ts b/packages/node/src/sdk/init.ts
index 82cd26492960..83533842e76c 100644
--- a/packages/node/src/sdk/init.ts
+++ b/packages/node/src/sdk/init.ts
@@ -11,7 +11,11 @@ import {
   requestDataIntegration,
   startSession,
 } from '@sentry/core';
-import { openTelemetrySetupCheck, setOpenTelemetryContextAsyncContextStrategy } from '@sentry/opentelemetry';
+import {
+  openTelemetrySetupCheck,
+  setOpenTelemetryContextAsyncContextStrategy,
+  setupEventContextTrace,
+} from '@sentry/opentelemetry';
 import type { Client, Integration, Options } from '@sentry/types';
 import {
   GLOBAL_OBJ,
@@ -196,12 +200,16 @@ function _init(
   // There is no way to use this SDK without OpenTelemetry!
   if (!options.skipOpenTelemetrySetup) {
     initOpenTelemetry(client);
+    validateOpenTelemetrySetup();
   }
 
-  validateOpenTelemetrySetup();
+  setupEventContextTrace(client);
 }
 
-function validateOpenTelemetrySetup(): void {
+/**
+ * Validate that your OpenTelemetry setup is correct.
+ */
+export function validateOpenTelemetrySetup(): void {
   if (!DEBUG_BUILD) {
     return;
   }
diff --git a/packages/node/src/sdk/initOtel.ts b/packages/node/src/sdk/initOtel.ts
index f27635610c9c..2556b86162b5 100644
--- a/packages/node/src/sdk/initOtel.ts
+++ b/packages/node/src/sdk/initOtel.ts
@@ -7,7 +7,7 @@ import {
   SEMRESATTRS_SERVICE_VERSION,
 } from '@opentelemetry/semantic-conventions';
 import { SDK_VERSION } from '@sentry/core';
-import { SentryPropagator, SentrySampler, SentrySpanProcessor, setupEventContextTrace } from '@sentry/opentelemetry';
+import { SentryPropagator, SentrySampler, SentrySpanProcessor } from '@sentry/opentelemetry';
 import { logger } from '@sentry/utils';
 
 import { SentryContextManager } from '../otel/contextManager';
@@ -28,8 +28,6 @@ export function initOpenTelemetry(client: NodeClient): void {
     diag.setLogger(otelLogger, DiagLogLevel.DEBUG);
   }
 
-  setupEventContextTrace(client);
-
   const provider = setupOtel(client);
   client.traceProvider = provider;
 }

From b62f021e7c182f4d0c4996f0a35c9ef364a20169 Mon Sep 17 00:00:00 2001
From: Francesco Novy <francesco.novy@sentry.io>
Date: Mon, 27 May 2024 09:09:09 +0200
Subject: [PATCH 2/2] ignore some exports

---
 .../node-exports-test-app/scripts/consistentExports.ts          | 2 ++
 1 file changed, 2 insertions(+)

diff --git a/dev-packages/e2e-tests/test-applications/node-exports-test-app/scripts/consistentExports.ts b/dev-packages/e2e-tests/test-applications/node-exports-test-app/scripts/consistentExports.ts
index a3e9ac0852aa..138ea18b5e3d 100644
--- a/dev-packages/e2e-tests/test-applications/node-exports-test-app/scripts/consistentExports.ts
+++ b/dev-packages/e2e-tests/test-applications/node-exports-test-app/scripts/consistentExports.ts
@@ -18,6 +18,8 @@ const NODE_EXPORTS_IGNORE = [
   'setNodeAsyncContextStrategy',
   'getDefaultIntegrationsWithoutPerformance',
   'initWithoutDefaultIntegrations',
+  'SentryContextManager',
+  'validateOpenTelemetrySetup',
 ];
 
 const nodeExports = Object.keys(SentryNode).filter(e => !NODE_EXPORTS_IGNORE.includes(e));