ddtrace 0.11.0.beta2 → 0.11.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 (55) hide show
  1. checksums.yaml +4 -4
  2. data/.rspec +1 -0
  3. data/Appraisals +11 -11
  4. data/Gemfile +3 -0
  5. data/README.md +1 -1
  6. data/Rakefile +67 -5
  7. data/ddtrace.gemspec +6 -4
  8. data/docs/GettingStarted.md +239 -432
  9. data/gemfiles/contrib.gemfile +2 -1
  10. data/gemfiles/contrib_old.gemfile +5 -3
  11. data/gemfiles/rails30_postgres.gemfile +1 -0
  12. data/gemfiles/rails30_postgres_sidekiq.gemfile +1 -0
  13. data/gemfiles/rails32_mysql2.gemfile +1 -0
  14. data/gemfiles/rails32_postgres.gemfile +1 -0
  15. data/gemfiles/rails32_postgres_redis.gemfile +1 -0
  16. data/gemfiles/rails32_postgres_sidekiq.gemfile +1 -0
  17. data/gemfiles/rails4_mysql2.gemfile +1 -0
  18. data/gemfiles/rails4_postgres.gemfile +2 -1
  19. data/gemfiles/rails4_postgres_redis.gemfile +2 -1
  20. data/gemfiles/rails4_postgres_sidekiq.gemfile +2 -1
  21. data/gemfiles/rails5_mysql2.gemfile +1 -0
  22. data/gemfiles/rails5_postgres.gemfile +2 -1
  23. data/gemfiles/rails5_postgres_redis.gemfile +3 -2
  24. data/gemfiles/rails5_postgres_sidekiq.gemfile +2 -1
  25. data/lib/ddtrace.rb +6 -2
  26. data/lib/ddtrace/configuration.rb +2 -0
  27. data/lib/ddtrace/configuration/pin_setup.rb +30 -0
  28. data/lib/ddtrace/contrib/active_record/patcher.rb +6 -0
  29. data/lib/ddtrace/contrib/aws/patcher.rb +3 -4
  30. data/lib/ddtrace/contrib/dalli/patcher.rb +3 -4
  31. data/lib/ddtrace/contrib/dalli/quantize.rb +5 -2
  32. data/lib/ddtrace/contrib/elasticsearch/patcher.rb +0 -1
  33. data/lib/ddtrace/contrib/faraday/patcher.rb +6 -5
  34. data/lib/ddtrace/contrib/grape/patcher.rb +0 -3
  35. data/lib/ddtrace/contrib/mongodb/patcher.rb +0 -3
  36. data/lib/ddtrace/contrib/rack/patcher.rb +12 -4
  37. data/lib/ddtrace/contrib/rails/active_record.rb +2 -5
  38. data/lib/ddtrace/contrib/rails/active_support.rb +2 -1
  39. data/lib/ddtrace/contrib/rails/core_extensions.rb +24 -7
  40. data/lib/ddtrace/contrib/rails/utils.rb +6 -4
  41. data/lib/ddtrace/contrib/redis/patcher.rb +7 -20
  42. data/lib/ddtrace/contrib/redis/quantize.rb +4 -4
  43. data/lib/ddtrace/contrib/resque/patcher.rb +3 -3
  44. data/lib/ddtrace/contrib/resque/resque_job.rb +0 -1
  45. data/lib/ddtrace/contrib/sidekiq/patcher.rb +33 -0
  46. data/lib/ddtrace/contrib/sidekiq/tracer.rb +1 -15
  47. data/lib/ddtrace/contrib/sucker_punch/patcher.rb +1 -2
  48. data/lib/ddtrace/error.rb +3 -13
  49. data/lib/ddtrace/ext/cache.rb +1 -0
  50. data/lib/ddtrace/ext/priority.rb +16 -0
  51. data/lib/ddtrace/monkey.rb +1 -0
  52. data/lib/ddtrace/pin.rb +17 -9
  53. data/lib/ddtrace/sampler.rb +4 -2
  54. data/lib/ddtrace/utils.rb +22 -3
  55. metadata +41 -9
@@ -2,6 +2,7 @@
2
2
 
3
3
  source "https://rubygems.org"
4
4
 
5
+ gem "pry-nav", git: "https://github.com/nixme/pry-nav.git", branch: "master"
5
6
  gem "elasticsearch-transport"
6
7
  gem "mongo"
7
8
  gem "grape"
@@ -16,7 +17,7 @@ gem "sidekiq"
16
17
  gem "aws-sdk"
