ddtrace 0.12.0 → 0.13.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (98) hide show
  1. checksums.yaml +4 -4
  2. data/.circleci/config.yml +468 -0
  3. data/.circleci/images/primary/Dockerfile-1.9.3 +69 -0
  4. data/.circleci/images/primary/Dockerfile-2.0.0 +69 -0
  5. data/.circleci/images/primary/Dockerfile-2.1.10 +69 -0
  6. data/.circleci/images/primary/Dockerfile-2.2.10 +69 -0
  7. data/.circleci/images/primary/Dockerfile-2.3.7 +73 -0
  8. data/.circleci/images/primary/Dockerfile-2.4.4 +73 -0
  9. data/.dockerignore +1 -0
  10. data/.env +21 -11
  11. data/.gitignore +1 -1
  12. data/.rubocop.yml +4 -1
  13. data/Appraisals +471 -66
  14. data/CHANGELOG.md +80 -2
  15. data/Rakefile +304 -80
  16. data/ddtrace.gemspec +7 -7
  17. data/docker-compose.yml +240 -37
  18. data/docs/GettingStarted.md +273 -7
  19. data/lib/ddtrace/configuration.rb +2 -2
  20. data/lib/ddtrace/contrib/active_model_serializers/event.rb +57 -0
  21. data/lib/ddtrace/contrib/active_model_serializers/events/render.rb +32 -0
  22. data/lib/ddtrace/contrib/active_model_serializers/events/serialize.rb +35 -0
  23. data/lib/ddtrace/contrib/active_model_serializers/events.rb +30 -0
  24. data/lib/ddtrace/contrib/active_model_serializers/patcher.rb +62 -0
  25. data/lib/ddtrace/contrib/active_record/event.rb +30 -0
  26. data/lib/ddtrace/contrib/active_record/events/instantiation.rb +51 -0
  27. data/lib/ddtrace/contrib/active_record/events/sql.rb +48 -0
  28. data/lib/ddtrace/contrib/active_record/events.rb +30 -0
  29. data/lib/ddtrace/contrib/active_record/patcher.rb +3 -73
  30. data/lib/ddtrace/contrib/active_record/utils.rb +1 -15
  31. data/lib/ddtrace/contrib/active_support/notifications/event.rb +62 -0
  32. data/lib/ddtrace/contrib/aws/instrumentation.rb +2 -2
  33. data/lib/ddtrace/contrib/elasticsearch/patcher.rb +2 -2
  34. data/lib/ddtrace/contrib/elasticsearch/quantize.rb +18 -49
  35. data/lib/ddtrace/contrib/excon/middleware.rb +139 -0
  36. data/lib/ddtrace/contrib/excon/patcher.rb +50 -0
  37. data/lib/ddtrace/contrib/grpc/datadog_interceptor/client.rb +49 -0
  38. data/lib/ddtrace/contrib/grpc/datadog_interceptor/server.rb +66 -0
  39. data/lib/ddtrace/contrib/grpc/datadog_interceptor.rb +65 -0
  40. data/lib/ddtrace/contrib/grpc/intercept_with_datadog.rb +49 -0
  41. data/lib/ddtrace/contrib/grpc/patcher.rb +62 -0
  42. data/lib/ddtrace/contrib/http/patcher.rb +18 -16
  43. data/lib/ddtrace/contrib/mongodb/parsers.rb +24 -13
  44. data/lib/ddtrace/contrib/mongodb/patcher.rb +1 -0
  45. data/lib/ddtrace/contrib/mongodb/subscribers.rb +5 -4
  46. data/lib/ddtrace/contrib/mysql2/client.rb +60 -0
  47. data/lib/ddtrace/contrib/mysql2/patcher.rb +43 -0
  48. data/lib/ddtrace/contrib/racecar/event.rb +61 -0
  49. data/lib/ddtrace/contrib/racecar/events/batch.rb +27 -0
  50. data/lib/ddtrace/contrib/racecar/events/message.rb +27 -0
  51. data/lib/ddtrace/contrib/racecar/events.rb +30 -0
  52. data/lib/ddtrace/contrib/racecar/patcher.rb +6 -52
  53. data/lib/ddtrace/contrib/rack/middlewares.rb +65 -11
  54. data/lib/ddtrace/contrib/rack/patcher.rb +16 -0
  55. data/lib/ddtrace/contrib/rack/request_queue.rb +34 -0
  56. data/lib/ddtrace/contrib/rails/action_controller_patch.rb +77 -0
  57. data/lib/ddtrace/contrib/rails/action_view.rb +0 -65
  58. data/lib/ddtrace/contrib/rails/active_support.rb +9 -8
  59. data/lib/ddtrace/contrib/rails/core_extensions.rb +74 -115
  60. data/lib/ddtrace/contrib/rake/instrumentation.rb +70 -0
  61. data/lib/ddtrace/contrib/rake/patcher.rb +53 -0
  62. data/lib/ddtrace/contrib/sequel/database.rb +58 -0
  63. data/lib/ddtrace/contrib/sequel/dataset.rb +59 -0
  64. data/lib/ddtrace/contrib/sequel/patcher.rb +56 -0
  65. data/lib/ddtrace/contrib/sequel/utils.rb +28 -0
  66. data/lib/ddtrace/contrib/sidekiq/tracer.rb +1 -0
  67. data/lib/ddtrace/contrib/sinatra/env.rb +39 -0
  68. data/lib/ddtrace/contrib/sinatra/headers.rb +31 -0
  69. data/lib/ddtrace/contrib/sinatra/tracer.rb +21 -38
  70. data/lib/ddtrace/contrib/sinatra/tracer_middleware.rb +61 -0
  71. data/lib/ddtrace/ext/distributed.rb +5 -0
  72. data/lib/ddtrace/ext/grpc.rb +7 -0
  73. data/lib/ddtrace/ext/http.rb +35 -5
  74. data/lib/ddtrace/propagation/grpc_propagator.rb +54 -0
  75. data/lib/ddtrace/quantization/hash.rb +103 -0
  76. data/lib/ddtrace/tracer.rb +4 -1
  77. data/lib/ddtrace/utils/database.rb +21 -0
  78. data/lib/ddtrace/utils.rb +12 -2
  79. data/lib/ddtrace/version.rb +1 -1
  80. data/lib/ddtrace.rb +7 -0
  81. metadata +50 -21
  82. data/circle.yml +0 -69
  83. data/gemfiles/contrib.gemfile +0 -25
  84. data/gemfiles/contrib_old.gemfile +0 -23
  85. data/gemfiles/rails30_postgres.gemfile +0 -11
  86. data/gemfiles/rails30_postgres_sidekiq.gemfile +0 -12
  87. data/gemfiles/rails32_mysql2.gemfile +0 -12
  88. data/gemfiles/rails32_postgres.gemfile +0 -11
  89. data/gemfiles/rails32_postgres_redis.gemfile +0 -13
  90. data/gemfiles/rails32_postgres_sidekiq.gemfile +0 -12
  91. data/gemfiles/rails4_mysql2.gemfile +0 -10
  92. data/gemfiles/rails4_postgres.gemfile +0 -10
  93. data/gemfiles/rails4_postgres_redis.gemfile +0 -12
  94. data/gemfiles/rails4_postgres_sidekiq.gemfile +0 -12
  95. data/gemfiles/rails5_mysql2.gemfile +0 -9
  96. data/gemfiles/rails5_postgres.gemfile +0 -9
  97. data/gemfiles/rails5_postgres_redis.gemfile +0 -11
  98. data/gemfiles/rails5_postgres_sidekiq.gemfile +0 -11
