datadog 2.31.0 → 2.33.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 (202) hide show
  1. checksums.yaml +4 -4
  2. data/ext/datadog_profiling_native_extension/clock_id.h +9 -1
  3. data/ext/datadog_profiling_native_extension/clock_id_from_mach.c +73 -0
  4. data/ext/datadog_profiling_native_extension/clock_id_from_pthread.c +1 -1
  5. data/ext/datadog_profiling_native_extension/collectors_cpu_and_wall_time_worker.c +17 -7
  6. data/ext/datadog_profiling_native_extension/collectors_thread_context.c +16 -5
  7. data/ext/datadog_profiling_native_extension/collectors_thread_context.h +6 -0
  8. data/ext/datadog_profiling_native_extension/extconf.rb +8 -4
  9. data/ext/datadog_profiling_native_extension/http_transport.c +10 -5
  10. data/ext/datadog_profiling_native_extension/stack_recorder.c +3 -9
  11. data/ext/datadog_profiling_native_extension/time_helpers.h +1 -0
  12. data/ext/libdatadog_api/crashtracker.c +2 -0
  13. data/ext/libdatadog_api/di.c +48 -0
  14. data/ext/libdatadog_api/extconf.rb +7 -4
  15. data/ext/libdatadog_extconf_helpers.rb +38 -1
  16. data/lib/datadog/ai_guard/autoload.rb +10 -0
  17. data/lib/datadog/ai_guard/component.rb +1 -1
  18. data/lib/datadog/ai_guard/configuration.rb +105 -2
  19. data/lib/datadog/ai_guard/contrib/auto_instrument.rb +24 -0
  20. data/lib/datadog/ai_guard/contrib/rack/integration.rb +42 -0
  21. data/lib/datadog/ai_guard/contrib/rack/patcher.rb +26 -0
  22. data/lib/datadog/ai_guard/contrib/rack/request_middleware.rb +83 -0
  23. data/lib/datadog/ai_guard/contrib/rails/integration.rb +41 -0
  24. data/lib/datadog/ai_guard/contrib/rails/patcher.rb +97 -0
  25. data/lib/datadog/ai_guard/evaluation.rb +2 -0
  26. data/lib/datadog/ai_guard/ext.rb +2 -0
  27. data/lib/datadog/ai_guard.rb +8 -0
  28. data/lib/datadog/appsec/autoload.rb +1 -1
  29. data/lib/datadog/appsec/component.rb +1 -1
  30. data/lib/datadog/appsec/configuration.rb +414 -1
  31. data/lib/datadog/appsec/contrib/aws_lambda/gateway/watcher.rb +75 -0
  32. data/lib/datadog/appsec/contrib/aws_lambda/integration.rb +39 -0
  33. data/lib/datadog/appsec/contrib/aws_lambda/patcher.rb +30 -0
  34. data/lib/datadog/appsec/contrib/aws_lambda/waf_addresses.rb +111 -0
  35. data/lib/datadog/appsec/contrib/devise/patches/signin_tracking_patch.rb +2 -1
  36. data/lib/datadog/appsec/contrib/rack/gateway/request.rb +1 -1
  37. data/lib/datadog/appsec/contrib/rails/patcher.rb +2 -2
  38. data/lib/datadog/appsec/metrics/telemetry.rb +13 -1
  39. data/lib/datadog/appsec/security_engine/runner.rb +1 -1
  40. data/lib/datadog/appsec/trace_keeper.rb +18 -6
  41. data/lib/datadog/appsec/utils/http/url_encoded.rb +2 -2
  42. data/lib/datadog/appsec.rb +1 -0
  43. data/lib/datadog/core/configuration/components.rb +1 -1
  44. data/lib/datadog/core/configuration/settings.rb +13 -0
  45. data/lib/datadog/core/configuration/supported_configurations.rb +4 -0
  46. data/lib/datadog/core/configuration.rb +1 -1
  47. data/lib/datadog/core/contrib/rails/utils.rb +1 -1
  48. data/lib/datadog/core/crashtracking/component.rb +3 -3
  49. data/lib/datadog/core/diagnostics/environment_logger.rb +3 -1
  50. data/lib/datadog/core/environment/container.rb +2 -2
  51. data/lib/datadog/core/environment/ext.rb +1 -0
  52. data/lib/datadog/core/environment/socket.rb +13 -0
  53. data/lib/datadog/core/feature_flags.rb +1 -1
  54. data/lib/datadog/core/metrics/client.rb +5 -5
  55. data/lib/datadog/core/remote/client.rb +1 -1
  56. data/lib/datadog/core/remote/component.rb +2 -2
  57. data/lib/datadog/core/runtime/metrics.rb +1 -1
  58. data/lib/datadog/core/telemetry/emitter.rb +1 -1
  59. data/lib/datadog/core/telemetry/event/app_started.rb +2 -2
  60. data/lib/datadog/core/transport/http.rb +2 -0
  61. data/lib/datadog/core/utils.rb +1 -1
  62. data/lib/datadog/core/workers/async.rb +1 -1
  63. data/lib/datadog/core.rb +1 -1
  64. data/lib/datadog/data_streams/configuration.rb +40 -1
  65. data/lib/datadog/data_streams/pathway_context.rb +1 -1
  66. data/lib/datadog/data_streams/processor.rb +1 -1
  67. data/lib/datadog/data_streams.rb +1 -1
  68. data/lib/datadog/di/base.rb +8 -5
  69. data/lib/datadog/di/code_tracker.rb +179 -1
  70. data/lib/datadog/di/component.rb +1 -1
  71. data/lib/datadog/di/configuration.rb +235 -2
  72. data/lib/datadog/di/instrumenter.rb +46 -26
  73. data/lib/datadog/di/probe_builder.rb +1 -1
  74. data/lib/datadog/di/probe_file_loader.rb +2 -2
  75. data/lib/datadog/di/probe_manager.rb +6 -6
  76. data/lib/datadog/di/probe_notification_builder.rb +1 -1
  77. data/lib/datadog/di/probe_notifier_worker.rb +2 -2
  78. data/lib/datadog/di/remote.rb +6 -6
  79. data/lib/datadog/di/serializer.rb +1 -1
  80. data/lib/datadog/di/transport/input.rb +3 -3
  81. data/lib/datadog/error_tracking/configuration.rb +55 -2
  82. data/lib/datadog/kit/enable_core_dumps.rb +1 -1
  83. data/lib/datadog/open_feature/component.rb +18 -1
  84. data/lib/datadog/open_feature/evaluation_engine.rb +3 -3
  85. data/lib/datadog/open_feature/exposures/reporter.rb +1 -1
  86. data/lib/datadog/open_feature/exposures/worker.rb +1 -1
  87. data/lib/datadog/open_feature/hooks/flag_eval_hook.rb +49 -0
  88. data/lib/datadog/open_feature/metrics/flag_eval_metrics.rb +149 -0
  89. data/lib/datadog/open_feature/provider.rb +19 -1
  90. data/lib/datadog/open_feature/remote.rb +1 -1
  91. data/lib/datadog/open_feature/transport.rb +1 -1
  92. data/lib/datadog/opentelemetry/metrics.rb +13 -4
  93. data/lib/datadog/opentelemetry/sdk/configurator.rb +1 -1
  94. data/lib/datadog/opentelemetry/sdk/id_generator.rb +16 -10
  95. data/lib/datadog/opentelemetry/sdk/metrics_exporter.rb +1 -1
  96. data/lib/datadog/profiling/collectors/code_provenance.rb +35 -9
  97. data/lib/datadog/profiling/collectors/cpu_and_wall_time_worker.rb +31 -2
  98. data/lib/datadog/profiling/collectors/idle_sampling_helper.rb +8 -2
  99. data/lib/datadog/profiling/collectors/info.rb +16 -3
  100. data/lib/datadog/profiling/component.rb +3 -6
  101. data/lib/datadog/profiling/exporter.rb +37 -12
  102. data/lib/datadog/profiling/ext.rb +0 -2
  103. data/lib/datadog/profiling/flush.rb +21 -12
  104. data/lib/datadog/profiling/http_transport.rb +12 -1
  105. data/lib/datadog/profiling/load_native_extension.rb +1 -1
  106. data/lib/datadog/profiling/profiler.rb +13 -1
  107. data/lib/datadog/profiling/scheduler.rb +2 -2
  108. data/lib/datadog/profiling/stack_recorder.rb +0 -4
  109. data/lib/datadog/profiling/tasks/exec.rb +8 -3
  110. data/lib/datadog/profiling/tasks/help.rb +1 -0
  111. data/lib/datadog/profiling/tasks/setup.rb +2 -2
  112. data/lib/datadog/single_step_instrument.rb +1 -1
  113. data/lib/datadog/symbol_database/configuration.rb +65 -0
  114. data/lib/datadog/symbol_database/extractor.rb +906 -0
  115. data/lib/datadog/symbol_database/file_hash.rb +46 -0
  116. data/lib/datadog/symbol_database/logger.rb +43 -0
  117. data/lib/datadog/symbol_database/scope.rb +102 -0
  118. data/lib/datadog/symbol_database/scope_batcher.rb +280 -0
  119. data/lib/datadog/symbol_database/service_version.rb +57 -0
  120. data/lib/datadog/symbol_database/symbol.rb +66 -0
  121. data/lib/datadog/symbol_database/transport/http/endpoint.rb +28 -0
  122. data/lib/datadog/symbol_database/transport/http.rb +45 -0
  123. data/lib/datadog/symbol_database/transport.rb +54 -0
  124. data/lib/datadog/symbol_database/uploader.rb +169 -0
  125. data/lib/datadog/symbol_database.rb +49 -0
  126. data/lib/datadog/tracing/buffer.rb +3 -3
  127. data/lib/datadog/tracing/configuration/settings.rb +1 -1
  128. data/lib/datadog/tracing/contrib/action_pack/action_controller/instrumentation.rb +5 -3
  129. data/lib/datadog/tracing/contrib/action_view/events/render_template.rb +1 -1
  130. data/lib/datadog/tracing/contrib/active_job/events/discard.rb +1 -1
  131. data/lib/datadog/tracing/contrib/active_job/events/enqueue.rb +1 -1
  132. data/lib/datadog/tracing/contrib/active_job/events/enqueue_at.rb +1 -1
  133. data/lib/datadog/tracing/contrib/active_job/events/enqueue_retry.rb +1 -1
  134. data/lib/datadog/tracing/contrib/active_job/events/perform.rb +1 -1
  135. data/lib/datadog/tracing/contrib/active_job/events/retry_stopped.rb +1 -1
  136. data/lib/datadog/tracing/contrib/active_model_serializers/events/render.rb +1 -1
  137. data/lib/datadog/tracing/contrib/active_model_serializers/events/serialize.rb +1 -1
  138. data/lib/datadog/tracing/contrib/active_record/configuration/resolver.rb +2 -2
  139. data/lib/datadog/tracing/contrib/active_record/events/instantiation.rb +1 -1
  140. data/lib/datadog/tracing/contrib/active_record/events/sql.rb +1 -1
  141. data/lib/datadog/tracing/contrib/active_record/utils.rb +1 -1
  142. data/lib/datadog/tracing/contrib/active_support/cache/events/cache.rb +1 -1
  143. data/lib/datadog/tracing/contrib/active_support/notifications/subscription.rb +2 -2
  144. data/lib/datadog/tracing/contrib/aws/instrumentation.rb +1 -1
  145. data/lib/datadog/tracing/contrib/component.rb +1 -1
  146. data/lib/datadog/tracing/contrib/configuration/resolver.rb +7 -4
  147. data/lib/datadog/tracing/contrib/dalli/quantize.rb +1 -1
  148. data/lib/datadog/tracing/contrib/elasticsearch/patcher.rb +1 -1
  149. data/lib/datadog/tracing/contrib/excon/middleware.rb +2 -2
  150. data/lib/datadog/tracing/contrib/extensions.rb +9 -0
  151. data/lib/datadog/tracing/contrib/faraday/middleware.rb +2 -2
  152. data/lib/datadog/tracing/contrib/grape/endpoint.rb +5 -5
  153. data/lib/datadog/tracing/contrib/grpc/datadog_interceptor/client.rb +2 -2
  154. data/lib/datadog/tracing/contrib/grpc/datadog_interceptor/server.rb +2 -2
  155. data/lib/datadog/tracing/contrib/http/instrumentation.rb +2 -2
  156. data/lib/datadog/tracing/contrib/httpclient/instrumentation.rb +6 -2
  157. data/lib/datadog/tracing/contrib/httprb/instrumentation.rb +2 -2
  158. data/lib/datadog/tracing/contrib/kafka/instrumentation/consumer.rb +2 -2
  159. data/lib/datadog/tracing/contrib/kafka/instrumentation/producer.rb +2 -2
  160. data/lib/datadog/tracing/contrib/karafka/patcher.rb +1 -1
  161. data/lib/datadog/tracing/contrib/mongodb/subscribers.rb +3 -3
  162. data/lib/datadog/tracing/contrib/opensearch/patcher.rb +1 -1
  163. data/lib/datadog/tracing/contrib/presto/instrumentation.rb +3 -3
  164. data/lib/datadog/tracing/contrib/rack/configuration/settings.rb +6 -0
  165. data/lib/datadog/tracing/contrib/rack/ext.rb +27 -0
  166. data/lib/datadog/tracing/contrib/rack/patcher.rb +1 -1
  167. data/lib/datadog/tracing/contrib/rack/request_queue.rb +1 -1
  168. data/lib/datadog/tracing/contrib/rack/trace_proxy_middleware.rb +117 -1
  169. data/lib/datadog/tracing/contrib/rails/log_injection.rb +1 -1
  170. data/lib/datadog/tracing/contrib/rails/runner.rb +1 -1
  171. data/lib/datadog/tracing/contrib/rake/instrumentation.rb +2 -2
  172. data/lib/datadog/tracing/contrib/redis/quantize.rb +1 -1
  173. data/lib/datadog/tracing/contrib/redis/tags.rb +1 -1
  174. data/lib/datadog/tracing/contrib/sidekiq/utils.rb +1 -1
  175. data/lib/datadog/tracing/contrib/stripe/request.rb +1 -1
  176. data/lib/datadog/tracing/contrib.rb +8 -0
  177. data/lib/datadog/tracing/diagnostics/environment_logger.rb +3 -1
  178. data/lib/datadog/tracing/distributed/baggage.rb +59 -5
  179. data/lib/datadog/tracing/distributed/datadog.rb +11 -11
  180. data/lib/datadog/tracing/distributed/datadog_tags_codec.rb +1 -1
  181. data/lib/datadog/tracing/distributed/propagation.rb +2 -2
  182. data/lib/datadog/tracing/distributed/trace_context.rb +74 -32
  183. data/lib/datadog/tracing/event.rb +1 -1
  184. data/lib/datadog/tracing/metadata/tagging.rb +2 -2
  185. data/lib/datadog/tracing/pipeline.rb +1 -1
  186. data/lib/datadog/tracing/remote.rb +1 -1
  187. data/lib/datadog/tracing/sampling/rule.rb +1 -1
  188. data/lib/datadog/tracing/sampling/rule_sampler.rb +2 -2
  189. data/lib/datadog/tracing/sampling/span/rule_parser.rb +2 -2
  190. data/lib/datadog/tracing/span_operation.rb +3 -3
  191. data/lib/datadog/tracing/trace_operation.rb +4 -4
  192. data/lib/datadog/tracing/tracer.rb +6 -8
  193. data/lib/datadog/tracing/transport/io/client.rb +1 -1
  194. data/lib/datadog/tracing/workers.rb +2 -1
  195. data/lib/datadog/version.rb +1 -1
  196. metadata +33 -12
  197. data/ext/datadog_profiling_native_extension/clock_id_noop.c +0 -21
  198. data/lib/datadog/ai_guard/configuration/settings.rb +0 -113
  199. data/lib/datadog/appsec/configuration/settings.rb +0 -423
  200. data/lib/datadog/data_streams/configuration/settings.rb +0 -49
  201. data/lib/datadog/di/configuration/settings.rb +0 -243
  202. data/lib/datadog/error_tracking/configuration/settings.rb +0 -63
