ddtrace 0.11.0 → 0.11.1
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/Appraisals +5 -2
- data/README.md +4 -1
- data/Rakefile +7 -15
- data/docs/GettingStarted.md +3 -1
- data/gemfiles/contrib.gemfile +2 -1
- data/gemfiles/contrib_old.gemfile +3 -1
- data/lib/ddtrace.rb +19 -5
- data/lib/ddtrace/contrib/active_record/patcher.rb +3 -7
- data/lib/ddtrace/contrib/base.rb +1 -0
- data/lib/ddtrace/contrib/elasticsearch/patcher.rb +1 -3
- data/lib/ddtrace/contrib/http/patcher.rb +1 -3
- data/lib/ddtrace/contrib/mongodb/patcher.rb +1 -3
- data/lib/ddtrace/contrib/racecar/patcher.rb +14 -16
- data/lib/ddtrace/contrib/rack/middlewares.rb +41 -27
- data/lib/ddtrace/contrib/rails/action_controller.rb +28 -5
- data/lib/ddtrace/contrib/rails/core_extensions.rb +6 -1
- data/lib/ddtrace/contrib/rails/patcher.rb +1 -0
- data/lib/ddtrace/contrib/redis/patcher.rb +1 -3
- data/lib/ddtrace/contrib/sinatra/tracer.rb +8 -1
- data/lib/ddtrace/ext/http.rb +1 -0
- data/lib/ddtrace/patcher.rb +18 -0
- data/lib/ddtrace/version.rb +1 -1
- metadata +3 -3
- data/lib/ddtrace/monkey.rb +0 -88
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: edcd0745f2ad784016b18e4b7e4694e4af12223a
|
4
|
+
data.tar.gz: '0952683e8798ee961851a881d0ea4343a121572a'
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 5cae4b99e2e0170f5a7da8a320ae7235ec7cc3431c8dee355a84e921b2f7933bbc2e32058547a8bea6dcbabfe94a4b1aff3bb293d7d059f480fca84f8ca5eb62
|
7
|
+
data.tar.gz: b74edf57aeee710af1024f68eee73e804f3bff2cb0ee4426c384b6fc8626f36db85ea7fa95e698d4b3cc32f33ffc78d2e6fdc49368a11a4122cf2a847ebaf9f8
|
data/Appraisals
CHANGED
@@ -114,7 +114,7 @@ end
|
|
114
114
|
if RUBY_VERSION >= '2.2.2' && RUBY_PLATFORM != 'java'
|
115
115
|
appraise 'contrib' do
|
116
116
|
gem 'elasticsearch-transport'
|
117
|
-
gem 'mongo'
|
117
|
+
gem 'mongo', '< 2.5'
|
118
118
|
gem 'grape'
|
119
119
|
gem 'rack'
|
120
120
|
gem 'rack-test'
|
@@ -129,11 +129,12 @@ if RUBY_VERSION >= '2.2.2' && RUBY_PLATFORM != 'java'
|
|
129
129
|
gem 'dalli'
|
130
130
|
gem 'resque', '< 2.0'
|
131
131
|
gem 'racecar', '>= 0.3.5'
|
132
|
+
gem 'mysql2', platform: :ruby
|
132
133
|
end
|
133
134
|
else
|
134
135
|
appraise 'contrib-old' do
|
135
136
|
gem 'elasticsearch-transport'
|
136
|
-
gem 'mongo'
|
137
|
+
gem 'mongo', '< 2.5'
|
137
138
|
gem 'redis', '< 4.0'
|
138
139
|
gem 'hiredis'
|
139
140
|
gem 'rack', '1.4.7'
|
@@ -146,5 +147,7 @@ else
|
|
146
147
|
gem 'sucker_punch'
|
147
148
|
gem 'dalli'
|
148
149
|
gem 'resque', '< 2.0'
|
150
|
+
gem 'mysql2', '0.3.21', platform: :ruby
|
151
|
+
gem 'activerecord-mysql-adapter', platform: :ruby
|
149
152
|
end
|
150
153
|
end
|
data/README.md
CHANGED
@@ -75,7 +75,10 @@ you can activate it. The example above would become:
|
|
75
75
|
require 'sinatra'
|
76
76
|
require 'active_record'
|
77
77
|
|
78
|
-
Datadog
|
78
|
+
Datadog.configure do |c|
|
79
|
+
c.use :sinatra
|
80
|
+
c.use :active_record
|
81
|
+
end
|
79
82
|
|
80
83
|
# now write your code naturally, it's traced automatically
|
81
84
|
get '/' do
|
data/Rakefile
CHANGED
@@ -11,11 +11,11 @@ desc 'Run RSpec'
|
|
11
11
|
namespace :spec do
|
12
12
|
task all: [:main,
|
13
13
|
:rails, :railsredis, :railssidekiq, :railsactivejob,
|
14
|
-
:elasticsearch, :http, :redis, :sidekiq, :sinatra
|
14
|
+
:elasticsearch, :http, :redis, :sidekiq, :sinatra]
|
15
15
|
|
16
16
|
RSpec::Core::RakeTask.new(:main) do |t|
|
17
17
|
t.pattern = 'spec/**/*_spec.rb'
|
18
|
-
t.exclude_pattern = 'spec/**/{contrib,benchmark,redis}/**/*_spec.rb
|
18
|
+
t.exclude_pattern = 'spec/**/{contrib,benchmark,redis}/**/*_spec.rb'
|
19
19
|
end
|
20
20
|
|
21
21
|
RSpec::Core::RakeTask.new(:rails) do |t|
|
@@ -53,30 +53,26 @@ namespace :spec do
|
|
53
53
|
:mongodb,
|
54
54
|
:racecar,
|
55
55
|
:resque,
|
56
|
+
:active_record,
|
56
57
|
:dalli
|
57
58
|
].each do |contrib|
|
58
59
|
RSpec::Core::RakeTask.new(contrib) do |t|
|
59
60
|
t.pattern = "spec/ddtrace/contrib/#{contrib}/*_spec.rb"
|
60
61
|
end
|
61
62
|
end
|
62
|
-
|
63
|
-
RSpec::Core::RakeTask.new(:monkey) do |t|
|
64
|
-
t.pattern = 'spec/ddtrace/monkey_spec.rb'
|
65
|
-
end
|
66
63
|
end
|
67
64
|
|
68
65
|
namespace :test do
|
69
66
|
task all: [:main,
|
70
67
|
:rails, :railsredis, :railssidekiq, :railsactivejob,
|
71
|
-
:elasticsearch, :http, :redis, :sidekiq, :sinatra
|
68
|
+
:elasticsearch, :http, :redis, :sidekiq, :sinatra]
|
72
69
|
|
73
70
|
Rake::TestTask.new(:main) do |t|
|
74
71
|
t.libs << %w[test lib]
|
75
72
|
t.test_files = FileList['test/**/*_test.rb'].reject do |path|
|
76
73
|
path.include?('contrib') ||
|
77
74
|
path.include?('benchmark') ||
|
78
|
-
path.include?('redis')
|
79
|
-
path.include?('monkey_test.rb')
|
75
|
+
path.include?('redis')
|
80
76
|
end
|
81
77
|
end
|
82
78
|
|
@@ -129,11 +125,6 @@ namespace :test do
|
|
129
125
|
t.test_files = FileList["test/contrib/#{contrib}/*_test.rb"]
|
130
126
|
end
|
131
127
|
end
|
132
|
-
|
133
|
-
Rake::TestTask.new(:monkey) do |t|
|
134
|
-
t.libs << %w[test lib]
|
135
|
-
t.test_files = FileList['test/monkey_test.rb']
|
136
|
-
end
|
137
128
|
end
|
138
129
|
|
139
130
|
Rake::TestTask.new(:benchmark) do |t|
|
@@ -219,7 +210,6 @@ task :ci do
|
|
219
210
|
sh 'rvm $MRI_VERSIONS --verbose do appraisal contrib rake test:mongodb'
|
220
211
|
sh 'rvm $MRI_VERSIONS --verbose do appraisal contrib rake test:sucker_punch'
|
221
212
|
sh 'rvm $MRI_VERSIONS --verbose do appraisal contrib rake test:resque'
|
222
|
-
sh 'rvm $MRI_OLD_VERSIONS --verbose do appraisal contrib-old rake test:monkey'
|
223
213
|
sh 'rvm $MRI_OLD_VERSIONS --verbose do appraisal contrib-old rake test:elasticsearch'
|
224
214
|
sh 'rvm $MRI_OLD_VERSIONS --verbose do appraisal contrib-old rake test:http'
|
225
215
|
sh 'rvm $MRI_OLD_VERSIONS --verbose do appraisal contrib-old rake test:redis'
|
@@ -231,9 +221,11 @@ task :ci do
|
|
231
221
|
sh 'rvm $MRI_OLD_VERSIONS --verbose do appraisal contrib-old rake test:sucker_punch'
|
232
222
|
sh 'rvm $MRI_OLD_VERSIONS --verbose do appraisal contrib-old rake test:resque'
|
233
223
|
# RSpec
|
224
|
+
sh 'rvm $MRI_VERSIONS --verbose do appraisal contrib rake spec:active_record'
|
234
225
|
sh 'rvm $MRI_VERSIONS --verbose do appraisal contrib rake spec:dalli'
|
235
226
|
sh 'rvm $MRI_VERSIONS --verbose do appraisal contrib rake spec:racecar'
|
236
227
|
sh 'rvm $MRI_OLD_VERSIONS --verbose do appraisal contrib-old rake spec:dalli'
|
228
|
+
sh 'rvm $MRI_OLD_VERSIONS --verbose do appraisal contrib-old rake spec:active_record'
|
237
229
|
when 2
|
238
230
|
sh 'rvm $MRI_VERSIONS --verbose do appraisal contrib rake test:sidekiq'
|
239
231
|
sh 'rvm $SIDEKIQ_OLD_VERSIONS --verbose do appraisal contrib-old rake test:sidekiq'
|
data/docs/GettingStarted.md
CHANGED
@@ -77,7 +77,8 @@ Where `options` is an optional `Hash` that accepts the following parameters:
|
|
77
77
|
| ``service_name`` | Service name used when tracing application requests (on the `rack` level) | ``<app_name>`` (inferred from your Rails application namespace) |
|
78
78
|
| ``controller_service`` | Service name used when tracing a Rails action controller | ``<app_name>-controller`` |
|
79
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
|
80
|
+
| ``database_service`` | Database service name used when tracing database activity | ``<app_name>-<adapter_name>`` |
|
81
|
+
| ``exception_controller`` | Class or Module which identifies a custom exception controller class. Tracer provides improved error behavior when it can identify custom exception controllers. By default, without this option, it 'guesses' what a custom exception controller looks like. Providing this option aids this identification. | ``nil`` |
|
81
82
|
| ``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
83
|
| ``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
84
|
| ``tracer`` | A ``Datadog::Tracer`` instance used to instrument the application. Usually you don't need to set that. | ``Datadog.tracer`` |
|
@@ -107,6 +108,7 @@ Where `options` is an optional `Hash` that accepts the following parameters:
|
|
107
108
|
| --- | --- | --- |
|
108
109
|
| ``service_name`` | Service name used for `sinatra` instrumentation | sinatra |
|
109
110
|
| ``resource_script_names`` | Prepend resource names with script name | ``false`` |
|
111
|
+
| ``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` |
|
110
112
|
| ``tracer`` | A ``Datadog::Tracer`` instance used to instrument the application. Usually you don't need to set that. | ``Datadog.tracer`` |
|
111
113
|
|
112
114
|
### Rack
|
data/gemfiles/contrib.gemfile
CHANGED
@@ -4,7 +4,7 @@ source "https://rubygems.org"
|
|
4
4
|
|
5
5
|
gem "pry-nav", git: "https://github.com/nixme/pry-nav.git", branch: "master"
|
6
6
|
gem "elasticsearch-transport"
|
7
|
-
gem "mongo"
|
7
|
+
gem "mongo", "< 2.5"
|
8
8
|
gem "grape"
|
9
9
|
gem "rack"
|
10
10
|
gem "rack-test"
|
@@ -19,5 +19,6 @@ gem "sucker_punch"
|
|
19
19
|
gem "dalli"
|
20
20
|
gem "resque", "< 2.0"
|
21
21
|
gem "racecar", ">= 0.3.5"
|
22
|
+
gem "mysql2", platform: :ruby
|
22
23
|
|
23
24
|
gemspec path: "../"
|
@@ -4,7 +4,7 @@ source "https://rubygems.org"
|
|
4
4
|
|
5
5
|
gem "pry-nav", git: "https://github.com/nixme/pry-nav.git", branch: "master"
|
6
6
|
gem "elasticsearch-transport"
|
7
|
-
gem "mongo"
|
7
|
+
gem "mongo", "< 2.5"
|
8
8
|
gem "redis", "< 4.0"
|
9
9
|
gem "hiredis"
|
10
10
|
gem "rack", "1.4.7"
|
@@ -17,5 +17,7 @@ gem "aws-sdk", "~> 2.0"
|
|
17
17
|
gem "sucker_punch"
|
18
18
|
gem "dalli"
|
19
19
|
gem "resque", "< 2.0"
|
20
|
+
gem "mysql2", "0.3.21", platform: :ruby
|
21
|
+
gem "activerecord-mysql-adapter", platform: :ruby
|
20
22
|
|
21
23
|
gemspec path: "../"
|
data/lib/ddtrace.rb
CHANGED
@@ -1,9 +1,12 @@
|
|
1
|
+
require 'thread'
|
2
|
+
|
1
3
|
require 'ddtrace/registry'
|
2
4
|
require 'ddtrace/pin'
|
3
5
|
require 'ddtrace/tracer'
|
4
6
|
require 'ddtrace/error'
|
5
7
|
require 'ddtrace/pipeline'
|
6
8
|
require 'ddtrace/configuration'
|
9
|
+
require 'ddtrace/patcher'
|
7
10
|
|
8
11
|
# \Datadog global namespace that includes all tracing functionality for Tracer and Span classes.
|
9
12
|
module Datadog
|
@@ -49,8 +52,19 @@ module Datadog
|
|
49
52
|
end
|
50
53
|
end
|
51
54
|
|
52
|
-
|
53
|
-
|
54
|
-
|
55
|
-
|
56
|
-
require 'ddtrace/
|
55
|
+
require 'ddtrace/contrib/base'
|
56
|
+
require 'ddtrace/contrib/rack/patcher'
|
57
|
+
require 'ddtrace/contrib/rails/patcher'
|
58
|
+
require 'ddtrace/contrib/active_record/patcher'
|
59
|
+
require 'ddtrace/contrib/elasticsearch/patcher'
|
60
|
+
require 'ddtrace/contrib/faraday/patcher'
|
61
|
+
require 'ddtrace/contrib/grape/patcher'
|
62
|
+
require 'ddtrace/contrib/redis/patcher'
|
63
|
+
require 'ddtrace/contrib/http/patcher'
|
64
|
+
require 'ddtrace/contrib/aws/patcher'
|
65
|
+
require 'ddtrace/contrib/sucker_punch/patcher'
|
66
|
+
require 'ddtrace/contrib/mongodb/patcher'
|
67
|
+
require 'ddtrace/contrib/dalli/patcher'
|
68
|
+
require 'ddtrace/contrib/resque/patcher'
|
69
|
+
require 'ddtrace/contrib/racecar/patcher'
|
70
|
+
require 'ddtrace/contrib/sidekiq/patcher'
|
@@ -2,11 +2,11 @@ module Datadog
|
|
2
2
|
module Contrib
|
3
3
|
module ActiveRecord
|
4
4
|
# Patcher enables patching of 'active_record' module.
|
5
|
-
# This is used in monkey.rb to manually apply patches
|
6
5
|
module Patcher
|
7
6
|
include Base
|
8
7
|
register_as :active_record, auto_patch: false
|
9
8
|
option :service_name
|
9
|
+
option :tracer, default: Datadog.tracer
|
10
10
|
|
11
11
|
@patched = false
|
12
12
|
|
@@ -58,22 +58,18 @@ module Datadog
|
|
58
58
|
@adapter_port ||= Datadog::Contrib::Rails::Utils.adapter_port
|
59
59
|
end
|
60
60
|
|
61
|
-
def self.tracer
|
62
|
-
@tracer ||= Datadog.configuration[:sinatra][:tracer]
|
63
|
-
end
|
64
|
-
|
65
61
|
def self.database_service
|
66
62
|
return @database_service if defined?(@database_service)
|
67
63
|
|
68
64
|
@database_service = get_option(:service_name) || adapter_name
|
69
|
-
tracer.set_service_info(@database_service, '
|
65
|
+
get_option(:tracer).set_service_info(@database_service, 'active_record', Ext::AppTypes::DB)
|
70
66
|
@database_service
|
71
67
|
end
|
72
68
|
|
73
69
|
def self.sql(_name, start, finish, _id, payload)
|
74
70
|
span_type = Datadog::Ext::SQL::TYPE
|
75
71
|
|
76
|
-
span = tracer.trace(
|
72
|
+
span = get_option(:tracer).trace(
|
77
73
|
"#{adapter_name}.query",
|
78
74
|
resource: payload.fetch(:sql),
|
79
75
|
service: database_service,
|
data/lib/ddtrace/contrib/base.rb
CHANGED
@@ -11,7 +11,6 @@ module Datadog
|
|
11
11
|
SERVICE = 'elasticsearch'.freeze
|
12
12
|
|
13
13
|
# Patcher enables patching of 'elasticsearch/transport' module.
|
14
|
-
# This is used in monkey.rb to automatically apply patches
|
15
14
|
module Patcher
|
16
15
|
include Base
|
17
16
|
register_as :elasticsearch, auto_patch: true
|
@@ -28,7 +27,6 @@ module Datadog
|
|
28
27
|
begin
|
29
28
|
require 'uri'
|
30
29
|
require 'json'
|
31
|
-
require 'ddtrace/monkey'
|
32
30
|
require 'ddtrace/pin'
|
33
31
|
require 'ddtrace/ext/app_types'
|
34
32
|
require 'ddtrace/contrib/elasticsearch/quantize'
|
@@ -49,7 +47,7 @@ module Datadog
|
|
49
47
|
# rubocop:disable Metrics/BlockLength
|
50
48
|
::Elasticsearch::Transport::Client.class_eval do
|
51
49
|
alias_method :initialize_without_datadog, :initialize
|
52
|
-
Datadog::
|
50
|
+
Datadog::Patcher.without_warnings do
|
53
51
|
remove_method :initialize
|
54
52
|
end
|
55
53
|
|
@@ -44,7 +44,6 @@ module Datadog
|
|
44
44
|
end
|
45
45
|
|
46
46
|
# Patcher enables patching of 'net/http' module.
|
47
|
-
# This is used in monkey.rb to automatically apply patches
|
48
47
|
module Patcher
|
49
48
|
include Base
|
50
49
|
register_as :http, auto_patch: true
|
@@ -60,7 +59,6 @@ module Datadog
|
|
60
59
|
begin
|
61
60
|
require 'uri'
|
62
61
|
require 'ddtrace/pin'
|
63
|
-
require 'ddtrace/monkey'
|
64
62
|
require 'ddtrace/ext/app_types'
|
65
63
|
require 'ddtrace/ext/http'
|
66
64
|
require 'ddtrace/ext/net'
|
@@ -87,7 +85,7 @@ module Datadog
|
|
87
85
|
def patch_http
|
88
86
|
::Net::HTTP.class_eval do
|
89
87
|
alias_method :initialize_without_datadog, :initialize
|
90
|
-
Datadog::
|
88
|
+
Datadog::Patcher.without_warnings do
|
91
89
|
remove_method :initialize
|
92
90
|
end
|
93
91
|
|
@@ -8,8 +8,6 @@ module Datadog
|
|
8
8
|
SERVICE = 'mongodb'.freeze
|
9
9
|
|
10
10
|
# Patcher adds subscribers to the MongoDB driver so that each command is traced.
|
11
|
-
# Use the `Datadog::Monkey.patch_module(:mongodb)` to activate tracing for
|
12
|
-
# this module.
|
13
11
|
module Patcher
|
14
12
|
include Base
|
15
13
|
register_as :mongo, auto_patch: true
|
@@ -57,7 +55,7 @@ module Datadog
|
|
57
55
|
def patch_mongo_client
|
58
56
|
::Mongo::Client.class_eval do
|
59
57
|
alias_method :initialize_without_datadog, :initialize
|
60
|
-
Datadog::
|
58
|
+
Datadog::Patcher.without_warnings do
|
61
59
|
remove_method :initialize
|
62
60
|
end
|
63
61
|
|
@@ -16,10 +16,8 @@ module Datadog
|
|
16
16
|
def patch
|
17
17
|
return patched? if patched? || !compatible?
|
18
18
|
|
19
|
-
::ActiveSupport::Notifications.subscribe('
|
20
|
-
::ActiveSupport::Notifications.subscribe('
|
21
|
-
::ActiveSupport::Notifications.subscribe('process_batch.racecar', &method(:finish))
|
22
|
-
::ActiveSupport::Notifications.subscribe('process_message.racecar', &method(:finish))
|
19
|
+
::ActiveSupport::Notifications.subscribe('process_batch.racecar', self)
|
20
|
+
::ActiveSupport::Notifications.subscribe('process_message.racecar', self)
|
23
21
|
|
24
22
|
configuration[:tracer].set_service_info(
|
25
23
|
configuration[:service_name],
|
@@ -35,17 +33,7 @@ module Datadog
|
|
35
33
|
@patched = false
|
36
34
|
end
|
37
35
|
|
38
|
-
|
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)
|
36
|
+
def start(event, _, payload)
|
49
37
|
ensure_clean_context!
|
50
38
|
|
51
39
|
name = event[/message/] ? NAME_MESSAGE : NAME_BATCH
|
@@ -60,7 +48,7 @@ module Datadog
|
|
60
48
|
span.set_tag('kafka.message_count', payload[:message_count]) if payload.key?(:message_count)
|
61
49
|
end
|
62
50
|
|
63
|
-
def finish(
|
51
|
+
def finish(_, _, payload)
|
64
52
|
current_span = configuration[:tracer].call_context.current_span
|
65
53
|
|
66
54
|
return unless current_span
|
@@ -69,6 +57,16 @@ module Datadog
|
|
69
57
|
current_span.finish
|
70
58
|
end
|
71
59
|
|
60
|
+
private
|
61
|
+
|
62
|
+
def configuration
|
63
|
+
Datadog.configuration[:racecar]
|
64
|
+
end
|
65
|
+
|
66
|
+
def compatible?
|
67
|
+
defined?(::Racecar) && defined?(::ActiveSupport::Notifications)
|
68
|
+
end
|
69
|
+
|
72
70
|
def ensure_clean_context!
|
73
71
|
return unless configuration[:tracer].call_context.current_span
|
74
72
|
|
@@ -20,16 +20,14 @@ module Datadog
|
|
20
20
|
def call(env)
|
21
21
|
# retrieve integration settings
|
22
22
|
tracer = Datadog.configuration[:rack][:tracer]
|
23
|
-
service = Datadog.configuration[:rack][:service_name]
|
24
|
-
distributed_tracing = Datadog.configuration[:rack][:distributed_tracing]
|
25
23
|
|
26
24
|
trace_options = {
|
27
|
-
service:
|
25
|
+
service: Datadog.configuration[:rack][:service_name],
|
28
26
|
resource: nil,
|
29
27
|
span_type: Datadog::Ext::HTTP::TYPE
|
30
28
|
}
|
31
29
|
|
32
|
-
if distributed_tracing
|
30
|
+
if Datadog.configuration[:rack][:distributed_tracing]
|
33
31
|
context = HTTPPropagator.extract(env)
|
34
32
|
tracer.provider.context = context if context.trace_id
|
35
33
|
end
|
@@ -56,35 +54,13 @@ module Datadog
|
|
56
54
|
request_span.set_error(e) unless request_span.nil?
|
57
55
|
raise e
|
58
56
|
ensure
|
59
|
-
# the source of truth in Rack is the PATH_INFO key that holds the
|
60
|
-
# URL for the current request; some framework may override that
|
61
|
-
# value, especially during exception handling and because of that
|
62
|
-
# we prefer using the `REQUEST_URI` if this is available.
|
63
|
-
# NOTE: `REQUEST_URI` is Rails specific and may not apply for other frameworks
|
64
|
-
url = env['REQUEST_URI'] || env['PATH_INFO']
|
65
|
-
|
66
57
|
# Rack is a really low level interface and it doesn't provide any
|
67
58
|
# advanced functionality like routers. Because of that, we assume that
|
68
59
|
# the underlying framework or application has more knowledge about
|
69
60
|
# the result for this request; `resource` and `tags` are expected to
|
70
61
|
# be set in another level but if they're missing, reasonable defaults
|
71
62
|
# are used.
|
72
|
-
request_span
|
73
|
-
if request_span.get_tag(Datadog::Ext::HTTP::METHOD).nil?
|
74
|
-
request_span.set_tag(Datadog::Ext::HTTP::METHOD, env['REQUEST_METHOD'])
|
75
|
-
end
|
76
|
-
if request_span.get_tag(Datadog::Ext::HTTP::URL).nil?
|
77
|
-
request_span.set_tag(Datadog::Ext::HTTP::URL, url)
|
78
|
-
end
|
79
|
-
if request_span.get_tag(Datadog::Ext::HTTP::STATUS_CODE).nil? && status
|
80
|
-
request_span.set_tag(Datadog::Ext::HTTP::STATUS_CODE, status)
|
81
|
-
end
|
82
|
-
|
83
|
-
# detect if the status code is a 5xx and flag the request span as an error
|
84
|
-
# unless it has been already set by the underlying framework
|
85
|
-
if status.to_s.start_with?('5') && request_span.status.zero?
|
86
|
-
request_span.status = 1
|
87
|
-
end
|
63
|
+
set_request_tags!(request_span, env, status, headers, response)
|
88
64
|
|
89
65
|
# ensure the request_span is finished and the context reset;
|
90
66
|
# this assumes that the Rack middleware creates a root span
|
@@ -103,6 +79,44 @@ module Datadog
|
|
103
79
|
"#{env['REQUEST_METHOD']} #{status}".strip
|
104
80
|
end
|
105
81
|
end
|
82
|
+
|
83
|
+
def set_request_tags!(request_span, env, status, headers, response)
|
84
|
+
# the source of truth in Rack is the PATH_INFO key that holds the
|
85
|
+
# URL for the current request; some framework may override that
|
86
|
+
# value, especially during exception handling and because of that
|
87
|
+
# we prefer using the `REQUEST_URI` if this is available.
|
88
|
+
# NOTE: `REQUEST_URI` is Rails specific and may not apply for other frameworks
|
89
|
+
url = env['REQUEST_URI'] || env['PATH_INFO']
|
90
|
+
|
91
|
+
request_span.resource ||= resource_name_for(env, status)
|
92
|
+
if request_span.get_tag(Datadog::Ext::HTTP::METHOD).nil?
|
93
|
+
request_span.set_tag(Datadog::Ext::HTTP::METHOD, env['REQUEST_METHOD'])
|
94
|
+
end
|
95
|
+
if request_span.get_tag(Datadog::Ext::HTTP::URL).nil?
|
96
|
+
request_span.set_tag(Datadog::Ext::HTTP::URL, url)
|
97
|
+
end
|
98
|
+
if request_span.get_tag(Datadog::Ext::HTTP::BASE_URL).nil?
|
99
|
+
request_obj = ::Rack::Request.new(env)
|
100
|
+
|
101
|
+
base_url = if request_obj.respond_to?(:base_url)
|
102
|
+
request_obj.base_url
|
103
|
+
else
|
104
|
+
# Compatibility for older Rack versions
|
105
|
+
request_obj.url.chomp(request_obj.fullpath)
|
106
|
+
end
|
107
|
+
|
108
|
+
request_span.set_tag(Datadog::Ext::HTTP::BASE_URL, base_url)
|
109
|
+
end
|
110
|
+
if request_span.get_tag(Datadog::Ext::HTTP::STATUS_CODE).nil? && status
|
111
|
+
request_span.set_tag(Datadog::Ext::HTTP::STATUS_CODE, status)
|
112
|
+
end
|
113
|
+
|
114
|
+
# detect if the status code is a 5xx and flag the request span as an error
|
115
|
+
# unless it has been already set by the underlying framework
|
116
|
+
if status.to_s.start_with?('5') && request_span.status.zero?
|
117
|
+
request_span.status = 1
|
118
|
+
end
|
119
|
+
end
|
106
120
|
end
|
107
121
|
end
|
108
122
|
end
|
@@ -32,12 +32,15 @@ module Datadog
|
|
32
32
|
return unless span && !span.finished?
|
33
33
|
|
34
34
|
begin
|
35
|
-
resource
|
36
|
-
span.resource
|
35
|
+
# Set the resource name, if it's still the default name
|
36
|
+
if span.resource == span.name
|
37
|
+
span.resource = "#{payload.fetch(:controller)}##{payload.fetch(:action)}"
|
38
|
+
end
|
37
39
|
|
38
|
-
#
|
39
|
-
if
|
40
|
-
|
40
|
+
# Set the parent resource if it's a `rack.request` span,
|
41
|
+
# but not if its an exception contoller.
|
42
|
+
if !span.parent.nil? && span.parent.name == 'rack.request' && !exception_controller?(payload)
|
43
|
+
span.parent.resource = span.resource
|
41
44
|
end
|
42
45
|
|
43
46
|
span.set_tag('rails.route.action', payload.fetch(:action))
|
@@ -64,6 +67,26 @@ module Datadog
|
|
64
67
|
rescue StandardError => e
|
65
68
|
Datadog::Tracer.log.error(e.message)
|
66
69
|
end
|
70
|
+
|
71
|
+
def self.exception_controller?(payload)
|
72
|
+
exception_controller_class = Datadog.configuration[:rails][:exception_controller]
|
73
|
+
controller = payload.fetch(:controller)
|
74
|
+
headers = payload.fetch(:headers)
|
75
|
+
|
76
|
+
# If no exception controller class has been set,
|
77
|
+
# guess whether this is an exception controller from the headers.
|
78
|
+
if exception_controller_class.nil?
|
79
|
+
!headers[:request_exception].nil?
|
80
|
+
# If an exception controller class has been specified,
|
81
|
+
# check if the controller is a kind of the exception controller class.
|
82
|
+
elsif exception_controller_class.is_a?(Class) || exception_controller_class.is_a?(Module)
|
83
|
+
controller <= exception_controller_class
|
84
|
+
# Otherwise if the exception controller class is some other value (like false)
|
85
|
+
# assume that this controller doesn't handle exceptions.
|
86
|
+
else
|
87
|
+
false
|
88
|
+
end
|
89
|
+
end
|
67
90
|
end
|
68
91
|
end
|
69
92
|
end
|
@@ -150,8 +150,13 @@ module Datadog
|
|
150
150
|
# signals; it propagates the request span so that it can be finished
|
151
151
|
# no matter what
|
152
152
|
payload = {
|
153
|
-
controller: self.class
|
153
|
+
controller: self.class,
|
154
154
|
action: action_name,
|
155
|
+
headers: {
|
156
|
+
# The exception this controller was given in the request,
|
157
|
+
# which is typical if the controller is configured to handle exceptions.
|
158
|
+
request_exception: request.headers['action_dispatch.exception']
|
159
|
+
},
|
155
160
|
tracing_context: {}
|
156
161
|
}
|
157
162
|
|
@@ -7,7 +7,6 @@ module Datadog
|
|
7
7
|
DRIVER = 'redis.driver'.freeze
|
8
8
|
|
9
9
|
# Patcher enables patching of 'redis' module.
|
10
|
-
# This is used in monkey.rb to automatically apply patches
|
11
10
|
module Patcher
|
12
11
|
include Base
|
13
12
|
register_as :redis, auto_patch: true
|
@@ -23,7 +22,6 @@ module Datadog
|
|
23
22
|
if !@patched && compatible?
|
24
23
|
begin
|
25
24
|
# do not require these by default, but only when actually patching
|
26
|
-
require 'ddtrace/monkey'
|
27
25
|
require 'ddtrace/ext/app_types'
|
28
26
|
require 'ddtrace/contrib/redis/tags'
|
29
27
|
require 'ddtrace/contrib/redis/quantize'
|
@@ -47,7 +45,7 @@ module Datadog
|
|
47
45
|
def patch_redis_client
|
48
46
|
::Redis::Client.class_eval do
|
49
47
|
alias_method :initialize_without_datadog, :initialize
|
50
|
-
Datadog::
|
48
|
+
Datadog::Patcher.without_warnings do
|
51
49
|
remove_method :initialize
|
52
50
|
end
|
53
51
|
|
@@ -4,6 +4,7 @@ require 'sinatra/base'
|
|
4
4
|
require 'ddtrace/ext/app_types'
|
5
5
|
require 'ddtrace/ext/errors'
|
6
6
|
require 'ddtrace/ext/http'
|
7
|
+
require 'ddtrace/propagation/http_propagator'
|
7
8
|
|
8
9
|
sinatra_vs = Gem::Version.new(Sinatra::VERSION)
|
9
10
|
sinatra_min_vs = Gem::Version.new('1.4.0')
|
@@ -29,8 +30,8 @@ module Datadog
|
|
29
30
|
end
|
30
31
|
|
31
32
|
option :tracer, default: Datadog.tracer
|
32
|
-
|
33
33
|
option :resource_script_names, default: false
|
34
|
+
option :distributed_tracing, default: false
|
34
35
|
|
35
36
|
def route(verb, action, *)
|
36
37
|
# Keep track of the route name when the app is instantiated for an
|
@@ -82,6 +83,12 @@ module Datadog
|
|
82
83
|
end
|
83
84
|
|
84
85
|
tracer = Datadog.configuration[:sinatra][:tracer]
|
86
|
+
distributed_tracing = Datadog.configuration[:sinatra][:distributed_tracing]
|
87
|
+
|
88
|
+
if distributed_tracing && tracer.provider.context.trace_id.nil?
|
89
|
+
context = HTTPPropagator.extract(request.env)
|
90
|
+
tracer.provider.context = context if context.trace_id
|
91
|
+
end
|
85
92
|
|
86
93
|
span = tracer.trace('sinatra.request',
|
87
94
|
service: Datadog.configuration[:sinatra][:service_name],
|
data/lib/ddtrace/ext/http.rb
CHANGED
@@ -0,0 +1,18 @@
|
|
1
|
+
module Datadog
|
2
|
+
# Defines some useful patching methods for integrations
|
3
|
+
module Patcher
|
4
|
+
module_function
|
5
|
+
|
6
|
+
def without_warnings
|
7
|
+
# This is typically used when monkey patching functions such as
|
8
|
+
# intialize, which Ruby advices you not to. Use cautiously.
|
9
|
+
v = $VERBOSE
|
10
|
+
$VERBOSE = nil
|
11
|
+
begin
|
12
|
+
yield
|
13
|
+
ensure
|
14
|
+
$VERBOSE = v
|
15
|
+
end
|
16
|
+
end
|
17
|
+
end
|
18
|
+
end
|
data/lib/ddtrace/version.rb
CHANGED
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.
|
4
|
+
version: 0.11.1
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Datadog, Inc.
|
8
8
|
autorequire:
|
9
9
|
bindir: exe
|
10
10
|
cert_chain: []
|
11
|
-
date: 2018-01-
|
11
|
+
date: 2018-01-29 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: msgpack
|
@@ -310,7 +310,7 @@ files:
|
|
310
310
|
- lib/ddtrace/ext/redis.rb
|
311
311
|
- lib/ddtrace/ext/sql.rb
|
312
312
|
- lib/ddtrace/logger.rb
|
313
|
-
- lib/ddtrace/
|
313
|
+
- lib/ddtrace/patcher.rb
|
314
314
|
- lib/ddtrace/pin.rb
|
315
315
|
- lib/ddtrace/pipeline.rb
|
316
316
|
- lib/ddtrace/pipeline/span_filter.rb
|
data/lib/ddtrace/monkey.rb
DELETED
@@ -1,88 +0,0 @@
|
|
1
|
-
require 'thread'
|
2
|
-
|
3
|
-
# We import all patchers for every module we support, but this is fine
|
4
|
-
# because patchers do not include any 3rd party module nor even our
|
5
|
-
# patching code, which is required on demand, when patching.
|
6
|
-
require 'ddtrace/contrib/base'
|
7
|
-
require 'ddtrace/contrib/rack/patcher'
|
8
|
-
require 'ddtrace/contrib/rails/patcher'
|
9
|
-
require 'ddtrace/contrib/active_record/patcher'
|
10
|
-
require 'ddtrace/contrib/elasticsearch/patcher'
|
11
|
-
require 'ddtrace/contrib/faraday/patcher'
|
12
|
-
require 'ddtrace/contrib/grape/patcher'
|
13
|
-
require 'ddtrace/contrib/redis/patcher'
|
14
|
-
require 'ddtrace/contrib/http/patcher'
|
15
|
-
require 'ddtrace/contrib/aws/patcher'
|
16
|
-
require 'ddtrace/contrib/sucker_punch/patcher'
|
17
|
-
require 'ddtrace/contrib/mongodb/patcher'
|
18
|
-
require 'ddtrace/contrib/dalli/patcher'
|
19
|
-
require 'ddtrace/contrib/resque/patcher'
|
20
|
-
require 'ddtrace/contrib/racecar/patcher'
|
21
|
-
require 'ddtrace/contrib/sidekiq/patcher'
|
22
|
-
|
23
|
-
module Datadog
|
24
|
-
# Monkey is used for monkey-patching 3rd party libs.
|
25
|
-
module Monkey
|
26
|
-
# Patchers should expose 2 methods:
|
27
|
-
# - patch, which applies our patch if needed. Should be idempotent,
|
28
|
-
# can be call twice but should just do nothing the second time.
|
29
|
-
# - patched?, which returns true if the module has been succesfully
|
30
|
-
# patched (patching might have failed if requirements were not here)
|
31
|
-
|
32
|
-
@mutex = Mutex.new
|
33
|
-
@registry = Datadog.registry
|
34
|
-
|
35
|
-
module_function
|
36
|
-
|
37
|
-
attr_accessor :registry
|
38
|
-
|
39
|
-
def autopatch_modules
|
40
|
-
registry.to_h
|
41
|
-
end
|
42
|
-
|
43
|
-
def patch_all
|
44
|
-
patch(autopatch_modules)
|
45
|
-
end
|
46
|
-
|
47
|
-
def patch_module(m)
|
48
|
-
@mutex.synchronize do
|
49
|
-
patcher = registry[m]
|
50
|
-
raise "Unsupported module #{m}" unless patcher
|
51
|
-
patcher.patch if patcher.respond_to?(:patch)
|
52
|
-
end
|
53
|
-
end
|
54
|
-
|
55
|
-
def patch(modules)
|
56
|
-
modules.each do |k, v|
|
57
|
-
patch_module(k) if v
|
58
|
-
end
|
59
|
-
end
|
60
|
-
|
61
|
-
def get_patched_modules
|
62
|
-
@mutex.synchronize do
|
63
|
-
registry.each_with_object({}) do |entry, patched|
|
64
|
-
next unless entry.klass.respond_to?(:patched?)
|
65
|
-
patched[entry.name] = entry.klass.patched?
|
66
|
-
end
|
67
|
-
end
|
68
|
-
end
|
69
|
-
|
70
|
-
def without_warnings
|
71
|
-
# This is typically used when monkey patching functions such as
|
72
|
-
# intialize, which Ruby advices you not to. Use cautiously.
|
73
|
-
v = $VERBOSE
|
74
|
-
$VERBOSE = nil
|
75
|
-
begin
|
76
|
-
yield
|
77
|
-
ensure
|
78
|
-
$VERBOSE = v
|
79
|
-
end
|
80
|
-
end
|
81
|
-
|
82
|
-
class << self
|
83
|
-
attr_accessor :registry
|
84
|
-
end
|
85
|
-
end
|
86
|
-
end
|
87
|
-
|
88
|
-
Datadog::Monkey.patch_module(:rails)
|