Module: Datadog::Contrib::Rails::Framework

Defined in:
lib/ddtrace/contrib/rails/framework.rb

Overview

Rails framework code, used to essentially:

  • handle configuration entries which are specific to Datadog tracing

  • instrument parts of the framework when needed

Class Method Summary collapse

Class Method Details

.activate_action_cable!(datadog_config, rails_config) ⇒ Object



82
83
84
85
86
87
88
89
# File 'lib/ddtrace/contrib/rails/framework.rb', line 82

def self.activate_action_cable!(datadog_config, rails_config)
  return unless defined?(::ActionCable)

  datadog_config.use(
    :action_cable,
    service_name: "#{rails_config[:service_name]}-#{Contrib::ActionCable::Ext::SERVICE_NAME}"
  )
end

.activate_action_pack!(datadog_config, rails_config) ⇒ Object



91
92
93
94
95
96
97
98
99
100
101
102
# File 'lib/ddtrace/contrib/rails/framework.rb', line 91

def self.activate_action_pack!(datadog_config, rails_config)
  return unless defined?(::ActionPack)

  # TODO: This is configuring ActionPack but not patching. It will queue ActionPack
  #       for patching, but patching won't take place until Datadog.configure completes.
  #       Should we manually patch here?

  datadog_config.use(
    :action_pack,
    service_name: rails_config[:service_name]
  )
end

.activate_action_view!(datadog_config, rails_config) ⇒ Object



104
105
106
107
108
109
110
111
# File 'lib/ddtrace/contrib/rails/framework.rb', line 104

def self.activate_action_view!(datadog_config, rails_config)
  return unless defined?(::ActionView)

  datadog_config.use(
    :action_view,
    service_name: rails_config[:service_name]
  )
end

.activate_active_record!(datadog_config, rails_config) ⇒ Object



113
114
115
116
117
118
119
120
# File 'lib/ddtrace/contrib/rails/framework.rb', line 113

def self.activate_active_record!(datadog_config, rails_config)
  return unless defined?(::ActiveRecord)

  datadog_config.use(
    :active_record,
    service_name: rails_config[:database_service]
  )
end

.activate_active_support!(datadog_config, rails_config) ⇒ Object



73
74
75
76
77
78
79
80
# File 'lib/ddtrace/contrib/rails/framework.rb', line 73

def self.activate_active_support!(datadog_config, rails_config)
  return unless defined?(::ActiveSupport)

  datadog_config.use(
    :active_support,
    cache_service: rails_config[:cache_service]
  )
end

.activate_rack!(datadog_config, rails_config) ⇒ Object



63
64
65
66
67
68
69
70
71
# File 'lib/ddtrace/contrib/rails/framework.rb', line 63

def self.activate_rack!(datadog_config, rails_config)
  datadog_config.use(
    :rack,
    application: ::Rails.application,
    service_name: rails_config[:service_name],
    middleware_names: rails_config[:middleware_names],
    distributed_tracing: rails_config[:distributed_tracing]
  )
end

.config_with_defaults(datadog_config) ⇒ Object



52
53
54
55
56
57
58
59
60
61
# File 'lib/ddtrace/contrib/rails/framework.rb', line 52

def self.config_with_defaults(datadog_config)
  # We set defaults here instead of in the patcher because we need to wait
  # for the Rails application to be fully initialized.
  datadog_config[:rails].tap do |config|
    config[:service_name] ||= (Datadog.configuration.service || Utils.app_name)
    config[:database_service] ||= "#{config[:service_name]}-#{Contrib::ActiveRecord::Utils.adapter_name}"
    config[:controller_service] ||= config[:service_name]
    config[:cache_service] ||= "#{config[:service_name]}-cache"
  end
end

.setupObject

After the Rails application finishes initializing, we configure the Rails integration and all its sub-components with the application information available. We do this after the initialization because not all the information we require is available before then.



27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
# File 'lib/ddtrace/contrib/rails/framework.rb', line 27

def self.setup
  # NOTE: #configure has the side effect of rebuilding trace components.
  #       During a typical Rails application lifecycle, we will see trace
  #       components initialized twice because of this. This is necessary
  #       because key configuration is not available until after the Rails
  #       application has fully loaded, and some of this configuration is
  #       used to reconfigure tracer components with Rails-sourced defaults.
  #       This is a trade-off we take to get nice defaults.
  Datadog.configure do |datadog_config|
    rails_config = config_with_defaults(datadog_config)

    # By default, default service would be guessed from the script
    # being executed, but here we know better, get it from Rails config.
    # Don't set this if service has been explicitly provided by the user.
    datadog_config.service ||= rails_config[:service_name]

    activate_rack!(datadog_config, rails_config)
    activate_action_cable!(datadog_config, rails_config)
    activate_active_support!(datadog_config, rails_config)
    activate_action_pack!(datadog_config, rails_config)
    activate_action_view!(datadog_config, rails_config)
    activate_active_record!(datadog_config, rails_config)
  end
end