@@ -77,7 +77,7 @@ module Datadog
77
77
 
78
78
  Thread.current[KEY_RUN] = true
79
79
  rescue => e
80
- Datadog.logger.error("#{e.class}: #{e}")
80
+ Datadog.logger.error("#{e.class}: #{e.message}")
81
81
  Datadog::Core::Telemetry::Logger.report(e)
82
82
  end
83
83
 
@@ -121,7 +121,7 @@ module Datadog
121
121
  span.finish(finish)
122
122
  end
123
123
  rescue => e
124
- Datadog.logger.error("#{e.class}: #{e}")
124
+ Datadog.logger.error("#{e.class}: #{e.message}")
125
125
  Datadog::Core::Telemetry::Logger.report(e)
126
126
  end
127
127
 
@@ -165,7 +165,7 @@ module Datadog
165
165
 
166
166
  Thread.current[KEY_RENDER] = true
167
167
  rescue => e
168
- Datadog.logger.error("#{e.class}: #{e}")
168
+ Datadog.logger.error("#{e.class}: #{e.message}")
169
169
  Datadog::Core::Telemetry::Logger.report(e)
170
170
  end
171
171
 
@@ -190,7 +190,7 @@ module Datadog
190
190
  span.finish(finish)
191
191
  end
192
192
  rescue => e