17
18
  gem "sucker_punch"
18
19
  gem "dalli"
19
- gem "resque"
20
+ gem "resque", "< 2.0"
20
21
  gem "racecar", ">= 0.3.5"
21
22
 
22
23
  gemspec path: "../"
@@ -2,18 +2,20 @@
2
2
 
3
3
  source "https://rubygems.org"
4
4
 
5
+ gem "pry-nav", git: "https://github.com/nixme/pry-nav.git", branch: "master"
5
6
  gem "elasticsearch-transport"
6
7
  gem "mongo"
7
- gem "redis", "< 4.0.0"
8
+ gem "redis", "< 4.0"
8
9
  gem "hiredis"
9
10
  gem "rack", "1.4.7"
10
- gem "rack-test"
11
+ gem "rack-test", "0.7.0"
11
12
  gem "sinatra", "1.4.5"
12
13
  gem "sqlite3"
13
14
  gem "activerecord", "3.2.22.5"
14
15
  gem "sidekiq", "4.0.0"
15
16
  gem "aws-sdk", "~> 2.0"
16
17
  gem "sucker_punch"
17
- gem "resque"
18
+ gem "dalli"
19
+ gem "resque", "< 2.0"
18
20
 
19
21
  gemspec path: "../"
@@ -2,6 +2,7 @@
2
2
 
3
3
  source "https://rubygems.org"
4
4
 
5
+ gem "pry-nav", git: "https://github.com/nixme/pry-nav.git", branch: "master"
5
6
  gem "test-unit"
6
7
  gem "rails", "3.0.20"
7
8
  gem "pg", "0.15.1", platform: :ruby
@@ -2,6 +2,7 @@
2
2
 
3
3
  source "https://rubygems.org"
4
4
 
5
+ gem "pry-nav", git: "https://github.com/nixme/pry-nav.git", branch: "master"
5
6
  gem "test-unit"
6
7
  gem "rails", "3.0.20"
7
8
  gem "pg", "0.15.1", platform: :ruby
@@ -2,6 +2,7 @@
2
2
 
3
3
  source "https://rubygems.org"
4
4
 
5
+ gem "pry-nav", git: "https://github.com/nixme/pry-nav.git", branch: "master"
5
6
  gem "test-unit"
6
7
  gem "rails", "3.2.22.5"
7
8
  gem "mysql2", "0.3.21", platform: :ruby
@@ -2,6 +2,7 @@
2
2
 
3
3
  source "https://rubygems.org"
4
4
 
5
+ gem "pry-nav", git: "https://github.com/nixme/pry-nav.git", branch: "master"
5
6
  gem "test-unit"
6
7
  gem "rails", "3.2.22.5"
7
8
  gem "pg", "0.15.1", platform: :ruby
@@ -2,6 +2,7 @@
2
2
 
3
3
  source "https://rubygems.org"
4
4
 
5
+ gem "pry-nav", git: "https://github.com/nixme/pry-nav.git", branch: "master"
5
6
  gem "test-unit"
6
7
  gem "rails", "3.2.22.5"
7
8
  gem "pg", "0.15.1", platform: :ruby
@@ -2,6 +2,7 @@
2
2
 
3
3
  source "https://rubygems.org"
4
4
 
5
+ gem "pry-nav", git: "https://github.com/nixme/pry-nav.git", branch: "master"
5
6
  gem "test-unit"
6
7
  gem "rails", "3.2.22.5"
7
8
  gem "pg", "0.15.1", platform: :ruby
@@ -2,6 +2,7 @@
2
2
 
3
3
  source "https://rubygems.org"
4
4
 
5
+ gem "pry-nav", git: "https://github.com/nixme/pry-nav.git", branch: "master"
5
6
  gem "rails", "4.2.7.1"
6
7
  gem "mysql2", platform: :ruby
7
8
  gem "activerecord-jdbcmysql-adapter", platform: :jruby
@@ -2,8 +2,9 @@
2
2
 
3
3
  source "https://rubygems.org"
4
4
 
5
+ gem "pry-nav", git: "https://github.com/nixme/pry-nav.git", branch: "master"
5
6
  gem "rails", "4.2.7.1"
6
- gem "pg", platform: :ruby
7
+ gem "pg", "< 1.0", platform: :ruby
7
8
  gem "activerecord-jdbcpostgresql-adapter", platform: :jruby
8
9
 
9
10
  gemspec path: "../"
