ddtrace 1.7.0 → 1.9.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (182) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +100 -1
  3. data/README.md +2 -2
  4. data/ext/ddtrace_profiling_loader/extconf.rb +4 -1
  5. data/ext/ddtrace_profiling_native_extension/NativeExtensionDesign.md +1 -1
  6. data/ext/ddtrace_profiling_native_extension/clock_id_from_pthread.c +3 -2
  7. data/ext/ddtrace_profiling_native_extension/collectors_cpu_and_wall_time.c +24 -50
  8. data/ext/ddtrace_profiling_native_extension/collectors_cpu_and_wall_time.h +1 -1
  9. data/ext/ddtrace_profiling_native_extension/collectors_cpu_and_wall_time_worker.c +284 -74
  10. data/ext/ddtrace_profiling_native_extension/collectors_dynamic_sampling_rate.c +142 -0
  11. data/ext/ddtrace_profiling_native_extension/collectors_dynamic_sampling_rate.h +14 -0
  12. data/ext/ddtrace_profiling_native_extension/collectors_idle_sampling_helper.c +241 -0
  13. data/ext/ddtrace_profiling_native_extension/collectors_idle_sampling_helper.h +3 -0
  14. data/ext/ddtrace_profiling_native_extension/collectors_stack.c +32 -32
  15. data/ext/ddtrace_profiling_native_extension/collectors_stack.h +2 -2
  16. data/ext/ddtrace_profiling_native_extension/extconf.rb +21 -7
  17. data/ext/ddtrace_profiling_native_extension/helpers.h +5 -0
  18. data/ext/ddtrace_profiling_native_extension/http_transport.c +50 -49
  19. data/ext/ddtrace_profiling_native_extension/libdatadog_helpers.h +5 -1
  20. data/ext/ddtrace_profiling_native_extension/native_extension_helpers.rb +42 -12
  21. data/ext/ddtrace_profiling_native_extension/private_vm_api_access.c +116 -22
  22. data/ext/ddtrace_profiling_native_extension/private_vm_api_access.h +9 -0
  23. data/ext/ddtrace_profiling_native_extension/profiling.c +205 -0
  24. data/ext/ddtrace_profiling_native_extension/ruby_helpers.c +86 -0
  25. data/ext/ddtrace_profiling_native_extension/ruby_helpers.h +28 -6
  26. data/ext/ddtrace_profiling_native_extension/setup_signal_handler.c +23 -4
  27. data/ext/ddtrace_profiling_native_extension/setup_signal_handler.h +4 -0
  28. data/ext/ddtrace_profiling_native_extension/stack_recorder.c +47 -50
  29. data/ext/ddtrace_profiling_native_extension/stack_recorder.h +4 -4
  30. data/ext/ddtrace_profiling_native_extension/time_helpers.c +17 -0
  31. data/ext/ddtrace_profiling_native_extension/time_helpers.h +10 -0
  32. data/lib/datadog/appsec/assets/waf_rules/recommended.json +75 -8
  33. data/lib/datadog/appsec/assets/waf_rules/risky.json +1 -1
  34. data/lib/datadog/appsec/assets/waf_rules/strict.json +1 -1
  35. data/lib/datadog/appsec/assets.rb +1 -1
  36. data/lib/datadog/appsec/configuration/settings.rb +35 -22
  37. data/lib/datadog/appsec/configuration.rb +4 -2
  38. data/lib/datadog/appsec/contrib/auto_instrument.rb +1 -1
  39. data/lib/datadog/appsec/contrib/configuration/settings.rb +1 -1
  40. data/lib/datadog/appsec/contrib/integration.rb +1 -1
  41. data/lib/datadog/appsec/contrib/patcher.rb +1 -1
  42. data/lib/datadog/appsec/contrib/rack/configuration/settings.rb +1 -1
  43. data/lib/datadog/appsec/contrib/rack/ext.rb +1 -1
  44. data/lib/datadog/appsec/contrib/rack/gateway/watcher.rb +1 -1
  45. data/lib/datadog/appsec/contrib/rack/reactive/request.rb +1 -1
  46. data/lib/datadog/appsec/contrib/rack/reactive/request_body.rb +1 -1
  47. data/lib/datadog/appsec/contrib/rack/reactive/response.rb +1 -1
  48. data/lib/datadog/appsec/contrib/rack/request.rb +1 -1
  49. data/lib/datadog/appsec/contrib/rack/response.rb +1 -1
  50. data/lib/datadog/appsec/contrib/rails/configuration/settings.rb +1 -1
  51. data/lib/datadog/appsec/contrib/rails/ext.rb +1 -1
  52. data/lib/datadog/appsec/contrib/rails/framework.rb +1 -1
  53. data/lib/datadog/appsec/contrib/rails/gateway/watcher.rb +1 -1
  54. data/lib/datadog/appsec/contrib/rails/reactive/action.rb +1 -1
  55. data/lib/datadog/appsec/contrib/rails/request.rb +1 -1
  56. data/lib/datadog/appsec/contrib/rails/request_middleware.rb +1 -1
  57. data/lib/datadog/appsec/contrib/sinatra/configuration/settings.rb +1 -1
  58. data/lib/datadog/appsec/contrib/sinatra/ext.rb +1 -1
  59. data/lib/datadog/appsec/contrib/sinatra/framework.rb +1 -1
  60. data/lib/datadog/appsec/contrib/sinatra/gateway/watcher.rb +1 -1
  61. data/lib/datadog/appsec/contrib/sinatra/reactive/routed.rb +1 -1
  62. data/lib/datadog/appsec/contrib/sinatra/request_middleware.rb +1 -1
  63. data/lib/datadog/appsec/event.rb +1 -1
  64. data/lib/datadog/appsec/extensions.rb +36 -26
  65. data/lib/datadog/appsec/instrumentation/gateway.rb +3 -3
  66. data/lib/datadog/appsec/processor.rb +15 -19
  67. data/lib/datadog/appsec/rate_limiter.rb +1 -1
  68. data/lib/datadog/appsec/reactive/address_hash.rb +1 -1
  69. data/lib/datadog/appsec/reactive/engine.rb +1 -1
  70. data/lib/datadog/appsec/reactive/operation.rb +2 -2
  71. data/lib/datadog/appsec/reactive/subscriber.rb +1 -1
  72. data/lib/datadog/appsec/response.rb +18 -9
  73. data/lib/datadog/appsec/utils/http/media_range.rb +201 -0
  74. data/lib/datadog/appsec/utils/http/media_type.rb +87 -0
  75. data/lib/datadog/appsec/utils/http.rb +9 -0
  76. data/lib/datadog/appsec/utils.rb +7 -0
  77. data/lib/datadog/appsec.rb +1 -1
  78. data/lib/datadog/ci/ext/environment.rb +57 -13
  79. data/lib/datadog/core/configuration/agent_settings_resolver.rb +2 -2
  80. data/lib/datadog/core/configuration/base.rb +3 -0
  81. data/lib/datadog/core/configuration/components.rb +27 -6
  82. data/lib/datadog/core/configuration/ext.rb +26 -0
  83. data/lib/datadog/core/configuration/option_definition.rb +11 -2
  84. data/lib/datadog/core/configuration/settings.rb +16 -341
  85. data/lib/datadog/core/diagnostics/environment_logger.rb +4 -3
  86. data/lib/datadog/core/diagnostics/health.rb +4 -22
  87. data/lib/datadog/core/environment/variable_helpers.rb +58 -10
  88. data/lib/datadog/core/metrics/client.rb +3 -2
  89. data/lib/datadog/core/metrics/ext.rb +0 -2
  90. data/lib/datadog/core/telemetry/collector.rb +1 -0
  91. data/lib/datadog/core/utils.rb +0 -21
  92. data/lib/datadog/core.rb +21 -1
  93. data/lib/datadog/kit/appsec/events.rb +75 -0
  94. data/lib/datadog/kit/enable_core_dumps.rb +1 -0
  95. data/lib/datadog/kit/identity.rb +8 -7
  96. data/lib/datadog/opentelemetry/api/context.rb +187 -0
  97. data/lib/datadog/opentelemetry/api/trace/span.rb +15 -0
  98. data/lib/datadog/opentelemetry/sdk/configurator.rb +38 -0
  99. data/lib/datadog/opentelemetry/sdk/id_generator.rb +27 -0
  100. data/lib/datadog/opentelemetry/sdk/propagator.rb +91 -0
  101. data/lib/datadog/opentelemetry/sdk/span_processor.rb +92 -0
  102. data/lib/datadog/opentelemetry.rb +48 -0
  103. data/lib/datadog/opentracer/distributed_headers.rb +2 -2
  104. data/lib/datadog/profiling/collectors/cpu_and_wall_time_worker.rb +16 -5
  105. data/lib/datadog/profiling/collectors/dynamic_sampling_rate.rb +14 -0
  106. data/lib/datadog/profiling/collectors/idle_sampling_helper.rb +68 -0
  107. data/lib/datadog/profiling/stack_recorder.rb +14 -0
  108. data/lib/datadog/profiling.rb +2 -0
  109. data/lib/datadog/tracing/configuration/ext.rb +33 -4
  110. data/lib/datadog/tracing/configuration/settings.rb +433 -0
  111. data/lib/datadog/tracing/contrib/aws/configuration/settings.rb +4 -1
  112. data/lib/datadog/tracing/contrib/aws/ext.rb +1 -0
  113. data/lib/datadog/tracing/contrib/dalli/configuration/settings.rb +4 -1
  114. data/lib/datadog/tracing/contrib/dalli/ext.rb +1 -0
  115. data/lib/datadog/tracing/contrib/elasticsearch/configuration/settings.rb +5 -1
  116. data/lib/datadog/tracing/contrib/elasticsearch/ext.rb +1 -0
  117. data/lib/datadog/tracing/contrib/ethon/configuration/settings.rb +6 -1
  118. data/lib/datadog/tracing/contrib/ethon/ext.rb +1 -0
  119. data/lib/datadog/tracing/contrib/excon/configuration/settings.rb +5 -1
  120. data/lib/datadog/tracing/contrib/excon/ext.rb +1 -0
  121. data/lib/datadog/tracing/contrib/faraday/configuration/settings.rb +5 -1
  122. data/lib/datadog/tracing/contrib/faraday/ext.rb +1 -0
  123. data/lib/datadog/tracing/contrib/grpc/configuration/settings.rb +6 -1
  124. data/lib/datadog/tracing/contrib/grpc/distributed/propagation.rb +9 -4
  125. data/lib/datadog/tracing/contrib/grpc/ext.rb +1 -0
  126. data/lib/datadog/tracing/contrib/http/configuration/settings.rb +11 -1
  127. data/lib/datadog/tracing/contrib/http/distributed/fetcher.rb +10 -3
  128. data/lib/datadog/tracing/contrib/http/distributed/propagation.rb +9 -4
  129. data/lib/datadog/tracing/contrib/http/ext.rb +2 -0
  130. data/lib/datadog/tracing/contrib/http/instrumentation.rb +3 -6
  131. data/lib/datadog/tracing/contrib/httpclient/configuration/settings.rb +11 -1
  132. data/lib/datadog/tracing/contrib/httpclient/ext.rb +2 -0
  133. data/lib/datadog/tracing/contrib/httpclient/instrumentation.rb +3 -4
  134. data/lib/datadog/tracing/contrib/httprb/configuration/settings.rb +11 -1
  135. data/lib/datadog/tracing/contrib/httprb/ext.rb +2 -0
  136. data/lib/datadog/tracing/contrib/httprb/instrumentation.rb +3 -4
  137. data/lib/datadog/tracing/contrib/mongodb/configuration/settings.rb +5 -1
  138. data/lib/datadog/tracing/contrib/mongodb/ext.rb +1 -0
  139. data/lib/datadog/tracing/contrib/mysql2/configuration/settings.rb +4 -1
  140. data/lib/datadog/tracing/contrib/mysql2/ext.rb +1 -0
  141. data/lib/datadog/tracing/contrib/mysql2/instrumentation.rb +2 -2
  142. data/lib/datadog/tracing/contrib/patcher.rb +3 -2
  143. data/lib/datadog/tracing/contrib/pg/configuration/settings.rb +4 -1
  144. data/lib/datadog/tracing/contrib/pg/ext.rb +1 -0
  145. data/lib/datadog/tracing/contrib/pg/instrumentation.rb +56 -33
  146. data/lib/datadog/tracing/contrib/presto/configuration/settings.rb +4 -1
  147. data/lib/datadog/tracing/contrib/presto/ext.rb +1 -0
  148. data/lib/datadog/tracing/contrib/propagation/sql_comment/ext.rb +1 -0
  149. data/lib/datadog/tracing/contrib/propagation/sql_comment.rb +10 -12
  150. data/lib/datadog/tracing/contrib/redis/configuration/settings.rb +4 -1
  151. data/lib/datadog/tracing/contrib/redis/ext.rb +1 -0
  152. data/lib/datadog/tracing/contrib/redis/instrumentation.rb +30 -23
  153. data/lib/datadog/tracing/contrib/redis/integration.rb +34 -2
  154. data/lib/datadog/tracing/contrib/redis/patcher.rb +18 -14
  155. data/lib/datadog/tracing/contrib/redis/quantize.rb +12 -9
  156. data/lib/datadog/tracing/contrib/redis/tags.rb +4 -6
  157. data/lib/datadog/tracing/contrib/redis/trace_middleware.rb +72 -0
  158. data/lib/datadog/tracing/contrib/rest_client/configuration/settings.rb +6 -1
  159. data/lib/datadog/tracing/contrib/rest_client/ext.rb +1 -0
  160. data/lib/datadog/tracing/contrib/stripe/configuration/settings.rb +33 -0
  161. data/lib/datadog/tracing/contrib/stripe/ext.rb +26 -0
  162. data/lib/datadog/tracing/contrib/stripe/integration.rb +43 -0
  163. data/lib/datadog/tracing/contrib/stripe/patcher.rb +29 -0
  164. data/lib/datadog/tracing/contrib/stripe/request.rb +67 -0
  165. data/lib/datadog/tracing/contrib.rb +1 -0
  166. data/lib/datadog/{core → tracing}/diagnostics/ext.rb +1 -6
  167. data/lib/datadog/tracing/diagnostics/health.rb +40 -0
  168. data/lib/datadog/tracing/distributed/{b3.rb → b3_multi.rb} +2 -2
  169. data/lib/datadog/tracing/distributed/helpers.rb +2 -1
  170. data/lib/datadog/tracing/distributed/none.rb +19 -0
  171. data/lib/datadog/tracing/distributed/trace_context.rb +378 -0
  172. data/lib/datadog/tracing/metadata/ext.rb +1 -1
  173. data/lib/datadog/tracing/metadata/tagging.rb +6 -0
  174. data/lib/datadog/tracing/sampling/priority_sampler.rb +11 -0
  175. data/lib/datadog/tracing/sampling/rate_sampler.rb +3 -3
  176. data/lib/datadog/tracing/span.rb +3 -19
  177. data/lib/datadog/tracing/span_operation.rb +5 -4
  178. data/lib/datadog/tracing/trace_digest.rb +85 -2
  179. data/lib/datadog/tracing/trace_operation.rb +13 -4
  180. data/lib/datadog/tracing/utils.rb +50 -0
  181. data/lib/ddtrace/version.rb +1 -1
  182. metadata +41 -9
