opentelemetry-js
opentelemetry-js copied to clipboard
Implementation of isPlainObject in lodash.merge.ts in @opentelemetry/core returns incorrect result on edge runtime
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:
NodeJS runtime variable watch:
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