ddtrace 0.11.0.beta2 → 0.11.0

Sign up to get free protection for your applications and to get access to all the features.
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
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 6258854e3f07ec379803b25748a5ca5b2d816bc0
4
- data.tar.gz: 7ab966119e1ee29ce4039b55cb1e264d99116143
3
+ metadata.gz: b3bb99f4104ccd84acde3279b412e90d531ecfea
4
+ data.tar.gz: 63d063737c4e830b84d24471fc1ff356ca703af6
5
5
  SHA512:
6
- metadata.gz: c5e5b3c715534df2cd421239d7040ffd819a4bc0dcd5b141fba1ab5dba7f63fe2150610a432ad9028c149901cd82201899e527ba5a5d86679e89789d710d4805
7
- data.tar.gz: 0cbba845ea24b2dff595843e147171b14e5ac162173c606ba3302c3e04c1056fe98f302a97f18f11b934b4b1e3872330f43be2a481e8c56dabca65ca34725104
6
+ metadata.gz: b271d08b6eae8c40116c68b21ef46c4fb110fba35b331913b902e9fc0b7ce5fa4868e997c7984eff71d8f325f98f3276c6bc11b6da69bdf877903338fb599948
7
+ data.tar.gz: d86ca3ce85531ea82e437f2f9495deed831ab10a2e15d35a78a1095607f99c9ef901cb6cf800f084a4f4142f200f339997b60e30fa87b80d66de3c9706f23346
data/.rspec ADDED
@@ -0,0 +1 @@
1
+ --require spec_helper
data/Appraisals CHANGED
@@ -63,13 +63,13 @@ if RUBY_VERSION < '2.4.0' && RUBY_PLATFORM != 'java'
63
63
 
64
64
  appraise 'rails4-postgres' do
65
65
  gem 'rails', '4.2.7.1'
66
- gem 'pg', platform: :ruby
66
+ gem 'pg', '< 1.0', platform: :ruby
67
67
  gem 'activerecord-jdbcpostgresql-adapter', platform: :jruby
68
68
  end
69
69
 
70
70
  appraise 'rails4-postgres-redis' do
71
71
  gem 'rails', '4.2.7.1'
72
- gem 'pg', platform: :ruby
72
+ gem 'pg', '< 1.0', platform: :ruby
73
73
  gem 'activerecord-jdbcpostgresql-adapter', platform: :jruby
74
74
  gem 'redis-rails'
75
75
  gem 'redis', '< 4.0'
@@ -84,26 +84,26 @@ if RUBY_VERSION < '2.4.0' && RUBY_PLATFORM != 'java'
84
84
 
85
85
  appraise 'rails5-postgres' do
86
86
  gem 'rails', '5.0.1'
87
- gem 'pg', platform: :ruby
87
+ gem 'pg', '< 1.0', platform: :ruby
88
88
  end
89
89
 
90
90
  appraise 'rails5-postgres-redis' do
91
91
  gem 'rails', '5.0.1'
92
- gem 'pg', platform: :ruby
92
+ gem 'pg', '< 1.0', platform: :ruby
93
93
  gem 'redis-rails'
94
- gem 'redis', '< 4.0'
94
+ gem 'redis'
95
95
  end
96
96
 
97
97
  appraise 'rails5-postgres-sidekiq' do
98
98
  gem 'rails', '5.0.1'
99
- gem 'pg', platform: :ruby
99
+ gem 'pg', '< 1.0', platform: :ruby
100
100
  gem 'sidekiq'
101
101
  gem 'activejob'
102
102
  end
103
103
 
104
104
  appraise 'rails4-postgres-sidekiq' do
105
105
  gem 'rails', '4.2.7.1'
106
- gem 'pg', platform: :ruby
106
+ gem 'pg', '< 1.0', platform: :ruby
107
107
  gem 'activerecord-jdbcpostgresql-adapter', platform: :jruby
108
108
  gem 'sidekiq'
109
109
  gem 'activejob'
@@ -127,17 +127,17 @@ if RUBY_VERSION >= '2.2.2' && RUBY_PLATFORM != 'java'
127
127
  gem 'aws-sdk'
128
128
  gem 'sucker_punch'
129
129
  gem 'dalli'
130
- gem 'resque'
130
+ gem 'resque', '< 2.0'
131
131
  gem 'racecar', '>= 0.3.5'
132
132
  end
133
133
  else
134
134
  appraise 'contrib-old' do
135
135
  gem 'elasticsearch-transport'
136
136
  gem 'mongo'
137
- gem 'redis', '< 4.0.0'
137
+ gem 'redis', '< 4.0'
138
138
  gem 'hiredis'
139
139
  gem 'rack', '1.4.7'
140
- gem 'rack-test'
140
+ gem 'rack-test', '0.7.0'
141
141
  gem 'sinatra', '1.4.5'
142
142
  gem 'sqlite3'
143
143
  gem 'activerecord', '3.2.22.5'
@@ -145,6 +145,6 @@ else
145
145
  gem 'aws-sdk', '~> 2.0'
146
146
  gem 'sucker_punch'
147
147
  gem 'dalli'
148
- gem 'resque'
148
+ gem 'resque', '< 2.0'
149
149
  end
150
150
  end
data/Gemfile CHANGED
@@ -1,3 +1,6 @@
1
1
  source 'https://rubygems.org'
2
2
 
3
3
  gemspec
4
+
5
+ # Add debugger for pry that's compatible with 0.10.4
6
+ gem 'pry-nav', git: 'https://github.com/nixme/pry-nav.git', branch: 'master'
data/README.md CHANGED
@@ -6,7 +6,7 @@
6
6
 
7
7
  You can find the latest documentation on [rubydoc.info][docs]
8
8
 
9
- [docs]: http://www.rubydoc.info/github/DataDog/dd-trace-rb/
9
+ [docs]: http://gems.datadoghq.com/trace/docs/
10
10
 
11
11
  ## Getting started
12
12
 
data/Rakefile CHANGED
@@ -1,11 +1,70 @@
1
1
  require 'bundler/gem_tasks'
2
2
  require 'ddtrace/version'
3
3
  require 'rubocop/rake_task' if RUBY_VERSION >= '2.1.0'
4
+ require 'rspec/core/rake_task'
4
5
  require 'rake/testtask'
5
6
  require 'appraisal'
6
7
  require 'yard'
7
8
 
9
+ desc 'Run RSpec'
8
10
  # rubocop:disable Metrics/BlockLength
