ddtrace 0.11.0.beta1 → 0.11.0.beta2

Sign up to get free protection for your applications and to get access to all the features.
Files changed (35) hide show
  1. checksums.yaml +4 -4
  2. data/Appraisals +4 -1
  3. data/Rakefile +4 -3
  4. data/circle.yml +22 -14
  5. data/ddtrace.gemspec +5 -2
  6. data/docs/GettingStarted.md +7 -5
  7. data/gemfiles/contrib.gemfile +2 -1
  8. data/gemfiles/rails4_postgres_redis.gemfile +1 -0
  9. data/gemfiles/rails5_postgres_redis.gemfile +1 -0
  10. data/lib/ddtrace/configurable.rb +7 -1
  11. data/lib/ddtrace/configuration/proxy.rb +1 -5
  12. data/lib/ddtrace/contrib/active_record/patcher.rb +16 -10
  13. data/lib/ddtrace/contrib/aws/patcher.rb +1 -0
  14. data/lib/ddtrace/contrib/dalli/patcher.rb +2 -1
  15. data/lib/ddtrace/contrib/dalli/quantize.rb +2 -0
  16. data/lib/ddtrace/contrib/elasticsearch/patcher.rb +9 -2
  17. data/lib/ddtrace/contrib/faraday/middleware.rb +13 -19
  18. data/lib/ddtrace/contrib/faraday/patcher.rb +18 -3
  19. data/lib/ddtrace/contrib/http/patcher.rb +5 -15
  20. data/lib/ddtrace/contrib/racecar/patcher.rb +81 -0
  21. data/lib/ddtrace/contrib/rack/middlewares.rb +28 -53
  22. data/lib/ddtrace/contrib/rack/patcher.rb +58 -0
  23. data/lib/ddtrace/contrib/rails/active_record.rb +7 -2
  24. data/lib/ddtrace/contrib/rails/framework.rb +13 -29
  25. data/lib/ddtrace/contrib/rails/patcher.rb +1 -1
  26. data/lib/ddtrace/contrib/rails/railtie.rb +2 -2
  27. data/lib/ddtrace/contrib/rails/utils.rb +26 -0
  28. data/lib/ddtrace/contrib/redis/quantize.rb +1 -0
  29. data/lib/ddtrace/contrib/resque/patcher.rb +3 -0
  30. data/lib/ddtrace/contrib/sidekiq/tracer.rb +1 -1
  31. data/lib/ddtrace/contrib/sinatra/tracer.rb +10 -2
  32. data/lib/ddtrace/contrib/sucker_punch/patcher.rb +1 -0
  33. data/lib/ddtrace/ext/app_types.rb +1 -0
  34. data/lib/ddtrace/monkey.rb +2 -0
  35. metadata +47 -3
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 97a9ed205c345e9abaa1b22823662552e52c898f
4
- data.tar.gz: d3373c5a892cf5685ea2e360bcc2191702a358dd
3
+ metadata.gz: 6258854e3f07ec379803b25748a5ca5b2d816bc0
4
+ data.tar.gz: 7ab966119e1ee29ce4039b55cb1e264d99116143
5
5
  SHA512:
6
- metadata.gz: 9601250c89c609412e3243f26e43052b6d71c47861adb4f4dbf424d66507f39d97b95bc8ce514a6e2554d18b8fd5cf5dc98d88894d7ff0f14912a11eef5b696c
7
- data.tar.gz: 663044f68bc969e7510740c88218875021aec925dbb458bb28bac7f81765d0fe0873c226301b2dbca813d097f2e7ee94e988e71eb5bbd24a381b16c4a6c71fc4
6
+ metadata.gz: c5e5b3c715534df2cd421239d7040ffd819a4bc0dcd5b141fba1ab5dba7f63fe2150610a432ad9028c149901cd82201899e527ba5a5d86679e89789d710d4805
7
+ data.tar.gz: 0cbba845ea24b2dff595843e147171b14e5ac162173c606ba3302c3e04c1056fe98f302a97f18f11b934b4b1e3872330f43be2a481e8c56dabca65ca34725104
data/Appraisals CHANGED
@@ -72,6 +72,7 @@ if RUBY_VERSION < '2.4.0' && RUBY_PLATFORM != 'java'
72
72
  gem 'pg', platform: :ruby
73
73
  gem 'activerecord-jdbcpostgresql-adapter', platform: :jruby
74
74
  gem 'redis-rails'
75
+ gem 'redis', '< 4.0'
75
76
  end
76
77
  end
77
78
 
@@ -90,6 +91,7 @@ if RUBY_VERSION < '2.4.0' && RUBY_PLATFORM != 'java'
90
91
  gem 'rails', '5.0.1'
91
92
  gem 'pg', platform: :ruby
92
93
  gem 'redis-rails'
94
+ gem 'redis', '< 4.0'
93
95
  end
94
96
 
95
97
  appraise 'rails5-postgres-sidekiq' do
@@ -116,7 +118,7 @@ if RUBY_VERSION >= '2.2.2' && RUBY_PLATFORM != 'java'
116
118
  gem 'grape'
117
119
  gem 'rack'
118
120
  gem 'rack-test'
119
- gem 'redis'
121
+ gem 'redis', '< 4.0'
120
122
  gem 'hiredis'
121
123
  gem 'sinatra'
122
124
  gem 'sqlite3'
@@ -126,6 +128,7 @@ if RUBY_VERSION >= '2.2.2' && RUBY_PLATFORM != 'java'
126
128
  gem 'sucker_punch'
127
129
  gem 'dalli'
128
130
  gem 'resque'
131
+ gem 'racecar', '>= 0.3.5'
129
132
  end
130
133
  else
131
134
  appraise 'contrib-old' do
data/Rakefile CHANGED
@@ -63,6 +63,7 @@ namespace :test do
63
63
  :aws,
64
64
  :sucker_punch,
65
65
  :mongodb,
66
+ :racecar,
66
67
  :resque,
67
68
  :dalli
68
69
  ].each do |contrib|
@@ -147,13 +148,11 @@ task :ci do
147
148
  case ENV['CIRCLE_NODE_INDEX'].to_i
148
149
  when 0
149
150
  sh 'rvm $MRI_VERSIONS,$MRI_OLD_VERSIONS,$JRUBY_VERSIONS --verbose do rake test:main'
150
- sh 'rvm $LAST_STABLE --verbose do rake benchmark'
151
151
  when 1
152
152
  sh 'rvm $MRI_VERSIONS --verbose do appraisal contrib rake test:elasticsearch'
153
153
  sh 'rvm $MRI_VERSIONS --verbose do appraisal contrib rake test:http'
154
154
  sh 'rvm $MRI_VERSIONS --verbose do appraisal contrib rake test:redis'
155
155
  sh 'rvm $MRI_VERSIONS --verbose do appraisal contrib rake test:sinatra'
156
- sh 'rvm $MRI_VERSIONS --verbose do appraisal contrib rake test:sidekiq'
157
156
  sh 'rvm $MRI_VERSIONS --verbose do appraisal contrib rake test:rack'
