datadog 2.0.0.beta1 → 2.0.0.beta2
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/CHANGELOG.md +125 -1
- data/ext/datadog_profiling_native_extension/collectors_cpu_and_wall_time_worker.c +32 -12
- data/ext/datadog_profiling_native_extension/collectors_thread_context.c +5 -2
- data/ext/datadog_profiling_native_extension/heap_recorder.c +45 -3
- data/ext/datadog_profiling_native_extension/heap_recorder.h +7 -1
- data/ext/datadog_profiling_native_extension/http_transport.c +5 -5
- data/ext/datadog_profiling_native_extension/native_extension_helpers.rb +1 -1
- data/ext/datadog_profiling_native_extension/stack_recorder.c +7 -9
- data/lib/datadog/appsec/contrib/rack/request_middleware.rb +43 -13
- data/lib/datadog/appsec/event.rb +2 -2
- data/lib/datadog/core/configuration/components.rb +2 -1
- data/lib/datadog/core/configuration/option.rb +7 -5
- data/lib/datadog/core/configuration/settings.rb +38 -14
- data/lib/datadog/core/configuration.rb +20 -4
- data/lib/datadog/core/environment/platform.rb +7 -1
- data/lib/datadog/core/remote/client/capabilities.rb +2 -1
- data/lib/datadog/core/remote/transport/http/config.rb +5 -5
- data/lib/datadog/core/telemetry/client.rb +18 -10
- data/lib/datadog/core/telemetry/emitter.rb +9 -13
- data/lib/datadog/core/telemetry/event.rb +247 -57
- data/lib/datadog/core/telemetry/ext.rb +1 -0
- data/lib/datadog/core/telemetry/heartbeat.rb +1 -3
- data/lib/datadog/core/telemetry/http/ext.rb +4 -1
- data/lib/datadog/core/telemetry/http/transport.rb +9 -4
- data/lib/datadog/core/telemetry/request.rb +59 -0
- data/lib/datadog/core/utils/base64.rb +22 -0
- data/lib/datadog/opentelemetry/sdk/span_processor.rb +1 -1
- data/lib/datadog/opentelemetry/sdk/trace/span.rb +3 -17
- data/lib/datadog/profiling/collectors/code_provenance.rb +10 -4
- data/lib/datadog/profiling/collectors/cpu_and_wall_time_worker.rb +25 -0
- data/lib/datadog/profiling/component.rb +23 -15
- data/lib/datadog/profiling/load_native_extension.rb +14 -1
- data/lib/datadog/profiling.rb +11 -0
- data/lib/datadog/tracing/contrib/action_pack/integration.rb +1 -1
- data/lib/datadog/tracing/contrib/action_view/integration.rb +1 -1
- data/lib/datadog/tracing/contrib/active_record/integration.rb +1 -1
- data/lib/datadog/tracing/contrib/active_support/integration.rb +1 -1
- data/lib/datadog/tracing/contrib/grape/endpoint.rb +43 -5
- data/lib/datadog/tracing/correlation.rb +3 -4
- data/lib/datadog/tracing/sampling/matcher.rb +23 -3
- data/lib/datadog/tracing/sampling/rule.rb +18 -2
- data/lib/datadog/tracing/sampling/rule_sampler.rb +2 -0
- data/lib/datadog/tracing/span.rb +7 -2
- data/lib/datadog/tracing/span_link.rb +86 -0
- data/lib/datadog/tracing/trace_operation.rb +12 -0
- data/lib/datadog/tracing/tracer.rb +4 -3
- data/lib/datadog/tracing/transport/serializable_trace.rb +3 -1
- data/lib/datadog/tracing/utils.rb +16 -0
- data/lib/datadog/version.rb +1 -1
- metadata +7 -30
- data/lib/datadog/core/telemetry/collector.rb +0 -248
- data/lib/datadog/core/telemetry/v1/app_event.rb +0 -59
- data/lib/datadog/core/telemetry/v1/application.rb +0 -94
- data/lib/datadog/core/telemetry/v1/configuration.rb +0 -27
- data/lib/datadog/core/telemetry/v1/dependency.rb +0 -45
- data/lib/datadog/core/telemetry/v1/host.rb +0 -59
- data/lib/datadog/core/telemetry/v1/install_signature.rb +0 -38
- data/lib/datadog/core/telemetry/v1/integration.rb +0 -66
- data/lib/datadog/core/telemetry/v1/product.rb +0 -36
- data/lib/datadog/core/telemetry/v1/telemetry_request.rb +0 -108
- data/lib/datadog/core/telemetry/v2/app_client_configuration_change.rb +0 -41
- data/lib/datadog/core/telemetry/v2/request.rb +0 -29
@@ -15,6 +15,18 @@ module Datadog
|
|
15
15
|
module AppSec
|
16
16
|
module Contrib
|
17
17
|
module Rack
|
18
|
+
# Create an array of lowercased headers
|
19
|
+
WAF_VENDOR_HEADERS_TAGS = %w[
|
20
|
+
X-Amzn-Trace-Id
|
21
|
+
Cloudfront-Viewer-Ja3-Fingerprint
|
22
|
+
Cf-Ray
|
23
|
+
X-Cloud-Trace-Context
|
24
|
+
X-Appgw-Trace-id
|
25
|
+
X-SigSci-RequestID
|
26
|
+
X-SigSci-Tags
|
27
|
+
Akamai-User-Risk
|
28
|
+
].map(&:downcase).freeze
|
29
|
+
|
18
30
|
# Topmost Rack middleware for AppSec
|
19
31
|
# This should be inserted just below Datadog::Tracing::Contrib::Rack::TraceMiddleware
|
20
32
|
class RequestMiddleware
|
@@ -22,6 +34,7 @@ module Datadog
|
|
22
34
|
@app = app
|
23
35
|
|
24
36
|
@oneshot_tags_sent = false
|
37
|
+
@rack_headers = {}
|
25
38
|
end
|
26
39
|
|
27
40
|
# rubocop:disable Metrics/AbcSize,Metrics/PerceivedComplexity,Metrics/CyclomaticComplexity,Metrics/MethodLength
|
@@ -56,7 +69,8 @@ module Datadog
|
|
56
69
|
|
57
70
|
gateway_request = Gateway::Request.new(env)
|
58
71
|
|
59
|
-
add_appsec_tags(processor, scope
|
72
|
+
add_appsec_tags(processor, scope)
|
73
|
+
add_request_tags(scope, env)
|
60
74
|
|
61
75
|
request_return, request_response = catch(::Datadog::AppSec::Ext::INTERRUPT) do
|
62
76
|
Instrumentation.gateway.push('rack.request', gateway_request) do
|
@@ -131,7 +145,7 @@ module Datadog
|
|
131
145
|
Datadog::Tracing.active_span
|
132
146
|
end
|
133
147
|
|
134
|
-
def add_appsec_tags(processor, scope
|
148
|
+
def add_appsec_tags(processor, scope)
|
135
149
|
span = scope.service_entry_span
|
136
150
|
trace = scope.trace
|
137
151
|
|
@@ -141,17 +155,6 @@ module Datadog
|
|
141
155
|
span.set_tag('_dd.runtime_family', 'ruby')
|
142
156
|
span.set_tag('_dd.appsec.waf.version', Datadog::AppSec::WAF::VERSION::BASE_STRING)
|
143
157
|
|
144
|
-
if span && span.get_tag(Tracing::Metadata::Ext::HTTP::TAG_CLIENT_IP).nil?
|
145
|
-
request_header_collection = Datadog::Tracing::Contrib::Rack::Header::RequestHeaderCollection.new(env)
|
146
|
-
|
147
|
-
# always collect client ip, as this is part of AppSec provided functionality
|
148
|
-
Datadog::Tracing::ClientIp.set_client_ip_tag!(
|
149
|
-
span,
|
150
|
-
headers: request_header_collection,
|
151
|
-
remote_ip: env['REMOTE_ADDR']
|
152
|
-
)
|
153
|
-
end
|
154
|
-
|
155
158
|
if processor.diagnostics
|
156
159
|
diagnostics = processor.diagnostics
|
157
160
|
|
@@ -177,6 +180,29 @@ module Datadog
|
|
177
180
|
end
|
178
181
|
end
|
179
182
|
|
183
|
+
def add_request_tags(scope, env)
|
184
|
+
span = scope.service_entry_span
|
185
|
+
|
186
|
+
return unless span
|
187
|
+
|
188
|
+
# Always add WAF vendors headers
|
189
|
+
WAF_VENDOR_HEADERS_TAGS.each do |lowercase_header|
|
190
|
+
rack_header = to_rack_header(lowercase_header)
|
191
|
+
span.set_tag("http.request.headers.#{lowercase_header}", env[rack_header]) if env[rack_header]
|
192
|
+
end
|
193
|
+
|
194
|
+
if span && span.get_tag(Tracing::Metadata::Ext::HTTP::TAG_CLIENT_IP).nil?
|
195
|
+
request_header_collection = Datadog::Tracing::Contrib::Rack::Header::RequestHeaderCollection.new(env)
|
196
|
+
|
197
|
+
# always collect client ip, as this is part of AppSec provided functionality
|
198
|
+
Datadog::Tracing::ClientIp.set_client_ip_tag!(
|
199
|
+
span,
|
200
|
+
headers: request_header_collection,
|
201
|
+
remote_ip: env['REMOTE_ADDR']
|
202
|
+
)
|
203
|
+
end
|
204
|
+
end
|
205
|
+
|
180
206
|
def add_waf_runtime_tags(scope)
|
181
207
|
span = scope.service_entry_span
|
182
208
|
context = scope.processor_context
|
@@ -189,6 +215,10 @@ module Datadog
|
|
189
215
|
span.set_tag('_dd.appsec.waf.duration', context.time_ns / 1000.0)
|
190
216
|
span.set_tag('_dd.appsec.waf.duration_ext', context.time_ext_ns / 1000.0)
|
191
217
|
end
|
218
|
+
|
219
|
+
def to_rack_header(header)
|
220
|
+
@rack_headers[header] ||= Datadog::Tracing::Contrib::Rack::Header.to_rack_header(header)
|
221
|
+
end
|
192
222
|
end
|
193
223
|
end
|
194
224
|
end
|
data/lib/datadog/appsec/event.rb
CHANGED
@@ -2,9 +2,9 @@
|
|
2
2
|
|
3
3
|
require 'json'
|
4
4
|
require 'zlib'
|
5
|
-
require 'base64'
|
6
5
|
|
7
6
|
require_relative 'rate_limiter'
|
7
|
+
require_relative '../core/utils/base64'
|
8
8
|
|
9
9
|
module Datadog
|
10
10
|
module AppSec
|
@@ -140,7 +140,7 @@ module Datadog
|
|
140
140
|
private
|
141
141
|
|
142
142
|
def compressed_and_base64_encoded(value)
|
143
|
-
Base64.
|
143
|
+
Datadog::Core::Utils::Base64.strict_encode64(gzip(value))
|
144
144
|
rescue TypeError => e
|
145
145
|
Datadog.logger.debug do
|
146
146
|
"Failed to compress and encode value when populating AppSec::Event. Error: #{e.message}"
|
@@ -64,7 +64,8 @@ module Datadog
|
|
64
64
|
|
65
65
|
Telemetry::Client.new(
|
66
66
|
enabled: enabled,
|
67
|
-
heartbeat_interval_seconds: settings.telemetry.heartbeat_interval_seconds
|
67
|
+
heartbeat_interval_seconds: settings.telemetry.heartbeat_interval_seconds,
|
68
|
+
dependency_collection: settings.telemetry.dependency_collection
|
68
69
|
)
|
69
70
|
end
|
70
71
|
end
|
@@ -8,7 +8,13 @@ module Datadog
|
|
8
8
|
# Represents an instance of an integration configuration option
|
9
9
|
# @public_api
|
10
10
|
class Option
|
11
|
-
|
11
|
+
# @!attribute [r] definition
|
12
|
+
# The definition object that matches this option.
|
13
|
+
# @return [Configuration::OptionDefinition]
|
14
|
+
# @!attribute [r] precedence_set
|
15
|
+
# When this option was last set, what was the value precedence used?
|
16
|
+
# @return [Precedence::Value]
|
17
|
+
attr_reader :definition, :precedence_set
|
12
18
|
|
13
19
|
# Option setting precedence.
|
14
20
|
module Precedence
|
@@ -305,10 +311,6 @@ module Datadog
|
|
305
311
|
"but '#{ENV[effective_env]}' was provided"
|
306
312
|
end
|
307
313
|
|
308
|
-
# Used for testing
|
309
|
-
attr_reader :precedence_set
|
310
|
-
private :precedence_set
|
311
|
-
|
312
314
|
# Anchor object that represents a value that is not set.
|
313
315
|
# This is necessary because `nil` is a valid value to be set.
|
314
316
|
UNSET = Object.new
|
@@ -271,29 +271,43 @@ module Datadog
|
|
271
271
|
|
272
272
|
# Can be used to disable the gathering of names and versions of gems in use by the service, used to power
|
273
273
|
# grouping and categorization of stack traces.
|
274
|
-
option :code_provenance_enabled
|
274
|
+
option :code_provenance_enabled do |o|
|
275
|
+
o.type :bool
|
276
|
+
o.default true
|
277
|
+
end
|
275
278
|
|
276
279
|
# Forces enabling of profiling of time/resources spent in Garbage Collection.
|
277
280
|
#
|
278
281
|
# Note that setting this to "false" (or not setting it) will not prevent the feature from being
|
279
282
|
# being automatically enabled in the future.
|
280
283
|
#
|
281
|
-
#
|
282
|
-
|
283
|
-
|
284
|
-
|
285
|
-
|
286
|
-
|
287
|
-
|
284
|
+
# GC profiling is now on by default and controlled by {:gc_enabled}.
|
285
|
+
option :force_enable_gc_profiling do |o|
|
286
|
+
o.after_set do |_, _, precedence|
|
287
|
+
unless precedence == Datadog::Core::Configuration::Option::Precedence::DEFAULT
|
288
|
+
Datadog.logger.warn(
|
289
|
+
'The profiling.advanced.force_enable_gc_profiling setting has been deprecated for removal and no ' \
|
290
|
+
'longer does anything (the feature is now on by default). ' \
|
291
|
+
'Please remove this setting from your Datadog.configure block.'
|
292
|
+
)
|
293
|
+
end
|
294
|
+
end
|
295
|
+
end
|
296
|
+
|
297
|
+
# Can be used to enable/disable garbage collection profiling.
|
288
298
|
#
|
289
|
-
#
|
290
|
-
# versions.
|
299
|
+
# @warn To avoid https://bugs.ruby-lang.org/issues/18464 even when enabled, GC profiling is only started
|
300
|
+
# for Ruby versions 2.x, 3.1.4+, 3.2.3+ and 3.3.0+
|
301
|
+
# (more details in {Datadog::Profiling::Component.enable_gc_profiling?})
|
291
302
|
#
|
292
|
-
# @
|
293
|
-
|
294
|
-
|
303
|
+
# @warn Due to a VM bug in the Ractor implementation (https://bugs.ruby-lang.org/issues/19112) this feature
|
304
|
+
# stops working when Ractors get garbage collected.
|
305
|
+
#
|
306
|
+
# @default `DD_PROFILING_GC_ENABLED` environment variable, otherwise `true`
|
307
|
+
option :gc_enabled do |o|
|
295
308
|
o.type :bool
|
296
|
-
o.
|
309
|
+
o.env 'DD_PROFILING_GC_ENABLED'
|
310
|
+
o.default true
|
297
311
|
end
|
298
312
|
|
299
313
|
# Can be used to enable/disable the Datadog::Profiling.allocation_count feature.
|
@@ -646,6 +660,16 @@ module Datadog
|
|
646
660
|
# Client-side telemetry configuration
|
647
661
|
# @public_api
|
648
662
|
settings :telemetry do
|
663
|
+
# Whether the bundled Ruby gems as reported through telemetry.
|
664
|
+
#
|
665
|
+
# @default `DD_TELEMETRY_DEPENDENCY_COLLECTION_ENABLED` environment variable, otherwise `true`.
|
666
|
+
# @return [Boolean]
|
667
|
+
option :dependency_collection do |o|
|
668
|
+
o.type :bool
|
669
|
+
o.env Core::Telemetry::Ext::ENV_DEPENDENCY_COLLECTION
|
670
|
+
o.default true
|
671
|
+
end
|
672
|
+
|
649
673
|
# Enable telemetry collection. This allows telemetry events to be emitted to the telemetry API.
|
650
674
|
#
|
651
675
|
# @default `DD_INSTRUMENTATION_TELEMETRY_ENABLED` environment variable, otherwise `true`.
|
@@ -84,18 +84,23 @@ module Datadog
|
|
84
84
|
configuration = self.configuration
|
85
85
|
yield(configuration)
|
86
86
|
|
87
|
-
|
87
|
+
built_components = false
|
88
|
+
|
89
|
+
components = safely_synchronize do |write_components|
|
88
90
|
write_components.call(
|
89
91
|
if components?
|
90
92
|
replace_components!(configuration, @components)
|
91
93
|
else
|
92
94
|
components = build_components(configuration)
|
93
|
-
|
95
|
+
built_components = true
|
94
96
|
components
|
95
97
|
end
|
96
98
|
)
|
97
99
|
end
|
98
100
|
|
101
|
+
# Should only be called the first time components are built
|
102
|
+
components.telemetry.started! if built_components
|
103
|
+
|
99
104
|
configuration
|
100
105
|
end
|
101
106
|
|
@@ -195,9 +200,20 @@ module Datadog
|
|
195
200
|
current_components = COMPONENTS_READ_LOCK.synchronize { defined?(@components) && @components }
|
196
201
|
return current_components if current_components || !allow_initialization
|
197
202
|
|
198
|
-
|
199
|
-
|
203
|
+
built_components = false
|
204
|
+
|
205
|
+
components = safely_synchronize do |write_components|
|
206
|
+
if defined?(@components) && @components
|
207
|
+
@components
|
208
|
+
else
|
209
|
+
built_components = true
|
210
|
+
write_components.call(build_components(configuration))
|
211
|
+
end
|
200
212
|
end
|
213
|
+
|
214
|
+
# Should only be called the first time components are built
|
215
|
+
components&.telemetry&.started! if built_components
|
216
|
+
components
|
201
217
|
end
|
202
218
|
|
203
219
|
private
|
@@ -11,12 +11,18 @@ module Datadog
|
|
11
11
|
module Platform
|
12
12
|
module_function
|
13
13
|
|
14
|
+
# @return [String] ISA of host; `uname -m`
|
15
|
+
def architecture
|
16
|
+
Identity.lang_version >= '2.2' ? Etc.uname[:machine] : Gem::Platform.local.cpu
|
17
|
+
end
|
18
|
+
|
14
19
|
# @return [String] name of host; `uname -n`
|
15
20
|
def hostname
|
16
21
|
Identity.lang_version >= '2.2' ? Etc.uname[:nodename] : nil
|
17
22
|
end
|
18
23
|
|
19
|
-
#
|
24
|
+
# System name, normally `Linux` or `Darwin` (but 'Mac OS X' on JRuby);
|
25
|
+
# @return [String] name of kernel; `uname -s`.
|
20
26
|
def kernel_name
|
21
27
|
Identity.lang_version >= '2.2' ? Etc.uname[:sysname] : Gem::Platform.local.os.capitalize
|
22
28
|
end
|
@@ -1,5 +1,6 @@
|
|
1
1
|
# frozen_string_literal: true
|
2
2
|
|
3
|
+
require_relative '../../utils/base64'
|
3
4
|
require_relative '../../../appsec/remote'
|
4
5
|
require_relative '../../../tracing/remote'
|
5
6
|
|
@@ -53,7 +54,7 @@ module Datadog
|
|
53
54
|
cap_to_hexs = capabilities.reduce(:|).to_s(16).tap { |s| s.size.odd? && s.prepend('0') }.scan(/\h\h/)
|
54
55
|
binary = cap_to_hexs.each_with_object([]) { |hex, acc| acc << hex }.map { |e| e.to_i(16) }.pack('C*')
|
55
56
|
|
56
|
-
Base64.
|
57
|
+
Datadog::Core::Utils::Base64.strict_encode64(binary)
|
57
58
|
end
|
58
59
|
end
|
59
60
|
end
|
@@ -1,10 +1,10 @@
|
|
1
1
|
# frozen_string_literal: true
|
2
2
|
|
3
3
|
require 'json'
|
4
|
-
require 'base64'
|
5
4
|
|
6
5
|
require_relative '../config'
|
7
6
|
require_relative 'client'
|
7
|
+
require_relative '../../../utils/base64'
|
8
8
|
require_relative '../../../transport/http/response'
|
9
9
|
require_relative '../../../transport/http/api/endpoint'
|
10
10
|
|
@@ -51,7 +51,7 @@ module Datadog
|
|
51
51
|
|
52
52
|
# TODO: these fallbacks should be improved
|
53
53
|
roots = payload[:roots] || []
|
54
|
-
targets = payload[:targets] || Base64.
|
54
|
+
targets = payload[:targets] || Datadog::Core::Utils::Base64.strict_encode64('{}')
|
55
55
|
target_files = payload[:target_files] || []
|
56
56
|
client_configs = payload[:client_configs] || []
|
57
57
|
|
@@ -61,7 +61,7 @@ module Datadog
|
|
61
61
|
raise TypeError.new(String, root) unless root.is_a?(String)
|
62
62
|
|
63
63
|
decoded = begin
|
64
|
-
Base64.strict_decode64(root) # TODO: unprocessed, don't symbolize_names
|
64
|
+
Datadog::Core::Utils::Base64.strict_decode64(root) # TODO: unprocessed, don't symbolize_names
|
65
65
|
rescue ArgumentError
|
66
66
|
raise DecodeError.new(:roots, root)
|
67
67
|
end
|
@@ -81,7 +81,7 @@ module Datadog
|
|
81
81
|
|
82
82
|
@targets = begin
|
83
83
|
decoded = begin
|
84
|
-
Base64.strict_decode64(targets)
|
84
|
+
Datadog::Core::Utils::Base64.strict_decode64(targets)
|
85
85
|
rescue ArgumentError
|
86
86
|
raise DecodeError.new(:targets, targets)
|
87
87
|
end
|
@@ -109,7 +109,7 @@ module Datadog
|
|
109
109
|
raise TypeError.new(String, raw) unless raw.is_a?(String)
|
110
110
|
|
111
111
|
content = begin
|
112
|
-
Base64.strict_decode64(raw)
|
112
|
+
Datadog::Core::Utils::Base64.strict_decode64(raw)
|
113
113
|
rescue ArgumentError
|
114
114
|
raise DecodeError.new(:target_files, raw)
|
115
115
|
end
|
@@ -1,6 +1,7 @@
|
|
1
1
|
# frozen_string_literal: true
|
2
2
|
|
3
3
|
require_relative 'emitter'
|
4
|
+
require_relative 'event'
|
4
5
|
require_relative 'heartbeat'
|
5
6
|
require_relative '../utils/forking'
|
6
7
|
|
@@ -10,21 +11,25 @@ module Datadog
|
|
10
11
|
# Telemetry entrypoint, coordinates sending telemetry events at various points in app lifecycle.
|
11
12
|
class Client
|
12
13
|
attr_reader \
|
13
|
-
:emitter,
|
14
14
|
:enabled,
|
15
|
-
:unsupported
|
16
|
-
:worker
|
15
|
+
:unsupported
|
17
16
|
|
18
17
|
include Core::Utils::Forking
|
19
18
|
|
20
19
|
# @param enabled [Boolean] Determines whether telemetry events should be sent to the API
|
21
20
|
# @param heartbeat_interval_seconds [Float] How frequently heartbeats will be reported, in seconds.
|
22
|
-
|
21
|
+
# @param [Boolean] dependency_collection Whether to send the `app-dependencies-loaded` event
|
22
|
+
def initialize(heartbeat_interval_seconds:, dependency_collection:, enabled: true)
|
23
23
|
@enabled = enabled
|
24
24
|
@emitter = Emitter.new
|
25
25
|
@stopped = false
|
26
26
|
@unsupported = false
|
27
|
+
@started = false
|
28
|
+
@dependency_collection = dependency_collection
|
29
|
+
|
27
30
|
@worker = Telemetry::Heartbeat.new(enabled: @enabled, heartbeat_interval_seconds: heartbeat_interval_seconds) do
|
31
|
+
next unless @started # `started!` should be the first event, thus ensure that `heartbeat!` is not sent first.
|
32
|
+
|
28
33
|
heartbeat!
|
29
34
|
end
|
30
35
|
end
|
@@ -37,21 +42,24 @@ module Datadog
|
|
37
42
|
def started!
|
38
43
|
return if !@enabled || forked?
|
39
44
|
|
40
|
-
res = @emitter.request(
|
45
|
+
res = @emitter.request(Event::AppStarted.new)
|
41
46
|
|
42
47
|
if res.not_found? # Telemetry is only supported by agent versions 7.34 and up
|
43
48
|
Datadog.logger.debug('Agent does not support telemetry; disabling future telemetry events.')
|
44
49
|
disable!
|
45
50
|
@unsupported = true # Prevent telemetry from getting re-enabled
|
51
|
+
return res
|
46
52
|
end
|
47
53
|
|
48
|
-
|
54
|
+
@emitter.request(Event::AppDependenciesLoaded.new) if @dependency_collection
|
55
|
+
|
56
|
+
@started = true
|
49
57
|
end
|
50
58
|
|
51
59
|
def emit_closing!
|
52
60
|
return if !@enabled || forked?
|
53
61
|
|
54
|
-
@emitter.request(
|
62
|
+
@emitter.request(Event::AppClosing.new)
|
55
63
|
end
|
56
64
|
|
57
65
|
def stop!
|
@@ -64,14 +72,14 @@ module Datadog
|
|
64
72
|
def integrations_change!
|
65
73
|
return if !@enabled || forked?
|
66
74
|
|
67
|
-
@emitter.request(
|
75
|
+
@emitter.request(Event::AppIntegrationsChange.new)
|
68
76
|
end
|
69
77
|
|
70
78
|
# Report configuration changes caused by Remote Configuration.
|
71
79
|
def client_configuration_change!(changes)
|
72
80
|
return if !@enabled || forked?
|
73
81
|
|
74
|
-
@emitter.request(
|
82
|
+
@emitter.request(Event::AppClientConfigurationChange.new(changes, 'remote_config'))
|
75
83
|
end
|
76
84
|
|
77
85
|
private
|
@@ -79,7 +87,7 @@ module Datadog
|
|
79
87
|
def heartbeat!
|
80
88
|
return if !@enabled || forked?
|
81
89
|
|
82
|
-
@emitter.request(
|
90
|
+
@emitter.request(Event::AppHeartbeat.new)
|
83
91
|
end
|
84
92
|
end
|
85
93
|
end
|
@@ -1,6 +1,6 @@
|
|
1
1
|
# frozen_string_literal: true
|
2
2
|
|
3
|
-
require_relative '
|
3
|
+
require_relative 'request'
|
4
4
|
require_relative 'http/transport'
|
5
5
|
require_relative '../utils/sequence'
|
6
6
|
require_relative '../utils/forking'
|
@@ -14,7 +14,6 @@ module Datadog
|
|
14
14
|
|
15
15
|
extend Core::Utils::Forking
|
16
16
|
|
17
|
-
# @param sequence [Datadog::Core::Utils::Sequence] Sequence object that stores and increments a counter
|
18
17
|
# @param http_transport [Datadog::Core::Telemetry::Http::Transport] Transport object that can be used to send
|
19
18
|
# telemetry requests via the agent
|
20
19
|
def initialize(http_transport: Datadog::Core::Telemetry::Http::Transport.new)
|
@@ -22,18 +21,15 @@ module Datadog
|
|
22
21
|
end
|
23
22
|
|
24
23
|
# Retrieves and emits a TelemetryRequest object based on the request type specified
|
25
|
-
|
26
|
-
# @param data [Object] arbitrary object to be passed to the respective `request_type` handler
|
27
|
-
def request(request_type, data: nil)
|
24
|
+
def request(event)
|
28
25
|
begin
|
29
|
-
|
30
|
-
|
31
|
-
|
32
|
-
|
33
|
-
|
34
|
-
|
35
|
-
|
36
|
-
Datadog.logger.debug("Unable to send telemetry request for event `#{request_type}`: #{e}")
|
26
|
+
seq_id = self.class.sequence.next
|
27
|
+
payload = Request.build_payload(event, seq_id)
|
28
|
+
res = @http_transport.request(request_type: event.type, payload: payload.to_json)
|
29
|
+
Datadog.logger.debug { "Telemetry sent for event `#{event.type}` (status code: #{res.code})" }
|
30
|
+
res
|
31
|
+
rescue => e
|
32
|
+
Datadog.logger.debug("Unable to send telemetry request for event `#{event.type rescue 'unknown'}`: #{e}")
|
37
33
|
Telemetry::Http::InternalErrorResponse.new(e)
|
38
34
|
end
|
39
35
|
end
|