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

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

Overview

TODO: write docs

Constant Summary collapse

DEFAULT_CONFIG =

the default configuration

{
  enabled: true,
  auto_instrument: true,
  auto_instrument_redis: true,
  default_service: 'rails-app',
  default_cache_service: 'rails-cache',
  template_base_path: 'views/',
  tracer: Datadog.tracer,
  debug: false,
  trace_agent_hostname: Datadog::Writer::HOSTNAME,
  trace_agent_port: Datadog::Writer::PORT
}.freeze

Class Method Summary collapse

Class Method Details

.auto_instrumentObject

automatically instrument all Rails component



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

def self.auto_instrument
  return unless ::Rails.configuration.datadog_trace[:auto_instrument]
  Datadog::Tracer.log.info('Detected Rails >= 3.x. Enabling auto-instrumentation for core components.')
  Datadog::Contrib::Rails::ActionController.instrument()
  Datadog::Contrib::Rails::ActionView.instrument()
  Datadog::Contrib::Rails::ActiveRecord.instrument() if defined?(::ActiveRecord)
  Datadog::Contrib::Rails::ActiveSupport.instrument()

  # by default, Rails 3 doesn't instrument the cache system
  return unless ::Rails::VERSION::MAJOR.to_i == 3
  ::ActiveSupport::Cache::Store.instrument = true
end

.auto_instrument_redisObject



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

def self.auto_instrument_redis
  Datadog::Tracer.log.debug('instrumenting redis')
  return unless (defined? ::Rails.cache) && ::Rails.cache.respond_to?(:data)
  Datadog::Tracer.log.debug('redis cache exists')
  pin = Datadog::Pin.get_from(::Rails.cache.data)
  return unless pin
  Datadog::Tracer.log.debug('redis cache pin is set')
  pin.tracer = nil unless ::Rails.configuration.datadog_trace[:auto_instrument_redis]
end

.configure(config) ⇒ Object

configure Datadog settings



32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
# File 'lib/ddtrace/contrib/rails/framework.rb', line 32

def self.configure(config)
  # tracer defaults
  # merge default configurations with users settings
  user_config = config[:config].datadog_trace rescue {}
  datadog_config = DEFAULT_CONFIG.merge(user_config)
  datadog_config[:tracer].enabled = datadog_config[:enabled]

  # set debug logging
  Datadog::Tracer.debug_logging = datadog_config[:debug]

  # set the address of the trace agent
  datadog_config[:tracer].configure(
    hostname: datadog_config[:trace_agent_hostname],
    port: datadog_config[:trace_agent_port]
  )

  # set default service details
  datadog_config[:tracer].set_service_info(
    datadog_config[:default_service],
    'rails',
    Datadog::Ext::AppTypes::WEB
  )
  datadog_config[:tracer].set_service_info(
    datadog_config[:default_cache_service],
    'rails',
    Datadog::Ext::AppTypes::CACHE
  )

  # set default database service details and store it in the configuration
  if defined?(::ActiveRecord)
    begin
      conn_cfg = ::ActiveRecord::Base.connection_config()
      adapter_name = Datadog::Contrib::Rails::Utils.normalize_vendor(conn_cfg[:adapter])
      database_service = datadog_config.fetch(:default_database_service, adapter_name)
      datadog_config[:default_database_service] = database_service
      datadog_config[:tracer].set_service_info(
        database_service,
        adapter_name,
        Datadog::Ext::AppTypes::DB
      )
    rescue StandardError => e
      Datadog::Tracer.log.info("cannot configuring database service (#{e}), skipping activerecord instrumentation")
    end
  end

  # update global configurations
  ::Rails.configuration.datadog_trace = datadog_config
end