diff --git a/package-lock.json b/package-lock.json index 5a86acec1e..82fbf5cca3 100644 --- a/package-lock.json +++ b/package-lock.json @@ -16866,6 +16866,46 @@ "@opentelemetry/api": "^1.3.0" } }, + "node_modules/@opentelemetry/instrumentation-fs": { + "version": "0.26.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation-fs/-/instrumentation-fs-0.26.0.tgz", + "integrity": "sha512-040fNEfh+89lAot9Oma60x37Iynn0Kk/Rx8J7MWsQ26LP64O4KM+nUqsa0OSXORfaiAG24rPxcJ+6fWrnUzKjA==", + "license": "Apache-2.0", + "dependencies": { + "@opentelemetry/core": "^2.0.0", + "@opentelemetry/instrumentation": "^0.206.0" + }, + "engines": { + "node": "^18.19.0 || >=20.6.0" + }, + "peerDependencies": { + "@opentelemetry/api": "^1.3.0" + } + }, + "node_modules/@opentelemetry/instrumentation-fs/node_modules/@opentelemetry/core": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/core/-/core-2.1.0.tgz", + "integrity": "sha512-RMEtHsxJs/GiHHxYT58IY57UXAQTuUnZVco6ymDEqTNlJKTimM4qPUPVe8InNFyBjhHBEAx4k3Q8LtNayBsbUQ==", + "license": "Apache-2.0", + "dependencies": { + "@opentelemetry/semantic-conventions": "^1.29.0" + }, + "engines": { + "node": "^18.19.0 || >=20.6.0" + }, + "peerDependencies": { + "@opentelemetry/api": ">=1.0.0 <1.10.0" + } + }, + "node_modules/@opentelemetry/instrumentation-fs/node_modules/@opentelemetry/semantic-conventions": { + "version": "1.37.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/semantic-conventions/-/semantic-conventions-1.37.0.tgz", + "integrity": "sha512-JD6DerIKdJGmRp4jQyX5FlrQjA4tjOw1cvfsPAZXfOOEErMUHjPcPSICS+6WnM0nB0efSFARh0KAZss+bvExOA==", + "license": "Apache-2.0", + "engines": { + "node": ">=14" + } + }, "node_modules/@opentelemetry/instrumentation-oracledb": { "version": "0.32.0", "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation-oracledb/-/instrumentation-oracledb-0.32.0.tgz", @@ -16892,6 +16932,78 @@ "node": ">=14" } }, + "node_modules/@opentelemetry/instrumentation-restify": { + "version": "0.52.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation-restify/-/instrumentation-restify-0.52.0.tgz", + "integrity": "sha512-0Aehz5A+CriuVMqGo9y8yV2BYNkOse1Dud/PaURtjclv6/+FA+IBlAteG6R0CSBsIQEtNguVOqDkh4GTERq65Q==", + "license": "Apache-2.0", + "dependencies": { + "@opentelemetry/core": "^2.0.0", + "@opentelemetry/instrumentation": "^0.206.0", + "@opentelemetry/semantic-conventions": "^1.27.0" + }, + "engines": { + "node": "^18.19.0 || >=20.6.0" + }, + "peerDependencies": { + "@opentelemetry/api": "^1.3.0" + } + }, + "node_modules/@opentelemetry/instrumentation-restify/node_modules/@opentelemetry/core": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/core/-/core-2.1.0.tgz", + "integrity": "sha512-RMEtHsxJs/GiHHxYT58IY57UXAQTuUnZVco6ymDEqTNlJKTimM4qPUPVe8InNFyBjhHBEAx4k3Q8LtNayBsbUQ==", + "license": "Apache-2.0", + "dependencies": { + "@opentelemetry/semantic-conventions": "^1.29.0" + }, + "engines": { + "node": "^18.19.0 || >=20.6.0" + }, + "peerDependencies": { + "@opentelemetry/api": ">=1.0.0 <1.10.0" + } + }, + "node_modules/@opentelemetry/instrumentation-restify/node_modules/@opentelemetry/semantic-conventions": { + "version": "1.37.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/semantic-conventions/-/semantic-conventions-1.37.0.tgz", + "integrity": "sha512-JD6DerIKdJGmRp4jQyX5FlrQjA4tjOw1cvfsPAZXfOOEErMUHjPcPSICS+6WnM0nB0efSFARh0KAZss+bvExOA==", + "license": "Apache-2.0", + "engines": { + "node": ">=14" + } + }, + "node_modules/@opentelemetry/instrumentation-socket.io": { + "version": "0.53.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation-socket.io/-/instrumentation-socket.io-0.53.0.tgz", + "integrity": "sha512-PVBVfWy6q3WwHQ3x9h0ZP1dcX0B249Xjdwjx97sgw+p5bWRaReSKKQlLKfFR723muIvtYE+wDOUJwtPIdYVtJQ==", + "license": "Apache-2.0", + "dependencies": { + "@opentelemetry/instrumentation": "^0.206.0" + }, + "engines": { + "node": "^18.19.0 || >=20.6.0" + }, + "peerDependencies": { + "@opentelemetry/api": "^1.3.0" + } + }, + "node_modules/@opentelemetry/instrumentation-tedious": { + "version": "0.25.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation-tedious/-/instrumentation-tedious-0.25.0.tgz", + "integrity": "sha512-lRUg0qngt1DJGEGiF+TCYY60IM27vNDovodjblNkmOrFB2FvgWy9zMBnCjGt8w4yPZML+sEIL9iZEQeFkf5VvA==", + "license": "Apache-2.0", + "dependencies": { + "@opentelemetry/instrumentation": "^0.206.0", + "@types/tedious": "^4.0.14" + }, + "engines": { + "node": "^18.19.0 || >=20.6.0" + }, + "peerDependencies": { + "@opentelemetry/api": "^1.3.0" + } + }, "node_modules/@opentelemetry/instrumentation/node_modules/@opentelemetry/api-logs": { "version": "0.206.0", "resolved": "https://registry.npmjs.org/@opentelemetry/api-logs/-/api-logs-0.206.0.tgz", @@ -21068,6 +21180,7 @@ "version": "1.0.2", "resolved": "https://registry.npmjs.org/@types/shimmer/-/shimmer-1.0.2.tgz", "integrity": "sha512-dKkr1bTxbEsFlh2ARpKzcaAmsYixqt9UyCdoEZk8rHyE4iQYcDCyvSjDSf7JUWJHlJiTtbIoQjxKh6ViywqDAg==", + "dev": true, "license": "MIT" }, "node_modules/@types/sinon": { @@ -21107,10 +21220,10 @@ } }, "node_modules/@types/tedious": { - "version": "4.0.12", - "resolved": "https://registry.npmjs.org/@types/tedious/-/tedious-4.0.12.tgz", - "integrity": "sha512-5NBYCLmidyXG3zxiBmR0beORRQcJOBoTKVL+9WaHQbX0E386UFXw6TSlY9/oxZDYqUWlBC98Funb83eJQt1aMw==", - "dev": true, + "version": "4.0.14", + "resolved": "https://registry.npmjs.org/@types/tedious/-/tedious-4.0.14.tgz", + "integrity": "sha512-KHPsfX/FoVbUGbyYvk1q9MMQHLPeRZhRJZdO45Q4YjvFkv4hMNghCWTvy7rdKessBsmtz4euWCWAB6/tVpI1Iw==", + "license": "MIT", "dependencies": { "@types/node": "*" } @@ -21716,6 +21829,7 @@ "version": "1.9.0", "resolved": "https://registry.npmjs.org/acorn-import-assertions/-/acorn-import-assertions-1.9.0.tgz", "integrity": "sha512-cmMwop9x+8KFhxvKrKfPYmN6/pKTYYHBqLa0DfvVZcKMJWNyWLnaqND7dx/qn66R7ewM1UX5XMaDVP5wlVTaVA==", + "dev": true, "peerDependencies": { "acorn": "^8" } @@ -31055,6 +31169,7 @@ "version": "1.1.2", "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.2.tgz", "integrity": "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==", + "devOptional": true, "funding": { "url": "https://github.com/sponsors/ljharb" } @@ -32400,6 +32515,7 @@ "version": "1.0.3", "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz", "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==", + "dev": true, "dependencies": { "function-bind": "^1.1.1" }, @@ -33554,6 +33670,7 @@ "version": "2.13.0", "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.13.0.tgz", "integrity": "sha512-Z7dk6Qo8pOCp3l4tsX2C5ZVas4V+UxwQodwZhLopL91TX8UyyHEXafPcyoeeWuLrwzHcr3igO78wNLwHJHsMCQ==", + "dev": true, "dependencies": { "has": "^1.0.3" }, @@ -40749,7 +40866,8 @@ "node_modules/path-parse": { "version": "1.0.7", "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz", - "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==" + "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==", + "dev": true }, "node_modules/path-platform": { "version": "0.11.15", @@ -43494,6 +43612,7 @@ "version": "7.2.0", "resolved": "https://registry.npmjs.org/require-in-the-middle/-/require-in-the-middle-7.2.0.tgz", "integrity": "sha512-3TLx5TGyAY6AOqLBoXmHkNql0HIf2RGbuMgCDT2WO/uGVAPJs6h7Kl+bN6TIZGd9bWhWPwnDnTHGtW8Iu77sdw==", + "dev": true, "dependencies": { "debug": "^4.1.1", "module-details-from-path": "^1.0.3", @@ -43528,6 +43647,7 @@ "version": "1.22.6", "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.6.tgz", "integrity": "sha512-njhxM7mV12JfufShqGy3Rz8j11RPdLy4xi15UurGJeoHLfJpVXKdh3ueuOqbYUcDZnffr6X739JBo5LzyahEsw==", + "dev": true, "dependencies": { "is-core-module": "^2.13.0", "path-parse": "^1.0.7", @@ -45879,6 +45999,7 @@ "version": "1.0.0", "resolved": "https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz", "integrity": "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==", + "dev": true, "engines": { "node": ">= 0.4" }, @@ -49116,13 +49237,13 @@ "version": "4.26.2", "license": "MIT", "dependencies": { - "@opentelemetry/api": "1.9.0", + "@opentelemetry/api": ">=1.3.0 <1.10.0", "@opentelemetry/context-async-hooks": "1.25.0", - "@opentelemetry/instrumentation-fs": "0.12.0", + "@opentelemetry/instrumentation-fs": "0.26.0", "@opentelemetry/instrumentation-oracledb": "0.32.0", - "@opentelemetry/instrumentation-restify": "0.38.0", - "@opentelemetry/instrumentation-socket.io": "0.39.0", - "@opentelemetry/instrumentation-tedious": "0.13.0", + "@opentelemetry/instrumentation-restify": "0.52.0", + "@opentelemetry/instrumentation-socket.io": "0.53.0", + "@opentelemetry/instrumentation-tedious": "0.25.0", "@opentelemetry/sdk-trace-base": "1.25.0", "cls-bluebird": "^2.1.0", "import-in-the-middle": "1.15.0", @@ -49132,6 +49253,9 @@ "read-yaml-file": "^2.1.0", "semver": "^7.7.3", "shimmer": "^1.2.1" + }, + "peerDependencies": { + "@opentelemetry/api": ">=1.3.0 <1.10.0" } }, "packages/core/node_modules/@opentelemetry/api": { @@ -49142,17 +49266,6 @@ "node": ">=8.0.0" } }, - "packages/core/node_modules/@opentelemetry/api-logs": { - "version": "0.51.0", - "resolved": "https://registry.npmjs.org/@opentelemetry/api-logs/-/api-logs-0.51.0.tgz", - "integrity": "sha512-m/jtfBPEIXS1asltl8fPQtO3Sb1qMpuL61unQajUmM8zIxeMF1AlqzWXM3QedcYgTTFiJCew5uJjyhpmqhc0+g==", - "dependencies": { - "@opentelemetry/api": "^1.0.0" - }, - "engines": { - "node": ">=14" - } - }, "packages/core/node_modules/@opentelemetry/context-async-hooks": { "version": "1.25.0", "resolved": "https://registry.npmjs.org/@opentelemetry/context-async-hooks/-/context-async-hooks-1.25.0.tgz", @@ -49178,199 +49291,6 @@ "@opentelemetry/api": ">=1.0.0 <1.10.0" } }, - "packages/core/node_modules/@opentelemetry/instrumentation": { - "version": "0.52.0", - "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation/-/instrumentation-0.52.0.tgz", - "integrity": "sha512-LPwSIrw+60cheWaXsfGL8stBap/AppKQJFE+qqRvzYrgttXFH2ofoIMxWadeqPTq4BYOXM/C7Bdh/T+B60xnlQ==", - "dependencies": { - "@opentelemetry/api-logs": "0.52.0", - "@types/shimmer": "^1.0.2", - "import-in-the-middle": "1.8.0", - "require-in-the-middle": "^7.1.1", - "semver": "^7.5.2", - "shimmer": "^1.2.1" - }, - "engines": { - "node": ">=14" - }, - "peerDependencies": { - "@opentelemetry/api": "^1.3.0" - } - }, - "packages/core/node_modules/@opentelemetry/instrumentation-fs": { - "version": "0.12.0", - "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation-fs/-/instrumentation-fs-0.12.0.tgz", - "integrity": "sha512-Waf+2hekJRxIwq1PmivxOWLdMOtYbY22hKr34gEtfbv2CArSv8FBJH4BmQxB9o5ZcwkdKu589qs009dbuSfNmQ==", - "dependencies": { - "@opentelemetry/core": "^1.8.0", - "@opentelemetry/instrumentation": "^0.51.0" - }, - "engines": { - "node": ">=14" - }, - "peerDependencies": { - "@opentelemetry/api": "^1.3.0" - } - }, - "packages/core/node_modules/@opentelemetry/instrumentation-fs/node_modules/@opentelemetry/instrumentation": { - "version": "0.51.0", - "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation/-/instrumentation-0.51.0.tgz", - "integrity": "sha512-Eg/+Od5bEvzpvZQGhvMyKIkrzB9S7jW+6z9LHEI2VXhl/GrqQ3oBqlzJt4tA6pGtxRmqQWKWGM1wAbwDdW/gUA==", - "dependencies": { - "@opentelemetry/api-logs": "0.51.0", - "@types/shimmer": "^1.0.2", - "import-in-the-middle": "1.7.1", - "require-in-the-middle": "^7.1.1", - "semver": "^7.5.2", - "shimmer": "^1.2.1" - }, - "engines": { - "node": ">=14" - }, - "peerDependencies": { - "@opentelemetry/api": "^1.3.0" - } - }, - "packages/core/node_modules/@opentelemetry/instrumentation-fs/node_modules/import-in-the-middle": { - "version": "1.7.1", - "resolved": "https://registry.npmjs.org/import-in-the-middle/-/import-in-the-middle-1.7.1.tgz", - "integrity": "sha512-1LrZPDtW+atAxH42S6288qyDFNQ2YCty+2mxEPRtfazH6Z5QwkaBSTS2ods7hnVJioF6rkRfNoA6A/MstpFXLg==", - "dependencies": { - "acorn": "^8.8.2", - "acorn-import-assertions": "^1.9.0", - "cjs-module-lexer": "^1.2.2", - "module-details-from-path": "^1.0.3" - } - }, - "packages/core/node_modules/@opentelemetry/instrumentation-restify": { - "version": "0.38.0", - "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation-restify/-/instrumentation-restify-0.38.0.tgz", - "integrity": "sha512-VYK47Z9GBaZX5MQLL7kZDdzQDdyUtHRD4J/GSr6kdwmIpdpUQXLsV3EnboeB8P+BlpucF57FyJKE8yWTOEMfnA==", - "dependencies": { - "@opentelemetry/core": "^1.8.0", - "@opentelemetry/instrumentation": "^0.51.0", - "@opentelemetry/semantic-conventions": "^1.22.0" - }, - "engines": { - "node": ">=14" - }, - "peerDependencies": { - "@opentelemetry/api": "^1.3.0" - } - }, - "packages/core/node_modules/@opentelemetry/instrumentation-restify/node_modules/@opentelemetry/instrumentation": { - "version": "0.51.0", - "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation/-/instrumentation-0.51.0.tgz", - "integrity": "sha512-Eg/+Od5bEvzpvZQGhvMyKIkrzB9S7jW+6z9LHEI2VXhl/GrqQ3oBqlzJt4tA6pGtxRmqQWKWGM1wAbwDdW/gUA==", - "dependencies": { - "@opentelemetry/api-logs": "0.51.0", - "@types/shimmer": "^1.0.2", - "import-in-the-middle": "1.7.1", - "require-in-the-middle": "^7.1.1", - "semver": "^7.5.2", - "shimmer": "^1.2.1" - }, - "engines": { - "node": ">=14" - }, - "peerDependencies": { - "@opentelemetry/api": "^1.3.0" - } - }, - "packages/core/node_modules/@opentelemetry/instrumentation-restify/node_modules/import-in-the-middle": { - "version": "1.7.1", - "resolved": "https://registry.npmjs.org/import-in-the-middle/-/import-in-the-middle-1.7.1.tgz", - "integrity": "sha512-1LrZPDtW+atAxH42S6288qyDFNQ2YCty+2mxEPRtfazH6Z5QwkaBSTS2ods7hnVJioF6rkRfNoA6A/MstpFXLg==", - "dependencies": { - "acorn": "^8.8.2", - "acorn-import-assertions": "^1.9.0", - "cjs-module-lexer": "^1.2.2", - "module-details-from-path": "^1.0.3" - } - }, - "packages/core/node_modules/@opentelemetry/instrumentation-socket.io": { - "version": "0.39.0", - "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation-socket.io/-/instrumentation-socket.io-0.39.0.tgz", - "integrity": "sha512-4J2ehk5mJyDT6j2yJCOuPxAjit5QB1Fwzhx0LID5jjvhI9LxzZIGDNAPTTHyghSiaRDeNMzceXKkkEQJkg2MNw==", - "dependencies": { - "@opentelemetry/instrumentation": "^0.51.0", - "@opentelemetry/semantic-conventions": "^1.0.0" - }, - "engines": { - "node": ">=14" - }, - "peerDependencies": { - "@opentelemetry/api": "^1.3.0" - } - }, - "packages/core/node_modules/@opentelemetry/instrumentation-socket.io/node_modules/@opentelemetry/instrumentation": { - "version": "0.51.0", - "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation/-/instrumentation-0.51.0.tgz", - "integrity": "sha512-Eg/+Od5bEvzpvZQGhvMyKIkrzB9S7jW+6z9LHEI2VXhl/GrqQ3oBqlzJt4tA6pGtxRmqQWKWGM1wAbwDdW/gUA==", - "dependencies": { - "@opentelemetry/api-logs": "0.51.0", - "@types/shimmer": "^1.0.2", - "import-in-the-middle": "1.7.1", - "require-in-the-middle": "^7.1.1", - "semver": "^7.5.2", - "shimmer": "^1.2.1" - }, - "engines": { - "node": ">=14" - }, - "peerDependencies": { - "@opentelemetry/api": "^1.3.0" - } - }, - "packages/core/node_modules/@opentelemetry/instrumentation-socket.io/node_modules/import-in-the-middle": { - "version": "1.7.1", - "resolved": "https://registry.npmjs.org/import-in-the-middle/-/import-in-the-middle-1.7.1.tgz", - "integrity": "sha512-1LrZPDtW+atAxH42S6288qyDFNQ2YCty+2mxEPRtfazH6Z5QwkaBSTS2ods7hnVJioF6rkRfNoA6A/MstpFXLg==", - "dependencies": { - "acorn": "^8.8.2", - "acorn-import-assertions": "^1.9.0", - "cjs-module-lexer": "^1.2.2", - "module-details-from-path": "^1.0.3" - } - }, - "packages/core/node_modules/@opentelemetry/instrumentation-tedious": { - "version": "0.13.0", - "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation-tedious/-/instrumentation-tedious-0.13.0.tgz", - "integrity": "sha512-Pob0+0R62AqXH50pjazTeGBy/1+SK4CYpFUBV5t7xpbpeuQezkkgVGvLca84QqjBqQizcXedjpUJLgHQDixPQg==", - "dependencies": { - "@opentelemetry/instrumentation": "^0.52.0", - "@opentelemetry/semantic-conventions": "^1.22.0", - "@types/tedious": "^4.0.14" - }, - "engines": { - "node": ">=14" - }, - "peerDependencies": { - "@opentelemetry/api": "^1.3.0" - } - }, - "packages/core/node_modules/@opentelemetry/instrumentation/node_modules/@opentelemetry/api-logs": { - "version": "0.52.0", - "resolved": "https://registry.npmjs.org/@opentelemetry/api-logs/-/api-logs-0.52.0.tgz", - "integrity": "sha512-HxjD7xH9iAE4OyhNaaSec65i1H6QZYBWSwWkowFfsc5YAcDvJG30/J1sRKXEQqdmUcKTXEAnA66UciqZha/4+Q==", - "dependencies": { - "@opentelemetry/api": "^1.0.0" - }, - "engines": { - "node": ">=14" - } - }, - "packages/core/node_modules/@opentelemetry/instrumentation/node_modules/import-in-the-middle": { - "version": "1.8.0", - "resolved": "https://registry.npmjs.org/import-in-the-middle/-/import-in-the-middle-1.8.0.tgz", - "integrity": "sha512-/xQjze8szLNnJ5rvHSzn+dcVXqCAU6Plbk4P24U/jwPmg1wy7IIp9OjKIO5tYue8GSPhDpPDiApQjvBUmWwhsQ==", - "dependencies": { - "acorn": "^8.8.2", - "acorn-import-attributes": "^1.9.5", - "cjs-module-lexer": "^1.2.2", - "module-details-from-path": "^1.0.3" - } - }, "packages/core/node_modules/@opentelemetry/resources": { "version": "1.25.0", "resolved": "https://registry.npmjs.org/@opentelemetry/resources/-/resources-1.25.0.tgz", @@ -49410,14 +49330,6 @@ "node": ">=14" } }, - "packages/core/node_modules/@types/tedious": { - "version": "4.0.14", - "resolved": "https://registry.npmjs.org/@types/tedious/-/tedious-4.0.14.tgz", - "integrity": "sha512-KHPsfX/FoVbUGbyYvk1q9MMQHLPeRZhRJZdO45Q4YjvFkv4hMNghCWTvy7rdKessBsmtz4euWCWAB6/tVpI1Iw==", - "dependencies": { - "@types/node": "*" - } - }, "packages/core/node_modules/import-in-the-middle": { "version": "1.15.0", "resolved": "https://registry.npmjs.org/import-in-the-middle/-/import-in-the-middle-1.15.0.tgz", diff --git a/packages/collector/test/tracing/opentelemetry/diff-otel-api-version/app.js b/packages/collector/test/tracing/opentelemetry/diff-otel-api-version/app.js new file mode 100644 index 0000000000..37be449c0f --- /dev/null +++ b/packages/collector/test/tracing/opentelemetry/diff-otel-api-version/app.js @@ -0,0 +1,49 @@ +/* + * (c) Copyright IBM Corp. 2025 + */ + +'use strict'; + +// NOTE: c8 bug https://github.com/bcoe/c8/issues/166 +process.on('SIGTERM', () => { + process.disconnect(); + process.exit(0); +}); + +require('../../../../src')(); + +const express = require('express'); +const fs = require('fs'); +const path = require('path'); +const port = require('../../../test_util/app-port')(); +const app = express(); +const logPrefix = `FS Express App (${process.pid}):\t`; + +app.get('/', (req, res) => { + res.sendStatus(200); +}); + +app.get('/fs-read', (req, res) => { + try { + const content = fs.readFileSync(path.join(__dirname, '../test.js'), 'utf8'); + log(`Read file with size: ${content.length}`); + + const stats = fs.statSync(path.join(__dirname, '../test.js')); + log(`File stats: ${JSON.stringify(stats.size)}`); + + res.send({ success: true, size: content.length }); + } catch (err) { + res.status(500).send({ error: err.message }); + } +}); + +app.listen(port, () => { + log(`Listening on port: ${port}`); +}); + +function log() { + const args = Array.prototype.slice.call(arguments); + args[0] = logPrefix + args[0]; + // eslint-disable-next-line no-console + console.log.apply(console, args); +} diff --git a/packages/collector/test/tracing/opentelemetry/diff-otel-api-version/package.json b/packages/collector/test/tracing/opentelemetry/diff-otel-api-version/package.json new file mode 100644 index 0000000000..99ceb7e2d4 --- /dev/null +++ b/packages/collector/test/tracing/opentelemetry/diff-otel-api-version/package.json @@ -0,0 +1,10 @@ +{ + "name": "opentelemetry-api-version-conflict-test", + "version": "1.0.0", + "description": "Test with different OpenTelemetry API version than our collector package", + "main": "app.js", + "private": true, + "dependencies": { + "@opentelemetry/api": "1.0.0" + } +} diff --git a/packages/collector/test/tracing/opentelemetry/fs-app.js b/packages/collector/test/tracing/opentelemetry/fs-app.js index b497684c77..458d187f6e 100644 --- a/packages/collector/test/tracing/opentelemetry/fs-app.js +++ b/packages/collector/test/tracing/opentelemetry/fs-app.js @@ -12,14 +12,7 @@ process.on('SIGTERM', () => { process.exit(0); }); -const expect = require('chai').expect; - -/** - * We install the latest version of the collector here locally. - * This ensures we are using the Opentelemetry production dependencies. - */ -expect(require.resolve('@instana/collector')).to.contain('opentelemetry/node_modules/@instana/collector'); -require('@instana/collector')(); +require('../../../src')(); const express = require('express'); const fs = require('fs'); diff --git a/packages/collector/test/tracing/opentelemetry/oracle-app.js b/packages/collector/test/tracing/opentelemetry/oracle-app.js index e96e5fc4ab..6dc61f83f0 100644 --- a/packages/collector/test/tracing/opentelemetry/oracle-app.js +++ b/packages/collector/test/tracing/opentelemetry/oracle-app.js @@ -14,7 +14,7 @@ process.on('SIGTERM', () => { const opentelemetryDisabled = process.env.INSTANA_DISABLE_USE_OPENTELEMETRY === 'true'; -require('@instana/collector')({ +require('../../../src')({ tracing: { useOpentelemetry: !opentelemetryDisabled } diff --git a/packages/collector/test/tracing/opentelemetry/package.json b/packages/collector/test/tracing/opentelemetry/package.json deleted file mode 100644 index a2f0d5e7b8..0000000000 --- a/packages/collector/test/tracing/opentelemetry/package.json +++ /dev/null @@ -1,7 +0,0 @@ -{ - "name": "opentelemetry-instrumentations-test", - "version": "1.0.0", - "author": "", - "license": "ISC", - "description": "" -} diff --git a/packages/collector/test/tracing/opentelemetry/preinstall.sh b/packages/collector/test/tracing/opentelemetry/preinstall.sh deleted file mode 100755 index f32d7cfaa2..0000000000 --- a/packages/collector/test/tracing/opentelemetry/preinstall.sh +++ /dev/null @@ -1,21 +0,0 @@ -#!/usr/bin/env bash - -####################################### -# (c) Copyright IBM Corp. 2025 -####################################### - -cd "$(dirname "$0")/../../../../collector" -echo "Running npm pack in $(pwd)" -npm pack - -version=$(node -p "require('./package.json').version") -tarball="instana-collector-${version}.tgz" -cp "./${tarball}" "./test/tracing/opentelemetry/collector.tgz" - -cd "$(dirname "$0")/../core" -echo "Running npm pack in $(pwd)" -npm pack - -version=$(node -p "require('./package.json').version") -tarball="instana-core-${version}.tgz" -cp "./${tarball}" "../collector/test/tracing/opentelemetry/core.tgz" \ No newline at end of file diff --git a/packages/collector/test/tracing/opentelemetry/restify-app.js b/packages/collector/test/tracing/opentelemetry/restify-app.js index 697d8e1233..8653e92b1b 100644 --- a/packages/collector/test/tracing/opentelemetry/restify-app.js +++ b/packages/collector/test/tracing/opentelemetry/restify-app.js @@ -15,7 +15,7 @@ process.on('SIGTERM', () => { const agentPort = process.env.INSTANA_AGENT_PORT; const opentelemetryDisabled = process.env.INSTANA_DISABLE_USE_OPENTELEMETRY === 'true'; -require('@instana/collector')({ +require('../../../src')({ tracing: { useOpentelemetry: !opentelemetryDisabled } diff --git a/packages/collector/test/tracing/opentelemetry/socketio-client.js b/packages/collector/test/tracing/opentelemetry/socketio-client.js index f7eb0deb1c..41045465ab 100644 --- a/packages/collector/test/tracing/opentelemetry/socketio-client.js +++ b/packages/collector/test/tracing/opentelemetry/socketio-client.js @@ -12,7 +12,7 @@ process.on('SIGTERM', () => { process.exit(0); }); -require('@instana/collector')(); +require('../../../src')(); const socketioclient = require('socket.io-client'); const express = require('express'); diff --git a/packages/collector/test/tracing/opentelemetry/socketio-server.js b/packages/collector/test/tracing/opentelemetry/socketio-server.js index 9bae0acc8a..5006e8173d 100644 --- a/packages/collector/test/tracing/opentelemetry/socketio-server.js +++ b/packages/collector/test/tracing/opentelemetry/socketio-server.js @@ -12,7 +12,7 @@ process.on('SIGTERM', () => { process.exit(0); }); -require('@instana/collector')(); +require('../../../src')(); const express = require('express'); const port = require('../../test_util/app-port')(); diff --git a/packages/collector/test/tracing/opentelemetry/tedious-app.js b/packages/collector/test/tracing/opentelemetry/tedious-app.js index ac5e861dd4..fae8b1beb5 100644 --- a/packages/collector/test/tracing/opentelemetry/tedious-app.js +++ b/packages/collector/test/tracing/opentelemetry/tedious-app.js @@ -11,7 +11,7 @@ process.on('SIGTERM', () => { }); /* eslint-disable no-console */ -require('@instana/collector')({ +require('../../../src')({ tracing: { useOpentelemetry: process.env.OTEL_ENABLED } diff --git a/packages/collector/test/tracing/opentelemetry/test.js b/packages/collector/test/tracing/opentelemetry/test.js index b6a43fe69b..58a00e43fc 100644 --- a/packages/collector/test/tracing/opentelemetry/test.js +++ b/packages/collector/test/tracing/opentelemetry/test.js @@ -7,11 +7,11 @@ const expect = require('chai').expect; const path = require('path'); const semver = require('semver'); +const { execSync } = require('child_process'); const supportedVersion = require('@instana/core').tracing.supportedVersion; const constants = require('@instana/core').tracing.constants; const config = require('../../../../core/test/config'); const portfinder = require('../../test_util/portfinder'); -const { execSync } = require('child_process'); const { retry, verifyHttpRootEntry, @@ -35,24 +35,6 @@ const runTests = mochaSuiteFn('opentelemetry/instrumentations', function () { this.timeout(config.getTestTimeout() * 2); - before(() => { - if (process.env.INSTANA_TEST_SKIP_INSTALLING_DEPS === 'true') { - return; - } - - execSync('./preinstall.sh', { cwd: __dirname, stdio: 'inherit' }); - - execSync('npm install --no-save --no-package-lock --prefix ./ ./core.tgz', { - cwd: __dirname, - stdio: 'inherit' - }); - - execSync('npm install --no-save --no-package-lock --prefix ./ ./collector.tgz', { - cwd: __dirname, - stdio: 'inherit' - }); - }); - // TODO: Restify test is broken in v24. See Issue: https://github.com/restify/node-restify/issues/1984 runTests('restify', function () { describe('opentelemetry is enabled', function () { @@ -439,7 +421,7 @@ mochaSuiteFn('opentelemetry/instrumentations', function () { pid: String(serverControls.getPid()), dataProperty: 'tags', extraTests: span => { - expect(span.data.tags.name).to.contain('test_reply receive'); + expect(span.data.tags.name).to.contain('receive /'); expect(span.data.tags['messaging.system']).to.eql('socket.io'); expect(span.data.tags['messaging.destination']).to.eql('ON test_reply'); expect(span.data.tags['messaging.operation']).to.eql('receive'); @@ -793,6 +775,95 @@ mochaSuiteFn('opentelemetry/instrumentations', function () { )); }); }); + + describe('with different otel-api version installed on app', function () { + globalAgent.setUpCleanUpHooks(); + const agentControls = globalAgent.instance; + + let controls; + + before(async () => { + // Install dependencies directly in the test directory + execSync('npm install --no-save --no-package-lock', { + cwd: path.join(__dirname, './diff-otel-api-version'), + stdio: 'inherit' + }); + controls = new ProcessControls({ + appPath: path.join(__dirname, './diff-otel-api-version/app.js'), + useGlobalAgent: true + }); + + await controls.startAndWaitForAgentConnection(); + }); + + beforeEach(async () => { + await agentControls.clearReceivedTraceData(); + }); + + after(async () => { + await controls.stop(); + }); + + afterEach(async () => { + await controls.clearIpcMessages(); + }); + + it('should trace', () => + controls + .sendRequest({ + method: 'GET', + path: '/fs-read' + }) + .then(() => + retry(() => + agentControls.getSpans().then(spans => { + expect(spans.length).to.equal(3); + + const httpEntry = verifyHttpRootEntry({ + spans, + apiPath: '/fs-read', + pid: String(controls.getPid()) + }); + + verifyExitSpan({ + spanName: 'otel', + spans, + parent: httpEntry, + withError: false, + pid: String(controls.getPid()), + dataProperty: 'tags', + extraTests: span => { + expect(span.data.tags.name).to.eql('fs readFileSync'); + checkTelemetryResourceAttrs(span); + } + }); + + verifyExitSpan({ + spanName: 'otel', + spans, + parent: httpEntry, + withError: false, + pid: String(controls.getPid()), + dataProperty: 'tags', + extraTests: span => { + expect(span.data.tags.name).to.eql('fs statSync'); + checkTelemetryResourceAttrs(span); + } + }); + }) + ) + )); + + it('[suppressed] should not trace', () => + controls + .sendRequest({ + method: 'GET', + path: '/fs-read', + suppressTracing: true + }) + .then(() => delay(DELAY_TIMEOUT_IN_MS)) + .then(() => retry(() => agentControls.getSpans().then(spans => expect(spans).to.be.empty)))); + }); }); function checkTelemetryResourceAttrs(span) { diff --git a/packages/core/package.json b/packages/core/package.json index 4ca9b0aa44..9919aebcbd 100644 --- a/packages/core/package.json +++ b/packages/core/package.json @@ -57,13 +57,13 @@ }, "homepage": "https://github.com/instana/nodejs/blob/main/packages/core/README.md", "dependencies": { - "@opentelemetry/api": "1.9.0", + "@opentelemetry/api": ">=1.3.0 <1.10.0", "@opentelemetry/context-async-hooks": "1.25.0", - "@opentelemetry/instrumentation-fs": "0.12.0", + "@opentelemetry/instrumentation-fs": "0.26.0", "@opentelemetry/instrumentation-oracledb": "0.32.0", - "@opentelemetry/instrumentation-restify": "0.38.0", - "@opentelemetry/instrumentation-socket.io": "0.39.0", - "@opentelemetry/instrumentation-tedious": "0.13.0", + "@opentelemetry/instrumentation-restify": "0.52.0", + "@opentelemetry/instrumentation-socket.io": "0.53.0", + "@opentelemetry/instrumentation-tedious": "0.25.0", "@opentelemetry/sdk-trace-base": "1.25.0", "cls-bluebird": "^2.1.0", "import-in-the-middle": "1.15.0", @@ -74,6 +74,9 @@ "semver": "^7.7.3", "shimmer": "^1.2.1" }, + "peerDependencies": { + "@opentelemetry/api": ">=1.3.0 <1.10.0" + }, "overrides": { "debug": "^4.4.3" } diff --git a/packages/core/src/tracing/opentelemetry-instrumentations/fs.js b/packages/core/src/tracing/opentelemetry-instrumentations/fs.js index c59239f1ce..e4e8d01567 100644 --- a/packages/core/src/tracing/opentelemetry-instrumentations/fs.js +++ b/packages/core/src/tracing/opentelemetry-instrumentations/fs.js @@ -5,9 +5,8 @@ 'use strict'; // NOTE: otel fs instrumentation does not capture the file name currently -module.exports.init = cls => { +module.exports.init = ({ cls, api }) => { const constants = require('../constants'); - const api = require('@opentelemetry/api'); const { NonRecordingSpan } = require('./files/NonRecordingSpan'); const { FsInstrumentation } = require('@opentelemetry/instrumentation-fs'); diff --git a/packages/core/src/tracing/opentelemetry-instrumentations/opentelemetryApi.js b/packages/core/src/tracing/opentelemetry-instrumentations/opentelemetryApi.js new file mode 100644 index 0000000000..7a62d5e396 --- /dev/null +++ b/packages/core/src/tracing/opentelemetry-instrumentations/opentelemetryApi.js @@ -0,0 +1,31 @@ +/* + * (c) Copyright IBM Corp. 2025 + */ + +'use strict'; + +/** + * Exports the singleton OpenTelemetry API instance from the root-level + * @opentelemetry installation in node_modules. + * + * Resolution Logic: + * 1. Attempt to resolve @opentelemetry/api from the current working directory (root-level). + * 2. If not found, fall back to a nested (child) installation of @opentelemetry/api. + * + * This ensures that all instrumentations share the same API instance when possible, + * avoiding conflicts that can arise when multiple versions (root vs nested) + * are loaded within the same process. + * +* Example structure: + * ├── node_modules/@opentelemetry/api/ # root (preferred) + * └── packages/service/node_modules/@opentelemetry/api/ # fallback + */ +let api; + +try { + api = require(require.resolve('@opentelemetry/api', { paths: [process.cwd()] })); +} catch { + api = require('@opentelemetry/api'); +} + +module.exports = api; diff --git a/packages/core/src/tracing/opentelemetry-instrumentations/wrap.js b/packages/core/src/tracing/opentelemetry-instrumentations/wrap.js index 20d0f82d21..0ed8060757 100644 --- a/packages/core/src/tracing/opentelemetry-instrumentations/wrap.js +++ b/packages/core/src/tracing/opentelemetry-instrumentations/wrap.js @@ -6,10 +6,10 @@ 'use strict'; const { AsyncHooksContextManager } = require('@opentelemetry/context-async-hooks'); -const api = require('@opentelemetry/api'); const { BasicTracerProvider } = require('@opentelemetry/sdk-trace-base'); const constants = require('../constants'); const supportedVersion = require('../supportedVersion'); +const api = require('./opentelemetryApi'); // NOTE: Please refrain from utilizing third-party instrumentations. // Instead, opt for officially released instrumentations available in the OpenTelemetry @@ -35,7 +35,7 @@ module.exports.init = (_config, cls) => { Object.keys(instrumentations).forEach(k => { const value = instrumentations[k]; const instrumentation = require(`./${value.name}`); - instrumentation.init(cls); + instrumentation.init({ cls, api: api }); value.module = instrumentation; }); @@ -93,25 +93,29 @@ module.exports.init = (_config, cls) => { } }; - const provider = new BasicTracerProvider(); - const contextManager = new AsyncHooksContextManager(); - - api.trace.setGlobalTracerProvider(provider); - api.context.setGlobalContextManager(contextManager); - /** - * Each instrumentation depends on @opentelemetry/instrumentation. - * @opentelemetry/instrumentation has a peer dependency to @opentelemetry/api. + * OpenTelemetry initializes with a ProxyTracerProvider as the default global tracer provider + * when no actual provider has been registered yet. Initially, all tracer requests are routed + * through this proxy until a concrete TracerProvider (e.g., BasicTracerProvider or NodeTracerProvider) is registered. + * + * The OTEL API implementation ensures that if a concrete TracerProvider has already been registered and delegated, + * subsequent calls to set the global provider(setGlobalTracerProvider) are ignored. This prevents + * accidental configuration overrides and maintains telemetry consistency. * - * Every instrumentation is based on @opentelemetry/instrumentation. - * We need to install an older version of @opentelemetry/instrumentation on root, - * to AVOID that the e.g. the tedious instrumentation loads - * the root @opentelemetry/instrumentation. Because otherwise - * we will load two different instances of @openetelemetry/api. - * And then we will get NonRecordingSpan instances when running the tests. + * Therefore, setGlobalTracerProvider will only register our provider(BasicTracerProvider) if none is currently set. + * (Handled internally by the OTEL API — see: + * https://github.com/open-telemetry/opentelemetry-js/blob/main/api/src/internal/global-utils.ts#L37) + * + * The same approach applies to the global context manager. * - * This is an npm workspace issue. Nohoisting missing. */ + const provider = new BasicTracerProvider(); + api.trace.setGlobalTracerProvider(provider); + + const contextManager = new AsyncHooksContextManager(); + contextManager.enable(); + api.context.setGlobalContextManager(contextManager); + const orig = api.trace.setSpan; api.trace.setSpan = function instanaSetSpan(ctx, span) { transformToInstanaSpan(span); diff --git a/packages/core/test/tracing/opentelemetry/otelApi_test.js b/packages/core/test/tracing/opentelemetry/otelApi_test.js new file mode 100644 index 0000000000..4d189c7ef5 --- /dev/null +++ b/packages/core/test/tracing/opentelemetry/otelApi_test.js @@ -0,0 +1,97 @@ +/* + * (c) Copyright IBM Corp. 2025 + */ + +'use strict'; + +const path = require('path'); +const fs = require('fs'); +const Module = require('module'); +const { expect } = require('chai'); + +describe('opentelemetry/api module', () => { + let tempDir; + let originalCwd; + let originalResolve; + + before(() => { + tempDir = fs.mkdtempSync(path.join(__dirname, 'tempDir-')); + originalCwd = process.cwd(); + process.chdir(tempDir); + + const makeModule = (filePath, content) => { + fs.mkdirSync(path.dirname(filePath), { recursive: true }); + fs.writeFileSync(filePath, content); + }; + + /** + * test structure: + * + * ├── node_modules/ + * │ └── @opentelemetry/ + * │ └── api/ # root API + * │ └── index.js + * └── packages/ + * └── service/ + * └── node_modules/ + * └── @opentelemetry/ + * └── api/ # fallback API + * └── index.js + */ + makeModule( + path.join(tempDir, 'node_modules/@opentelemetry/api/index.js'), + "module.exports = { __source: 'root-api' };" + ); + + makeModule( + path.join(tempDir, 'packages/service/node_modules/@opentelemetry/api/index.js'), + "module.exports = { __source: 'child-api' };" + ); + + originalResolve = Module._resolveFilename; + Module._resolveFilename = function (request, parent, isMain, options) { + if (request === '@opentelemetry/api') { + const rootApi = path.join(tempDir, 'node_modules/@opentelemetry/api/index.js'); + const childApi = path.join(tempDir, 'packages/service/node_modules/@opentelemetry/api/index.js'); + + if (options?.paths?.includes(process.cwd())) { + if (fs.existsSync(path.join(process.cwd(), 'node_modules/@opentelemetry/api/index.js'))) { + return path.join(process.cwd(), 'node_modules/@opentelemetry/api/index.js'); + } + throw new Error('Cannot find local module'); + } + + if (fs.existsSync(rootApi)) return rootApi; + if (fs.existsSync(childApi)) return childApi; + } + + return originalResolve.call(this, request, parent, isMain, options); + }; + }); + + after(() => { + process.chdir(originalCwd); + Module._resolveFilename = originalResolve; + fs.rmSync(tempDir, { recursive: true, force: true }); + }); + + it('should load @opentelemetry/api from the root-level node_modules by default', () => { + process.chdir(tempDir); + + delete require.cache[require.resolve('../../../src/tracing/opentelemetry-instrumentations/opentelemetryApi')]; + const otelApi = require('../../../src/tracing/opentelemetry-instrumentations/opentelemetryApi'); + + expect(otelApi.__source).to.equal('root-api'); + }); + + it('should fall back to @opentelemetry/api in child node_modules if root-level is missing', () => { + fs.rmSync(path.join(tempDir, 'node_modules/@opentelemetry'), { recursive: true, force: true }); + + const nestedPath = path.join(tempDir, 'packages/service'); + process.chdir(nestedPath); + + delete require.cache[require.resolve('../../../src/tracing/opentelemetry-instrumentations/opentelemetryApi')]; + const otelApi = require('../../../src/tracing/opentelemetry-instrumentations/opentelemetryApi'); + expect(otelApi.__source).to.equal('child-api'); + }); +});