193
- Datadog.logger.error("#{e.class}: #{e}")
193
+ Datadog.logger.error("#{e.class}: #{e.message}")
194
194
  Datadog::Core::Telemetry::Logger.report(e)
195
195
  end
196
196
 
@@ -229,7 +229,7 @@ module Datadog
229
229
  span.finish(finish)
230
230
  end
231
231
  rescue => e
232
- Datadog.logger.error("#{e.class}: #{e}")
232
+ Datadog.logger.error("#{e.class}: #{e.message}")
233
233
  Datadog::Core::Telemetry::Logger.report(e)
234
234
  end
235
235
 
@@ -90,7 +90,7 @@ module Datadog
90
90
  end
91
91
  Contrib::SpanAttributeSchema.set_peer_service!(span, Ext::PEER_SERVICE_SOURCES)
92
92
  rescue => e
93
- Datadog.logger.debug("GRPC client trace failed: #{e}")
93
+ Datadog.logger.debug("GRPC client trace failed: #{e.class}: #{e.message}")
94
94
  end
95
95
 
96
96
  def find_deadline(call)
@@ -112,7 +112,7 @@ module Datadog
112
112
 
113
113
  Core::Utils.extract_host_port(peer_address)
114
114
  rescue => e
115
- Datadog.logger.debug { "Could not parse host:port from #{call}: #{e}" }
115
+ Datadog.logger.debug { "Could not parse host:port from #{call}: #{e.class}: #{e.message}" }
116
116
  nil