@@ -2,8 +2,9 @@
2
2
 
3
3
  source "https://rubygems.org"
4
4
 
5
+ gem "pry-nav", git: "https://github.com/nixme/pry-nav.git", branch: "master"
5
6
  gem "rails", "4.2.7.1"
6
- gem "pg", platform: :ruby
7
+ gem "pg", "< 1.0", platform: :ruby
7
8
  gem "activerecord-jdbcpostgresql-adapter", platform: :jruby
8
9
  gem "redis-rails"
9
10
  gem "redis", "< 4.0"
@@ -2,8 +2,9 @@
2
2
 
3
3
  source "https://rubygems.org"
4
4
 
5
+ gem "pry-nav", git: "https://github.com/nixme/pry-nav.git", branch: "master"
5
6
  gem "rails", "4.2.7.1"
6
- gem "pg", platform: :ruby
7
+ gem "pg", "< 1.0", platform: :ruby
7
8
  gem "activerecord-jdbcpostgresql-adapter", platform: :jruby
8
9
  gem "sidekiq"
9
10
  gem "activejob"
@@ -2,6 +2,7 @@
2
2
 
3
3
  source "https://rubygems.org"
4
4
 
5
+ gem "pry-nav", git: "https://github.com/nixme/pry-nav.git", branch: "master"
5
6
  gem "rails", "5.0.1"
6
7
  gem "mysql2", platform: :ruby
7
8
 
@@ -2,7 +2,8 @@
2
2
 
3
3
  source "https://rubygems.org"
4
4
 
5
+ gem "pry-nav", git: "https://github.com/nixme/pry-nav.git", branch: "master"
5
6
  gem "rails", "5.0.1"
6
- gem "pg", platform: :ruby
7
+ gem "pg", "< 1.0", platform: :ruby
7
8
 
8
9
  gemspec path: "../"
@@ -2,9 +2,10 @@
2
2
 
3
3
  source "https://rubygems.org"
4
4
 
5
+ gem "pry-nav", git: "https://github.com/nixme/pry-nav.git", branch: "master"
5
6
  gem "rails", "5.0.1"
6
- gem "pg", platform: :ruby
7
+ gem "pg", "< 1.0", platform: :ruby
7
8
  gem "redis-rails"
8
- gem "redis", "< 4.0"
9
+ gem "redis"
9
10
 
10
11
  gemspec path: "../"
@@ -2,8 +2,9 @@
2
2
 
3
3
  source "https://rubygems.org"
4
4
 
5
+ gem "pry-nav", git: "https://github.com/nixme/pry-nav.git", branch: "master"
5
6
  gem "rails", "5.0.1"
6
- gem "pg", platform: :ruby
7
+ gem "pg", "< 1.0", platform: :ruby
7
8
  gem "sidekiq"
8
9
  gem "activejob"
9
10
 
data/lib/ddtrace.rb CHANGED
@@ -39,8 +39,12 @@ module Datadog
39
39
  @configuration ||= Configuration.new
40
40
  end
41
41
 
42
- def configure
43
- yield(configuration)
42
+ def configure(target = configuration, opts = {})
43
+ if target.is_a?(Configuration)
44
+ yield(target)
45
+ else
46
+ Configuration::PinSetup.new(target, opts).call
47
+ end
44
48
  end
45
49
  end
46
50
  end
@@ -1,5 +1,6 @@
1
1
  require_relative 'configuration/proxy'
2
2
  require_relative 'configuration/resolver'
3
+ require_relative 'configuration/pin_setup'
3
4
 
4
5
  module Datadog
5
6
  # Configuration provides a unique access point for configurations
@@ -30,6 +31,7 @@ module Datadog
30
31
  instance = options.fetch(:instance, Datadog.tracer)
31
32
 
32
33
  instance.configure(options)
34
+ instance.class.log = options[:log] if options[:log]
33
35
  instance.set_tags(options[:tags]) if options[:tags]
34
36
  instance.set_tags(env: options[:env]) if options[:env]
35
37
  instance.class.debug_logging = options.fetch(:debug, false)
