ddtrace 0.6.1 → 0.6.2

Sign up to get free protection for your applications and to get access to all the features.
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