117
117
  end
118
118
  end
@@ -54,7 +54,7 @@ module Datadog
54
54
  Tracing.continue_trace!(GRPC.extract(metadata))
55
55
  rescue => e
56
56
  Datadog.logger.debug(
57
- "unable to propagate GRPC metadata to context: #{e}"
57
+ "unable to propagate GRPC metadata to context: #{e.class}: #{e.message}"
58
58
  )
59
59
  end
60
60
 
@@ -86,7 +86,7 @@ module Datadog
86
86
  # Measure service stats
87
87
  Contrib::Analytics.set_measured(span)
88
88
  rescue => e
89
- Datadog.logger.debug("GRPC server trace failed: #{e}")
89
+ Datadog.logger.debug("GRPC server trace failed: #{e.class}: #{e.message}")
90
90
  end
91
91
  end
92
92
  end
@@ -93,7 +93,7 @@ module Datadog
93
93
 
94
94
  Contrib::SpanAttributeSchema.set_peer_service!(span, Ext::PEER_SERVICE_SOURCES)
95
95
  rescue => e
96
- Datadog.logger.error("error preparing span from http request: #{e}")
96
+ Datadog.logger.error("error preparing span from http request: #{e.class}: #{e.message}")
97
97
  Datadog::Core::Telemetry::Logger.report(e)
98
98
  end
99
99
 
@@ -108,7 +108,7 @@ module Datadog
108
108
  Datadog.configuration.tracing.header_tags.response_tags(response)
109
109
  )
110
110
  rescue => e
111
- Datadog.logger.error("error preparing span from http response: #{e}")
111
+ Datadog.logger.error("error preparing span from http response: #{e.class}: #{e.message}")
112
112
  Datadog::Core::Telemetry::Logger.report(e)
113
113
  end
114
114
 
@@ -41,7 +41,9 @@ module Datadog
41
41
  # Add additional request specific tags to the span.
42
42
  annotate_span_with_request!(span, req, request_options)
43
43
  rescue => e
44
- Datadog.logger.error("error preparing span for httpclient request: #{e}, Source: #{e.backtrace}")
44
+ Datadog.logger.error(
45
+ "error preparing span for httpclient request: #{e.class}: #{e.message}, Source: #{e.backtrace}"
46
+ )
45
47
  Datadog::Core::Telemetry::Logger.report(e)
46
48
  ensure
47
49
  res = super
@@ -107,7 +109,9 @@ module Datadog
107
109
  Datadog.configuration.tracing.header_tags.response_tags(response.header)
108
110
  )
109
111
  rescue => e
110
- Datadog.logger.error("error preparing span from httpclient response: #{e}, Source: #{e.backtrace}")
112
+ Datadog.logger.error(
113
+ "error preparing span from httpclient response: #{e.class}: #{e.message}, Source: #{e.backtrace}"
114
+ )
111
115
  Datadog::Core::Telemetry::Logger.report(e)
112
116
  end
113
117
 
@@ -41,7 +41,7 @@ module Datadog
41
41
  # Add additional request specific tags to the span.
42
42
  annotate_span_with_request!(span, req, request_options)
43
43
  rescue => e
44
- logger.error("error preparing span for http.rb request: #{e}, Source: #{e.backtrace}")
44
+ logger.error("error preparing span for http.rb request: #{e.class}: #{e.message}, Source: #{e.backtrace}")
45
45
  Datadog::Core::Telemetry::Logger.report(e)
46
46
  ensure
47
47
  res = super(req, options)
@@ -117,7 +117,7 @@ module Datadog
117
117
  Datadog.configuration.tracing.header_tags.response_tags(response.headers)
118
118
  )
119
119
  rescue => e
120
- logger.error("error preparing span from http.rb response: #{e}, Source: #{e.backtrace}")
120
+ logger.error("error preparing span from http.rb response: #{e.class}: #{e.message}, Source: #{e.backtrace}")
121
121
  Datadog::Core::Telemetry::Logger.report(e)
