ddtrace 1.7.0 → 1.9.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 (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