dd-trace-rb icon indicating copy to clipboard operation
dd-trace-rb copied to clipboard

Tracing code has a number of circular references during require

Open ivoanjo opened this issue 2 years ago • 3 comments

We've recently fixed a number of circular references during require...

  • ...in appsec: https://github.com/DataDog/dd-trace-rb/pull/1996
  • ...in profiling and tracing integrations: https://github.com/DataDog/dd-trace-rb/pull/1998

But there are quite a few remaining. These almost all caused by the following loop: datadog/core requires datadog/core/configuration/components which requires a bunch of tracing components directly:

https://github.com/DataDog/dd-trace-rb/blob/adc96b30ff36f092f2c086001d1a2d3b0d603d24/lib/datadog/core/configuration/components.rb#L10-L12

and then indirectly quite a few of these components require datadog/core in some of their files.

These are the warnings we get right now:

$ bundle exec ruby -W2 -e 'require "ddtrace"'
.../lib/datadog/tracing/tracer.rb:3: warning: .../lib/datadog/tracing/tracer.rb:3: warning: loading in progress, circular require considered harmful - .../lib/datadog/core.rb
  from -e:1:in  `<main>'
  from -e:1:in  `require'
  from .../lib/ddtrace.rb:4:in  `<top (required)>'
  from .../lib/ddtrace.rb:4:in  `require'
  from .../lib/datadog/tracing.rb:3:in  `<top (required)>'
  from .../lib/datadog/tracing.rb:3:in  `require'
  from .../lib/datadog/core.rb:57:in  `<top (required)>'
  from .../lib/datadog/core.rb:57:in  `require'
  from .../lib/datadog/core/extensions.rb:3:in  `<top (required)>'
  from .../lib/datadog/core/extensions.rb:3:in  `require'
  from .../lib/datadog/core/configuration.rb:4:in  `<top (required)>'
  from .../lib/datadog/core/configuration.rb:4:in  `require'
  from .../lib/datadog/core/configuration/components.rb:10:in  `<top (required)>'
  from .../lib/datadog/core/configuration/components.rb:10:in  `require'
  from .../lib/datadog/tracing/tracer.rb:3:in  `<top (required)>'
  from .../lib/datadog/tracing/tracer.rb:3:in  `require'

.../lib/datadog/tracing/correlation.rb:3: warning: .../lib/datadog/tracing/correlation.rb:3: warning: loading in progress, circular require considered harmful - .../lib/datadog/core.rb
  from -e:1:in  `<main>'
  from -e:1:in  `require'
  from .../lib/ddtrace.rb:4:in  `<top (required)>'
  from .../lib/ddtrace.rb:4:in  `require'
  from .../lib/datadog/tracing.rb:3:in  `<top (required)>'
  from .../lib/datadog/tracing.rb:3:in  `require'
  from .../lib/datadog/core.rb:57:in  `<top (required)>'
  from .../lib/datadog/core.rb:57:in  `require'
  from .../lib/datadog/core/extensions.rb:3:in  `<top (required)>'
  from .../lib/datadog/core/extensions.rb:3:in  `require'
  from .../lib/datadog/core/configuration.rb:4:in  `<top (required)>'
  from .../lib/datadog/core/configuration.rb:4:in  `require'
  from .../lib/datadog/core/configuration/components.rb:10:in  `<top (required)>'
  from .../lib/datadog/core/configuration/components.rb:10:in  `require'
  from .../lib/datadog/tracing/tracer.rb:7:in  `<top (required)>'
  from .../lib/datadog/tracing/tracer.rb:7:in  `require'
  from .../lib/datadog/tracing/correlation.rb:3:in  `<top (required)>'
  from .../lib/datadog/tracing/correlation.rb:3:in  `require'

