ddtrace 0.6.1 → 0.6.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +13 -5
- data/.rubocop.yml +4 -0
- data/Appraisals +2 -0
- data/docs/GettingStarted.md +2 -2
- data/gemfiles/contrib.gemfile +2 -0
- data/lib/ddtrace/contrib/active_record/patcher.rb +88 -0
- data/lib/ddtrace/contrib/rails/framework.rb +7 -1
- data/lib/ddtrace/contrib/sinatra/tracer.rb +1 -1
- data/lib/ddtrace/monkey.rb +4 -2
- data/lib/ddtrace/tracer.rb +18 -0
- data/lib/ddtrace/version.rb +1 -1
- metadata +26 -35
checksums.yaml
CHANGED
@@ -1,7 +1,15 @@
|
|
1
1
|
---
|
2
|
-
|
3
|
-
metadata.gz:
|
4
|
-
|
2
|
+
!binary "U0hBMQ==":
|
3
|
+
metadata.gz: !binary |-
|
4
|
+
MmJhODJmN2VmNjMxNzY5OTg5NGE1NjEwOTgwZTE0MGU5ZTE1ZjJlYQ==
|
5
|
+
data.tar.gz: !binary |-
|
6
|
+
ZTg5OWNhMjdjMDlhNDVlNDMwN2MzODYzNDgyMGM5MTc1MmMwNzFhZg==
|
5
7
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
|
8
|
+
metadata.gz: !binary |-
|
9
|
+
ZThkYmY4ZDQ2MjJiNGJkNTg5YTFjYTJhNmRmMWM1NTFiZGFjZGYzOGJhOTM1
|
10
|
+
ZWU3ODc1MDExNDliNTgzMGM3YzZiOTE4ZTE0YTlkNWJmNjkzMzJlOGRhNzQz
|
11
|
+
MzE2MTRhMDNkNzA3NmNmMmJmZWIzYmEwN2U3NzU1NmVhNjMzYWQ=
|
12
|
+
data.tar.gz: !binary |-
|
13
|
+
MWM3N2I4N2IxNDU5NDZhZTU2YWZmNGU2YmMyYjU2ZmZkNTk4YzgxMGVmZGIz
|
14
|
+
YzM0ZDczYWVhZGMyMjhlNzQ1ZTJjMTBiNjRiNjc4YmIwMTE4ODgyYzE1MDEy
|
15
|
+
NTFhYzFhZGFlNzdmN2M5Y2VhNWQ1ZmJjZDRiNDFjM2QxOWM2YWE=
|
data/.rubocop.yml
CHANGED
data/Appraisals
CHANGED
@@ -96,6 +96,7 @@ if RUBY_VERSION >= '2.2.2'
|
|
96
96
|
gem 'hiredis'
|
97
97
|
gem 'rack-test'
|
98
98
|
gem 'sinatra'
|
99
|
+
gem 'sqlite3'
|
99
100
|
gem 'activerecord'
|
100
101
|
gem 'sidekiq'
|
101
102
|
end
|
@@ -107,6 +108,7 @@ else
|
|
107
108
|
gem 'rack-test', '0.6.2'
|
108
109
|
gem 'rack', '1.4.7'
|
109
110
|
gem 'sinatra', '1.4.5'
|
111
|
+
gem 'sqlite3'
|
110
112
|
gem 'activerecord', '3.2.22.5'
|
111
113
|
gem 'sidekiq', '4.0.0'
|
112
114
|
end
|
data/docs/GettingStarted.md
CHANGED
@@ -65,7 +65,7 @@ of the Datadog tracer, you can override the following defaults:
|
|
65
65
|
debug: false,
|
66
66
|
trace_agent_hostname: 'localhost',
|
67
67
|
trace_agent_port: 8126,
|
68
|
-
env:
|
68
|
+
env: nil,
|
69
69
|
tags: {}
|
70
70
|
}
|
71
71
|
|
@@ -88,7 +88,7 @@ Available settings are:
|
|
88
88
|
* ``debug``: set to true to enable debug logging.
|
89
89
|
* ``trace_agent_hostname``: set the hostname of the trace agent.
|
90
90
|
* ``trace_agent_port``: set the port the trace agent is listening on.
|
91
|
-
* ``env``: set the environment.
|
91
|
+
* ``env``: set the environment. Rails users may set it to ``Rails.env`` to use their application settings.
|
92
92
|
* ``tags``: set global tags that should be applied to all spans. Defaults to an empty hash
|
93
93
|
|
94
94
|
### Sinatra
|
data/gemfiles/contrib.gemfile
CHANGED
@@ -0,0 +1,88 @@
|
|
1
|
+
module Datadog
|
2
|
+
module Contrib
|
3
|
+
module ActiveRecord
|
4
|
+
# Patcher enables patching of 'active_record' module.
|
5
|
+
# This is used in monkey.rb to manually apply patches
|
6
|
+
module Patcher
|
7
|
+
@patched = false
|
8
|
+
|
9
|
+
module_function
|
10
|
+
|
11
|
+
# patched? tells whether patch has been successfully applied
|
12
|
+
def patched?
|
13
|
+
@patched
|
14
|
+
end
|
15
|
+
|
16
|
+
def patch
|
17
|
+
if !@patched && defined?(::ActiveRecord)
|
18
|
+
begin
|
19
|
+
require 'ddtrace/contrib/rails/utils'
|
20
|
+
require 'ddtrace/ext/sql'
|
21
|
+
|
22
|
+
patch_active_record()
|
23
|
+
|
24
|
+
@patched = true
|
25
|
+
rescue => e
|
26
|
+
Datadog::Tracer.log.error("Unable to apply Active Record integration: #{e}")
|
27
|
+
end
|
28
|
+
end
|
29
|
+
|
30
|
+
@patched
|
31
|
+
end
|
32
|
+
|
33
|
+
def patch_active_record
|
34
|
+
# subscribe when the active record query has been processed
|
35
|
+
::ActiveSupport::Notifications.subscribe('sql.active_record') do |*args|
|
36
|
+
sql(*args)
|
37
|
+
end
|
38
|
+
end
|
39
|
+
|
40
|
+
def self.datadog_trace
|
41
|
+
# TODO: Consider using patcher for Rails as well.
|
42
|
+
# @tracer ||= defined?(::Rails) && ::Rails.configuration.datadog_trace
|
43
|
+
@datadog_trace ||= defined?(::Sinatra) && ::Sinatra::Application.settings.datadog_tracer.cfg
|
44
|
+
end
|
45
|
+
|
46
|
+
def self.adapter_name
|
47
|
+
@adapter_name ||= Datadog::Contrib::Rails::Utils.normalize_vendor(
|
48
|
+
::ActiveRecord::Base.connection_config[:adapter]
|
49
|
+
)
|
50
|
+
end
|
51
|
+
|
52
|
+
def self.tracer
|
53
|
+
@tracer ||= datadog_trace.fetch(:tracer)
|
54
|
+
end
|
55
|
+
|
56
|
+
def self.database_service
|
57
|
+
@database_service ||= datadog_trace.fetch(:default_database_service, adapter_name())
|
58
|
+
if @database_service
|
59
|
+
tracer().set_service_info(@database_service, 'sinatra',
|
60
|
+
Datadog::Ext::AppTypes::DB)
|
61
|
+
end
|
62
|
+
@database_service
|
63
|
+
end
|
64
|
+
|
65
|
+
def self.sql(_name, start, finish, _id, payload)
|
66
|
+
span_type = Datadog::Ext::SQL::TYPE
|
67
|
+
|
68
|
+
span = tracer.trace(
|
69
|
+
"#{adapter_name}.query",
|
70
|
+
resource: payload.fetch(:sql),
|
71
|
+
service: database_service,
|
72
|
+
span_type: span_type
|
73
|
+
)
|
74
|
+
|
75
|
+
# the span should have the query ONLY in the Resource attribute,
|
76
|
+
# so that the ``sql.query`` tag will be set in the agent with an
|
77
|
+
# obfuscated version
|
78
|
+
span.span_type = Datadog::Ext::SQL::TYPE
|
79
|
+
span.set_tag('active_record.db.vendor', adapter_name)
|
80
|
+
span.start_time = start
|
81
|
+
span.finish_at(finish)
|
82
|
+
rescue StandardError => e
|
83
|
+
Datadog::Tracer.log.error(e.message)
|
84
|
+
end
|
85
|
+
end
|
86
|
+
end
|
87
|
+
end
|
88
|
+
end
|
@@ -27,11 +27,12 @@ module Datadog
|
|
27
27
|
debug: false,
|
28
28
|
trace_agent_hostname: Datadog::Writer::HOSTNAME,
|
29
29
|
trace_agent_port: Datadog::Writer::PORT,
|
30
|
-
env:
|
30
|
+
env: nil,
|
31
31
|
tags: {}
|
32
32
|
}.freeze
|
33
33
|
|
34
34
|
# configure Datadog settings
|
35
|
+
# rubocop:disable Metrics/MethodLength
|
35
36
|
def self.configure(config)
|
36
37
|
# tracer defaults
|
37
38
|
# merge default configurations with users settings
|
@@ -50,6 +51,7 @@ module Datadog
|
|
50
51
|
|
51
52
|
# set default tracer tags
|
52
53
|
datadog_config[:tracer].set_tags(datadog_config[:tags])
|
54
|
+
|
53
55
|
datadog_config[:tracer].set_tags('env' => datadog_config[:env]) if datadog_config[:env]
|
54
56
|
|
55
57
|
# set default service details
|
@@ -65,6 +67,10 @@ module Datadog
|
|
65
67
|
Datadog::Ext::AppTypes::CACHE
|
66
68
|
)
|
67
69
|
|
70
|
+
# By default, default service would be guessed from the script
|
71
|
+
# being executed, but here we know better, get it from Rails config.
|
72
|
+
datadog_config[:tracer].default_service = datadog_config[:default_service]
|
73
|
+
|
68
74
|
if defined?(::ActiveRecord)
|
69
75
|
begin
|
70
76
|
# set default database service details and store it in the configuration
|
data/lib/ddtrace/monkey.rb
CHANGED
@@ -3,6 +3,7 @@ require 'thread'
|
|
3
3
|
# We import all patchers for every module we support, but this is fine
|
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
|
+
require 'ddtrace/contrib/active_record/patcher'
|
6
7
|
require 'ddtrace/contrib/elasticsearch/patcher'
|
7
8
|
require 'ddtrace/contrib/http/patcher'
|
8
9
|
require 'ddtrace/contrib/redis/patcher'
|
@@ -11,7 +12,7 @@ module Datadog
|
|
11
12
|
# Monkey is used for monkey-patching 3rd party libs.
|
12
13
|
module Monkey
|
13
14
|
@patched = []
|
14
|
-
@autopatch_modules = { elasticsearch: true, http: true, redis: true }
|
15
|
+
@autopatch_modules = { elasticsearch: true, http: true, redis: true, active_record: false }
|
15
16
|
# Patchers should expose 2 methods:
|
16
17
|
# - patch, which applies our patch if needed. Should be idempotent,
|
17
18
|
# can be call twice but should just do nothing the second time.
|
@@ -19,7 +20,8 @@ module Datadog
|
|
19
20
|
# patched (patching might have failed if requirements were not here)
|
20
21
|
@patchers = { elasticsearch: Datadog::Contrib::Elasticsearch::Patcher,
|
21
22
|
http: Datadog::Contrib::HTTP::Patcher,
|
22
|
-
redis: Datadog::Contrib::Redis::Patcher
|
23
|
+
redis: Datadog::Contrib::Redis::Patcher,
|
24
|
+
active_record: Datadog::Contrib::ActiveRecord::Patcher }
|
23
25
|
@mutex = Mutex.new
|
24
26
|
|
25
27
|
module_function
|
data/lib/ddtrace/tracer.rb
CHANGED
@@ -1,6 +1,7 @@
|
|
1
1
|
require 'pp'
|
2
2
|
require 'thread'
|
3
3
|
require 'logger'
|
4
|
+
require 'pathname'
|
4
5
|
|
5
6
|
require 'ddtrace/span'
|
6
7
|
require 'ddtrace/buffer'
|
@@ -17,6 +18,7 @@ module Datadog
|
|
17
18
|
class Tracer
|
18
19
|
attr_reader :writer, :sampler, :services, :tags
|
19
20
|
attr_accessor :enabled
|
21
|
+
attr_writer :default_service
|
20
22
|
|
21
23
|
# Global, memoized, lazy initialized instance of a logger that is used within the the Datadog
|
22
24
|
# namespace. This logger outputs to +STDOUT+ by default, and is considered thread-safe.
|
@@ -107,6 +109,20 @@ module Datadog
|
|
107
109
|
Datadog::Tracer.log.debug("set_service_info: service: #{service} app: #{app} type: #{app_type}")
|
108
110
|
end
|
109
111
|
|
112
|
+
# A default value for service. One should really override this one
|
113
|
+
# for non-root spans which have a parent. However, root spans without
|
114
|
+
# a service would be invalid and rejected.
|
115
|
+
def default_service
|
116
|
+
return @default_service if @default_service
|
117
|
+
begin
|
118
|
+
@default_service = File.basename($PROGRAM_NAME, '.*')
|
119
|
+
rescue => e
|
120
|
+
Datadog::Tracer.log.error("unable to guess default service: #{e}")
|
121
|
+
@default_service = 'ruby'.freeze
|
122
|
+
end
|
123
|
+
@default_service
|
124
|
+
end
|
125
|
+
|
110
126
|
# Set the given key / value tag pair at the tracer level. These tags will be
|
111
127
|
# appended to each span created by the tracer. Keys and values must be strings.
|
112
128
|
# A valid example is:
|
@@ -181,6 +197,8 @@ module Datadog
|
|
181
197
|
# Record the given finished span in the +spans+ list. When a +span+ is recorded, it will be sent
|
182
198
|
# to the Datadog trace agent as soon as the trace is finished.
|
183
199
|
def record(span)
|
200
|
+
span.service ||= default_service
|
201
|
+
|
184
202
|
spans = []
|
185
203
|
@mutex.synchronize do
|
186
204
|
@spans << span
|
data/lib/ddtrace/version.rb
CHANGED
metadata
CHANGED
@@ -1,113 +1,103 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: ddtrace
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.6.
|
4
|
+
version: 0.6.2
|
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-04-
|
11
|
+
date: 2017-04-07 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: msgpack
|
15
15
|
requirement: !ruby/object:Gem::Requirement
|
16
16
|
requirements:
|
17
|
-
- -
|
17
|
+
- - ! '>='
|
18
18
|
- !ruby/object:Gem::Version
|
19
19
|
version: '0'
|
20
20
|
type: :runtime
|
21
21
|
prerelease: false
|
22
22
|
version_requirements: !ruby/object:Gem::Requirement
|
23
23
|
requirements:
|
24
|
-
- -
|
24
|
+
- - ! '>='
|
25
25
|
- !ruby/object:Gem::Version
|
26
26
|
version: '0'
|
27
27
|
- !ruby/object:Gem::Dependency
|
28
28
|
name: rake
|
29
29
|
requirement: !ruby/object:Gem::Requirement
|
30
30
|
requirements:
|
31
|
-
- -
|
31
|
+
- - ~>
|
32
32
|
- !ruby/object:Gem::Version
|
33
33
|
version: '10.5'
|
34
34
|
type: :development
|
35
35
|
prerelease: false
|
36
36
|
version_requirements: !ruby/object:Gem::Requirement
|
37
37
|
requirements:
|
38
|
-
- -
|
38
|
+
- - ~>
|
39
39
|
- !ruby/object:Gem::Version
|
40
40
|
version: '10.5'
|
41
|
-
- !ruby/object:Gem::Dependency
|
42
|
-
name: rubocop
|
43
|
-
requirement: !ruby/object:Gem::Requirement
|
44
|
-
requirements:
|
45
|
-
- - "~>"
|
46
|
-
- !ruby/object:Gem::Version
|
47
|
-
version: '0.47'
|
48
|
-
type: :development
|
49
|
-
prerelease: false
|
50
|
-
version_requirements: !ruby/object:Gem::Requirement
|
51
|
-
requirements:
|
52
|
-
- - "~>"
|
53
|
-
- !ruby/object:Gem::Version
|
54
|
-
version: '0.47'
|
55
41
|
- !ruby/object:Gem::Dependency
|
56
42
|
name: minitest
|
57
43
|
requirement: !ruby/object:Gem::Requirement
|
58
44
|
requirements:
|
59
|
-
- -
|
45
|
+
- - ~>
|
60
46
|
- !ruby/object:Gem::Version
|
61
47
|
version: '5.10'
|
62
48
|
type: :development
|
63
49
|
prerelease: false
|
64
50
|
version_requirements: !ruby/object:Gem::Requirement
|
65
51
|
requirements:
|
66
|
-
- -
|
52
|
+
- - ~>
|
67
53
|
- !ruby/object:Gem::Version
|
68
54
|
version: '5.10'
|
69
55
|
- !ruby/object:Gem::Dependency
|
70
56
|
name: appraisal
|
71
57
|
requirement: !ruby/object:Gem::Requirement
|
72
58
|
requirements:
|
73
|
-
- -
|
59
|
+
- - ~>
|
74
60
|
- !ruby/object:Gem::Version
|
75
61
|
version: '2.1'
|
76
62
|
type: :development
|
77
63
|
prerelease: false
|
78
64
|
version_requirements: !ruby/object:Gem::Requirement
|
79
65
|
requirements:
|
80
|
-
- -
|
66
|
+
- - ~>
|
81
67
|
- !ruby/object:Gem::Version
|
82
68
|
version: '2.1'
|
83
69
|
- !ruby/object:Gem::Dependency
|
84
70
|
name: yard
|
85
71
|
requirement: !ruby/object:Gem::Requirement
|
86
72
|
requirements:
|
87
|
-
- -
|
73
|
+
- - ~>
|
88
74
|
- !ruby/object:Gem::Version
|
89
75
|
version: '0.9'
|
90
76
|
type: :development
|
91
77
|
prerelease: false
|
92
78
|
version_requirements: !ruby/object:Gem::Requirement
|
93
79
|
requirements:
|
94
|
-
- -
|
80
|
+
- - ~>
|
95
81
|
- !ruby/object:Gem::Version
|
96
82
|
version: '0.9'
|
97
|
-
description:
|
98
|
-
|
83
|
+
description: ! 'ddtrace is Datadog’s tracing client for Ruby. It is used to trace
|
84
|
+
requests
|
85
|
+
|
99
86
|
as they flow across web servers, databases and microservices so that developers
|
87
|
+
|
100
88
|
have great visiblity into bottlenecks and troublesome requests.
|
89
|
+
|
90
|
+
'
|
101
91
|
email:
|
102
92
|
- dev@datadoghq.com
|
103
93
|
executables: []
|
104
94
|
extensions: []
|
105
95
|
extra_rdoc_files: []
|
106
96
|
files:
|
107
|
-
-
|
108
|
-
-
|
109
|
-
-
|
110
|
-
-
|
97
|
+
- .env
|
98
|
+
- .gitignore
|
99
|
+
- .rubocop.yml
|
100
|
+
- .yardopts
|
111
101
|
- Appraisals
|
112
102
|
- Gemfile
|
113
103
|
- LICENSE
|
@@ -133,6 +123,7 @@ files:
|
|
133
123
|
- gemfiles/rails5_postgres_sidekiq.gemfile
|
134
124
|
- lib/ddtrace.rb
|
135
125
|
- lib/ddtrace/buffer.rb
|
126
|
+
- lib/ddtrace/contrib/active_record/patcher.rb
|
136
127
|
- lib/ddtrace/contrib/elasticsearch/patcher.rb
|
137
128
|
- lib/ddtrace/contrib/elasticsearch/quantize.rb
|
138
129
|
- lib/ddtrace/contrib/http/patcher.rb
|
@@ -178,17 +169,17 @@ require_paths:
|
|
178
169
|
- lib
|
179
170
|
required_ruby_version: !ruby/object:Gem::Requirement
|
180
171
|
requirements:
|
181
|
-
- -
|
172
|
+
- - ! '>='
|
182
173
|
- !ruby/object:Gem::Version
|
183
174
|
version: 1.9.1
|
184
175
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
185
176
|
requirements:
|
186
|
-
- -
|
177
|
+
- - ! '>='
|
187
178
|
- !ruby/object:Gem::Version
|
188
179
|
version: '0'
|
189
180
|
requirements: []
|
190
181
|
rubyforge_project:
|
191
|
-
rubygems_version: 2.6.
|
182
|
+
rubygems_version: 2.6.10
|
192
183
|
signing_key:
|
193
184
|
specification_version: 4
|
194
185
|
summary: Datadog tracing code for your Ruby applications
|