ddtrace 0.35.2 → 0.40.0

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.
Files changed (177) hide show
  1. checksums.yaml +4 -4
  2. data/.circleci/config.yml +59 -1
  3. data/.gitignore +2 -0
  4. data/.gitlab-ci.yml +27 -0
  5. data/.rubocop.yml +4 -0
  6. data/.simplecov +38 -0
  7. data/Appraisals +139 -12
  8. data/CHANGELOG.md +185 -1
  9. data/Rakefile +524 -464
  10. data/ddtrace.gemspec +6 -0
  11. data/docker-compose.yml +37 -2
  12. data/docs/DevelopmentGuide.md +16 -0
  13. data/docs/GettingStarted.md +192 -111
  14. data/lib/ddtrace.rb +4 -0
  15. data/lib/ddtrace/configuration.rb +36 -5
  16. data/lib/ddtrace/configuration/components.rb +4 -7
  17. data/lib/ddtrace/configuration/pin_setup.rb +3 -2
  18. data/lib/ddtrace/configuration/settings.rb +27 -3
  19. data/lib/ddtrace/contrib/action_cable/configuration/settings.rb +7 -2
  20. data/lib/ddtrace/contrib/action_cable/ext.rb +5 -2
  21. data/lib/ddtrace/contrib/action_pack/configuration/settings.rb +7 -2
  22. data/lib/ddtrace/contrib/action_pack/ext.rb +5 -2
  23. data/lib/ddtrace/contrib/action_view/configuration/settings.rb +7 -2
  24. data/lib/ddtrace/contrib/action_view/ext.rb +5 -2
  25. data/lib/ddtrace/contrib/active_model_serializers/configuration/settings.rb +7 -2
  26. data/lib/ddtrace/contrib/active_model_serializers/ext.rb +5 -2
  27. data/lib/ddtrace/contrib/active_record/configuration/settings.rb +7 -2
  28. data/lib/ddtrace/contrib/active_record/ext.rb +5 -2
  29. data/lib/ddtrace/contrib/active_support/cache/redis.rb +1 -1
  30. data/lib/ddtrace/contrib/active_support/configuration/settings.rb +7 -2
  31. data/lib/ddtrace/contrib/active_support/ext.rb +5 -2
  32. data/lib/ddtrace/contrib/active_support/notifications/event.rb +3 -1
  33. data/lib/ddtrace/contrib/active_support/notifications/subscription.rb +1 -1
  34. data/lib/ddtrace/contrib/aws/configuration/settings.rb +7 -2
  35. data/lib/ddtrace/contrib/aws/ext.rb +5 -2
  36. data/lib/ddtrace/contrib/concurrent_ruby/configuration/settings.rb +5 -0
  37. data/lib/ddtrace/contrib/concurrent_ruby/context_composite_executor_service.rb +9 -3
  38. data/lib/ddtrace/contrib/concurrent_ruby/ext.rb +1 -0
  39. data/lib/ddtrace/contrib/configuration/settings.rb +19 -0
  40. data/lib/ddtrace/contrib/dalli/configuration/settings.rb +7 -2
  41. data/lib/ddtrace/contrib/dalli/ext.rb +5 -2
  42. data/lib/ddtrace/contrib/dalli/patcher.rb +1 -5
  43. data/lib/ddtrace/contrib/delayed_job/configuration/settings.rb +7 -2
  44. data/lib/ddtrace/contrib/delayed_job/ext.rb +5 -2
  45. data/lib/ddtrace/contrib/elasticsearch/configuration/settings.rb +7 -2
  46. data/lib/ddtrace/contrib/elasticsearch/ext.rb +5 -2
  47. data/lib/ddtrace/contrib/elasticsearch/patcher.rb +1 -2
  48. data/lib/ddtrace/contrib/ethon/configuration/settings.rb +7 -2
  49. data/lib/ddtrace/contrib/ethon/ext.rb +5 -2
  50. data/lib/ddtrace/contrib/excon/configuration/settings.rb +7 -2
  51. data/lib/ddtrace/contrib/excon/ext.rb +5 -2
  52. data/lib/ddtrace/contrib/extensions.rb +39 -5
  53. data/lib/ddtrace/contrib/faraday/configuration/settings.rb +7 -2
  54. data/lib/ddtrace/contrib/faraday/ext.rb +5 -2
  55. data/lib/ddtrace/contrib/faraday/middleware.rb +5 -3
  56. data/lib/ddtrace/contrib/faraday/patcher.rb +13 -5
  57. data/lib/ddtrace/contrib/grape/configuration/settings.rb +7 -3
  58. data/lib/ddtrace/contrib/grape/ext.rb +5 -2
  59. data/lib/ddtrace/contrib/grape/patcher.rb +1 -1
  60. data/lib/ddtrace/contrib/graphql/configuration/settings.rb +7 -2
  61. data/lib/ddtrace/contrib/graphql/ext.rb +5 -2
  62. data/lib/ddtrace/contrib/graphql/patcher.rb +6 -3
  63. data/lib/ddtrace/contrib/grpc/configuration/settings.rb +7 -2
  64. data/lib/ddtrace/contrib/grpc/datadog_interceptor.rb +1 -1
  65. data/lib/ddtrace/contrib/grpc/datadog_interceptor/client.rb +1 -3
  66. data/lib/ddtrace/contrib/grpc/ext.rb +5 -2
  67. data/lib/ddtrace/contrib/grpc/patcher.rb +1 -5
  68. data/lib/ddtrace/contrib/http/configuration/settings.rb +7 -2
  69. data/lib/ddtrace/contrib/http/ext.rb +5 -2
  70. data/lib/ddtrace/contrib/http/instrumentation.rb +12 -7
  71. data/lib/ddtrace/contrib/httprb/configuration/settings.rb +32 -0
  72. data/lib/ddtrace/contrib/httprb/ext.rb +17 -0
  73. data/lib/ddtrace/contrib/httprb/instrumentation.rb +160 -0
  74. data/lib/ddtrace/contrib/httprb/integration.rb +43 -0
  75. data/lib/ddtrace/contrib/httprb/patcher.rb +35 -0
  76. data/lib/ddtrace/contrib/kafka/configuration/settings.rb +30 -0
  77. data/lib/ddtrace/contrib/kafka/consumer_event.rb +14 -0
  78. data/lib/ddtrace/contrib/kafka/consumer_group_event.rb +14 -0
  79. data/lib/ddtrace/contrib/kafka/event.rb +51 -0
  80. data/lib/ddtrace/contrib/kafka/events.rb +44 -0
  81. data/lib/ddtrace/contrib/kafka/events/connection/request.rb +34 -0
  82. data/lib/ddtrace/contrib/kafka/events/consumer/process_batch.rb +41 -0
  83. data/lib/ddtrace/contrib/kafka/events/consumer/process_message.rb +39 -0
  84. data/lib/ddtrace/contrib/kafka/events/consumer_group/heartbeat.rb +39 -0
  85. data/lib/ddtrace/contrib/kafka/events/consumer_group/join_group.rb +29 -0
  86. data/lib/ddtrace/contrib/kafka/events/consumer_group/leave_group.rb +29 -0
  87. data/lib/ddtrace/contrib/kafka/events/consumer_group/sync_group.rb +29 -0
  88. data/lib/ddtrace/contrib/kafka/events/produce_operation/send_messages.rb +32 -0
  89. data/lib/ddtrace/contrib/kafka/events/producer/deliver_messages.rb +35 -0
  90. data/lib/ddtrace/contrib/kafka/ext.rb +41 -0
  91. data/lib/ddtrace/contrib/kafka/integration.rb +39 -0
  92. data/lib/ddtrace/contrib/kafka/patcher.rb +26 -0
  93. data/lib/ddtrace/contrib/mongodb/configuration/settings.rb +7 -2
  94. data/lib/ddtrace/contrib/mongodb/ext.rb +5 -2
  95. data/lib/ddtrace/contrib/mongodb/instrumentation.rb +1 -2
  96. data/lib/ddtrace/contrib/mysql2/configuration/settings.rb +7 -2
  97. data/lib/ddtrace/contrib/mysql2/ext.rb +5 -2
  98. data/lib/ddtrace/contrib/mysql2/instrumentation.rb +1 -1
  99. data/lib/ddtrace/contrib/patcher.rb +14 -8
  100. data/lib/ddtrace/contrib/presto/configuration/settings.rb +7 -2
  101. data/lib/ddtrace/contrib/presto/ext.rb +5 -2
  102. data/lib/ddtrace/contrib/que/configuration/settings.rb +42 -0
  103. data/lib/ddtrace/contrib/que/ext.rb +30 -0
  104. data/lib/ddtrace/contrib/que/integration.rb +42 -0
  105. data/lib/ddtrace/contrib/que/patcher.rb +24 -0
  106. data/lib/ddtrace/contrib/que/tracer.rb +56 -0
  107. data/lib/ddtrace/contrib/racecar/configuration/settings.rb +7 -2
  108. data/lib/ddtrace/contrib/racecar/events.rb +2 -0
  109. data/lib/ddtrace/contrib/racecar/events/consume.rb +27 -0
  110. data/lib/ddtrace/contrib/racecar/ext.rb +6 -2
  111. data/lib/ddtrace/contrib/rack/configuration/settings.rb +7 -2
  112. data/lib/ddtrace/contrib/rack/ext.rb +5 -2
  113. data/lib/ddtrace/contrib/rack/middlewares.rb +17 -12
  114. data/lib/ddtrace/contrib/rails/configuration/settings.rb +10 -11
  115. data/lib/ddtrace/contrib/rails/ext.rb +6 -2
  116. data/lib/ddtrace/contrib/rails/framework.rb +52 -46
  117. data/lib/ddtrace/contrib/rails/integration.rb +1 -1
  118. data/lib/ddtrace/contrib/rails/log_injection.rb +81 -0
  119. data/lib/ddtrace/contrib/rails/middlewares.rb +7 -2
  120. data/lib/ddtrace/contrib/rails/patcher.rb +15 -0
  121. data/lib/ddtrace/contrib/rake/configuration/settings.rb +7 -3
  122. data/lib/ddtrace/contrib/rake/ext.rb +5 -2
  123. data/lib/ddtrace/contrib/redis/configuration/settings.rb +7 -2
  124. data/lib/ddtrace/contrib/redis/ext.rb +5 -2
  125. data/lib/ddtrace/contrib/redis/patcher.rb +1 -1
  126. data/lib/ddtrace/contrib/resque/configuration/settings.rb +7 -2
  127. data/lib/ddtrace/contrib/resque/ext.rb +5 -2
  128. data/lib/ddtrace/contrib/rest_client/configuration/settings.rb +7 -2
  129. data/lib/ddtrace/contrib/rest_client/ext.rb +5 -2
  130. data/lib/ddtrace/contrib/rest_client/request_patch.rb +2 -2
  131. data/lib/ddtrace/contrib/sequel/configuration/settings.rb +7 -2
  132. data/lib/ddtrace/contrib/sequel/database.rb +1 -1
  133. data/lib/ddtrace/contrib/sequel/ext.rb +5 -2
  134. data/lib/ddtrace/contrib/sequel/utils.rb +19 -1
  135. data/lib/ddtrace/contrib/shoryuken/configuration/settings.rb +7 -2
  136. data/lib/ddtrace/contrib/shoryuken/ext.rb +5 -2
  137. data/lib/ddtrace/contrib/sidekiq/configuration/settings.rb +7 -2
  138. data/lib/ddtrace/contrib/sidekiq/ext.rb +6 -2
  139. data/lib/ddtrace/contrib/sidekiq/patcher.rb +8 -1
  140. data/lib/ddtrace/contrib/sidekiq/server_tracer.rb +1 -0
  141. data/lib/ddtrace/contrib/sinatra/configuration/settings.rb +7 -2
  142. data/lib/ddtrace/contrib/sinatra/env.rb +5 -4
  143. data/lib/ddtrace/contrib/sinatra/ext.rb +5 -2
  144. data/lib/ddtrace/contrib/sinatra/tracer.rb +21 -42
  145. data/lib/ddtrace/contrib/sinatra/tracer_middleware.rb +50 -23
  146. data/lib/ddtrace/contrib/sneakers/configuration/settings.rb +32 -0
  147. data/lib/ddtrace/contrib/sneakers/ext.rb +22 -0
  148. data/lib/ddtrace/contrib/sneakers/integration.rb +41 -0
  149. data/lib/ddtrace/contrib/sneakers/patcher.rb +24 -0
  150. data/lib/ddtrace/contrib/sneakers/tracer.rb +58 -0
  151. data/lib/ddtrace/contrib/sucker_punch/configuration/settings.rb +7 -2
  152. data/lib/ddtrace/contrib/sucker_punch/ext.rb +5 -2
  153. data/lib/ddtrace/contrib/sucker_punch/patcher.rb +1 -1
  154. data/lib/ddtrace/diagnostics/environment_logger.rb +278 -0
  155. data/lib/ddtrace/environment.rb +17 -3
  156. data/lib/ddtrace/ext/diagnostics.rb +3 -0
  157. data/lib/ddtrace/ext/environment.rb +2 -0
  158. data/lib/ddtrace/ext/transport.rb +1 -0
  159. data/lib/ddtrace/logger.rb +1 -1
  160. data/lib/ddtrace/pin.rb +39 -15
  161. data/lib/ddtrace/pipeline/span_filter.rb +15 -15
  162. data/lib/ddtrace/runtime/metrics.rb +18 -4
  163. data/lib/ddtrace/sampler.rb +2 -0
  164. data/lib/ddtrace/span.rb +10 -0
  165. data/lib/ddtrace/tracer.rb +15 -8
  166. data/lib/ddtrace/transport/http.rb +15 -0
  167. data/lib/ddtrace/transport/http/adapters/net.rb +8 -0
  168. data/lib/ddtrace/transport/http/adapters/test.rb +6 -0
  169. data/lib/ddtrace/transport/http/adapters/unix_socket.rb +4 -0
  170. data/lib/ddtrace/transport/response.rb +11 -0
  171. data/lib/ddtrace/version.rb +2 -2
  172. data/lib/ddtrace/workers/async.rb +2 -2
  173. data/lib/ddtrace/workers/loop.rb +1 -1
  174. data/lib/ddtrace/workers/polling.rb +1 -1
  175. data/lib/ddtrace/workers/trace_writer.rb +3 -0
  176. data/lib/ddtrace/writer.rb +33 -12
  177. metadata +124 -4