.../lib/datadog/tracing/event.rb:3: warning: .../lib/datadog/tracing/event.rb:3: warning: loading in progress, circular require considered harmful - .../lib/datadog/core.rb
  from -e:1:in  `<main>'
  from -e:1:in  `require'
  from .../lib/ddtrace.rb:4:in  `<top (required)>'
  from .../lib/ddtrace.rb:4:in  `require'
  from .../lib/datadog/tracing.rb:3:in  `<top (required)>'
  from .../lib/datadog/tracing.rb:3:in  `require'
  from .../lib/datadog/core.rb:57:in  `<top (required)>'
  from .../lib/datadog/core.rb:57:in  `require'
  from .../lib/datadog/core/extensions.rb:3:in  `<top (required)>'
  from .../lib/datadog/core/extensions.rb:3:in  `require'
  from .../lib/datadog/core/configuration.rb:4:in  `<top (required)>'
  from .../lib/datadog/core/configuration.rb:4:in  `require'
  from .../lib/datadog/core/configuration/components.rb:10:in  `<top (required)>'
  from .../lib/datadog/core/configuration/components.rb:10:in  `require'
  from .../lib/datadog/tracing/tracer.rb:8:in  `<top (required)>'
  from .../lib/datadog/tracing/tracer.rb:8:in  `require'
  from .../lib/datadog/tracing/event.rb:3:in  `<top (required)>'
  from .../lib/datadog/tracing/event.rb:3:in  `require'

.../lib/datadog/tracing/sampling/rule_sampler.rb:5: warning: .../lib/datadog/tracing/sampling/rule_sampler.rb:5: warning: loading in progress, circular require considered harmful - .../lib/datadog/core.rb
  from -e:1:in  `<main>'
  from -e:1:in  `require'
  from .../lib/ddtrace.rb:4:in  `<top (required)>'
  from .../lib/ddtrace.rb:4:in  `require'
  from .../lib/datadog/tracing.rb:3:in  `<top (required)>'
  from .../lib/datadog/tracing.rb:3:in  `require'
  from .../lib/datadog/core.rb:57:in  `<top (required)>'
  from .../lib/datadog/core.rb:57:in  `require'
  from .../lib/datadog/core/extensions.rb:3:in  `<top (required)>'
  from .../lib/datadog/core/extensions.rb:3:in  `require'
  from .../lib/datadog/core/configuration.rb:4:in  `<top (required)>'
  from .../lib/datadog/core/configuration.rb:4:in  `require'
  from .../lib/datadog/core/configuration/components.rb:10:in  `<top (required)>'
  from .../lib/datadog/core/configuration/components.rb:10:in  `require'
  from .../lib/datadog/tracing/tracer.rb:12:in  `<top (required)>'
  from .../lib/datadog/tracing/tracer.rb:12:in  `require'
  from .../lib/datadog/tracing/sampling/rule_sampler.rb:5:in  `<top (required)>'
  from .../lib/datadog/tracing/sampling/rule_sampler.rb:5:in  `require'

.../lib/datadog/tracing/sampling/rule.rb:5: warning: .../lib/datadog/tracing/sampling/rule.rb:5: warning: loading in progress, circular require considered harmful - .../lib/datadog/core.rb
  from -e:1:in  `<main>'
  from -e:1:in  `require'
  from .../lib/ddtrace.rb:4:in  `<top (required)>'
  from .../lib/ddtrace.rb:4:in  `require'
  from .../lib/datadog/tracing.rb:3:in  `<top (required)>'
  from .../lib/datadog/tracing.rb:3:in  `require'
  from .../lib/datadog/core.rb:57:in  `<top (required)>'
  from .../lib/datadog/core.rb:57:in  `require'
  from .../lib/datadog/core/extensions.rb:3:in  `<top (required)>'
  from .../lib/datadog/core/extensions.rb:3:in  `require'
  from .../lib/datadog/core/configuration.rb:4:in  `<top (required)>'
  from .../lib/datadog/core/configuration.rb:4:in  `require'
  from .../lib/datadog/core/configuration/components.rb:10:in  `<top (required)>'
  from .../lib/datadog/core/configuration/components.rb:10:in  `require'
  from .../lib/datadog/tracing/tracer.rb:12:in  `<top (required)>'
  from .../lib/datadog/tracing/tracer.rb:12:in  `require'
  from .../lib/datadog/tracing/sampling/rule_sampler.rb:9:in  `<top (required)>'
  from .../lib/datadog/tracing/sampling/rule_sampler.rb:9:in  `require'
  from .../lib/datadog/tracing/sampling/rule.rb:5:in  `<top (required)>'
  from .../lib/datadog/tracing/sampling/rule.rb:5:in  `require'

