Skip to content

Commit 7fbca88

Browse files
committed
Export setupOpenTelemetryLoggerfrom node-core and use in node
1 parent f8cab90 commit 7fbca88

File tree

5 files changed

+50
-41
lines changed

5 files changed

+50
-41
lines changed

packages/node-core/README.md

Lines changed: 26 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -36,7 +36,9 @@ yarn add @sentry/node-core @sentry/opentelemetry @opentelemetry/api @opentelemet
3636

3737
Sentry should be initialized as early in your app as possible. It is essential that you call `Sentry.init` before you
3838
require any other modules in your application, otherwise any auto-instrumentation will **not** work.
39-
You also need to set up OpenTelemetry, if you prefer not to, consider using the `@sentry/node` SDK instead.
39+
40+
You also **have to** set up OpenTelemetry, if you prefer not to, consider using the `@sentry/node` SDK instead.
41+
Without setting up OpenTelemetry, you only get basic error tracking out of the box without proper scope isolation.
4042

4143
You need to create a file named `instrument.js` that imports and initializes Sentry:
4244

@@ -57,23 +59,29 @@ const sentryClient = Sentry.init({
5759
// ...
5860
});
5961

60-
// Note: This could be BasicTracerProvider or any other provider depending on how you want to use the
61-
// OpenTelemetry SDK
62-
const provider = new NodeTracerProvider({
63-
// Ensure the correct subset of traces is sent to Sentry
64-
// This also ensures trace propagation works as expected
65-
sampler: sentryClient ? new SentrySampler(sentryClient) : undefined,
66-
spanProcessors: [
67-
// Ensure spans are correctly linked & sent to Sentry
68-
new SentrySpanProcessor(),
69-
// Add additional processors here
70-
],
71-
});
72-
73-
trace.setGlobalTracerProvider(provider);
74-
propagation.setGlobalPropagator(new SentryPropagator());
75-
context.setGlobalContextManager(new Sentry.SentryContextManager());
76-
62+
if (sentryClient) {
63+
// Note: This could be BasicTracerProvider or any other provider depending on how you want to use the
64+
// OpenTelemetry SDK
65+
const provider = new NodeTracerProvider({
66+
// Ensure the correct subset of traces is sent to Sentry
67+
// This also ensures trace propagation works as expected
68+
sampler: new SentrySampler(sentryClient),
69+
spanProcessors: [
70+
// Ensure spans are correctly linked & sent to Sentry
71+
new SentrySpanProcessor(),
72+
// Add additional processors here
73+
],
74+
});
75+
76+
trace.setGlobalTracerProvider(provider);
77+
propagation.setGlobalPropagator(new SentryPropagator());
78+
context.setGlobalContextManager(new Sentry.SentryContextManager());
79+
}
80+
81+
// Set up the OpenTelemetry logger to use Sentry's logger
82+
Sentry.setupOpenTelemetryLogger();
83+
84+
// validate your setup
7785
Sentry.validateOpenTelemetrySetup();
7886
```
7987

packages/node-core/src/index.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,7 @@ export { childProcessIntegration } from './integrations/childProcess';
2424
export { createSentryWinstonTransport } from './integrations/winston';
2525

2626
export { SentryContextManager } from './otel/contextManager';
27+
export { setupOpenTelemetryLogger } from './otel/logger';
2728
export { generateInstrumentOnce, instrumentWhenWrapped, INSTRUMENTED } from './otel/instrument';
2829

2930
export { init, getDefaultIntegrations, initWithoutDefaultIntegrations, validateOpenTelemetrySetup } from './sdk';

packages/node-core/src/otel/logger.ts

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,18 @@
1+
import { diag, DiagLogLevel } from '@opentelemetry/api';
2+
import { logger } from '@sentry/core';
3+
4+
/**
5+
* Setup the OTEL logger to use our own logger.
6+
*/
7+
export function setupOpenTelemetryLogger(): void {
8+
const otelLogger = new Proxy(logger as typeof logger & { verbose: (typeof logger)['debug'] }, {
9+
get(target, prop, receiver) {
10+
const actualProp = prop === 'verbose' ? 'debug' : prop;
11+
return Reflect.get(target, actualProp, receiver);
12+
},
13+
});
14+
15+
// Disable diag, to ensure this works even if called multiple times
16+
diag.disable();
17+
diag.setLogger(otelLogger, DiagLogLevel.DEBUG);
18+
}

packages/node-core/src/sdk/index.ts

Lines changed: 0 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,3 @@
1-
import { diag, DiagLogLevel } from '@opentelemetry/api';
21
import type { Integration, Options } from '@sentry/core';
32
import {
43
consoleIntegration,
@@ -133,10 +132,6 @@ function _init(
133132

134133
updateScopeFromEnvVariables();
135134

136-
if (options.debug) {
137-
setupOpenTelemetryLogger();
138-
}
139-
140135
enhanceDscWithOpenTelemetryRootSpanName(client);
141136
setupEventContextTrace(client);
142137

@@ -249,19 +244,3 @@ function updateScopeFromEnvVariables(): void {
249244
getCurrentScope().setPropagationContext(propagationContext);
250245
}
251246
}
252-
253-
/**
254-
* Setup the OTEL logger to use our own logger.
255-
*/
256-
function setupOpenTelemetryLogger(): void {
257-
const otelLogger = new Proxy(logger as typeof logger & { verbose: (typeof logger)['debug'] }, {
258-
get(target, prop, receiver) {
259-
const actualProp = prop === 'verbose' ? 'debug' : prop;
260-
return Reflect.get(target, actualProp, receiver);
261-
},
262-
});
263-
264-
// Disable diag, to ensure this works even if called multiple times
265-
diag.disable();
266-
diag.setLogger(otelLogger, DiagLogLevel.DEBUG);
267-
}

packages/node/src/sdk/initOtel.ts

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -8,8 +8,7 @@ import {
88
SEMRESATTRS_SERVICE_NAMESPACE,
99
} from '@opentelemetry/semantic-conventions';
1010
import { consoleSandbox, GLOBAL_OBJ, logger, SDK_VERSION } from '@sentry/core';
11-
import type { NodeClient } from '@sentry/node-core';
12-
import { isCjs, SentryContextManager } from '@sentry/node-core';
11+
import { type NodeClient, isCjs, SentryContextManager, setupOpenTelemetryLogger } from '@sentry/node-core';
1312
import { SentryPropagator, SentrySampler, SentrySpanProcessor } from '@sentry/opentelemetry';
1413
import { createAddHookMessageChannel } from 'import-in-the-middle';
1514
import moduleModule from 'module';
@@ -28,6 +27,10 @@ interface AdditionalOpenTelemetryOptions {
2827
* Initialize OpenTelemetry for Node.
2928
*/
3029
export function initOpenTelemetry(client: NodeClient, options: AdditionalOpenTelemetryOptions = {}): void {
30+
if (client.getOptions().debug) {
31+
setupOpenTelemetryLogger();
32+
}
33+
3134
const provider = setupOtel(client, options);
3235
client.traceProvider = provider;
3336
}

0 commit comments

Comments
 (0)