ddtrace 1.12.0 → 1.12.1
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 +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
|