@@ -9,11 +9,11 @@ module Datadog
9
9
 
10
10
  def initialize(options = {})
11
11
  @registry = options.fetch(:registry, Datadog.registry)
12
+ @wrapped_registry = {}
12
13
  end
13
14
 
14
15
  def [](integration_name)
15
- integration = fetch_integration(integration_name)
16
- Proxy.new(integration)
16
+ @wrapped_registry[integration_name] ||= Proxy.new(fetch_integration(integration_name))
17
17
  end
18
18
 
19
19
  def use(integration_name, options = {})
@@ -0,0 +1,57 @@
1
+ require 'ddtrace/contrib/active_support/notifications/event'
2
+
3
+ module Datadog
4
+ module Contrib
5
+ module ActiveModelSerializers
6
+ # Defines basic behaviors for an ActiveModelSerializers event.
7
+ module Event
8
+ def self.included(base)
9
+ base.send(:include, ActiveSupport::Notifications::Event)
10
+ base.send(:extend, ClassMethods)
11
+ end
12
+
13
+ # Class methods for ActiveModelSerializers events.
14
+ # Note, they share the same process method and before_trace method.
15
+ module ClassMethods
16
+ def span_options
17
+ { service: configuration[:service_name] }
18
+ end
19
+
20
+ def tracer
21
+ configuration[:tracer]
22
+ end
23
+
24
+ def configuration
25
+ Datadog.configuration[:active_model_serializers]
26
+ end
27
+
28
+ def process(span, event, _id, payload)
29
+ span.service = configuration[:service_name]
30
+
31
+ # Set the resource name and serializer name
32
+ res = resource(payload[:serializer])
33
+ span.resource = res
34
+ span.set_tag('active_model_serializers.serializer', res)
35
+
36
+ span.span_type = Datadog::Ext::HTTP::TEMPLATE
37
+
38
+ # Will be nil in 0.9
39
+ span.set_tag('active_model_serializers.adapter', payload[:adapter].class) unless payload[:adapter].nil?
40
+ end
41
+
42
+ private
43
+
44
+ def resource(serializer)
45
+ # Depending on the version of ActiveModelSerializers
46
+ # serializer will be a string or an object.
47
+ if serializer.respond_to?(:name)
48
+ serializer.name
49
+ else
50
+ serializer
51
+ end
52
+ end
53
+ end
54
+ end
55
+ end
56
+ end
57
+ end
@@ -0,0 +1,32 @@
1
+ require 'ddtrace/contrib/active_model_serializers/event'
2
+
3
+ module Datadog
4
+ module Contrib
5
+ module ActiveModelSerializers
6
+ module Events
7
+ # Defines instrumentation for render.active_model_serializers event
8
+ module Render
9
+ include ActiveModelSerializers::Event
10
+
11
+ EVENT_NAME = 'render.active_model_serializers'.freeze
12
+ SPAN_NAME = 'active_model_serializers.render'.freeze
13
+
14
+ module_function
15
+
16
+ def supported?
17
+ Gem.loaded_specs['active_model_serializers'] \
18
+ && Gem.loaded_specs['active_model_serializers'].version >= Gem::Version.new('0.10')
19
+ end
20
+
21
+ def event_name
22
+ self::EVENT_NAME
23
+ end
24
+
25
+ def span_name
26
+ self::SPAN_NAME
27
+ end
28
+ end
29
+ end
30
+ end
31
+ end
32
+ end
@@ -0,0 +1,35 @@
1
+ require 'ddtrace/contrib/active_model_serializers/event'
2
+
3
+ module Datadog
4
+ module Contrib
5
+ module ActiveModelSerializers
6
+ module Events
7
+ # Defines instrumentation for !serialize.active_model_serializers event
8
+ module Serialize
9
+ include ActiveModelSerializers::Event
10
+
11
+ EVENT_NAME = '!serialize.active_model_serializers'.freeze
12
+ SPAN_NAME = 'active_model_serializers.serialize'.freeze
13
+
14
+ module_function
15
+
16
+ def supported?
17
+ Gem.loaded_specs['active_model_serializers'] \
18
+ && ( \
19
+ Gem.loaded_specs['active_model_serializers'].version >= Gem::Version.new('0.9') \
20
+ && Gem.loaded_specs['active_model_serializers'].version < Gem::Version.new('0.10') \
21
+ )
22
+ end
23
+
24
+ def event_name
25
+ self::EVENT_NAME
26
+ end
27
+
28
+ def span_name
29
+ self::SPAN_NAME
30
+ end
31
+ end
32
+ end
33
+ end
34
+ end
35
+ end
@@ -0,0 +1,30 @@
1
+ require 'ddtrace/contrib/active_model_serializers/events/render'
2
+ require 'ddtrace/contrib/active_model_serializers/events/serialize'
3
+
4
+ module Datadog
5
+ module Contrib
6
+ module ActiveModelSerializers
7
+ # Defines collection of instrumented ActiveModelSerializers events
8
+ module Events
9
+ ALL = [
10
+ Events::Render,
11
+ Events::Serialize
12
+ ].freeze
13
+
14
+ module_function
15
+
16
+ def all
17
+ self::ALL
18
+ end
19
+
20
+ def subscriptions
21
+ all.collect(&:subscriptions).collect(&:to_a).flatten
22
+ end
23
+
24
+ def subscribe!
25
+ all.each(&:subscribe!)
26
+ end
27
+ end
28
+ end
29
+ end
30
+ end
@@ -0,0 +1,62 @@
1
+ require 'ddtrace/ext/app_types'
2
+ require 'ddtrace/ext/http'
3
+ require 'ddtrace/contrib/active_model_serializers/events'
4
+
5
+ module Datadog
6
+ module Contrib
7
+ module ActiveModelSerializers
8
+ # Provides instrumentation for ActiveModelSerializers through ActiveSupport instrumentation signals
9
+ module Patcher
10
+ include Base
11
+
12
+ VERSION_REQUIRED = Gem::Version.new('0.9.0')
13
+
14
+ register_as :active_model_serializers
15
+
16
+ option :service_name, default: 'active_model_serializers'
17
+ option :tracer, default: Datadog.tracer do |value|
18
+ (value || Datadog.tracer).tap do |v|
19
+ # Make sure to update tracers of all subscriptions
20
+ Events.subscriptions.each do |subscription|
21
+ subscription.tracer = v
22
+ end
23
+ end
24
+ end
25
+
26
+ class << self
27
+ def patch
28
+ return patched? if patched? || !compatible?
29
+
30
+ # Subscribe to ActiveModelSerializers events
31
+ Events.subscribe!
32
+
33
+ # Set service info
34
+ configuration[:tracer].set_service_info(
35
+ configuration[:service_name],
36
+ 'active_model_serializers',
37
+ Ext::AppTypes::WEB
38
+ )
39
+
40
+ @patched = true
41
+ end
42
+
43
+ def patched?
44
+ return @patched if defined?(@patched)
45
+ @patched = false
46
+ end
47
+
48
+ private
49
+
50
+ def configuration
51
+ Datadog.configuration[:active_model_serializers]
52
+ end
53
+
54
+ def compatible?
55
+ Gem.loaded_specs['active_model_serializers'] && Gem.loaded_specs['activesupport'] \
56
+ && Gem.loaded_specs['active_model_serializers'].version >= VERSION_REQUIRED
57
+ end
58
+ end
59
+ end
60
+ end
61
+ end
62
+ end
@@ -0,0 +1,30 @@
1
+ require 'ddtrace/contrib/active_support/notifications/event'
2
+
3
+ module Datadog
4
+ module Contrib
5
+ module ActiveRecord
6
+ # Defines basic behaviors for an ActiveRecord event.
7
+ module Event
8
+ def self.included(base)
9
+ base.send(:include, ActiveSupport::Notifications::Event)
10
+ base.send(:extend, ClassMethods)
11
+ end
12
+
13
+ # Class methods for ActiveRecord events.
14
+ module ClassMethods
15
+ def span_options
16
+ { service: configuration[:service_name] }
17
+ end
18
+
19
+ def tracer
20
+ configuration[:tracer]
21
+ end
22
+
23
+ def configuration
24
+ Datadog.configuration[:active_record]
25
+ end
26
+ end
27
+ end
28
+ end
29
+ end
30
+ end
@@ -0,0 +1,51 @@
1
+ require 'ddtrace/contrib/active_record/event'
2
+
3
+ module Datadog
4
+ module Contrib
5
+ module ActiveRecord
6
+ module Events
7
+ # Defines instrumentation for instantiation.active_record event
8
+ module Instantiation
9
+ include ActiveRecord::Event
10
+
11
+ EVENT_NAME = 'instantiation.active_record'.freeze
12
+ SPAN_NAME = 'active_record.instantiation'.freeze
13
+ DEFAULT_SERVICE_NAME = 'active_record'.freeze
14
+
15
+ module_function
16
+
17
+ def supported?
18
+ Gem.loaded_specs['activerecord'] \
19
+ && Gem.loaded_specs['activerecord'].version >= Gem::Version.new('4.2')
20
+ end
21
+
22
+ def event_name
23
+ self::EVENT_NAME
24
+ end
25
+
26
+ def span_name
27
+ self::SPAN_NAME
28
+ end
29
+
30
+ def process(span, event, _id, payload)
31
+ # Inherit service name from parent, if available.
32
+ span.service = if configuration[:orm_service_name]
33
+ configuration[:orm_service_name]
34
+ elsif span.parent
35
+ span.parent.service
36
+ else
37
+ self::DEFAULT_SERVICE_NAME
38
+ end
39
+
40
+ span.resource = payload.fetch(:class_name)
41
+ span.span_type = 'custom'
42
+ span.set_tag('active_record.instantiation.class_name', payload.fetch(:class_name))
43
+ span.set_tag('active_record.instantiation.record_count', payload.fetch(:record_count))
44
+ rescue StandardError => e
45
+ Datadog::Tracer.log.debug(e.message)
46
+ end
47
+ end
48
+ end
49
+ end
50
+ end
51
+ end
@@ -0,0 +1,48 @@
1
+ require 'ddtrace/contrib/active_record/event'
2
+
3
+ module Datadog
4
+ module Contrib
5
+ module ActiveRecord
6
+ module Events
7
+ # Defines instrumentation for sql.active_record event
8
+ module SQL
9
+ include ActiveRecord::Event
10
+
11
+ EVENT_NAME = 'sql.active_record'.freeze
12
+ SPAN_NAME = 'active_record.sql'.freeze
13
+
14
+ module_function
15
+
16
+ def event_name
17
+ self::EVENT_NAME
18
+ end
19
+
20
+ def span_name
21
+ self::SPAN_NAME
22
+ end
23
+
24
+ def process(span, event, _id, payload)
25
+ connection_config = Utils.connection_config(payload[:connection_id])
26
+ span.name = "#{connection_config[:adapter_name]}.query"
27
+ span.service = configuration[:service_name]
28
+ span.resource = payload.fetch(:sql)
29
+ span.span_type = Datadog::Ext::SQL::TYPE
30
+
31
+ # Find out if the SQL query has been cached in this request. This meta is really
32
+ # helpful to users because some spans may have 0ns of duration because the query
33
+ # is simply cached from memory, so the notification is fired with start == finish.
34
+ cached = payload[:cached] || (payload[:name] == 'CACHE')
35
+
36
+ span.set_tag('active_record.db.vendor', connection_config[:adapter_name])
37
+ span.set_tag('active_record.db.name', connection_config[:database_name])
38
+ span.set_tag('active_record.db.cached', cached) if cached
39
+ span.set_tag('out.host', connection_config[:adapter_host])
40
+ span.set_tag('out.port', connection_config[:adapter_port])
41
+ rescue StandardError => e
42
+ Datadog::Tracer.log.debug(e.message)
43
+ end
44
+ end
45
+ end
46
+ end
47
+ end
48
+ end
@@ -0,0 +1,30 @@
1
+ require 'ddtrace/contrib/active_record/events/instantiation'
2
+ require 'ddtrace/contrib/active_record/events/sql'
3
+
4
+ module Datadog
5
+ module Contrib
6
+ module ActiveRecord
7
+ # Defines collection of instrumented ActiveRecord events
8
+ module Events
9
+ ALL = [
10
+ Events::Instantiation,
11
+ Events::SQL
12
+ ].freeze
13
+
14
+ module_function
15
+
16
+ def all
17
+ self::ALL
18
+ end
19
+
20
+ def subscriptions
21
+ all.collect(&:subscriptions).collect(&:to_a).flatten
22
+ end
23
+
24
+ def subscribe!
25
+ all.each(&:subscribe!)
26
+ end
27
+ end
28
+ end
29
+ end
30
+ end
@@ -1,7 +1,7 @@
1
1
  require 'ddtrace/ext/sql'