.../lib/datadog/tracing/sampling/rate_sampler.rb:3: warning: .../lib/datadog/tracing/sampling/rate_sampler.rb:3: warning: loading in progress, circular require considered harmful - .../lib/datadog/core.rb
  from -e:1:in  `<main>'
  from -e:1:in  `require'
  from .../lib/ddtrace.rb:4:in  `<top (required)>'
  from .../lib/ddtrace.rb:4:in  `require'
  from .../lib/datadog/tracing.rb:3:in  `<top (required)>'
  from .../lib/datadog/tracing.rb:3:in  `require'
  from .../lib/datadog/core.rb:57:in  `<top (required)>'
  from .../lib/datadog/core.rb:57:in  `require'
  from .../lib/datadog/core/extensions.rb:3:in  `<top (required)>'
  from .../lib/datadog/core/extensions.rb:3:in  `require'
  from .../lib/datadog/core/configuration.rb:4:in  `<top (required)>'
  from .../lib/datadog/core/configuration.rb:4:in  `require'
  from .../lib/datadog/core/configuration/components.rb:10:in  `<top (required)>'
  from .../lib/datadog/core/configuration/components.rb:10:in  `require'
  from .../lib/datadog/tracing/tracer.rb:12:in  `<top (required)>'
  from .../lib/datadog/tracing/tracer.rb:12:in  `require'
  from .../lib/datadog/tracing/sampling/rule_sampler.rb:9:in  `<top (required)>'
  from .../lib/datadog/tracing/sampling/rule_sampler.rb:9:in  `require'
  from .../lib/datadog/tracing/sampling/rule.rb:8:in  `<top (required)>'
  from .../lib/datadog/tracing/sampling/rule.rb:8:in  `require'
  from .../lib/datadog/tracing/sampling/rate_sampler.rb:3:in  `<top (required)>'
  from .../lib/datadog/tracing/sampling/rate_sampler.rb:3:in  `require'

.../lib/datadog/core/utils.rb:4: warning: .../lib/datadog/core/utils.rb:4: warning: loading in progress, circular require considered harmful - .../lib/datadog/tracing/span.rb
  from -e:1:in  `<main>'
  from -e:1:in  `require'
  from .../lib/ddtrace.rb:4:in  `<top (required)>'
  from .../lib/ddtrace.rb:4:in  `require'
  from .../lib/datadog/tracing.rb:3:in  `<top (required)>'
  from .../lib/datadog/tracing.rb:3:in  `require'
  from .../lib/datadog/core.rb:57:in  `<top (required)>'
  from .../lib/datadog/core.rb:57:in  `require'
  from .../lib/datadog/core/extensions.rb:3:in  `<top (required)>'
  from .../lib/datadog/core/extensions.rb:3:in  `require'
  from .../lib/datadog/core/configuration.rb:4:in  `<top (required)>'
  from .../lib/datadog/core/configuration.rb:4:in  `require'
  from .../lib/datadog/core/configuration/components.rb:10:in  `<top (required)>'
  from .../lib/datadog/core/configuration/components.rb:10:in  `require'
  from .../lib/datadog/tracing/tracer.rb:12:in  `<top (required)>'
  from .../lib/datadog/tracing/tracer.rb:12:in  `require'
  from .../lib/datadog/tracing/sampling/rule_sampler.rb:9:in  `<top (required)>'
  from .../lib/datadog/tracing/sampling/rule_sampler.rb:9:in  `require'
  from .../lib/datadog/tracing/sampling/rule.rb:8:in  `<top (required)>'
  from .../lib/datadog/tracing/sampling/rule.rb:8:in  `require'
  from .../lib/datadog/tracing/sampling/rate_sampler.rb:6:in  `<top (required)>'
  from .../lib/datadog/tracing/sampling/rate_sampler.rb:6:in  `require'
  from .../lib/datadog/tracing/span.rb:5:in  `<top (required)>'
  from .../lib/datadog/tracing/span.rb:5:in  `require'
  from .../lib/datadog/core/utils.rb:4:in  `<top (required)>'
  from .../lib/datadog/core/utils.rb:4:in  `require'