158
157
  sh 'rvm $MRI_VERSIONS --verbose do appraisal contrib rake test:grape'
159
158
  sh 'rvm $MRI_VERSIONS --verbose do appraisal contrib rake test:faraday'
@@ -174,8 +173,9 @@ task :ci do
174
173
  sh 'rvm $MRI_OLD_VERSIONS --verbose do appraisal contrib-old rake test:sucker_punch'
175
174
  sh 'rvm $MRI_OLD_VERSIONS --verbose do appraisal contrib-old rake test:dalli'
176
175
  sh 'rvm $MRI_OLD_VERSIONS --verbose do appraisal contrib-old rake test:resque'
177
- sh 'rvm $SIDEKIQ_OLD_VERSIONS --verbose do appraisal contrib-old rake test:sidekiq'
178
176
  when 2
177
+ sh 'rvm $MRI_VERSIONS --verbose do appraisal contrib rake test:sidekiq'
178
+ sh 'rvm $SIDEKIQ_OLD_VERSIONS --verbose do appraisal contrib-old rake test:sidekiq'
179
179
  sh 'rvm $RAILS3_VERSIONS --verbose do appraisal rails30-postgres rake test:rails'
180
180
  sh 'rvm $RAILS3_VERSIONS --verbose do appraisal rails30-postgres rake test:railsdisableenv'
181
181
  sh 'rvm $RAILS3_VERSIONS --verbose do appraisal rails32-mysql2 rake test:rails'
@@ -196,6 +196,7 @@ task :ci do
196
196
  sh 'rvm $RAILS5_VERSIONS --verbose do appraisal rails5-postgres-sidekiq rake test:railssidekiq'
197
197
  sh 'rvm $RAILS5_VERSIONS --verbose do appraisal rails5-postgres-sidekiq rake test:railsactivejob'
198
198
  sh 'rvm $RAILS5_VERSIONS --verbose do appraisal rails5-postgres rake test:railsdisableenv'
199
+ sh 'rvm $LAST_STABLE --verbose do rake benchmark'
199
200
  else
200
201
  puts 'Too many workers than parallel tasks'
201
202
  end
data/circle.yml CHANGED
@@ -1,6 +1,9 @@
1
1
  machine:
2
2
  services:
3
3
  - docker
4
+ ruby:
5
+ version:
6
+ 2.2.7
4
7
  environment:
5
8
  LAST_STABLE: 2.4.1
6
9
  EARLY_STABLE: 2.2.7
@@ -12,7 +15,7 @@ machine:
12
15
  RAILS5_VERSIONS: 2.3.4,2.2.7
13
16
  RAILS3_SIDEKIQ_VERSIONS: 2.1.10,2.0.0
14
17
  RAILS4_SIDEKIQ_VERSIONS: 2.3.4,2.2.7
15
- JRUBY_VERSIONS: jruby-9.1.5.0
18
+ JRUBY_VERSIONS: jruby-9.1.13.0
16
19
  AGENT_BUILD_PATH: "/home/ubuntu/agent"
17
20
  TEST_DATADOG_INTEGRATION: 1
18
21
 
@@ -20,31 +23,36 @@ dependencies:
20
23
  cache_directories:
21
24
  # Cache Ruby binaries and gems
22
25
  - "/opt/circleci/.rvm/"
26
+ - ~/rubies_cache
23
27
  pre:
28
+ - mkdir -p ~/rubies_cache
29
+ - rsync -a -v --ignore-existing ~/rubies_cache/ /opt/circleci/.rvm/rubies
24
30
  # we should use an old docker-compose because CircleCI supports
25
31
  # only docker-engine==1.9
26
32
  - pip install docker-compose==1.7.1
27
33
  - docker-compose up -d | cat
28
34
  # installing dev dependencies
29
- - gem update --system=2.6.11
30
- - gem install builder
31
- - gem update bundler
35
+ - |
36
+ for version in $(echo "$MRI_VERSIONS,$MRI_OLD_VERSIONS,$JRUBY_VERSIONS" | tr "," "\n"); do
37
+ $(rvm list | grep -q $version) || rvm install $version --rubygems 2.6.11
38
+ done
39
+ - gem install bundler
40
+ # remove line below once `msgpack` have a consistent version for jruby
41
+ - bundle inject msgpack 1.1.0 && sed -i "y/\"/'/" Gemfile
32
42
  - bundle install
33
- # configure Ruby interpreters
34
- - rvm get head
35
- - rvm install $MRI_VERSIONS,$MRI_OLD_VERSIONS,$JRUBY_VERSIONS
36
43
  override:
37
- - rvm $MRI_VERSIONS,$MRI_OLD_VERSIONS,$JRUBY_VERSIONS --verbose do gem update --system=2.6.11
38
44
  - rvm $MRI_VERSIONS,$MRI_OLD_VERSIONS,$JRUBY_VERSIONS --verbose do gem install bundler
39
45
  - rvm $MRI_VERSIONS,$MRI_OLD_VERSIONS,$JRUBY_VERSIONS --verbose do bundle install
40
46
  # [FIXME] appraisal does not work with jruby (problem with native ext, eg sqlite3)
41
- - rvm $MRI_VERSIONS,$MRI_OLD_VERSIONS --verbose do appraisal install
47
+ - rvm $MRI_VERSIONS,$MRI_OLD_VERSIONS --verbose do bundle exec appraisal install || echo FIX-ME: Ignoring non-zero exit status
48
+ post:
49
+ - rsync -a -v --ignore-existing /opt/circleci/.rvm/rubies/ ~/rubies_cache
42
50
 
43
51
  test:
44
52
  override:
45
- - rvm $EARLY_STABLE --verbose do rake rubocop
53
+ - rvm $EARLY_STABLE --verbose do bundle exec rake rubocop
46
54
  # TODO: integration tests should run with the master branch of the agent
47
- - rake ci:
55
+ - bundle exec rake ci:
48
56
  parallel: true
49
57
 
50
58
  deployment:
@@ -52,10 +60,10 @@ deployment:
52
60
  branch: /(master)|(develop)/
53
61
  # CircleCI is configured to provide VERSION_SUFFIX=$CIRCLE_BUILD_NUM
54
62
  commands:
55
- - S3_DIR=trace-dev rake release:docs
56
- - S3_DIR=trace-dev rake release:gem
63
+ - S3_DIR=trace-dev bundle exec rake release:docs
64
+ - S3_DIR=trace-dev bundle exec rake release:gem
57
65
  - cp -r ./rubygems/* $CIRCLE_ARTIFACTS
58
66
  public:
59
67
  tag: /v[0-9]+(\.[0-9]+)*/
60
68
  commands:
61
- - S3_DIR=trace rake release:docs
69
+ - S3_DIR=trace bundle exec rake release:docs
data/ddtrace.gemspec CHANGED
@@ -6,7 +6,7 @@ require 'ddtrace/version'
6
6
 
7
7
  Gem::Specification.new do |spec|