2
2
  require 'ddtrace/ext/app_types'
3
3
  require 'ddtrace/contrib/active_record/utils'
4
- require 'ddtrace/contrib/active_support/notifications/subscriber'
4
+ require 'ddtrace/contrib/active_record/events'
5
5
 
6
6
  module Datadog
7
7
  module Contrib
@@ -9,10 +9,6 @@ module Datadog
9
9
  # Patcher enables patching of 'active_record' module.
10
10
  module Patcher
11
11
  include Base
12
- include ActiveSupport::Notifications::Subscriber
13
-
14
- NAME_SQL = 'sql.active_record'.freeze
15
- NAME_INSTANTIATION = 'instantiation.active_record'.freeze
16
12
 
17
13
  register_as :active_record, auto_patch: false
18
14
  option :service_name, depends_on: [:tracer] do |value|
@@ -24,7 +20,7 @@ module Datadog
24
20
  option :tracer, default: Datadog.tracer do |value|
25
21
  (value || Datadog.tracer).tap do |v|
26
22
  # Make sure to update tracers of all subscriptions
27
- subscriptions.each do |subscription|
23
+ Events.subscriptions.each do |subscription|
28
24
  subscription.tracer = v
29
25
  end
30
26
  end
@@ -32,28 +28,6 @@ module Datadog
32
28
 