@@ -0,0 +1,201 @@
1
+ # typed: ignore
2
+
3
+ require_relative 'media_type'
4
+
5
+ module Datadog
6
+ module AppSec
7
+ module Utils
8
+ module HTTP
9
+ # Implementation of media range for content negotiation
10
+ class MediaRange
11
+ class ParseError < ::StandardError
12
+ end
13
+
14
+ WILDCARD = '*'.freeze
15
+ WILDCARD_RE = ::Regexp.escape(WILDCARD)
16
+
17
+ # See: https://www.rfc-editor.org/rfc/rfc7230#section-3.2.6
18
+ TOKEN_RE = /[-#$%&'*+.^_`|~A-Za-z0-9]+/.freeze
19
+
20
+ # See: https://www.rfc-editor.org/rfc/rfc7231#section-3.1.1.1
21
+ PARAMETER_RE = %r{ # rubocop:disable Style/RegexpLiteral
22
+ (?:
23
+ (?<parameter_name>#{TOKEN_RE})
24
+ =
25
+ (?:
26
+ (?<parameter_value>#{TOKEN_RE})
27
+ |
28
+ "(?<parameter_value>[^"]+)"
29
+ )
30
+ )
31
+ }ix.freeze
32
+
33
+ # See: https://www.rfc-editor.org/rfc/rfc7231#section-5.3.2
34
+ ACCEPT_EXT_RE = %r{ # rubocop:disable Style/RegexpLiteral
35
+ (?:
36
+ (?<ext_name>#{TOKEN_RE})
37
+ =
38
+ (?:
39
+ (?<ext_value>#{TOKEN_RE})
40
+ |
41
+ "(?<ext_value>[^"]+)"
42
+ )
43
+ )
44
+ }ix.freeze
45
+
46
+ # See: https://www.rfc-editor.org/rfc/rfc7231#section-5.3.1
47
+ QVALUE_RE = %r{ # rubocop:disable Style/RegexpLiteral
48
+ 0(?:\.\d{1,3})?
49
+ |
50
+ 1(?:\.0{1,3})?
51
+ }ix.freeze
52
+
53
+ # See: https://www.rfc-editor.org/rfc/rfc7231#section-5.3.2
54
+ MEDIA_RANGE_RE = %r{
55
+ \A
56
+ (?:
57
+ (?<type>#{WILDCARD_RE})/(?<subtype>#{WILDCARD_RE})
58
+ |
59
+ (?<type>#{TOKEN_RE})/(?<subtype>#{WILDCARD_RE})
60
+ |
61
+ (?<type>#{TOKEN_RE})/(?<subtype>#{TOKEN_RE})
62
+ )
63
+ (?<parameters>
64
+ (?:
65
+ \s*;\s*
66
+ (?!q=)
67
+ #{PARAMETER_RE}
68
+ )*
69
+ )
70
+ (?<accept_params>
71
+ (?<weight>
72
+ \s*;\s*
73
+ (?:q=
74
+ (?<quality>
75
+ #{QVALUE_RE}
76
+ )
77
+ )
78
+ )
79
+ (?<accept_exts>
80
+ (?<accept_ext>
81
+ (?:
82
+ \s*;\s*
83
+ (?!q=)
84
+ #{ACCEPT_EXT_RE}
85
+ )*
86
+ )
87
+ )
88
+ )?
89
+ \Z
90
+ }ix.freeze
91
+
92
+ attr_reader :type, :subtype, :quality, :parameters, :accept_ext
93
+
94
+ def initialize(media_range) # rubocop:disable Metrics/PerceivedComplexity, Metrics/CyclomaticComplexity
95
+ media_range_match = MEDIA_RANGE_RE.match(media_range)
96
+
97
+ raise ParseError, media_range.inspect if media_range_match.nil?
98
+
99
+ @type = (media_range_match['type'] || WILDCARD).downcase
100
+ @subtype = (media_range_match['subtype'] || WILDCARD).downcase
101
+ @quality = (media_range_match['quality'] || 1.0).to_f
102
+ @parameters = {}
103
+ @accept_ext = {}
104
+
105
+ parameters = media_range_match['parameters']
106
+
107
+ return if parameters.nil?
108
+
109
+ parameters.split(';').map(&:strip).each do |parameter|
110
+ parameter_match = PARAMETER_RE.match(parameter)
111
+
112
+ next if parameter_match.nil?
113
+
114
+ parameter_name = parameter_match['parameter_name']
115
+ parameter_value = parameter_match['parameter_value']
116
+
117
+ next if parameter_name.nil? || parameter_value.nil?
118
+
119
+ @parameters[parameter_name.downcase] = parameter_value.downcase
120
+ end
121
+
122
+ accept_exts = media_range_match['accept_exts']
123
+
124
+ return if accept_exts.nil?
125
+
126
+ accept_exts.split(';').map(&:strip).each do |ext|
127
+ ext_match = ACCEPT_EXT_RE.match(ext)
128
+
129
+ next if ext_match.nil?
130
+
131
+ ext_name = ext_match['ext_name']
132
+ ext_value = ext_match['ext_value']
133
+
134
+ next if ext_name.nil? || ext_value.nil?
135
+
136
+ @accept_ext[ext_name.downcase] = ext_value.downcase
137
+ end
138
+ end
139
+
140
+ # Compare two MediaRange for ordering
141
+ def <=>(other)
142
+ unless (q = quality <=> other.quality) == 0 || q.nil?
143
+ return q
144
+ end
145
+
146
+ if (s = specificity <=> other.specificity) != 0
147
+ return s
148
+ end
149
+
150
+ unless wildcard?(:type)
151
+ if wildcard?(:subtype) && !other.wildcard?(:subtype)
152
+ return -1
153
+ elsif !wildcard?(:subtype) && other.wildcard?(:subtype)
154
+ return 1
155
+ end
156
+ end
157
+
158
+ if wildcard?(:type) && !other.wildcard?(:type)
159
+ return -1
160
+ elsif !wildcard?(:type) && other.wildcard?(:type)
161
+ return 1
162
+ end
163
+
164
+ 0
165
+ end
166
+
167
+ # Compare with a MediaType for match
168
+ #
169
+ # returns true if the MediaType is accepted by this MediaRange
170
+ def ===(other)
171
+ return self === MediaType.new(other) if other.is_a?(::String)
172
+
173
+ type == other.type && subtype == other.subtype && other.parameters.all? { |k, v| parameters[k] == v } ||
174
+ type == other.type && wildcard?(:subtype) ||
175
+ wildcard?(:type) && wildcard?(:subtype)
176
+ end
177
+
178
+ def specificity
179
+ @parameters.count
180
+ end
181
+
182
+ def wildcard?(field = nil)
183
+ return wildcard?(:type) || wildcard?(:subtype) if field.nil?
184
+
185
+ instance_variable_get(:"@#{field}") == WILDCARD
186
+ end
187
+
188
+ def to_s
189
+ s = "#{@type}/#{@subtype}"
190
+
191
+ s << ';' << @parameters.map { |k, v| "#{k}=#{v}" }.join(';') if @parameters.count > 0
192
+ s << ";q=#{@quality}" if @quality < 1.0
193
+ s << ';' << @accept_ext.map { |k, v| "#{k}=#{v}" }.join(';') if @accept_ext.count > 0
194
+
195
+ s
196
+ end
197
+ end
198
+ end
199
+ end
200
+ end
201
+ end
@@ -0,0 +1,87 @@
1
+ # typed: ignore
2
+
3
+ module Datadog
4
+ module AppSec
5
+ module Utils
6
+ module HTTP
7
+ # Implementation of media type for content negotiation
8
+ #
9
+ # See:
10
+ # - https://www.rfc-editor.org/rfc/rfc7231#section-5.3.1
11
+ # - https://www.rfc-editor.org/rfc/rfc7231#section-5.3.2
12
+ class MediaType
13
+ class ParseError < ::StandardError
14
+ end
15
+
16
+ WILDCARD = '*'.freeze
17
+
18
+ # See: https://www.rfc-editor.org/rfc/rfc7230#section-3.2.6
19
+ TOKEN_RE = /[-#$%&'*+.^_`|~A-Za-z0-9]+/.freeze
20
+
21
+ # See: https://www.rfc-editor.org/rfc/rfc7231#section-3.1.1.1
22
+ PARAMETER_RE = %r{ # rubocop:disable Style/RegexpLiteral
23
+ (?:
24
+ (?<parameter_name>#{TOKEN_RE})
25
+ =
26
+ (?:
27
+ (?<parameter_value>#{TOKEN_RE})
28
+ |
29
+ "(?<parameter_value>[^"]+)"
30
+ )
31
+ )
32
+ }ix.freeze
33
+
34
+ # See: https://www.rfc-editor.org/rfc/rfc7231#section-3.1.1.1
35
+ MEDIA_TYPE_RE = %r{
36
+ \A
37
+ (?<type>#{TOKEN_RE})/(?<subtype>#{TOKEN_RE})
38
+ (?<parameters>
39
+ (?:
40
+ \s*;\s*
41
+ #{PARAMETER_RE}
42
+ )*
43
+ )
44
+ \Z
45
+ }ix.freeze
46
+
47
+ attr_reader :type, :subtype, :parameters
48
+
49
+ def initialize(media_type)
50
+ media_type_match = MEDIA_TYPE_RE.match(media_type)
51
+
52
+ raise ParseError, media_type.inspect if media_type_match.nil?
53
+
54
+ @type = (media_type_match['type'] || WILDCARD).downcase
55
+ @subtype = (media_type_match['subtype'] || WILDCARD).downcase
56
+ @parameters = {}
57
+
58
+ parameters = media_type_match['parameters']
59
+
60
+ return if parameters.nil?
61
+
62
+ parameters.split(';').map(&:strip).each do |parameter|
63
+ parameter_match = PARAMETER_RE.match(parameter)
64
+
65
+ next if parameter_match.nil?
66
+
67
+ parameter_name = parameter_match['parameter_name']
68
+ parameter_value = parameter_match['parameter_value']
69
+
70
+ next if parameter_name.nil? || parameter_value.nil?
71
+
72
+ @parameters[parameter_name.downcase] = parameter_value.downcase
73
+ end
74
+ end
75
+
76
+ def to_s
77
+ s = "#{@type}/#{@subtype}"
78
+
79
+ s << ';' << @parameters.map { |k, v| "#{k}=#{v}" }.join(';') if @parameters.count > 0
80
+
81
+ s
82
+ end
83
+ end
84
+ end
85
+ end
86
+ end
87
+ end
@@ -0,0 +1,9 @@
1
+ module Datadog
2
+ module AppSec
3
+ module Utils
4
+ # HTTP utilities
5
+ module HTTP
6
+ end
7
+ end
8
+ end
9
+ end
@@ -0,0 +1,7 @@
1
+ module Datadog
2
+ module AppSec
3
+ # Utilities for AppSec
4
+ module Utils
5
+ end
6
+ end
7
+ end
@@ -1,4 +1,4 @@
1
- # typed: false
1
+ # typed: ignore
2
2
 
3
3
  require_relative 'appsec/configuration'
4
4
  require_relative 'appsec/extensions'
@@ -5,6 +5,7 @@
5
5
  require_relative '../../core/git/ext'
6
6
 
7
7
  require 'open3'
8
+ require 'json'
8
9
 
9
10
  module Datadog
10
11
  module CI
@@ -22,11 +23,13 @@ module Datadog
22
23
  TAG_PROVIDER_NAME = 'ci.provider.name'
23
24
  TAG_STAGE_NAME = 'ci.stage.name'
24
25
  TAG_WORKSPACE_PATH = 'ci.workspace_path'
26
+ TAG_CI_ENV_VARS = '_dd.ci.env_vars'
25
27
 
26
28
  PROVIDERS = [
27
29
  ['APPVEYOR', :extract_appveyor],
28
30
  ['TF_BUILD', :extract_azure_pipelines],
29
31
  ['BITBUCKET_COMMIT', :extract_bitbucket],
32
+ ['BUDDY', :extract_buddy],
30
33
  ['BUILDKITE', :extract_buildkite],
31
34
  ['CIRCLECI', :extract_circle_ci],
32
35
  ['GITHUB_SHA', :extract_github_actions],
@@ -43,7 +46,6 @@ module Datadog
43
46
  # Extract metadata from CI provider environment variables
44
47
  _, extractor = PROVIDERS.find { |provider_env_var, _| env.key?(provider_env_var) }
45
48
  tags = extractor ? public_send(extractor, env).reject { |_, v| v.nil? || v.strip.empty? } : {}
46
- tags.delete(Core::Git::Ext::TAG_BRANCH) unless tags[Core::Git::Ext::TAG_TAG].nil?
47
49
 
48
50
  # If user defined metadata is defined, overwrite
49
51
  tags.merge!(extract_user_defined_git(env))
@@ -126,16 +128,12 @@ module Datadog
126
128
  if build_id &&
127
129
  (team_foundation_server_uri = env['SYSTEM_TEAMFOUNDATIONSERVERURI']) &&
128
130
  (team_project_id = env['SYSTEM_TEAMPROJECTID'])
129
-
130
131
  pipeline_url = "#{team_foundation_server_uri}#{team_project_id}/_build/results?buildId=#{build_id}"
131
-
132
132
  job_url = "#{pipeline_url}&view=logs&j=#{env['SYSTEM_JOBID']}&t=#{env['SYSTEM_TASKINSTANCEID']}"
133
133
  end
134
134
 
135
135
  branch, tag = branch_or_tag(
136
- env['SYSTEM_PULLREQUEST_SOURCEBRANCH'] ||
137
- env['BUILD_SOURCEBRANCH'] ||
138
- env['BUILD_SOURCEBRANCHNAME']
136
+ env['SYSTEM_PULLREQUEST_SOURCEBRANCH'] || env['BUILD_SOURCEBRANCH'] || env['BUILD_SOURCEBRANCHNAME']
139
137
  )
140
138
 
141
139
  {
@@ -156,7 +154,12 @@ module Datadog
156
154
  Core::Git::Ext::TAG_TAG => tag,
157
155
  Core::Git::Ext::TAG_COMMIT_AUTHOR_NAME => env['BUILD_REQUESTEDFORID'],
158
156
  Core::Git::Ext::TAG_COMMIT_AUTHOR_EMAIL => env['BUILD_REQUESTEDFOREMAIL'],
159
- Core::Git::Ext::TAG_COMMIT_MESSAGE => env['BUILD_SOURCEVERSIONMESSAGE']
157
+ Core::Git::Ext::TAG_COMMIT_MESSAGE => env['BUILD_SOURCEVERSIONMESSAGE'],
158
+ TAG_CI_ENV_VARS => {
159
+ 'SYSTEM_TEAMPROJECTID' => env['SYSTEM_TEAMPROJECTID'],
160
+ 'BUILD_BUILDID' => env['BUILD_BUILDID'],
161
+ 'SYSTEM_JOBID' => env['SYSTEM_JOBID']
162
+ }.to_json
160
163
  }
161
164
  end
162
165
 
@@ -181,6 +184,24 @@ module Datadog
181
184
  }
182
185
  end
183
186
 
187
+ def extract_buddy(env)
188
+ {
189
+ TAG_PROVIDER_NAME => 'buddy',
190
+ TAG_PIPELINE_ID => "#{env['BUDDY_PIPELINE_ID']}/#{env['BUDDY_EXECUTION_ID']}",
191
+ TAG_PIPELINE_NAME => env['BUDDY_PIPELINE_NAME'],
192
+ TAG_PIPELINE_NUMBER => env['BUDDY_EXECUTION_ID'],
193
+ TAG_PIPELINE_URL => env['BUDDY_EXECUTION_URL'],
194
+ TAG_WORKSPACE_PATH => env['CI_WORKSPACE_PATH'],
195
+ Core::Git::Ext::TAG_REPOSITORY_URL => env['BUDDY_SCM_URL'],
196
+ Core::Git::Ext::TAG_COMMIT_SHA => env['BUDDY_EXECUTION_REVISION'],
197
+ Core::Git::Ext::TAG_BRANCH => env['BUDDY_EXECUTION_BRANCH'],
198
+ Core::Git::Ext::TAG_TAG => env['BUDDY_EXECUTION_TAG'],
199
+ Core::Git::Ext::TAG_COMMIT_MESSAGE => env['BUDDY_EXECUTION_REVISION_MESSAGE'],
200
+ Core::Git::Ext::TAG_COMMIT_COMMITTER_NAME => env['BUDDY_EXECUTION_REVISION_COMMITTER_NAME'],
201
+ Core::Git::Ext::TAG_COMMIT_COMMITTER_EMAIL => env['BUDDY_EXECUTION_REVISION_COMMITTER_EMAIL'],
202
+ }
203
+ end
204
+
184
205
  def extract_buildkite(env)
185
206
  {
186
207
  Core::Git::Ext::TAG_BRANCH => env['BUILDKITE_BRANCH'],
@@ -196,7 +217,11 @@ module Datadog
196
217
  TAG_WORKSPACE_PATH => env['BUILDKITE_BUILD_CHECKOUT_PATH'],
197
218
  Core::Git::Ext::TAG_COMMIT_AUTHOR_NAME => env['BUILDKITE_BUILD_AUTHOR'],
198
219
  Core::Git::Ext::TAG_COMMIT_AUTHOR_EMAIL => env['BUILDKITE_BUILD_AUTHOR_EMAIL'],
199
- Core::Git::Ext::TAG_COMMIT_MESSAGE => env['BUILDKITE_MESSAGE']
220
+ Core::Git::Ext::TAG_COMMIT_MESSAGE => env['BUILDKITE_MESSAGE'],
221
+ TAG_CI_ENV_VARS => {
222
+ 'BUILDKITE_BUILD_ID' => env['BUILDKITE_BUILD_ID'],
223
+ 'BUILDKITE_JOB_ID' => env['BUILDKITE_JOB_ID']
224
+ }.to_json
200
225
  }
201
226
  end
202
227
 
@@ -215,7 +240,11 @@ module Datadog
215
240
  TAG_WORKSPACE_PATH => env['CIRCLE_WORKING_DIRECTORY'],
216
241
  Core::Git::Ext::TAG_COMMIT_AUTHOR_NAME => env['BUILD_REQUESTEDFORID'],
217
242
  Core::Git::Ext::TAG_COMMIT_AUTHOR_EMAIL => env['BUILD_REQUESTEDFOREMAIL'],
218
- Core::Git::Ext::TAG_COMMIT_MESSAGE => env['BUILD_SOURCEVERSIONMESSAGE']
243
+ Core::Git::Ext::TAG_COMMIT_MESSAGE => env['BUILD_SOURCEVERSIONMESSAGE'],
244
+ TAG_CI_ENV_VARS => {
245
+ 'CIRCLE_WORKFLOW_ID' => env['CIRCLE_WORKFLOW_ID'],
246
+ 'CIRCLE_BUILD_NUM' => env['CIRCLE_BUILD_NUM']
247
+ }.to_json
219
248
  }
220
249
  end
221
250
 
@@ -233,6 +262,7 @@ module Datadog
233
262
  Core::Git::Ext::TAG_REPOSITORY_URL => "#{env['GITHUB_SERVER_URL']}/#{env['GITHUB_REPOSITORY']}.git",
234
263
  Core::Git::Ext::TAG_TAG => tag,
235
264
  TAG_JOB_URL => "#{env['GITHUB_SERVER_URL']}/#{env['GITHUB_REPOSITORY']}/commit/#{env['GITHUB_SHA']}/checks",
265
+ TAG_JOB_NAME => env['GITHUB_JOB'],
236
266
  TAG_PIPELINE_ID => env['GITHUB_RUN_ID'],
237
267
  TAG_PIPELINE_NAME => env['GITHUB_WORKFLOW'],
238
268
  TAG_PIPELINE_NUMBER => env['GITHUB_RUN_NUMBER'],
@@ -241,7 +271,13 @@ module Datadog
241
271
  TAG_WORKSPACE_PATH => env['GITHUB_WORKSPACE'],
242
272
  Core::Git::Ext::TAG_COMMIT_AUTHOR_NAME => env['BUILD_REQUESTEDFORID'],
243
273
  Core::Git::Ext::TAG_COMMIT_AUTHOR_EMAIL => env['BUILD_REQUESTEDFOREMAIL'],
244
- Core::Git::Ext::TAG_COMMIT_MESSAGE => env['BUILD_SOURCEVERSIONMESSAGE']
274
+ Core::Git::Ext::TAG_COMMIT_MESSAGE => env['BUILD_SOURCEVERSIONMESSAGE'],
275
+ TAG_CI_ENV_VARS => {
276
+ 'GITHUB_SERVER_URL' => env['GITHUB_SERVER_URL'],
277
+ 'GITHUB_REPOSITORY' => env['GITHUB_REPOSITORY'],
278
+ 'GITHUB_RUN_ID' => env['GITHUB_RUN_ID'],
279
+ 'GITHUB_RUN_ATTEMPT' => env['GITHUB_RUN_ATTEMPT'],
280
+ }.reject { |_k, v| v.nil? }.to_json
245
281
  }
246
282
  end
247
283
 
@@ -266,7 +302,12 @@ module Datadog
266
302
  TAG_PIPELINE_URL => (url.gsub(%r{/-/pipelines/}, '/pipelines/') if url),
267
303
  TAG_PROVIDER_NAME => 'gitlab',
268
304
  TAG_WORKSPACE_PATH => env['CI_PROJECT_DIR'],
269
- Core::Git::Ext::TAG_COMMIT_MESSAGE => env['CI_COMMIT_MESSAGE']
305
+ Core::Git::Ext::TAG_COMMIT_MESSAGE => env['CI_COMMIT_MESSAGE'],
306
+ TAG_CI_ENV_VARS => {
307
+ 'CI_PROJECT_URL' => env['CI_PROJECT_URL'],
308
+ 'CI_PIPELINE_ID' => env['CI_PIPELINE_ID'],
309
+ 'CI_JOB_ID' => env['CI_JOB_ID']
310
+ }.to_json
270
311
  }
271
312
  end
272
313
 
@@ -290,7 +331,10 @@ module Datadog
290
331
  TAG_WORKSPACE_PATH => env['WORKSPACE'],
291
332
  Core::Git::Ext::TAG_COMMIT_AUTHOR_NAME => env['BUILD_REQUESTEDFORID'],
292
333
  Core::Git::Ext::TAG_COMMIT_AUTHOR_EMAIL => env['BUILD_REQUESTEDFOREMAIL'],
293
- Core::Git::Ext::TAG_COMMIT_MESSAGE => env['BUILD_SOURCEVERSIONMESSAGE']
334
+ Core::Git::Ext::TAG_COMMIT_MESSAGE => env['BUILD_SOURCEVERSIONMESSAGE'],
335
+ TAG_CI_ENV_VARS => {
336
+ 'DD_CUSTOM_TRACE_ID' => env['DD_CUSTOM_TRACE_ID']
337
+ }.to_json
294
338
  }
295
339
  end
296
340
 
@@ -303,7 +347,7 @@ module Datadog
303
347
  TAG_PIPELINE_ID => env['BUILD_ID'],
304
348
  TAG_PIPELINE_NUMBER => env['BUILD_NUMBER'],
305
349
  TAG_PIPELINE_URL => (
306
- env['SERVER_URL'] && env['BUILD_ID'] ? "#{env['SERVER_URL']}/viewLog.html?buildId=#{env['SERVER_URL']}" : nil
350
+ env['SERVER_URL'] && env['BUILD_ID'] ? "#{env['SERVER_URL']}/viewLog.html?buildId=#{env['BUILD_ID']}" : nil
307
351
  ),
308
352
  Core::Git::Ext::TAG_COMMIT_AUTHOR_NAME => env['BUILD_REQUESTEDFORID'],
309
353
  Core::Git::Ext::TAG_COMMIT_AUTHOR_EMAIL => env['BUILD_REQUESTEDFOREMAIL'],
@@ -138,8 +138,8 @@ module Datadog
138
138
  value: parsed_url && parsed_url.hostname
139
139
  ),
140
140
  DetectedConfiguration.new(
141
- friendly_name: "#{Datadog::Tracing::Configuration::Ext::Transport::ENV_DEFAULT_HOST} environment variable",
142
- value: ENV[Datadog::Tracing::Configuration::Ext::Transport::ENV_DEFAULT_HOST]
141
+ friendly_name: "#{Datadog::Core::Configuration::Ext::Transport::ENV_DEFAULT_HOST} environment variable",
142
+ value: ENV[Datadog::Core::Configuration::Ext::Transport::ENV_DEFAULT_HOST]
143
143
  )
144
144
  )
