Skip to content
Merged
Show file tree
Hide file tree
Changes from 7 commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
11 changes: 11 additions & 0 deletions .changeset/upgrade-otel-v2.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,11 @@
---
"@hyperdx/node-opentelemetry": minor
"@hyperdx/node-logger": minor
"@hyperdx/otel-web": minor
"@hyperdx/otel-web-session-recorder": minor
"@hyperdx/browser": minor
"@hyperdx/instrumentation-exception": minor
"@hyperdx/instrumentation-sentry-node": minor
---

Upgrade all OpenTelemetry dependencies to latest versions (core/resources/sdk-trace-base/sdk-metrics to ^2.7.1, semantic-conventions to ^1.41.1, api to ^1.9.1). Migrates to v2 APIs: `resourceFromAttributes()` replaces `new Resource()`, updated semantic convention constants, updated resource detectors, and span processors passed via constructor options.
12 changes: 7 additions & 5 deletions packages/browser/rollup.config.ts
Original file line number Diff line number Diff line change
@@ -1,9 +1,9 @@
import commonjs from '@rollup/plugin-commonjs';
import json from '@rollup/plugin-json';
import replace from 'rollup-plugin-re';
import resolve from '@rollup/plugin-node-resolve';
import terser from '@rollup/plugin-terser';
import typescript from '@rollup/plugin-typescript';
import replace from 'rollup-plugin-re';
import { visualizer } from 'rollup-plugin-visualizer';