8
8
  spec.name = 'ddtrace'
9
- spec.version = "#{Datadog::VERSION::STRING}.beta1#{ENV['VERSION_SUFFIX']}"
9
+ spec.version = "#{Datadog::VERSION::STRING}.beta2#{ENV['VERSION_SUFFIX']}"
10
10
  spec.required_ruby_version = '>= 1.9.1'
11
11
  spec.authors = ['Datadog, Inc.']
12
12
  spec.email = ['dev@datadoghq.com']
@@ -40,7 +40,10 @@ EOS
40
40
  spec.add_development_dependency 'appraisal', '~> 2.2'
41
41
  spec.add_development_dependency 'yard', '~> 0.9'
42
42
  spec.add_development_dependency 'webmock', '~> 2.0'
43
+ spec.add_development_dependency 'builder'
43
44
  # locking transitive dependency of webmock
44
- spec.add_development_dependency 'addressable', '~> 2.4.0'
45
+ spec.add_development_dependency 'addressable', '~> 2.4.0'
45
46
  spec.add_development_dependency 'redcarpet', '~> 3.4' if RUBY_PLATFORM != 'java'
47
+ spec.add_development_dependency 'pry', '>= 0.10.4'
48
+ spec.add_development_dependency 'pry-stack_explorer', '>= 0.4.9.2'
46
49
  end