11
+ namespace :spec do
12
+ task all: [:main,
13
+ :rails, :railsredis, :railssidekiq, :railsactivejob,
14
+ :elasticsearch, :http, :redis, :sidekiq, :sinatra, :monkey]
15
+
16
+ RSpec::Core::RakeTask.new(:main) do |t|
17
+ t.pattern = 'spec/**/*_spec.rb'
18
+ t.exclude_pattern = 'spec/**/{contrib,benchmark,redis}/**/*_spec.rb,spec/monkey_spec.rb'
19
+ end
20
+
21
+ RSpec::Core::RakeTask.new(:rails) do |t|
22
+ t.pattern = 'spec/ddtrace/contrib/rails/**/*_spec.rb'
23
+ t.exclude_pattern = 'spec/ddtrace/contrib/rails/**/*{sidekiq,active_job,disable_env}*_spec.rb'
24
+ end
25
+
26
+ RSpec::Core::RakeTask.new(:railsredis) do |t|
27
+ t.pattern = 'spec/ddtrace/contrib/rails/**/*redis*_spec.rb'
28
+ end
29
+
30
+ RSpec::Core::RakeTask.new(:railssidekiq) do |t|
31
+ t.pattern = 'spec/ddtrace/contrib/rails/**/*sidekiq*_spec.rb'
32
+ end
33
+
34
+ RSpec::Core::RakeTask.new(:railsactivejob) do |t|
35
+ t.pattern = 'spec/ddtrace/contrib/rails/**/*active_job*_spec.rb'
36
+ end
37
+
38
+ RSpec::Core::RakeTask.new(:railsdisableenv) do |t|
39
+ t.pattern = 'spec/ddtrace/contrib/rails/**/*disable_env*_spec.rb'
40
+ end
41
+
42
+ [
43
+ :elasticsearch,
44
+ :http,
45
+ :redis,
46
+ :sinatra,
47
+ :sidekiq,
48
+ :rack,
49
+ :faraday,
50
+ :grape,
51
+ :aws,
52
+ :sucker_punch,
53
+ :mongodb,
54
+ :racecar,
55
+ :resque,
56
+ :dalli
57
+ ].each do |contrib|
58
+ RSpec::Core::RakeTask.new(contrib) do |t|
59
+ t.pattern = "spec/ddtrace/contrib/#{contrib}/*_spec.rb"
60
+ end
61
+ end
62
+
63
+ RSpec::Core::RakeTask.new(:monkey) do |t|
64
+ t.pattern = 'spec/ddtrace/monkey_spec.rb'
65
+ end
66
+ end
67
+
9
68
  namespace :test do
10
69
  task all: [:main,
11
70
  :rails, :railsredis, :railssidekiq, :railsactivejob,
@@ -63,9 +122,7 @@ namespace :test do
63
122
  :aws,
64
123
  :sucker_punch,
65
124
  :mongodb,
66
- :racecar,
67
- :resque,
68
- :dalli
125
+ :resque
69
126
  ].each do |contrib|
70
127
  Rake::TestTask.new(contrib) do |t|
71
128
  t.libs << %w[test lib]
@@ -148,6 +205,8 @@ task :ci do
148
205
  case ENV['CIRCLE_NODE_INDEX'].to_i
149
206
  when 0
150
207
  sh 'rvm $MRI_VERSIONS,$MRI_OLD_VERSIONS,$JRUBY_VERSIONS --verbose do rake test:main'
208
+ # RSpec
209
+ sh 'rvm $MRI_VERSIONS,$MRI_OLD_VERSIONS,$JRUBY_VERSIONS --verbose do rake spec:main'
151
210
  when 1
152
211
  sh 'rvm $MRI_VERSIONS --verbose do appraisal contrib rake test:elasticsearch'
153
212
  sh 'rvm $MRI_VERSIONS --verbose do appraisal contrib rake test:http'
@@ -159,7 +218,6 @@ task :ci do
159
218
  sh 'rvm $MRI_VERSIONS --verbose do appraisal contrib rake test:aws'
160
219
  sh 'rvm $MRI_VERSIONS --verbose do appraisal contrib rake test:mongodb'
161
220
  sh 'rvm $MRI_VERSIONS --verbose do appraisal contrib rake test:sucker_punch'
162
- sh 'rvm $MRI_VERSIONS --verbose do appraisal contrib rake test:dalli'
163
221
  sh 'rvm $MRI_VERSIONS --verbose do appraisal contrib rake test:resque'
164
222
  sh 'rvm $MRI_OLD_VERSIONS --verbose do appraisal contrib-old rake test:monkey'
165
223
  sh 'rvm $MRI_OLD_VERSIONS --verbose do appraisal contrib-old rake test:elasticsearch'
@@ -171,8 +229,11 @@ task :ci do
171
229
  sh 'rvm $MRI_OLD_VERSIONS --verbose do appraisal contrib-old rake test:aws'
172
230
  sh 'rvm $MRI_OLD_VERSIONS --verbose do appraisal contrib-old rake test:mongodb'
173
231
  sh 'rvm $MRI_OLD_VERSIONS --verbose do appraisal contrib-old rake test:sucker_punch'
174
- sh 'rvm $MRI_OLD_VERSIONS --verbose do appraisal contrib-old rake test:dalli'
175
232
  sh 'rvm $MRI_OLD_VERSIONS --verbose do appraisal contrib-old rake test:resque'
233
+ # RSpec
234
+ sh 'rvm $MRI_VERSIONS --verbose do appraisal contrib rake spec:dalli'
235
+ sh 'rvm $MRI_VERSIONS --verbose do appraisal contrib rake spec:racecar'
236
+ sh 'rvm $MRI_OLD_VERSIONS --verbose do appraisal contrib-old rake spec:dalli'
176
237
  when 2
177
238
  sh 'rvm $MRI_VERSIONS --verbose do appraisal contrib rake test:sidekiq'
178
239
  sh 'rvm $SIDEKIQ_OLD_VERSIONS --verbose do appraisal contrib-old rake test:sidekiq'
@@ -196,6 +257,7 @@ task :ci do
196
257
  sh 'rvm $RAILS5_VERSIONS --verbose do appraisal rails5-postgres-sidekiq rake test:railssidekiq'
197
258
  sh 'rvm $RAILS5_VERSIONS --verbose do appraisal rails5-postgres-sidekiq rake test:railsactivejob'
198
259
  sh 'rvm $RAILS5_VERSIONS --verbose do appraisal rails5-postgres rake test:railsdisableenv'
260
+ # RSpec
199
261
  sh 'rvm $LAST_STABLE --verbose do rake benchmark'
200
262
  else
201
263
  puts 'Too many workers than parallel tasks'
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}.beta2#{ENV['VERSION_SUFFIX']}"
9
+ spec.version = "#{Datadog::VERSION::STRING}#{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']
@@ -35,7 +35,9 @@ EOS
35
35
  spec.add_dependency 'msgpack'
36
36
 
37
37
  spec.add_development_dependency 'rake', '~> 10.5'
38
- spec.add_development_dependency('rubocop', '= 0.49.1') if RUBY_VERSION >= '2.1.0'
38
+ spec.add_development_dependency 'rubocop', '= 0.49.1' if RUBY_VERSION >= '2.1.0'
39
+ spec.add_development_dependency 'rspec', '~> 3.0'
40
+ spec.add_development_dependency 'rspec-collection_matchers', '~> 1.1'
39
41
  spec.add_development_dependency 'minitest', '= 5.10.1'
40
42
  spec.add_development_dependency 'appraisal', '~> 2.2'
41
43
  spec.add_development_dependency 'yard', '~> 0.9'
@@ -44,6 +46,6 @@ EOS
44
46
  # locking transitive dependency of webmock
45
47
  spec.add_development_dependency 'addressable', '~> 2.4.0'
46
48
  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'
49
+ spec.add_development_dependency 'pry', '~> 0.10.4'
50
+ spec.add_development_dependency 'pry-stack_explorer', '~> 0.4.9.2'
49
51
  end
