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 CHANGED
@@ -1,7 +1,15 @@
1
1
  ---
2
- SHA1:
3
- metadata.gz: c2f79e19f4edb6aa8db41960e7ba86d8b17444e5
4
- data.tar.gz: 062ddeaa46fe115d62ce88d08a3f9bc37ea9fb5f
2
+ !binary "U0hBMQ==":
3
+ metadata.gz: !binary |-
4
+ MmJhODJmN2VmNjMxNzY5OTg5NGE1NjEwOTgwZTE0MGU5ZTE1ZjJlYQ==
5
+ data.tar.gz: !binary |-
6
+ ZTg5OWNhMjdjMDlhNDVlNDMwN2MzODYzNDgyMGM5MTc1MmMwNzFhZg==
5
7
  SHA512:
6
- metadata.gz: 4bdfa1c9538ce4aac79a3b301474ca1f54d17dbf1c3853c42951c96c758bfc1a9870d4279d589e76894d95138dbcf5e908b1bd871e885d9a77fb7a00a42e8ec6
7
- data.tar.gz: 60414076362dc4b4f53928d92b8196b8213f816a9088672011e7c6c4517770d1f01ceb8e52c16cf74ddd1d5c7dd4f38564bc904e435f257b8973def7721811f1
8
+ metadata.gz: !binary |-
9
+ ZThkYmY4ZDQ2MjJiNGJkNTg5YTFjYTJhNmRmMWM1NTFiZGFjZGYzOGJhOTM1
10
+ ZWU3ODc1MDExNDliNTgzMGM3YzZiOTE4ZTE0YTlkNWJmNjkzMzJlOGRhNzQz
11
+ MzE2MTRhMDNkNzA3NmNmMmJmZWIzYmEwN2U3NzU1NmVhNjMzYWQ=
12
+ data.tar.gz: !binary |-
13
+ MWM3N2I4N2IxNDU5NDZhZTU2YWZmNGU2YmMyYjU2ZmZkNTk4YzgxMGVmZGIz
14
+ YzM0ZDczYWVhZGMyMjhlNzQ1ZTJjMTBiNjRiNjc4YmIwMTE4ODgyYzE1MDEy
15
+ NTFhYzFhZGFlNzdmN2M5Y2VhNWQ1ZmJjZDRiNDFjM2QxOWM2YWE=
@@ -55,3 +55,7 @@ Lint/UnusedMethodArgument:
55
55
  Style/SymbolArray:
56
56
  Enabled: false
57
57
 
58
+ # Simple conditionals are perfectly fine, and more readable for multiline
59
+ # expressions.
60
+ Style/GuardClause:
61
+ Enabled: false
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
@@ -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: Rails.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. Defaults to the Rails 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
@@ -7,7 +7,9 @@ gem "redis"
7
7
  gem "hiredis"
8
8
  gem "rack-test"
9
9
  gem "sinatra"
10
+ gem 'sqlite3'
10
11
  gem "activerecord"
11
12
  gem "sidekiq"
13
+ gem "activerecord"
12
14
 
13
15
  gemspec :path => "../"
@@ -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: ::Rails.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
@@ -67,7 +67,7 @@ module Datadog
67
67
  end
68
68
 
69
69
  def enabled?
70
- @cfg[:enabled] && @cfg[:tracer]
70
+ @cfg[:enabled] && !@cfg[:tracer].nil?
71
71
  end
72
72
  end
73
73
 
@@ -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
@@ -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
@@ -2,7 +2,7 @@ module Datadog
2
2
  module VERSION
3
3
  MAJOR = 0
4
4
  MINOR = 6
5
- PATCH = 1
5
+ PATCH = 2
6
6
 
7
7
  STRING = [MAJOR, MINOR, PATCH].compact.join('.')
8
8
  end
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.1
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-05 00:00:00.000000000 Z
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
- ddtrace is Datadog’s tracing client for Ruby. It is used to trace requests
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
- - ".env"
108
- - ".gitignore"
109
- - ".rubocop.yml"
110
- - ".yardopts"
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.11
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