@@ -7,13 +7,18 @@ module Datadog
7
7
  module Configuration
8
8
  # Custom settings for the SuckerPunch integration
9
9
  class Settings < Contrib::Configuration::Settings
10
+ option :enabled do |o|
11
+ o.default { env_to_bool(Ext::ENV_ENABLED, true) }
12
+ o.lazy
13
+ end
14
+
10
15
  option :analytics_enabled do |o|
11
- o.default { env_to_bool(Ext::ENV_ANALYTICS_ENABLED, false) }
16
+ o.default { env_to_bool([Ext::ENV_ANALYTICS_ENABLED, Ext::ENV_ANALYTICS_ENABLED_OLD], false) }
12
17
  o.lazy
13
18
  end
14
19
 
15
20
  option :analytics_sample_rate do |o|
16
- o.default { env_to_float(Ext::ENV_ANALYTICS_SAMPLE_RATE, 1.0) }
21
+ o.default { env_to_float([Ext::ENV_ANALYTICS_SAMPLE_RATE, Ext::ENV_ANALYTICS_SAMPLE_RATE_OLD], 1.0) }
17
22
  o.lazy
18
23
  end
19
24
 
@@ -4,8 +4,11 @@ module Datadog
4
4
  # SuckerPunch integration constants
5
5
  module Ext