@@ -0,0 +1,30 @@
1
+ module Datadog
2
+ class Configuration
3
+ # PinSetup translates a flat hash into a Pin configuration
4
+ # This class should be removed if we ever remove/refactor the Pin class
5
+ class PinSetup
6
+ def initialize(target, opts = {})
7
+ @pin = Pin.get_from(target)
8
+ @opts = opts
9
+ end
10
+
11
+ def call
12
+ return unless pin
13
+
14
+ ATTRS.each { |key| pin.public_send("#{key}=", opts[key]) if opts[key] }
15
+
16
+ pin.config = opts.reject { |key, _| ATTRS.include?(key) }
17
+
18
+ true
19
+ end
20
+
21
+ private
22
+
23
+ attr_reader :pin, :opts
24
+
25
+ ATTRS = [:app, :tags, :app_type, :name, :tracer, :service_name].freeze
26
+
27
+ private_constant :ATTRS
28
+ end
29
+ end
30
+ end
@@ -80,12 +80,18 @@ module Datadog
80
80
  span_type: span_type
81
81
  )
82
82
 
83
+ # Find out if the SQL query has been cached in this request. This meta is really
84
+ # helpful to users because some spans may have 0ns of duration because the query
85
+ # is simply cached from memory, so the notification is fired with start == finish.
86
+ cached = payload[:cached] || (payload[:name] == 'CACHE')
87
+
83
88
  # the span should have the query ONLY in the Resource attribute,
84
89
  # so that the ``sql.query`` tag will be set in the agent with an
85
90
  # obfuscated version
86
91
  span.span_type = Datadog::Ext::SQL::TYPE
87
92
  span.set_tag('active_record.db.vendor', adapter_name)
88
93
  span.set_tag('active_record.db.name', database_name)
94
+ span.set_tag('active_record.db.cached', cached) if cached
89
95
  span.set_tag('out.host', adapter_host)
90
96
  span.set_tag('out.port', adapter_port)
91
97
  span.start_time = start
@@ -23,7 +23,6 @@ module Datadog
23
23
 
24
24
  add_pin
25
25
  add_plugin(Seahorse::Client::Base, *loaded_constants)
26
- Datadog.tracer.set_service_info(get_option(:service_name), 'aws', Ext::AppTypes::WEB)
27
26
 
28
27
  @patched = true
29
28
  rescue => e
@@ -38,9 +37,9 @@ module Datadog
38
37
  private
39
38
 
40
39
  def add_pin
41
- Pin.new(get_option(:service_name), app_type: Ext::AppTypes::WEB).tap do |pin|
42
- pin.onto(::Aws)
43
- end
40
+ Pin
41
+ .new(get_option(:service_name), app: 'aws', app_type: Ext::AppTypes::WEB)
42
+ .onto(::Aws)
44
43
  end
45
44
 
46
45
  def add_plugin(*targets)
@@ -22,7 +22,6 @@ module Datadog
22
22
 
23
23
  add_pin!
24
24
  Instrumentation.patch!
25
- Datadog.tracer.set_service_info(get_option(:service_name), 'dalli', Ext::AppTypes::CACHE)
26
25
 
27
26
  @patched = true
28
27
  rescue => e
@@ -43,9 +42,9 @@ module Datadog
43
42
  end
44
43
 
45
44
  def add_pin!
46
- Pin.new(get_option(:service_name), app_type: Ext::AppTypes::CACHE).tap do |pin|
47
- pin.onto(::Dalli)
48
- end
45
+ Pin
46
+ .new(get_option(:service_name), app: 'dalli', app_type: Ext::AppTypes::CACHE)
47
+ .onto(::Dalli)
49
48
  end
50
49
  end
51
50
  end
@@ -8,10 +8,13 @@ module Datadog
8
8
  module_function
9
9
 
10
10
  def format_command(operation, args)
11
+ placeholder = "#{operation} BLOB (OMITTED)"
11
12
  command = [operation, *args].join(' ').strip
13
+ command = Utils.utf8_encode(command, binary: true, placeholder: placeholder)
12
14
  Utils.truncate(command, MAX_CMD_LENGTH)
13
- rescue ::Encoding::CompatibilityError
14
- "#{operation} BLOB (OMITTED)"
15
+ rescue => e
16
+ Tracer.log.debug("Error sanitizing Dalli operation: #{e}")
17
+ placeholder
15
18
  end
16
19
  end
17
20
  end
@@ -34,7 +34,6 @@ module Datadog
34
34
  require 'ddtrace/contrib/elasticsearch/quantize'
35
35
 
36
36
  patch_elasticsearch_transport_client()
37
- Datadog.tracer.set_service_info(get_option(:service_name), 'elasticsearch', Ext::AppTypes::DB)
38
37
 
39
38
  @patched = true
40
39
  rescue StandardError => e