.../lib/datadog/tracing/sampling/rate_by_service_sampler.rb:3: warning: .../lib/datadog/tracing/sampling/rate_by_service_sampler.rb:3: warning: loading in progress, circular require considered harmful - .../lib/datadog/core.rb
  from -e:1:in  `<main>'
  from -e:1:in  `require'
  from .../lib/ddtrace.rb:4:in  `<top (required)>'
  from .../lib/ddtrace.rb:4:in  `require'
  from .../lib/datadog/tracing.rb:3:in  `<top (required)>'
  from .../lib/datadog/tracing.rb:3:in  `require'
  from .../lib/datadog/core.rb:57:in  `<top (required)>'
  from .../lib/datadog/core.rb:57:in  `require'
  from .../lib/datadog/core/extensions.rb:3:in  `<top (required)>'
  from .../lib/datadog/core/extensions.rb:3:in  `require'
  from .../lib/datadog/core/configuration.rb:4:in  `<top (required)>'
  from .../lib/datadog/core/configuration.rb:4:in  `require'
  from .../lib/datadog/core/configuration/components.rb:10:in  `<top (required)>'
  from .../lib/datadog/core/configuration/components.rb:10:in  `require'
  from .../lib/datadog/tracing/tracer.rb:13:in  `<top (required)>'
  from .../lib/datadog/tracing/tracer.rb:13:in  `require'
  from .../lib/datadog/tracing/sampling/priority_sampler.rb:8:in  `<top (required)>'
  from .../lib/datadog/tracing/sampling/priority_sampler.rb:8:in  `require'
  from .../lib/datadog/tracing/sampling/rate_by_service_sampler.rb:3:in  `<top (required)>'
  from .../lib/datadog/tracing/sampling/rate_by_service_sampler.rb:3:in  `require'

.../lib/datadog/tracing/span_operation.rb:6: warning: .../lib/datadog/tracing/span_operation.rb:6: warning: loading in progress, circular require considered harmful - .../lib/datadog/core.rb
  from -e:1:in  `<main>'
  from -e:1:in  `require'
  from .../lib/ddtrace.rb:4:in  `<top (required)>'
  from .../lib/ddtrace.rb:4:in  `require'
  from .../lib/datadog/tracing.rb:3:in  `<top (required)>'
  from .../lib/datadog/tracing.rb:3:in  `require'
  from .../lib/datadog/core.rb:57:in  `<top (required)>'
  from .../lib/datadog/core.rb:57:in  `require'
  from .../lib/datadog/core/extensions.rb:3:in  `<top (required)>'
  from .../lib/datadog/core/extensions.rb:3:in  `require'
  from .../lib/datadog/core/configuration.rb:4:in  `<top (required)>'
  from .../lib/datadog/core/configuration.rb:4:in  `require'
  from .../lib/datadog/core/configuration/components.rb:10:in  `<top (required)>'
  from .../lib/datadog/core/configuration/components.rb:10:in  `require'
  from .../lib/datadog/tracing/tracer.rb:14:in  `<top (required)>'
  from .../lib/datadog/tracing/tracer.rb:14:in  `require'
  from .../lib/datadog/tracing/span_operation.rb:6:in  `<top (required)>'
  from .../lib/datadog/tracing/span_operation.rb:6:in  `require'

