Skip to content

Commit a2ebf6a

Browse files
authored
style + fix: move all consts to one file + disable console instrumentation in debug mode (#105)
1 parent 6699ab3 commit a2ebf6a

File tree

8 files changed

+130
-68
lines changed

8 files changed

+130
-68
lines changed
Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
---
2+
'@hyperdx/node-opentelemetry': patch
3+
---
4+
5+
fix: disable console instrumentation if otel debug mode is on

.changeset/many-trees-jump.md

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
---
2+
'@hyperdx/node-opentelemetry': patch
3+
---
4+
5+
style: move all constants to one file

packages/node-opentelemetry/examples/dummy.js

Lines changed: 8 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,6 @@ const winston = require('winston');
88
const {
99
getPinoTransport,
1010
getWinstonTransport,
11-
init,
1211
} = require('../build/src/logger');
1312
const { setTraceAttributes } = require('../build/src');
1413
// const { shutdown } = require('@hyperdx/node-opentelemetry');
@@ -31,7 +30,14 @@ const logger = winston.createLogger({
3130
],
3231
});
3332

34-
const pinoLogger = pino();
33+
const pinoLogger = pino(
34+
pino.transport({
35+
targets: [
36+
getPinoTransport('info'),
37+
// other transports
38+
],
39+
}),
40+
);
3541

