ddtrace 1.7.0 → 1.8.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 (102) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +50 -1
  3. data/README.md +2 -2
  4. data/ext/ddtrace_profiling_loader/extconf.rb +4 -1
  5. data/ext/ddtrace_profiling_native_extension/NativeExtensionDesign.md +1 -1
  6. data/ext/ddtrace_profiling_native_extension/clock_id_from_pthread.c +3 -2
  7. data/ext/ddtrace_profiling_native_extension/collectors_cpu_and_wall_time.c +15 -41
  8. data/ext/ddtrace_profiling_native_extension/collectors_cpu_and_wall_time.h +1 -1
  9. data/ext/ddtrace_profiling_native_extension/collectors_cpu_and_wall_time_worker.c +284 -74
  10. data/ext/ddtrace_profiling_native_extension/collectors_dynamic_sampling_rate.c +142 -0
  11. data/ext/ddtrace_profiling_native_extension/collectors_dynamic_sampling_rate.h +14 -0
  12. data/ext/ddtrace_profiling_native_extension/collectors_idle_sampling_helper.c +241 -0
  13. data/ext/ddtrace_profiling_native_extension/collectors_idle_sampling_helper.h +3 -0
  14. data/ext/ddtrace_profiling_native_extension/extconf.rb +21 -7
  15. data/ext/ddtrace_profiling_native_extension/helpers.h +5 -0
  16. data/ext/ddtrace_profiling_native_extension/native_extension_helpers.rb +8 -0
  17. data/ext/ddtrace_profiling_native_extension/private_vm_api_access.c +108 -24
  18. data/ext/ddtrace_profiling_native_extension/private_vm_api_access.h +9 -0
  19. data/ext/ddtrace_profiling_native_extension/profiling.c +205 -0
  20. data/ext/ddtrace_profiling_native_extension/ruby_helpers.c +86 -0
  21. data/ext/ddtrace_profiling_native_extension/ruby_helpers.h +28 -6
  22. data/ext/ddtrace_profiling_native_extension/setup_signal_handler.c +23 -4
  23. data/ext/ddtrace_profiling_native_extension/setup_signal_handler.h +4 -0
  24. data/ext/ddtrace_profiling_native_extension/stack_recorder.c +15 -18
  25. data/ext/ddtrace_profiling_native_extension/time_helpers.c +17 -0
  26. data/ext/ddtrace_profiling_native_extension/time_helpers.h +10 -0
  27. data/lib/datadog/core/configuration/components.rb +27 -6
  28. data/lib/datadog/core/configuration/ext.rb +18 -0
  29. data/lib/datadog/core/configuration/settings.rb +14 -341
  30. data/lib/datadog/core/diagnostics/health.rb +4 -22
  31. data/lib/datadog/core/environment/variable_helpers.rb +58 -10
  32. data/lib/datadog/core/utils.rb +0 -21
  33. data/lib/datadog/core.rb +21 -1
  34. data/lib/datadog/opentracer/distributed_headers.rb +2 -2
  35. data/lib/datadog/profiling/collectors/cpu_and_wall_time_worker.rb +16 -5
  36. data/lib/datadog/profiling/collectors/dynamic_sampling_rate.rb +14 -0
  37. data/lib/datadog/profiling/collectors/idle_sampling_helper.rb +68 -0
  38. data/lib/datadog/profiling/stack_recorder.rb +14 -0
  39. data/lib/datadog/profiling.rb +2 -0
  40. data/lib/datadog/tracing/configuration/ext.rb +33 -3
  41. data/lib/datadog/tracing/configuration/settings.rb +433 -0
  42. data/lib/datadog/tracing/contrib/aws/configuration/settings.rb +4 -1
  43. data/lib/datadog/tracing/contrib/aws/ext.rb +1 -0
  44. data/lib/datadog/tracing/contrib/dalli/configuration/settings.rb +4 -1
  45. data/lib/datadog/tracing/contrib/dalli/ext.rb +1 -0
  46. data/lib/datadog/tracing/contrib/elasticsearch/configuration/settings.rb +5 -1
  47. data/lib/datadog/tracing/contrib/elasticsearch/ext.rb +1 -0
  48. data/lib/datadog/tracing/contrib/ethon/configuration/settings.rb +6 -1
  49. data/lib/datadog/tracing/contrib/ethon/ext.rb +1 -0
  50. data/lib/datadog/tracing/contrib/excon/configuration/settings.rb +5 -1
  51. data/lib/datadog/tracing/contrib/excon/ext.rb +1 -0
  52. data/lib/datadog/tracing/contrib/faraday/configuration/settings.rb +5 -1
  53. data/lib/datadog/tracing/contrib/faraday/ext.rb +1 -0
  54. data/lib/datadog/tracing/contrib/grpc/configuration/settings.rb +6 -1
  55. data/lib/datadog/tracing/contrib/grpc/distributed/propagation.rb +9 -4
  56. data/lib/datadog/tracing/contrib/grpc/ext.rb +1 -0
  57. data/lib/datadog/tracing/contrib/http/configuration/settings.rb +6 -1
  58. data/lib/datadog/tracing/contrib/http/distributed/propagation.rb +9 -4
  59. data/lib/datadog/tracing/contrib/http/ext.rb +1 -0
  60. data/lib/datadog/tracing/contrib/httpclient/configuration/settings.rb +6 -1
  61. data/lib/datadog/tracing/contrib/httpclient/ext.rb +1 -0
  62. data/lib/datadog/tracing/contrib/httprb/configuration/settings.rb +6 -1
  63. data/lib/datadog/tracing/contrib/httprb/ext.rb +1 -0
  64. data/lib/datadog/tracing/contrib/mongodb/configuration/settings.rb +5 -1
  65. data/lib/datadog/tracing/contrib/mongodb/ext.rb +1 -0
  66. data/lib/datadog/tracing/contrib/mysql2/configuration/settings.rb +4 -1
  67. data/lib/datadog/tracing/contrib/mysql2/ext.rb +1 -0
  68. data/lib/datadog/tracing/contrib/mysql2/instrumentation.rb +2 -2
  69. data/lib/datadog/tracing/contrib/patcher.rb +3 -2
  70. data/lib/datadog/tracing/contrib/pg/configuration/settings.rb +4 -1
  71. data/lib/datadog/tracing/contrib/pg/ext.rb +1 -0
  72. data/lib/datadog/tracing/contrib/pg/instrumentation.rb +12 -2
  73. data/lib/datadog/tracing/contrib/presto/configuration/settings.rb +4 -1
  74. data/lib/datadog/tracing/contrib/presto/ext.rb +1 -0
  75. data/lib/datadog/tracing/contrib/propagation/sql_comment/ext.rb +1 -0
  76. data/lib/datadog/tracing/contrib/propagation/sql_comment.rb +10 -12
  77. data/lib/datadog/tracing/contrib/redis/configuration/settings.rb +4 -1
  78. data/lib/datadog/tracing/contrib/redis/ext.rb +1 -0
  79. data/lib/datadog/tracing/contrib/redis/instrumentation.rb +30 -23
  80. data/lib/datadog/tracing/contrib/redis/integration.rb +34 -2
  81. data/lib/datadog/tracing/contrib/redis/patcher.rb +18 -14
  82. data/lib/datadog/tracing/contrib/redis/quantize.rb +12 -9
  83. data/lib/datadog/tracing/contrib/redis/tags.rb +4 -6
  84. data/lib/datadog/tracing/contrib/redis/trace_middleware.rb +72 -0
  85. data/lib/datadog/tracing/contrib/rest_client/configuration/settings.rb +6 -1
  86. data/lib/datadog/tracing/contrib/rest_client/ext.rb +1 -0
  87. data/lib/datadog/{core → tracing}/diagnostics/ext.rb +1 -6
  88. data/lib/datadog/tracing/diagnostics/health.rb +40 -0
  89. data/lib/datadog/tracing/distributed/{b3.rb → b3_multi.rb} +2 -2
  90. data/lib/datadog/tracing/distributed/helpers.rb +2 -1
  91. data/lib/datadog/tracing/distributed/none.rb +19 -0
  92. data/lib/datadog/tracing/distributed/trace_context.rb +369 -0
  93. data/lib/datadog/tracing/metadata/ext.rb +1 -1
  94. data/lib/datadog/tracing/sampling/priority_sampler.rb +11 -0
  95. data/lib/datadog/tracing/sampling/rate_sampler.rb +3 -3
  96. data/lib/datadog/tracing/span.rb +3 -19
  97. data/lib/datadog/tracing/span_operation.rb +5 -4
  98. data/lib/datadog/tracing/trace_digest.rb +75 -2
  99. data/lib/datadog/tracing/trace_operation.rb +5 -4
  100. data/lib/datadog/tracing/utils.rb +50 -0
  101. data/lib/ddtrace/version.rb +1 -1
  102. metadata +20 -5