.../lib/datadog/tracing/trace_operation.rb:3: warning: .../lib/datadog/tracing/trace_operation.rb:3: warning: loading in progress, circular require considered harmful - .../lib/datadog/core.rb
  from -e:1:in  `<main>'
  from -e:1:in  `require'
  from .../lib/ddtrace.rb:4:in  `<top (required)>'
  from .../lib/ddtrace.rb:4:in  `require'
  from .../lib/datadog/tracing.rb:3:in  `<top (required)>'
  from .../lib/datadog/tracing.rb:3:in  `require'
  from .../lib/datadog/core.rb:57:in  `<top (required)>'
  from .../lib/datadog/core.rb:57:in  `require'
  from .../lib/datadog/core/extensions.rb:3:in  `<top (required)>'
  from .../lib/datadog/core/extensions.rb:3:in  `require'
  from .../lib/datadog/core/configuration.rb:4:in  `<top (required)>'
  from .../lib/datadog/core/configuration.rb:4:in  `require'
  from .../lib/datadog/core/configuration/components.rb:10:in  `<top (required)>'
  from .../lib/datadog/core/configuration/components.rb:10:in  `require'
  from .../lib/datadog/tracing/tracer.rb:16:in  `<top (required)>'
  from .../lib/datadog/tracing/tracer.rb:16:in  `require'
  from .../lib/datadog/tracing/trace_operation.rb:3:in  `<top (required)>'
  from .../lib/datadog/tracing/trace_operation.rb:3:in  `require'

.../lib/datadog/tracing/writer.rb:3: warning: .../lib/datadog/tracing/writer.rb:3: warning: loading in progress, circular require considered harmful - .../lib/datadog/core.rb
  from -e:1:in  `<main>'
  from -e:1:in  `require'
  from .../lib/ddtrace.rb:4:in  `<top (required)>'
  from .../lib/ddtrace.rb:4:in  `require'
  from .../lib/datadog/tracing.rb:3:in  `<top (required)>'
  from .../lib/datadog/tracing.rb:3:in  `require'
  from .../lib/datadog/core.rb:57:in  `<top (required)>'
  from .../lib/datadog/core.rb:57:in  `require'
  from .../lib/datadog/core/extensions.rb:3:in  `<top (required)>'
  from .../lib/datadog/core/extensions.rb:3:in  `require'
  from .../lib/datadog/core/configuration.rb:4:in  `<top (required)>'
  from .../lib/datadog/core/configuration.rb:4:in  `require'
  from .../lib/datadog/core/configuration/components.rb:10:in  `<top (required)>'
  from .../lib/datadog/core/configuration/components.rb:10:in  `require'
  from .../lib/datadog/tracing/tracer.rb:17:in  `<top (required)>'
  from .../lib/datadog/tracing/tracer.rb:17:in  `require'
  from .../lib/datadog/tracing/writer.rb:3:in  `<top (required)>'
  from .../lib/datadog/tracing/writer.rb:3:in  `require'

.../lib/datadog/tracing/runtime/metrics.rb:3: warning: .../lib/datadog/tracing/runtime/metrics.rb:3: warning: loading in progress, circular require considered harmful - .../lib/datadog/core.rb
  from -e:1:in  `<main>'
  from -e:1:in  `require'
  from .../lib/ddtrace.rb:4:in  `<top (required)>'
  from .../lib/ddtrace.rb:4:in  `require'
  from .../lib/datadog/tracing.rb:3:in  `<top (required)>'
  from .../lib/datadog/tracing.rb:3:in  `require'
  from .../lib/datadog/core.rb:57:in  `<top (required)>'
  from .../lib/datadog/core.rb:57:in  `require'
  from .../lib/datadog/core/extensions.rb:3:in  `<top (required)>'
  from .../lib/datadog/core/extensions.rb:3:in  `require'
  from .../lib/datadog/core/configuration.rb:4:in  `<top (required)>'
  from .../lib/datadog/core/configuration.rb:4:in  `require'
  from .../lib/datadog/core/configuration/components.rb:10:in  `<top (required)>'
  from .../lib/datadog/core/configuration/components.rb:10:in  `require'
  from .../lib/datadog/tracing/tracer.rb:17:in  `<top (required)>'
  from .../lib/datadog/tracing/tracer.rb:17:in  `require'
  from .../lib/datadog/tracing/writer.rb:6:in  `<top (required)>'
  from .../lib/datadog/tracing/writer.rb:6:in  `require'
  from .../lib/datadog/tracing/runtime/metrics.rb:3:in  `<top (required)>'
  from .../lib/datadog/tracing/runtime/metrics.rb:3:in  `require'