122
122
  end
123
123
 
@@ -27,7 +27,7 @@ module Datadog
27
27
  auto_instrumentation: true
28
28
  ) { |key| headers[key] }
29
29
  rescue => e
30
- Datadog.logger.debug("Error setting DSM checkpoint: #{e.class}: #{e}")
30
+ Datadog.logger.debug("Error setting DSM checkpoint: #{e.class}: #{e.message}")
31
31
  end
32
32
 
33
33
  yield(message) if block
@@ -49,7 +49,7 @@ module Datadog
49
49
  auto_instrumentation: true
50
50
  )
51
51
  rescue => e
52
- Datadog.logger.debug("Error setting DSM checkpoint: #{e.class}: #{e}")
52
+ Datadog.logger.debug("Error setting DSM checkpoint: #{e.class}: #{e.message}")
53
53
  end
54
54
 
55
55
  yield(batch) if block
@@ -30,7 +30,7 @@ module Datadog
30
30
  end
31
31
  end
32
32
  rescue => e
33
- Datadog.logger.debug("Error setting DSM checkpoint: #{e.class}: #{e}")
33
+ Datadog.logger.debug("Error setting DSM checkpoint: #{e.class}: #{e.message}")
34
34
  end
35
35
  end
36
36
 
@@ -51,7 +51,7 @@ module Datadog
51
51
  end
52
52
  end
53
53
  rescue => e
54
- Datadog.logger.debug("Error setting DSM checkpoint: #{e.class}: #{e}")
54
+ Datadog.logger.debug("Error setting DSM checkpoint: #{e.class}: #{e.message}")
55
55
  end
56
56
  end
57
57
 
@@ -49,7 +49,7 @@ module Datadog
49
49
  auto_instrumentation: true
50
50
  ) { |key| headers[key] }
51
51
  rescue => e
52
- Datadog.logger.debug("Error setting DSM checkpoint: #{e.class}: #{e}")
52
+ Datadog.logger.debug("Error setting DSM checkpoint: #{e.class}: #{e.message}")
53
53
  end
54
54
  end
55
55
 
@@ -73,7 +73,7 @@ module Datadog
73
73
  # set the resource with the quantized query
74
74
  span.resource = serialized_query
75
75
  rescue => e
76
- Datadog.logger.debug("error when handling MongoDB 'started' event: #{e}")
76
+ Datadog.logger.debug("error when handling MongoDB 'started' event: #{e.class}: #{e.message}")
77
77
  end
78
78
  # rubocop:enable Metrics/AbcSize
79
79
 
@@ -85,7 +85,7 @@ module Datadog
85
85
  # the framework itself, so we set only the error and the message
86
86
  span.set_error(event)
87
87
  rescue => e
88
- Datadog.logger.debug("error when handling MongoDB 'failed' event: #{e}")
88
+ Datadog.logger.debug("error when handling MongoDB 'failed' event: #{e.class}: #{e.message}")
89
89
  ensure
90
90
  # whatever happens, the Span must be removed from the local storage and
91
91
  # it must be finished to prevent any leak
@@ -101,7 +101,7 @@ module Datadog
101
101
  rows = event.reply.fetch('n', nil)
102
102
  span.set_tag(Ext::TAG_ROWS, rows) unless rows.nil?
103
103
  rescue => e
104
- Datadog.logger.debug("error when handling MongoDB 'succeeded' event: #{e}")
104
+ Datadog.logger.debug("error when handling MongoDB 'succeeded' event: #{e.class}: #{e.message}")
105
105
  ensure
106
106
  # whatever happens, the Span must be removed from the local storage and
107
107
  # it must be finished to prevent any leak
@@ -84,7 +84,7 @@ module Datadog
84
84
  span.resource = "#{method} #{quantized_url}"
85
85
  Contrib::SpanAttributeSchema.set_peer_service!(span, Ext::PEER_SERVICE_SOURCES)
86
86
  rescue => e
87
- Datadog.logger.error("#{e.class}: #{e}")
87
+ Datadog.logger.error("#{e.class}: #{e.message}")
88
88
  Datadog::Core::Telemetry::Logger.report(e)
89
89
  # TODO: Refactor the code to streamline the execution without ensure
90
90
  ensure
@@ -28,7 +28,7 @@ module Datadog
28
28
  span.type = Tracing::Metadata::Ext::SQL::TYPE
29
29
  span.set_tag(Ext::TAG_QUERY_ASYNC, false)
30
30
  rescue => e
31
- Datadog.logger.debug("error preparing span for presto: #{e}")
31
+ Datadog.logger.debug("error preparing span for presto: #{e.class}: #{e.message}")
32
32
  end
33
33
 
34
34
  super(query)
@@ -46,7 +46,7 @@ module Datadog
46
46
  span.type = Tracing::Metadata::Ext::SQL::TYPE
47
47
  span.set_tag(Ext::TAG_QUERY_ASYNC, !blk.nil?)
48
48
  rescue => e
49
- Datadog.logger.debug("error preparing span for presto: #{e}")
49
+ Datadog.logger.debug("error preparing span for presto: #{e.class}: #{e.message}")
50
50
  end
51
51
 
52
52
  super(query, &blk)
@@ -65,7 +65,7 @@ module Datadog
65
65
  # ^ not an SQL type span, since there's no SQL query
66
66
  span.set_tag(Ext::TAG_QUERY_ID, query_id)
67
67
  rescue => e
68
- Datadog.logger.debug("error preparing span for presto: #{e}")
68
+ Datadog.logger.debug("error preparing span for presto: #{e.class}: #{e.message}")
69
69
  end
70
70
 
71
71
  super(query_id)
@@ -54,6 +54,12 @@ module Datadog
54
54
  o.type :string, nilable: true
