opentelemetry-js icon indicating copy to clipboard operation
opentelemetry-js copied to clipboard

Circular dependencies in @opentelemetry/resources/build/esm/Resource.js when build browser bundle with rollup

Open tsubomii opened this issue 1 year ago • 0 comments
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

tsubomii avatar Jan 31 '24 01:01 tsubomii