.../lib/datadog/tracing/workers.rb:3: warning: .../lib/datadog/tracing/workers.rb:3: warning: loading in progress, circular require considered harmful - .../lib/datadog/core.rb
  from -e:1:in  `<main>'
  from -e:1:in  `require'
  from .../lib/ddtrace.rb:4:in  `<top (required)>'
  from .../lib/ddtrace.rb:4:in  `require'
  from .../lib/datadog/tracing.rb:3:in  `<top (required)>'
  from .../lib/datadog/tracing.rb:3:in  `require'
  from .../lib/datadog/core.rb:57:in  `<top (required)>'
  from .../lib/datadog/core.rb:57:in  `require'
  from .../lib/datadog/core/extensions.rb:3:in  `<top (required)>'
  from .../lib/datadog/core/extensions.rb:3:in  `require'
  from .../lib/datadog/core/configuration.rb:4:in  `<top (required)>'
  from .../lib/datadog/core/configuration.rb:4:in  `require'
  from .../lib/datadog/core/configuration/components.rb:10:in  `<top (required)>'
  from .../lib/datadog/core/configuration/components.rb:10:in  `require'
  from .../lib/datadog/tracing/tracer.rb:17:in  `<top (required)>'
  from .../lib/datadog/tracing/tracer.rb:17:in  `require'
  from .../lib/datadog/tracing/writer.rb:7:in  `<top (required)>'
  from .../lib/datadog/tracing/writer.rb:7:in  `require'
  from .../lib/datadog/tracing/workers.rb:3:in  `<top (required)>'
  from .../lib/datadog/tracing/workers.rb:3:in  `require'

.../lib/datadog/tracing/buffer.rb:3: warning: .../lib/datadog/tracing/buffer.rb:3: warning: loading in progress, circular require considered harmful - .../lib/datadog/core.rb
  from -e:1:in  `<main>'
  from -e:1:in  `require'
  from .../lib/ddtrace.rb:4:in  `<top (required)>'
  from .../lib/ddtrace.rb:4:in  `require'
  from .../lib/datadog/tracing.rb:3:in  `<top (required)>'
  from .../lib/datadog/tracing.rb:3:in  `require'
  from .../lib/datadog/core.rb:57:in  `<top (required)>'
  from .../lib/datadog/core.rb:57:in  `require'
  from .../lib/datadog/core/extensions.rb:3:in  `<top (required)>'
  from .../lib/datadog/core/extensions.rb:3:in  `require'
  from .../lib/datadog/core/configuration.rb:4:in  `<top (required)>'
  from .../lib/datadog/core/configuration.rb:4:in  `require'
  from .../lib/datadog/core/configuration/components.rb:10:in  `<top (required)>'
  from .../lib/datadog/core/configuration/components.rb:10:in  `require'
  from .../lib/datadog/tracing/tracer.rb:17:in  `<top (required)>'
  from .../lib/datadog/tracing/tracer.rb:17:in  `require'
  from .../lib/datadog/tracing/writer.rb:7:in  `<top (required)>'
  from .../lib/datadog/tracing/writer.rb:7:in  `require'
  from .../lib/datadog/tracing/workers.rb:5:in  `<top (required)>'
  from .../lib/datadog/tracing/workers.rb:5:in  `require'
  from .../lib/datadog/tracing/buffer.rb:3:in  `<top (required)>'
  from .../lib/datadog/tracing/buffer.rb:3:in  `require'

