DataDog / dd-trace-rb

Datadog Tracing Ruby Client
https://docs.datadoghq.com/tracing/
Other
304 stars 369 forks source link

Possibly missing dependency. #2078

Open ioquatix opened 2 years ago

ioquatix commented 2 years ago

When I run the specs for traces-backend-datadog which specifically only pulls in datadog/tracing it fails without also having require 'ddtrace'. Without require 'ddtrace' I get the error below when running bundle exec rspec. This might be by design, or this might be an issue due to a missing dependency within the ddtrace codebase.

W, [2022-06-10T15:33:56.005308 #991435]  WARN -- ddtrace: [ddtrace] Failed to collect environment information: undefined method `instrumented_integrations' for #<#<Class:0x00007f664cfbabd0>:0x00007f664cc7fab0 @options={:transport_options=>#<Datadog::Core::Configuration::Option:0x00007f664cc7f9e8 @definition=#<Datadog::Core::Configuration::OptionDefinition:0x00007f664cf3c3e8 @default=nil, @delegate_to=nil, @depends_on=[], @lazy=false, @name=:transport_options, @on_set=nil, @resetter=nil, @setter=#<Proc:0x00007f664d01fe40 /home/samuel/.gem/ruby/3.1.2/gems/ddtrace-1.1.0/lib/datadog/core/configuration/option_definition.rb:10 (lambda)>>, @context=#<#<Class:0x00007f664cfbabd0>:0x00007f664cc7fab0 ...>, @value=nil, @is_set=true>, :instance=>#<Datadog::Core::Configuration::Option:0x00007f664cc7edb8 @definition=#<Datadog::Core::Configuration::OptionDefinition:0x00007f664cfc1d68 @default=nil, @delegate_to=nil, @depends_on=[], @lazy=false, @name=:instance, @on_set=nil, @resetter=nil, @setter=#<Proc:0x00007f664d01fe40 /home/samuel/.gem/ruby/3.1.2/gems/ddtrace-1.1.0/lib/datadog/core/configuration/option_definition.rb:10 (lambda)>>, @context=#<#<Class:0x00007f664cfbabd0>:0x00007f664cc7fab0 ...>, @value=nil, @is_set=true>, :test_mode=>#<Datadog::Core::Configuration::Option:0x00007f664cc7ed18 @definition=#<Datadog::Core::Configuration::OptionDefinition:0x00007f664cf3ca28 @default=#<Proc:0x00007f664cf3caa0 /home/samuel/.gem/ruby/3.1.2/gems/ddtrace-1.1.0/lib/datadog/core/configuration/base.rb:33>, @delegate_to=nil, @depends_on=[], @lazy=true, @name=:test_mode, @on_set=nil, @resetter=#<Proc:0x00007f664cf3ca78 /home/samuel/.gem/ruby/3.1.2/gems/ddtrace-1.1.0/lib/datadog/core/configuration/base.rb:35>, @setter=#<Proc:0x00007f664d01fe40 /home/samuel/.gem/ruby/3.1.2/gems/ddtrace-1.1.0/lib/datadog/core/configuration/option_definition.rb:10 (lambda)>>, @context=#<#<Class:0x00007f664cfbabd0>:0x00007f664cc7fab0 ...>, @value=#<#<Class:0x00007f664cf390a8>:0x00007f664cc7ec78 @options={:enabled=>#<Datadog::Core::Configuration::Option:0x00007f664cc7e930 @definition=#<Datadog::Core::Configuration::OptionDefinition:0x00007f664cf3f6b0 @default=#<Proc:0x00007f664cf3fc78 /home/samuel/.gem/ruby/3.1.2/gems/ddtrace-1.1.0/lib/datadog/core/configuration/settings.rb:561>, @delegate_to=nil, @depends_on=[], @lazy=true, @name=:enabled, @on_set=nil, @resetter=nil, @setter=#<Proc:0x00007f664d01fe40 /home/samuel/.gem/ruby/3.1.2/gems/ddtrace-1.1.0/lib/datadog/core/configuration/option_definition.rb:10 (lambda)>>, @context=#<#<Class:0x00007f664cf390a8>:0x00007f664cc7ec78 ...>, @value=false, @is_set=true>}>, @is_set=true>, :partial_flush=>#<Datadog::Core::Configuration::Option:0x00007f664cc7e700 @definition=#<Datadog::Core::Configuration::OptionDefinition:0x00007f664cf37398 @default=#<Proc:0x00007f664cf374b0 /home/samuel/.gem/ruby/3.1.2/gems/ddtrace-1.1.0/lib/datadog/core/configuration/base.rb:33>, @delegate_to=nil, @depends_on=[], @lazy=true, @name=:partial_flush, @on_set=nil, @resetter=#<Proc:0x00007f664cf373e8 /home/samuel/.gem/ruby/3.1.2/gems/ddtrace-1.1.0/lib/datadog/core/configuration/base.rb:35>, @setter=#<Proc:0x00007f664d01fe40 /home/samuel/.gem/ruby/3.1.2/gems/ddtrace-1.1.0/lib/datadog/core/configuration/option_definition.rb:10 (lambda)>>, @context=#<#<Class:0x00007f664cfbabd0>:0x00007f664cc7fab0 ...>, @value=#<#<Class:0x00007f664cfc78a8>:0x00007f664cc7e688 @options={:enabled=>#<Datadog::Core::Configuration::Option:0x00007f664cc7e340 @definition=#<Datadog::Core::Configuration::OptionDefinition:0x00007f664cfc4ef0 @default=false, @delegate_to=nil, @depends_on=[], @lazy=false, @name=:enabled, @on_set=nil, @resetter=nil, @setter=#<Proc:0x00007f664d01fe40 /home/samuel/.gem/ruby/3.1.2/gems/ddtrace-1.1.0/lib/datadog/core/configuration/option_definition.rb:10 (lambda)>>, @context=#<#<Class:0x00007f664cfc78a8>:0x00007f664cc7e688 ...>, @value=false, @is_set=true>}>, @is_set=true>, :sampler=>#<Datadog::Core::Configuration::Option:0x00007f664cc7e1b0 @definition=#<Datadog::Core::Configuration::OptionDefinition:0x00007f664cf36380 @default=nil, @delegate_to=nil, @depends_on=[], @lazy=false, @name=:sampler, @on_set=nil, @resetter=nil, @setter=#<Proc:0x00007f664d01fe40 /home/samuel/.gem/ruby/3.1.2/gems/ddtrace-1.1.0/lib/datadog/core/configuration/option_definition.rb:10 (lambda)>>, @context=#<#<Class:0x00007f664cfbabd0>:0x00007f664cc7fab0 ...>, @value=nil, @is_set=true>, :priority_sampling=>#<Datadog::Core::Configuration::Option:0x00007f664cc7e110 @definition=#<Datadog::Core::Configuration::OptionDefinition:0x00007f664cf36e98 @default=nil, @delegate_to=nil, @depends_on=[], @lazy=false, @name=:priority_sampling, @on_set=nil, @resetter=nil, @setter=#<Proc:0x00007f664d01fe40 /home/samuel/.gem/ruby/3.1.2/gems/ddtrace-1.1.0/lib/datadog/core/configuration/option_definition.rb:10 (lambda)>>, @context=#<#<Class:0x00007f664cfbabd0>:0x00007f664cc7fab0 ...>, @value=nil, @is_set=true>, :sampling=>#<Datadog::Core::Configuration::Option:0x00007f664cc7df80 @definition=#<Datadog::Core::Configuration::OptionDefinition:0x00007f664cf3a9f8 @default=#<Proc:0x00007f664cf3ad90 /home/samuel/.gem/ruby/3.1.2/gems/ddtrace-1.1.0/lib/datadog/core/configuration/base.rb:33>, @delegate_to=nil, @depends_on=[], @lazy=true, @name=:sampling, @on_set=nil, @resetter=#<Proc:0x00007f664cf3ac28 /home/samuel/.gem/ruby/3.1.2/gems/ddtrace-1.1.0/lib/datadog/core/configuration/base.rb:35>, @setter=#<Proc:0x00007f664d01fe40 /home/samuel/.gem/ruby/3.1.2/gems/ddtrace-1.1.0/lib/datadog/core/configuration/option_definition.rb:10 (lambda)>>, @context=#<#<Class:0x00007f664cfbabd0>:0x00007f664cc7fab0 ...>, @value=#<#<Class:0x00007f664cf35f20>:0x00007f664cc7df08 @options={:rate_limit=>#<Datadog::Core::Configuration::Option:0x00007f664cc7dbc0 @definition=#<Datadog::Core::Configuration::OptionDefinition:0x00007f664cf3bb78 @default=#<Proc:0x00007f664cf3bbc8 /home/samuel/.gem/ruby/3.1.2/gems/ddtrace-1.1.0/lib/datadog/core/configuration/settings.rb:546>, @delegate_to=nil, @depends_on=[], @lazy=true, @name=:rate_limit, @on_set=nil, @resetter=nil, @setter=#<Proc:0x00007f664d01fe40 /home/samuel/.gem/ruby/3.1.2/gems/ddtrace-1.1.0/lib/datadog/core/configuration/option_definition.rb:10 (lambda)>>, @context=#<#<Class:0x00007f664cf35f20>:0x00007f664cc7df08 ...>, @value=100, @is_set=true>, :default_rate=>#<Datadog::Core::Configuration::Option:0x00007f664cc7d990 @definition=#<Datadog::Core::Configuration::OptionDefinition:0x00007f664cf35408 @default=#<Proc:0x00007f664cf35610 /home/samuel/.gem/ruby/3.1.2/gems/ddtrace-1.1.0/lib/datadog/core/configuration/settings.rb:534>, @delegate_to=nil, @depends_on=[], @lazy=true, @name=:default_rate, @on_set=nil, @resetter=nil, @setter=#<Proc:0x00007f664d01fe40 /home/samuel/.gem/ruby/3.1.2/gems/ddtrace-1.1.0/lib/datadog/core/configuration/option_definition.rb:10 (lambda)>>, @context=#<#<Class:0x00007f664cf35f20>:0x00007f664cc7df08 ...>, @value=nil, @is_set=true>}>, @is_set=true>, :writer=>#<Datadog::Core::Configuration::Option:0x00007f664cc7d0d0 @definition=#<Datadog::Core::Configuration::OptionDefinition:0x00007f664cf43fd0 @default=nil, @delegate_to=nil, @depends_on=[], @lazy=false, @name=:writer, @on_set=nil, @resetter=nil, @setter=#<Proc:0x00007f664d01fe40 /home/samuel/.gem/ruby/3.1.2/gems/ddtrace-1.1.0/lib/datadog/core/configuration/option_definition.rb:10 (lambda)>>, @context=#<#<Class:0x00007f664cfbabd0>:0x00007f664cc7fab0 ...>, @value=nil, @is_set=true>, :writer_options=>#<Datadog::Core::Configuration::Option:0x00007f664cc7cfe0 @definition=#<Datadog::Core::Configuration::OptionDefinition:0x00007f664cf43bc0 @default=#<Proc:0x00007f664cf43d50 /home/samuel/.gem/ruby/3.1.2/gems/ddtrace-1.1.0/lib/datadog/core/configuration/settings.rb:600 (lambda)>, @delegate_to=nil, @depends_on=[], @lazy=true, @name=:writer_options, @on_set=nil, @resetter=nil, @setter=#<Proc:0x00007f664d01fe40 /home/samuel/.gem/ruby/3.1.2/gems/ddtrace-1.1.0/lib/datadog/core/configuration/option_definition.rb:10 (lambda)>>, @context=#<#<Class:0x00007f664cfbabd0>:0x00007f664cc7fab0 ...>, @value={}, @is_set=true>, :enabled=>#<Datadog::Core::Configuration::Option:0x00007f664cc7a600 @definition=#<Datadog::Core::Configuration::OptionDefinition:0x00007f664cfc2560 @default=#<Proc:0x00007f664cfc2740 /home/samuel/.gem/ruby/3.1.2/gems/ddtrace-1.1.0/lib/datadog/core/configuration/settings.rb:449>, @delegate_to=nil, @depends_on=[], @lazy=true, @name=:enabled, @on_set=nil, @resetter=nil, @setter=#<Proc:0x00007f664d01fe40 /home/samuel/.gem/ruby/3.1.2/gems/ddtrace-1.1.0/lib/datadog/core/configuration/option_definition.rb:10 (lambda)>>, @context=#<#<Class:0x00007f664cfbabd0>:0x00007f664cc7fab0 ...>, @value=true, @is_set=true>, :report_hostname=>#<Datadog::Core::Configuration::Option:0x00007f664cc778b0 @definition=#<Datadog::Core::Configuration::OptionDefinition:0x00007f664cf36a88 @default=#<Proc:0x00007f664cf36b78 /home/samuel/.gem/ruby/3.1.2/gems/ddtrace-1.1.0/lib/datadog/core/configuration/settings.rb:512>, @delegate_to=nil, @depends_on=[], @lazy=true, @name=:report_hostname, @on_set=nil, @resetter=nil, @setter=#<Proc:0x00007f664d01fe40 /home/samuel/.gem/ruby/3.1.2/gems/ddtrace-1.1.0/lib/datadog/core/configuration/option_definition.rb:10 (lambda)>>, @context=#<#<Class:0x00007f664cfbabd0>:0x00007f664cc7fab0 ...>, @value=false, @is_set=true>, :analytics=>#<Datadog::Core::Configuration::Option:0x00007f664ca5aa00 @definition=#<Datadog::Core::Configuration::OptionDefinition:0x00007f664cfbf9f0 @default=#<Proc:0x00007f664cfbfb30 /home/samuel/.gem/ruby/3.1.2/gems/ddtrace-1.1.0/lib/datadog/core/configuration/base.rb:33>, @delegate_to=nil, @depends_on=[], @lazy=true, @name=:analytics, @on_set=nil, @resetter=#<Proc:0x00007f664cfbfb08 /home/samuel/.gem/ruby/3.1.2/gems/ddtrace-1.1.0/lib/datadog/core/configuration/base.rb:35>, @setter=#<Proc:0x00007f664d01fe40 /home/samuel/.gem/ruby/3.1.2/gems/ddtrace-1.1.0/lib/datadog/core/configuration/option_definition.rb:10 (lambda)>>, @context=#<#<Class:0x00007f664cfbabd0>:0x00007f664cc7fab0 ...>, @value=#<#<Class:0x00007f664cfb9960>:0x00007f664ca5a988 @options={:enabled=>#<Datadog::Core::Configuration::Option:0x00007f664ca5a640 @definition=#<Datadog::Core::Configuration::OptionDefinition:0x00007f664cfb8ab0 @default=#<Proc:0x00007f664cfb8fd8 /home/samuel/.gem/ruby/3.1.2/gems/ddtrace-1.1.0/lib/datadog/core/configuration/settings.rb:382>, @delegate_to=nil, @depends_on=[], @lazy=true, @name=:enabled, @on_set=nil, @resetter=nil, @setter=#<Proc:0x00007f664d01fe40 /home/samuel/.gem/ruby/3.1.2/gems/ddtrace-1.1.0/lib/datadog/core/configuration/option_definition.rb:10 (lambda)>>, @context=#<#<Class:0x00007f664cfb9960>:0x00007f664ca5a988 ...>, @value=nil, @is_set=true>}>, @is_set=true>}>

          Datadog.configuration.tracing.instrumented_integrations
                                       ^^^^^^^^^^^^^^^^^^^^^^^^^^ Location: /home/samuel/.gem/ruby/3.1.2/gems/ddtrace-1.1.0/lib/datadog/core/diagnostics/environment_logger.rb:260:in `instrumented_integrations'

As discussed, maybe with the datadog gem, maybe it would be possible to write require 'datadog'. This also doesn't work right now.

delner commented 2 years ago

I think this is an artifact of package design right now.

In theory you include datadog/tracing and it loads datadog/core, which has this configuration & environment logger. Problem is the environment logger has direct knowledge of a method added by datadog/tracing/contrib, which is likely not loaded. The dependency chain is messed here.

It should probably chain like datadog/tracing/contrib --> datadog/tracing --> datadog/core. Core shouldn't have any references to tracing behavior, but right now it does. It's some refactoring we didn't have time to get to in 1.0, but we hope to continue cleaning up in the midterm.

Two things that might help in the interim: either 1) require 'datadog/tracing/contrib' or 2) we change the environment logger to have soft dependencies on contrib stuff like instrumented_integrations. Either way, environment logger isn't a particularly useful or important feature right now, so I think it's the easiest thing to change short term.