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

Implementation of isPlainObject in lodash.merge.ts in @opentelemetry/core returns incorrect result on edge runtime

Open adamstoffel opened this issue 1 year ago • 0 comments
trafficstars

What happened?

Steps to Reproduce

Attempt to use LoggerProvider() without any custom configuration parameter in a Next.js edge function which relies on calling utils.merge() which eventually invokes the problematic isPlainObject() function in lodash.merge.ts.

Expected Result

Successfully instantiate a LoggerProvider.

Actual Result

Instantiation fails because merge() incorrectly merges the configuration objects and the default configuration is replaced with an empty object:

TypeError: An error occurred while loading instrumentation hook: Cannot read properties of undefined (reading 'attributeCountLimit')

Additional Details

This occurs because of a faulty comparison in the isPlainObject() function (which merge() relies upon to function correctly.

The problematic comparison is funcToString.call(Ctor) === objectCtorString. This comparison returns different results in NodeJS vs. the Edge runtime.

See a comparison of the evaluation in the two runtimes below:

Edge runtime variable watch: edge-isplainobject-marked

NodeJS runtime variable watch: node-isplainobject-marked

OpenTelemetry Setup Code

import { logs as otelApiLogs } from '@opentelemetry/api-logs'
import { OTLPLogExporter } from '@opentelemetry/exporter-logs-otlp-http'
import { BatchLogRecordProcessor, LoggerProvider } from '@opentelemetry/sdk-logs'

  const logExporter = new OTLPLogExporter({
   ...
  })
  const loggerProvider = new LoggerProvider()
  loggerProvider.addLogRecordProcessor(new BatchLogRecordProcessor(logExporter))
  otelApiLogs.setGlobalLoggerProvider(loggerProvider)

package.json

"@opentelemetry/api": "1.7.0",
    "@opentelemetry/api-logs": "^0.46.0",
    "@opentelemetry/auto-instrumentations-node": "0.41.1",
    "@opentelemetry/auto-instrumentations-web": "0.36.0",
    "@opentelemetry/context-zone-peer-dep": "1.21.0",
    "@opentelemetry/exporter-logs-otlp-http": "0.48.0",
    "@opentelemetry/exporter-trace-otlp-http": "0.48.0",
    "@opentelemetry/instrumentation": "0.48.0",
    "@opentelemetry/instrumentation-fetch": "0.48.0",
    "@opentelemetry/instrumentation-pino": "0.35.0",
    "@opentelemetry/resources": "1.21.0",
    "@opentelemetry/sdk-logs": "0.48.0",
    "@opentelemetry/sdk-node": "0.48.0",
    "@opentelemetry/sdk-trace-node": "1.21.0",
    "@opentelemetry/sdk-trace-web": "1.21.0",
    "next": "14.1.0",

Relevant log output

No response

adamstoffel avatar Feb 11 '24 20:02 adamstoffel