.../lib/datadog/tracing/pipeline.rb:3: warning: .../lib/datadog/tracing/pipeline.rb:3: warning: loading in progress, circular require considered harmful - .../lib/datadog/core.rb
  from -e:1:in  `<main>'
  from -e:1:in  `require'
  from .../lib/ddtrace.rb:4:in  `<top (required)>'
  from .../lib/ddtrace.rb:4:in  `require'
  from .../lib/datadog/tracing.rb:3:in  `<top (required)>'
  from .../lib/datadog/tracing.rb:3:in  `require'
  from .../lib/datadog/core.rb:57:in  `<top (required)>'
  from .../lib/datadog/core.rb:57:in  `require'
  from .../lib/datadog/core/extensions.rb:3:in  `<top (required)>'
  from .../lib/datadog/core/extensions.rb:3:in  `require'
  from .../lib/datadog/core/configuration.rb:4:in  `<top (required)>'
  from .../lib/datadog/core/configuration.rb:4:in  `require'
  from .../lib/datadog/core/configuration/components.rb:10:in  `<top (required)>'
  from .../lib/datadog/core/configuration/components.rb:10:in  `require'
  from .../lib/datadog/tracing/tracer.rb:17:in  `<top (required)>'
  from .../lib/datadog/tracing/tracer.rb:17:in  `require'
  from .../lib/datadog/tracing/writer.rb:7:in  `<top (required)>'
  from .../lib/datadog/tracing/writer.rb:7:in  `require'
  from .../lib/datadog/tracing/workers.rb:6:in  `<top (required)>'
  from .../lib/datadog/tracing/workers.rb:6:in  `require'
  from .../lib/datadog/tracing/pipeline.rb:3:in  `<top (required)>'
  from .../lib/datadog/tracing/pipeline.rb:3:in  `require'

.../lib/datadog/tracing/sync_writer.rb:3: warning: .../lib/datadog/tracing/sync_writer.rb:3: warning: loading in progress, circular require considered harmful - .../lib/datadog/core.rb
  from -e:1:in  `<main>'
  from -e:1:in  `require'
  from .../lib/ddtrace.rb:4:in  `<top (required)>'
  from .../lib/ddtrace.rb:4:in  `require'
  from .../lib/datadog/tracing.rb:3:in  `<top (required)>'
  from .../lib/datadog/tracing.rb:3:in  `require'
  from .../lib/datadog/core.rb:57:in  `<top (required)>'
  from .../lib/datadog/core.rb:57:in  `require'
  from .../lib/datadog/core/extensions.rb:3:in  `<top (required)>'
  from .../lib/datadog/core/extensions.rb:3:in  `require'
  from .../lib/datadog/core/configuration.rb:4:in  `<top (required)>'
  from .../lib/datadog/core/configuration.rb:4:in  `require'
  from .../lib/datadog/core/configuration/components.rb:12:in  `<top (required)>'
  from .../lib/datadog/core/configuration/components.rb:12:in  `require'
  from .../lib/datadog/tracing/sync_writer.rb:3:in  `<top (required)>'
  from .../lib/datadog/tracing/sync_writer.rb:3:in  `require'

I suspect the solution here will be for individual tracing components to stop requiring datadog/core, and assuming that whoever requires them has taken care of that. Nowadays that's inside datadog/core/configuration/components but in the future that would probably be datadog/tracing directly.

ivoanjo avatar May 03 '22 12:05 ivoanjo

I suspect the solution here will be for individual tracing components to stop requiring datadog/core

I think this might be the opposite. Tracing should reference datadog/core, but nothing in datadog/core should reference anything in the other datadog namespaces. Ideally, core/components has its responsibilities significantly reduced, and the startup/bootstrapping of things like the tracer is done within the datadog/tracing namespace.

That should eliminate these circular references, which are holdovers from internal 1.0 related namespace refactors.