33
29
  @patched = false
34
30
 
35
- on_subscribe do
36
- # sql.active_record
37
- subscribe(
38
- self::NAME_SQL, # Event name
39
- 'active_record.sql', # Span name
40
- { service: get_option(:service_name) }, # Span options
41
- get_option(:tracer), # Tracer
42
- &method(:sql) # Handler
43
- )
44
-
45
- # instantiation.active_record
46
- if instantiation_tracing_supported?
47
- subscribe(
48
- self::NAME_INSTANTIATION, # Event name
49
- 'active_record.instantiation', # Span name
50
- { service: get_option(:service_name) }, # Span options
51
- get_option(:tracer), # Tracer
52
- &method(:instantiation) # Handler
53
- )
54
- end
55
- end
56
-
57
31
  module_function
58
32
 
59
33
  # patched? tells whether patch has been successfully applied
@@ -64,7 +38,7 @@ module Datadog
64
38
  def patch
65
39
  if !@patched && defined?(::ActiveRecord)
66
40
  begin
67
- subscribe!
41
+ Events.subscribe!
68
42
  @patched = true
69
43
  rescue StandardError => e
70
44
  Datadog::Tracer.log.error("Unable to apply Active Record integration: #{e}")
@@ -73,50 +47,6 @@ module Datadog
73
47
 