55
55
  end
56
56
 
57
+ option :inferred_proxy_enabled do |o|
58
+ o.type :bool
59
+ o.env Ext::ENV_INFERRED_PROXY_ENABLED
60
+ o.default false
61
+ end
62
+
57
63
  option :web_service_name, default: Ext::DEFAULT_PEER_WEBSERVER_SERVICE_NAME, type: :string
58
64
  end
59
65
  end
@@ -9,6 +9,7 @@ module Datadog
9
9
  module Ext
10
10
  ENV_ENABLED = 'DD_TRACE_RACK_ENABLED'
11
11
  ENV_DISTRIBUTED_TRACING = 'DD_TRACE_RACK_DISTRIBUTED_TRACING'
12
+ ENV_INFERRED_PROXY_ENABLED = 'DD_TRACE_INFERRED_PROXY_SERVICES_ENABLED'
12
13
  # @!visibility private
13
14
  ENV_ANALYTICS_ENABLED = 'DD_TRACE_RACK_ANALYTICS_ENABLED'
14
15
  ENV_ANALYTICS_SAMPLE_RATE = 'DD_TRACE_RACK_ANALYTICS_SAMPLE_RATE'
@@ -24,6 +25,32 @@ module Datadog
24
25
  TAG_OPERATION_HTTP_SERVER_QUEUE = 'queue'
25
26
  WEBSERVER_APP = 'webserver'
26
27
  DEFAULT_PEER_WEBSERVER_SERVICE_NAME = 'web-server'
28
+
29
+ # @!visibility private
30
+ HEADER_X_DD_PROXY = 'HTTP_X_DD_PROXY'
31
+ HEADER_X_DD_PROXY_REQUEST_TIME_MS = 'HTTP_X_DD_PROXY_REQUEST_TIME_MS'
32
+ HEADER_X_DD_PROXY_PATH = 'HTTP_X_DD_PROXY_PATH'
33
+ HEADER_X_DD_PROXY_RESOURCE_PATH = 'HTTP_X_DD_PROXY_RESOURCE_PATH'
34
+ HEADER_X_DD_PROXY_HTTPMETHOD = 'HTTP_X_DD_PROXY_HTTPMETHOD'
35
+ HEADER_X_DD_PROXY_DOMAIN_NAME = 'HTTP_X_DD_PROXY_DOMAIN_NAME'
36
+ HEADER_X_DD_PROXY_STAGE = 'HTTP_X_DD_PROXY_STAGE'
37
+ HEADER_X_DD_PROXY_ACCOUNT_ID = 'HTTP_X_DD_PROXY_ACCOUNT_ID'
38
+ HEADER_X_DD_PROXY_API_ID = 'HTTP_X_DD_PROXY_API_ID'
39
+ HEADER_X_DD_PROXY_REGION = 'HTTP_X_DD_PROXY_REGION'
40
+ HEADER_X_DD_PROXY_USER = 'HTTP_X_DD_PROXY_USER'
41
+
42
+ PROXY_AWS_APIGATEWAY = 'aws-apigateway'
43
+ PROXY_AWS_HTTPAPI = 'aws-httpapi'
44
+
45
+ SPAN_AWS_APIGATEWAY = 'aws.apigateway'
46
+ SPAN_AWS_HTTPAPI = 'aws.httpapi'
47
+
48
+ PROXY_SPAN_NAMES = {
49
+ PROXY_AWS_APIGATEWAY => SPAN_AWS_APIGATEWAY,
50
+ PROXY_AWS_HTTPAPI => SPAN_AWS_HTTPAPI,
51
+ }.freeze
52
+
53
+ TAG_INFERRED_SPAN = '_dd.inferred_span'
27
54
  end
28
55
  end
29
56
  end
@@ -41,7 +41,7 @@ module Datadog
41
41
  # context of middleware patching outside a Rails server process (eg. a
42
42
  # process that doesn't serve HTTP requests but has Rails environment
43
43
  # loaded such as a Resque master process)
44
- Datadog.logger.debug("Error patching middleware stack: #{e}")
44
+ Datadog.logger.debug("Error patching middleware stack: #{e.class}: #{e.message}")
45
45
  end
46
46
 
47
47
  def retain_middleware_name(middleware)
@@ -39,7 +39,7 @@ module Datadog
39
39
  rescue => e
40
40
  # in case of an Exception we don't create a
41
41
  # `request.queuing` span
42
- Datadog.logger.debug("[rack] unable to parse request queue headers: #{e}")
42
+ Datadog.logger.debug("[rack] unable to parse request queue headers: #{e.class}: #{e.message}")
43
43
  nil
44
44
  end
45
45
  end
@@ -13,7 +13,11 @@ module Datadog
13
13
  module TraceProxyMiddleware
14
14
  module_function
15
15
 
16
- def call(env, configuration)
16
+ def call(env, configuration, &block)
17
+ if configuration[:inferred_proxy_enabled] &&
18
+ (proxy_type = env[Ext::HEADER_X_DD_PROXY]) && !proxy_type.empty?
19
+ return call_with_inferred_proxy(env, proxy_type, &block)
20
+ end
17
21
  return yield unless configuration[:request_queuing]
18
22
 
19
23
  # parse the request queue time
@@ -51,6 +55,118 @@ module Datadog
51
55
  queue_span&.finish
52
56
  request_span&.finish
53
57
  end
