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.
- checksums.yaml +4 -4
- data/CHANGELOG.md +100 -1
- data/README.md +2 -2
- data/ext/ddtrace_profiling_loader/extconf.rb +4 -1
- data/ext/ddtrace_profiling_native_extension/NativeExtensionDesign.md +1 -1
- data/ext/ddtrace_profiling_native_extension/clock_id_from_pthread.c +3 -2
- data/ext/ddtrace_profiling_native_extension/collectors_cpu_and_wall_time.c +24 -50
- data/ext/ddtrace_profiling_native_extension/collectors_cpu_and_wall_time.h +1 -1
- data/ext/ddtrace_profiling_native_extension/collectors_cpu_and_wall_time_worker.c +284 -74
- data/ext/ddtrace_profiling_native_extension/collectors_dynamic_sampling_rate.c +142 -0
- data/ext/ddtrace_profiling_native_extension/collectors_dynamic_sampling_rate.h +14 -0
- data/ext/ddtrace_profiling_native_extension/collectors_idle_sampling_helper.c +241 -0
- data/ext/ddtrace_profiling_native_extension/collectors_idle_sampling_helper.h +3 -0
- data/ext/ddtrace_profiling_native_extension/collectors_stack.c +32 -32
- data/ext/ddtrace_profiling_native_extension/collectors_stack.h +2 -2
- data/ext/ddtrace_profiling_native_extension/extconf.rb +21 -7
- data/ext/ddtrace_profiling_native_extension/helpers.h +5 -0
- data/ext/ddtrace_profiling_native_extension/http_transport.c +50 -49
- data/ext/ddtrace_profiling_native_extension/libdatadog_helpers.h +5 -1
- data/ext/ddtrace_profiling_native_extension/native_extension_helpers.rb +42 -12
- data/ext/ddtrace_profiling_native_extension/private_vm_api_access.c +116 -22
- data/ext/ddtrace_profiling_native_extension/private_vm_api_access.h +9 -0
- data/ext/ddtrace_profiling_native_extension/profiling.c +205 -0
- data/ext/ddtrace_profiling_native_extension/ruby_helpers.c +86 -0
- data/ext/ddtrace_profiling_native_extension/ruby_helpers.h +28 -6
- data/ext/ddtrace_profiling_native_extension/setup_signal_handler.c +23 -4
- data/ext/ddtrace_profiling_native_extension/setup_signal_handler.h +4 -0
- data/ext/ddtrace_profiling_native_extension/stack_recorder.c +47 -50
- data/ext/ddtrace_profiling_native_extension/stack_recorder.h +4 -4
- data/ext/ddtrace_profiling_native_extension/time_helpers.c +17 -0
- data/ext/ddtrace_profiling_native_extension/time_helpers.h +10 -0
- data/lib/datadog/appsec/assets/waf_rules/recommended.json +75 -8
- data/lib/datadog/appsec/assets/waf_rules/risky.json +1 -1
- data/lib/datadog/appsec/assets/waf_rules/strict.json +1 -1
- data/lib/datadog/appsec/assets.rb +1 -1
- data/lib/datadog/appsec/configuration/settings.rb +35 -22
- data/lib/datadog/appsec/configuration.rb +4 -2
- data/lib/datadog/appsec/contrib/auto_instrument.rb +1 -1
- data/lib/datadog/appsec/contrib/configuration/settings.rb +1 -1
- data/lib/datadog/appsec/contrib/integration.rb +1 -1
- data/lib/datadog/appsec/contrib/patcher.rb +1 -1
- data/lib/datadog/appsec/contrib/rack/configuration/settings.rb +1 -1
- data/lib/datadog/appsec/contrib/rack/ext.rb +1 -1
- data/lib/datadog/appsec/contrib/rack/gateway/watcher.rb +1 -1
- data/lib/datadog/appsec/contrib/rack/reactive/request.rb +1 -1
- data/lib/datadog/appsec/contrib/rack/reactive/request_body.rb +1 -1
- data/lib/datadog/appsec/contrib/rack/reactive/response.rb +1 -1
- data/lib/datadog/appsec/contrib/rack/request.rb +1 -1
- data/lib/datadog/appsec/contrib/rack/response.rb +1 -1
- data/lib/datadog/appsec/contrib/rails/configuration/settings.rb +1 -1
- data/lib/datadog/appsec/contrib/rails/ext.rb +1 -1
- data/lib/datadog/appsec/contrib/rails/framework.rb +1 -1
- data/lib/datadog/appsec/contrib/rails/gateway/watcher.rb +1 -1
- data/lib/datadog/appsec/contrib/rails/reactive/action.rb +1 -1
- data/lib/datadog/appsec/contrib/rails/request.rb +1 -1
- data/lib/datadog/appsec/contrib/rails/request_middleware.rb +1 -1
- data/lib/datadog/appsec/contrib/sinatra/configuration/settings.rb +1 -1
- data/lib/datadog/appsec/contrib/sinatra/ext.rb +1 -1
- data/lib/datadog/appsec/contrib/sinatra/framework.rb +1 -1
- data/lib/datadog/appsec/contrib/sinatra/gateway/watcher.rb +1 -1
- data/lib/datadog/appsec/contrib/sinatra/reactive/routed.rb +1 -1
- data/lib/datadog/appsec/contrib/sinatra/request_middleware.rb +1 -1
- data/lib/datadog/appsec/event.rb +1 -1
- data/lib/datadog/appsec/extensions.rb +36 -26
- data/lib/datadog/appsec/instrumentation/gateway.rb +3 -3
- data/lib/datadog/appsec/processor.rb +15 -19
- data/lib/datadog/appsec/rate_limiter.rb +1 -1
- data/lib/datadog/appsec/reactive/address_hash.rb +1 -1
- data/lib/datadog/appsec/reactive/engine.rb +1 -1
- data/lib/datadog/appsec/reactive/operation.rb +2 -2
- data/lib/datadog/appsec/reactive/subscriber.rb +1 -1
- data/lib/datadog/appsec/response.rb +18 -9
- data/lib/datadog/appsec/utils/http/media_range.rb +201 -0
- data/lib/datadog/appsec/utils/http/media_type.rb +87 -0
- data/lib/datadog/appsec/utils/http.rb +9 -0
- data/lib/datadog/appsec/utils.rb +7 -0
- data/lib/datadog/appsec.rb +1 -1
- data/lib/datadog/ci/ext/environment.rb +57 -13
- data/lib/datadog/core/configuration/agent_settings_resolver.rb +2 -2
- data/lib/datadog/core/configuration/base.rb +3 -0
- data/lib/datadog/core/configuration/components.rb +27 -6
- data/lib/datadog/core/configuration/ext.rb +26 -0
- data/lib/datadog/core/configuration/option_definition.rb +11 -2
- data/lib/datadog/core/configuration/settings.rb +16 -341
- data/lib/datadog/core/diagnostics/environment_logger.rb +4 -3
- data/lib/datadog/core/diagnostics/health.rb +4 -22
- data/lib/datadog/core/environment/variable_helpers.rb +58 -10
- data/lib/datadog/core/metrics/client.rb +3 -2
- data/lib/datadog/core/metrics/ext.rb +0 -2
- data/lib/datadog/core/telemetry/collector.rb +1 -0
- data/lib/datadog/core/utils.rb +0 -21
- data/lib/datadog/core.rb +21 -1
- data/lib/datadog/kit/appsec/events.rb +75 -0
- data/lib/datadog/kit/enable_core_dumps.rb +1 -0
- data/lib/datadog/kit/identity.rb +8 -7
- data/lib/datadog/opentelemetry/api/context.rb +187 -0
- data/lib/datadog/opentelemetry/api/trace/span.rb +15 -0
- data/lib/datadog/opentelemetry/sdk/configurator.rb +38 -0
- data/lib/datadog/opentelemetry/sdk/id_generator.rb +27 -0
- data/lib/datadog/opentelemetry/sdk/propagator.rb +91 -0
- data/lib/datadog/opentelemetry/sdk/span_processor.rb +92 -0
- data/lib/datadog/opentelemetry.rb +48 -0
- data/lib/datadog/opentracer/distributed_headers.rb +2 -2
- data/lib/datadog/profiling/collectors/cpu_and_wall_time_worker.rb +16 -5
- data/lib/datadog/profiling/collectors/dynamic_sampling_rate.rb +14 -0
- data/lib/datadog/profiling/collectors/idle_sampling_helper.rb +68 -0
- data/lib/datadog/profiling/stack_recorder.rb +14 -0
- data/lib/datadog/profiling.rb +2 -0
- data/lib/datadog/tracing/configuration/ext.rb +33 -4
- data/lib/datadog/tracing/configuration/settings.rb +433 -0
- data/lib/datadog/tracing/contrib/aws/configuration/settings.rb +4 -1
- data/lib/datadog/tracing/contrib/aws/ext.rb +1 -0
- data/lib/datadog/tracing/contrib/dalli/configuration/settings.rb +4 -1
- data/lib/datadog/tracing/contrib/dalli/ext.rb +1 -0
- data/lib/datadog/tracing/contrib/elasticsearch/configuration/settings.rb +5 -1
- data/lib/datadog/tracing/contrib/elasticsearch/ext.rb +1 -0
- data/lib/datadog/tracing/contrib/ethon/configuration/settings.rb +6 -1
- data/lib/datadog/tracing/contrib/ethon/ext.rb +1 -0
- data/lib/datadog/tracing/contrib/excon/configuration/settings.rb +5 -1
- data/lib/datadog/tracing/contrib/excon/ext.rb +1 -0
- data/lib/datadog/tracing/contrib/faraday/configuration/settings.rb +5 -1
- data/lib/datadog/tracing/contrib/faraday/ext.rb +1 -0
- data/lib/datadog/tracing/contrib/grpc/configuration/settings.rb +6 -1
- data/lib/datadog/tracing/contrib/grpc/distributed/propagation.rb +9 -4
- data/lib/datadog/tracing/contrib/grpc/ext.rb +1 -0
- data/lib/datadog/tracing/contrib/http/configuration/settings.rb +11 -1
- data/lib/datadog/tracing/contrib/http/distributed/fetcher.rb +10 -3
- data/lib/datadog/tracing/contrib/http/distributed/propagation.rb +9 -4
- data/lib/datadog/tracing/contrib/http/ext.rb +2 -0
- data/lib/datadog/tracing/contrib/http/instrumentation.rb +3 -6
- data/lib/datadog/tracing/contrib/httpclient/configuration/settings.rb +11 -1
- data/lib/datadog/tracing/contrib/httpclient/ext.rb +2 -0
- data/lib/datadog/tracing/contrib/httpclient/instrumentation.rb +3 -4
- data/lib/datadog/tracing/contrib/httprb/configuration/settings.rb +11 -1
- data/lib/datadog/tracing/contrib/httprb/ext.rb +2 -0
- data/lib/datadog/tracing/contrib/httprb/instrumentation.rb +3 -4
- data/lib/datadog/tracing/contrib/mongodb/configuration/settings.rb +5 -1
- data/lib/datadog/tracing/contrib/mongodb/ext.rb +1 -0
- data/lib/datadog/tracing/contrib/mysql2/configuration/settings.rb +4 -1
- data/lib/datadog/tracing/contrib/mysql2/ext.rb +1 -0
- data/lib/datadog/tracing/contrib/mysql2/instrumentation.rb +2 -2
- data/lib/datadog/tracing/contrib/patcher.rb +3 -2
- data/lib/datadog/tracing/contrib/pg/configuration/settings.rb +4 -1
- data/lib/datadog/tracing/contrib/pg/ext.rb +1 -0
- data/lib/datadog/tracing/contrib/pg/instrumentation.rb +56 -33
- data/lib/datadog/tracing/contrib/presto/configuration/settings.rb +4 -1
- data/lib/datadog/tracing/contrib/presto/ext.rb +1 -0
- data/lib/datadog/tracing/contrib/propagation/sql_comment/ext.rb +1 -0
- data/lib/datadog/tracing/contrib/propagation/sql_comment.rb +10 -12
- data/lib/datadog/tracing/contrib/redis/configuration/settings.rb +4 -1
- data/lib/datadog/tracing/contrib/redis/ext.rb +1 -0
- data/lib/datadog/tracing/contrib/redis/instrumentation.rb +30 -23
- data/lib/datadog/tracing/contrib/redis/integration.rb +34 -2
- data/lib/datadog/tracing/contrib/redis/patcher.rb +18 -14
- data/lib/datadog/tracing/contrib/redis/quantize.rb +12 -9
- data/lib/datadog/tracing/contrib/redis/tags.rb +4 -6
- data/lib/datadog/tracing/contrib/redis/trace_middleware.rb +72 -0
- data/lib/datadog/tracing/contrib/rest_client/configuration/settings.rb +6 -1
- data/lib/datadog/tracing/contrib/rest_client/ext.rb +1 -0
- data/lib/datadog/tracing/contrib/stripe/configuration/settings.rb +33 -0
- data/lib/datadog/tracing/contrib/stripe/ext.rb +26 -0
- data/lib/datadog/tracing/contrib/stripe/integration.rb +43 -0
- data/lib/datadog/tracing/contrib/stripe/patcher.rb +29 -0
- data/lib/datadog/tracing/contrib/stripe/request.rb +67 -0
- data/lib/datadog/tracing/contrib.rb +1 -0
- data/lib/datadog/{core → tracing}/diagnostics/ext.rb +1 -6
- data/lib/datadog/tracing/diagnostics/health.rb +40 -0
- data/lib/datadog/tracing/distributed/{b3.rb → b3_multi.rb} +2 -2
- data/lib/datadog/tracing/distributed/helpers.rb +2 -1
- data/lib/datadog/tracing/distributed/none.rb +19 -0
- data/lib/datadog/tracing/distributed/trace_context.rb +378 -0
- data/lib/datadog/tracing/metadata/ext.rb +1 -1
- data/lib/datadog/tracing/metadata/tagging.rb +6 -0
- data/lib/datadog/tracing/sampling/priority_sampler.rb +11 -0
- data/lib/datadog/tracing/sampling/rate_sampler.rb +3 -3
- data/lib/datadog/tracing/span.rb +3 -19
- data/lib/datadog/tracing/span_operation.rb +5 -4
- data/lib/datadog/tracing/trace_digest.rb +85 -2
- data/lib/datadog/tracing/trace_operation.rb +13 -4
- data/lib/datadog/tracing/utils.rb +50 -0
- data/lib/ddtrace/version.rb +1 -1
- 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
|
data/lib/datadog/appsec.rb
CHANGED
|
@@ -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['
|
|
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::
|
|
142
|
-
value: ENV[Datadog::
|
|
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
|
|
@@ -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
|
-
|
|
339
|
-
|
|
340
|
-
|
|
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
|