74
48
  @patched
75
49
  end
76
-
77
- def instantiation_tracing_supported?
78
- Gem.loaded_specs['activerecord'] \
79
- && Gem.loaded_specs['activerecord'].version >= Gem::Version.new('4.2')
80
- end
81
-
82
- def sql(span, event, _id, payload)
83
- connection_config = Utils.connection_config(payload[:connection_id])
84
- span.name = "#{connection_config[:adapter_name]}.query"
85
- span.service = get_option(:service_name)
86
- span.resource = payload.fetch(:sql)
87
- span.span_type = Datadog::Ext::SQL::TYPE
88
-
89
- # Find out if the SQL query has been cached in this request. This meta is really
90
- # helpful to users because some spans may have 0ns of duration because the query
91
- # is simply cached from memory, so the notification is fired with start == finish.
92
- cached = payload[:cached] || (payload[:name] == 'CACHE')
93
-
94
- span.set_tag('active_record.db.vendor', connection_config[:adapter_name])
95
- span.set_tag('active_record.db.name', connection_config[:database_name])
96
- span.set_tag('active_record.db.cached', cached) if cached
97
- span.set_tag('out.host', connection_config[:adapter_host])
98
- span.set_tag('out.port', connection_config[:adapter_port])
99
- rescue StandardError => e
100
- Datadog::Tracer.log.debug(e.message)
101
- end
102
-
103
- def instantiation(span, event, _id, payload)
104
- # Inherit service name from parent, if available.
105
- span.service = if get_option(:orm_service_name)
106
- get_option(:orm_service_name)
107
- elsif span.parent
108
- span.parent.service
109
- else
110
- 'active_record'
111
- end
112
-
113
- span.resource = payload.fetch(:class_name)
114
- span.span_type = 'custom'
115
- span.set_tag('active_record.instantiation.class_name', payload.fetch(:class_name))
116
- span.set_tag('active_record.instantiation.record_count', payload.fetch(:record_count))
117
- rescue StandardError => e
118
- Datadog::Tracer.log.debug(e.message)
119
- end
120
50
  end