145
145
  end
@@ -32,10 +32,13 @@ module Datadog
32
32
  option(name) do |o|
33
33
  o.default { settings_class.new }
34
34
  o.lazy
35
+
35
36
  o.resetter do |value|
36
37
  value.reset! if value.respond_to?(:reset!)
37
38
  value
38
39
  end
40
+
41
+ o.type settings_class
39
42
  end
40
43
  end
41
44
 
@@ -248,6 +248,8 @@ module Datadog
248
248
  # NOTE: Please update the Initialization section of ProfilingDevelopment.md with any changes to this method
249
249
 
250
250
  if settings.profiling.advanced.force_enable_new_profiler
251
+ print_new_profiler_warnings
252
+
251
253
  recorder = Datadog::Profiling::StackRecorder.new
252
254
  collector = Datadog::Profiling::Collectors::CpuAndWallTimeWorker.new(
253
255
  recorder: recorder,
@@ -331,20 +333,39 @@ module Datadog
331
333
  end
332
334
 
333
335
  def should_enable_gc_profiling?(settings)
334
- return true if Gem::Version.new(RUBY_VERSION) < Gem::Version.new('3')
335
-
336
336
  # See comments on the setting definition for more context on why it exists.
337
337
  if settings.profiling.advanced.force_enable_gc_profiling
338
- Datadog.logger.debug(
339
- 'Profiling time/resources spent in Garbage Collection force enabled. Do not use Ractors in combination ' \
340
- 'with this option as profiles will be incomplete.'
341
- )
338
+ if Gem::Version.new(RUBY_VERSION) >= Gem::Version.new('3')
339
+ Datadog.logger.debug(
340
+ 'Profiling time/resources spent in Garbage Collection force enabled. Do not use Ractors in combination ' \
341
+ 'with this option as profiles will be incomplete.'
342
+ )
343
+ end
342
344
 
343
345
  true
344
346
  else
345
347
  false
346
348
  end
347
349
  end
350
+
351
+ def print_new_profiler_warnings
352
+ if Gem::Version.new(RUBY_VERSION) >= Gem::Version.new('2.6')
353
+ Datadog.logger.warn(
354
+ 'New Ruby profiler has been force-enabled. This feature is in beta state. We do not yet recommend ' \
355
+ 'running it in production environments. Please report any issues ' \
356
+ 'you run into to Datadog support or via <https://github.com/datadog/dd-trace-rb/issues/new>!'
357
+ )
358
+ else
359
+ # For more details on the issue, see the "BIG Issue" comment on `gvl_owner` function in
360
+ # `private_vm_api_access.c`.
361
+ Datadog.logger.warn(
362
+ 'New Ruby profiler has been force-enabled on a legacy Ruby version (< 2.6). This is not recommended in ' \
363
+ 'production environments, as due to limitations in Ruby APIs, we suspect it may lead to crashes in very ' \
364
+ 'rare situations. Please report any issues you run into to Datadog support or ' \
365
+ 'via <https://github.com/datadog/dd-trace-rb/issues/new>!'
366
+ )
367
+ end
368
+ end
348
369
  end
349
370
 
350
371
  attr_reader \
@@ -0,0 +1,26 @@
1
+ # typed: true
2
+
3
+ module Datadog
4
+ module Core
5
+ module Configuration
6
+ # Constants for configuration settings
7
+ # e.g. Env vars, default values, enums, etc...
8
+ module Ext
9
+ # @public_api
10
+ module Diagnostics
11
+ ENV_DEBUG_ENABLED = 'DD_TRACE_DEBUG'.freeze
12
+ ENV_HEALTH_METRICS_ENABLED = 'DD_HEALTH_METRICS_ENABLED'.freeze
13
+ ENV_STARTUP_LOGS_ENABLED = 'DD_TRACE_STARTUP_LOGS'.freeze
14
+ end
15
+
16
+ module Metrics
17
+ ENV_DEFAULT_PORT = 'DD_METRIC_AGENT_PORT'.freeze
18
+ end
19
+
20
+ module Transport
21
+ ENV_DEFAULT_HOST = 'DD_AGENT_HOST'.freeze
22
+ end
23
+ end
24
+ end
25
+ end
26
+ end
@@ -17,7 +17,8 @@ module Datadog
17
17
  :name,
18
18
  :on_set,
19
19
  :resetter,
20
- :setter
20
+ :setter,
21
+ :type
21
22
 
22
23
  def initialize(name, meta = {}, &block)
23
24
  @default = meta[:default]
@@ -28,6 +29,7 @@ module Datadog
28
29
  @on_set = meta[:on_set]
29
30
  @resetter = meta[:resetter]
30
31
  @setter = meta[:setter] || block || IDENTITY
32
+ @type = meta[:type]
31
33
  end
32
34
 
33
35
  # Creates a new Option, bound to the context provided.
@@ -51,6 +53,7 @@ module Datadog
51
53
  @on_set = nil
52
54
  @resetter = nil
53
55
  @setter = OptionDefinition::IDENTITY
56
+ @type = nil
54
57
 
55
58
  # If options were supplied, apply them.
56
59
  apply_options!(options)
@@ -91,6 +94,10 @@ module Datadog
91
94
  @setter = block
92
95
  end
93
96
 
97
+ def type(value = nil)
98
+ @type = value
99
+ end
100
+
94
101
  # For applying options for OptionDefinition
95
102
  def apply_options!(options = {})
96
103
  return if options.nil? || options.empty?
@@ -102,6 +109,7 @@ module Datadog
102
109
  on_set(&options[:on_set]) if options.key?(:on_set)
103
110
  resetter(&options[:resetter]) if options.key?(:resetter)
104
111
  setter(&options[:setter]) if options.key?(:setter)
112
+ type(&options[:type]) if options.key?(:type)
105
113
  end
106
114
 
107
115
  def to_definition
@@ -116,7 +124,8 @@ module Datadog
116
124
  lazy: @lazy,
117
125
  on_set: @on_set,
118
126
  resetter: @resetter,
119
- setter: @setter
127
+ setter: @setter,
128
+ type: @type
120
129
  }
121
130
  end
122
131
  end