6
6
  APP = 'sucker_punch'.freeze
7
- ENV_ANALYTICS_ENABLED = 'DD_SUCKER_PUNCH_ANALYTICS_ENABLED'.freeze
8
- ENV_ANALYTICS_SAMPLE_RATE = 'DD_SUCKER_PUNCH_ANALYTICS_SAMPLE_RATE'.freeze
7
+ ENV_ENABLED = 'DD_TRACE_SUCKER_PUNCH_ENABLED'.freeze
8
+ ENV_ANALYTICS_ENABLED = 'DD_TRACE_SUCKER_PUNCH_ANALYTICS_ENABLED'.freeze
9
+ ENV_ANALYTICS_ENABLED_OLD = 'DD_SUCKER_PUNCH_ANALYTICS_ENABLED'.freeze
10
+ ENV_ANALYTICS_SAMPLE_RATE = 'DD_TRACE_SUCKER_PUNCH_ANALYTICS_SAMPLE_RATE'.freeze
11
+ ENV_ANALYTICS_SAMPLE_RATE_OLD = 'DD_SUCKER_PUNCH_ANALYTICS_SAMPLE_RATE'.freeze
9
12
  SERVICE_NAME = 'sucker_punch'.freeze
10
13
  SPAN_PERFORM = 'sucker_punch.perform'.freeze
