datadog 2.16.0 → 2.18.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 +72 -1
- data/ext/datadog_profiling_native_extension/collectors_cpu_and_wall_time_worker.c +12 -46
- data/ext/datadog_profiling_native_extension/collectors_stack.c +227 -49
- data/ext/datadog_profiling_native_extension/collectors_stack.h +19 -3
- data/ext/datadog_profiling_native_extension/collectors_thread_context.c +63 -12
- data/ext/datadog_profiling_native_extension/collectors_thread_context.h +1 -0
- data/ext/datadog_profiling_native_extension/encoded_profile.c +22 -12
- data/ext/datadog_profiling_native_extension/encoded_profile.h +1 -0
- data/ext/datadog_profiling_native_extension/extconf.rb +7 -0
- data/ext/datadog_profiling_native_extension/heap_recorder.c +239 -363
- data/ext/datadog_profiling_native_extension/heap_recorder.h +4 -6
- data/ext/datadog_profiling_native_extension/http_transport.c +45 -72
- data/ext/datadog_profiling_native_extension/libdatadog_helpers.c +22 -0
- data/ext/datadog_profiling_native_extension/libdatadog_helpers.h +8 -5
- data/ext/datadog_profiling_native_extension/private_vm_api_access.c +1 -0
- data/ext/datadog_profiling_native_extension/private_vm_api_access.h +6 -3
- data/ext/datadog_profiling_native_extension/ruby_helpers.c +1 -13
- data/ext/datadog_profiling_native_extension/ruby_helpers.h +2 -10
- data/ext/datadog_profiling_native_extension/stack_recorder.c +156 -60
- data/ext/libdatadog_api/crashtracker.c +10 -3
- data/ext/libdatadog_api/extconf.rb +2 -2
- data/ext/libdatadog_api/library_config.c +54 -12
- data/ext/libdatadog_api/library_config.h +6 -0
- data/ext/libdatadog_api/macos_development.md +3 -3
- data/ext/libdatadog_api/process_discovery.c +2 -7
- data/ext/libdatadog_extconf_helpers.rb +2 -2
- data/lib/datadog/appsec/api_security/lru_cache.rb +56 -0
- data/lib/datadog/appsec/api_security/route_extractor.rb +65 -0
- data/lib/datadog/appsec/api_security/sampler.rb +59 -0
- data/lib/datadog/appsec/api_security.rb +23 -0
- data/lib/datadog/appsec/assets/waf_rules/recommended.json +257 -85
- data/lib/datadog/appsec/assets/waf_rules/strict.json +10 -78
- data/lib/datadog/appsec/component.rb +30 -54
- data/lib/datadog/appsec/configuration/settings.rb +60 -2
- data/lib/datadog/appsec/context.rb +6 -6
- data/lib/datadog/appsec/contrib/devise/tracking_middleware.rb +1 -1
- data/lib/datadog/appsec/contrib/rack/request_middleware.rb +27 -16
- data/lib/datadog/appsec/processor/rule_loader.rb +5 -6
- data/lib/datadog/appsec/remote.rb +15 -55
- data/lib/datadog/appsec/security_engine/engine.rb +194 -0
- data/lib/datadog/appsec/security_engine/runner.rb +10 -11
- data/lib/datadog/appsec.rb +4 -7
- data/lib/datadog/core/buffer/random.rb +18 -2
- data/lib/datadog/core/configuration/agent_settings.rb +52 -0
- data/lib/datadog/core/configuration/agent_settings_resolver.rb +4 -46
- data/lib/datadog/core/configuration/components.rb +31 -24
- data/lib/datadog/core/configuration/components_state.rb +23 -0
- data/lib/datadog/core/configuration/option.rb +27 -27
- data/lib/datadog/core/configuration/option_definition.rb +4 -4
- data/lib/datadog/core/configuration/options.rb +1 -1
- data/lib/datadog/core/configuration/settings.rb +32 -20
- data/lib/datadog/core/configuration/stable_config.rb +1 -2
- data/lib/datadog/core/configuration.rb +16 -16
- data/lib/datadog/core/crashtracking/component.rb +2 -1
- data/lib/datadog/core/crashtracking/tag_builder.rb +4 -22
- data/lib/datadog/core/encoding.rb +1 -1
- data/lib/datadog/core/environment/cgroup.rb +10 -12
- data/lib/datadog/core/environment/container.rb +38 -40
- data/lib/datadog/core/environment/ext.rb +6 -6
- data/lib/datadog/core/environment/identity.rb +3 -3
- data/lib/datadog/core/environment/platform.rb +3 -3
- data/lib/datadog/core/error.rb +11 -9
- data/lib/datadog/core/logger.rb +2 -2
- data/lib/datadog/core/metrics/client.rb +12 -14
- data/lib/datadog/core/metrics/logging.rb +5 -5
- data/lib/datadog/core/process_discovery/tracer_memfd.rb +15 -0
- data/lib/datadog/core/process_discovery.rb +5 -1
- data/lib/datadog/core/rate_limiter.rb +4 -2
- data/lib/datadog/core/remote/client.rb +32 -31
- data/lib/datadog/core/remote/component.rb +3 -3
- data/lib/datadog/core/remote/configuration/digest.rb +7 -7
- data/lib/datadog/core/remote/configuration/path.rb +1 -1
- data/lib/datadog/core/remote/configuration/repository.rb +12 -0
- data/lib/datadog/core/remote/transport/http/client.rb +1 -1
- data/lib/datadog/core/remote/transport/http/config.rb +21 -5
- data/lib/datadog/core/remote/transport/http/negotiation.rb +1 -1
- data/lib/datadog/core/runtime/metrics.rb +3 -3
- data/lib/datadog/core/tag_builder.rb +56 -0
- data/lib/datadog/core/telemetry/component.rb +39 -24
- data/lib/datadog/core/telemetry/emitter.rb +7 -1
- data/lib/datadog/core/telemetry/event/app_client_configuration_change.rb +66 -0
- data/lib/datadog/core/telemetry/event/app_closing.rb +18 -0
- data/lib/datadog/core/telemetry/event/app_dependencies_loaded.rb +33 -0
- data/lib/datadog/core/telemetry/event/app_heartbeat.rb +18 -0
- data/lib/datadog/core/telemetry/event/app_integrations_change.rb +58 -0
- data/lib/datadog/core/telemetry/event/app_started.rb +269 -0
- data/lib/datadog/core/telemetry/event/base.rb +40 -0
- data/lib/datadog/core/telemetry/event/distributions.rb +18 -0
- data/lib/datadog/core/telemetry/event/generate_metrics.rb +43 -0
- data/lib/datadog/core/telemetry/event/log.rb +76 -0
- data/lib/datadog/core/telemetry/event/message_batch.rb +42 -0
- data/lib/datadog/core/telemetry/event/synth_app_client_configuration_change.rb +43 -0
- data/lib/datadog/core/telemetry/event.rb +17 -475
- data/lib/datadog/core/telemetry/logger.rb +5 -4
- data/lib/datadog/core/telemetry/logging.rb +11 -5
- data/lib/datadog/core/telemetry/metric.rb +3 -3
- data/lib/datadog/core/telemetry/transport/http/telemetry.rb +2 -2
- data/lib/datadog/core/telemetry/transport/telemetry.rb +0 -1
- data/lib/datadog/core/telemetry/worker.rb +48 -27
- data/lib/datadog/core/transport/http/adapters/net.rb +17 -2
- data/lib/datadog/core/transport/http/adapters/test.rb +2 -1
- data/lib/datadog/core/transport/http/builder.rb +14 -14
- data/lib/datadog/core/transport/http/env.rb +8 -0
- data/lib/datadog/core/utils/at_fork_monkey_patch.rb +6 -6
- data/lib/datadog/core/utils/duration.rb +32 -32
- data/lib/datadog/core/utils/forking.rb +2 -2
- data/lib/datadog/core/utils/network.rb +6 -6
- data/lib/datadog/core/utils/only_once_successful.rb +16 -5
- data/lib/datadog/core/utils/time.rb +10 -2
- data/lib/datadog/core/utils/truncation.rb +21 -0
- data/lib/datadog/core/utils.rb +7 -0
- data/lib/datadog/core/vendor/multipart-post/multipart/post/composite_read_io.rb +1 -1
- data/lib/datadog/core/vendor/multipart-post/multipart/post/multipartable.rb +8 -8
- data/lib/datadog/core/vendor/multipart-post/multipart/post/parts.rb +7 -7
- data/lib/datadog/core/worker.rb +1 -1
- data/lib/datadog/core/workers/async.rb +9 -10
- data/lib/datadog/di/instrumenter.rb +52 -2
- data/lib/datadog/di/probe_notification_builder.rb +31 -41
- data/lib/datadog/di/probe_notifier_worker.rb +9 -1
- data/lib/datadog/di/serializer.rb +6 -2
- data/lib/datadog/di/transport/http/input.rb +10 -0
- data/lib/datadog/di/transport/input.rb +10 -2
- data/lib/datadog/error_tracking/component.rb +2 -2
- data/lib/datadog/profiling/collectors/code_provenance.rb +18 -9
- data/lib/datadog/profiling/collectors/cpu_and_wall_time_worker.rb +4 -0
- data/lib/datadog/profiling/collectors/idle_sampling_helper.rb +1 -0
- data/lib/datadog/profiling/collectors/thread_context.rb +16 -1
- data/lib/datadog/profiling/component.rb +7 -9
- data/lib/datadog/profiling/ext.rb +0 -13
- data/lib/datadog/profiling/flush.rb +1 -1
- data/lib/datadog/profiling/http_transport.rb +3 -8
- data/lib/datadog/profiling/profiler.rb +2 -0
- data/lib/datadog/profiling/scheduler.rb +10 -2
- data/lib/datadog/profiling/stack_recorder.rb +5 -5
- data/lib/datadog/profiling/tag_builder.rb +5 -41
- data/lib/datadog/profiling/tasks/setup.rb +2 -0
- data/lib/datadog/tracing/contrib/action_pack/action_controller/instrumentation.rb +15 -0
- data/lib/datadog/tracing/contrib/action_pack/action_dispatch/instrumentation.rb +19 -12
- data/lib/datadog/tracing/contrib/action_pack/ext.rb +2 -0
- data/lib/datadog/tracing/contrib/active_support/cache/events/cache.rb +4 -1
- data/lib/datadog/tracing/contrib/active_support/cache/instrumentation.rb +33 -0
- data/lib/datadog/tracing/contrib/active_support/cache/patcher.rb +4 -0
- data/lib/datadog/tracing/contrib/active_support/cache/redis.rb +2 -4
- data/lib/datadog/tracing/contrib/aws/instrumentation.rb +10 -0
- data/lib/datadog/tracing/contrib/aws/parsed_context.rb +5 -1
- data/lib/datadog/tracing/contrib/http/instrumentation.rb +1 -5
- data/lib/datadog/tracing/contrib/httpclient/instrumentation.rb +1 -5
- data/lib/datadog/tracing/contrib/httprb/instrumentation.rb +1 -5
- data/lib/datadog/tracing/contrib/lograge/patcher.rb +4 -2
- data/lib/datadog/tracing/contrib/patcher.rb +5 -2
- data/lib/datadog/tracing/contrib/sidekiq/ext.rb +1 -0
- data/lib/datadog/tracing/contrib/sidekiq/server_tracer.rb +5 -2
- data/lib/datadog/tracing/contrib/support.rb +28 -0
- data/lib/datadog/tracing/metadata/errors.rb +4 -4
- data/lib/datadog/tracing/sync_writer.rb +1 -1
- data/lib/datadog/tracing/trace_operation.rb +12 -4
- data/lib/datadog/tracing/tracer.rb +6 -2
- data/lib/datadog/version.rb +1 -1
- metadata +31 -12
- data/lib/datadog/appsec/assets/waf_rules/processors.json +0 -321
- data/lib/datadog/appsec/assets/waf_rules/scanners.json +0 -1023
- data/lib/datadog/appsec/processor/rule_merger.rb +0 -171
- data/lib/datadog/appsec/processor.rb +0 -107
@@ -1,171 +0,0 @@
|
|
1
|
-
# frozen_string_literal: true
|
2
|
-
|
3
|
-
require_relative '../assets'
|
4
|
-
|
5
|
-
module Datadog
|
6
|
-
module AppSec
|
7
|
-
class Processor
|
8
|
-
# RuleMerger merge different sources of information
|
9
|
-
# into the rules payload
|
10
|
-
module RuleMerger
|
11
|
-
# RuleVersionMismatchError
|
12
|
-
class RuleVersionMismatchError < StandardError
|
13
|
-
def initialize(version1, version2)
|
14
|
-
msg = 'Merging rule files with different version could lead to unkown behaviour. ' \
|
15
|
-
"We have receieve two rule files with versions: #{version1}, #{version2}. " \
|
16
|
-
'Please validate the configuration is correct and try again.'
|
17
|
-
super(msg)
|
18
|
-
end
|
19
|
-
end
|
20
|
-
|
21
|
-
class << self
|
22
|
-
# TODO: `processors` and `scanners` are not provided by the caller, consider removing them
|
23
|
-
def merge(
|
24
|
-
telemetry:,
|
25
|
-
rules:, actions: [], data: [], overrides: [], exclusions: [], custom_rules: [],
|
26
|
-
processors: nil, scanners: nil
|
27
|
-
)
|
28
|
-
processors ||= begin
|
29
|
-
default_waf_processors
|
30
|
-
rescue => e
|
31
|
-
Datadog.logger.error("libddwaf rulemerger failed to parse default waf processors. Error: #{e.inspect}")
|
32
|
-
telemetry.report(
|
33
|
-
e,
|
34
|
-
description: 'libddwaf rulemerger failed to parse default waf processors'
|
35
|
-
)
|
36
|
-
[]
|
37
|
-
end
|
38
|
-
|
39
|
-
scanners ||= begin
|
40
|
-
default_waf_scanners
|
41
|
-
rescue => e
|
42
|
-
Datadog.logger.error("libddwaf rulemerger failed to parse default waf scanners. Error: #{e.inspect}")
|
43
|
-
telemetry.report(
|
44
|
-
e,
|
45
|
-
description: 'libddwaf rulemerger failed to parse default waf scanners'
|
46
|
-
)
|
47
|
-
[]
|
48
|
-
end
|
49
|
-
|
50
|
-
combined_rules = combine_rules(rules)
|
51
|
-
|
52
|
-
combined_data = combine_data(data) if data.any?
|
53
|
-
combined_overrides = combine_overrides(overrides) if overrides.any?
|
54
|
-
combined_exclusions = combine_exclusions(exclusions) if exclusions.any?
|
55
|
-
combined_custom_rules = combine_custom_rules(custom_rules) if custom_rules.any?
|
56
|
-
|
57
|
-
combined_rules['actions'] = actions if actions.any?
|
58
|
-
combined_rules['rules_data'] = combined_data if combined_data
|
59
|
-
combined_rules['rules_override'] = combined_overrides if combined_overrides
|
60
|
-
combined_rules['exclusions'] = combined_exclusions if combined_exclusions
|
61
|
-
combined_rules['custom_rules'] = combined_custom_rules if combined_custom_rules
|
62
|
-
combined_rules['processors'] = processors
|
63
|
-
combined_rules['scanners'] = scanners
|
64
|
-
combined_rules
|
65
|
-
end
|
66
|
-
|
67
|
-
def default_waf_processors
|
68
|
-
@default_waf_processors ||= JSON.parse(Datadog::AppSec::Assets.waf_processors)
|
69
|
-
end
|
70
|
-
|
71
|
-
def default_waf_scanners
|
72
|
-
@default_waf_scanners ||= JSON.parse(Datadog::AppSec::Assets.waf_scanners)
|
73
|
-
end
|
74
|
-
|
75
|
-
private
|
76
|
-
|
77
|
-
def combine_rules(rules)
|
78
|
-
return rules[0].dup if rules.size == 1
|
79
|
-
|
80
|
-
final_rules = []
|
81
|
-
# @type var final_version: ::String
|
82
|
-
final_version = (_ = nil)
|
83
|
-
|
84
|
-
rules.each do |rule_file|
|
85
|
-
version = rule_file['version']
|
86
|
-
|
87
|
-
if version && !final_version
|
88
|
-
final_version = version
|
89
|
-
elsif final_version != version
|
90
|
-
raise RuleVersionMismatchError.new(final_version, version)
|
91
|
-
end
|
92
|
-
|
93
|
-
final_rules.concat(rule_file['rules'])
|
94
|
-
end
|
95
|
-
|
96
|
-
{
|
97
|
-
'version' => final_version,
|
98
|
-
'rules' => final_rules
|
99
|
-
}
|
100
|
-
end
|
101
|
-
|
102
|
-
def combine_data(data)
|
103
|
-
result = []
|
104
|
-
|
105
|
-
data.each do |data_entry|
|
106
|
-
data_entry.each do |value|
|
107
|
-
existing_data = result.find { |x| x['id'] == value['id'] }
|
108
|
-
|
109
|
-
if existing_data && existing_data['type'] == value['type']
|
110
|
-
# Duplicate entry base on type and id
|
111
|
-
# We need to merge the existing data with the new one
|
112
|
-
# and make sure to remove duplicates
|
113
|
-
merged_data = merge_data_base_on_expiration(existing_data['data'], value['data'])
|
114
|
-
existing_data['data'] = merged_data
|
115
|
-
else
|
116
|
-
result << value
|
117
|
-
end
|
118
|
-
end
|
119
|
-
end
|
120
|
-
|
121
|
-
return unless result.any?
|
122
|
-
|
123
|
-
result
|
124
|
-
end
|
125
|
-
|
126
|
-
def merge_data_base_on_expiration(data1, data2)
|
127
|
-
result = data1.each_with_object({}) do |value, acc|
|
128
|
-
acc[value['value']] = value['expiration']
|
129
|
-
end
|
130
|
-
|
131
|
-
data2.each do |data|
|
132
|
-
if result.key?(data['value'])
|
133
|
-
# The value is duplicated so we need to keep
|
134
|
-
# the one with the highest expiration value
|
135
|
-
# We replace it if the expiration is higher than the current one
|
136
|
-
# or if no experiration
|
137
|
-
current_expiration = result[data['value']]
|
138
|
-
new_expiration = data['expiration']
|
139
|
-
|
140
|
-
if new_expiration.nil? || current_expiration && new_expiration > current_expiration
|
141
|
-
result[data['value']] = new_expiration
|
142
|
-
end
|
143
|
-
else
|
144
|
-
result[data['value']] = data['expiration']
|
145
|
-
end
|
146
|
-
end
|
147
|
-
|
148
|
-
result.each_with_object([]) do |entry, acc|
|
149
|
-
value = {'value' => entry[0]}
|
150
|
-
value['expiration'] = entry[1] if entry[1]
|
151
|
-
|
152
|
-
acc << value
|
153
|
-
end
|
154
|
-
end
|
155
|
-
|
156
|
-
def combine_overrides(overrides)
|
157
|
-
overrides.flatten
|
158
|
-
end
|
159
|
-
|
160
|
-
def combine_exclusions(exclusions)
|
161
|
-
exclusions.flatten
|
162
|
-
end
|
163
|
-
|
164
|
-
def combine_custom_rules(custom_rules)
|
165
|
-
custom_rules.flatten
|
166
|
-
end
|
167
|
-
end
|
168
|
-
end
|
169
|
-
end
|
170
|
-
end
|
171
|
-
end
|
@@ -1,107 +0,0 @@
|
|
1
|
-
# frozen_string_literal: true
|
2
|
-
|
3
|
-
require_relative 'security_engine/runner'
|
4
|
-
|
5
|
-
module Datadog
|
6
|
-
module AppSec
|
7
|
-
# Processor integrates libddwaf into datadog/appsec
|
8
|
-
# NOTE: This class will be moved under AppSec::SecurityEngine namespace
|
9
|
-
class Processor
|
10
|
-
attr_reader :diagnostics, :addresses
|
11
|
-
|
12
|
-
def initialize(ruleset:, telemetry:)
|
13
|
-
@telemetry = telemetry
|
14
|
-
@diagnostics = nil
|
15
|
-
@addresses = []
|
16
|
-
|
17
|
-
settings = Datadog.configuration.appsec
|
18
|
-
|
19
|
-
# TODO: Refactor to make it easier to test
|
20
|
-
unless require_libddwaf && libddwaf_provides_waf? && create_waf_handle(settings, ruleset)
|
21
|
-
Datadog.logger.warn('AppSec is disabled, see logged errors above')
|
22
|
-
end
|
23
|
-
end
|
24
|
-
|
25
|
-
def ready?
|
26
|
-
!@handle.nil?
|
27
|
-
end
|
28
|
-
|
29
|
-
def finalize
|
30
|
-
@handle.finalize
|
31
|
-
end
|
32
|
-
|
33
|
-
def new_runner
|
34
|
-
SecurityEngine::Runner.new(@handle, telemetry: @telemetry)
|
35
|
-
end
|
36
|
-
|
37
|
-
private
|
38
|
-
|
39
|
-
# libddwaf raises a LoadError on unsupported platforms; it may at some
|
40
|
-
# point succeed in being required yet not provide a specific needed feature.
|
41
|
-
def require_libddwaf
|
42
|
-
Datadog.logger.debug { "libddwaf platform: #{libddwaf_platform}" }
|
43
|
-
|
44
|
-
require 'libddwaf'
|
45
|
-
|
46
|
-
true
|
47
|
-
rescue LoadError => e
|
48
|
-
Datadog.logger.error do
|
49
|
-
'libddwaf failed to load,' \
|
50
|
-
"installed platform: #{libddwaf_platform} ruby platforms: #{ruby_platforms} error: #{e.inspect}"
|
51
|
-
end
|
52
|
-
@telemetry.report(e, description: 'libddwaf failed to load')
|
53
|
-
|
54
|
-
false
|
55
|
-
end
|
56
|
-
|
57
|
-
# check whether libddwaf is required *and* able to provide the needed feature
|
58
|
-
def libddwaf_provides_waf?
|
59
|
-
defined?(Datadog::AppSec::WAF) ? true : false
|
60
|
-
end
|
61
|
-
|
62
|
-
def create_waf_handle(settings, ruleset)
|
63
|
-
# TODO: this may need to be reset if the main Datadog logging level changes after initialization
|
64
|
-
Datadog::AppSec::WAF.logger = Datadog.logger if Datadog.logger.debug? && settings.waf_debug
|
65
|
-
|
66
|
-
obfuscator_config = {
|
67
|
-
key_regex: settings.obfuscator_key_regex,
|
68
|
-
value_regex: settings.obfuscator_value_regex,
|
69
|
-
}
|
70
|
-
|
71
|
-
@handle = Datadog::AppSec::WAF::Handle.new(ruleset, obfuscator: obfuscator_config)
|
72
|
-
@diagnostics = @handle.diagnostics
|
73
|
-
@addresses = @handle.required_addresses
|
74
|
-
|
75
|
-
true
|
76
|
-
rescue WAF::LibDDWAF::Error => e
|
77
|
-
Datadog.logger.error do
|
78
|
-
"libddwaf failed to initialize, error: #{e.inspect}"
|
79
|
-
end
|
80
|
-
@telemetry.report(e, description: 'libddwaf failed to initialize')
|
81
|
-
|
82
|
-
@diagnostics = e.diagnostics if e.diagnostics
|
83
|
-
|
84
|
-
false
|
85
|
-
rescue => e
|
86
|
-
Datadog.logger.error do
|
87
|
-
"libddwaf failed to initialize, error: #{e.inspect}"
|
88
|
-
end
|
89
|
-
@telemetry.report(e, description: 'libddwaf failed to initialize')
|
90
|
-
|
91
|
-
false
|
92
|
-
end
|
93
|
-
|
94
|
-
def libddwaf_platform
|
95
|
-
if Gem.loaded_specs['libddwaf']
|
96
|
-
Gem.loaded_specs['libddwaf'].platform.to_s
|
97
|
-
else
|
98
|
-
'unknown'
|
99
|
-
end
|
100
|
-
end
|
101
|
-
|
102
|
-
def ruby_platforms
|
103
|
-
Gem.platforms.map(&:to_s)
|
104
|
-
end
|
105
|
-
end
|
106
|
-
end
|
107
|
-
end
|