delner avatar May 03 '22 18:05 delner

datadog/core is, today, confusingly both a leaf of our dependency graph (core doesn't depend on anything) and the product aggregator node of the graph (aggregates all products into one system).

datadog/core/configuration/components is a case of the latter.

We ideally would like it to be a leaf, no depending on anything, like @delner mentioned, but it's kind of messy today.

For this specific ticket, we either have to move some of the core files that aggregate products to a different namespace or at least document these core files as future candidates to be extracted to a different namespace.

marcotc avatar May 04 '22 19:05 marcotc

Running into this same problem, I always try to have warnings turned on in tests:

/home/samuel/.gem/ruby/3.1.2/gems/ddtrace-1.1.0/lib/datadog/tracing/sync_writer.rb:3: warning: /home/samuel/.gem/ruby/3.1.2/gems/ddtrace-1.1.0/lib/datadog/tracing/sync_writer.rb:3: warning: loading in progress, circular require considered harmful - /home/samuel/.gem/ruby/3.1.2/gems/ddtrace-1.1.0/lib/datadog/core.rb
... snip stuff that doesn't matter ...
	from /home/samuel/.gem/ruby/3.1.2/gems/ddtrace-1.1.0/lib/datadog/tracing.rb:3:in  `<top (required)>'
	from /home/samuel/.gem/ruby/3.1.2/gems/ddtrace-1.1.0/lib/datadog/tracing.rb:3:in  `require'
	from /home/samuel/.gem/ruby/3.1.2/gems/ddtrace-1.1.0/lib/datadog/core.rb:57:in  `<top (required)>'
	from /home/samuel/.gem/ruby/3.1.2/gems/ddtrace-1.1.0/lib/datadog/core.rb:57:in  `require'
	from /home/samuel/.gem/ruby/3.1.2/gems/ddtrace-1.1.0/lib/datadog/core/extensions.rb:3:in  `<top (required)>'
	from /home/samuel/.gem/ruby/3.1.2/gems/ddtrace-1.1.0/lib/datadog/core/extensions.rb:3:in  `require'
	from /home/samuel/.gem/ruby/3.1.2/gems/ddtrace-1.1.0/lib/datadog/core/configuration.rb:3:in  `<top (required)>'
	from /home/samuel/.gem/ruby/3.1.2/gems/ddtrace-1.1.0/lib/datadog/core/configuration.rb:3:in  `require'
	from /home/samuel/.gem/ruby/3.1.2/gems/ddtrace-1.1.0/lib/datadog/core/configuration/components.rb:12:in  `<top (required)>'
	from /home/samuel/.gem/ruby/3.1.2/gems/ddtrace-1.1.0/lib/datadog/core/configuration/components.rb:12:in  `require'
	from /home/samuel/.gem/ruby/3.1.2/gems/ddtrace-1.1.0/lib/datadog/tracing/sync_writer.rb:3:in  `<top (required)>'
	from /home/samuel/.gem/ruby/3.1.2/gems/ddtrace-1.1.0/lib/datadog/tracing/sync_writer.rb:3:in  `require'

ioquatix avatar Jul 07 '22 00:07 ioquatix

Just for folks passing by here: I was encountering the same problem in one of our applications. Just this error when running the RSpecs.

Eventually in our case it was a duplicate require 'ddtrace' somewhere, so just removing one fixed the issue.

jdongelmans avatar Feb 23 '23 16:02 jdongelmans

We have cleaned up the main offender here, lib/datadog/core.rb, and now it only require what it needs, instead of loading most of the ddtrace namespace: https://github.com/DataDog/dd-trace-rb/blob/170ede564422253056d9e94c5be3dd6a18e57f3d/lib/datadog/core.rb#L3

There have been no reports of circular require since the core.rb changes.

I'm going to close this issue as solved.

marcotc avatar Feb 24 '23 23:02 marcotc

Nice work!

ioquatix avatar Feb 24 '23 23:02 ioquatix