11
14
  SPAN_PERFORM_ASYNC = 'sucker_punch.perform_async'.freeze
@@ -29,7 +29,7 @@ module Datadog
29
29
  get_option(:service_name),
30
30
  app: Ext::APP,
31
31
  app_type: Datadog::Ext::AppTypes::WORKER,
32
- tracer: get_option(:tracer)
32
+ tracer: -> { get_option(:tracer) }
33
33
  ).onto(::SuckerPunch)
34
34
  end
35
35
 
@@ -0,0 +1,278 @@
1
+ require 'date'
2
+ require 'json'
3
+ require 'rbconfig'
4
+
5
+ module Datadog
6
+ module Diagnostics
7
+ # A holistic collection of the environment in which ddtrace is running.
8
+ # This logger should allow for easy reporting by users to Datadog support.
9
+ #
10
+ # rubocop:disable Style/DoubleNegation
11
+ module EnvironmentLogger
12
+ class << self
13
+ # Outputs environment information to {Datadog.logger}.
14
+ # Executes only for the lifetime of the program.
15
+ def log!(transport_responses)
16
+ return if @executed || !log?
17
+ @executed = true
18
+
19
+ data = EnvironmentCollector.new.collect!(transport_responses)
20
+ data.reject! { |_, v| v.nil? } # Remove empty values from hash output
21
+
22
+ log_environment!(data.to_json)
23
+ log_error!('Agent Error'.freeze, data[:agent_error]) if data[:agent_error]
24
+ rescue => e
25
+ Datadog.logger.warn("Failed to collect environment information: #{e} location: #{e.backtrace.first}")
26
+ end
27
+
28
+ private
29
+
30
+ def log_environment!(line)
31
+ Datadog.logger.info("DATADOG TRACER CONFIGURATION - #{line}")
32
+ end
33
+
34
+ def log_error!(type, error)
35
+ Datadog.logger.warn("DATADOG TRACER DIAGNOSTIC - #{type}: #{error}")
36
+ end
37
+
38
+ # Are we logging the environment data?
39
+ def log?
40
+ startup_logs_enabled = Datadog.configuration.diagnostics.startup_logs.enabled
41
+ if startup_logs_enabled.nil?
42
+ !repl? # Suppress logs if we running in a REPL
43
+ else
44
+ startup_logs_enabled
45
+ end
46
+ end
47
+
48
+ REPL_PROGRAM_NAMES = %w[irb pry].freeze
49
+
50
+ def repl?
51
+ REPL_PROGRAM_NAMES.include?($PROGRAM_NAME)
52
+ end
53
+ end
54
+ end
55
+
56
+ # Collects environment information for diagnostic logging
57
+ class EnvironmentCollector
58
+ # @return [String] current time in ISO8601 format
59
+ def date
60
+ DateTime.now.iso8601
61
+ end
62
+
63
+ # Best portable guess of OS information.
64
+ # @return [String] platform string
65
+ def os_name
66
+ RbConfig::CONFIG['host'.freeze]
67
+ end
68
+
69
+ # @return [String] ddtrace version
70
+ def version
71
+ VERSION::STRING
72
+ end
73
+
74
+ # @return [String] "ruby"
75
+ def lang
76
+ Ext::Runtime::LANG
77
+ end
78
+
79
+ # Supported Ruby language version.
80
+ # Will be distinct from VM version for non-MRI environments.
81
+ # @return [String]
82
+ def lang_version
83
+ Ext::Runtime::LANG_VERSION
84
+ end
85
+
86
+ # @return [String] configured application environment
87
+ def env
88
+ Datadog.configuration.env
89
+ end
90
+
91
+ # @return [Boolean, nil]
92
+ def enabled
93
+ Datadog.configuration.tracer.enabled
94
+ end
95
+
96
+ # @return [String] configured application service name
97
+ def service
98
+ Datadog.configuration.service
99
+ end
100
+
101
+ # @return [String] configured application version
102
+ def dd_version
103
+ Datadog.configuration.version
104
+ end
105
+
106
+ # @return [String] target agent URL for trace flushing
107
+ def agent_url
108
+ # Retrieve the effect agent URL, regardless of how it was configured
109
+ transport = Datadog.tracer.writer.transport
110
+ adapter = transport.client.api.adapter
111
+ adapter.url
112
+ end
113
+
114
+ # Error returned by Datadog agent during a tracer flush attempt
115
+ # @return [String] concatenated list of transport errors
116
+ def agent_error(transport_responses)
117
+ error_responses = transport_responses.reject(&:ok?)
118
+
119
+ return nil if error_responses.empty?
120
+
121
+ error_responses.map(&:inspect).join(','.freeze)
122
+ end
123
+
124
+ # @return [Boolean, nil] debug mode enabled in configuration
125
+ def debug
126
+ !!Datadog.configuration.diagnostics.debug
127
+ end
128
+
129
+ # @return [Boolean, nil] analytics enabled in configuration
130
+ def analytics_enabled
131
+ !!Datadog.configuration.analytics.enabled
132
+ end
133
+
134
+ # @return [Numeric, nil] tracer sample rate configured
135
+ def sample_rate
136
+ sampler = Datadog.configuration.tracer.sampler
137
+ return nil unless sampler
138
+
139
+ sampler.sample_rate(nil) rescue nil
140
+ end
141
+
142
+ # DEV: We currently only support SimpleRule instances.
143
+ # DEV: These are the most commonly used rules.
144
+ # DEV: We should expand support for other rules in the future,
145
+ # DEV: although it is tricky to serialize arbitrary rules.
146
+ #
147
+ # @return [Hash, nil] sample rules configured
148
+ def sampling_rules
149
+ sampler = Datadog.configuration.tracer.sampler
150
+ return nil unless sampler.is_a?(Datadog::PrioritySampler) &&
151
+ sampler.priority_sampler.is_a?(Datadog::Sampling::RuleSampler)
152
+
153
+ sampler.priority_sampler.rules.map do |rule|
154
+ next unless rule.is_a?(Datadog::Sampling::SimpleRule)
155
+
156
+ {
157
+ name: rule.matcher.name,
158
+ service: rule.matcher.service,
159
+ sample_rate: rule.sampler.sample_rate(nil)
160
+ }
161
+ end.compact
162
+ end
163
+
164
+ # @return [Hash, nil] concatenated list of global tracer tags configured
165
+ def tags
166
+ tags = Datadog.configuration.tags
167
+ return nil if tags.empty?
168
+ hash_serializer(tags)
169
+ end
170
+
171
+ # @return [Boolean, nil] runtime metrics enabled in configuration
172
+ def runtime_metrics_enabled
173
+ Datadog.configuration.runtime_metrics.enabled
174
+ end
175
+
176
+ # Concatenated list of integrations activated, with their gem version.
177
+ # Example: "rails@6.0.3,rack@2.2.3"
178
+ #
179
+ # @return [String, nil]
180
+ def integrations_loaded
181
+ integrations = instrumented_integrations
182
+ return if integrations.empty?
183
+
184
+ integrations.map { |name, integration| "#{name}@#{integration.class.version}" }.join(','.freeze)
185
+ end
186
+
187
+ # Ruby VM name and version.
188
+ # Examples: "ruby-2.7.1", "jruby-9.2.11.1", "truffleruby-20.1.0"
189
+ # @return [String, nil]
190
+ def vm
191
+ # RUBY_ENGINE_VERSION returns the VM version, which
192
+ # will differ from RUBY_VERSION for non-mri VMs.
193
+ if defined?(RUBY_ENGINE_VERSION)
194
+ "#{RUBY_ENGINE}-#{RUBY_ENGINE_VERSION}"
195
+ else
196
+ # Ruby < 2.3 doesn't support RUBY_ENGINE_VERSION
197
+ "#{RUBY_ENGINE}-#{RUBY_VERSION}"
198
+ end
199
+ end
200
+
201
+ # @return [Boolean, nil] partial flushing enabled in configuration
202
+ def partial_flushing_enabled
203
+ !!Datadog.configuration.tracer.partial_flush.enabled
204
+ end
205
+
206
+ # @return [Boolean, nil] priority sampling enabled in configuration
207
+ def priority_sampling_enabled
208
+ !!Datadog.configuration.tracer.priority_sampling
209
+ end
210
+
211
+ # @return [Boolean, nil] health metrics enabled in configuration
212
+ def health_metrics_enabled
213
+ !!Datadog.configuration.diagnostics.health_metrics.enabled
214
+ end
215
+
216
+ # TODO: Populate when profiling is implemented
217
+ # def profiling_enabled
218
+ # end
219
+
220
+ # TODO: Populate when automatic log correlation is implemented
221
+ # def logs_correlation_enabled
222
+ # end
223
+
224
+ # @return [Hash] environment information available at call time
225
+ def collect!(transport_responses)
226
+ {
227
+ date: date,
228
+ os_name: os_name,
229
+ version: version,
230
+ lang: lang,
231
+ lang_version: lang_version,
232
+ env: env,
233
+ enabled: enabled,
234
+ service: service,
235
+ dd_version: dd_version,
236
+ agent_url: agent_url,
237
+ agent_error: agent_error(transport_responses),
238
+ debug: debug,
239
+ analytics_enabled: analytics_enabled,
240
+ sample_rate: sample_rate,
241
+ sampling_rules: sampling_rules,
242
+ tags: tags,
243
+ runtime_metrics_enabled: runtime_metrics_enabled,
244
+ integrations_loaded: integrations_loaded,
245
+ vm: vm,
246
+ partial_flushing_enabled: partial_flushing_enabled,
247
+ priority_sampling_enabled: priority_sampling_enabled,
248
+ health_metrics_enabled: health_metrics_enabled,
249
+ **instrumented_integrations_settings
250
+ }
251
+ end
252
+
253
+ private
254
+
255
+ def instrumented_integrations
256
+ Datadog.configuration.instrumented_integrations
257
+ end
258
+
259
+ # Capture all active integration settings into "integrationName_settingName: value" entries.
260
+ def instrumented_integrations_settings
261
+ Hash[instrumented_integrations.flat_map do |name, integration|
262
+ integration.configuration.to_h.flat_map do |setting, value|
263
+ next [] if setting == :tracer # Skip internal Ruby objects
264
+
265
+ # Convert value to a string to avoid custom #to_json
266
+ # handlers possibly causing errors.
267
+ [[:"integration_#{name}_#{setting}", value.to_s]]
268
+ end
269
+ end]
270
+ end
271
+
272
+ # Outputs "k1:v1,k2:v2,..."
273
+ def hash_serializer(h)
274
+ h.map { |k, v| "#{k}:#{v}" }.join(','.freeze)
275
+ end
276
+ end
277
+ end
278
+ end
@@ -6,20 +6,34 @@ module Datadog
6
6
  # Defines helper methods for environment