@@ -20,8 +20,23 @@ We strongly suggest pinning the version of the library you deploy.
20
20
 
21
21
  ## Quickstart
22
22
 
23
- The easiest way to get started with the tracing client is to instrument your web application. ``ddtrace`` gem
24
- provides auto instrumentation for the following web frameworks and libraries:
23
+ The easiest way to get started with the tracing client is to instrument your web application.
24
+ All configuration is done through ``Datadog.configure`` method. As an
25
+ example, below is a setup that enables auto instrumentation for Rails, Redis and
26
+ Grape, and sets a custom endpoint for the trace agent:
27
+
28
+ # config/initializers/datadog-tracer.rb
29
+
30
+ Datadog.configure do |c|
31
+ c.tracer hostname: 'trace-agent.local'
32
+ c.use :rails
33
+ c.use :grape
34
+ c.use :redis, service_name: 'cache'
35
+ end
36
+
37
+ For further details and options, check our integrations list.
38
+
39
+ ## Available Integrations
25
40
 
26
41
  * [Ruby on Rails](#Ruby_on_Rails)
27
42
  * [Sinatra](#Sinatra)
@@ -50,89 +65,26 @@ To enable the Rails auto instrumentation, create an initializer file in your ``c
50
65
 
51
66
  # config/initializers/datadog-tracer.rb
52
67
 
53
- Rails.configuration.datadog_trace = {
54
- auto_instrument: true,
55
- auto_instrument_redis: true,
56
- default_service: 'my-rails-app'
57
- }
58
-
59
- If you're using Rails 3 or higher, your application will be listed as ``my-rails-app`` in your service list.
60
- To integrate Rails instrumentation with third-party libraries such as Grape, please check the available settings below.
61
-
62
- #### Configure the tracer with initializers
63
-
64
- All tracing settings are namespaced under the ``Rails.configuration.datadog_tracer`` hash. To change the default behavior
65
- of the Datadog tracer, you can override the following defaults:
66
-
67
- # config/initializers/datadog-tracer.rb
68
-
69
- Rails.configuration.datadog_trace = {
70
- enabled: true,
71
- auto_instrument: false,
72
- auto_instrument_redis: false,
73
- auto_instrument_grape: false,
74
- default_service: 'rails-app',
75
- default_controller_service: 'rails-controller',
76
- default_cache_service: 'rails-cache',
77
- default_database_service: 'postgresql',
78
- distributed_tracing_enabled: false,
79
- template_base_path: 'views/',
80
- tracer: Datadog.tracer,
81
- debug: false,
82
- trace_agent_hostname: 'localhost',
83
- trace_agent_port: 8126,
84
- env: nil,
85
- tags: {}
86
- }
87
-
88
- Available settings are:
89
-
90
- * ``enabled``: defines if the ``tracer`` is enabled or not. If set to ``false`` the code could be still instrumented
91
- because of other settings, but no spans are sent to the local trace agent.
92
- * ``auto_instrument``: if set to +true+ the code will be automatically instrumented. You may change this value
93
- with a condition, to enable the auto-instrumentation only for particular environments (production, staging, etc...).
94
- * ``auto_instrument_redis``: if set to ``true`` Redis calls will be traced as such. Calls to Redis cache may be
95
- still instrumented but you will not have the detail of low-level Redis calls.
96
- * ``auto_instrument_grape``: if set to ``true`` and you're using a Grape application, all calls to your endpoints are
97
- traced, including filters execution.
98
- * ``default_service``: set the service name used when tracing application requests. Defaults to ``rails-app``
99
- * ``default_controller_service``: set the service name used when tracing a Rails action controller. Defaults to ``rails-controller``
100
- * ``default_cache_service``: set the cache service name used when tracing cache activity. Defaults to ``rails-cache``
101
- * ``default_database_service``: set the database service name used when tracing database activity. Defaults to the
102
- current adapter name, so if you're using PostgreSQL it will be ``postgres``.
103
- * ``distributed_tracing_enabled``: enable [distributed tracing](#Distributed_Tracing) so that this service trace is
104
- connected with a trace of another service if tracing headers are sent
105
- * ``default_grape_service``: set the service name used when tracing a Grape application mounted in your Rails router.
106
- Defaults to ``grape``
107
- * ``template_base_path``: used when the template name is parsed in the auto instrumented code. If you don't store
108
- your templates in the ``views/`` folder, you may need to change this value
109
- * ``tracer``: is the global tracer used by the tracing application. Usually you don't need to change that value
110
- unless you're already using a different initialized ``tracer`` somewhere else
111
- * ``debug``: set to true to enable debug logging.
112
- * ``trace_agent_hostname``: set the hostname of the trace agent.
113
- * ``trace_agent_port``: set the port the trace agent is listening on.
114
- * ``env``: set the environment. Rails users may set it to ``Rails.env`` to use their application settings.
115
- * ``tags``: set global tags that should be applied to all spans. Defaults to an empty hash
116
-
117
- #### Disabling Rails auto-instrumentation
118
-
119
- If you wish to disable all Rails auto-instrumentation, you need to set the env var ``DISABLE_DATADOG_RAILS``.
120
-
121
- Eg, within Ruby:
68
+ Datadog.configure do |c|
69
+ c.use :rails, options
70
+ end
122
71
 
123
- ENV['DISABLE_DATADOG_RAILS'] = "1" # this must be done before ddtrace is included at all
124
- require 'ddtrace'
72
+ Where `options` is an optional `Hash` that accepts the following parameters:
125
73
 
126
- Or, shell syntax, before launching Rails:
127
74
 
128
- ```
129
- export DISABLE_DATADOG_RAILS=1
130
- ```
75
+ | Key | Description | Default |
76
+ | --- | --- | --- |
77
+ | ``service_name`` | Service name used when tracing application requests (on the `rack` level) | ``<app_name>`` (inferred from your Rails application namespace) |
78
+ | ``controller_service`` | Service name used when tracing a Rails action controller | ``<app_name>-controller`` |
79
+ | ``cache_service`` | Cache service name used when tracing cache activity | ``<app_name>-cache`` |
80
+ | ``database_service`` | Database service name used when tracing database activity | ``<app_name>-<adapter_name>``. |
81
+ | ``distributed_tracing`` | Enables [distributed tracing](#Distributed_Tracing) so that this service trace is connected with a trace of another service if tracing headers are received | `false` |
82
+ | ``template_base_path`` | Used when the template name is parsed. If you don't store your templates in the ``views/`` folder, you may need to change this value | ``views/`` |
83
+ | ``tracer`` | A ``Datadog::Tracer`` instance used to instrument the application. Usually you don't need to set that. | ``Datadog.tracer`` |
131
84
 
132
85
  ### Sinatra
133
86
 
134
- The Sinatra integration traces requests and template rendering. The integration is based on the
135
- ``Datadog::Contrib::Sinatra::Tracer`` extension.
87
+ The Sinatra integration traces requests and template rendering.
136
88
 
137
89
  To start using the tracing client, make sure you import ``ddtrace`` and ``ddtrace/contrib/sinatra/tracer`` after
138
90
  either ``sinatra`` or ``sinatra/base``:
@@ -142,105 +94,67 @@ either ``sinatra`` or ``sinatra/base``:
142
94
  require 'ddtrace/contrib/sinatra/tracer'
143
95
 
144
96
  Datadog.configure do |c|
145
- c.use :sinatra, service_name: 'my-app'
97
+ c.use :sinatra, options
146
98
  end
147
99
 
148
100
  get '/' do
149
101
  'Hello world!'
150
102
  end
151
103
 
152
- The tracing extension will be automatically activated.
153
-
154
- #### Configure the tracer
155
-
156
- Available settings are:
104
+ Where `options` is an optional `Hash` that accepts the following parameters:
157
105
 
158
- * ``enabled``: define if the ``tracer`` is enabled or not. If set to ``false``, the code is still instrumented
159
- but no spans are sent to the local trace agent.
160
- * ``service_name``: set the service name used when tracing application requests. Defaults to ``sinatra``
161
- * ``tracer``: set the tracer to use. Usually you don't need to change that value
162
- unless you're already using a different initialized tracer somewhere else
163
- * ``debug``: set to ``true`` to enable debug logging.
164
- * ``trace_agent_hostname``: set the hostname of the trace agent.
165
- * ``trace_agent_port``: set the port the trace agent is listening on.
106
+ | Key | Description | Default |
107
+ | --- | --- | --- |
108
+ | ``service_name`` | Service name used for `sinatra` instrumentation | sinatra |
109
+ | ``resource_script_names`` | Prepend resource names with script name | ``false`` |
110
+ | ``tracer`` | A ``Datadog::Tracer`` instance used to instrument the application. Usually you don't need to set that. | ``Datadog.tracer`` |
166
111
 
167
112
  ### Rack
168
113
 
169
114
  The Rack integration provides a middleware that traces all requests before they reach the underlying framework
170
115
  or application. It responds to the Rack minimal interface, providing reasonable values that can be
171
- retrieved at the Rack level.
172
- To start using the middleware in your generic Rack application, add it to your ``config.ru``:
173
-
174
- # config.ru example
175
- require 'ddtrace/contrib/rack/middlewares'
176
-
177
- use Datadog::Contrib::Rack::TraceMiddleware
178
-
179
- app = proc do |env|
180
- [ 200, {'Content-Type' => 'text/plain'}, "OK" ]
181
- end
182
-
183
- run app
184
-
185
- The Rack middleware can be configured using the global configuration object:
116
+ retrieved at the Rack level. This integration is automatically activated with web frameworks like Rails.
117
+ If you're using a plain Rack application, just enable the integration it to your ``config.ru``:
186
118
 
187
119
  # config.ru example
188
120
  require 'ddtrace'
189
- require 'ddtrace/contrib/rack/middlewares'
190
121
 
191
122
  Datadog.configure do |c|
192
- c.use :rack, service_name: 'api-intake', distributed_tracing: true
123
+ c.use :rack, options
193
124
  end
194
125
 
195
- app = proc do |env|
196
- [ 200, {'Content-Type' => 'text/plain'}, "OK" ]
197
- end
198
-
199
- In the example above, we've activated the Distributed Tracing flag, please
200
- see [distributed tracing](#Distributed_Tracing) for more details.
201
-
202
- #### Configure the tracer
203
-
204
- To modify the default middleware configuration, you can use middleware options as follows:
205
-
206
- # config.ru example
207
- require 'ddtrace/contrib/rack/middlewares'
208
-
209
- Datadog.tracer.configure(
210
- enabled: true,
211
- hostname: localhost,
212
- port: 8126
213
- )
214
-
215
- use Datadog::Contrib::Rack::TraceMiddleware, default_service: 'rack-stack'
126
+ use Datadog::Contrib::Rack::TraceMiddleware
216
127
 
217
128
  app = proc do |env|
218
- [ 200, {'Content-Type' => 'text/plain'}, "OK" ]
129
+ [ 200, {'Content-Type' => 'text/plain'}, ['OK'] ]
219
130
  end
220
131
 
221
132
  run app
222
133
 
223
- Available settings are:
134
+ Where `options` is an optional `Hash` that accepts the following parameters:
224
135
 
225
- * ``tracer`` (default: ``Datadog.tracer``): set the tracer to use. Usually you don't need to change that value
226
- unless you're already using a different initialized tracer somewhere else. If you need to change some
227
- configurations such as the ``hostname``, use the [Tracer#configure](Datadog/Tracer.html#configure-instance_method)
228
- method before adding the middleware
229
- * ``default_service`` (default: ``rack``): set the service name used when the Rack request is traced
136
+ | Key | Description | Default |
137
+ | --- | --- | --- |
138
+ | ``service_name`` | Service name used when tracing application requests | rack |
139
+ | ``distributed_tracing`` | Enables [distributed tracing](#Distributed_Tracing) so that this service trace is connected with a trace of another service if tracing headers are received | `false` |
140
+ | ``middleware_names`` | Enable this if you want to use the middleware classes as the resource names for `rack` spans | ``false`` |
141
+ | ``tracer`` | A ``Datadog::Tracer`` instance used to instrument the application. Usually you don't need to set that. | ``Datadog.tracer`` |
230
142
 
231
143
  ## Other libraries
232
144
 
233
145
  ### Grape
234
146
 
235
147
  The Grape integration adds the instrumentation to Grape endpoints and filters. This integration can work side by side
236
- with other integrations like Rack and Rails. To activate your integration, use the ``patch_module`` function before
148
+ with other integrations like Rack and Rails. To activate your integration, use the ``Datadog.configure`` method before
237
149
  defining your Grape application:
238
150
 
239
151
  # api.rb
240
152
  require 'grape'
241
153
  require 'ddtrace'
242
154
 
243
- Datadog::Monkey.patch_module(:grape)
155
+ Datadog.configure do |c|
156
+ c.use :grape, options
157
+ end
244
158
 
245
159
  # then define your application
246
160
  class RackTestingAPI < Grape::API
@@ -250,6 +164,12 @@ defining your Grape application:
250
164
  end
251
165
  end
252
166
 
167
+ Where `options` is an optional `Hash` that accepts the following parameters:
168
+
169
+ | Key | Description | Default |
170
+ | --- | --- | --- |
171
+ | ``service_name`` | Service name used for `grape` instrumentation | grape |
172
+
253
173
  ### Active Record
254
174
 
255
175
  Most of the time, Active Record is set up as part of a web framework (Rails, Sinatra...)
@@ -260,7 +180,9 @@ however it can be set up alone:
260
180
  require 'active_record'
261
181
  require 'ddtrace'
262
182
 
263
- Datadog::Monkey.patch_module(:active_record) # explicitly patch it
183
+ Datadog.configure do |c|
184
+ c.use :active_record, options
185
+ end
264
186
 
265
187
  Dir::Tmpname.create(['test', '.sqlite']) do |db|
266
188
  conn = ActiveRecord::Base.establish_connection(adapter: 'sqlite3',
@@ -268,6 +190,12 @@ however it can be set up alone:
268
190
  conn.connection.execute('SELECT 42') # traced!
269
191
  end
270
192
 
193
+ Where `options` is an optional `Hash` that accepts the following parameters:
194
+
195
+ | Key | Description | Default |
196
+ | --- | --- | --- |
197
+ | ``service_name`` | Service name used for `active_record` instrumentation | active_record |
198
+
271
199
  ### Elastic Search
272
200
 
273
201
  The Elasticsearch integration will trace any call to ``perform_request``
@@ -276,15 +204,19 @@ in the ``Client`` object:
276
204
  require 'elasticsearch/transport'
277
205
  require 'ddtrace'
278
206
 
279
- Datadog::Monkey.patch_module(:elasticsearch) # explicitly patch it
207
+ Datadog.configure do |c|
208
+ c.use :elasticsearch, options
209
+ end
280
210
 
281
211
  # now do your Elastic Search stuff, eg:
282
212
  client = Elasticsearch::Client.new url: 'http://127.0.0.1:9200'
283
213
  response = client.perform_request 'GET', '_cluster/health'
284
214
 
285
- Note that if you enable both Elasticsearch and Net/HTTP integrations then
286
- for each call, two spans are created, one for Elasctisearch and one for Net/HTTP.
287
- This typically happens if you call ``patch_all`` to enable all integrations by default.
215
+ Where `options` is an optional `Hash` that accepts the following parameters:
216
+
217
+ | Key | Description | Default |
218
+ | --- | --- | --- |
219
+ | ``service_name`` | Service name used for `elasticsearch` instrumentation | elasticsearch |
288
220
 
289
221
  ### MongoDB
290
222
 
@@ -296,16 +228,23 @@ if they use the official Ruby driver. To activate the integration, simply:
296
228
  require 'mongo'
297
229
  require 'ddtrace'
298
230
 
299
- Datadog::Monkey.patch_module(:mongo)
231
+ Datadog.configure do |c|
232
+ c.use :mongo, options
233
+ end
300
234
 
301
235
  # now create a MongoDB client and use it as usual:
302
236
  client = Mongo::Client.new([ '127.0.0.1:27017' ], :database => 'artists')
303
237
  collection = client[:people]
304
238
  collection.insert_one({ name: 'Steve' })
305
239
 
306
- # to change the MongoDB service, use the Pin object
307
- pin = Datadog::Pin.get_from(client)
308
- pin.service = 'mongodb-primary'
240
+ # In case you want to override the global configuration for a certain client instance
241
+ Datadog.configure(client, service_name: 'mongodb-primary')
242
+
243
+ Where `options` is an optional `Hash` that accepts the following parameters:
244
+
245
+ | Key | Description | Default |
246
+ | --- | --- | --- |
247
+ | ``service_name`` | Service name used for `mongo` instrumentation | mongodb |
309
248
 
310
249
  ### Net/HTTP
311
250
 
@@ -315,7 +254,9 @@ Net::HTTP module.
315
254
  require 'net/http'
316
255
  require 'ddtrace'
317
256
 
318
- Datadog::Monkey.patch_module(:http) # explicitly patch it
257
+ Datadog.configure do |c|
258
+ c.use :http, options
259
+ end
319
260
 
320
261
  Net::HTTP.start('127.0.0.1', 8080) do |http|
321
262
  request = Net::HTTP::Get.new '/index'
@@ -324,30 +265,17 @@ Net::HTTP module.
324
265
 
325
266
  content = Net::HTTP.get(URI('http://127.0.0.1/index.html'))
326
267
 
327
- Experimental distributed tracing support is available for this library.
328
- By default, this is disabled. You need to enable it, either on a per-connection basis,
329
- by setting the ``:distributed_tracing_enabled`` config entry to ``true`` using
330
- the ``Pin`` object attached to the client. Example:
268
+ Where `options` is an optional `Hash` that accepts the following parameters:
331
269
 
332
- require 'net/http'
333
- require 'ddtrace'
270
+ | Key | Description | Default |
271
+ | --- | --- | --- |
272
+ | ``service_name`` | Service name used for `http` instrumentation | http |
273
+ | ``distributed_tracing`` | Enables distributed tracing | ``false`` |
334
274
 
335
- Datadog::Monkey.patch_module(:http) # explicitly patch it
275
+ If you wish to configure each connection object individually, you may use the ``Datadog.configure`` as it follows:
336
276
 
337
277
  client = Net::HTTP.new(host, port)
338
- Datadog::Pin.get_from(client).config = { distributed_tracing_enabled: true }
339
- response = client.get('foo') # trace and send 'x-datadog-trace-id' and 'x-datadog-parent-id'
340
-
341
- Or, by enabling distributed tracing for all HTTP calls:
342
-
343
- require 'net/http'
344
- require 'ddtrace'
345
-
346
- Datadog::Monkey.patch_module(:http) # explicitly patch it
347
-
348
- Datadog::Contrib::HTTP.distributed_tracing_enabled = true
349
-
350
- See [distributed tracing](#Distributed_Tracing) for details.
278
+ Datadog.configure(client, options)
351
279
 
352
280
  ### Faraday
353
281
 
@@ -356,7 +284,9 @@ The `faraday` integration is available through the `ddtrace` middleware:
356
284
  require 'faraday'
357
285
  require 'ddtrace'
358
286
 
359
- Datadog::Monkey.patch_module(:faraday) # registers the tracing middleware
287
+ Datadog.configure do |c|
288
+ c.use :faraday, service_name: 'faraday' # global service name
289
+ end
360
290
 
361
291
  connection = Faraday.new('https://example.com') do |builder|
362
292
  builder.use(:ddtrace, options)
@@ -367,20 +297,12 @@ The `faraday` integration is available through the `ddtrace` middleware:
367
297
 
368
298
  Where `options` is an optional `Hash` that accepts the following parameters:
369
299
 
370
- | Key | Type | Default | Description |
371
- | --- | --- | --- | --- |
372
- | `split_by_domain` | Boolean | `false` | Uses the request domain as the service name when set to `true`. |
373
- | `distributed_tracing` | Boolean | `false` | Propagates tracing context along the HTTP request when set to `true`. |
374
- | `error_handler` | Callable | ``5xx`` evaluated as errors | A callable object that receives a single argument – the request environment. If it evaluates to a *truthy* value, the trace span is marked as an error. |
375
-
376
- It's worth mentioning that `ddtrace` also supports instrumentation for the
377
- `net/http` library, so if you're using it as farady's backend you might see
378
- instrumentation both on `faraday` and `net/http` levels. If you want to avoid
379
- multiple levels of instrumentation for your HTTP requests, remember that you can
380
- always fine tune which libraries are patched by calling:
381
-
382
- Datadog::Monkey.patch([:faraday, :redis])
383
- # instead of using Datadog::Monkey.patch_all
300
+ | Key | Default | Description |
301
+ | --- | --- | --- |
302
+ | `service_name` | Global service name (default: `faraday`) | Service name for this specific connection object. |
303
+ | `split_by_domain` | `false` | Uses the request domain as the service name when set to `true`. |
304
+ | `distributed_tracing` | `false` | Propagates tracing context along the HTTP request when set to `true`. |
305
+ | `error_handler` | ``5xx`` evaluated as errors | A callable object that receives a single argument – the request environment. If it evaluates to a *truthy* value, the trace span is marked as an error. |
384
306
 
385
307
  ### AWS
386
308
 
@@ -390,10 +312,18 @@ services (S3, ElastiCache etc.).
390
312
  require 'aws-sdk'
391
313
  require 'ddtrace'
392
314
 
393
- Datadog::Monkey.patch_module(:aws) # explicitly patch it
315
+ Datadog.configure do |c|
316
+ c.use :aws, options
317
+ end
394
318
 
395
319
  Aws::S3::Client.new.list_buckets # traced call
396
320
 
321
+ Where `options` is an optional `Hash` that accepts the following parameters:
322
+
323
+ | Key | Description | Default |
324
+ | --- | --- | --- |
325
+ | ``service_name`` | Service name used for `aws` instrumentation | aws |
326
+
397
327
  ### Dalli
398
328
 
399
329
  Dalli integration will trace all calls to your ``memcached`` server:
@@ -401,15 +331,18 @@ Dalli integration will trace all calls to your ``memcached`` server:
401
331
  require 'dalli'
402
332
  require 'ddtrace'
403
333
 
404
- # patch Dalli so all clients are traced
405
- Datadog::Monkey.patch_module(:dalli)
334
+ Datadog.configure do |c|
335
+ c.use :dalli, service_name: 'dalli'
336
+ end
406
337
 
407
338
  client = Dalli::Client.new('localhost:11211', options)
408
339
  client.set('abc', 123)
409
340
 
410
- # to change Dalli service name, use the Pin class
411
- pin = Datadog::Pin.get_from(client)
412
- pin.service = 'primary-cache'
341
+ Where `options` is an optional `Hash` that accepts the following parameters:
342
+
343
+ | Key | Description | Default |
344
+ | --- | --- | --- |
345
+ | ``service_name`` | Service name used for `dalli` instrumentation | memcached |
413
346
 
414
347
  ### Redis
415
348
 
@@ -418,103 +351,131 @@ The Redis integration will trace simple calls as well as pipelines.
418
351
  require 'redis'
419
352
  require 'ddtrace'
420
353
 
421
- Datadog::Monkey.patch_module(:redis) # explicitly patch it
354
+ Datadog.configure do |c|
355
+ c.use :redis, service_name: 'redis'
356
+ end
422
357
 
423
358
  # now do your Redis stuff, eg:
424
359
  redis = Redis.new
425
360
  redis.set 'foo', 'bar' # traced!
426
361
 
362
+ Where `options` is an optional `Hash` that accepts the following parameters:
363
+
364
+ | Key | Description | Default |
365
+ | --- | --- | --- |
366
+ | ``service_name`` | Service name used for `redis` instrumentation | redis |
367
+
368
+ You can also set *per-instance* configuration as it follows:
369
+
370
+ customer_cache = Redis.new
371
+ invoice_cache = Redis.new
372
+
373
+ Datadog.configure(customer_cache, service_name: 'customer-cache')
374
+ Datadog.configure(invoice_cache, service_name: invoice-cache')
375
+
376
+ customer_cache.get(...) # traced call will belong to `customer-cache` service
377
+ invoice_cache.get(...) # traced call will belong to `invoice-cache` service
378
+
427
379
  ### Sidekiq
428
380
 
429
381
  The Sidekiq integration is a server-side middleware which will trace job
430
- executions. It can be added as any other Sidekiq middleware:
382
+ executions. You can enable it through `Datadog.configure`:
431
383
 
432
- require 'sidekiq'
433
384
  require 'ddtrace'
434
- require 'ddtrace/contrib/sidekiq/tracer'
435
385
 
436
- Sidekiq.configure_server do |config|
437
- config.server_middleware do |chain|
438
- chain.add(Datadog::Contrib::Sidekiq::Tracer)
439
- end
386
+ Datadog.configure do |c|
387
+ c.use :sidekiq, options
440
388
  end
441
389
 
442
- #### Configure the tracer middleware
443
-
444
- To modify the default configuration, simply pass arguments to the middleware.
445
- For example, to change the default service name:
446
-
447
- Sidekiq.configure_server do |config|
448
- config.server_middleware do |chain|
449
- chain.add(
450
- Datadog::Contrib::Sidekiq::Tracer,
451
- sidekiq_service: 'sidekiq-notifications'
452
- )
453
- end
454
- end
390
+ Where `options` is an optional `Hash` that accepts the following parameters:
455
391
 
456
- Available settings are:
457
-
458
- * ``enabled``: define if the ``tracer`` is enabled or not. If set to
459
- ``false``, the code is still instrumented but no spans are sent to the local
460
- trace agent.
461
- * ``sidekiq_service``: set the service name used when tracing application
462
- requests. Defaults to ``sidekiq``.
463
- * ``tracer``: set the tracer to use. Usually you don't need to change that
464
- value unless you're already using a different initialized tracer somewhere
465
- else.
466
- * ``debug``: set to ``true`` to enable debug logging.
467
- * ``trace_agent_hostname``: set the hostname of the trace agent.
468
- * ``trace_agent_port``: set the port the trace agent is listening on.
469
-
470
- If you're using Sidekiq along with [Ruby on Rails](#label-Ruby+on+Rails) auto-instrumentation,
471
- the Sidekiq middleware will re-use the Rails configuration defined in the initializer file before
472
- giving precedence to the middleware settings. Inherited configurations are:
473
-
474
- * ``enabled``
475
- * ``tracer``
476
- * ``debug``
477
- * ``trace_agent_hostname``
478
- * ``trace_agent_port``
392
+ | Key | Description | Default |
393
+ | --- | --- | --- |
394
+ | ``service_name`` | Service name used for `sidekiq` instrumentation | sidekiq |
479
395
 
480
396
  ### Resque
481
397
 
482
398
  The Resque integration uses Resque hooks that wraps the ``perform`` method.
483
- To add tracing to a Resque job, extend your base class with the provided
484
- one:
399
+ To add tracing to a Resque job, simply do as follows:
485
400
 
486
401
  require 'ddtrace'
487
- require 'ddtrace/contrib/resque/resque_job'
488
-
489
- # patch Resque
490
- Datadog::Monkey.patch_module(:resque)
491
402
 
492
403
  class MyJob
493
- # extend MyJob with integration hooks
494
- extend Datadog::Contrib::Resque::ResqueJob
495
-
496
404
  def self.perform(*args)
497
405
  # do_something
498
406
  end
499
407
  end
500
408
 
409
+ Datadog.configure do |c|
410
+ c.use :resque, options
411
+ end
412
+
413
+ Where `options` is an optional `Hash` that accepts the following parameters:
414
+
415
+ | Key | Description | Default |
416
+ | --- | --- | --- |
417
+ | ``service_name`` | Service name used for `resque` instrumentation | resque |
418
+ | ``workers`` | An array including all worker classes you want to trace (eg ``[MyJob]``) | ``[]`` |
419
+
501
420
  ### SuckerPunch
502
421
 
503
422
  The `sucker_punch` integration traces all scheduled jobs:
504
423
 
505
424
  require 'ddtrace'
506
425
 
507
- Datadog::Monkey.patch_module(:sucker_punch)
426
+ Datadog.configure do |c|
427
+ c.use :sucker_punch, options
428
+ end
508
429
 
509
430
  # the execution of this job is traced
510
431
  LogJob.perform_async('login')
511
432
 
512
- # to change SuckerPunch service name, use the Pin class
513
- pin = Datadog::Pin.get_from(::SuckerPunch)
514
- pin.service = 'deploy-queues'
433
+ Where `options` is an optional `Hash` that accepts the following parameters:
434
+
435
+ | Key | Description | Default |
436
+ | --- | --- | --- |
437
+ | ``service_name`` | Service name used for `sucker_punch` instrumentation | sucker_punch |
515
438
 
516
439
  ## Advanced usage
517
440
 
441
+ ### Configure the tracer
442
+
443
+ To change the default behavior of the Datadog tracer, you can provide custom options inside the `Datadog.configure` block as in:
444
+
445
+ # config/initializers/datadog-tracer.rb
446
+
447
+ Datadog.configure do |c|
448
+ c.tracer option_name: option_value, ...
449
+ end
450
+
451
+ Available options are:
452
+
453
+ * ``enabled``: defines if the ``tracer`` is enabled or not. If set to ``false`` the code could be still instrumented
454
+ because of other settings, but no spans are sent to the local trace agent.
455
+ * ``debug``: set to true to enable debug logging.
456
+ * ``hostname``: set the hostname of the trace agent.
457
+ * ``port``: set the port the trace agent is listening on.
458
+ * ``env``: set the environment. Rails users may set it to ``Rails.env`` to use their application settings.
459
+ * ``tags``: set global tags that should be applied to all spans. Defaults to an empty hash
460
+ * ``log``: defines a custom logger.
461
+
462
+ #### Using a custom logger
463
+
464
+ By default, all logs are processed by the default Ruby logger.
465
+ Typically, when using Rails, you should see the messages in your application log file.
466
+ Datadog client log messages are marked with ``[ddtrace]`` so you should be able
467
+ to isolate them from other messages.
468
+
469
+ Additionally, it is possible to override the default logger and replace it by a
470
+ custom one. This is done using the ``log`` attribute of the tracer.
471
+
472
+ f = File.new("my-custom.log", "w+") # Log messages should go there
473
+ Datadog.configure do |c|
474
+ c.tracer log: Logger.new(f) # Overriding the default tracer
475
+ end
476
+
477
+ Datadog::Tracer.log.info { "this is typically called by tracing code" }
478
+
518
479
  ### Manual Instrumentation
519
480
 
520
481
  If you aren't using a supported framework instrumentation, you may want to to manually instrument your code.
@@ -547,148 +508,9 @@ to trace requests to the home page:
547
508
  tracer.trace('template.render') do
548
509
  erb :index
549
510
  end
550
-
551
- # trace using start_span (fine-grain control, requires explicit call to finish)
552
- child = tracer.start_span('child', child_of: span)
553
- # do something
554
- child.finish
555
- end
556
- end
557
-
558
- ### Patching methods
559
-
560
- Integrations such as Redis or Elasticsearch use monkey patching.
561
-
562
- The available methods are:
563
-
564
- * ``autopatch_modules``: returns a hash of all modules available for monkey patching,
565
- the key is the name of the module and the value ``true`` or ``false``. If it is ``true``,
566
- a call to ``patch_all`` will enable the module, if it is ``false``, it will do nothing.
567
- * ``patch_all``: patches all modules which are supported. Make sure all the necessary
568
- calls to ``require`` have been done before this is called, else monkey patching will
569
- not work.
570
- * ``patch_module``: patches a single module, regardless of its settings in the
571
- ``autopatch_modules`` list.
572
- * ``patch``: patches some modules, you should pass a hash like the one returned
573
- by ``autopatch_modules``
574
- * ``get_patched_modules``: returns the list of patched modules, a module has been
575
- correctly patched only if it is in this hash, with a value set to ``true``.
576
-
577
- Example:
578
-
579
- require 'ddtrace'
580
-
581
- puts Datadog::Monkey.autopatch_modules # lists all modules available for monkey patching
582
- Datadog::Monkey.patch_module(:redis) # patch only one module
583
- Datadog::Monkey.patch(elasticsearch: false, redis: true) # patch redis, but not elasticsearch
584
- Datadog::Monkey.patch_all # patch all the available modules
585
- puts Datadog::Monkey.get_patched_modules # tells wether modules are patched or not
586
-
587
- It is safe to call ``patch_all``, ``patch_module`` or ``patch`` several times.
588
- Make sure the library you want to patch is imported before you call ``patch_module``.
589
- In doubt, check with ``get_patched_modules``.
590
- Once a module is patched, it is not possible to unpatch it.
591
-
592
- ### Patch Info (PIN)
593
-
594
- The Patch Info, AKA ``Pin`` object, gives you control on the integration.
595
-
596
- It has one class method:
597
-
598
- * ``get_from``: returns the Pin object which has been pinned onto some random
599
- object. It is safe to call ``get_from`` on any object, but it might return ``nil``.
600
-
601
- Some instance methods:
602
-
603
- * ``enabled?``: wether tracing is enabled for this object
604
- * ``onto``: applies the patch information to some random object. It is the companion
605
- function of ``get_from``.
606
-
607
- Accessors:
608
-
609
- * ``service``: service, you should typically set some meaningful value for this.
610
- * ``app``: application name
611
- * ``tags``: optional tags
612
- * ``app_type``: application type
613
- * ``name``: span name
614
- * ``tracer``: the tracer object used for tracing
615
-
616
- By default, a traced integration such as Redis or Elasticsearch carries a Pin object. Eg:
617
-
618
- require 'redis'
619
- require 'ddtrace'
620
-
621
- Datadog::Monkey.patch_all
622
-
623
- redis = Redis.new
624
- pin = Datadog::Pin.get_from(redis)
625
- pin.service = 'my-redis-cache'
626
- puts redis.get 'my-key' # this will be traced as belonging to 'my-redis-cache' service
627
- pin.tracer = nil
628
- puts pin.enabled? # false
629
- puts redis.get 'my-key' # this won't be traced, tracing has been disabled now
630
-
631
- You can use this object to instrument your own code:
632
-
633
- require 'ddtrace'
634
- require 'ddtrace/ext/app_types'
635
-
636
- class MyWebSite
637
- def initialize
638
- pin = Datadog::Pin.new('my-web-site', app_type: Datadog::Ext::AppTypes::WEB)
639
- pin.onto(self)
640
- end
641
-
642
- def serve(something)
643
- pin = Datadog::Pin.get_from(self)
644
- pin.tracer.trace('serve') do |span|
645
- span.resource = something
646
- span.service = pin.service
647
- # serve something here
648
- end
649
- end
650
- end
651
-
652
- ### Debug Mode
653
-
654
- If you need to check locally what traces and spans are sent after each traced block, you can enable
655
- a global debug mode for all tracers so that every time a trace is ready to be sent, the content will be
656
- printed in the +STDOUT+. To enable the debug logging, add this code anywhere before using the tracer
657
- for the first time:
658
-
659
- require 'ddtrace'
660
- require 'sinatra'
661
- require 'active_record'
662
-
663
- # enable debug mode
664
- Datadog::Tracer.debug_logging = true
665
-
666
- # use the tracer as usual
667
- tracer = Datadog.tracer
668
-
669
- get '/' do
670
- tracer.trace('web.request') do |span|
671
- # ...
672
511
  end
673
512
  end
674
513
 
675
- Remember that the debug mode may affect your application performance and so it must not be used
676
- in a production environment.
677
-
678
- ### Using a custom logger
679
-
680
- By default, all logs are processed by the default Ruby logger.
681
- Typically, when using Rails, you should see the messages in your application log file.
682
- Datadog client log messages are marked with ``[ddtrace]`` so you should be able
683
- to isolate them from other messages.
684
-
685
- Additionally, it is possible to override the default logger and replace it by a
686
- custom one. This is done using the ``log`` attribute of the tracer.
687
-
688
- f = File.new("my-custom.log", "w+") # Log messages should go there
689
- Datadog::Tracer.log = Logger.new(f) # Overriding the default tracer
690
- Datadog::Tracer.log.info { "this is typically called by tracing code" }
691
-
692
514
  ### Environment and tags
693
515
 
694
516
  By default, the trace agent (not this library, but the program running in
@@ -698,7 +520,9 @@ set in the agent config file, see our
698
520
 
699
521
  These values can be overridden at the tracer level:
700
522
 
701
- Datadog.tracer.set_tags('env' => 'prod')
523
+ Datadog.configure do |c|
524
+ c.tracer tags: { 'env' => 'prod' }
525
+ end
702
526
 
703
527
  This enables you to set this value on a per tracer basis, so you can have
704
528
  for example several applications reporting for different environments on the same host.
@@ -716,32 +540,49 @@ overhead.
716
540
 
717
541
  # Sample rate is between 0 (nothing sampled) to 1 (everything sampled).
718
542
  sampler = Datadog::RateSampler.new(0.5) # sample 50% of the traces
719
- Datadog.tracer.configure(sampler: sampler)
543
+ Datadog.configure do |c|
544
+ c.tracer sampler: sampler
545
+ end
720
546
 
721
547
  #### Priority sampling
722
548
 
723
549
  Priority sampling consists in deciding if a trace will be kept by using a priority attribute that will be propagated for distributed traces. Its value gives indication to the Agent and to the backend on how important the trace is.
724
550
 
725
- * 0: Don’t keep the trace.
726
- * 1: The sampler automatically decided to keep the trace.
727
- * 2: The user asked the keep the trace.
551
+ The sampler can set the priority to the following values:
552
+
553
+ * `Datadog::Ext::Priority::AUTO_REJECT`: the sampler automatically decided to reject the trace.
554
+ * `Datadog::Ext::Priority::AUTO_KEEP`: the sampler automatically decided to keep the trace.
728
555
 
729
556
  For now, priority sampling is disabled by default. Enabling it ensures that your sampled distributed traces will be complete. To enable the priority sampling:
730
557
 
731
558
  ```rb
732
- Datadog.tracer.configure(priority_sampling: true)
559
+ Datadog.configure do |c|
560
+ c.tracer priority_sampling: true
561
+ end
733
562
  ```
734
563
 
735
564
  Once enabled, the sampler will automatically assign a priority of 0 or 1 to traces, depending on their service and volume.
736
565
 
737
- You can also set this priority manually to either drop a non-interesting trace or to keep an important one. For that, set the `context#sampling_priority` to 0 or 2. It has to be done before any context propagation (fork, RPC calls) to be effective:
566
+ You can also set this priority manually to either drop a non-interesting trace or to keep an important one. For that, set the `context#sampling_priority` to:
567
+
568
+ * `Datadog::Ext::Priority::USER_REJECT`: the user asked to reject the trace.
569
+ * `Datadog::Ext::Priority::USER_KEEP`: the user asked to keep the trace.
570
+
571
+ When not using [distributed tracing](#Distributed_Tracing), you may change the priority at any time,
572
+ as long as the trace is not finished yet.
573
+ But it has to be done before any context propagation (fork, RPC calls) to be effective in a distributed context.
574
+ Changing the priority after context has been propagated causes different parts of a distributed trace
575
+ to use different priorities. Some parts might be kept, some parts might be rejected,
576
+ and this can cause the trace to be partially stored and remain incomplete.
577
+
578
+ If you change the priority, we recommend you do it as soon as possible, when the root span has just been created.
738
579
 
739
580
  ```rb
740
- # Indicate to not keep the trace
741
- span.context.sampling_priority = 0
581
+ # Indicate to reject the trace
582
+ span.context.sampling_priority = Datadog::Ext::Priority::USER_REJECT
742
583
 
743
584
  # Indicate to keep the trace
744
- span.context.sampling_priority = 2
585
+ span.context.sampling_priority = Datadog::Ext::Priority::USER_KEEP
745
586
  ```
746
587
 
747
588
  ### Distributed Tracing
@@ -766,9 +607,6 @@ On the client:
766
607
  require 'net/http'
767
608
  require 'ddtrace'
768
609
 
769
- # Do *not* monkey patch here, we do it "manually", to demo the feature
770
- # Datadog::Monkey.patch_module(:http)
771
-
772
610
  uri = URI('http://localhost:4567/')
773
611
 
774
612
  Datadog.tracer.trace('web.call') do |span|
@@ -788,9 +626,6 @@ On the server:
788
626
  require 'sinatra'
789
627
  require 'ddtrace'
790
628
 
791
- # Do *not* use Sinatra integration, we do it "manually", to demo the feature
792
- # require 'ddtrace/contrib/sinatra/tracer'
793
-
794
629
  get '/' do
795
630
  parent_trace_id = request.env['HTTP_X_DATADOG_TRACE_ID']
796
631
  parent_span_id = request.env['HTTP_X_DATADOG_PARENT_ID']
@@ -807,7 +642,7 @@ On the server:
807
642
 
808
643
  [Rack](#Rack) and [Net/HTTP](#Net_HTTP) have experimental support for this, they
809
644
  can send and receive these headers automatically and tie spans together automatically,
810
- provided you pass a ``:distributed_tracing_enabled`` option set to ``true``.
645
+ provided you pass a ``:distributed_tracing`` option set to ``true``.
811
646
 
812
647
  This is disabled by default.
813
648
 
@@ -828,34 +663,6 @@ pipeline using the method `Datadog::Pipeline.before_flush`:
828
663
 
829
664
  For more information, please refer to this [link](https://github.com/DataDog/dd-trace-rb/pull/214).
830
665
 
831
- ### Troubleshooting
832
-
833
- #### Logs
834
-
835
- Your application log should contain informations and report problems
836
- such as agent not being up and running. All logs generated by this
837
- library should contain ``[ddtrace]``. Also see [how to use a custom logger](#Using_a_custom_logger)
838
- to redirect these messages elsewhere.
839
-
840
- The [Datadog Trace Agent](https://github.com/DataDog/datadog-trace-agent)
841
- should by default be listening for traces on port 8126.
842
-
843
- #### Hello World
844
-
845
- Sometimes, setting up a complete application is complex, so in doubt,
846
- try the small program below, which should be able to report traces
847
- for a ``tracegen`` service:
848
-
849
- require 'ddtrace'
850
-
851
- loop do
852
- Datadog.tracer.trace('hello-world') do |span|
853
- span.service = 'tracegen'
854
- span.resource = 'ruby'
855
- sleep 1
856
- end
857
- end
858
-
859
666
  ### Supported Versions
860
667
 
861
668
  #### Ruby interpreters