58
+
59
+ # Creates a virtual parent span representing the upstream proxy
60
+ # that wraps the actual request processing.
61
+ #
62
+ # rubocop:disable Metrics/CyclomaticComplexity, Metrics/PerceivedComplexity
63
+ def call_with_inferred_proxy(env, proxy_type)
64
+ span_name = Ext::PROXY_SPAN_NAMES[proxy_type]
65
+ return yield unless span_name
66
+
67
+ request_time_ms = env[Ext::HEADER_X_DD_PROXY_REQUEST_TIME_MS].to_f
68
+ return yield unless request_time_ms.positive?
69
+
70
+ path = env[Ext::HEADER_X_DD_PROXY_PATH]
71
+ stage = env[Ext::HEADER_X_DD_PROXY_STAGE]
72
+ domain = env[Ext::HEADER_X_DD_PROXY_DOMAIN_NAME]
73
+ http_method = env[Ext::HEADER_X_DD_PROXY_HTTPMETHOD]
74
+ resource_path = env[Ext::HEADER_X_DD_PROXY_RESOURCE_PATH]
75
+
76
+ # NOTE: resource_path is the parameterized route (e.g. /users/{id}) vs literal path
77
+ resource = "#{http_method} #{resource_path || path}" if http_method
78
+
79
+ inferred_span = Tracing.trace(
80
+ span_name,
81
+ service: domain,
82
+ type: Tracing::Metadata::Ext::AppTypes::TYPE_WEB,
83
+ start_time: Time.at(request_time_ms / 1_000),
84
+ )
85
+ inferred_span.resource = resource if resource
86
+ inferred_span.set_tag(Tracing::Metadata::Ext::TAG_COMPONENT, proxy_type)
87
+ inferred_span.set_tag(Tracing::Metadata::Ext::TAG_KIND, Tracing::Metadata::Ext::SpanKind::TAG_SERVER)
88
+ inferred_span.set_tag('stage', stage) if stage
89
+ inferred_span.set_tag(Tracing::Metadata::Ext::HTTP::TAG_METHOD, http_method) if http_method
90
+ inferred_span.set_tag(Tracing::Metadata::Ext::HTTP::TAG_URL, "https://#{domain}#{path}") if domain && path
91
+ inferred_span.set_tag(Tracing::Metadata::Ext::HTTP::TAG_ROUTE, resource_path) if resource_path
92
+ inferred_span.set_metric(Ext::TAG_INFERRED_SPAN, 1)
93
+
94
+ set_optional_tags(inferred_span, env: env, proxy_type: proxy_type)
95
+
96
+ yield
97
+ # NOTE: The underlying {Rack::TraceMiddleware} rescues {Exception}
98
+ # to tag the request span with error details.
99
+ # We must propagate errors to the inferred proxy parent span.
100
+ rescue Exception => e # rubocop:disable Lint/RescueException
101
+ inferred_span&.set_error(e)
102
+ raise
103
+ ensure
104
+ if inferred_span
105
+ propagate_request_span_tags(inferred_span, env: env)
106
+
107
+ if (trace = Tracing.active_trace) && resource
108
+ trace.resource = resource
109
+ end
110
+
111
+ inferred_span.finish
112
+ end
113
+ end
114
+ # rubocop:enable Metrics/CyclomaticComplexity, Metrics/PerceivedComplexity
115
+
116
+ # Sets cloud provider metadata and constructs the resource ARN.
117
+ #
118
+ # rubocop:disable Metrics/CyclomaticComplexity, Metrics/PerceivedComplexity
119
+ def set_optional_tags(span, env:, proxy_type:)
120
+ api_id = env[Ext::HEADER_X_DD_PROXY_API_ID]
121
+ region = env[Ext::HEADER_X_DD_PROXY_REGION]
122
+
123
+ # API Gateway v1 sends region as a single-quoted string
124
+ region = region.delete("'") if region
125
+
126
+ span.set_tag('apiid', api_id) if api_id
127
+ span.set_tag('region', region) if region
128
+
129
+ if (account_id = env[Ext::HEADER_X_DD_PROXY_ACCOUNT_ID])
130
+ span.set_tag('account_id', account_id)
131
+ end
132
+
133
+ if (user = env[Ext::HEADER_X_DD_PROXY_USER])
134
+ span.set_tag('aws_user', user)
135
+ end
136
+
137
+ if api_id && region
138
+ # NOTE: Update this when adding non-AWS proxy types.
139
+ restapi_prefix = (proxy_type == Ext::PROXY_AWS_APIGATEWAY) ? 'restapis' : 'apis'
140
+ span.set_tag('dd_resource_key', "arn:aws:apigateway:#{region}::/#{restapi_prefix}/#{api_id}")
141
+ end
142
+ end
143
+ # rubocop:enable Metrics/CyclomaticComplexity, Metrics/PerceivedComplexity
144
+
145
+ # Propagates response-level and security tags from the request span to
146
+ # the inferred parent.
147
+ def propagate_request_span_tags(span, env:)
148
+ rack_span = env[Ext::RACK_ENV_REQUEST_SPAN]
149
+ return unless rack_span
150
+
151
+ if (status_code = rack_span.get_tag(Tracing::Metadata::Ext::HTTP::TAG_STATUS_CODE))
152
+ span.set_tag(Tracing::Metadata::Ext::HTTP::TAG_STATUS_CODE, status_code)
153
+ span.status = rack_span.status
154
+ end
155
+
156
+ if (user_agent = rack_span.get_tag(Tracing::Metadata::Ext::HTTP::TAG_USER_AGENT))
157
+ span.set_tag(Tracing::Metadata::Ext::HTTP::TAG_USER_AGENT, user_agent)
158
+ end
159
+
160
+ # NOTE: Tracing shouldn't know about AppSec tags.
161
+ if (appsec_enabled = rack_span.get_metric('_dd.appsec.enabled'))
162
+ span.set_metric('_dd.appsec.enabled', appsec_enabled)
163
+ end
164
+
165
+ # NOTE: Tracing shouldn't know about AppSec tags.
166
+ if (appsec_json = rack_span.get_tag('_dd.appsec.json'))
167
+ span.set_tag('_dd.appsec.json', appsec_json)
168
+ end
169
+ end
54
170
  end