7
7
  module Helpers
8
8
  def env_to_bool(var, default = nil)
9
- ENV.key?(var) ? ENV[var].to_s.downcase == 'true' : default
9
+ var = decode_array(var)
10
+ var && ENV.key?(var) ? ENV[var].to_s.strip.downcase == 'true' : default
11
+ end
12
+
13
+ def env_to_int(var, default = nil)
14
+ var = decode_array(var)
15
+ var && ENV.key?(var) ? ENV[var].to_i : default
10
16
  end
11
17
 
12
18
  def env_to_float(var, default = nil)
13
- ENV.key?(var) ? ENV[var].to_f : default
19
+ var = decode_array(var)
20
+ var && ENV.key?(var) ? ENV[var].to_f : default
14
21
  end
15
22
 
16
23
  def env_to_list(var, default = [])
17
- if ENV.key?(var)
24
+ var = decode_array(var)
25
+ if var && ENV.key?(var)
18
26
  ENV[var].split(',').map(&:strip)
19
27
  else
20
28
  default
21
29
  end
22
30
  end
31
+
32
+ private
33
+
34
+ def decode_array(var)
35
+ var.is_a?(Array) ? var.find { |env_var| ENV.key?(env_var) } : var
36
+ end
23
37
  end
24
38
 
25
39
  extend Helpers