@@ -31,7 +31,6 @@ module Datadog
31
31
 
32
32
  add_pin
33
33
  add_middleware
34
- register_service(get_option(:service_name))
35
34
 
36
35
  @patched = true
37
36
  rescue => e
@@ -56,10 +55,12 @@ module Datadog
56
55
  end
57
56
 
58
57
  def add_pin
59
- Pin.new(get_option(:service_name), app_type: Ext::AppTypes::WEB).tap do |pin|
60
- pin.onto(::Faraday)
61
- pin.tracer = get_option(:tracer)
62
- end
58
+ Pin.new(
59
+ get_option(:service_name),
60
+ app: 'faraday',
61
+ app_type: Ext::AppTypes::WEB,
62
+ tracer: get_option(:tracer)
63
+ ).onto(::Faraday)
63
64
  end
64
65
 
65
66
  def add_middleware
@@ -35,9 +35,6 @@ module Datadog
35
35
  service = get_option(:service_name)
36
36
  pin = Datadog::Pin.new(service, app: 'grape', app_type: Datadog::Ext::AppTypes::WEB)
37
37
  pin.onto(::Grape)
38
- if pin.tracer && pin.service
39
- pin.tracer.set_service_info(pin.service, 'grape', pin.app_type)
40
- end
41
38
 
42
39
  # subscribe to ActiveSupport events
43
40
  Datadog::Contrib::Grape::Endpoint.subscribe()
@@ -67,9 +67,6 @@ module Datadog
67
67
  service = Datadog.configuration[:mongo][:service_name]
68
68
  pin = Datadog::Pin.new(service, app: APP, app_type: Datadog::Ext::AppTypes::DB)
69
69
  pin.onto(self)
70
- if pin.tracer && pin.service
71
- pin.tracer.set_service_info(pin.service, 'mongodb', pin.app_type)
72
- end
73
70
  end
74
71
 
75
72
  def datadog_pin
@@ -22,16 +22,24 @@ module Datadog
22
22
  require_relative 'middlewares'
23
23
  @patched = true
24
24
 
25
- return unless get_option(:middleware_names)
26
-
27
- top = get_option(:application) || rails_app
28
- retain_middleware_name(top)
25
+ enable_middleware_names if get_option(:middleware_names)
29
26
  end
30
27
 
31
28
  def patched?
32
29
  @patched ||= false
33
30
  end
34
31
 
32
+ def enable_middleware_names
33
+ root = get_option(:application) || rails_app
34
+ retain_middleware_name(root)
35
+ rescue => e
36
+ # We can safely ignore these exceptions since they happen only in the
37
+ # context of middleware patching outside a Rails server process (eg. a
38
+ # process that doesn't serve HTTP requests but has Rails environment
39
+ # loaded such as a Resque master process)
40
+ Tracer.log.debug("Error patching middleware stack: #{e}")
41
+ end
42
+
35
43
  def rails_app
36
44
  return unless Datadog.registry[:rails].compatible?
37
45
  ::Rails.application.app
@@ -33,13 +33,10 @@ module Datadog
33
33
  span_type: span_type
34
34
  )
35
35
 
36
- # find out if the SQL query has been cached in this request. This meta is really
36
+ # Find out if the SQL query has been cached in this request. This meta is really
37
37
  # helpful to users because some spans may have 0ns of duration because the query
38
38
  # is simply cached from memory, so the notification is fired with start == finish.
39
- # TODO[manu]: this feature has been merged into master but has not yet released.
40
- # We're supporting this action as a best effort, but we should add a test after
41
- # a new version of Rails is out.
42
- cached = payload[:cached]
39
+ cached = payload[:cached] || (payload[:name] == 'CACHE')
43
40
 
44
41
  # the span should have the query ONLY in the Resource attribute,
45
42
  # so that the ``sql.query`` tag will be set in the agent with an
@@ -45,7 +45,8 @@ module Datadog
45
45
  # discard parameters from the cache_store configuration
46
46
  store, = *Array.wrap(::Rails.configuration.cache_store).flatten
47
47
  span.set_tag('rails.cache.backend', store)
48
- span.set_tag('rails.cache.key', payload.fetch(:key))
48
+ cache_key = Datadog::Utils.truncate(payload.fetch(:key), Ext::CACHE::MAX_KEY_SIZE)
49
+ span.set_tag('rails.cache.key', cache_key)
49
50
  span.set_error(payload[:exception]) if payload[:exception]
50
51
  ensure
51
52
  span.finish()