@@ -175,7 +175,7 @@ static VALUE _native_active_slot(DDTRACE_UNUSED VALUE _self, VALUE recorder_inst
175
175
  static VALUE _native_is_slot_one_mutex_locked(DDTRACE_UNUSED VALUE _self, VALUE recorder_instance);
176
176
  static VALUE _native_is_slot_two_mutex_locked(DDTRACE_UNUSED VALUE _self, VALUE recorder_instance);
177
177
  static VALUE test_slot_mutex_state(VALUE recorder_instance, int slot);
178
- static ddog_Timespec time_now();
178
+ static ddog_Timespec time_now(void);
179
179
  static VALUE _native_reset_after_fork(DDTRACE_UNUSED VALUE self, VALUE recorder_instance);
180
180
  static void serializer_set_start_timestamp_for_next_profile(struct stack_recorder_state *state, ddog_Timespec timestamp);
181
181
  static VALUE _native_record_endpoint(DDTRACE_UNUSED VALUE _self, VALUE recorder_instance, VALUE local_root_span_id, VALUE endpoint);
@@ -239,8 +239,7 @@ static void initialize_slot_concurrency_control(struct stack_recorder_state *sta
239
239
  state->slot_two_mutex = (pthread_mutex_t) PTHREAD_MUTEX_INITIALIZER;
240
240
 
241
241
  // A newly-created StackRecorder starts with slot one being active for samples, so let's lock slot two
242
- int error = pthread_mutex_lock(&state->slot_two_mutex);
243
- if (error) rb_syserr_fail(error, "Unexpected failure during pthread_mutex_lock");
242
+ ENFORCE_SUCCESS_GVL(pthread_mutex_lock(&state->slot_two_mutex));
244
243
 
245
244
  state->active_slot = 1;
246
245
  }
@@ -361,7 +360,7 @@ static struct active_slot_pair sampler_lock_active_profile(struct stack_recorder
361
360
 
362
361
  for (int attempts = 0; attempts < 2; attempts++) {
363
362
  error = pthread_mutex_trylock(&state->slot_one_mutex);
364
- if (error && error != EBUSY) rb_syserr_fail(error, "Unexpected failure during sampler_lock_active_profile for slot_one_mutex");
363
+ if (error && error != EBUSY) ENFORCE_SUCCESS_GVL(error);
365
364
 
366
365
  // Slot one is active
367
366
  if (!error) return (struct active_slot_pair) {.mutex = &state->slot_one_mutex, .profile = state->slot_one_profile};
@@ -369,7 +368,7 @@ static struct active_slot_pair sampler_lock_active_profile(struct stack_recorder
369
368
  // If we got here, slot one was not active, let's try slot two
370
369
 
371
370
  error = pthread_mutex_trylock(&state->slot_two_mutex);
372
- if (error && error != EBUSY) rb_syserr_fail(error, "Unexpected failure during sampler_lock_active_profile for slot_two_mutex");
371
+ if (error && error != EBUSY) ENFORCE_SUCCESS_GVL(error);
373
372
 
374
373
  // Slot two is active
375
374
  if (!error) return (struct active_slot_pair) {.mutex = &state->slot_two_mutex, .profile = state->slot_two_profile};
@@ -380,28 +379,24 @@ static struct active_slot_pair sampler_lock_active_profile(struct stack_recorder
380
379
  }
381
380
 
382
381
  static void sampler_unlock_active_profile(struct active_slot_pair active_slot) {
383
- int error = pthread_mutex_unlock(active_slot.mutex);
384
- if (error != 0) rb_syserr_fail(error, "Unexpected failure in sampler_unlock_active_profile");
382
+ ENFORCE_SUCCESS_GVL(pthread_mutex_unlock(active_slot.mutex));
385
383
  }
386
384
 
387
385
  static ddog_Profile *serializer_flip_active_and_inactive_slots(struct stack_recorder_state *state) {
388
- int error;
389
386
  int previously_active_slot = state->active_slot;
390
387
 
391
388
  if (previously_active_slot != 1 && previously_active_slot != 2) {
392
- rb_raise(rb_eRuntimeError, "Unexpected active_slot state %d in serializer_flip_active_and_inactive_slots", previously_active_slot);
389
+ grab_gvl_and_raise(rb_eRuntimeError, "Unexpected active_slot state %d in serializer_flip_active_and_inactive_slots", previously_active_slot);
393
390
  }
394
391
 
395
392
  pthread_mutex_t *previously_active = (previously_active_slot == 1) ? &state->slot_one_mutex : &state->slot_two_mutex;
396
393
  pthread_mutex_t *previously_inactive = (previously_active_slot == 1) ? &state->slot_two_mutex : &state->slot_one_mutex;
397
394
 
398
395
  // Release the lock, thus making this slot active
399
- error = pthread_mutex_unlock(previously_inactive);
400
- if (error) rb_syserr_fail(error, "Unexpected failure during serializer_flip_active_and_inactive_slots for previously_inactive");
396
+ ENFORCE_SUCCESS_NO_GVL(pthread_mutex_unlock(previously_inactive));
401
397
 
402
398
  // Grab the lock, thus making this slot inactive
403
- error = pthread_mutex_lock(previously_active);
404
- if (error) rb_syserr_fail(error, "Unexpected failure during serializer_flip_active_and_inactive_slots for previously_active");
399
+ ENFORCE_SUCCESS_NO_GVL(pthread_mutex_lock(previously_active));
405
400
 
406
401
  // Update active_slot
407
402
  state->active_slot = (previously_active_slot == 1) ? 2 : 1;
@@ -438,21 +433,23 @@ static VALUE test_slot_mutex_state(VALUE recorder_instance, int slot) {
438
433
 
439
434
  if (error == 0) {
440
435
  // Mutex was unlocked
441
- pthread_mutex_unlock(slot_mutex);
436
+ ENFORCE_SUCCESS_GVL(pthread_mutex_unlock(slot_mutex));
442
437
  return Qfalse;
443
438
  } else if (error == EBUSY) {
444
439
  // Mutex was locked
445
440
  return Qtrue;
446
441
  } else {
447
- rb_syserr_fail(error, "Unexpected failure when checking mutex state");
442
+ ENFORCE_SUCCESS_GVL(error);
443
+ rb_raise(rb_eRuntimeError, "Failed to raise exception in test_slot_mutex_state; this should never happen");
448
444
  }
449
445
  }
450
446
 
451
- // Note that this is using CLOCK_REALTIME (e.g. actual time since unix epoch) and not the CLOCK_MONOTONIC as we use in other parts of the codebase
452
- static ddog_Timespec time_now() {
447
+ // Note that this is using CLOCK_REALTIME (e.g. actual time since unix epoch) and not the CLOCK_MONOTONIC as we use in
448
+ // monotonic_wall_time_now_ns (used in other parts of the codebase)
449
+ static ddog_Timespec time_now(void) {
453
450
  struct timespec current_time;
454
451
 
455
- if (clock_gettime(CLOCK_REALTIME, &current_time) != 0) rb_sys_fail("Failed to read CLOCK_REALTIME");
452
+ if (clock_gettime(CLOCK_REALTIME, &current_time) != 0) ENFORCE_SUCCESS_GVL(errno);
456
453
 
457
454
  return (ddog_Timespec) {.seconds = current_time.tv_sec, .nanoseconds = (uint32_t) current_time.tv_nsec};
458
455
  }
@@ -0,0 +1,17 @@
1
+ #include <errno.h>
2
+ #include <time.h>
3
+
4
+ #include "ruby_helpers.h"
5
+ #include "time_helpers.h"
6
+
7
+ // Safety: This function is assumed never to raise exceptions by callers when raise_on_failure == false
8
+ long monotonic_wall_time_now_ns(bool raise_on_failure) {
9
+ struct timespec current_monotonic;
10
+
11
+ if (clock_gettime(CLOCK_MONOTONIC, &current_monotonic) != 0) {
12
+ if (raise_on_failure) ENFORCE_SUCCESS_GVL(errno);
13
+ return 0;
14
+ }
15
+
16
+ return current_monotonic.tv_nsec + SECONDS_AS_NS(current_monotonic.tv_sec);
17
+ }
@@ -0,0 +1,10 @@
1
+ #pragma once
2
+
3
+ #define SECONDS_AS_NS(value) (value * 1000 * 1000 * 1000L)
4
+ #define MILLIS_AS_NS(value) (value * 1000 * 1000L)
5
+
6
+ #define RAISE_ON_FAILURE true
7
+ #define DO_NOT_RAISE_ON_FAILURE false
8
+
9
+ // Safety: This function is assumed never to raise exceptions by callers when raise_on_failure == false
10
+ long monotonic_wall_time_now_ns(bool raise_on_failure);
@@ -248,6 +248,8 @@ module Datadog
248
248
  # NOTE: Please update the Initialization section of ProfilingDevelopment.md with any changes to this method
249
249
 
250
250
  if settings.profiling.advanced.force_enable_new_profiler
251
+ print_new_profiler_warnings
252
+
251
253
  recorder = Datadog::Profiling::StackRecorder.new
252
254
  collector = Datadog::Profiling::Collectors::CpuAndWallTimeWorker.new(
253
255
  recorder: recorder,
@@ -331,20 +333,39 @@ module Datadog
331
333
  end
332
334
 
333
335
  def should_enable_gc_profiling?(settings)
334
- return true if Gem::Version.new(RUBY_VERSION) < Gem::Version.new('3')
335
-
336
336
  # See comments on the setting definition for more context on why it exists.
337
337
  if settings.profiling.advanced.force_enable_gc_profiling
338
- Datadog.logger.debug(
339
- 'Profiling time/resources spent in Garbage Collection force enabled. Do not use Ractors in combination ' \
340
- 'with this option as profiles will be incomplete.'
341
- )
338
+ if Gem::Version.new(RUBY_VERSION) >= Gem::Version.new('3')
339
+ Datadog.logger.debug(
340
+ 'Profiling time/resources spent in Garbage Collection force enabled. Do not use Ractors in combination ' \
341
+ 'with this option as profiles will be incomplete.'
342
+ )
343
+ end
342
344
 
343
345
  true
344
346
  else
345
347
  false
346
348
  end
347
349
  end
350
+
351
+ def print_new_profiler_warnings
352
+ if Gem::Version.new(RUBY_VERSION) >= Gem::Version.new('2.6')
353
+ Datadog.logger.warn(
354
+ 'New Ruby profiler has been force-enabled. This feature is in beta state. We do not yet recommend ' \
355
+ 'running it in production environments. Please report any issues ' \
356
+ 'you run into to Datadog support or via <https://github.com/datadog/dd-trace-rb/issues/new>!'
357
+ )
358
+ else
359
+ # For more details on the issue, see the "BIG Issue" comment on `gvl_owner` function in
360
+ # `private_vm_api_access.c`.
361
+ Datadog.logger.warn(
362
+ 'New Ruby profiler has been force-enabled on a legacy Ruby version (< 2.6). This is not recommended in ' \
363
+ 'production environments, as due to limitations in Ruby APIs, we suspect it may lead to crashes in very ' \
364
+ 'rare situations. Please report any issues you run into to Datadog support or ' \
365
+ 'via <https://github.com/datadog/dd-trace-rb/issues/new>!'
366
+ )
367
+ end
368
+ end
348
369
  end
349
370
 
350
371
  attr_reader \
@@ -0,0 +1,18 @@
1
+ # typed: true
2
+
3
+ module Datadog
4
+ module Core
5
+ module Configuration
6
+ # Constants for configuration settings
7
+ # e.g. Env vars, default values, enums, etc...
8
+ module Ext
9
+ # @public_api
10
+ module Diagnostics
11
+ ENV_DEBUG_ENABLED = 'DD_TRACE_DEBUG'.freeze
12
+ ENV_HEALTH_METRICS_ENABLED = 'DD_HEALTH_METRICS_ENABLED'.freeze
13
+ ENV_STARTUP_LOGS_ENABLED = 'DD_TRACE_STARTUP_LOGS'.freeze
14
+ end
15
+ end
16
+ end
17
+ end
18
+ end
@@ -3,22 +3,27 @@
3
3
  require 'logger'
4
4
 
5
5
  require_relative 'base'
6
+ require_relative 'ext'
6
7
  require_relative '../environment/ext'
7
8
  require_relative '../runtime/ext'
8
9
  require_relative '../telemetry/ext'
9
10
  require_relative '../../profiling/ext'
10
- require_relative '../../tracing/configuration/ext'
11
+
12
+ require_relative '../../tracing/configuration/settings'
11
13
 
12
14
  module Datadog
13
15
  module Core
14
16
  module Configuration
15
- # Global configuration settings for the trace library.
17
+ # Global configuration settings for the Datadog library.
16
18
  # @public_api
17
19
  # rubocop:disable Metrics/BlockLength
18
- # rubocop:disable Layout/LineLength
19
20
  class Settings
20
21
  include Base
21
22
 
23
+ # TODO: Tracing should manage its own settings.
24
+ # Keep this extension here for now to keep things working.
25
+ extend Datadog::Tracing::Configuration::Settings
26
+
22
27
  # @!visibility private
23
28
  def initialize(*_)
24
29
  super
@@ -99,7 +104,7 @@ module Datadog
99
104
  # @default `DD_TRACE_DEBUG` environment variable, otherwise `false`
100
105
  # @return [Boolean]
101
106
  option :debug do |o|
102
- o.default { env_to_bool(Datadog::Core::Diagnostics::Ext::DD_TRACE_DEBUG, false) }
107
+ o.default { env_to_bool(Datadog::Core::Configuration::Ext::Diagnostics::ENV_DEBUG_ENABLED, false) }
103
108
  o.lazy
104
109
  o.on_set do |enabled|
105
110
  # Enable rich debug print statements.
@@ -110,7 +115,6 @@ module Datadog
110
115
 
111
116
  # Internal {Datadog::Statsd} metrics collection.
112
117
  #
113
- # The list of metrics collected can be found in {Datadog::Core::Diagnostics::Ext::Health::Metrics}.
114
118
  # @public_api
115
119
  settings :health_metrics do
116
120
  # Enable health metrics collection.
@@ -118,7 +122,7 @@ module Datadog
118
122
  # @default `DD_HEALTH_METRICS_ENABLED` environment variable, otherwise `false`
119
123
  # @return [Boolean]
120
124
  option :enabled do |o|
121
- o.default { env_to_bool(Datadog::Core::Diagnostics::Ext::Health::Metrics::ENV_ENABLED, false) }
125
+ o.default { env_to_bool(Datadog::Core::Configuration::Ext::Diagnostics::ENV_HEALTH_METRICS_ENABLED, false) }
122
126
  o.lazy
123
127
  end
124
128
 
@@ -144,7 +148,7 @@ module Datadog
144
148
  # @return [Boolean,nil]
145
149
  option :enabled do |o|
146
150
  # Defaults to nil as we want to know when the default value is being used
147
- o.default { env_to_bool(Datadog::Core::Diagnostics::Ext::DD_TRACE_STARTUP_LOGS, nil) }
151
+ o.default { env_to_bool(Datadog::Core::Configuration::Ext::Diagnostics::ENV_STARTUP_LOGS_ENABLED, nil) }
148
152
  o.lazy
149
153
  end
150
154
  end
@@ -269,7 +273,9 @@ module Datadog
269
273
  # If you use Ruby 3.x and your application does not use Ractors (or if your Ruby has been patched), the
270
274
  # feature is fully safe to enable and this toggle can be used to do so.
271
275
  #
272
- # We expect that once the above issue is patched, we'll automatically re-enable the feature on fixed Ruby
276
+ # Furthermore, currently this feature can add a lot of overhead for GC-heavy workloads.
277
+ #
278
+ # We expect the once the above issues are overcome, we'll automatically enable the feature on fixed Ruby
273
279
  # versions.
274
280
  option :force_enable_gc_profiling do |o|
275
281
  o.default { env_to_bool('DD_PROFILING_FORCE_ENABLE_GC', false) }
@@ -408,338 +414,6 @@ module Datadog
408
414
  end
409
415
  end
410
416
 
411
- # Tracer specific configurations.
412
- # @public_api
413
- settings :tracing do
414
- # Legacy [App Analytics](https://docs.datadoghq.com/tracing/legacy_app_analytics/) configuration.
415
- #
416
- # @configure_with {Datadog::Tracing}
417
- # @deprecated Use [Trace Retention and Ingestion](https://docs.datadoghq.com/tracing/trace_retention_and_ingestion/)
418
- # controls.
419
- # @public_api
420
- settings :analytics do
421
- # @default `DD_TRACE_ANALYTICS_ENABLED` environment variable, otherwise `nil`
422
- # @return [Boolean,nil]
423
- option :enabled do |o|
424
- o.default { env_to_bool(Tracing::Configuration::Ext::Analytics::ENV_TRACE_ANALYTICS_ENABLED, nil) }
425
- o.lazy
426
- end
427
- end
428
-
429
- # [Distributed Tracing](https://docs.datadoghq.com/tracing/setup_overview/setup/ruby/#distributed-tracing) propagation
430
- # style configuration.
431
- #
432
- # The supported formats are:
433
- # * `Datadog`: Datadog propagation format, described by [Distributed Tracing](https://docs.datadoghq.com/tracing/setup_overview/setup/ruby/#distributed-tracing).
434
- # * `B3`: B3 Propagation using multiple headers, described by [openzipkin/b3-propagation](https://github.com/openzipkin/b3-propagation#multiple-headers).
435
- # * `B3 single header`: B3 Propagation using a single header, described by [openzipkin/b3-propagation](https://github.com/openzipkin/b3-propagation#single-header).
436
- #
437
- # @public_api
438
- settings :distributed_tracing do
439
- # An ordered list of what data propagation styles the tracer will use to extract distributed tracing propagation
440
- # data from incoming requests and messages.
441
- #
442
- # The tracer will try to find distributed headers in the order they are present in the list provided to this option.
443
- # The first format to have valid data present will be used.
444
- #
445
- # @default `DD_PROPAGATION_STYLE_EXTRACT` environment variable (comma-separated list),
446
- # otherwise `['Datadog','B3','B3 single header']`.
447
- # @return [Array<String>]
448
- option :propagation_extract_style do |o|
449
- o.default do
450
- # Look for all headers by default
451
- env_to_list(
452
- Tracing::Configuration::Ext::Distributed::ENV_PROPAGATION_STYLE_EXTRACT,
453
- [
454
- Tracing::Configuration::Ext::Distributed::PROPAGATION_STYLE_DATADOG,
455
- Tracing::Configuration::Ext::Distributed::PROPAGATION_STYLE_B3,
456
- Tracing::Configuration::Ext::Distributed::PROPAGATION_STYLE_B3_SINGLE_HEADER
457
- ],
458
- comma_separated_only: true
459
- )
460
- end
461
-
462
- o.lazy
463
- end
464
-
465
- # The data propagation styles the tracer will use to inject distributed tracing propagation
466
- # data into outgoing requests and messages.
467
- #
468
- # The tracer will inject data from all styles specified in this option.
469
- #
470
- # @default `DD_PROPAGATION_STYLE_INJECT` environment variable (comma-separated list), otherwise `['Datadog']`.
471
- # @return [Array<String>]
472
- option :propagation_inject_style do |o|
473
- o.default do
474
- env_to_list(
475
- Tracing::Configuration::Ext::Distributed::ENV_PROPAGATION_STYLE_INJECT,
476
- [Tracing::Configuration::Ext::Distributed::PROPAGATION_STYLE_DATADOG],
477
- comma_separated_only: true # Only inject Datadog headers by default
478
- )
479
- end
480
-
481
- o.lazy
482
- end
483
- end
484
-
485
- # Enable trace collection and span generation.
486
- #
487
- # You can use this option to disable tracing without having to
488
- # remove the library as a whole.
489
- #
490
- # @default `DD_TRACE_ENABLED` environment variable, otherwise `true`
491
- # @return [Boolean]
492
- option :enabled do |o|
493
- o.default { env_to_bool(Datadog::Core::Diagnostics::Ext::DD_TRACE_ENABLED, true) }
494
- o.lazy
495
- end
496
-
497
- # A custom tracer instance.
498
- #
499
- # It must respect the contract of {Datadog::Tracing::Tracer}.
500
- # It's recommended to delegate methods to {Datadog::Tracing::Tracer} to ease the implementation
501
- # of a custom tracer.
502
- #
503
- # This option will not return the live tracer instance: it only holds a custom tracing instance, if any.
504
- #
505
- # For internal use only.
506
- #
507
- # @default `nil`
508
- # @return [Object,nil]
509
- option :instance
510
-
511
- # Automatic correlation between tracing and logging.
512
- # @see https://docs.datadoghq.com/tracing/setup_overview/setup/ruby/#trace-correlation
513
- # @return [Boolean]
514
- option :log_injection do |o|
515
- o.default { env_to_bool(Tracing::Configuration::Ext::Correlation::ENV_LOGS_INJECTION_ENABLED, true) }
516
- o.lazy
517
- end
518
-
519
- # Configures an alternative trace transport behavior, where
520
- # traces can be sent to the agent and backend before all spans
521
- # have finished.
522
- #
523
- # This is useful for long-running jobs or very large traces.
524
- #
525
- # The trace flame graph will display the partial trace as it is received and constantly
526
- # update with new spans as they are flushed.
527
- # @public_api
528
- settings :partial_flush do
529
- # Enable partial trace flushing.
530
- #
531
- # @default `false`
532
- # @return [Boolean]
533
- option :enabled, default: false
534
-
535
- # Minimum number of finished spans required in a single unfinished trace before
536
- # the tracer will consider that trace for partial flushing.
537
- #
538
- # This option helps preserve a minimum amount of batching in the
539
- # flushing process, reducing network overhead.
540
- #
541
- # This threshold only applies to unfinished traces. Traces that have finished
542
- # are always flushed immediately.
543
- #
544
- # @default 500
545
- # @return [Integer]
546
- option :min_spans_threshold, default: 500
547
- end
548
-
549
- # Enables {https://docs.datadoghq.com/tracing/trace_retention_and_ingestion/#datadog-intelligent-retention-filter
550
- # Datadog intelligent retention filter}.
551
- # @default `true`
552
- # @return [Boolean,nil]
553
- option :priority_sampling
554
-
555
- option :report_hostname do |o|
556
- o.default { env_to_bool(Tracing::Configuration::Ext::NET::ENV_REPORT_HOSTNAME, false) }
557
- o.lazy
558
- end
559
-
560
- # A custom sampler instance.
561
- # The object must respect the {Datadog::Tracing::Sampling::Sampler} interface.
562
- # @default `nil`
563
- # @return [Object,nil]
564
- option :sampler
565
-
566
- # Client-side sampling configuration.
567
- # @see https://docs.datadoghq.com/tracing/trace_ingestion/mechanisms/
568
- # @public_api
569
- settings :sampling do
570
- # Default sampling rate for the tracer.
571
- #
572
- # If `nil`, the trace uses an automatic sampling strategy that tries to ensure
573
- # the collection of traces that are considered important (e.g. traces with an error, traces
574
- # for resources not seen recently).
575
- #
576
- # @default `DD_TRACE_SAMPLE_RATE` environment variable, otherwise `nil`.
577
- # @return [Float,nil]
578
- option :default_rate do |o|
579
- o.default { env_to_float(Tracing::Configuration::Ext::Sampling::ENV_SAMPLE_RATE, nil) }
580
- o.lazy
581
- end
582
-
583
- # Rate limit for number of spans per second.
584
- #
585
- # Spans created above the limit will contribute to service metrics, but won't
586
- # have their payload stored.
587
- #
588
- # @default `DD_TRACE_RATE_LIMIT` environment variable, otherwise 100.
589
- # @return [Numeric,nil]
590
- option :rate_limit do |o|
591
- o.default { env_to_float(Tracing::Configuration::Ext::Sampling::ENV_RATE_LIMIT, 100) }
592
- o.lazy
593
- end
594
-
595
- # Single span sampling rules.
596
- # These rules allow a span to be kept when its encompassing trace is dropped.
597
- #
598
- # The syntax for single span sampling rules can be found here:
599
- # TODO: <Single Span Sampling documentation URL here>
600
- #
601
- # @default `DD_SPAN_SAMPLING_RULES` environment variable.
602
- # Otherwise, `ENV_SPAN_SAMPLING_RULES_FILE` environment variable.
603
- # Otherwise `nil`.
604
- # @return [String,nil]
605
- # @public_api
606
- option :span_rules do |o|
607
- o.default do
608
- rules = ENV[Tracing::Configuration::Ext::Sampling::Span::ENV_SPAN_SAMPLING_RULES]
609
- rules_file = ENV[Tracing::Configuration::Ext::Sampling::Span::ENV_SPAN_SAMPLING_RULES_FILE]
610
-
611
- if rules
612
- if rules_file
613
- Datadog.logger.warn(
614
- 'Both DD_SPAN_SAMPLING_RULES and DD_SPAN_SAMPLING_RULES_FILE were provided: only ' \
615
- 'DD_SPAN_SAMPLING_RULES will be used. Please do not provide DD_SPAN_SAMPLING_RULES_FILE when ' \
616
- 'also providing DD_SPAN_SAMPLING_RULES as their configuration conflicts. ' \
617
- "DD_SPAN_SAMPLING_RULES_FILE=#{rules_file} DD_SPAN_SAMPLING_RULES=#{rules}"
618
- )
619
- end
620
- rules
621
- elsif rules_file
622
- begin
623
- File.read(rules_file)
624
- rescue => e
625
- # `File#read` errors have clear and actionable messages, no need to add extra exception info.
626
- Datadog.logger.warn(
627
- "Cannot read span sampling rules file `#{rules_file}`: #{e.message}." \
628
- 'No span sampling rules will be applied.'
629
- )
630
- nil
631
- end
632
- end
633
- end
634
- o.lazy
635
- end
636
- end
637
-
638
- # [Continuous Integration Visibility](https://docs.datadoghq.com/continuous_integration/) configuration.
639
- # @public_api
640
- settings :test_mode do
641
- # Enable test mode. This allows the tracer to collect spans from test runs.
642
- #
643
- # It also prevents the tracer from collecting spans in a production environment. Only use in a test environment.
644
- #
645
- # @default `DD_TRACE_TEST_MODE_ENABLED` environment variable, otherwise `false`
646
- # @return [Boolean]
647
- option :enabled do |o|
648
- o.default { env_to_bool(Tracing::Configuration::Ext::Test::ENV_MODE_ENABLED, false) }
649
- o.lazy
650
- end
651
-
652
- option :trace_flush do |o|
653
- o.default { nil }
654
- o.lazy
655
- end
656
-
657
- option :writer_options do |o|
658
- o.default { {} }
659
- o.lazy
660
- end
661
- end
662
-
663
- # @see file:docs/GettingStarted.md#configuring-the-transport-layer Configuring the transport layer
664
- #
665
- # A {Proc} that configures a custom tracer transport.
666
- # @yield Receives a {Datadog::Transport::HTTP} that can be modified with custom adapters and settings.
667
- # @yieldparam [Datadog::Transport::HTTP] t transport to be configured.
668
- # @default `nil`
669
- # @return [Proc,nil]
670
- option :transport_options, default: nil
671
-
672
- # A custom writer instance.
673
- # The object must respect the {Datadog::Tracing::Writer} interface.
674
- #
675
- # This option is recommended for internal use only.
676
- #
677
- # @default `nil`
678
- # @return [Object,nil]
679
- option :writer
680
-
681
- # A custom {Hash} with keyword options to be passed to {Datadog::Tracing::Writer#initialize}.
682
- #
683
- # This option is recommended for internal use only.
684
- #
685
- # @default `{}`
686
- # @return [Hash,nil]
687
- option :writer_options, default: ->(_i) { {} }, lazy: true
688
-
689
- # Client IP configuration
690
- # @public_api
691
- settings :client_ip do
692
- # Whether client IP collection is enabled. When enabled client IPs from HTTP requests will
693
- # be reported in traces.
694
- #
695
- # Usage of the DD_TRACE_CLIENT_IP_HEADER_DISABLED environment variable is deprecated.
696
- #
697
- # @see https://docs.datadoghq.com/tracing/configure_data_security#configuring-a-client-ip-header
698
- #
699
- # @default `DD_TRACE_CLIENT_IP_ENABLED` environment variable, otherwise `false`.
700
- # @return [Boolean]
701
- option :enabled do |o|
702
- o.default do
703
- disabled = env_to_bool(Tracing::Configuration::Ext::ClientIp::ENV_DISABLED)
704
-
705
- enabled = if disabled.nil?
706
- false
707
- else
708
- Datadog.logger.warn { "#{Tracing::Configuration::Ext::ClientIp::ENV_DISABLED} environment variable is deprecated, found set to #{disabled}, use #{Tracing::Configuration::Ext::ClientIp::ENV_ENABLED}=#{!disabled}" }
709
-
710
- !disabled
711
- end
712
-
713
- # ENABLED env var takes precedence over deprecated DISABLED
714
- env_to_bool(Tracing::Configuration::Ext::ClientIp::ENV_ENABLED, enabled)
715
- end
716
- o.lazy
717
- end
718
-
719
- # An optional name of a custom header to resolve the client IP from.
720
- #
721
- # @default `DD_TRACE_CLIENT_IP_HEADER` environment variable, otherwise `nil`.
722
- # @return [String,nil]
723
- option :header_name do |o|
724
- o.default { ENV.fetch(Tracing::Configuration::Ext::ClientIp::ENV_HEADER_NAME, nil) }
725
- o.lazy
726
- end
727
- end
728
-
729
- # Maximum size for the `x-datadog-tags` distributed trace tags header.
730
- #
731
- # If the serialized size of distributed trace tags is larger than this value, it will
732
- # not be parsed if incoming, nor exported if outgoing. An error message will be logged
733
- # in this case.
734
- #
735
- # @default `DD_TRACE_X_DATADOG_TAGS_MAX_LENGTH` environment variable, otherwise `512`
736
- # @return [Integer]
737
- option :x_datadog_tags_max_length do |o|
738
- o.default { env_to_int(Tracing::Configuration::Ext::Distributed::ENV_X_DATADOG_TAGS_MAX_LENGTH, 512) }
739
- o.lazy
740
- end
741
- end
742
-
743
417
  # The `version` tag in Datadog. Use it to enable [Deployment Tracking](https://docs.datadoghq.com/tracing/deployment_tracking/).
744
418
  # @see https://docs.datadoghq.com/getting_started/tagging/unified_service_tagging
745
419
  # @default `DD_VERSION` environment variable, otherwise `nils`
@@ -765,7 +439,6 @@ module Datadog
765
439
  end
766
440
  end
767
441
  # rubocop:enable Metrics/BlockLength
768
- # rubocop:enable Layout/LineLength
769
442
  end
770
443
  end
771
444
  end
@@ -1,7 +1,7 @@
1
- # typed: strict
1
+ # typed: ignore
2
2
 
3
- require_relative 'ext'
4
3
  require_relative '../metrics/client'
4
+ require_relative '../../tracing/diagnostics/health'
5
5
 
6
6
  module Datadog
7
7
  module Core
@@ -10,26 +10,8 @@ module Datadog
10
10
  module Health
11
11
  # Health metrics for diagnostics
12
12
  class Metrics < Core::Metrics::Client
13
- count :api_errors, Ext::Health::Metrics::METRIC_API_ERRORS
14
- count :api_requests, Ext::Health::Metrics::METRIC_API_REQUESTS
15
- count :api_responses, Ext::Health::Metrics::METRIC_API_RESPONSES
16
- count :error_context_overflow, Ext::Health::Metrics::METRIC_ERROR_CONTEXT_OVERFLOW
17
- count :error_instrumentation_patch, Ext::Health::Metrics::METRIC_ERROR_INSTRUMENTATION_PATCH
18
- count :error_span_finish, Ext::Health::Metrics::METRIC_ERROR_SPAN_FINISH
19
- count :error_unfinished_spans, Ext::Health::Metrics::METRIC_ERROR_UNFINISHED_SPANS
20
- count :instrumentation_patched, Ext::Health::Metrics::METRIC_INSTRUMENTATION_PATCHED
21
- count :queue_accepted, Ext::Health::Metrics::METRIC_QUEUE_ACCEPTED
22
- count :queue_accepted_lengths, Ext::Health::Metrics::METRIC_QUEUE_ACCEPTED_LENGTHS
23
- count :queue_dropped, Ext::Health::Metrics::METRIC_QUEUE_DROPPED
24
- count :traces_filtered, Ext::Health::Metrics::METRIC_TRACES_FILTERED
25
- count :transport_trace_too_large, Ext::Health::Metrics::METRIC_TRANSPORT_TRACE_TOO_LARGE
26
- count :transport_chunked, Ext::Health::Metrics::METRIC_TRANSPORT_CHUNKED
27
- count :writer_cpu_time, Ext::Health::Metrics::METRIC_WRITER_CPU_TIME
28
-
29
- gauge :queue_length, Ext::Health::Metrics::METRIC_QUEUE_LENGTH
30
- gauge :queue_max_length, Ext::Health::Metrics::METRIC_QUEUE_MAX_LENGTH
31
- gauge :queue_spans, Ext::Health::Metrics::METRIC_QUEUE_SPANS
32
- gauge :sampling_service_cache_length, Ext::Health::Metrics::METRIC_SAMPLING_SERVICE_CACHE_LENGTH
13
+ # TODO: Don't reference this. Have tracing add its metrics behavior.
14
+ extend Tracing::Diagnostics::Health::Metrics
33
15
  end
34
16
  end
35
17
  end