3642
async function sendGetRequest() {
3743
const postData = JSON.stringify({
Lines changed: 37 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,37 @@
1+
import { DiagLogLevel } from '@opentelemetry/api';
2+
import { defaultServiceName } from '@opentelemetry/resources';
3+
import { getEnvWithoutDefaults } from '@opentelemetry/core';
4+
5+
import { HDX_DEBUG_MODE_ENABLED } from './debug';
6+
7+
// enable otel debug mode if HDX_DEBUG_MODE_ENABLED is set
8+
const otelEnv = getEnvWithoutDefaults();
9+
10+
// TO EXTRACT ENV VARS [https://github.com/open-telemetry/opentelemetry-js/blob/3ab4f765d8d696327b7d139ae6a45e7bd7edd924/experimental/packages/sdk-logs/src/export/BatchLogRecordProcessorBase.ts#L50]
11+
// TO EXTRACT DEFAULTS [https://github.com/open-telemetry/opentelemetry-js/blob/3ab4f765d8d696327b7d139ae6a45e7bd7edd924/experimental/packages/sdk-logs/src/types.ts#L49]
12+
export const DEFAULT_EXPORTER_BATCH_SIZE =
13+
otelEnv.OTEL_BLRP_MAX_EXPORT_BATCH_SIZE ?? 512;
14+
export const DEFAULT_EXPORTER_TIMEOUT_MS =
15+
otelEnv.OTEL_BLRP_EXPORT_TIMEOUT ?? 30000;
16+
export const DEFAULT_MAX_QUEUE_SIZE = otelEnv.OTEL_BLRP_MAX_QUEUE_SIZE ?? 2048;
17+
export const DEFAULT_OTEL_TRACES_EXPORTER_URL =
18+
otelEnv.OTEL_EXPORTER_OTLP_TRACES_ENDPOINT ??
19+
(otelEnv.OTEL_EXPORTER_OTLP_ENDPOINT
20+
? `${otelEnv.OTEL_EXPORTER_OTLP_ENDPOINT}/v1/traces`
21+
: 'https://in-otel.hyperdx.io/v1/traces');
22+
export const DEFAULT_OTEL_LOGS_EXPORTER_URL =
23+
otelEnv.OTEL_EXPORTER_OTLP_LOGS_ENDPOINT ??
24+
(otelEnv.OTEL_EXPORTER_OTLP_ENDPOINT
25+
? `${otelEnv.OTEL_EXPORTER_OTLP_ENDPOINT}/v1/logs`
26+
: 'https://in-otel.hyperdx.io/v1/logs');
27+
export const DEFAULT_SEND_INTERVAL_MS =
28+
otelEnv.OTEL_BLRP_SCHEDULE_DELAY ?? 2000;
29+
export const DEFAULT_SERVICE_NAME =
30+
otelEnv.OTEL_SERVICE_NAME ?? defaultServiceName();
31+
export const DEFAULT_OTEL_TRACES_SAMPLER =
32+
otelEnv.OTEL_TRACES_SAMPLER ?? 'parentbased_always_on';
33+
export const DEFAULT_OTEL_TRACES_SAMPLER_ARG =
34+
otelEnv.OTEL_TRACES_SAMPLER_ARG ?? '1';
35+
export const DEFAULT_OTEL_EXPORTER_OTLP_TRACES_TIMEOUT =
36+
otelEnv.OTEL_EXPORTER_OTLP_TRACES_TIMEOUT ?? 60000;
37+
export const DEFAULT_OTEL_LOG_LEVEL = otelEnv.OTEL_LOG_LEVEL;

packages/node-opentelemetry/src/instrumentations/console.ts

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2,11 +2,11 @@ import * as shimmer from 'shimmer';
22
import isObject from 'lodash.isobject';
33
import isPlainObject from 'lodash.isplainobject';
44
import opentelemetry, { Attributes } from '@opentelemetry/api';
5-
import { Logger, LoggerOptions } from '../otel-logger';
6-
import { parseWinstonLog } from '../otel-logger/winston';
75

86
import hdx from '../debug';
7+
import { Logger, LoggerOptions } from '../otel-logger';
98
import { hyperDXGlobalContext } from '../context';
9+
import { parseWinstonLog } from '../otel-logger/winston';
1010

1111
export const _parseConsoleArgs = (args: any[]) => {
1212
const stringifiedArgs = [];

packages/node-opentelemetry/src/logger.ts

Lines changed: 13 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@ import HyperDXWinston from './otel-logger/winston';
55
import type { HyperDXPinoOptions } from './otel-logger/pino';
66
import type { HyperDXWinstonOptions } from './otel-logger/winston';
77

8+
import { DEFAULT_SERVICE_NAME } from './constants';
89
import hdx from './debug';
910
import { hyperDXGlobalContext } from './context';
1011
import { stringToBoolean } from './utils';
@@ -13,8 +14,6 @@ const env = process.env;
1314

1415
const HYPERDX_API_KEY = env.HYPERDX_API_KEY;
1516

16-
const SERVICE_NAME = env.OTEL_SERVICE_NAME as string;
17-
1817
const BETA_MODE = stringToBoolean(env.HDX_NODE_BETA_MODE);
1918

2019
type WinstonTransportOptions = Omit<
@@ -39,9 +38,13 @@ export const getWinstonTransport = (
3938
) => {
4039
hdx('Initializing winston transport');
4140
return new HyperDXWinston({
42-
...(HYPERDX_API_KEY && { apiKey: HYPERDX_API_KEY }),
41+
...(HYPERDX_API_KEY && {
42+
headers: {
43+
Authorization: HYPERDX_API_KEY,
44+
},
45+
}),
4346
maxLevel,
44-
service: SERVICE_NAME,
47+
service: DEFAULT_SERVICE_NAME,
4548
getCustomMeta: BETA_MODE ? getCustomMeta : () => ({}),
4649
...options,
4750
});
@@ -56,8 +59,12 @@ export const getPinoTransport = (
5659
) => ({
5760
target: '@hyperdx/node-opentelemetry/build/src/otel-logger/pino',
5861
options: {
59-
...(HYPERDX_API_KEY && { apiKey: HYPERDX_API_KEY }),
60-
service: SERVICE_NAME,
62+
...(HYPERDX_API_KEY && {
63+
headers: {
64+
Authorization: HYPERDX_API_KEY,
65+
},
66+
}),
67+
service: DEFAULT_SERVICE_NAME,
6168
// getCustomMeta, // FIXME: DOMException [DataCloneError]
6269
...options,
6370
},

packages/node-opentelemetry/src/otel-logger/index.ts

Lines changed: 10 additions & 28 deletions
Original file line numberDiff line numberDiff line change
@@ -1,16 +1,13 @@
11
import stringifySafe from 'json-stringify-safe';
2-
import { Attributes, diag, DiagConsoleLogger } from '@opentelemetry/api';
3-
import { getEnvWithoutDefaults } from '@opentelemetry/core';
2+
import { Attributes } from '@opentelemetry/api';
43
import {
54
BatchLogRecordProcessor,
6-
BufferConfig,
75
LoggerProvider,
86
} from '@opentelemetry/sdk-logs';
7+
import { Logger as OtelLogger } from '@opentelemetry/api-logs';
98
import { OTLPLogExporter } from '@opentelemetry/exporter-logs-otlp-http';
10-
import { Logger as OtelLogger, SeverityNumber } from '@opentelemetry/api-logs';
119
import {
1210
Resource,
13-
defaultServiceName,
1411
detectResourcesSync,
1512
envDetectorSync,
1613
hostDetectorSync,
@@ -19,32 +16,17 @@ import {
1916
} from '@opentelemetry/resources';
2017
import { SEMRESATTRS_SERVICE_NAME } from '@opentelemetry/semantic-conventions';
2118

19+
import {
20+
DEFAULT_EXPORTER_BATCH_SIZE,
21+
DEFAULT_EXPORTER_TIMEOUT_MS,
22+
DEFAULT_MAX_QUEUE_SIZE,
23+
DEFAULT_OTEL_LOGS_EXPORTER_URL,
24+
DEFAULT_SEND_INTERVAL_MS,
25+
DEFAULT_SERVICE_NAME,
26+
} from '../constants';
2227
import hdx, { LOG_PREFIX as _LOG_PREFIX } from '../debug';
2328
import { version as PKG_VERSION } from '../../package.json';
2429

25-
const otelEnv = getEnvWithoutDefaults();
26-
27-
// DEBUG otel modules
28-
if (otelEnv.OTEL_LOG_LEVEL) {
29-
diag.setLogger(new DiagConsoleLogger(), {
30-
logLevel: otelEnv.OTEL_LOG_LEVEL,
31-
});
32-
}
33-
34-
// TO EXTRACT ENV VARS [https://github.com/open-telemetry/opentelemetry-js/blob/3ab4f765d8d696327b7d139ae6a45e7bd7edd924/experimental/packages/sdk-logs/src/export/BatchLogRecordProcessorBase.ts#L50]
35-
// TO EXTRACT DEFAULTS [https://github.com/open-telemetry/opentelemetry-js/blob/3ab4f765d8d696327b7d139ae6a45e7bd7edd924/experimental/packages/sdk-logs/src/types.ts#L49]
36-
const DEFAULT_EXPORTER_BATCH_SIZE =
37-
otelEnv.OTEL_BLRP_MAX_EXPORT_BATCH_SIZE ?? 512;
38-
const DEFAULT_EXPORTER_TIMEOUT_MS = otelEnv.OTEL_BLRP_EXPORT_TIMEOUT ?? 30000;
39-
const DEFAULT_MAX_QUEUE_SIZE = otelEnv.OTEL_BLRP_MAX_QUEUE_SIZE ?? 2048;
40-
const DEFAULT_OTEL_LOGS_EXPORTER_URL =
41-
otelEnv.OTEL_EXPORTER_OTLP_LOGS_ENDPOINT ??
42-
(otelEnv.OTEL_EXPORTER_OTLP_ENDPOINT
43-
? `${otelEnv.OTEL_EXPORTER_OTLP_ENDPOINT}/v1/logs`
44-
: 'https://in-otel.hyperdx.io/v1/logs');
45-
const DEFAULT_SEND_INTERVAL_MS = otelEnv.OTEL_BLRP_SCHEDULE_DELAY ?? 2000;
46-
const DEFAULT_SERVICE_NAME = otelEnv.OTEL_SERVICE_NAME ?? defaultServiceName();
47-
4830
const LOG_PREFIX = `⚠️ ${_LOG_PREFIX}`;
4931

5032
export const jsonToString = (json) => {

packages/node-opentelemetry/src/otel.ts

Lines changed: 50 additions & 30 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,4 @@
1+
import { DiagLogLevel } from '@opentelemetry/api';
12
import { InstrumentationBase } from '@opentelemetry/instrumentation';
23
import { NodeSDK } from '@opentelemetry/sdk-node';
34
import { OTLPTraceExporter } from '@opentelemetry/exporter-trace-otlp-proto';
@@ -9,11 +10,17 @@ import {
910

1011
import HyperDXConsoleInstrumentation from './instrumentations/console';
1112
import HyperDXSpanProcessor from './spanProcessor';
12-
import hdx, {
13-
HDX_DEBUG_MODE_ENABLED,
14-
LOG_PREFIX as _LOG_PREFIX,
15-
} from './debug';
13+
import hdx, { LOG_PREFIX as _LOG_PREFIX } from './debug';
1614
import { getHyperDXHTTPInstrumentationConfig } from './instrumentations/http';
15+
import {
16+
DEFAULT_OTEL_EXPORTER_OTLP_TRACES_TIMEOUT,
17+
DEFAULT_OTEL_LOGS_EXPORTER_URL,
18+
DEFAULT_OTEL_TRACES_EXPORTER_URL,
19+
DEFAULT_OTEL_TRACES_SAMPLER,
20+
DEFAULT_OTEL_TRACES_SAMPLER_ARG,
21+
DEFAULT_SERVICE_NAME,
22+
DEFAULT_OTEL_LOG_LEVEL,
23+
} from './constants';
1724
import { hyperDXGlobalContext } from './context';
1825
import { version as PKG_VERSION } from '../package.json';
1926

@@ -32,37 +39,46 @@ export type SDKConfig = {
3239

3340
export const setTraceAttributes = hyperDXGlobalContext.setTraceAttributes;
3441

42+
const setOtelEnvs = () => {
43+
// set default otel env vars
44+
env.OTEL_NODE_RESOURCE_DETECTORS = env.OTEL_NODE_RESOURCE_DETECTORS ?? 'all';
45+
env.OTEL_TRACES_SAMPLER = DEFAULT_OTEL_TRACES_SAMPLER;
46+
env.OTEL_TRACES_SAMPLER_ARG = DEFAULT_OTEL_TRACES_SAMPLER_ARG;
47+
};
48+
3549
let sdk: NodeSDK;
3650
let hdxConsoleInstrumentation: HyperDXConsoleInstrumentation;
3751

3852
export const initSDK = (config: SDKConfig) => {
39-
// enable otel debug mode if HDX_DEBUG_MODE_ENABLED is set
40-
if (HDX_DEBUG_MODE_ENABLED) {
41-
env.OTEL_LOG_LEVEL = 'debug';
42-
}
53+
hdx('Setting otel envs');
54+
setOtelEnvs();
4355

44-
// set default otel env vars
45-
env.OTEL_EXPORTER_OTLP_ENDPOINT =
46-
env.OTEL_EXPORTER_OTLP_ENDPOINT ?? 'https://in-otel.hyperdx.io';
47-
env.OTEL_NODE_RESOURCE_DETECTORS = env.OTEL_NODE_RESOURCE_DETECTORS ?? 'all';
48-
env.OTEL_LOG_LEVEL = env.OTEL_LOG_LEVEL ?? 'none'; // silence by default
49-
env.OTEL_TRACES_SAMPLER = env.OTEL_TRACES_SAMPLER ?? 'parentbased_always_on';
50-
env.OTEL_TRACES_SAMPLER_ARG = env.OTEL_TRACES_SAMPLER_ARG ?? '1';
56+
const stopOnTerminationSignals = config.stopOnTerminationSignals ?? true; // Stop by default
5157

52-
// patch OTEL_EXPORTER_OTLP_HEADERS to include API key
58+
let exporterHeaders;
5359
if (env.HYPERDX_API_KEY) {
54-
env.OTEL_EXPORTER_OTLP_HEADERS = `${env.OTEL_EXPORTER_OTLP_HEADERS},authorization=${env.HYPERDX_API_KEY}`;
60+
exporterHeaders = {
61+
Authorization: env.HYPERDX_API_KEY,
62+
};
5563
} else {
5664
console.warn(`${LOG_PREFIX} HYPERDX_API_KEY is not set`);
5765
}
5866

59-
const stopOnTerminationSignals = config.stopOnTerminationSignals ?? true; // Stop by default
60-
6167
hdx('Initializing OpenTelemetry SDK');
62-
const consoleInstrumentationEnabled = config.consoleCapture ?? true;
68+
let consoleInstrumentationEnabled = config.consoleCapture ?? true;
69+
if (DEFAULT_OTEL_LOG_LEVEL === DiagLogLevel.DEBUG) {
70+
// FIXME: better to disable console instrumentation if otel log is enabled
71+
consoleInstrumentationEnabled = false;
72+
console.warn(
73+
`${LOG_PREFIX} OTEL_LOG_LEVEL is set to 'debug', disabling console instrumentation`,
74+
);
75+
}
76+
6377
hdxConsoleInstrumentation = new HyperDXConsoleInstrumentation({
78+
baseUrl: DEFAULT_OTEL_LOGS_EXPORTER_URL,
6479
betaMode: config.betaMode,
65-
service: env.OTEL_SERVICE_NAME,
80+
service: DEFAULT_SERVICE_NAME,
81+
headers: exporterHeaders,
6682
});
6783

6884
sdk = new NodeSDK({
@@ -76,13 +92,17 @@ export const initSDK = (config: SDKConfig) => {
7692
? {
7793
spanProcessor: new HyperDXSpanProcessor(
7894
new OTLPTraceExporter({
79-
timeoutMillis: 60000,
95+
timeoutMillis: DEFAULT_OTEL_EXPORTER_OTLP_TRACES_TIMEOUT,
96+
url: DEFAULT_OTEL_TRACES_EXPORTER_URL,
97+
headers: exporterHeaders,
8098
}),
8199
) as any,
82100
}
83101
: {
84102
traceExporter: new OTLPTraceExporter({
85-
timeoutMillis: 60000,
103+
timeoutMillis: DEFAULT_OTEL_EXPORTER_OTLP_TRACES_TIMEOUT,
104+
url: DEFAULT_OTEL_TRACES_EXPORTER_URL,
105+
headers: exporterHeaders,
86106
}),
87107
}),
88108
instrumentations: [
@@ -109,21 +129,21 @@ export const initSDK = (config: SDKConfig) => {
109129
],
110130
});
111131

112-
if (env.OTEL_EXPORTER_OTLP_ENDPOINT && env.OTEL_EXPORTER_OTLP_HEADERS) {
132+
if (env.OTEL_EXPORTER_OTLP_HEADERS || env.HYPERDX_API_KEY) {
113133
console.warn(
114134
`${LOG_PREFIX} Tracing is enabled with configs (${JSON.stringify(
115135
{
116136
advancedNetworkCapture: config.advancedNetworkCapture,
117137
betaMode: config.betaMode,
118138
consoleCapture: consoleInstrumentationEnabled,
119-
endpoint: env.OTEL_EXPORTER_OTLP_ENDPOINT,
120-
logLevel: env.OTEL_LOG_LEVEL,
139+
endpoint: DEFAULT_OTEL_TRACES_EXPORTER_URL,
140+
logLevel: DEFAULT_OTEL_LOG_LEVEL,
121141
propagators: env.OTEL_PROPAGATORS,
122142
resourceAttributes: env.OTEL_RESOURCE_ATTRIBUTES,
123143
resourceDetectors: env.OTEL_NODE_RESOURCE_DETECTORS,
124-
sampler: env.OTEL_TRACES_SAMPLER,
125-
samplerArg: env.OTEL_TRACES_SAMPLER_ARG,
126-
serviceName: env.OTEL_SERVICE_NAME,
144+
sampler: DEFAULT_OTEL_TRACES_SAMPLER,
145+
samplerArg: DEFAULT_OTEL_TRACES_SAMPLER_ARG,
146+
serviceName: DEFAULT_SERVICE_NAME,
127147
stopOnTerminationSignals,
128148
},
129149
null,
@@ -144,7 +164,7 @@ export const initSDK = (config: SDKConfig) => {
144164
}
145165
} else {
146166
console.warn(
147-
`${LOG_PREFIX} OTEL_EXPORTER_OTLP_ENDPOINT and OTEL_EXPORTER_OTLP_HEADERS are not set, tracing is disabled`,
167+
`${LOG_PREFIX} HYPERDX_API_KEY or OTEL_EXPORTER_OTLP_HEADERS is not set, tracing is disabled`,
148168
);
149169
}
150170

0 commit comments

Comments
 (0)