55
171
  end
56
172
  end
@@ -18,7 +18,7 @@ module Datadog
18
18
  app_config.log_tags << proc { Tracing.log_correlation if Datadog.configuration.tracing.log_injection }
19
19
  rescue => e
20
20
  Datadog.logger.warn(
21
- "Unable to add Datadog Trace context to ActiveSupport::TaggedLogging: #{e.class}: #{e}"
21
+ "Unable to add Datadog Trace context to ActiveSupport::TaggedLogging: #{e.class}: #{e.message}"
22
22
  )
23
23
  false
24
24
  end
@@ -86,7 +86,7 @@ module Datadog
86
86
  # Reads one more byte than the limit to allow us to check if the source exceeds the limit.
87
87
  source = File.read(file, MAX_TAG_VALUE_SIZE + 1)
88
88
  rescue => e
89
- Datadog.logger.debug { "Failed to read file '#{file}' for Rails runner: #{e.class}: #{e}" }
89
+ Datadog.logger.debug { "Failed to read file '#{file}' for Rails runner: #{e.class}: #{e.message}" }
90
90
  end
91
91
 
92
92
  Tracing.trace(
@@ -66,7 +66,7 @@ module Datadog
66
66
  span.set_tag(Ext::TAG_TASK_ARG_NAMES, arg_names)
67
67
  span.set_tag(Ext::TAG_INVOKE_ARGS, quantize_args(args)) unless args.nil?
68
68
  rescue => e
69
- Datadog.logger.debug { "Error while tracing Rake invoke: #{e.class}: #{e}" }
69
+ Datadog.logger.debug { "Error while tracing Rake invoke: #{e.class}: #{e.message}" }
70
70
  end
71
71
 
72
72
  def annotate_execute!(span, args)
@@ -75,7 +75,7 @@ module Datadog
75
75
  span.set_tag(Tracing::Metadata::Ext::TAG_OPERATION, Ext::TAG_OPERATION_EXECUTE)
76
76
  span.set_tag(Ext::TAG_EXECUTE_ARGS, quantize_args(args.to_hash)) unless args.nil?
77
77
  rescue => e
78
- Datadog.logger.debug { "Error while tracing Rake execute: #{e.class}: #{e}" }
78
+ Datadog.logger.debug { "Error while tracing Rake execute: #{e.class}: #{e.message}" }
79
79
  end
80
80
 
81
81
  def quantize_args(args)
@@ -34,7 +34,7 @@ module Datadog
34
34
  str = Core::Utils.utf8_encode(arg, binary: true, placeholder: PLACEHOLDER)
35
35
  Core::Utils.truncate(str, VALUE_MAX_LEN, TOO_LONG_MARK)
36
36
  rescue => e
37
- Datadog.logger.debug("non formattable Redis arg #{str}: #{e}")
37
+ Datadog.logger.debug("non formattable Redis arg #{str}: #{e.class}: #{e.message}")
38
38
  PLACEHOLDER
39
39
  end
40
40
 
@@ -47,7 +47,7 @@ module Datadog
47
47
 
48
48
  Contrib::SpanAttributeSchema.set_peer_service!(span, Ext::PEER_SERVICE_SOURCES)
49
49
  rescue => e
50
- Datadog.logger.error("#{e.class}: #{e}")
50
+ Datadog.logger.error("#{e.class}: #{e.message}")
51
51
  Datadog::Core::Telemetry::Logger.report(e)
52
52
  end
53
53
 
@@ -25,7 +25,7 @@ module Datadog
25
25
  job['class'].to_s
26
26
  end
27
27
  rescue => e
28
- Datadog.logger.debug { "Error retrieving Sidekiq job class name (jid:#{job["jid"]}): #{e}" }
28
+ Datadog.logger.debug { "Error retrieving Sidekiq job class name (jid:#{job["jid"]}): #{e.class}: #{e.message}" }
29
29
 
30
30
  job['class'].to_s
31
31
  end
@@ -55,7 +55,7 @@ module Datadog
55
55
  span.set_tag(Ext::TAG_REQUEST_PATH, event.path)
56
56
  span.set_tag(Ext::TAG_REQUEST_NUM_RETRIES, event.num_retries.to_s)
57
57
  rescue => e
58
- Datadog.logger.debug { "#{e.class}: #{e}" }
58
+ Datadog.logger.debug { "#{e.class}: #{e.message}" }
59
59
  end
60
60
 
61
61
  def configuration
@@ -81,3 +81,11 @@ require_relative 'contrib/sneakers/integration'
81
81
  require_relative 'contrib/stripe/integration'
82
82
  require_relative 'contrib/sucker_punch/integration'
83
83
  require_relative 'contrib/trilogy/integration'
84
+
85
+ # This list is used to determine if an integration is a built-in integration,
86
+ # and prevent sending telemetry for custom integrations.
87
+ # To do this, we get the list of registered integrations at this point and freeze it.
88
+ # Later, when custom integrations are registered, they will not be included in this list.
89
+ # .uniq to handle aliases, as we can register the same integration multiple times with different names.
90
+ Datadog::Tracing::Contrib::BUILT_IN_INTEGRATIONS =
91
+ Datadog::Tracing::Contrib::REGISTRY.map { |entry| entry.klass }.uniq.freeze
@@ -24,7 +24,9 @@ module Datadog
24
24
  end
25
25
  end
26
26
  rescue => e
27
- logger.warn("Failed to collect tracing environment information: #{e} Location: #{Array(e.backtrace).first}")
27
+ logger.warn(
28
+ "Failed to collect tracing environment information: #{e.class}: #{e.message} Location: #{Array(e.backtrace).first}"
29
+ )
28
30
  end
29
31
  end
30
32