@@ -1,6 +1,9 @@
1
1
  module Datadog
2
2
  module Ext
3
3
  module Diagnostics
4
+ DD_TRACE_STARTUP_LOGS = 'DD_TRACE_STARTUP_LOGS'.freeze
5
+ DD_TRACE_DEBUG = 'DD_TRACE_DEBUG'.freeze
6
+ DD_TRACE_ENABLED = 'DD_TRACE_ENABLED'.freeze
4
7
  # Health
5
8
  module Health
6
9
  # Metrics
@@ -1,8 +1,10 @@
1
1
  module Datadog
2
2
  module Ext
3
3
  module Environment
4
+ ENV_API_KEY = 'DD_API_KEY'.freeze
4
5
  ENV_ENVIRONMENT = 'DD_ENV'.freeze
5
6
  ENV_SERVICE = 'DD_SERVICE'.freeze
7
+ ENV_SITE = 'DD_SITE'.freeze
6
8
  ENV_TAGS = 'DD_TAGS'.freeze
7
9
  ENV_VERSION = 'DD_VERSION'.freeze
8
10
 
@@ -6,6 +6,7 @@ module Datadog
6
6
  DEFAULT_PORT = 8126
7
7
  ENV_DEFAULT_HOST = 'DD_AGENT_HOST'.freeze