121
51
  end
122
52
  end
@@ -3,20 +3,6 @@ module Datadog
3
3
  module ActiveRecord
4
4
  # Common utilities for Rails
5
5
  module Utils
6
- # Return a canonical name for a type of database
7
- def self.normalize_vendor(vendor)
8
- case vendor
9
- when nil
10
- 'defaultdb'
11
- when 'postgresql'
12
- 'postgres'
13
- when 'sqlite3'
14
- 'sqlite'
15
- else
16
- vendor
17
- end
18
- end
19
-
20
6
  def self.adapter_name
21
7
  connection_config[:adapter_name]
22
8
  end
@@ -36,7 +22,7 @@ module Datadog
36
22
  def self.connection_config(object_id = nil)
37
23
  config = object_id.nil? ? default_connection_config : connection_config_by_id(object_id)
38
24
  {
39
- adapter_name: normalize_vendor(config[:adapter]),
25
+ adapter_name: Datadog::Utils::Database.normalize_vendor(config[:adapter]),
40
26
  adapter_host: config[:host],
41
27
  adapter_port: config[:port],
42
28
  database_name: config[:database]
@@ -0,0 +1,62 @@
1
+ require 'ddtrace/contrib/active_support/notifications/subscriber'
2
+
3
+ module Datadog
4
+ module Contrib
5
+ module ActiveSupport
6
+ module Notifications
7
+ # Defines behaviors for an ActiveSupport::Notifications event.
8
+ # Compose this into a module or class, then define
9
+ # #event_name, #span_name, and #process. You can then
10
+ # invoke Event.subscribe! to more easily subscribe to an event.
11
+ module Event
12
+ def self.included(base)
13
+ base.send(:include, Subscriber)
14
+ base.send(:extend, ClassMethods)
15
+ base.send(:on_subscribe) { base.subscribe }
16
+ end
17
+
18
+ # Redefines some class behaviors for a Subscriber to make
19
+ # it a bit simpler for an Event.
20
+ module ClassMethods
21
+ def subscribe!
22
+ super
23
+ end
24
+
25
+ def subscription(span_name = nil, options = nil, tracer = nil)
26
+ super(
27
+ span_name || self.span_name,
28
+ options || span_options,
29
+ tracer || self.tracer,
30
+ &method(:process)
31
+ )
32
+ end
33
+
34
+ def subscribe(pattern = nil, span_name = nil, options = nil, tracer = nil)
35
+ if supported?
36
+ super(
37
+ pattern || event_name,
38
+ span_name || self.span_name,
39
+ options || span_options,
40
+ tracer || self.tracer,
41
+ &method(:process)
42
+ )
43
+ end
44
+ end
45
+
46
+ def supported?
47
+ true
48
+ end
49
+
50
+ def span_options
51
+ {}
52
+ end
53
+
54
+ def tracer
55
+ Datadog.tracer
56
+ end
57
+ end
58
+ end
59
+ end
60
+ end
61
+ end
62
+ end
@@ -27,8 +27,8 @@ module Datadog
27
27
  def annotate!(span, pin, context)
28
28
  span.service = pin.service
29
29
  span.span_type = pin.app_type
30
- span.name = context.safely(:resource)
31
- span.resource = RESOURCE
30
+ span.name = RESOURCE
31
+ span.resource = context.safely(:resource)
32
32
  span.set_tag('aws.agent', AGENT)
33
33
  span.set_tag('aws.operation', context.safely(:operation))
34
34
  span.set_tag('aws.region', context.safely(:region))
@@ -52,11 +52,11 @@ module Datadog
52
52
  remove_method :initialize
53
53
  end
54
54
 
55
- def initialize(*args)
55
+ def initialize(*args, &block)
56
56
  service = Datadog.configuration[:elasticsearch][:service_name]
57
57
  pin = Datadog::Pin.new(service, app: 'elasticsearch', app_type: Datadog::Ext::AppTypes::DB)
58
58
  pin.onto(self)
59
- initialize_without_datadog(*args)
59
+ initialize_without_datadog(*args, &block)
60
60
  end
61
61
 
62
62
  alias_method :perform_request_without_datadog, :perform_request