module Datadog::Contrib::Rails::Framework

Rails framework code, used to essentially:

Public Class Methods

activate_action_cable!(datadog_config, rails_config) click to toggle source
# File lib/ddtrace/contrib/rails/framework.rb, line 87
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) click to toggle source
# File lib/ddtrace/contrib/rails/framework.rb, line 96
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) click to toggle source
# File lib/ddtrace/contrib/rails/framework.rb, line 109
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) click to toggle source
# File lib/ddtrace/contrib/rails/framework.rb, line 118
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) click to toggle source
# File lib/ddtrace/contrib/rails/framework.rb, line 78
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_lograge!(datadog_config, rails_config) click to toggle source
# File lib/ddtrace/contrib/rails/framework.rb, line 127
def self.activate_lograge!(datadog_config, rails_config)
  return unless defined?(::Lograge)

  if rails_config[:log_injection]
    datadog_config.use(
      :lograge
    )
  end
end
activate_rack!(datadog_config, rails_config) click to toggle source
# File lib/ddtrace/contrib/rails/framework.rb, line 68
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
activate_semantic_logger!(datadog_config, rails_config) click to toggle source
# File lib/ddtrace/contrib/rails/framework.rb, line 137
def self.activate_semantic_logger!(datadog_config, rails_config)
  return unless defined?(::SemanticLogger)

  if rails_config[:log_injection]
    datadog_config.use(
      :semantic_logger
    )
  end
end
config_with_defaults(datadog_config) click to toggle source
# File lib/ddtrace/contrib/rails/framework.rb, line 57
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.configure.service_without_fallback || 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
setup() click to toggle source

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.

# File lib/ddtrace/contrib/rails/framework.rb, line 30
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)
    activate_lograge!(datadog_config, rails_config)
    activate_semantic_logger!(datadog_config, rails_config)
  end
end