8
8
  ENV_DEFAULT_PORT = 'DD_TRACE_AGENT_PORT'.freeze
9
+ ENV_DEFAULT_URL = 'DD_TRACE_AGENT_URL'.freeze
9
10
  HEADER_CONTAINER_ID = 'Datadog-Container-ID'.freeze
10
11
  HEADER_META_LANG = 'Datadog-Meta-Lang'.freeze
11
12
  HEADER_META_LANG_VERSION = 'Datadog-Meta-Lang-Version'.freeze
@@ -10,7 +10,7 @@ module Datadog
10
10
  def initialize(*args, &block)
11
11
  super
12
12
  self.progname = PREFIX
13
- self.level = ::Logger::WARN
13
+ self.level = ::Logger::INFO
14
14
  end
15
15
 
16
16
  def add(severity, message = nil, progname = nil, &block)
@@ -12,26 +12,36 @@ module Datadog
12
12
  obj.datadog_pin
13
13
  end
14
14
 
15
- attr_reader :service_name
16
15
  attr_accessor :app
17
- attr_accessor :tags
18
16
  attr_accessor :app_type
19
- attr_accessor :name
20
- attr_accessor :tracer
21
17
  attr_accessor :config
18
+ attr_accessor :name
19
+ attr_accessor :service_name
20
+ attr_accessor :tags
21
+ attr_reader :tracer
22
+ attr_accessor :writer
23
+
24
+ alias service= service_name=
25
+ alias service service_name
22
26
 
