ddtrace 1.12.0 → 1.12.1
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/CHANGELOG.md +25 -1
- data/ext/ddtrace_profiling_native_extension/extconf.rb +2 -0
- data/lib/datadog/appsec/contrib/rack/gateway/request.rb +5 -3
- data/lib/datadog/appsec/contrib/rack/gateway/watcher.rb +18 -36
- data/lib/datadog/appsec/contrib/rack/request_middleware.rb +3 -3
- data/lib/datadog/appsec/contrib/rails/gateway/watcher.rb +6 -24
- data/lib/datadog/appsec/contrib/sinatra/gateway/watcher.rb +12 -30
- data/lib/datadog/appsec/event.rb +34 -34
- data/lib/datadog/appsec/monitor/gateway/watcher.rb +6 -24
- data/lib/datadog/appsec/response.rb +13 -9
- data/lib/datadog/core/configuration/settings.rb +8 -0
- data/lib/datadog/core/remote/client.rb +5 -1
- data/lib/datadog/profiling/component.rb +15 -0
- data/lib/datadog/profiling.rb +2 -1
- data/lib/datadog/tracing/contrib/aws/service/dynamodb.rb +3 -0
- data/lib/datadog/tracing/contrib/aws/service/eventbridge.rb +3 -0
- data/lib/datadog/tracing/contrib/aws/service/kinesis.rb +3 -0
- data/lib/datadog/tracing/contrib/aws/service/s3.rb +3 -0
- data/lib/datadog/tracing/contrib/aws/service/sns.rb +3 -0
- data/lib/datadog/tracing/contrib/aws/service/sqs.rb +3 -0
- data/lib/datadog/tracing/contrib/aws/service/{stepfunctions.rb → states.rb} +3 -0
- data/lib/datadog/tracing/contrib/aws/services.rb +8 -0
- data/lib/ddtrace/version.rb +1 -1
- metadata +3 -3
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 7755d42a1b84dda8386f13ce2edc3854f09e1e227d5786546b19ea31a60cc03b
|
4
|
+
data.tar.gz: 57ee6f72d29b72305c8272b98dc4b7d08a66f9463820d9963aa487723094d1f7
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: e9c5d234fb1261e202bf8d4ae00417f31f325dbcc9ceb9081277ac96a04114316456fed6d21f3de343dbe6192e4a0ceccb4504e5b1a59bbb44fe2666042a7890
|
7
|
+
data.tar.gz: effa42b2181771676d69ea5efb946cd6bd4617853b36f75b9655a710d369f57a200dded1cdc8b86642eaf60174c20b44da3b3de29fbfddfd76c6845364927fe2
|
data/CHANGELOG.md
CHANGED
@@ -2,6 +2,22 @@
|
|
2
2
|
|
3
3
|
## [Unreleased]
|
4
4
|
|
5
|
+
## [1.12.1] - 2023-06-14
|
6
|
+
|
7
|
+
### Added
|
8
|
+
Appsec: Add `appsec.blocked` tag to span ([#2895][])
|
9
|
+
Profiling: Add workaround for legacy profiler incompatibility with ruby-cloud-profiler gem ([#2891][])
|
10
|
+
Core: Allow setting remote configuration service name ([#2853][])
|
11
|
+
|
12
|
+
### Changed
|
13
|
+
Appsec: Change the value format for the WAF address `server.request.query` ([#2903][])
|
14
|
+
Profiling: Log pkg-config command when building profiling native extension
|
15
|
+
|
16
|
+
### Fixed
|
17
|
+
Appsec: Update blocked response content_type resolution ([#2900][])
|
18
|
+
Appsec: Ensure to use service entry span. ([#2898][])
|
19
|
+
Tracing: Fix AWS integration constant loading ([#2896][])
|
20
|
+
|
5
21
|
## [1.12.0] - 2023-06-02
|
6
22
|
|
7
23
|
### Added
|
@@ -2438,7 +2454,8 @@ Release notes: https://github.com/DataDog/dd-trace-rb/releases/tag/v0.3.1
|
|
2438
2454
|
|
2439
2455
|
Git diff: https://github.com/DataDog/dd-trace-rb/compare/v0.3.0...v0.3.1
|
2440
2456
|
|
2441
|
-
[Unreleased]: https://github.com/DataDog/dd-trace-rb/compare/v1.12.
|
2457
|
+
[Unreleased]: https://github.com/DataDog/dd-trace-rb/compare/v1.12.1...master
|
2458
|
+
[1.12.1]: https://github.com/DataDog/dd-trace-rb/compare/v1.12.0...v1.12.1
|
2442
2459
|
[1.12.0]: https://github.com/DataDog/dd-trace-rb/compare/v1.11.1...v1.12.0
|
2443
2460
|
[1.11.1]: https://github.com/DataDog/dd-trace-rb/compare/v1.10.1...v1.11.1
|
2444
2461
|
[1.11.0]: https://github.com/DataDog/dd-trace-rb/compare/v1.10.1...v1.11.0
|
@@ -3504,6 +3521,7 @@ Git diff: https://github.com/DataDog/dd-trace-rb/compare/v0.3.0...v0.3.1
|
|
3504
3521
|
[#2829]: https://github.com/DataDog/dd-trace-rb/issues/2829
|
3505
3522
|
[#2836]: https://github.com/DataDog/dd-trace-rb/issues/2836
|
3506
3523
|
[#2840]: https://github.com/DataDog/dd-trace-rb/issues/2840
|
3524
|
+
[#2853]: https://github.com/DataDog/dd-trace-rb/issues/2853
|
3507
3525
|
[#2854]: https://github.com/DataDog/dd-trace-rb/issues/2854
|
3508
3526
|
[#2855]: https://github.com/DataDog/dd-trace-rb/issues/2855
|
3509
3527
|
[#2856]: https://github.com/DataDog/dd-trace-rb/issues/2856
|
@@ -3517,6 +3535,12 @@ Git diff: https://github.com/DataDog/dd-trace-rb/compare/v0.3.0...v0.3.1
|
|
3517
3535
|
[#2875]: https://github.com/DataDog/dd-trace-rb/issues/2875
|
3518
3536
|
[#2883]: https://github.com/DataDog/dd-trace-rb/issues/2883
|
3519
3537
|
[#2890]: https://github.com/DataDog/dd-trace-rb/issues/2890
|
3538
|
+
[#2891]: https://github.com/DataDog/dd-trace-rb/issues/2891
|
3539
|
+
[#2895]: https://github.com/DataDog/dd-trace-rb/issues/2895
|
3540
|
+
[#2896]: https://github.com/DataDog/dd-trace-rb/issues/2896
|
3541
|
+
[#2898]: https://github.com/DataDog/dd-trace-rb/issues/2898
|
3542
|
+
[#2900]: https://github.com/DataDog/dd-trace-rb/issues/2900
|
3543
|
+
[#2903]: https://github.com/DataDog/dd-trace-rb/issues/2903
|
3520
3544
|
[@AdrianLC]: https://github.com/AdrianLC
|
3521
3545
|
[@Azure7111]: https://github.com/Azure7111
|
3522
3546
|
[@BabyGroot]: https://github.com/BabyGroot
|
@@ -175,6 +175,8 @@ Logging.message("[ddtrace] PKG_CONFIG_PATH set to #{ENV['PKG_CONFIG_PATH'].inspe
|
|
175
175
|
$stderr.puts("Using libdatadog #{Libdatadog::VERSION} from #{Libdatadog.pkgconfig_folder}")
|
176
176
|
|
177
177
|
unless pkg_config('datadog_profiling_with_rpath')
|
178
|
+
Logging.message("[ddtrace] Ruby detected the pkg-config command is #{$PKGCONFIG.inspect}\n")
|
179
|
+
|
178
180
|
skip_building_extension!(
|
179
181
|
if Datadog::Profiling::NativeExtensionHelpers::Supported.pkg_config_missing?
|
180
182
|
Datadog::Profiling::NativeExtensionHelpers::Supported::PKG_CONFIG_IS_MISSING
|
@@ -25,11 +25,13 @@ module Datadog
|
|
25
25
|
def query
|
26
26
|
# Downstream libddwaf expects keys and values to be extractable
|
27
27
|
# separately so we can't use [[k, v], ...]. We also want to allow
|
28
|
-
# duplicate keys, so we use
|
29
|
-
|
28
|
+
# duplicate keys, so we use {k => [v, ...], ...} instead, taking into
|
29
|
+
# account that {k => [v1, v2, ...], ...} is possible for duplicate keys.
|
30
|
+
request.query_string.split('&').each.with_object({}) do |e, hash|
|
30
31
|
k, v = e.split('=').map { |s| CGI.unescape(s) }
|
32
|
+
hash[k] ||= []
|
31
33
|
|
32
|
-
|
34
|
+
hash[k] << v
|
33
35
|
end
|
34
36
|
end
|
35
37
|
|
@@ -28,21 +28,21 @@ module Datadog
|
|
28
28
|
scope = gateway_request.env[Datadog::AppSec::Ext::SCOPE_KEY]
|
29
29
|
|
30
30
|
AppSec::Reactive::Operation.new('rack.request') do |op|
|
31
|
-
trace = active_trace
|
32
|
-
span = active_span
|
33
|
-
|
34
31
|
Rack::Reactive::Request.subscribe(op, scope.processor_context) do |result, _block|
|
35
32
|
if result.status == :match
|
36
33
|
# TODO: should this hash be an Event instance instead?
|
37
34
|
event = {
|
38
35
|
waf_result: result,
|
39
|
-
trace: trace,
|
40
|
-
span:
|
36
|
+
trace: scope.trace,
|
37
|
+
span: scope.service_entry_span,
|
41
38
|
request: gateway_request,
|
42
39
|
actions: result.actions
|
43
40
|
}
|
44
41
|
|
45
|
-
|
42
|
+
if scope.service_entry_span
|
43
|
+
scope.service_entry_span.set_tag('appsec.blocked', 'true') if result.actions.include?('block')
|
44
|
+
scope.service_entry_span.set_tag('appsec.event', 'true')
|
45
|
+
end
|
46
46
|
|
47
47
|
scope.processor_context.events << event
|
48
48
|
end
|
@@ -71,21 +71,21 @@ module Datadog
|
|
71
71
|
scope = gateway_response.scope
|
72
72
|
|
73
73
|
AppSec::Reactive::Operation.new('rack.response') do |op|
|
74
|
-
trace = active_trace
|
75
|
-
span = active_span
|
76
|
-
|
77
74
|
Rack::Reactive::Response.subscribe(op, scope.processor_context) do |result, _block|
|
78
75
|
if result.status == :match
|
79
76
|
# TODO: should this hash be an Event instance instead?
|
80
77
|
event = {
|
81
78
|
waf_result: result,
|
82
|
-
trace: trace,
|
83
|
-
span:
|
79
|
+
trace: scope.trace,
|
80
|
+
span: scope.service_entry_span,
|
84
81
|
response: gateway_response,
|
85
82
|
actions: result.actions
|
86
83
|
}
|
87
84
|
|
88
|
-
|
85
|
+
if scope.service_entry_span
|
86
|
+
scope.service_entry_span.set_tag('appsec.blocked', 'true') if result.actions.include?('block')
|
87
|
+
scope.service_entry_span.set_tag('appsec.event', 'true')
|
88
|
+
end
|
89
89
|
|
90
90
|
scope.processor_context.events << event
|
91
91
|
end
|
@@ -114,21 +114,21 @@ module Datadog
|
|
114
114
|
scope = gateway_request.env[Datadog::AppSec::Ext::SCOPE_KEY]
|
115
115
|
|
116
116
|
AppSec::Reactive::Operation.new('rack.request.body') do |op|
|
117
|
-
trace = active_trace
|
118
|
-
span = active_span
|
119
|
-
|
120
117
|
Rack::Reactive::RequestBody.subscribe(op, scope.processor_context) do |result, _block|
|
121
118
|
if result.status == :match
|
122
119
|
# TODO: should this hash be an Event instance instead?
|
123
120
|
event = {
|
124
121
|
waf_result: result,
|
125
|
-
trace: trace,
|
126
|
-
span:
|
122
|
+
trace: scope.trace,
|
123
|
+
span: scope.service_entry_span,
|
127
124
|
request: gateway_request,
|
128
125
|
actions: result.actions
|
129
126
|
}
|
130
127
|
|
131
|
-
|
128
|
+
if scope.service_entry_span
|
129
|
+
scope.service_entry_span.set_tag('appsec.blocked', 'true') if result.actions.include?('block')
|
130
|
+
scope.service_entry_span.set_tag('appsec.event', 'true')
|
131
|
+
end
|
132
132
|
|
133
133
|
scope.processor_context.events << event
|
134
134
|
end
|
@@ -149,24 +149,6 @@ module Datadog
|
|
149
149
|
[ret, res]
|
150
150
|
end
|
151
151
|
end
|
152
|
-
|
153
|
-
private
|
154
|
-
|
155
|
-
def active_trace
|
156
|
-
# TODO: factor out tracing availability detection
|
157
|
-
|
158
|
-
return unless defined?(Datadog::Tracing)
|
159
|
-
|
160
|
-
Datadog::Tracing.active_trace
|
161
|
-
end
|
162
|
-
|
163
|
-
def active_span
|
164
|
-
# TODO: factor out tracing availability detection
|
165
|
-
|
166
|
-
return unless defined?(Datadog::Tracing)
|
167
|
-
|
168
|
-
Datadog::Tracing.active_span
|
169
|
-
end
|
170
152
|
end
|
171
153
|
end
|
172
154
|
end
|
@@ -53,7 +53,7 @@ module Datadog
|
|
53
53
|
|
54
54
|
gateway_request = Gateway::Request.new(env)
|
55
55
|
|
56
|
-
add_appsec_tags(processor,
|
56
|
+
add_appsec_tags(processor, scope.trace, scope.service_entry_span, env)
|
57
57
|
|
58
58
|
request_return, request_response = catch(::Datadog::AppSec::Ext::INTERRUPT) do
|
59
59
|
Instrumentation.gateway.push('rack.request', gateway_request) do
|
@@ -79,7 +79,7 @@ module Datadog
|
|
79
79
|
e[:request] ||= gateway_request
|
80
80
|
end
|
81
81
|
|
82
|
-
AppSec::Event.record(
|
82
|
+
AppSec::Event.record(scope.service_entry_span, *scope.processor_context.events)
|
83
83
|
|
84
84
|
if response_response && response_response.any? { |action, _event| action == :block }
|
85
85
|
request_return = AppSec::Response.negotiate(env).to_rack
|
@@ -88,7 +88,7 @@ module Datadog
|
|
88
88
|
request_return
|
89
89
|
ensure
|
90
90
|
if scope
|
91
|
-
add_waf_runtime_tags(
|
91
|
+
add_waf_runtime_tags(scope.service_entry_span, scope.processor_context)
|
92
92
|
Datadog::AppSec::Scope.deactivate_scope
|
93
93
|
end
|
94
94
|
end
|
@@ -24,21 +24,21 @@ module Datadog
|
|
24
24
|
scope = gateway_request.env[Datadog::AppSec::Ext::SCOPE_KEY]
|
25
25
|
|
26
26
|
AppSec::Reactive::Operation.new('rails.request.action') do |op|
|
27
|
-
trace = active_trace
|
28
|
-
span = active_span
|
29
|
-
|
30
27
|
Rails::Reactive::Action.subscribe(op, scope.processor_context) do |result, _block|
|
31
28
|
if result.status == :match
|
32
29
|
# TODO: should this hash be an Event instance instead?
|
33
30
|
event = {
|
34
31
|
waf_result: result,
|
35
|
-
trace: trace,
|
36
|
-
span:
|
32
|
+
trace: scope.trace,
|
33
|
+
span: scope.service_entry_span,
|
37
34
|
request: gateway_request,
|
38
35
|
actions: result.actions
|
39
36
|
}
|
40
37
|
|
41
|
-
|
38
|
+
if scope.service_entry_span
|
39
|
+
scope.service_entry_span.set_tag('appsec.blocked', 'true') if result.actions.include?('block')
|
40
|
+
scope.service_entry_span.set_tag('appsec.event', 'true')
|
41
|
+
end
|
42
42
|
|
43
43
|
scope.processor_context.events << event
|
44
44
|
end
|
@@ -59,24 +59,6 @@ module Datadog
|
|
59
59
|
[ret, res]
|
60
60
|
end
|
61
61
|
end
|
62
|
-
|
63
|
-
private
|
64
|
-
|
65
|
-
def active_trace
|
66
|
-
# TODO: factor out tracing availability detection
|
67
|
-
|
68
|
-
return unless defined?(Datadog::Tracing)
|
69
|
-
|
70
|
-
Datadog::Tracing.active_trace
|
71
|
-
end
|
72
|
-
|
73
|
-
def active_span
|
74
|
-
# TODO: factor out tracing availability detection
|
75
|
-
|
76
|
-
return unless defined?(Datadog::Tracing)
|
77
|
-
|
78
|
-
Datadog::Tracing.active_span
|
79
|
-
end
|
80
62
|
end
|
81
63
|
end
|
82
64
|
end
|
@@ -26,21 +26,21 @@ module Datadog
|
|
26
26
|
scope = gateway_request.env[Datadog::AppSec::Ext::SCOPE_KEY]
|
27
27
|
|
28
28
|
AppSec::Reactive::Operation.new('sinatra.request.dispatch') do |op|
|
29
|
-
trace = active_trace
|
30
|
-
span = active_span
|
31
|
-
|
32
29
|
Rack::Reactive::RequestBody.subscribe(op, scope.processor_context) do |result, _block|
|
33
30
|
if result.status == :match
|
34
31
|
# TODO: should this hash be an Event instance instead?
|
35
32
|
event = {
|
36
33
|
waf_result: result,
|
37
|
-
trace: trace,
|
38
|
-
span:
|
34
|
+
trace: scope.trace,
|
35
|
+
span: scope.service_entry_span,
|
39
36
|
request: gateway_request,
|
40
37
|
actions: result.actions
|
41
38
|
}
|
42
39
|
|
43
|
-
|
40
|
+
if scope.service_entry_span
|
41
|
+
scope.service_entry_span.set_tag('appsec.blocked', 'true') if result.actions.include?('block')
|
42
|
+
scope.service_entry_span.set_tag('appsec.event', 'true')
|
43
|
+
end
|
44
44
|
|
45
45
|
scope.processor_context.events << event
|
46
46
|
end
|
@@ -69,21 +69,21 @@ module Datadog
|
|
69
69
|
scope = gateway_request.env[Datadog::AppSec::Ext::SCOPE_KEY]
|
70
70
|
|
71
71
|
AppSec::Reactive::Operation.new('sinatra.request.routed') do |op|
|
72
|
-
trace = active_trace
|
73
|
-
span = active_span
|
74
|
-
|
75
72
|
Sinatra::Reactive::Routed.subscribe(op, scope.processor_context) do |result, _block|
|
76
73
|
if result.status == :match
|
77
74
|
# TODO: should this hash be an Event instance instead?
|
78
75
|
event = {
|
79
76
|
waf_result: result,
|
80
|
-
trace: trace,
|
81
|
-
span:
|
77
|
+
trace: scope.trace,
|
78
|
+
span: scope.service_entry_span,
|
82
79
|
request: gateway_request,
|
83
80
|
actions: result.actions
|
84
81
|
}
|
85
82
|
|
86
|
-
|
83
|
+
if scope.service_entry_span
|
84
|
+
scope.service_entry_span.set_tag('appsec.blocked', 'true') if result.actions.include?('block')
|
85
|
+
scope.service_entry_span.set_tag('appsec.event', 'true')
|
86
|
+
end
|
87
87
|
|
88
88
|
scope.processor_context.events << event
|
89
89
|
end
|
@@ -104,24 +104,6 @@ module Datadog
|
|
104
104
|
[ret, res]
|
105
105
|
end
|
106
106
|
end
|
107
|
-
|
108
|
-
private
|
109
|
-
|
110
|
-
def active_trace
|
111
|
-
# TODO: factor out tracing availability detection
|
112
|
-
|
113
|
-
return unless defined?(Datadog::Tracing)
|
114
|
-
|
115
|
-
Datadog::Tracing.active_trace
|
116
|
-
end
|
117
|
-
|
118
|
-
def active_span
|
119
|
-
# TODO: factor out tracing availability detection
|
120
|
-
|
121
|
-
return unless defined?(Datadog::Tracing)
|
122
|
-
|
123
|
-
Datadog::Tracing.active_span
|
124
|
-
end
|
125
107
|
end
|
126
108
|
end
|
127
109
|
end
|
data/lib/datadog/appsec/event.rb
CHANGED
@@ -47,7 +47,6 @@ module Datadog
|
|
47
47
|
end
|
48
48
|
end
|
49
49
|
|
50
|
-
# rubocop:disable Metrics/MethodLength
|
51
50
|
def self.record_via_span(span, *events)
|
52
51
|
events.group_by { |e| e[:trace] }.each do |trace, event_group|
|
53
52
|
unless trace
|
@@ -62,52 +61,53 @@ module Datadog
|
|
62
61
|
)
|
63
62
|
|
64
63
|
# prepare and gather tags to apply
|
65
|
-
|
66
|
-
|
64
|
+
service_entry_tags = build_service_entry_tags(event_group)
|
65
|
+
# complex types are unsupported, we need to serialize to a string
|
66
|
+
triggers = service_entry_tags.delete('_dd.appsec.triggers')
|
67
|
+
span.set_tag('_dd.appsec.json', JSON.dump({ triggers: triggers }))
|
67
68
|
|
68
|
-
|
69
|
-
|
70
|
-
|
71
|
-
|
69
|
+
# apply tags to service entry span
|
70
|
+
service_entry_tags.each do |key, value|
|
71
|
+
span.set_tag(key, value)
|
72
|
+
end
|
73
|
+
end
|
74
|
+
end
|
72
75
|
|
73
|
-
|
74
|
-
|
75
|
-
|
76
|
+
def self.build_service_entry_tags(event_group)
|
77
|
+
event_group.each_with_object({}) do |event, tags|
|
78
|
+
# TODO: assume HTTP request context for now
|
76
79
|
|
77
|
-
|
78
|
-
|
79
|
-
|
80
|
+
if (request = event[:request])
|
81
|
+
request_headers = request.headers.select do |k, _|
|
82
|
+
ALLOWED_REQUEST_HEADERS.include?(k.downcase)
|
80
83
|
end
|
81
84
|
|
82
|
-
|
83
|
-
|
84
|
-
ALLOWED_RESPONSE_HEADERS.include?(k.downcase)
|
85
|
-
end
|
86
|
-
|
87
|
-
response_headers.each do |header, value|
|
88
|
-
tags["http.response.headers.#{header}"] = value
|
89
|
-
end
|
85
|
+
request_headers.each do |header, value|
|
86
|
+
tags["http.request.headers.#{header}"] = value
|
90
87
|
end
|
91
88
|
|
92
|
-
tags['
|
93
|
-
|
94
|
-
|
95
|
-
tags['_dd.appsec.triggers'] ||= []
|
96
|
-
tags['_dd.appsec.triggers'] += event[:waf_result].data
|
89
|
+
tags['http.host'] = request.host
|
90
|
+
tags['http.useragent'] = request.user_agent
|
91
|
+
tags['network.client.ip'] = request.remote_addr
|
97
92
|
end
|
98
93
|
|
99
|
-
|
100
|
-
|
101
|
-
|
102
|
-
|
103
|
-
span.set_tag('_dd.appsec.json', JSON.dump({ triggers: triggers }))
|
94
|
+
if (response = event[:response])
|
95
|
+
response_headers = response.headers.select do |k, _|
|
96
|
+
ALLOWED_RESPONSE_HEADERS.include?(k.downcase)
|
97
|
+
end
|
104
98
|
|
105
|
-
|
106
|
-
|
99
|
+
response_headers.each do |header, value|
|
100
|
+
tags["http.response.headers.#{header}"] = value
|
101
|
+
end
|
107
102
|
end
|
103
|
+
|
104
|
+
tags['_dd.origin'] = 'appsec'
|
105
|
+
|
106
|
+
# accumulate triggers
|
107
|
+
tags['_dd.appsec.triggers'] ||= []
|
108
|
+
tags['_dd.appsec.triggers'] += event[:waf_result].data
|
108
109
|
end
|
109
110
|
end
|
110
|
-
# rubocop:enable Metrics/MethodLength
|
111
111
|
end
|
112
112
|
end
|
113
113
|
end
|
@@ -24,21 +24,21 @@ module Datadog
|
|
24
24
|
scope = Datadog::AppSec.active_scope
|
25
25
|
|
26
26
|
AppSec::Reactive::Operation.new('identity.set_user') do |op|
|
27
|
-
trace = active_trace
|
28
|
-
span = active_span
|
29
|
-
|
30
27
|
Monitor::Reactive::SetUser.subscribe(op, scope.processor_context) do |result, _block|
|
31
28
|
if result.status == :match
|
32
29
|
# TODO: should this hash be an Event instance instead?
|
33
30
|
event = {
|
34
31
|
waf_result: result,
|
35
|
-
trace: trace,
|
36
|
-
span:
|
32
|
+
trace: scope.trace,
|
33
|
+
span: scope.service_entry_span,
|
37
34
|
user: user,
|
38
35
|
actions: result.actions
|
39
36
|
}
|
40
37
|
|
41
|
-
|
38
|
+
if scope.service_entry_span
|
39
|
+
scope.service_entry_span.set_tag('appsec.blocked', 'true') if result.actions.include?('block')
|
40
|
+
scope.service_entry_span.set_tag('appsec.event', 'true')
|
41
|
+
end
|
42
42
|
|
43
43
|
scope.processor_context.events << event
|
44
44
|
end
|
@@ -59,24 +59,6 @@ module Datadog
|
|
59
59
|
[ret, res]
|
60
60
|
end
|
61
61
|
end
|
62
|
-
|
63
|
-
private
|
64
|
-
|
65
|
-
def active_trace
|
66
|
-
# TODO: factor out tracing availability detection
|
67
|
-
|
68
|
-
return unless defined?(Datadog::Tracing)
|
69
|
-
|
70
|
-
Datadog::Tracing.active_trace
|
71
|
-
end
|
72
|
-
|
73
|
-
def active_span
|
74
|
-
# TODO: factor out tracing availability detection
|
75
|
-
|
76
|
-
return unless defined?(Datadog::Tracing)
|
77
|
-
|
78
|
-
Datadog::Tracing.active_span
|
79
|
-
end
|
80
62
|
end
|
81
63
|
end
|
82
64
|
end
|
@@ -36,30 +36,34 @@ module Datadog
|
|
36
36
|
Response.new(
|
37
37
|
status: 403,
|
38
38
|
headers: { 'Content-Type' => content_type },
|
39
|
-
body: [Datadog::AppSec::Assets.blocked(format:
|
39
|
+
body: [Datadog::AppSec::Assets.blocked(format: CONTENT_TYPE_TO_FORMAT[content_type])]
|
40
40
|
)
|
41
41
|
end
|
42
42
|
|
43
43
|
private
|
44
44
|
|
45
|
-
|
46
|
-
'text/plain' => :text,
|
47
|
-
'text/html' => :html,
|
45
|
+
CONTENT_TYPE_TO_FORMAT = {
|
48
46
|
'application/json' => :json,
|
47
|
+
'text/html' => :html,
|
48
|
+
'text/plain' => :text,
|
49
49
|
}.freeze
|
50
50
|
|
51
|
-
DEFAULT_CONTENT_TYPE = '
|
51
|
+
DEFAULT_CONTENT_TYPE = 'application/json'
|
52
52
|
|
53
53
|
def content_type(env)
|
54
54
|
return DEFAULT_CONTENT_TYPE unless env.key?('HTTP_ACCEPT')
|
55
55
|
|
56
|
-
|
56
|
+
accept_types = env['HTTP_ACCEPT'].split(',').map(&:strip)
|
57
57
|
|
58
|
-
accepted.
|
59
|
-
match = FORMAT_MAP.keys.find { |type| range === type }
|
58
|
+
accepted = accept_types.map { |m| Utils::HTTP::MediaRange.new(m) }.sort!.reverse!
|
60
59
|
|
61
|
-
|
60
|
+
accepted.each do |range|
|
61
|
+
type_match = CONTENT_TYPE_TO_FORMAT.keys.find { |type| range === type }
|
62
|
+
|
63
|
+
return type_match if type_match
|
62
64
|
end
|
65
|
+
|
66
|
+
DEFAULT_CONTENT_TYPE
|
63
67
|
rescue Datadog::AppSec::Utils::HTTP::MediaRange::ParseError
|
64
68
|
DEFAULT_CONTENT_TYPE
|
65
69
|
end
|
@@ -549,6 +549,14 @@ module Datadog
|
|
549
549
|
o.default { env_to_float(Core::Remote::Ext::ENV_POLL_INTERVAL_SECONDS, 5.0) }
|
550
550
|
o.lazy
|
551
551
|
end
|
552
|
+
|
553
|
+
# Declare service name to bind to remote configuration. Use when
|
554
|
+
# DD_SERVICE does not match the correct integration for which remote
|
555
|
+
# configuration applies.
|
556
|
+
#
|
557
|
+
# @default `nil`.
|
558
|
+
# @return [String,nil]
|
559
|
+
option :service
|
552
560
|
end
|
553
561
|
|
554
562
|
# TODO: Tracing should manage its own settings.
|
@@ -136,7 +136,7 @@ module Datadog
|
|
136
136
|
runtime_id: Core::Environment::Identity.id,
|
137
137
|
language: Core::Environment::Identity.lang,
|
138
138
|
tracer_version: tracer_version_semver2,
|
139
|
-
service:
|
139
|
+
service: service_name,
|
140
140
|
env: Datadog.configuration.env,
|
141
141
|
tags: client_tracer_tags,
|
142
142
|
}
|
@@ -167,6 +167,10 @@ module Datadog
|
|
167
167
|
}
|
168
168
|
end
|
169
169
|
|
170
|
+
def service_name
|
171
|
+
Datadog.configuration.remote.service || Datadog.configuration.service
|
172
|
+
end
|
173
|
+
|
170
174
|
def tracer_version_semver2
|
171
175
|
@tracer_version_semver2 ||= Core::Environment::Identity.tracer_version_semver2
|
172
176
|
end
|
@@ -79,6 +79,8 @@ module Datadog
|
|
79
79
|
no_signals_workaround_enabled: no_signals_workaround_enabled?(settings),
|
80
80
|
)
|
81
81
|
else
|
82
|
+
load_pprof_support
|
83
|
+
|
82
84
|
recorder = build_profiler_old_recorder(settings)
|
83
85
|
collector = build_profiler_oldstack_collector(settings, recorder, optional_tracer)
|
84
86
|
end
|
@@ -255,6 +257,19 @@ module Datadog
|
|
255
257
|
true
|
256
258
|
end
|
257
259
|
end
|
260
|
+
|
261
|
+
# The old profiler's pprof support conflicts with the ruby-cloud-profiler gem.
|
262
|
+
#
|
263
|
+
# This is not a problem for almost all customers, since we now default everyone to use the new CPU Profiling 2.0
|
264
|
+
# profiler. But the issue was still triggered, because currently we still _load_ both the old and new profiling
|
265
|
+
# code paths.
|
266
|
+
#
|
267
|
+
# To work around this issue, and because we plan on deleting the old profiler soon, rather than poking at the
|
268
|
+
# pprof support code, we only load the conflicting file when the old profiler is in use. This way customers using
|
269
|
+
# the new profiler will not be affected by the issue any longer.
|
270
|
+
private_class_method def self.load_pprof_support
|
271
|
+
require_relative 'pprof/pprof_pb'
|
272
|
+
end
|
258
273
|
end
|
259
274
|
end
|
260
275
|
end
|
data/lib/datadog/profiling.rb
CHANGED
@@ -197,7 +197,8 @@ module Datadog
|
|
197
197
|
require_relative 'profiling/profiler'
|
198
198
|
require_relative 'profiling/native_extension'
|
199
199
|
require_relative 'profiling/trace_identifiers/helper'
|
200
|
-
|
200
|
+
# This file is loaded in Profiling::Component#load_pprof_support; see notes there for why
|
201
|
+
# require_relative 'profiling/pprof/pprof_pb'
|
201
202
|
require_relative 'profiling/tag_builder'
|
202
203
|
require_relative 'profiling/http_transport'
|
203
204
|
|
@@ -1,3 +1,11 @@
|
|
1
|
+
require_relative './service/sqs'
|
2
|
+
require_relative './service/sns'
|
3
|
+
require_relative './service/dynamodb'
|
4
|
+
require_relative './service/kinesis'
|
5
|
+
require_relative './service/eventbridge'
|
6
|
+
require_relative './service/states'
|
7
|
+
require_relative './service/s3'
|
8
|
+
|
1
9
|
module Datadog
|
2
10
|
module Tracing
|
3
11
|
module Contrib
|
data/lib/ddtrace/version.rb
CHANGED
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: ddtrace
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 1.12.
|
4
|
+
version: 1.12.1
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Datadog, Inc.
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2023-06-
|
11
|
+
date: 2023-06-14 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: msgpack
|
@@ -495,7 +495,7 @@ files:
|
|
495
495
|
- lib/datadog/tracing/contrib/aws/service/s3.rb
|
496
496
|
- lib/datadog/tracing/contrib/aws/service/sns.rb
|
497
497
|
- lib/datadog/tracing/contrib/aws/service/sqs.rb
|
498
|
-
- lib/datadog/tracing/contrib/aws/service/
|
498
|
+
- lib/datadog/tracing/contrib/aws/service/states.rb
|
499
499
|
- lib/datadog/tracing/contrib/aws/services.rb
|
500
500
|
- lib/datadog/tracing/contrib/concurrent_ruby/configuration/settings.rb
|
501
501
|
- lib/datadog/tracing/contrib/concurrent_ruby/context_composite_executor_service.rb
|