@@ -182,20 +182,22 @@ To start using the middleware in your generic Rack application, add it to your `
182
182
 
183
183
  run app
184
184
 
185
- Experimental distributed tracing support is available for this library.
186
- You need to set the ``:distributed_tracing_enabled`` option to true, for example:
185
+ The Rack middleware can be configured using the global configuration object:
187
186
 
188
187
  # config.ru example
188
+ require 'ddtrace'
189
189
  require 'ddtrace/contrib/rack/middlewares'
190
190
 
191
- use Datadog::Contrib::Rack::TraceMiddleware, distributed_tracing_enabled: true
191
+ Datadog.configure do |c|
192
+ c.use :rack, service_name: 'api-intake', distributed_tracing: true
193
+ end
192
194
 
193
195
  app = proc do |env|
194
- # trace and read 'x-datadog-trace-id' and 'x-datadog-parent-id'
195
196
  [ 200, {'Content-Type' => 'text/plain'}, "OK" ]
196
197
  end
197
198
 
198
- See [distributed tracing](#Distributed_Tracing) for details.
199
+ In the example above, we've activated the Distributed Tracing flag, please
200
+ see [distributed tracing](#Distributed_Tracing) for more details.
199
201
 
200
202
  #### Configure the tracer
201
203
 
@@ -7,7 +7,7 @@ gem "mongo"
7
7
  gem "grape"
8
8
  gem "rack"
9
9
  gem "rack-test"
10
- gem "redis"
10
+ gem "redis", "< 4.0"
11
11
  gem "hiredis"
12
12
  gem "sinatra"
13
13
  gem "sqlite3"
@@ -17,5 +17,6 @@ gem "aws-sdk"
17
17
  gem "sucker_punch"
18
18
  gem "dalli"
19
19
  gem "resque"
20
+ gem "racecar", ">= 0.3.5"
20
21
 
21
22
  gemspec path: "../"
@@ -6,5 +6,6 @@ gem "rails", "4.2.7.1"
6
6
  gem "pg", platform: :ruby
7
7
  gem "activerecord-jdbcpostgresql-adapter", platform: :jruby
8
8
  gem "redis-rails"
9
+ gem "redis", "< 4.0"
9
10
 
10
11
  gemspec path: "../"
@@ -5,5 +5,6 @@ source "https://rubygems.org"
5
5
  gem "rails", "5.0.1"
6
6
  gem "pg", platform: :ruby
7
7
  gem "redis-rails"
8
+ gem "redis", "< 4.0"
8
9
 
9
10
  gemspec path: "../"
@@ -20,7 +20,7 @@ module Datadog
20
20
  def get_option(name)
21
21
  __assert_valid!(name)
22
22
 
23
- return __options[name][:default] unless __options[name][:set_flag]
23
+ return __default_value(name) unless __options[name][:set_flag]
24
24
 
25
25
  __options[name][:value]
26
26
  end
@@ -47,6 +47,7 @@ module Datadog
47
47
  name = name.to_sym
48
48
  meta[:setter] ||= (block || IDENTITY)
49
49
  meta[:depends_on] ||= []
50
+ meta[:lazy] ||= false
50
51
  __options[name] = meta
51
52
  end
52
53
 
@@ -72,6 +73,11 @@ module Datadog
72
73
  graph[name] = meta[:depends_on]
73
74
  end
74
75
  end
76
+
77
+ def __default_value(name)
78
+ return __options[name][:default].call if __options[name][:lazy]
79
+ __options[name][:default]
80
+ end
75
81
  end
76
82
  end
77
83
  end
@@ -11,11 +11,7 @@ module Datadog
11
11
  end
12
12
 
13
13
  def [](param)
14
- value = @integration.get_option(param)
15
-
16
- return value.call if value.respond_to?(:call)
17
-
18
- value
14
+ @integration.get_option(param)
19
15
  end
20
16
 
21
17
  def []=(param, value)
@@ -42,21 +42,24 @@ module Datadog
42
42
  end
43
43
  end
44
44
 
45
- def self.datadog_trace
46
- # TODO: Consider using patcher for Rails as well.
47
- # @tracer ||= defined?(::Rails) && ::Rails.configuration.datadog_trace
48
- @datadog_trace ||= defined?(::Sinatra) && Datadog.configuration[:sinatra].to_h
45
+ def self.adapter_name
46
+ @adapter_name ||= Datadog::Contrib::Rails::Utils.adapter_name
49
47
  end
50
48
 
51
- def self.adapter_name
52
- @adapter_name ||= Datadog::Contrib::Rails::Utils.normalize_vendor(
53
- ::ActiveRecord::Base.connection_config[:adapter]
54
- )
49
+ def self.database_name
50
+ @database_name ||= Datadog::Contrib::Rails::Utils.database_name
51
+ end
52
+
53
+ def self.adapter_host
54
+ @adapter_host ||= Datadog::Contrib::Rails::Utils.adapter_host
55
+ end
56
+
57
+ def self.adapter_port
58
+ @adapter_port ||= Datadog::Contrib::Rails::Utils.adapter_port
55
59
  end
56
60
 
57
61
  def self.tracer
58
- return Datadog.tracer unless datadog_trace
59
- @tracer ||= datadog_trace.fetch(:tracer)
62
+ @tracer ||= Datadog.configuration[:sinatra][:tracer]
60
63
  end
61
64
 
62
65
  def self.database_service
@@ -82,6 +85,9 @@ module Datadog
82
85
  # obfuscated version
83
86
  span.span_type = Datadog::Ext::SQL::TYPE
84
87
  span.set_tag('active_record.db.vendor', adapter_name)
88
+ span.set_tag('active_record.db.name', database_name)
89
+ span.set_tag('out.host', adapter_host)
90
+ span.set_tag('out.port', adapter_port)
85
91
  span.start_time = start
86
92
  span.finish(finish)
87
93
  rescue StandardError => e
@@ -23,6 +23,7 @@ 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)
26
27
 
27
28
  @patched = true
28
29
  rescue => e
@@ -22,6 +22,7 @@ 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)
25
26
 
26
27
  @patched = true
27
28
  rescue => e
@@ -42,7 +43,7 @@ module Datadog
42
43
  end
43
44
 
44
45
  def add_pin!
45
- Pin.new(get_option(:service_name), app_type: Ext::AppTypes::DB).tap do |pin|
46
+ Pin.new(get_option(:service_name), app_type: Ext::AppTypes::CACHE).tap do |pin|
46
47
  pin.onto(::Dalli)
47
48
  end
48
49
  end
@@ -10,6 +10,8 @@ module Datadog
10
10
  def format_command(operation, args)
11
11
  command = [operation, *args].join(' ').strip
12
12
  Utils.truncate(command, MAX_CMD_LENGTH)
13
+ rescue ::Encoding::CompatibilityError
14
+ "#{operation} BLOB (OMITTED)"
13
15
  end
14
16
  end
15
17
  end
@@ -9,7 +9,6 @@ module Datadog
9
9
  BODY = 'elasticsearch.body'.freeze
10
10
 
11
11
  SERVICE = 'elasticsearch'.freeze
12
- SPAN_TYPE = 'elasticsearch'.freeze
13
12
 
14
13
  # Patcher enables patching of 'elasticsearch/transport' module.
15
14
  # This is used in monkey.rb to automatically apply patches
@@ -35,6 +34,7 @@ module Datadog
35
34
  require 'ddtrace/contrib/elasticsearch/quantize'
36
35
 
37
36
  patch_elasticsearch_transport_client()
37
+ Datadog.tracer.set_service_info(get_option(:service_name), 'elasticsearch', Ext::AppTypes::DB)
38
38
 
39
39
  @patched = true
40
40
  rescue StandardError => e
@@ -45,6 +45,7 @@ module Datadog
45
45
  end
46
46
 
47
47
  # rubocop:disable Metrics/MethodLength
48
+ # rubocop:disable Metrics/AbcSize
48
49
  def patch_elasticsearch_transport_client
49
50
  # rubocop:disable Metrics/BlockLength
50
51
  ::Elasticsearch::Transport::Client.class_eval do
@@ -77,8 +78,12 @@ module Datadog
77
78
  response = nil
78
79
  pin.tracer.trace('elasticsearch.query') do |span|
79
80
  begin
81
+ connection = transport.connections.first
82
+ host = connection.host[:host] if connection
83
+ port = connection.host[:port] if connection
84
+
80
85
  span.service = pin.service
81
- span.span_type = SPAN_TYPE
86
+ span.span_type = Ext::AppTypes::DB
82
87
 
83
88
  # load JSON for the following fields unless they're already strings
84
89
  params = JSON.generate(params) if params && !params.is_a?(String)
@@ -88,6 +93,8 @@ module Datadog
88
93
  span.set_tag(URL, url)
89
94
  span.set_tag(PARAMS, params) if params
90
95
  span.set_tag(BODY, body) if body
96
+ span.set_tag('out.host', host) if host
97
+ span.set_tag('out.port', port) if port
91
98
 
92
99
  quantized_url = Datadog::Contrib::Elasticsearch::Quantize.format_url(url)
93
100
  span.resource = "#{method} #{quantized_url}"
@@ -10,32 +10,24 @@ module Datadog
10
10
  class Middleware < ::Faraday::Middleware
11
11
  include Ext::DistributedTracing
12
12
 
13
- DEFAULT_ERROR_HANDLER = lambda do |env|
14
- Ext::HTTP::ERROR_RANGE.cover?(env[:status])
15
- end
16
-
17
- DEFAULT_OPTIONS = {
18
- distributed_tracing: false,
19
- split_by_domain: false,
20
- error_handler: DEFAULT_ERROR_HANDLER
21
- }.freeze
22
-
23
13
  def initialize(app, options = {})
24
14
  super(app)
25
- @options = DEFAULT_OPTIONS.merge(options)
15
+ @options = Datadog.configuration[:faraday].merge(options)
16
+ @tracer = Pin.get_from(::Faraday).tracer
17
+ setup_service!
26
18
  end
27
19
 
28
20
  def call(env)
29
- dd_pin.tracer.trace(SERVICE) do |span|
21
+ tracer.trace(NAME) do |span|
30
22
  annotate!(span, env)
31
- propagate!(span, env) if options[:distributed_tracing] && dd_pin.tracer.enabled
23
+ propagate!(span, env) if options[:distributed_tracing] && tracer.enabled
32
24
  app.call(env).on_complete { |resp| handle_response(span, resp) }
33
25
  end
34
26
  end
35
27
 
36
28
  private
37
29
 
38
- attr_reader :app, :options
30
+ attr_reader :app, :options, :tracer
39
31
 
40
32
  def annotate!(span, env)
41
33
  span.resource = env[:method].to_s.upcase
@@ -59,14 +51,16 @@ module Datadog
59
51
  Datadog::HTTPPropagator.inject!(span.context, env[:request_headers])
60
52
  end
61
53
 
62
- def dd_pin
63
- Pin.get_from(::Faraday)
64
- end
65
-
66
54
  def service_name(env)
67
55
  return env[:url].host if options[:split_by_domain]
68
56
 
69
- dd_pin.service
57
+ options[:service_name]
58
+ end
59
+
60
+ def setup_service!
61
+ return if options[:service_name] == Datadog.configuration[:faraday][:service_name]
62
+
63
+ Patcher.register_service(options[:service_name])
70
64
  end
71
65
  end
72
66
  end
@@ -2,13 +2,23 @@ module Datadog
2
2
  module Contrib
3
3
  module Faraday
4
4
  COMPATIBLE_UNTIL = Gem::Version.new('1.0.0')
5
- SERVICE = 'faraday-request'.freeze
5
+ SERVICE = 'faraday'.freeze
6
+ NAME = 'faraday.request'.freeze
6
7
 
7
8
  # Responsible for hooking the instrumentation into faraday
8
9
  module Patcher
9
10
  include Base
11
+
10
12
  register_as :faraday, auto_patch: true
13
+
14
+ DEFAULT_ERROR_HANDLER = lambda do |env|
15
+ Ext::HTTP::ERROR_RANGE.cover?(env[:status])
16
+ end
17
+
11
18
  option :service_name, default: SERVICE
19
+ option :distributed_tracing, default: false
20
+ option :error_handler, default: DEFAULT_ERROR_HANDLER
21
+ option :tracer, default: Datadog.tracer
12
22
 
13
23
  @patched = false
14
24
 
@@ -21,6 +31,7 @@ module Datadog
21
31
 
22
32
  add_pin
23
33
  add_middleware
34
+ register_service(get_option(:service_name))
24
35
 
25
36
  @patched = true
26
37
  rescue => e
@@ -32,6 +43,10 @@ module Datadog
32
43
  @patched
33
44
  end
34
45
 
46
+ def register_service(name)
47
+ get_option(:tracer).set_service_info(name, 'faraday', Ext::AppTypes::WEB)
48
+ end
49
+
35
50
  private
36
51
 
37
52
  def compatible?
@@ -41,9 +56,9 @@ module Datadog
41
56
  end
42
57
 
43
58
  def add_pin
44
- Pin.new(SERVICE, app_type: Ext::AppTypes::WEB).tap do |pin|
59
+ Pin.new(get_option(:service_name), app_type: Ext::AppTypes::WEB).tap do |pin|
45
60
  pin.onto(::Faraday)
46
- pin.service = Datadog.configuration[:faraday][:service_name]
61
+ pin.tracer = get_option(:tracer)
47
62
  end
48
63
  end
49
64
 
@@ -14,16 +14,6 @@ module Datadog
14
14
 
15
15
  module_function
16
16
 
17
- # TODO: Remove this once we drop support for legacy configuration
18
- def distributed_tracing_enabled
19
- Datadog.configuration[:http][:distributed_tracing_enabled]
20
- end
21
-
22
- # TODO: Remove this once we drop support for legacy configuration
23
- def distributed_tracing_enabled=(value)
24
- Datadog.configuration[:http][:distributed_tracing_enabled] = value
25
- end
26
-
27
17
  def should_skip_tracing?(req, address, port, transport, pin)
28
18
  # we don't want to trace our own call to the API (they use net/http)
29
19
  # when we know the host & port (from the URI) we use it, else (most-likely
@@ -46,11 +36,11 @@ module Datadog
46
36
  end
47
37
 
48
38
  def should_skip_distributed_tracing?(pin)
49
- global_value = Datadog.configuration[:http][:distributed_tracing_enabled]
50
- unless pin.config.nil?
51
- return !pin.config.fetch(:distributed_tracing_enabled, global_value)
39
+ if pin.config && pin.config.key?(:distributed_tracing)
40
+ return !pin.config[:distributed_tracing]
52
41
  end
53
- !global_value
42
+
43
+ !Datadog.configuration[:http][:distributed_tracing]
54
44
  end
55
45
 
56
46
  # Patcher enables patching of 'net/http' module.
@@ -58,7 +48,7 @@ module Datadog
58
48
  module Patcher
59
49
  include Base
60
50
  register_as :http, auto_patch: true
61
- option :distributed_tracing_enabled, default: false
51
+ option :distributed_tracing, default: false
62
52
 
63
53
  @patched = false
64
54
 
@@ -0,0 +1,81 @@
1
+ require 'ddtrace/ext/app_types'
2
+
3
+ module Datadog
4
+ module Contrib
5
+ module Racecar
6
+ # Provides instrumentation for `racecar` through ActiveSupport instrumentation signals
7
+ module Patcher
8
+ include Base
9
+ NAME_MESSAGE = 'racecar.message'.freeze
10
+ NAME_BATCH = 'racecar.batch'.freeze
11
+ register_as :racecar
12
+ option :tracer, default: Datadog.tracer
13
+ option :service_name, default: 'racecar'
14
+
15
+ class << self
16
+ def patch
17
+ return patched? if patched? || !compatible?
18
+
19
+ ::ActiveSupport::Notifications.subscribe('start_process_batch.racecar', &method(:start))
20
+ ::ActiveSupport::Notifications.subscribe('start_process_message.racecar', &method(:start))
21
+ ::ActiveSupport::Notifications.subscribe('process_batch.racecar', &method(:finish))
22
+ ::ActiveSupport::Notifications.subscribe('process_message.racecar', &method(:finish))
23
+
24
+ configuration[:tracer].set_service_info(
25
+ configuration[:service_name],
26
+ 'racecar',
27
+ Ext::AppTypes::WORKER
28
+ )
29
+
30
+ @patched = true
31
+ end
32
+
33
+ def patched?
34
+ return @patched if defined?(@patched)
35
+ @patched = false
36
+ end
37
+
38
+ private
39
+
40
+ def configuration
41
+ Datadog.configuration[:racecar]
42
+ end
43
+
44
+ def compatible?
45
+ defined?(::Racecar) && defined?(::ActiveSupport::Notifications)
46
+ end
47
+
48
+ def start(event, *_, payload)
49
+ ensure_clean_context!
50
+
51
+ name = event[/message/] ? NAME_MESSAGE : NAME_BATCH
52
+ span = configuration[:tracer].trace(name)
53
+ span.service = configuration[:service_name]
54
+ span.resource = payload[:consumer_class]
55
+ span.set_tag('kafka.topic', payload[:topic])
56
+ span.set_tag('kafka.consumer', payload[:consumer_class])
57
+ span.set_tag('kafka.partition', payload[:partition])
58
+ span.set_tag('kafka.offset', payload[:offset]) if payload.key?(:offset)
59
+ span.set_tag('kafka.first_offset', payload[:first_offset]) if payload.key?(:first_offset)
60
+ span.set_tag('kafka.message_count', payload[:message_count]) if payload.key?(:message_count)
61
+ end
62
+
63
+ def finish(*_, payload)
64
+ current_span = configuration[:tracer].call_context.current_span
65
+
66
+ return unless current_span
67
+
68
+ current_span.set_error(payload[:exception_object]) if payload[:exception_object]
69
+ current_span.finish
70
+ end
71
+
72
+ def ensure_clean_context!
73
+ return unless configuration[:tracer].call_context.current_span
74
+
75
+ configuration[:tracer].provider.context = Context.new
76
+ end
77
+ end
78
+ end
79
+ end
80
+ end
81
+ end
@@ -13,64 +13,35 @@ module Datadog
13
13
  # application. If request tags are not set by the app, they will be set using
14
14
  # information available at the Rack level.
15
15
  class TraceMiddleware
16
- include Base
17
- register_as :rack
18
-
19
- option :tracer, default: Datadog.tracer
20
- option :service_name, default: 'rack', depends_on: [:tracer] do |value|
21
- get_option(:tracer).set_service_info(value, 'rack', Ext::AppTypes::WEB)
22
- value
23
- end
24
- option :distributed_tracing_enabled, default: false
25
-
26
- def initialize(app, options = {})
27
- # update options with our configuration, unless it's already available
28
- [:tracer, :service_name, :distributed_tracing_enabled].each do |k|
29
- Datadog.configuration[:rack][k] = options[k] unless options[k].nil?
30
- end
31
-
16
+ def initialize(app)
32
17
  @app = app
33
18
  end
34
19
 
35
- def configure
36
- # ensure that the configuration is executed only once
37
- return clean_context if @tracer && @service
38
-
39
- # retrieve the current tracer and service
40
- @tracer = Datadog.configuration[:rack][:tracer]
41
- @service = Datadog.configuration[:rack][:service_name]
42
- @distributed_tracing_enabled = Datadog.configuration[:rack][:distributed_tracing_enabled]
43
-
44
- # configure the Rack service
45
- end
46
-
47
- # rubocop:disable Metrics/MethodLength
48
20
  def call(env)
49
- # configure the Rack middleware once
50
- configure()
21
+ # retrieve integration settings
22
+ tracer = Datadog.configuration[:rack][:tracer]
23
+ service = Datadog.configuration[:rack][:service_name]
24
+ distributed_tracing = Datadog.configuration[:rack][:distributed_tracing]
51
25
 
52
26
  trace_options = {
53
- service: @service,
27
+ service: service,
54
28
  resource: nil,
55
29
  span_type: Datadog::Ext::HTTP::TYPE
56
30
  }
57
31
 
58
- request_span = nil
59
- begin
60
- if @distributed_tracing_enabled
61
- context = HTTPPropagator.extract(env)
62
- @tracer.provider.context = context if context.trace_id
63
- end
64
- ensure
65
- # start a new request span and attach it to the current Rack environment;
66
- # we must ensure that the span `resource` is set later
67
- request_span = @tracer.trace('rack.request', trace_options)
32
+ if distributed_tracing
33
+ context = HTTPPropagator.extract(env)
34
+ tracer.provider.context = context if context.trace_id
68
35
  end
69
36
 
37
+ # start a new request span and attach it to the current Rack environment;
38
+ # we must ensure that the span `resource` is set later
39
+ request_span = tracer.trace('rack.request', trace_options)
70
40
  env[:datadog_rack_request_span] = request_span
71
41
 
72
42
  # call the rest of the stack
73
43
  status, headers, response = @app.call(env)
44
+ [status, headers, response]
74
45
 
75
46
  # rubocop:disable Lint/RescueException
76
47
  # Here we really want to catch *any* exception, not only StandardError,
@@ -82,7 +53,7 @@ module Datadog
82
53
  # catch exceptions that may be raised in the middleware chain
83
54
  # Note: if a middleware catches an Exception without re raising,
84
55
  # the Exception cannot be recorded here.
85
- request_span.set_error(e)
56
+ request_span.set_error(e) unless request_span.nil?
86
57
  raise e
87
58
  ensure
88
59
  # the source of truth in Rack is the PATH_INFO key that holds the
@@ -98,7 +69,7 @@ module Datadog
98
69
  # the result for this request; `resource` and `tags` are expected to
99
70
  # be set in another level but if they're missing, reasonable defaults
100
71
  # are used.
101
- request_span.resource = "#{env['REQUEST_METHOD']} #{status}".strip unless request_span.resource
72
+ request_span.resource ||= resource_name_for(env, status)
102
73
  if request_span.get_tag(Datadog::Ext::HTTP::METHOD).nil?
103
74
  request_span.set_tag(Datadog::Ext::HTTP::METHOD, env['REQUEST_METHOD'])
104
75
  end
@@ -115,18 +86,22 @@ module Datadog
115
86
  request_span.status = 1
116
87
  end
117
88
 
118
- request_span.finish()
89
+ # ensure the request_span is finished and the context reset;
90
+ # this assumes that the Rack middleware creates a root span
91
+ request_span.finish
119
92
 
120
- [status, headers, response]
93
+ # TODO: Remove this once we change how context propagation works. This
94
+ # ensures we clean thread-local variables on each HTTP request avoiding
95
+ # memory leaks.
96
+ tracer.provider.context = Datadog::Context.new
121
97
  end
122
98
 
123
- private
124
-
125
- # TODO: Remove this once we change how context propagation works. This
126
- # ensures we clean thread-local variables on each HTTP request avoiding
127
- # memory leaks.
128
- def clean_context
129
- @tracer.provider.context = Datadog::Context.new
99
+ def resource_name_for(env, status)
100
+ if Datadog.configuration[:rack][:middleware_names]
101
+ "#{env['RESPONSE_MIDDLEWARE']}##{env['REQUEST_METHOD']}"
102
+ else
103
+ "#{env['REQUEST_METHOD']} #{status}".strip
104
+ end
130
105
  end
131
106
  end
132
107
  end
@@ -0,0 +1,58 @@
1
+ module Datadog
2
+ module Contrib
3
+ module Rack
4
+ # Provides instrumentation for `rack`
5
+ module Patcher
6
+ include Base
7
+ register_as :rack
8
+ option :tracer, default: Datadog.tracer
9
+ option :distributed_tracing, default: false
10
+ option :middleware_names, default: false
11
+ option :application
12
+ option :service_name, default: 'rack', depends_on: [:tracer] do |value|
13
+ get_option(:tracer).set_service_info(value, 'rack', Ext::AppTypes::WEB)
14
+ value
15
+ end
16
+
17
+ module_function
18
+
19
+ def patch
20
+ return true if patched?
21
+
22
+ require_relative 'middlewares'
23
+ @patched = true
24
+
25
+ return unless get_option(:middleware_names)
26
+
27
+ top = get_option(:application) || rails_app
28
+ retain_middleware_name(top)
29
+ end
30
+
31
+ def patched?
32
+ @patched ||= false
33
+ end
34
+
35
+ def rails_app
36
+ return unless Datadog.registry[:rails].compatible?
37
+ ::Rails.application.app
38
+ end
39
+
40
+ def retain_middleware_name(middleware)
41
+ return unless middleware && middleware.respond_to?(:call)
42
+
43
+ middleware.singleton_class.class_eval do
44
+ alias_method :__call, :call
45
+
46
+ def call(env)
47
+ env['RESPONSE_MIDDLEWARE'] = self.class.to_s
48
+ __call(env)
49
+ end
50
+ end
51
+
52
+ following = middleware.instance_variable_get('@app')
53
+ retain_middleware_name(following)
54
+ end
55
+ end
56
+ end
57
+ end
58
+ end
@@ -20,8 +20,10 @@ module Datadog
20
20
  def self.sql(_name, start, finish, _id, payload)
21
21
  tracer = Datadog.configuration[:rails][:tracer]
22
22
  database_service = Datadog.configuration[:rails][:database_service]
23
- adapter_name = ::ActiveRecord::Base.connection_config[:adapter]
24
- adapter_name = Datadog::Contrib::Rails::Utils.normalize_vendor(adapter_name)
23
+ adapter_name = Datadog::Contrib::Rails::Utils.adapter_name
24
+ database_name = Datadog::Contrib::Rails::Utils.database_name
25
+ adapter_host = Datadog::Contrib::Rails::Utils.adapter_host
26
+ adapter_port = Datadog::Contrib::Rails::Utils.adapter_port
25
27
  span_type = Datadog::Ext::SQL::TYPE
26
28
 
27
29
  span = tracer.trace(
@@ -44,7 +46,10 @@ module Datadog
44
46
  # obfuscated version
45
47
  span.span_type = Datadog::Ext::SQL::TYPE
46
48
  span.set_tag('rails.db.vendor', adapter_name)
49
+ span.set_tag('rails.db.name', database_name)
47
50
  span.set_tag('rails.db.cached', cached) if cached
51
+ span.set_tag('out.host', adapter_host)
52
+ span.set_tag('out.port', adapter_port)
48
53
  span.start_time = start
49
54
  span.finish(finish)
50
55
  rescue StandardError => e
@@ -11,17 +11,6 @@ require 'ddtrace/contrib/rails/active_record'
11
11
  require 'ddtrace/contrib/rails/active_support'
12
12
  require 'ddtrace/contrib/rails/utils'
13
13
 
14
- # Rails < 3.1
15
- if defined?(::ActiveRecord) && !defined?(::ActiveRecord::Base.connection_config)
16
- ActiveRecord::Base.class_eval do
17
- class << self
18
- def connection_config
19
- connection_pool.spec.config
20
- end
21
- end
22
- end
23
- end
24
-
25
14
  module Datadog
26
15
  module Contrib
27
16
  # Instrument Rails.
@@ -31,18 +20,16 @@ module Datadog
31
20
  # - instrument parts of the framework when needed
32
21
  module Framework
33
22
  # configure Datadog settings
34
- def self.configure(rails_config)
35
- user_config = rails_config[:config].datadog_trace rescue {}
36
- Datadog.configuration.use(:rails, user_config)
23
+ def self.setup
37
24
  config = Datadog.configuration[:rails]
38
- tracer = config[:tracer]
39
25
  config[:service_name] ||= Utils.app_name
26
+ tracer = config[:tracer]
40
27
 
41
28
  Datadog.configuration.use(
42
29
  :rack,
43
30
  tracer: tracer,
44
31
  service_name: config[:service_name],
45
- distributed_tracing_enabled: config[:distributed_tracing_enabled]
32
+ distributed_tracing: config[:distributed_tracing]
46
33
  )
47
34
 
48
35
  config[:controller_service] ||= config[:service_name]
@@ -50,25 +37,22 @@ module Datadog
50
37
 
51
38
  tracer.set_service_info(config[:controller_service], 'rails', Ext::AppTypes::WEB)
52
39
  tracer.set_service_info(config[:cache_service], 'rails', Ext::AppTypes::CACHE)
40
+ set_database_service
53
41
 
54
42
  # By default, default service would be guessed from the script
55
43
  # being executed, but here we know better, get it from Rails config.
56
44
  tracer.default_service = config[:service_name]
45
+ end
57
46
 
58
- if defined?(::ActiveRecord)
59
- begin
60
- # set default database service details and store it in the configuration
61
- conn_cfg = ::ActiveRecord::Base.connection_config()
62
- adapter_name = Datadog::Contrib::Rails::Utils.normalize_vendor(conn_cfg[:adapter])
63
- config[:database_service] ||= "#{config[:service_name]}-#{adapter_name}"
64
- tracer.set_service_info(config[:database_service], adapter_name, Ext::AppTypes::DB)
65
- rescue StandardError => e
66
- Datadog::Tracer.log.warn("Unable to get database config (#{e}), skipping ActiveRecord instrumentation")
67
- end
68
- end
47
+ def self.set_database_service
48
+ return unless defined?(::ActiveRecord)
69
49
 
70
- # update global configurations
71
- ::Rails.configuration.datadog_trace = Datadog.registry[:rails].to_h
50
+ config = Datadog.configuration[:rails]
51
+ adapter_name = Utils.adapter_name
52
+ config[:database_service] ||= "#{config[:service_name]}-#{adapter_name}"
53
+ config[:tracer].set_service_info(config[:database_service], adapter_name, Ext::AppTypes::DB)
54
+ rescue => e
55
+ Tracer.log.warn("Unable to get database config (#{e}), skipping ActiveRecord instrumentation")
72
56
  end
73
57
  end
74
58
  end
@@ -10,7 +10,7 @@ module Datadog
10
10
  option :controller_service
11
11
  option :cache_service
12
12
  option :database_service
13
- option :distributed_tracing_enabled, default: false
13
+ option :distributed_tracing, default: false
14
14
  option :template_base_path, default: 'views/'
15
15
  option :tracer, default: Datadog.tracer
16
16
 
@@ -8,8 +8,8 @@ module Datadog
8
8
  config.app_middleware.insert_before(0, Datadog::Contrib::Rack::TraceMiddleware)
9
9
  config.app_middleware.use(Datadog::Contrib::Rails::ExceptionMiddleware)
10
10
 
11
- config.after_initialize do |app|
12
- Datadog::Contrib::Rails::Framework.configure(config: app.config)
11
+ config.after_initialize do
12
+ Datadog::Contrib::Rails::Framework.setup
13
13
  Datadog::Contrib::Rails::ActionController.instrument
14
14
  Datadog::Contrib::Rails::ActionView.instrument
15
15
  Datadog::Contrib::Rails::ActiveRecord.instrument
@@ -45,6 +45,32 @@ module Datadog
45
45
  ::Rails.application.class.to_s.underscore
46
46
  end
47
47
  end
48
+
49
+ def self.adapter_name
50
+ normalize_vendor(connection_config[:adapter])
51
+ end
52
+
53
+ def self.database_name
54
+ connection_config[:database]
55
+ end
56
+
57
+ def self.adapter_host
58
+ connection_config[:host]
59
+ end
60
+
61
+ def self.adapter_port
62
+ connection_config[:port]
63
+ end
64
+
65
+ def self.connection_config
66
+ if defined?(::ActiveRecord::Base.connection_config)
67
+ ::ActiveRecord::Base.connection_config
68
+ else
69
+ ::ActiveRecord::Base.connection_pool.spec.config
70
+ end
71
+ end
72
+
73
+ private_class_method :connection_config
48
74
  end
49
75
  end
50
76
  end
@@ -12,6 +12,7 @@ module Datadog
12
12
 
13
13
  def format_arg(arg)
14
14
  str = arg.is_a?(Symbol) ? arg.to_s.upcase : arg.to_s
15
+ str = str.encode('UTF-8', 'binary', invalid: :replace, undef: :replace, replace: '')
15
16
  Utils.truncate(str, VALUE_MAX_LEN, TOO_LONG_MARK)
16
17
  rescue StandardError => e
17
18
  Datadog::Tracer.log.debug("non formattable Redis arg #{str}: #{e}")
@@ -16,14 +16,17 @@ module Datadog
16
16
  option :service_name, default: SERVICE
17
17
 
18
18
  @patched = false
19
+ option :workers, default: []
19
20
 
20
21
  class << self
21
22
  def patch
22
23
  return @patched if patched? || !defined?(::Resque)
23
24
 
24
25
  require 'ddtrace/ext/app_types'
26
+ require_relative 'resque_job'
25
27
 
26
28
  add_pin
29
+ get_option(:workers).each { |worker| worker.extend(ResqueJob) }
27
30
  @patched = true
28
31
  rescue => e
29
32
  Tracer.log.error("Unable to apply Resque integration: #{e}")
@@ -40,7 +40,7 @@ module Datadog
40
40
  service = sidekiq_service(resource_worker(resource))
41
41
  set_service_info(service)
42
42
 
43
- @tracer.trace('sidekiq.job', service: service, span_type: 'job') do |span|
43
+ @tracer.trace('sidekiq.job', service: service, span_type: Datadog::Ext::AppTypes::WORKER) do |span|
44
44
  span.resource = resource
45
45
  span.set_tag('sidekiq.job.id', job['jid'])
46
46
  span.set_tag('sidekiq.job.retry', job['retry'])
@@ -30,11 +30,19 @@ module Datadog
30
30
 
31
31
  option :tracer, default: Datadog.tracer
32
32
 
33
+ option :resource_script_names, default: false
34
+
33
35
  def route(verb, action, *)
34
36
  # Keep track of the route name when the app is instantiated for an
35
37
  # incoming request.
36
38
  condition do
37
- @datadog_route = action
39
+ # If the option to prepend script names is enabled, then
40
+ # prepend the script name from the request onto the action.
41
+ @datadog_route = if Datadog.configuration[:sinatra][:resource_script_names]
42
+ "#{request.script_name}#{action}"
43
+ else
44
+ action
45
+ end
38
46
  end
39
47
 
40
48
  super
@@ -48,7 +56,7 @@ module Datadog
48
56
  output = ''
49
57
  tracer = Datadog.configuration[:sinatra][:tracer]
50
58
  if tracer.enabled
51
- tracer.trace('sinatra.render_template') do |span|
59
+ tracer.trace('sinatra.render_template', span_type: Datadog::Ext::HTTP::TEMPLATE) do |span|
52
60
  # If data is a string, it is a literal template and we don't
53
61
  # want to record it.
54
62
  span.set_tag('sinatra.template_name', data) if data.is_a? Symbol
@@ -24,6 +24,7 @@ module Datadog
24
24
  add_pin!
25
25
  ExceptionHandler.patch!
26
26
  Instrumentation.patch!
27
+ Datadog.tracer.set_service_info(get_option(:service_name), 'sucker_punch', Ext::AppTypes::WORKER)
27
28
 
28
29
  @patched = true
29
30
  rescue => e
@@ -5,6 +5,7 @@ module Datadog
5
5
  DB = 'db'.freeze
6
6
  CACHE = 'cache'.freeze
7
7
  WORKER = 'worker'.freeze
8
+ CUSTOM = 'custom'.freeze
8
9
  end
9
10
  end
10
11
  end
@@ -4,6 +4,7 @@ require 'thread'
4
4
  # because patchers do not include any 3rd party module nor even our
5
5
  # patching code, which is required on demand, when patching.
6
6
  require 'ddtrace/contrib/base'
7
+ require 'ddtrace/contrib/rack/patcher'
7
8
  require 'ddtrace/contrib/rails/patcher'
8
9
  require 'ddtrace/contrib/active_record/patcher'
9
10
  require 'ddtrace/contrib/elasticsearch/patcher'
@@ -16,6 +17,7 @@ require 'ddtrace/contrib/sucker_punch/patcher'
16
17
  require 'ddtrace/contrib/mongodb/patcher'
17
18
  require 'ddtrace/contrib/dalli/patcher'
18
19
  require 'ddtrace/contrib/resque/patcher'
20
+ require 'ddtrace/contrib/racecar/patcher'
19
21
 
20
22
  module Datadog
21
23
  # Monkey is used for monkey-patching 3rd party libs.
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: ddtrace
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.11.0.beta1
4
+ version: 0.11.0.beta2
5
5
  platform: ruby
6
6
  authors:
7
7
  - Datadog, Inc.
8
8
  autorequire:
9
9
  bindir: exe
10
10
  cert_chain: []
11
- date: 2017-12-04 00:00:00.000000000 Z
11
+ date: 2017-12-27 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: msgpack
@@ -108,6 +108,20 @@ dependencies:
108
108
  - - "~>"
109
109
  - !ruby/object:Gem::Version
110
110
  version: '2.0'
111
+ - !ruby/object:Gem::Dependency
112
+ name: builder
113
+ requirement: !ruby/object:Gem::Requirement
114
+ requirements:
115
+ - - ">="
116
+ - !ruby/object:Gem::Version
117
+ version: '0'
118
+ type: :development
119
+ prerelease: false
120
+ version_requirements: !ruby/object:Gem::Requirement
121
+ requirements:
122
+ - - ">="
123
+ - !ruby/object:Gem::Version
124
+ version: '0'
111
125
  - !ruby/object:Gem::Dependency
112
126
  name: addressable
113
127
  requirement: !ruby/object:Gem::Requirement
@@ -136,6 +150,34 @@ dependencies:
136
150
  - - "~>"
137
151
  - !ruby/object:Gem::Version
138
152
  version: '3.4'
153
+ - !ruby/object:Gem::Dependency
154
+ name: pry
155
+ requirement: !ruby/object:Gem::Requirement
156
+ requirements:
157
+ - - ">="
158
+ - !ruby/object:Gem::Version
159
+ version: 0.10.4
160
+ type: :development
161
+ prerelease: false
162
+ version_requirements: !ruby/object:Gem::Requirement
163
+ requirements:
164
+ - - ">="
165
+ - !ruby/object:Gem::Version
166
+ version: 0.10.4
167
+ - !ruby/object:Gem::Dependency
168
+ name: pry-stack_explorer
169
+ requirement: !ruby/object:Gem::Requirement
170
+ requirements:
171
+ - - ">="
172
+ - !ruby/object:Gem::Version
173
+ version: 0.4.9.2
174
+ type: :development
175
+ prerelease: false
176
+ version_requirements: !ruby/object:Gem::Requirement
177
+ requirements:
178
+ - - ">="
179
+ - !ruby/object:Gem::Version
180
+ version: 0.4.9.2
139
181
  description: |
140
182
  ddtrace is Datadog’s tracing client for Ruby. It is used to trace requests
141
183
  as they flow across web servers, databases and microservices so that developers
@@ -201,7 +243,9 @@ files:
201
243
  - lib/ddtrace/contrib/mongodb/parsers.rb
202
244
  - lib/ddtrace/contrib/mongodb/patcher.rb
203
245
  - lib/ddtrace/contrib/mongodb/subscribers.rb
246
+ - lib/ddtrace/contrib/racecar/patcher.rb
204
247
  - lib/ddtrace/contrib/rack/middlewares.rb
248
+ - lib/ddtrace/contrib/rack/patcher.rb
205
249
  - lib/ddtrace/contrib/rails/action_controller.rb
206
250
  - lib/ddtrace/contrib/rails/action_view.rb
207
251
  - lib/ddtrace/contrib/rails/active_record.rb
@@ -274,7 +318,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
274
318
  version: 1.3.1
275
319
  requirements: []
276
320
  rubyforge_project:
277
- rubygems_version: 2.6.9
321
+ rubygems_version: 2.4.5.2
278
322
  signing_key:
279
323
  specification_version: 4
280
324
  summary: Datadog tracing code for your Ruby applications