23
27
  def initialize(service_name, options = {})
28
+ deprecation_warning unless options[:tracer].is_a?(Proc) || options[:tracer].nil?
29
+
24
30
  @app = options[:app]
25
- @tags = options[:tags]
26
31
  @app_type = options[:app_type]
27
- @name = nil # this would rarely be overriden as it's really span-specific
28
- @tracer = options[:tracer] || Datadog.tracer
29
32
  @config = options[:config]
30
- self.service_name = service_name
33
+ @name = nil # this would rarely be overriden as it's really span-specific
34
+ @service_name = service_name
35
+ @tags = options[:tags]
36
+ @tracer = options[:tracer]
37
+ end
38
+
39
+ def tracer
40
+ @tracer.is_a?(Proc) ? @tracer.call : (@tracer || Datadog.tracer)
31
41
  end
32
42
 
33
43
  def enabled?
34
- return @tracer.enabled if @tracer
44
+ return tracer.enabled if tracer
35
45
  false
36
46
  end
37
47
 
@@ -56,15 +66,29 @@ module Datadog
56
66
  obj.datadog_pin = self
57
67
  end
58
68
 
59
- def service_name=(name)
60
- @service_name = name
69
+ def to_s
70
+ "Pin(service:#{service},app:#{app},app_type:#{app_type},name:#{name})"
61
71
  end
62
72
 
63
- alias service= service_name=
64
- alias service service_name
73
+ private
65
74
 
66
- def to_s
67
- "Pin(service:#{service},app:#{app},app_type:#{app_type},name:#{name})"
75
+ DEPRECATION_WARNING = %(
76
+ Explicitly providing a tracer instance is DEPRECATED.
77
+ It's recommended to not provide an explicit tracer instance
78
+ and let Datadog::Pin resolve the correct tracer internally.
79
+ ).freeze
80
+
81
+ def deprecation_warning
82
+ log_deprecation_warning('Datadog::Pin.new')
83
+ end
84
+
85
+ include Datadog::Patcher
86
+
87
+ def log_deprecation_warning(method_name)
88
+ # Only log each deprecation warning once (safeguard against log spam)
89
+ do_once(method_name) do
90
+ Datadog.logger.warn("#{method_name}:#{DEPRECATION_WARNING}")
91
+ end
68
92
  end
69
93
  end
70
94