export default {
Expand Down Expand Up @@ -32,11 +32,13 @@ export default {
resolve({
mainFields: ['module', 'browser', 'main'],
dedupe: [
'@opentelemetry/semantic-conventions',
'@opentelemetry/sdk-trace-web',
'@opentelemetry/instrumentation',
'@opentelemetry/core',
'@opentelemetry/api',
'@opentelemetry/core',
'@opentelemetry/instrumentation',
'@opentelemetry/sdk-trace-base',
'@opentelemetry/sdk-trace-web',
'@opentelemetry/semantic-conventions',
'@opentelemetry/resources',
],
}),
terser({
Expand Down
3 changes: 1 addition & 2 deletions packages/browser/src/index.ts
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,6 @@ import SessionRecorder, {
RumRecorderConfig,
} from '@hyperdx/otel-web-session-recorder';
import opentelemetry, { Attributes } from '@opentelemetry/api';
import { ResourceAttributes } from '@opentelemetry/resources';

import { resolveAsyncGlobal } from './utils';

Expand Down Expand Up @@ -35,7 +34,7 @@ type BrowserSDKConfig = {
url?: string;
tracesUrl?: string;
logsUrl?: string;
otelResourceAttributes?: ResourceAttributes;
otelResourceAttributes?: Attributes;
};

const URL_BASE = 'https://in-otel.hyperdx.io';
Expand Down
10 changes: 5 additions & 5 deletions packages/instrumentation-exception/package.json
Original file line number Diff line number Diff line change
Expand Up @@ -33,9 +33,9 @@
},
"dependencies": {
"@hyperdx/instrumentation-sentry-node": "^0.1.0",
"@opentelemetry/core": "^1.24.1",
"@opentelemetry/instrumentation": "^0.51.1",
"@opentelemetry/semantic-conventions": "^1.24.1",
"@opentelemetry/core": "^2.7.1",
"@opentelemetry/instrumentation": "^0.218.0",
"@opentelemetry/semantic-conventions": "^1.41.1",
"@sentry/core": "^8.7.0",
"@sentry/types": "^8.7.0",
"@sentry/utils": "^8.7.0",
Expand All @@ -44,13 +44,13 @@
"tslib": "^2.5.3"
},
"devDependencies": {
"@opentelemetry/api": "^1.8.0",
"@opentelemetry/api": "^1.9.1",
"@types/jest": "^29.5.12",
"jest": "^29.7.0",
"ts-jest": "^29.1.4"
},
"peerDependencies": {
"@opentelemetry/api": "^1.3.0"
"@opentelemetry/api": "^1.9.1"
},
"keywords": [
"exception",
Expand Down
10 changes: 5 additions & 5 deletions packages/instrumentation-sentry-node/package.json
Original file line number Diff line number Diff line change
Expand Up @@ -30,21 +30,21 @@
"node": ">=22.0.0"
},
"dependencies": {
"@opentelemetry/core": "^1.24.1",
"@opentelemetry/instrumentation": "^0.51.1",
"@opentelemetry/semantic-conventions": "^1.24.1",
"@opentelemetry/core": "^2.7.1",
"@opentelemetry/instrumentation": "^0.218.0",
"@opentelemetry/semantic-conventions": "^1.41.1",
"json-stringify-safe": "^5.0.1",
"shimmer": "^1.2.1",
"tslib": "^2.5.3"
},
"devDependencies": {
"@opentelemetry/api": "^1.8.0",
"@opentelemetry/api": "^1.9.1",
"@sentry/node": "7.x",
"@sentry/types-v7": "npm:@sentry/types@7.x",
"@sentry/types-v8": "npm:@sentry/types@8.x"
},
"peerDependencies": {
"@opentelemetry/api": "^1.3.0"
"@opentelemetry/api": "^1.9.1"
},
"keywords": [
"sentry",
Expand Down
13 changes: 7 additions & 6 deletions packages/node-logger/package.json
Original file line number Diff line number Diff line change
Expand Up @@ -34,12 +34,13 @@
},
"dependencies": {
"@nestjs/common": "^9.4.2",
"@opentelemetry/api-logs": "~0.51.0",
"@opentelemetry/core": "~1.24.0",
"@opentelemetry/exporter-logs-otlp-http": "~0.51.0",
"@opentelemetry/resources": "~1.24.0",
"@opentelemetry/sdk-logs": "~0.51.0",
"@opentelemetry/semantic-conventions": "~1.24.0",
"@opentelemetry/api": "^1.9.1",
"@opentelemetry/api-logs": "^0.218.0",
"@opentelemetry/core": "^2.7.1",
"@opentelemetry/exporter-logs-otlp-http": "^0.218.0",
"@opentelemetry/resources": "^2.7.1",
"@opentelemetry/sdk-logs": "^0.218.0",
"@opentelemetry/semantic-conventions": "^1.41.1",
"debug": "^4.3.4",
"json-stringify-safe": "^5.0.1",
"lodash.isplainobject": "^4.0.6",
Expand Down
58 changes: 32 additions & 26 deletions packages/node-logger/src/logger.ts
Original file line number Diff line number Diff line change
@@ -1,49 +1,55 @@
import stringifySafe from 'json-stringify-safe';
import { Attributes, diag, DiagConsoleLogger } from '@opentelemetry/api';
import { getEnvWithoutDefaults } from '@opentelemetry/core';
import {
BatchLogRecordProcessor,
BufferConfig,
LoggerProvider,
} from '@opentelemetry/sdk-logs';
import { OTLPLogExporter } from '@opentelemetry/exporter-logs-otlp-http';
import { Logger as OtelLogger, SeverityNumber } from '@opentelemetry/api-logs';
import { Logger as OtelLogger } from '@opentelemetry/api-logs';
import {
Resource,
defaultServiceName,
detectResourcesSync,
envDetectorSync,
hostDetectorSync,
osDetectorSync,
resourceFromAttributes,
detectResources as otelDetectResources,
envDetector,
hostDetector,
osDetector,
processDetector,
} from '@opentelemetry/resources';
import { SEMRESATTRS_SERVICE_NAME } from '@opentelemetry/semantic-conventions';
import { ATTR_SERVICE_NAME } from '@opentelemetry/semantic-conventions';

import hdx, { LOG_PREFIX as _LOG_PREFIX } from './debug';
import { version as PKG_VERSION } from '../package.json';

const otelEnv = getEnvWithoutDefaults();
const env = process.env;

// Helper to parse numeric env vars
const getNumEnv = (key: string): number | undefined => {
const val = env[key];
if (val == null || val === '') return undefined;
const num = Number(val);
return Number.isNaN(num) ? undefined : num;
};

// DEBUG otel modules
if (otelEnv.OTEL_LOG_LEVEL) {
if (env.OTEL_LOG_LEVEL) {
diag.setLogger(new DiagConsoleLogger(), {
logLevel: otelEnv.OTEL_LOG_LEVEL,
logLevel: env.OTEL_LOG_LEVEL as any,
});
}

// TO EXTRACT ENV VARS [https://github.com/open-telemetry/opentelemetry-js/blob/3ab4f765d8d696327b7d139ae6a45e7bd7edd924/experimental/packages/sdk-logs/src/export/BatchLogRecordProcessorBase.ts#L50]
// TO EXTRACT DEFAULTS [https://github.com/open-telemetry/opentelemetry-js/blob/3ab4f765d8d696327b7d139ae6a45e7bd7edd924/experimental/packages/sdk-logs/src/types.ts#L49]
const DEFAULT_EXPORTER_BATCH_SIZE =
otelEnv.OTEL_BLRP_MAX_EXPORT_BATCH_SIZE ?? 512;
const DEFAULT_EXPORTER_TIMEOUT_MS = otelEnv.OTEL_BLRP_EXPORT_TIMEOUT ?? 30000;
const DEFAULT_MAX_QUEUE_SIZE = otelEnv.OTEL_BLRP_MAX_QUEUE_SIZE ?? 2048;
getNumEnv('OTEL_BLRP_MAX_EXPORT_BATCH_SIZE') ?? 512;
const DEFAULT_EXPORTER_TIMEOUT_MS =
getNumEnv('OTEL_BLRP_EXPORT_TIMEOUT') ?? 30000;
const DEFAULT_MAX_QUEUE_SIZE = getNumEnv('OTEL_BLRP_MAX_QUEUE_SIZE') ?? 2048;
const DEFAULT_OTEL_LOGS_EXPORTER_URL =
otelEnv.OTEL_EXPORTER_OTLP_LOGS_ENDPOINT ??
(otelEnv.OTEL_EXPORTER_OTLP_ENDPOINT
? `${otelEnv.OTEL_EXPORTER_OTLP_ENDPOINT}/v1/logs`
env.OTEL_EXPORTER_OTLP_LOGS_ENDPOINT ??
(env.OTEL_EXPORTER_OTLP_ENDPOINT
? `${env.OTEL_EXPORTER_OTLP_ENDPOINT}/v1/logs`
: 'https://in-otel.hyperdx.io/v1/logs');
const DEFAULT_SEND_INTERVAL_MS = otelEnv.OTEL_BLRP_SCHEDULE_DELAY ?? 2000;
const DEFAULT_SERVICE_NAME = otelEnv.OTEL_SERVICE_NAME ?? defaultServiceName();
const DEFAULT_SEND_INTERVAL_MS = getNumEnv('OTEL_BLRP_SCHEDULE_DELAY') ?? 2000;
const DEFAULT_SERVICE_NAME = env.OTEL_SERVICE_NAME ?? 'unknown_service';

const LOG_PREFIX = `⚠️ ${_LOG_PREFIX}`;

Expand Down Expand Up @@ -100,9 +106,9 @@ export class Logger {
maxQueueSize = maxExportBatchSize;
}

const detectedResource = detectResourcesSync({
const detectedResource = otelDetectResources({
detectors: detectResources
? [envDetectorSync, hostDetectorSync, osDetectorSync, processDetector]
? [envDetector, hostDetector, osDetector, processDetector]
: [],
});

Expand All @@ -124,15 +130,15 @@ export class Logger {
});
const loggerProvider = new LoggerProvider({
resource: detectedResource.merge(
new Resource({
resourceFromAttributes({
// TODO: should use otel semantic conventions
'hyperdx.distro.version': PKG_VERSION,
[SEMRESATTRS_SERVICE_NAME]: service ?? DEFAULT_SERVICE_NAME,
[ATTR_SERVICE_NAME]: service ?? DEFAULT_SERVICE_NAME,
...resourceAttributes,
}),
),
processors: [this.processor],
});
loggerProvider.addLogRecordProcessor(this.processor);

this.logger = loggerProvider.getLogger('node-logger');
console.log(`${LOG_PREFIX} started!`);
Expand Down
38 changes: 19 additions & 19 deletions packages/node-opentelemetry/package.json
Original file line number Diff line number Diff line change
Expand Up @@ -37,25 +37,25 @@
"dependencies": {
"@hyperdx/instrumentation-exception": "^0.2.0",
"@hyperdx/instrumentation-sentry-node": "^0.1.0",
"@opentelemetry/api": "^1.8.0",
"@opentelemetry/api-logs": "^0.57.2",
"@opentelemetry/auto-instrumentations-node": "^0.56.1",
"@opentelemetry/core": "^1.30.1",
"@opentelemetry/exporter-logs-otlp-grpc": "^0.57.2",
"@opentelemetry/exporter-logs-otlp-http": "^0.57.2",
"@opentelemetry/exporter-metrics-otlp-grpc": "^0.57.2",
"@opentelemetry/exporter-metrics-otlp-proto": "^0.57.2",
"@opentelemetry/exporter-trace-otlp-grpc": "^0.57.2",
"@opentelemetry/exporter-trace-otlp-proto": "^0.57.2",
"@opentelemetry/instrumentation": "^0.57.2",
"@opentelemetry/instrumentation-http": "^0.57.2",
"@opentelemetry/instrumentation-runtime-node": "^0.12.2",
"@opentelemetry/resources": "^1.30.1",
"@opentelemetry/sdk-logs": "^0.57.2",
"@opentelemetry/sdk-metrics": "^1.30.1",
"@opentelemetry/sdk-node": "^0.57.2",
"@opentelemetry/sdk-trace-base": "^1.30.1",
"@opentelemetry/semantic-conventions": "^1.30.0",
"@opentelemetry/api": "^1.9.1",
"@opentelemetry/api-logs": "^0.218.0",
"@opentelemetry/auto-instrumentations-node": "^0.76.0",
"@opentelemetry/core": "^2.7.1",
"@opentelemetry/exporter-logs-otlp-grpc": "^0.218.0",
"@opentelemetry/exporter-logs-otlp-http": "^0.218.0",
"@opentelemetry/exporter-metrics-otlp-grpc": "^0.218.0",
"@opentelemetry/exporter-metrics-otlp-proto": "^0.218.0",
"@opentelemetry/exporter-trace-otlp-grpc": "^0.218.0",
"@opentelemetry/exporter-trace-otlp-proto": "^0.218.0",
"@opentelemetry/instrumentation": "^0.218.0",
"@opentelemetry/instrumentation-http": "^0.218.0",
"@opentelemetry/instrumentation-runtime-node": "^0.31.0",
"@opentelemetry/resources": "^2.7.1",
"@opentelemetry/sdk-logs": "^0.218.0",
"@opentelemetry/sdk-metrics": "^2.7.1",
"@opentelemetry/sdk-node": "^0.218.0",
"@opentelemetry/sdk-trace-base": "^2.7.1",
"@opentelemetry/semantic-conventions": "^1.41.1",
"cli-spinners": "^2.9.2",
"json-stringify-safe": "^5.0.1",
"lodash.isobject": "^3.0.2",
Expand Down
62 changes: 28 additions & 34 deletions packages/node-opentelemetry/src/constants.ts
Original file line number Diff line number Diff line change
@@ -1,52 +1,46 @@
import { getEnv, getEnvWithoutDefaults } from '@opentelemetry/core';
import { defaultServiceName } from '@opentelemetry/resources';

import { stringToBoolean } from './utils';
import { getNumEnv, stringToBoolean } from './utils';

const env = process.env;

// enable otel debug mode if HDX_DEBUG_MODE_ENABLED is set
const otelEnv = getEnvWithoutDefaults();
const otelEnvWithDefaults = getEnv();

// TO EXTRACT ENV VARS [https://github.com/open-telemetry/opentelemetry-js/blob/3ab4f765d8d696327b7d139ae6a45e7bd7edd924/experimental/packages/sdk-logs/src/export/BatchLogRecordProcessorBase.ts#L50]
// TO EXTRACT DEFAULTS [https://github.com/open-telemetry/opentelemetry-js/blob/3ab4f765d8d696327b7d139ae6a45e7bd7edd924/experimental/packages/sdk-logs/src/types.ts#L49]
export const DEFAULT_EXPORTER_BATCH_SIZE =
otelEnv.OTEL_BLRP_MAX_EXPORT_BATCH_SIZE ?? 512;
getNumEnv('OTEL_BLRP_MAX_EXPORT_BATCH_SIZE') ?? 512;
export const DEFAULT_EXPORTER_TIMEOUT_MS =
otelEnv.OTEL_BLRP_EXPORT_TIMEOUT ?? 30000;
export const DEFAULT_MAX_QUEUE_SIZE = otelEnv.OTEL_BLRP_MAX_QUEUE_SIZE ?? 2048;
export const DEFAULT_OTEL_TRACES_EXPORTER = otelEnv.OTEL_TRACES_EXPORTER;
getNumEnv('OTEL_BLRP_EXPORT_TIMEOUT') ?? 30000;
export const DEFAULT_MAX_QUEUE_SIZE =
getNumEnv('OTEL_BLRP_MAX_QUEUE_SIZE') ?? 2048;
export const DEFAULT_OTEL_TRACES_EXPORTER = env.OTEL_TRACES_EXPORTER;
export const DEFAULT_OTEL_TRACES_EXPORTER_URL =
otelEnv.OTEL_EXPORTER_OTLP_TRACES_ENDPOINT ??
(otelEnv.OTEL_EXPORTER_OTLP_ENDPOINT
? otelEnv.OTEL_EXPORTER_OTLP_PROTOCOL === 'grpc'
? otelEnv.OTEL_EXPORTER_OTLP_ENDPOINT
: `${otelEnv.OTEL_EXPORTER_OTLP_ENDPOINT}/v1/traces`
env.OTEL_EXPORTER_OTLP_TRACES_ENDPOINT ??
(env.OTEL_EXPORTER_OTLP_ENDPOINT
? env.OTEL_EXPORTER_OTLP_PROTOCOL === 'grpc'
? env.OTEL_EXPORTER_OTLP_ENDPOINT
: `${env.OTEL_EXPORTER_OTLP_ENDPOINT}/v1/traces`
: 'https://in-otel.hyperdx.io/v1/traces');
export const DEFAULT_OTEL_TRACES_SAMPLER =
otelEnv.OTEL_TRACES_SAMPLER ?? 'parentbased_always_on';
env.OTEL_TRACES_SAMPLER ?? 'parentbased_always_on';
export const DEFAULT_OTEL_TRACES_SAMPLER_ARG =
otelEnv.OTEL_TRACES_SAMPLER_ARG ?? '1';
env.OTEL_TRACES_SAMPLER_ARG ?? '1';
export const DEFAULT_OTEL_EXPORTER_OTLP_TRACES_TIMEOUT =
otelEnv.OTEL_EXPORTER_OTLP_TRACES_TIMEOUT ?? 60000;
getNumEnv('OTEL_EXPORTER_OTLP_TRACES_TIMEOUT') ?? 60000;
export const DEFAULT_SEND_INTERVAL_MS =
otelEnv.OTEL_BLRP_SCHEDULE_DELAY ?? 2000;
export const DEFAULT_OTEL_LOGS_EXPORTER = otelEnv.OTEL_LOGS_EXPORTER;
getNumEnv('OTEL_BLRP_SCHEDULE_DELAY') ?? 2000;
export const DEFAULT_OTEL_LOGS_EXPORTER = env.OTEL_LOGS_EXPORTER;
export const DEFAULT_OTEL_LOGS_EXPORTER_URL =
otelEnv.OTEL_EXPORTER_OTLP_LOGS_ENDPOINT ??
(otelEnv.OTEL_EXPORTER_OTLP_ENDPOINT
? otelEnv.OTEL_EXPORTER_OTLP_PROTOCOL === 'grpc'
? otelEnv.OTEL_EXPORTER_OTLP_ENDPOINT
: `${otelEnv.OTEL_EXPORTER_OTLP_ENDPOINT}/v1/logs`
env.OTEL_EXPORTER_OTLP_LOGS_ENDPOINT ??
(env.OTEL_EXPORTER_OTLP_ENDPOINT
? env.OTEL_EXPORTER_OTLP_PROTOCOL === 'grpc'
? env.OTEL_EXPORTER_OTLP_ENDPOINT
: `${env.OTEL_EXPORTER_OTLP_ENDPOINT}/v1/logs`
: 'https://in-otel.hyperdx.io/v1/logs');
export const DEFAULT_OTEL_METRICS_EXPORTER = env.OTEL_METRICS_EXPORTER; // not exist yet
export const DEFAULT_OTEL_METRICS_EXPORTER_URL =
otelEnv.OTEL_EXPORTER_OTLP_METRICS_ENDPOINT ??
(otelEnv.OTEL_EXPORTER_OTLP_ENDPOINT
? otelEnv.OTEL_EXPORTER_OTLP_PROTOCOL === 'grpc'
? otelEnv.OTEL_EXPORTER_OTLP_ENDPOINT
: `${otelEnv.OTEL_EXPORTER_OTLP_ENDPOINT}/v1/metrics`
env.OTEL_EXPORTER_OTLP_METRICS_ENDPOINT ??
(env.OTEL_EXPORTER_OTLP_ENDPOINT
? env.OTEL_EXPORTER_OTLP_PROTOCOL === 'grpc'
? env.OTEL_EXPORTER_OTLP_ENDPOINT
: `${env.OTEL_EXPORTER_OTLP_ENDPOINT}/v1/metrics`
: 'https://in-otel.hyperdx.io/v1/metrics');
export const DEFAULT_OTEL_METRIC_EXPORT_INTERVAL =
env.OTEL_METRIC_EXPORT_INTERVAL
Expand All @@ -56,8 +50,8 @@ export const DEFAULT_OTEL_METRIC_EXPORT_TIMEOUT = env.OTEL_METRIC_EXPORT_TIMEOUT
? Number(env.OTEL_METRIC_EXPORT_TIMEOUT)
: 30000; // not exist yet
export const DEFAULT_SERVICE_NAME = () =>
getEnvWithoutDefaults().OTEL_SERVICE_NAME ?? defaultServiceName();
export const DEFAULT_OTEL_LOG_LEVEL = otelEnvWithDefaults.OTEL_LOG_LEVEL;
env.OTEL_SERVICE_NAME ?? 'unknown_service';
export const DEFAULT_OTEL_LOG_LEVEL = env.OTEL_LOG_LEVEL ?? 'info';

// HyperDX SDK specific configuration
export const DEFAULT_HDX_API_KEY = () => env.HYPERDX_API_KEY;
Expand Down
Loading
Loading