diff --git a/CHANGELOG.md b/CHANGELOG.md index 092f7354900..9bb804d545a 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -27,6 +27,7 @@ For notes on migrating to 2.x / 0.200.x see [the upgrade guide](doc/upgrade-to-2 * chore: enforce `import type` for type-only imports via ESLint [#6467](https://github.com/open-telemetry/opentelemetry-js/pull/6467) @overbalance * perf(sdk-trace-base): avoid Object.entries in Span.setAttributes [#6514](https://github.com/open-telemetry/opentelemetry-js/pull/6514) @daniellockyer * perf(sdk-trace-base): optimize `Span.{addEvent,addLink}` performance [#6516](https://github.com/open-telemetry/opentelemetry-js/pull/6516) @daniellockyer +* test(bundlers): broaden bundler test coverage and assert known protobuf dynamic-require failures [#6482](https://github.com/open-telemetry/opentelemetry-js/pull/6482) @overbalance ## 2.6.0 diff --git a/bundler-tests/browser/nextjs-15-edge/middleware.js b/bundler-tests/browser/nextjs-15-edge/middleware.js index 00158646dfb..d3cb236ba88 100644 --- a/bundler-tests/browser/nextjs-15-edge/middleware.js +++ b/bundler-tests/browser/nextjs-15-edge/middleware.js @@ -1,8 +1,52 @@ +import { DiagConsoleLogger, diag } from '@opentelemetry/api'; +import { logs } from '@opentelemetry/api-logs'; +import { W3CTraceContextPropagator } from '@opentelemetry/core'; +import { OTLPLogExporter } from '@opentelemetry/exporter-logs-otlp-http'; +import { OTLPMetricExporter } from '@opentelemetry/exporter-metrics-otlp-http'; +import { OTLPTraceExporter } from '@opentelemetry/exporter-trace-otlp-http'; +import { InstrumentationBase } from '@opentelemetry/instrumentation'; +import { FetchInstrumentation } from '@opentelemetry/instrumentation-fetch'; +import { XMLHttpRequestInstrumentation } from '@opentelemetry/instrumentation-xml-http-request'; +import { browserDetector } from '@opentelemetry/opentelemetry-browser-detector'; +import { B3Propagator } from '@opentelemetry/propagator-b3'; import { defaultServiceName } from '@opentelemetry/resources'; +import { + LoggerProvider, + SimpleLogRecordProcessor, +} from '@opentelemetry/sdk-logs'; +import { MeterProvider } from '@opentelemetry/sdk-metrics'; +import { BasicTracerProvider } from '@opentelemetry/sdk-trace-base'; +import { WebTracerProvider } from '@opentelemetry/sdk-trace-web'; + +diag.setLogger(new DiagConsoleLogger()); + +logs.setGlobalLoggerProvider( + new LoggerProvider({ + processors: [new SimpleLogRecordProcessor(new OTLPLogExporter())], + }) +); + +class TestInstrumentation extends InstrumentationBase { + init() { + return []; + } +} export function middleware(request) { const serviceName = defaultServiceName(); - console.log('Service name:', serviceName); + const logger = logs.getLogger('bundle-test-nextjs-edge'); + logger.emit({ body: serviceName, eventName: 'custom.event' }); + new TestInstrumentation('test', '0.0.0'); + new BasicTracerProvider(); + new MeterProvider(); + new OTLPTraceExporter(); + new OTLPMetricExporter(); + new W3CTraceContextPropagator(); + new B3Propagator(); + new WebTracerProvider(); + new FetchInstrumentation(); + new XMLHttpRequestInstrumentation(); + void browserDetector; return Response.next(); } diff --git a/bundler-tests/browser/nextjs-15-edge/package.json b/bundler-tests/browser/nextjs-15-edge/package.json index c23ac0836f7..2e7eb5c61aa 100644 --- a/bundler-tests/browser/nextjs-15-edge/package.json +++ b/bundler-tests/browser/nextjs-15-edge/package.json @@ -1,13 +1,28 @@ { - "name": "nextjs-15-edge-bundle-test", + "name": "bundler-tests-browser-nextjs-15-edge", "type": "module", "private": true, "scripts": { "build": "rm -rf .next && next build", - "test:bundle": "npm i && npm run build" + "test:bundle": "npm i && node test-bundle.mjs" }, "dependencies": { + "@opentelemetry/api": "file:../../../api", + "@opentelemetry/api-logs": "file:../../../experimental/packages/api-logs", + "@opentelemetry/core": "file:../../../packages/opentelemetry-core", + "@opentelemetry/exporter-logs-otlp-http": "file:../../../experimental/packages/exporter-logs-otlp-http", + "@opentelemetry/exporter-metrics-otlp-http": "file:../../../experimental/packages/opentelemetry-exporter-metrics-otlp-http", + "@opentelemetry/exporter-trace-otlp-http": "file:../../../experimental/packages/exporter-trace-otlp-http", + "@opentelemetry/instrumentation": "file:../../../experimental/packages/opentelemetry-instrumentation", + "@opentelemetry/instrumentation-fetch": "file:../../../experimental/packages/opentelemetry-instrumentation-fetch", + "@opentelemetry/instrumentation-xml-http-request": "file:../../../experimental/packages/opentelemetry-instrumentation-xml-http-request", + "@opentelemetry/opentelemetry-browser-detector": "file:../../../experimental/packages/opentelemetry-browser-detector", + "@opentelemetry/propagator-b3": "file:../../../packages/opentelemetry-propagator-b3", "@opentelemetry/resources": "file:../../../packages/opentelemetry-resources", + "@opentelemetry/sdk-logs": "file:../../../experimental/packages/sdk-logs", + "@opentelemetry/sdk-metrics": "file:../../../packages/sdk-metrics", + "@opentelemetry/sdk-trace-base": "file:../../../packages/opentelemetry-sdk-trace-base", + "@opentelemetry/sdk-trace-web": "file:../../../packages/opentelemetry-sdk-trace-web", "next": "^15", "react": "^18", "react-dom": "^18" diff --git a/bundler-tests/browser/nextjs-15-edge/project.json b/bundler-tests/browser/nextjs-15-edge/project.json index 49d53202949..1e3d86caf25 100644 --- a/bundler-tests/browser/nextjs-15-edge/project.json +++ b/bundler-tests/browser/nextjs-15-edge/project.json @@ -1,3 +1,3 @@ { - "name": "nextjs-15-edge-bundle-test" + "name": "bundler-tests-browser-nextjs-15-edge" } diff --git a/bundler-tests/browser/nextjs-15-edge/test-bundle.mjs b/bundler-tests/browser/nextjs-15-edge/test-bundle.mjs new file mode 100644 index 00000000000..6297f88035c --- /dev/null +++ b/bundler-tests/browser/nextjs-15-edge/test-bundle.mjs @@ -0,0 +1,37 @@ +/** + * Runs the Next.js 15 edge build and asserts the known protobuf Dynamic Code + * Evaluation error. This exit(0) is intentional: the test passes while the bug + * exists and will break when it is fixed, signalling that this file should be + * removed and test:bundle should revert to just `npm run build`. + */ +import { spawnSync } from 'node:child_process'; +import { fileURLToPath } from 'node:url'; +import { dirname } from 'node:path'; + +const testDir = dirname(fileURLToPath(import.meta.url)); + +const result = spawnSync('npm', ['run', 'build'], { + cwd: testDir, + encoding: 'utf-8', + shell: false, +}); + +const output = (result.stdout ?? '') + (result.stderr ?? ''); +const buildFailed = result.status !== 0; +const hasExpectedError = + /Dynamic Code Evaluation/.test(output) && /protobuf/i.test(output); + +if (!buildFailed) { + console.error( + 'Build succeeded — expected protobuf Dynamic Code Evaluation error.\n' + + 'The underlying bug may be fixed. Update this test.' + ); + process.exit(1); +} + +if (!hasExpectedError) { + console.error('Build failed for an unexpected reason:\n', output); + process.exit(1); +} + +console.log('Known protobuf Dynamic Code Evaluation build failure confirmed'); diff --git a/bundler-tests/browser/nextjs-16-edge/app/api/test/route.js b/bundler-tests/browser/nextjs-16-edge/app/api/test/route.js index 0835276d060..a9d9d440fa3 100644 --- a/bundler-tests/browser/nextjs-16-edge/app/api/test/route.js +++ b/bundler-tests/browser/nextjs-16-edge/app/api/test/route.js @@ -1,9 +1,54 @@ +import { DiagConsoleLogger, diag } from '@opentelemetry/api'; +import { logs } from '@opentelemetry/api-logs'; +import { W3CTraceContextPropagator } from '@opentelemetry/core'; +import { OTLPLogExporter } from '@opentelemetry/exporter-logs-otlp-http'; +import { OTLPMetricExporter } from '@opentelemetry/exporter-metrics-otlp-http'; +import { OTLPTraceExporter } from '@opentelemetry/exporter-trace-otlp-http'; +import { InstrumentationBase } from '@opentelemetry/instrumentation'; +import { FetchInstrumentation } from '@opentelemetry/instrumentation-fetch'; +import { XMLHttpRequestInstrumentation } from '@opentelemetry/instrumentation-xml-http-request'; +import { browserDetector } from '@opentelemetry/opentelemetry-browser-detector'; +import { B3Propagator } from '@opentelemetry/propagator-b3'; import { defaultServiceName } from '@opentelemetry/resources'; +import { + LoggerProvider, + SimpleLogRecordProcessor, +} from '@opentelemetry/sdk-logs'; +import { MeterProvider } from '@opentelemetry/sdk-metrics'; +import { BasicTracerProvider } from '@opentelemetry/sdk-trace-base'; +import { WebTracerProvider } from '@opentelemetry/sdk-trace-web'; export const runtime = 'edge'; +diag.setLogger(new DiagConsoleLogger()); + +logs.setGlobalLoggerProvider( + new LoggerProvider({ + processors: [new SimpleLogRecordProcessor(new OTLPLogExporter())], + }) +); + +class TestInstrumentation extends InstrumentationBase { + init() { + return []; + } +} + export function GET(request) { const serviceName = defaultServiceName(); + const logger = logs.getLogger('bundle-test-nextjs-edge'); + logger.emit({ body: 'test-event-body', eventName: 'custom.event' }); + new TestInstrumentation('test', '0.0.0'); + new BasicTracerProvider(); + new MeterProvider(); + new OTLPTraceExporter(); + new OTLPMetricExporter(); + new W3CTraceContextPropagator(); + new B3Propagator(); + new WebTracerProvider(); + new FetchInstrumentation(); + new XMLHttpRequestInstrumentation(); + void browserDetector; return new Response(JSON.stringify({ serviceName }), { headers: { 'Content-Type': 'application/json' }, }); diff --git a/bundler-tests/browser/nextjs-16-edge/package.json b/bundler-tests/browser/nextjs-16-edge/package.json index 3668d76cde5..f132749058d 100644 --- a/bundler-tests/browser/nextjs-16-edge/package.json +++ b/bundler-tests/browser/nextjs-16-edge/package.json @@ -1,13 +1,28 @@ { - "name": "nextjs-16-edge-bundle-test", + "name": "bundler-tests-browser-nextjs-16-edge", "type": "module", "private": true, "scripts": { "build": "rm -rf .next && next build", - "test:bundle": "npm i && npx tsx next.test.ts" + "test:bundle": "npm i && node test-bundle.mjs" }, "dependencies": { + "@opentelemetry/api": "file:../../../api", + "@opentelemetry/api-logs": "file:../../../experimental/packages/api-logs", + "@opentelemetry/core": "file:../../../packages/opentelemetry-core", + "@opentelemetry/exporter-logs-otlp-http": "file:../../../experimental/packages/exporter-logs-otlp-http", + "@opentelemetry/exporter-metrics-otlp-http": "file:../../../experimental/packages/opentelemetry-exporter-metrics-otlp-http", + "@opentelemetry/exporter-trace-otlp-http": "file:../../../experimental/packages/exporter-trace-otlp-http", + "@opentelemetry/instrumentation": "file:../../../experimental/packages/opentelemetry-instrumentation", + "@opentelemetry/instrumentation-fetch": "file:../../../experimental/packages/opentelemetry-instrumentation-fetch", + "@opentelemetry/instrumentation-xml-http-request": "file:../../../experimental/packages/opentelemetry-instrumentation-xml-http-request", + "@opentelemetry/opentelemetry-browser-detector": "file:../../../experimental/packages/opentelemetry-browser-detector", + "@opentelemetry/propagator-b3": "file:../../../packages/opentelemetry-propagator-b3", "@opentelemetry/resources": "file:../../../packages/opentelemetry-resources", + "@opentelemetry/sdk-logs": "file:../../../experimental/packages/sdk-logs", + "@opentelemetry/sdk-metrics": "file:../../../packages/sdk-metrics", + "@opentelemetry/sdk-trace-base": "file:../../../packages/opentelemetry-sdk-trace-base", + "@opentelemetry/sdk-trace-web": "file:../../../packages/opentelemetry-sdk-trace-web", "next": "^16", "react": "^19", "react-dom": "^19" diff --git a/bundler-tests/browser/nextjs-16-edge/project.json b/bundler-tests/browser/nextjs-16-edge/project.json index 4fe165dfc53..f4133bcfbe4 100644 --- a/bundler-tests/browser/nextjs-16-edge/project.json +++ b/bundler-tests/browser/nextjs-16-edge/project.json @@ -1,3 +1,3 @@ { - "name": "nextjs-16-edge-bundle-test" + "name": "bundler-tests-browser-nextjs-16-edge" } diff --git a/bundler-tests/browser/nextjs-16-edge/next.test.ts b/bundler-tests/browser/nextjs-16-edge/test-bundle.mjs similarity index 100% rename from bundler-tests/browser/nextjs-16-edge/next.test.ts rename to bundler-tests/browser/nextjs-16-edge/test-bundle.mjs diff --git a/bundler-tests/browser/webpack-4/index.html b/bundler-tests/browser/webpack-4/index.html deleted file mode 100644 index 6782dc02ac4..00000000000 --- a/bundler-tests/browser/webpack-4/index.html +++ /dev/null @@ -1,14 +0,0 @@ - - - - - OpenTelemetry example - - - - - Example of using the OpenTelemetry Logs SDK -
- - - diff --git a/bundler-tests/browser/webpack-4/package.json b/bundler-tests/browser/webpack-4/package.json index f3ae814d55c..48dd2b3dc53 100644 --- a/bundler-tests/browser/webpack-4/package.json +++ b/bundler-tests/browser/webpack-4/package.json @@ -1,42 +1,34 @@ { - "name": "webpack-4-bundle-test", + "name": "bundler-tests-browser-webpack-4", "private": true, - "version": "0.208.0", - "description": "Test app for logs in webpack 4", "type": "module", "scripts": { - "test:bundle": "npm i && webpack --config webpack.config.mjs" + "test:bundle": "npm i && node test-bundle.mjs" }, - "repository": { - "type": "git", - "url": "git+ssh://git@github.com/open-telemetry/opentelemetry-js.git" - }, - "keywords": [ - "opentelemetry", - "web", - "events" - ], - "engines": { - "node": "^18.19.0 || >=20.6.0" - }, - "author": "OpenTelemetry Authors", - "license": "Apache-2.0", - "bugs": { - "url": "https://github.com/open-telemetry/opentelemetry-js/issues" + "dependencies": { + "@opentelemetry/api": "file:../../../api", + "@opentelemetry/api-logs": "file:../../../experimental/packages/api-logs", + "@opentelemetry/core": "file:../../../packages/opentelemetry-core", + "@opentelemetry/exporter-logs-otlp-http": "file:../../../experimental/packages/exporter-logs-otlp-http", + "@opentelemetry/exporter-metrics-otlp-http": "file:../../../experimental/packages/opentelemetry-exporter-metrics-otlp-http", + "@opentelemetry/exporter-trace-otlp-http": "file:../../../experimental/packages/exporter-trace-otlp-http", + "@opentelemetry/instrumentation": "file:../../../experimental/packages/opentelemetry-instrumentation", + "@opentelemetry/instrumentation-fetch": "file:../../../experimental/packages/opentelemetry-instrumentation-fetch", + "@opentelemetry/instrumentation-xml-http-request": "file:../../../experimental/packages/opentelemetry-instrumentation-xml-http-request", + "@opentelemetry/opentelemetry-browser-detector": "file:../../../experimental/packages/opentelemetry-browser-detector", + "@opentelemetry/propagator-b3": "file:../../../packages/opentelemetry-propagator-b3", + "@opentelemetry/resources": "file:../../../packages/opentelemetry-resources", + "@opentelemetry/sdk-logs": "file:../../../experimental/packages/sdk-logs", + "@opentelemetry/sdk-metrics": "file:../../../packages/sdk-metrics", + "@opentelemetry/sdk-trace-base": "file:../../../packages/opentelemetry-sdk-trace-base", + "@opentelemetry/sdk-trace-web": "file:../../../packages/opentelemetry-sdk-trace-web" }, "devDependencies": { "@babel/core": "^7.28.5", "@babel/preset-env": "^7.28.5", + "@types/webpack": "^4", "babel-loader": "^8.0.0", - "html-webpack-plugin": "^4.5.2", "webpack": "^4", "webpack-cli": "^4" - }, - "dependencies": { - "@opentelemetry/api": "file:../../../api", - "@opentelemetry/api-logs": "file:../../../experimental/packages/api-logs", - "@opentelemetry/exporter-logs-otlp-http": "file:../../../experimental/packages/exporter-logs-otlp-http", - "@opentelemetry/sdk-logs": "file:../../../experimental/packages/sdk-logs" - }, - "homepage": "https://github.com/open-telemetry/opentelemetry-js/tree/main/bundler-tests/browser/webpack-4" + } } diff --git a/bundler-tests/browser/webpack-4/project.json b/bundler-tests/browser/webpack-4/project.json index 4b693cd2b5e..3cfe6c9b8c6 100644 --- a/bundler-tests/browser/webpack-4/project.json +++ b/bundler-tests/browser/webpack-4/project.json @@ -1,3 +1,3 @@ { - "name": "webpack-4-bundle-test" + "name": "bundler-tests-browser-webpack-4" } diff --git a/bundler-tests/browser/webpack-4/src/index.js b/bundler-tests/browser/webpack-4/src/index.js index 20129b60444..25ade8465c3 100644 --- a/bundler-tests/browser/webpack-4/src/index.js +++ b/bundler-tests/browser/webpack-4/src/index.js @@ -1,18 +1,51 @@ -import { setupOpenTelemetry } from './opentelemetry.js'; +import { DiagConsoleLogger, diag } from '@opentelemetry/api'; import { logs } from '@opentelemetry/api-logs'; +import { W3CTraceContextPropagator } from '@opentelemetry/core'; +import { OTLPLogExporter } from '@opentelemetry/exporter-logs-otlp-http'; +import { OTLPMetricExporter } from '@opentelemetry/exporter-metrics-otlp-http'; +import { OTLPTraceExporter } from '@opentelemetry/exporter-trace-otlp-http'; +import { InstrumentationBase } from '@opentelemetry/instrumentation'; +import { FetchInstrumentation } from '@opentelemetry/instrumentation-fetch'; +import { XMLHttpRequestInstrumentation } from '@opentelemetry/instrumentation-xml-http-request'; +import { browserDetector } from '@opentelemetry/opentelemetry-browser-detector'; +import { B3Propagator } from '@opentelemetry/propagator-b3'; +import { defaultServiceName } from '@opentelemetry/resources'; +import { + LoggerProvider, + SimpleLogRecordProcessor, +} from '@opentelemetry/sdk-logs'; +import { MeterProvider } from '@opentelemetry/sdk-metrics'; +import { BasicTracerProvider } from '@opentelemetry/sdk-trace-base'; +import { WebTracerProvider } from '@opentelemetry/sdk-trace-web'; -// Setup SDK and register with API, then obtain logger from API. -setupOpenTelemetry(); -const logger = logs.getLogger('bundle-test-webpack'); +diag.setLogger(new DiagConsoleLogger()); + +logs.setGlobalLoggerProvider( + new LoggerProvider({ + processors: [new SimpleLogRecordProcessor(new OTLPLogExporter())], + }) +); -window.addEventListener('load', () => { - console.log('loaded'); - const emitEventButton = document.getElementById('emit-event-button'); - emitEventButton.addEventListener('click', () => { - console.log('clicked'); - logger.emit({ - body: 'test-event-body', - eventName: 'custom.event', - }); - }); +const logger = logs.getLogger('bundle-test-webpack'); +logger.emit({ + body: defaultServiceName(), + eventName: 'custom.event', }); + +class TestInstrumentation extends InstrumentationBase { + init() { + return []; + } +} + +new TestInstrumentation('test', '0.0.0'); +new BasicTracerProvider(); +new MeterProvider(); +new OTLPTraceExporter(); +new OTLPMetricExporter(); +new W3CTraceContextPropagator(); +new B3Propagator(); +new WebTracerProvider(); +new FetchInstrumentation(); +new XMLHttpRequestInstrumentation(); +void browserDetector; diff --git a/bundler-tests/browser/webpack-4/src/opentelemetry.js b/bundler-tests/browser/webpack-4/src/opentelemetry.js deleted file mode 100644 index e75013bf29d..00000000000 --- a/bundler-tests/browser/webpack-4/src/opentelemetry.js +++ /dev/null @@ -1,25 +0,0 @@ -import { logs } from '@opentelemetry/api-logs'; -import { diag, DiagConsoleLogger } from '@opentelemetry/api'; -import { OTLPLogExporter } from '@opentelemetry/exporter-logs-otlp-http'; -import { - LoggerProvider, - SimpleLogRecordProcessor, -} from '@opentelemetry/sdk-logs'; - -export function setupOpenTelemetry() { - // setup diagnostics - diag.setLogger({ - logger: new DiagConsoleLogger(), - options: { - logLevel: 'info', - }, - }); - - // setup logs - logs.setGlobalLoggerProvider( - new LoggerProvider({ - // SimpleLogRecordProcessor is for testing only, do not use in production. - processors: [new SimpleLogRecordProcessor(new OTLPLogExporter())], - }) - ); -} diff --git a/bundler-tests/browser/webpack-4/test-bundle.mjs b/bundler-tests/browser/webpack-4/test-bundle.mjs new file mode 100644 index 00000000000..be40d8f2ad0 --- /dev/null +++ b/bundler-tests/browser/webpack-4/test-bundle.mjs @@ -0,0 +1,30 @@ +/* + * Copyright The OpenTelemetry Authors + * SPDX-License-Identifier: Apache-2.0 + */ + +import webpack from 'webpack'; +import config from './webpack.config.mjs'; + +const compiler = webpack(config); + +compiler.run((err, stats) => { + if (compiler.close) compiler.close(() => {}); + + if (err) { + console.error(err); + process.exit(1); + } + + if (stats.hasErrors()) { + console.error(stats.compilation.errors.map(e => e.message).join('\n')); + process.exit(1); + } + + if (stats.hasWarnings()) { + console.error(stats.compilation.warnings.map(w => w.message).join('\n')); + process.exit(1); + } + + console.log('webpack 4 build succeeded for browser'); +}); diff --git a/bundler-tests/browser/webpack-4/webpack.config.mjs b/bundler-tests/browser/webpack-4/webpack.config.mjs index b9e8adf90cd..a2cb22ef5e9 100644 --- a/bundler-tests/browser/webpack-4/webpack.config.mjs +++ b/bundler-tests/browser/webpack-4/webpack.config.mjs @@ -1,13 +1,14 @@ -import { fileURLToPath } from 'url'; -import path from 'path'; -import HtmlWebpackPlugin from 'html-webpack-plugin'; +import path from 'node:path'; +import { fileURLToPath } from 'node:url'; const __dirname = path.dirname(fileURLToPath(import.meta.url)); /** @type {import('./node_modules/@types/webpack').Configuration} */ export default { - mode: 'development', + mode: 'production', entry: './src/index.js', + target: 'web', + performance: { hints: false }, output: { filename: 'bundle.js', path: path.resolve(__dirname, 'dist'), @@ -34,15 +35,4 @@ export default { }, ], }, - devServer: { - static: { - directory: path.resolve(__dirname, 'dist/'), - }, - }, - plugins: [ - new HtmlWebpackPlugin({ - title: 'Development', - template: 'index.html', - }), - ], }; diff --git a/bundler-tests/browser/webpack-5/index.html b/bundler-tests/browser/webpack-5/index.html deleted file mode 100644 index 6782dc02ac4..00000000000 --- a/bundler-tests/browser/webpack-5/index.html +++ /dev/null @@ -1,14 +0,0 @@ - - - - - OpenTelemetry example - - - - - Example of using the OpenTelemetry Logs SDK -
- - - diff --git a/bundler-tests/browser/webpack-5/package.json b/bundler-tests/browser/webpack-5/package.json index 4a2d358dc23..44e6e32bd7e 100644 --- a/bundler-tests/browser/webpack-5/package.json +++ b/bundler-tests/browser/webpack-5/package.json @@ -1,41 +1,32 @@ { - "name": "webpack-5-bundle-test", + "name": "bundler-tests-browser-webpack-5", "private": true, - "version": "0.208.0", - "description": "Test app for logs in webpack 5", "type": "module", "scripts": { - "test:bundle": "npm i && webpack --config webpack.config.mjs", + "test:bundle": "npm i && node test-bundle.mjs", "start": "npm i && webpack serve --config webpack.config.mjs --open" }, - "repository": { - "type": "git", - "url": "git+ssh://git@github.com/open-telemetry/opentelemetry-js.git" - }, - "keywords": [ - "opentelemetry", - "web", - "events" - ], - "engines": { - "node": "^18.19.0 || >=20.6.0" - }, - "author": "OpenTelemetry Authors", - "license": "Apache-2.0", - "bugs": { - "url": "https://github.com/open-telemetry/opentelemetry-js/issues" - }, - "devDependencies": { - "html-webpack-plugin": "^5", - "webpack": "^5", - "webpack-cli": "^6", - "webpack-dev-server": "^5" - }, "dependencies": { "@opentelemetry/api": "file:../../../api", "@opentelemetry/api-logs": "file:../../../experimental/packages/api-logs", + "@opentelemetry/core": "file:../../../packages/opentelemetry-core", "@opentelemetry/exporter-logs-otlp-http": "file:../../../experimental/packages/exporter-logs-otlp-http", - "@opentelemetry/sdk-logs": "file:../../../experimental/packages/sdk-logs" + "@opentelemetry/exporter-metrics-otlp-http": "file:../../../experimental/packages/opentelemetry-exporter-metrics-otlp-http", + "@opentelemetry/exporter-trace-otlp-http": "file:../../../experimental/packages/exporter-trace-otlp-http", + "@opentelemetry/instrumentation": "file:../../../experimental/packages/opentelemetry-instrumentation", + "@opentelemetry/instrumentation-fetch": "file:../../../experimental/packages/opentelemetry-instrumentation-fetch", + "@opentelemetry/instrumentation-xml-http-request": "file:../../../experimental/packages/opentelemetry-instrumentation-xml-http-request", + "@opentelemetry/opentelemetry-browser-detector": "file:../../../experimental/packages/opentelemetry-browser-detector", + "@opentelemetry/propagator-b3": "file:../../../packages/opentelemetry-propagator-b3", + "@opentelemetry/resources": "file:../../../packages/opentelemetry-resources", + "@opentelemetry/sdk-logs": "file:../../../experimental/packages/sdk-logs", + "@opentelemetry/sdk-metrics": "file:../../../packages/sdk-metrics", + "@opentelemetry/sdk-trace-base": "file:../../../packages/opentelemetry-sdk-trace-base", + "@opentelemetry/sdk-trace-web": "file:../../../packages/opentelemetry-sdk-trace-web" }, - "homepage": "https://github.com/open-telemetry/opentelemetry-js/tree/main/bundler-tests/browser/webpack-5" + "devDependencies": { + "@types/webpack": "^5", + "webpack": "^5", + "webpack-cli": "^6" + } } diff --git a/bundler-tests/browser/webpack-5/project.json b/bundler-tests/browser/webpack-5/project.json index 333c63e183b..d812d66a20c 100644 --- a/bundler-tests/browser/webpack-5/project.json +++ b/bundler-tests/browser/webpack-5/project.json @@ -1,3 +1,3 @@ { - "name": "webpack-5-bundle-test" + "name": "bundler-tests-browser-webpack-5" } diff --git a/bundler-tests/browser/webpack-5/src/index.js b/bundler-tests/browser/webpack-5/src/index.js index 42555bf6669..25ade8465c3 100644 --- a/bundler-tests/browser/webpack-5/src/index.js +++ b/bundler-tests/browser/webpack-5/src/index.js @@ -1,16 +1,51 @@ -import { setupOpenTelemetry } from './opentelemetry.js'; +import { DiagConsoleLogger, diag } from '@opentelemetry/api'; import { logs } from '@opentelemetry/api-logs'; +import { W3CTraceContextPropagator } from '@opentelemetry/core'; +import { OTLPLogExporter } from '@opentelemetry/exporter-logs-otlp-http'; +import { OTLPMetricExporter } from '@opentelemetry/exporter-metrics-otlp-http'; +import { OTLPTraceExporter } from '@opentelemetry/exporter-trace-otlp-http'; +import { InstrumentationBase } from '@opentelemetry/instrumentation'; +import { FetchInstrumentation } from '@opentelemetry/instrumentation-fetch'; +import { XMLHttpRequestInstrumentation } from '@opentelemetry/instrumentation-xml-http-request'; +import { browserDetector } from '@opentelemetry/opentelemetry-browser-detector'; +import { B3Propagator } from '@opentelemetry/propagator-b3'; +import { defaultServiceName } from '@opentelemetry/resources'; +import { + LoggerProvider, + SimpleLogRecordProcessor, +} from '@opentelemetry/sdk-logs'; +import { MeterProvider } from '@opentelemetry/sdk-metrics'; +import { BasicTracerProvider } from '@opentelemetry/sdk-trace-base'; +import { WebTracerProvider } from '@opentelemetry/sdk-trace-web'; -// Setup SDK and register with API, then obtain logger from API. -setupOpenTelemetry(); -const logger = logs.getLogger('bundle-test-webpack'); +diag.setLogger(new DiagConsoleLogger()); + +logs.setGlobalLoggerProvider( + new LoggerProvider({ + processors: [new SimpleLogRecordProcessor(new OTLPLogExporter())], + }) +); -console.log('loaded'); -const emitEventButton = document.getElementById('emit-event-button'); -emitEventButton.addEventListener('click', () => { - console.log('clicked'); - logger.emit({ - body: 'test-event-body', - eventName: 'custom.event', - }); +const logger = logs.getLogger('bundle-test-webpack'); +logger.emit({ + body: defaultServiceName(), + eventName: 'custom.event', }); + +class TestInstrumentation extends InstrumentationBase { + init() { + return []; + } +} + +new TestInstrumentation('test', '0.0.0'); +new BasicTracerProvider(); +new MeterProvider(); +new OTLPTraceExporter(); +new OTLPMetricExporter(); +new W3CTraceContextPropagator(); +new B3Propagator(); +new WebTracerProvider(); +new FetchInstrumentation(); +new XMLHttpRequestInstrumentation(); +void browserDetector; diff --git a/bundler-tests/browser/webpack-5/src/opentelemetry.js b/bundler-tests/browser/webpack-5/src/opentelemetry.js deleted file mode 100644 index e75013bf29d..00000000000 --- a/bundler-tests/browser/webpack-5/src/opentelemetry.js +++ /dev/null @@ -1,25 +0,0 @@ -import { logs } from '@opentelemetry/api-logs'; -import { diag, DiagConsoleLogger } from '@opentelemetry/api'; -import { OTLPLogExporter } from '@opentelemetry/exporter-logs-otlp-http'; -import { - LoggerProvider, - SimpleLogRecordProcessor, -} from '@opentelemetry/sdk-logs'; - -export function setupOpenTelemetry() { - // setup diagnostics - diag.setLogger({ - logger: new DiagConsoleLogger(), - options: { - logLevel: 'info', - }, - }); - - // setup logs - logs.setGlobalLoggerProvider( - new LoggerProvider({ - // SimpleLogRecordProcessor is for testing only, do not use in production. - processors: [new SimpleLogRecordProcessor(new OTLPLogExporter())], - }) - ); -} diff --git a/bundler-tests/browser/webpack-5/test-bundle.mjs b/bundler-tests/browser/webpack-5/test-bundle.mjs new file mode 100644 index 00000000000..f339eacccdd --- /dev/null +++ b/bundler-tests/browser/webpack-5/test-bundle.mjs @@ -0,0 +1,30 @@ +/* + * Copyright The OpenTelemetry Authors + * SPDX-License-Identifier: Apache-2.0 + */ + +import webpack from 'webpack'; +import config from './webpack.config.mjs'; + +const compiler = webpack(config); + +compiler.run((err, stats) => { + if (compiler.close) compiler.close(() => {}); + + if (err) { + console.error(err); + process.exit(1); + } + + if (stats.hasErrors()) { + console.error(stats.compilation.errors.map(e => e.message).join('\n')); + process.exit(1); + } + + if (stats.hasWarnings()) { + console.error(stats.compilation.warnings.map(w => w.message).join('\n')); + process.exit(1); + } + + console.log('webpack 5 build succeeded for browser'); +}); diff --git a/bundler-tests/browser/webpack-5/webpack.config.mjs b/bundler-tests/browser/webpack-5/webpack.config.mjs index 3fcffeb3a2c..c8776ac15a9 100644 --- a/bundler-tests/browser/webpack-5/webpack.config.mjs +++ b/bundler-tests/browser/webpack-5/webpack.config.mjs @@ -1,26 +1,15 @@ -import { fileURLToPath } from 'url'; -import path from 'path'; -import HtmlWebpackPlugin from 'html-webpack-plugin'; +import path from 'node:path'; +import { fileURLToPath } from 'node:url'; const __dirname = path.dirname(fileURLToPath(import.meta.url)); /** @type {import('./node_modules/@types/webpack').Configuration} */ export default { - mode: 'development', + mode: 'production', entry: './src/index.js', + target: 'web', output: { filename: 'bundle.js', path: path.resolve(__dirname, 'dist'), }, - devServer: { - static: { - directory: path.resolve(__dirname, 'dist/'), - }, - }, - plugins: [ - new HtmlWebpackPlugin({ - title: 'Development', - template: 'index.html', - }), - ], }; diff --git a/bundler-tests/node/webpack-4/.npmrc b/bundler-tests/node/webpack-4/.npmrc new file mode 100644 index 00000000000..6c93bcba751 --- /dev/null +++ b/bundler-tests/node/webpack-4/.npmrc @@ -0,0 +1,2 @@ +package-lock=false +install-links=false diff --git a/bundler-tests/node/webpack-4/package.json b/bundler-tests/node/webpack-4/package.json new file mode 100644 index 00000000000..14a006075d9 --- /dev/null +++ b/bundler-tests/node/webpack-4/package.json @@ -0,0 +1,30 @@ +{ + "name": "bundler-tests-node-webpack-4", + "private": true, + "type": "module", + "scripts": { + "test:bundle": "npm i && node test-bundle.mjs" + }, + "dependencies": { + "@opentelemetry/api": "file:../../../api", + "@opentelemetry/api-logs": "file:../../../experimental/packages/api-logs", + "@opentelemetry/core": "file:../../../packages/opentelemetry-core", + "@opentelemetry/exporter-logs-otlp-http": "file:../../../experimental/packages/exporter-logs-otlp-http", + "@opentelemetry/exporter-metrics-otlp-http": "file:../../../experimental/packages/opentelemetry-exporter-metrics-otlp-http", + "@opentelemetry/exporter-trace-otlp-http": "file:../../../experimental/packages/exporter-trace-otlp-http", + "@opentelemetry/instrumentation": "file:../../../experimental/packages/opentelemetry-instrumentation", + "@opentelemetry/propagator-b3": "file:../../../packages/opentelemetry-propagator-b3", + "@opentelemetry/resources": "file:../../../packages/opentelemetry-resources", + "@opentelemetry/sdk-logs": "file:../../../experimental/packages/sdk-logs", + "@opentelemetry/sdk-metrics": "file:../../../packages/sdk-metrics", + "@opentelemetry/sdk-trace-base": "file:../../../packages/opentelemetry-sdk-trace-base" + }, + "devDependencies": { + "@babel/core": "^7.28.5", + "@babel/preset-env": "^7.28.5", + "@types/webpack": "^4", + "babel-loader": "^8.0.0", + "webpack": "^4", + "webpack-cli": "^4" + } +} diff --git a/bundler-tests/node/webpack-4/project.json b/bundler-tests/node/webpack-4/project.json new file mode 100644 index 00000000000..3453d428170 --- /dev/null +++ b/bundler-tests/node/webpack-4/project.json @@ -0,0 +1,3 @@ +{ + "name": "bundler-tests-node-webpack-4" +} diff --git a/bundler-tests/node/webpack-4/src/index.js b/bundler-tests/node/webpack-4/src/index.js new file mode 100644 index 00000000000..61dd4923357 --- /dev/null +++ b/bundler-tests/node/webpack-4/src/index.js @@ -0,0 +1,52 @@ +const { diag, DiagConsoleLogger } = require('@opentelemetry/api'); +const { logs } = require('@opentelemetry/api-logs'); +const { InstrumentationBase } = require('@opentelemetry/instrumentation'); +const { OTLPLogExporter } = require('@opentelemetry/exporter-logs-otlp-http'); +const { + LoggerProvider, + SimpleLogRecordProcessor, +} = require('@opentelemetry/sdk-logs'); +const { W3CTraceContextPropagator } = require('@opentelemetry/core'); +const { + OTLPMetricExporter, +} = require('@opentelemetry/exporter-metrics-otlp-http'); +const { + OTLPTraceExporter, +} = require('@opentelemetry/exporter-trace-otlp-http'); +const { B3Propagator } = require('@opentelemetry/propagator-b3'); +const { defaultServiceName } = require('@opentelemetry/resources'); +const { MeterProvider } = require('@opentelemetry/sdk-metrics'); +const { BasicTracerProvider } = require('@opentelemetry/sdk-trace-base'); + +diag.setLogger({ + logger: new DiagConsoleLogger(), + options: { + logLevel: 'info', + }, +}); + +logs.setGlobalLoggerProvider( + new LoggerProvider({ + processors: [new SimpleLogRecordProcessor(new OTLPLogExporter())], + }) +); + +const logger = logs.getLogger('bundle-test-webpack'); +logger.emit({ + body: defaultServiceName(), + eventName: 'custom.event', +}); + +class TestInstrumentation extends InstrumentationBase { + init() { + return []; + } +} + +new TestInstrumentation('test', '0.0.0'); +new BasicTracerProvider(); +new MeterProvider(); +new OTLPTraceExporter(); +new OTLPMetricExporter(); +new W3CTraceContextPropagator(); +new B3Propagator(); diff --git a/bundler-tests/node/webpack-4/test-bundle.mjs b/bundler-tests/node/webpack-4/test-bundle.mjs new file mode 100644 index 00000000000..1c40e49dd41 --- /dev/null +++ b/bundler-tests/node/webpack-4/test-bundle.mjs @@ -0,0 +1,40 @@ +/* + * Copyright The OpenTelemetry Authors + * SPDX-License-Identifier: Apache-2.0 + */ + +import webpack from 'webpack'; +import config from './webpack.config.mjs'; + +const compiler = webpack(config); + +compiler.run((err, stats) => { + if (compiler.close) compiler.close(() => { }); + + if (err) { + console.error(err); + process.exit(1); + } + + // Assert the known protobuf dynamic-require warning. This exit(0) is intentional: + // the test passes while the bug exists and will break when it is fixed, signalling + // that this block should be removed and warnings should be treated as errors again. + if (stats.hasWarnings() && !stats.hasErrors()) { + const expectedMsg = + 'Critical dependency: require function is used in a way in which dependencies cannot be statically extracted'; + if (stats.compilation.warnings.every(w => w.message === expectedMsg)) + process.exit(0); + } + + if (stats.hasErrors()) { + console.error(stats.compilation.errors.map(e => e.message).join('\n')); + process.exit(1); + } + + if (stats.hasWarnings()) { + console.error(stats.compilation.warnings.map(w => w.message).join('\n')); + process.exit(1); + } + + console.log('webpack 4 build succeeded in Node'); +}); diff --git a/bundler-tests/node/webpack-4/webpack.config.mjs b/bundler-tests/node/webpack-4/webpack.config.mjs new file mode 100644 index 00000000000..48b9ba45c9f --- /dev/null +++ b/bundler-tests/node/webpack-4/webpack.config.mjs @@ -0,0 +1,36 @@ +import path from 'node:path'; +import { fileURLToPath } from 'node:url'; + +const __dirname = path.dirname(fileURLToPath(import.meta.url)); + +/** @type {import('./node_modules/@types/webpack').Configuration} */ +export default { + mode: 'production', + entry: './src/index.js', + target: 'node', + output: { + filename: 'bundle.js', + path: path.resolve(__dirname, 'dist'), + }, + resolve: { + alias: { + // Webpack 4 doesn't support package.json exports field, so we need to manually map the node-http subpath + '@opentelemetry/otlp-exporter-base/node-http': + '@opentelemetry/otlp-exporter-base/build/esm/index-node-http.js', + }, + }, + module: { + rules: [ + { + test: /\.(?:js|mjs|cjs)$/, + exclude: /node_modules\/(?!@opentelemetry)/, + use: { + loader: 'babel-loader', + options: { + presets: [['@babel/preset-env']], + }, + }, + }, + ], + }, +}; diff --git a/bundler-tests/node/webpack-5/.npmrc b/bundler-tests/node/webpack-5/.npmrc new file mode 100644 index 00000000000..6c93bcba751 --- /dev/null +++ b/bundler-tests/node/webpack-5/.npmrc @@ -0,0 +1,2 @@ +package-lock=false +install-links=false diff --git a/bundler-tests/node/webpack-5/package.json b/bundler-tests/node/webpack-5/package.json new file mode 100644 index 00000000000..f4c245d1071 --- /dev/null +++ b/bundler-tests/node/webpack-5/package.json @@ -0,0 +1,27 @@ +{ + "name": "bundler-tests-node-webpack-5", + "private": true, + "type": "module", + "scripts": { + "test:bundle": "npm i && node test-bundle.mjs" + }, + "dependencies": { + "@opentelemetry/api": "file:../../../api", + "@opentelemetry/api-logs": "file:../../../experimental/packages/api-logs", + "@opentelemetry/core": "file:../../../packages/opentelemetry-core", + "@opentelemetry/exporter-logs-otlp-http": "file:../../../experimental/packages/exporter-logs-otlp-http", + "@opentelemetry/exporter-metrics-otlp-http": "file:../../../experimental/packages/opentelemetry-exporter-metrics-otlp-http", + "@opentelemetry/exporter-trace-otlp-http": "file:../../../experimental/packages/exporter-trace-otlp-http", + "@opentelemetry/instrumentation": "file:../../../experimental/packages/opentelemetry-instrumentation", + "@opentelemetry/propagator-b3": "file:../../../packages/opentelemetry-propagator-b3", + "@opentelemetry/resources": "file:../../../packages/opentelemetry-resources", + "@opentelemetry/sdk-logs": "file:../../../experimental/packages/sdk-logs", + "@opentelemetry/sdk-metrics": "file:../../../packages/sdk-metrics", + "@opentelemetry/sdk-trace-base": "file:../../../packages/opentelemetry-sdk-trace-base" + }, + "devDependencies": { + "@types/webpack": "^5", + "webpack": "^5", + "webpack-cli": "^6" + } +} diff --git a/bundler-tests/node/webpack-5/project.json b/bundler-tests/node/webpack-5/project.json new file mode 100644 index 00000000000..8e312359b61 --- /dev/null +++ b/bundler-tests/node/webpack-5/project.json @@ -0,0 +1,3 @@ +{ + "name": "bundler-tests-node-webpack-5" +} diff --git a/bundler-tests/node/webpack-5/src/index.js b/bundler-tests/node/webpack-5/src/index.js new file mode 100644 index 00000000000..61dd4923357 --- /dev/null +++ b/bundler-tests/node/webpack-5/src/index.js @@ -0,0 +1,52 @@ +const { diag, DiagConsoleLogger } = require('@opentelemetry/api'); +const { logs } = require('@opentelemetry/api-logs'); +const { InstrumentationBase } = require('@opentelemetry/instrumentation'); +const { OTLPLogExporter } = require('@opentelemetry/exporter-logs-otlp-http'); +const { + LoggerProvider, + SimpleLogRecordProcessor, +} = require('@opentelemetry/sdk-logs'); +const { W3CTraceContextPropagator } = require('@opentelemetry/core'); +const { + OTLPMetricExporter, +} = require('@opentelemetry/exporter-metrics-otlp-http'); +const { + OTLPTraceExporter, +} = require('@opentelemetry/exporter-trace-otlp-http'); +const { B3Propagator } = require('@opentelemetry/propagator-b3'); +const { defaultServiceName } = require('@opentelemetry/resources'); +const { MeterProvider } = require('@opentelemetry/sdk-metrics'); +const { BasicTracerProvider } = require('@opentelemetry/sdk-trace-base'); + +diag.setLogger({ + logger: new DiagConsoleLogger(), + options: { + logLevel: 'info', + }, +}); + +logs.setGlobalLoggerProvider( + new LoggerProvider({ + processors: [new SimpleLogRecordProcessor(new OTLPLogExporter())], + }) +); + +const logger = logs.getLogger('bundle-test-webpack'); +logger.emit({ + body: defaultServiceName(), + eventName: 'custom.event', +}); + +class TestInstrumentation extends InstrumentationBase { + init() { + return []; + } +} + +new TestInstrumentation('test', '0.0.0'); +new BasicTracerProvider(); +new MeterProvider(); +new OTLPTraceExporter(); +new OTLPMetricExporter(); +new W3CTraceContextPropagator(); +new B3Propagator(); diff --git a/bundler-tests/node/webpack-5/test-bundle.mjs b/bundler-tests/node/webpack-5/test-bundle.mjs new file mode 100644 index 00000000000..89655434fe8 --- /dev/null +++ b/bundler-tests/node/webpack-5/test-bundle.mjs @@ -0,0 +1,30 @@ +/* + * Copyright The OpenTelemetry Authors + * SPDX-License-Identifier: Apache-2.0 + */ + +import webpack from 'webpack'; +import config from './webpack.config.mjs'; + +const compiler = webpack(config); + +compiler.run((err, stats) => { + if (compiler.close) compiler.close(() => {}); + + if (err) { + console.error(err); + process.exit(1); + } + + if (stats.hasErrors()) { + console.error(stats.compilation.errors.map(e => e.message).join('\n')); + process.exit(1); + } + + if (stats.hasWarnings()) { + console.error(stats.compilation.warnings.map(w => w.message).join('\n')); + process.exit(1); + } + + console.log('webpack 5 build succeeded in Node'); +}); diff --git a/bundler-tests/node/webpack-5/webpack.config.mjs b/bundler-tests/node/webpack-5/webpack.config.mjs new file mode 100644 index 00000000000..828f3bba0e9 --- /dev/null +++ b/bundler-tests/node/webpack-5/webpack.config.mjs @@ -0,0 +1,15 @@ +import path from 'node:path'; +import { fileURLToPath } from 'node:url'; + +const __dirname = path.dirname(fileURLToPath(import.meta.url)); + +/** @type {import('./node_modules/@types/webpack').Configuration} */ +export default { + mode: 'production', + entry: './src/index.js', + target: 'node', + output: { + filename: 'bundle.js', + path: path.resolve(__dirname, 'dist'), + }, +}; diff --git a/package-lock.json b/package-lock.json index 801c9c94695..957c03c8df7 100644 --- a/package-lock.json +++ b/package-lock.json @@ -5602,9 +5602,6 @@ "arm64" ], "dev": true, - "libc": [ - "glibc" - ], "license": "MIT", "optional": true, "os": [ @@ -5619,9 +5616,6 @@ "arm64" ], "dev": true, - "libc": [ - "musl" - ], "license": "MIT", "optional": true, "os": [ @@ -5636,9 +5630,6 @@ "x64" ], "dev": true, - "libc": [ - "glibc" - ], "license": "MIT", "optional": true, "os": [ @@ -5653,9 +5644,6 @@ "x64" ], "dev": true, - "libc": [ - "musl" - ], "license": "MIT", "optional": true, "os": [