opentelemetry-js
opentelemetry-js copied to clipboard
Circular dependencies in @opentelemetry/resources/build/esm/Resource.js when build browser bundle with rollup
trafficstars
What happened?
Steps to Reproduce
The following is the rollup.config.js I use to create a browser esm bundle.
import resolve from '@rollup/plugin-node-resolve';
import commonjs from '@rollup/plugin-commonjs';
import { getBabelOutputPlugin } from '@rollup/plugin-babel';
import sourcemaps from 'rollup-plugin-sourcemaps';
import json from '@rollup/plugin-json';
function getBabelPlugin() {
return getBabelOutputPlugin({
// default target to es5
presets: ['@babel/preset-env'],
allowAllFormats: true
});
}
const plugins = [
sourcemaps(),
json(),
resolve({
browser: true
}),
commonjs({
/** I have to manually create type definition inside my code, because the following error from RequireInTheMiddleSingleton.js from otel
[!] Error: 'Hook' is not exported by node_modules/require-in-the-middle/index.js, imported by node_modules/@opentelemetry/instrumentation/build/esm/platform/node/RequireInTheMiddleSingleton.js
https://rollupjs.org/guide/en/#error-name-is-not-exported-by-module
node_modules/@opentelemetry/instrumentation/build/esm/platform/node/RequireInTheMiddleSingleton.js (27:9)
25: throw new TypeError(s ? "Object is not iterable." : "Symbol.iterator is not defined.");
26: };
27: import { Hook } from 'require-in-the-middle';
**/
include: ['node_modules/uuid/**/*','node_modules/shimmer/index.js', 'node_modules/require-in-the-middle/index.js']
}),
getBabelPlugin(),
];
export default {
onwarn(warning, warn) {
// I have to suppress a lot undefined warning from Otel plugins
if (warning.code === 'THIS_IS_UNDEFINED') return;
warn(warning);
},
input: 'dist/index.js',
output: [
{
format: 'cjs',
sourcemap: true,
file: 'dist/bundle.js'
},
{
format: 'esm',
sourcemap: true,
file: 'dist/bundle.esm.mjs'
}
],
plugins
};
Following are relevant compiler options from tsconfig.json
module": "es2015",
"moduleResolution": "node",
"target": "ESNext",
"noImplicitAny": true,
"strictNullChecks": true,
"noImplicitThis": true,
"noUnusedLocals": true,
"noUnusedParameters": true,
"removeComments": false,
"preserveConstEnums": true,
"sourceMap": true,
"esModuleInterop": false,
"types": [],
"outDir": "dist",
"lib": ["dom", "es5", "es2015.promise", "es2015.collection", "es2015.iterable", "es2019", "es2020.promise"],
"typeRoots": [],
"baseUrl": ".",
"paths": {
"uuid/v4": ["types/uuid/v4.d.ts"],
"shimmer": ["types/shimmer/index.d.ts"],
"require-in-the-middle": ["types/require-in-the-middle/index.d.ts"],
}
Expected Result
Generate dist/bundle.esm.mjs
Actual Result
Error of circular depeendencies from otel libraries
Circular dependencies
node_modules/@opentelemetry/resources/build/esm/Resource.js -> node_modules/@opentelemetry/resources/build/esm/platform/index.js -> node_modules/@opentelemetry/resources/build/esm/platform/node/index.js -> node_modules/@opentelemetry/resources/build/esm/platform/node/HostDetector.js -> node_modules/@opentelemetry/resources/build/esm/platform/node/HostDetecto
rSync.js -> node_modules/@opentelemetry/resources/build/esm/Resource.js
node_modules/@opentelemetry/resources/build/esm/Resource.js -> node_modules/@opentelemetry/resources/build/esm/platform/index.js -> node_modules/@opentelemetry/resources/build/esm/platform/node/index.js -> node_modules/@opentelemetry/resources/build/esm/platform/node/OSDetector.js -> node_modules/@opentelemetry/resources/build/esm/platform/node/OSDetectorSyn
c.js -> node_modules/@opentelemetry/resources/build/esm/Resource.js
node_modules/@opentelemetry/resources/build/esm/Resource.js -> node_modules/@opentelemetry/resources/build/esm/platform/
index.js -> node_modules/@opentelemetry/resources/build/esm/platform/node/index.js -> node_modules/@opentelemetry/resour
ces/build/esm/platform/node/ProcessDetector.js -> node_modules/@opentelemetry/resources/build/esm/platform/node/ProcessD
etectorSync.js -> node_modules/@opentelemetry/resources/build/esm/Resource.js
...and 3 more
Additional Details
I tried setup using auto-Instrumentations-web plugin or the individual plugins, see below otel setup code. Both have the same compilation error.
OpenTelemetry Setup Code
const contextManager = new ZoneContextManager()
const webProvider = new WebTracerProvider({
resource: new Resource({
[SemanticResourceAttributes.SERVICE_NAME]: 'my-service',
[SemanticResourceAttributes.SERVICE_VERSION]: '0.0.1',
})
});
webProvider.addSpanProcessor(new SimpleSpanProcessor(new ConsoleSpanExporter()));
webProvider.register({
contextManager: contextManager
});
contextManager.enable();
registerInstrumentations({
instrumentations: [
getWebAutoInstrumentations({
// load custom configuration for xml-http-request instrumentation
'@opentelemetry/instrumentation-xml-http-request': {
propagateTraceHeaderCorsUrls: [
/.+/g,
],
},
// load custom configuration for fetch instrumentation
'@opentelemetry/instrumentation-fetch': {
propagateTraceHeaderCorsUrls: [
/.+/g,
],
},
}),
//new FetchInstrumentation(),
// new DocumentLoadInstrumentation(),
// new XMLHttpRequestInstrumentation()
],
tracerProvider: webProvider
});
package.json
"dependencies": {
.....
"@opentelemetry/api": "^1.7.0",
"@opentelemetry/auto-instrumentations-web": "^0.35.0",
"@opentelemetry/context-zone": "^1.20.0",
/** I have to ping to 1.19.0 because between @opentelemetry/sdk-trace-base version 1.19.0 and 1.20.0 there is backwards incompatible definition of Span and Tracer **/
"@opentelemetry/sdk-trace-web": "1.19.0",
"@opentelemetry/semantic-conventions": "1.19.0",
...
"resolutions": {
"@opentelemetry/sdk-trace-base": "1.19.0"
},
}
Relevant log output
The following is not the cause of circular dependencies, but that's the reason I have to ping to @opentelemetry/sdk-trace-web": "1.19.0" and add resolution of "@opentelemetry/sdk-trace-base": "1.19.0"
The compilation error for incompatible Tracer between sdk-trace-base version 1.19.0 and 1.20.0
error TS2322: Type 'import("/myrepo/node_modules/@opentelemetr
y/sdk-trace-web/node_modules/@opentelemetry/sdk-trace-base/build/src/Tracer").Tracer' is not assignable to type 'import(
"/myrepo/node_modules/@opentelemetry/sdk-trace-base/build/src/Tracer").Tracer'
The error for Span
/myrepo/node_modules/@opentelemetry/sdk-trace-web/node_modules/
@opentelemetry/sdk-trace-base/build/src/Span").Span' is not assignable to type 'import("/myrepo/node_modules/@opentelemetry/sdk-trace-base/build/src/Span").Span