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.
Files changed (164) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +72 -1
  3. data/ext/datadog_profiling_native_extension/collectors_cpu_and_wall_time_worker.c +12 -46
  4. data/ext/datadog_profiling_native_extension/collectors_stack.c +227 -49
  5. data/ext/datadog_profiling_native_extension/collectors_stack.h +19 -3
  6. data/ext/datadog_profiling_native_extension/collectors_thread_context.c +63 -12
  7. data/ext/datadog_profiling_native_extension/collectors_thread_context.h +1 -0
  8. data/ext/datadog_profiling_native_extension/encoded_profile.c +22 -12
  9. data/ext/datadog_profiling_native_extension/encoded_profile.h +1 -0
  10. data/ext/datadog_profiling_native_extension/extconf.rb +7 -0
  11. data/ext/datadog_profiling_native_extension/heap_recorder.c +239 -363
  12. data/ext/datadog_profiling_native_extension/heap_recorder.h +4 -6
  13. data/ext/datadog_profiling_native_extension/http_transport.c +45 -72
  14. data/ext/datadog_profiling_native_extension/libdatadog_helpers.c +22 -0
  15. data/ext/datadog_profiling_native_extension/libdatadog_helpers.h +8 -5
  16. data/ext/datadog_profiling_native_extension/private_vm_api_access.c +1 -0
  17. data/ext/datadog_profiling_native_extension/private_vm_api_access.h +6 -3
  18. data/ext/datadog_profiling_native_extension/ruby_helpers.c +1 -13
  19. data/ext/datadog_profiling_native_extension/ruby_helpers.h +2 -10
  20. data/ext/datadog_profiling_native_extension/stack_recorder.c +156 -60
  21. data/ext/libdatadog_api/crashtracker.c +10 -3
  22. data/ext/libdatadog_api/extconf.rb +2 -2
  23. data/ext/libdatadog_api/library_config.c +54 -12
  24. data/ext/libdatadog_api/library_config.h +6 -0
  25. data/ext/libdatadog_api/macos_development.md +3 -3
  26. data/ext/libdatadog_api/process_discovery.c +2 -7
  27. data/ext/libdatadog_extconf_helpers.rb +2 -2
  28. data/lib/datadog/appsec/api_security/lru_cache.rb +56 -0
  29. data/lib/datadog/appsec/api_security/route_extractor.rb +65 -0
  30. data/lib/datadog/appsec/api_security/sampler.rb +59 -0
  31. data/lib/datadog/appsec/api_security.rb +23 -0
  32. data/lib/datadog/appsec/assets/waf_rules/recommended.json +257 -85
  33. data/lib/datadog/appsec/assets/waf_rules/strict.json +10 -78
  34. data/lib/datadog/appsec/component.rb +30 -54
  35. data/lib/datadog/appsec/configuration/settings.rb +60 -2
  36. data/lib/datadog/appsec/context.rb +6 -6
  37. data/lib/datadog/appsec/contrib/devise/tracking_middleware.rb +1 -1
  38. data/lib/datadog/appsec/contrib/rack/request_middleware.rb +27 -16
  39. data/lib/datadog/appsec/processor/rule_loader.rb +5 -6
  40. data/lib/datadog/appsec/remote.rb +15 -55
  41. data/lib/datadog/appsec/security_engine/engine.rb +194 -0
  42. data/lib/datadog/appsec/security_engine/runner.rb +10 -11
  43. data/lib/datadog/appsec.rb +4 -7
  44. data/lib/datadog/core/buffer/random.rb +18 -2
  45. data/lib/datadog/core/configuration/agent_settings.rb +52 -0
  46. data/lib/datadog/core/configuration/agent_settings_resolver.rb +4 -46
  47. data/lib/datadog/core/configuration/components.rb +31 -24
  48. data/lib/datadog/core/configuration/components_state.rb +23 -0
  49. data/lib/datadog/core/configuration/option.rb +27 -27
  50. data/lib/datadog/core/configuration/option_definition.rb +4 -4
  51. data/lib/datadog/core/configuration/options.rb +1 -1
  52. data/lib/datadog/core/configuration/settings.rb +32 -20
  53. data/lib/datadog/core/configuration/stable_config.rb +1 -2
  54. data/lib/datadog/core/configuration.rb +16 -16
  55. data/lib/datadog/core/crashtracking/component.rb +2 -1
  56. data/lib/datadog/core/crashtracking/tag_builder.rb +4 -22
  57. data/lib/datadog/core/encoding.rb +1 -1
  58. data/lib/datadog/core/environment/cgroup.rb +10 -12
  59. data/lib/datadog/core/environment/container.rb +38 -40
  60. data/lib/datadog/core/environment/ext.rb +6 -6
  61. data/lib/datadog/core/environment/identity.rb +3 -3
  62. data/lib/datadog/core/environment/platform.rb +3 -3
  63. data/lib/datadog/core/error.rb +11 -9
  64. data/lib/datadog/core/logger.rb +2 -2
  65. data/lib/datadog/core/metrics/client.rb +12 -14
  66. data/lib/datadog/core/metrics/logging.rb +5 -5
  67. data/lib/datadog/core/process_discovery/tracer_memfd.rb +15 -0
  68. data/lib/datadog/core/process_discovery.rb +5 -1
  69. data/lib/datadog/core/rate_limiter.rb +4 -2
  70. data/lib/datadog/core/remote/client.rb +32 -31
  71. data/lib/datadog/core/remote/component.rb +3 -3
  72. data/lib/datadog/core/remote/configuration/digest.rb +7 -7
  73. data/lib/datadog/core/remote/configuration/path.rb +1 -1
  74. data/lib/datadog/core/remote/configuration/repository.rb +12 -0
  75. data/lib/datadog/core/remote/transport/http/client.rb +1 -1
  76. data/lib/datadog/core/remote/transport/http/config.rb +21 -5
  77. data/lib/datadog/core/remote/transport/http/negotiation.rb +1 -1
  78. data/lib/datadog/core/runtime/metrics.rb +3 -3
  79. data/lib/datadog/core/tag_builder.rb +56 -0
  80. data/lib/datadog/core/telemetry/component.rb +39 -24
  81. data/lib/datadog/core/telemetry/emitter.rb +7 -1
  82. data/lib/datadog/core/telemetry/event/app_client_configuration_change.rb +66 -0
  83. data/lib/datadog/core/telemetry/event/app_closing.rb +18 -0
  84. data/lib/datadog/core/telemetry/event/app_dependencies_loaded.rb +33 -0
  85. data/lib/datadog/core/telemetry/event/app_heartbeat.rb +18 -0
  86. data/lib/datadog/core/telemetry/event/app_integrations_change.rb +58 -0
  87. data/lib/datadog/core/telemetry/event/app_started.rb +269 -0
  88. data/lib/datadog/core/telemetry/event/base.rb +40 -0
  89. data/lib/datadog/core/telemetry/event/distributions.rb +18 -0
  90. data/lib/datadog/core/telemetry/event/generate_metrics.rb +43 -0
  91. data/lib/datadog/core/telemetry/event/log.rb +76 -0
  92. data/lib/datadog/core/telemetry/event/message_batch.rb +42 -0
  93. data/lib/datadog/core/telemetry/event/synth_app_client_configuration_change.rb +43 -0
  94. data/lib/datadog/core/telemetry/event.rb +17 -475
  95. data/lib/datadog/core/telemetry/logger.rb +5 -4
  96. data/lib/datadog/core/telemetry/logging.rb +11 -5
  97. data/lib/datadog/core/telemetry/metric.rb +3 -3
  98. data/lib/datadog/core/telemetry/transport/http/telemetry.rb +2 -2
  99. data/lib/datadog/core/telemetry/transport/telemetry.rb +0 -1
  100. data/lib/datadog/core/telemetry/worker.rb +48 -27
  101. data/lib/datadog/core/transport/http/adapters/net.rb +17 -2
  102. data/lib/datadog/core/transport/http/adapters/test.rb +2 -1
  103. data/lib/datadog/core/transport/http/builder.rb +14 -14
  104. data/lib/datadog/core/transport/http/env.rb +8 -0
  105. data/lib/datadog/core/utils/at_fork_monkey_patch.rb +6 -6
  106. data/lib/datadog/core/utils/duration.rb +32 -32
  107. data/lib/datadog/core/utils/forking.rb +2 -2
  108. data/lib/datadog/core/utils/network.rb +6 -6
  109. data/lib/datadog/core/utils/only_once_successful.rb +16 -5
  110. data/lib/datadog/core/utils/time.rb +10 -2
  111. data/lib/datadog/core/utils/truncation.rb +21 -0
  112. data/lib/datadog/core/utils.rb +7 -0
  113. data/lib/datadog/core/vendor/multipart-post/multipart/post/composite_read_io.rb +1 -1
  114. data/lib/datadog/core/vendor/multipart-post/multipart/post/multipartable.rb +8 -8
  115. data/lib/datadog/core/vendor/multipart-post/multipart/post/parts.rb +7 -7
  116. data/lib/datadog/core/worker.rb +1 -1
  117. data/lib/datadog/core/workers/async.rb +9 -10
  118. data/lib/datadog/di/instrumenter.rb +52 -2
  119. data/lib/datadog/di/probe_notification_builder.rb +31 -41
  120. data/lib/datadog/di/probe_notifier_worker.rb +9 -1
  121. data/lib/datadog/di/serializer.rb +6 -2
  122. data/lib/datadog/di/transport/http/input.rb +10 -0
  123. data/lib/datadog/di/transport/input.rb +10 -2
  124. data/lib/datadog/error_tracking/component.rb +2 -2
  125. data/lib/datadog/profiling/collectors/code_provenance.rb +18 -9
  126. data/lib/datadog/profiling/collectors/cpu_and_wall_time_worker.rb +4 -0
  127. data/lib/datadog/profiling/collectors/idle_sampling_helper.rb +1 -0
  128. data/lib/datadog/profiling/collectors/thread_context.rb +16 -1
  129. data/lib/datadog/profiling/component.rb +7 -9
  130. data/lib/datadog/profiling/ext.rb +0 -13
  131. data/lib/datadog/profiling/flush.rb +1 -1
  132. data/lib/datadog/profiling/http_transport.rb +3 -8
  133. data/lib/datadog/profiling/profiler.rb +2 -0
  134. data/lib/datadog/profiling/scheduler.rb +10 -2
  135. data/lib/datadog/profiling/stack_recorder.rb +5 -5
  136. data/lib/datadog/profiling/tag_builder.rb +5 -41
  137. data/lib/datadog/profiling/tasks/setup.rb +2 -0
  138. data/lib/datadog/tracing/contrib/action_pack/action_controller/instrumentation.rb +15 -0
  139. data/lib/datadog/tracing/contrib/action_pack/action_dispatch/instrumentation.rb +19 -12
  140. data/lib/datadog/tracing/contrib/action_pack/ext.rb +2 -0
  141. data/lib/datadog/tracing/contrib/active_support/cache/events/cache.rb +4 -1
  142. data/lib/datadog/tracing/contrib/active_support/cache/instrumentation.rb +33 -0
  143. data/lib/datadog/tracing/contrib/active_support/cache/patcher.rb +4 -0
  144. data/lib/datadog/tracing/contrib/active_support/cache/redis.rb +2 -4
  145. data/lib/datadog/tracing/contrib/aws/instrumentation.rb +10 -0
  146. data/lib/datadog/tracing/contrib/aws/parsed_context.rb +5 -1
  147. data/lib/datadog/tracing/contrib/http/instrumentation.rb +1 -5
  148. data/lib/datadog/tracing/contrib/httpclient/instrumentation.rb +1 -5
  149. data/lib/datadog/tracing/contrib/httprb/instrumentation.rb +1 -5
  150. data/lib/datadog/tracing/contrib/lograge/patcher.rb +4 -2
  151. data/lib/datadog/tracing/contrib/patcher.rb +5 -2
  152. data/lib/datadog/tracing/contrib/sidekiq/ext.rb +1 -0
  153. data/lib/datadog/tracing/contrib/sidekiq/server_tracer.rb +5 -2
  154. data/lib/datadog/tracing/contrib/support.rb +28 -0
  155. data/lib/datadog/tracing/metadata/errors.rb +4 -4
  156. data/lib/datadog/tracing/sync_writer.rb +1 -1
  157. data/lib/datadog/tracing/trace_operation.rb +12 -4
  158. data/lib/datadog/tracing/tracer.rb +6 -2
  159. data/lib/datadog/version.rb +1 -1
  160. metadata +31 -12
  161. data/lib/datadog/appsec/assets/waf_rules/processors.json +0 -321
  162. data/lib/datadog/appsec/assets/waf_rules/scanners.json +0 -1023
  163. data/lib/datadog/appsec/processor/rule_merger.rb +0 -171
  164. 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