ddtrace 1.2.0 → 1.4.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 (508) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +70 -0
  3. data/LICENSE-3rdparty.csv +2 -0
  4. data/README.md +1 -1
  5. data/ext/ddtrace_profiling_loader/ddtrace_profiling_loader.c +1 -1
  6. data/ext/ddtrace_profiling_native_extension/NativeExtensionDesign.md +9 -2
  7. data/ext/ddtrace_profiling_native_extension/clock_id.h +20 -0
  8. data/ext/ddtrace_profiling_native_extension/clock_id_from_pthread.c +30 -1
  9. data/ext/ddtrace_profiling_native_extension/clock_id_noop.c +10 -1
  10. data/ext/ddtrace_profiling_native_extension/collectors_cpu_and_wall_time.c +152 -31
  11. data/ext/ddtrace_profiling_native_extension/collectors_cpu_and_wall_time.h +6 -0
  12. data/ext/ddtrace_profiling_native_extension/collectors_cpu_and_wall_time_worker.c +391 -0
  13. data/ext/ddtrace_profiling_native_extension/collectors_stack.c +11 -7
  14. data/ext/ddtrace_profiling_native_extension/extconf.rb +26 -19
  15. data/ext/ddtrace_profiling_native_extension/helpers.h +12 -0
  16. data/ext/ddtrace_profiling_native_extension/http_transport.c +40 -47
  17. data/ext/ddtrace_profiling_native_extension/{libddprof_helpers.h → libdatadog_helpers.h} +2 -1
  18. data/ext/ddtrace_profiling_native_extension/native_extension_helpers.rb +36 -20
  19. data/ext/ddtrace_profiling_native_extension/private_vm_api_access.c +39 -29
  20. data/ext/ddtrace_profiling_native_extension/private_vm_api_access.h +2 -5
  21. data/ext/ddtrace_profiling_native_extension/profiling.c +4 -3
  22. data/ext/ddtrace_profiling_native_extension/ruby_helpers.c +25 -0
  23. data/ext/ddtrace_profiling_native_extension/ruby_helpers.h +33 -1
  24. data/ext/ddtrace_profiling_native_extension/stack_recorder.c +294 -19
  25. data/ext/ddtrace_profiling_native_extension/stack_recorder.h +9 -8
  26. data/lib/datadog/appsec/autoload.rb +4 -2
  27. data/lib/datadog/appsec/configuration.rb +1 -1
  28. data/lib/datadog/appsec/contrib/auto_instrument.rb +0 -2
  29. data/lib/datadog/appsec/contrib/configuration/settings.rb +1 -1
  30. data/lib/datadog/appsec/contrib/rack/configuration/settings.rb +2 -2
  31. data/lib/datadog/appsec/contrib/rack/gateway/watcher.rb +6 -6
  32. data/lib/datadog/appsec/contrib/rack/integration.rb +5 -5
  33. data/lib/datadog/appsec/contrib/rack/patcher.rb +2 -2
  34. data/lib/datadog/appsec/contrib/rack/reactive/request.rb +1 -1
  35. data/lib/datadog/appsec/contrib/rack/reactive/request_body.rb +1 -1
  36. data/lib/datadog/appsec/contrib/rack/reactive/response.rb +1 -1
  37. data/lib/datadog/appsec/contrib/rack/request_body_middleware.rb +2 -2
  38. data/lib/datadog/appsec/contrib/rack/request_middleware.rb +3 -3
  39. data/lib/datadog/appsec/contrib/rails/configuration/settings.rb +2 -2
  40. data/lib/datadog/appsec/contrib/rails/gateway/watcher.rb +4 -4
  41. data/lib/datadog/appsec/contrib/rails/integration.rb +4 -4
  42. data/lib/datadog/appsec/contrib/rails/patcher.rb +16 -12
  43. data/lib/datadog/appsec/contrib/rails/reactive/action.rb +1 -1
  44. data/lib/datadog/appsec/contrib/sinatra/configuration/settings.rb +2 -2
  45. data/lib/datadog/appsec/contrib/sinatra/gateway/watcher.rb +5 -5
  46. data/lib/datadog/appsec/contrib/sinatra/integration.rb +4 -4
  47. data/lib/datadog/appsec/contrib/sinatra/patcher.rb +16 -12
  48. data/lib/datadog/appsec/event.rb +3 -3
  49. data/lib/datadog/appsec/extensions.rb +1 -1
  50. data/lib/datadog/appsec/processor.rb +1 -1
  51. data/lib/datadog/appsec/reactive/engine.rb +2 -2
  52. data/lib/datadog/appsec/reactive/operation.rb +3 -3
  53. data/lib/datadog/appsec.rb +5 -5
  54. data/lib/datadog/ci/configuration/components.rb +1 -1
  55. data/lib/datadog/ci/configuration/settings.rb +1 -1
  56. data/lib/datadog/ci/contrib/cucumber/configuration/settings.rb +2 -2
  57. data/lib/datadog/ci/contrib/cucumber/formatter.rb +5 -5
  58. data/lib/datadog/ci/contrib/cucumber/instrumentation.rb +1 -1
  59. data/lib/datadog/ci/contrib/cucumber/integration.rb +4 -4
  60. data/lib/datadog/ci/contrib/cucumber/patcher.rb +2 -2
  61. data/lib/datadog/ci/contrib/rspec/configuration/settings.rb +2 -2
  62. data/lib/datadog/ci/contrib/rspec/example.rb +5 -5
  63. data/lib/datadog/ci/contrib/rspec/integration.rb +4 -4
  64. data/lib/datadog/ci/contrib/rspec/patcher.rb +2 -2
  65. data/lib/datadog/ci/ext/environment.rb +8 -6
  66. data/lib/datadog/ci/extensions.rb +4 -4
  67. data/lib/datadog/ci/flush.rb +2 -2
  68. data/lib/datadog/ci/test.rb +3 -3
  69. data/lib/datadog/ci.rb +6 -6
  70. data/lib/datadog/core/buffer/cruby.rb +1 -1
  71. data/lib/datadog/core/buffer/thread_safe.rb +1 -1
  72. data/lib/datadog/core/configuration/agent_settings_resolver.rb +6 -6
  73. data/lib/datadog/core/configuration/base.rb +11 -2
  74. data/lib/datadog/core/configuration/components.rb +51 -48
  75. data/lib/datadog/core/configuration/option_definition.rb +1 -1
  76. data/lib/datadog/core/configuration/option_definition_set.rb +1 -1
  77. data/lib/datadog/core/configuration/options.rb +3 -3
  78. data/lib/datadog/core/configuration/settings.rb +34 -7
  79. data/lib/datadog/core/configuration.rb +8 -5
  80. data/lib/datadog/core/diagnostics/environment_logger.rb +1 -1
  81. data/lib/datadog/core/diagnostics/health.rb +2 -2
  82. data/lib/datadog/core/environment/cgroup.rb +1 -1
  83. data/lib/datadog/core/environment/container.rb +1 -1
  84. data/lib/datadog/core/environment/ext.rb +1 -1
  85. data/lib/datadog/core/environment/identity.rb +2 -2
  86. data/lib/datadog/core/environment/platform.rb +1 -1
  87. data/lib/datadog/core/environment/socket.rb +1 -1
  88. data/lib/datadog/core/error.rb +1 -1
  89. data/lib/datadog/core/extensions.rb +1 -1
  90. data/lib/datadog/core/metrics/client.rb +8 -8
  91. data/lib/datadog/core/metrics/options.rb +3 -3
  92. data/lib/datadog/core/runtime/metrics.rb +6 -6
  93. data/lib/datadog/core/telemetry/client.rb +79 -0
  94. data/lib/datadog/core/telemetry/collector.rb +234 -0
  95. data/lib/datadog/core/telemetry/emitter.rb +48 -0
  96. data/lib/datadog/core/telemetry/event.rb +71 -0
  97. data/lib/datadog/core/telemetry/ext.rb +11 -0
  98. data/lib/datadog/core/telemetry/heartbeat.rb +37 -0
  99. data/lib/datadog/core/telemetry/http/adapters/net.rb +113 -0
  100. data/lib/datadog/core/telemetry/http/env.rb +20 -0
  101. data/lib/datadog/core/telemetry/http/ext.rb +20 -0
  102. data/lib/datadog/core/telemetry/http/response.rb +68 -0
  103. data/lib/datadog/core/telemetry/http/transport.rb +53 -0
  104. data/lib/datadog/core/telemetry/v1/app_event.rb +52 -0
  105. data/lib/datadog/core/telemetry/v1/application.rb +86 -0
  106. data/lib/datadog/core/telemetry/v1/configuration.rb +25 -0
  107. data/lib/datadog/core/telemetry/v1/dependency.rb +36 -0
  108. data/lib/datadog/core/telemetry/v1/host.rb +51 -0
  109. data/lib/datadog/core/telemetry/v1/integration.rb +58 -0
  110. data/lib/datadog/core/telemetry/v1/product.rb +28 -0
  111. data/lib/datadog/core/telemetry/v1/telemetry_request.rb +100 -0
  112. data/lib/datadog/core/utils/object_set.rb +1 -1
  113. data/lib/datadog/core/utils/sequence.rb +5 -0
  114. data/lib/datadog/core/utils/string_table.rb +1 -1
  115. data/lib/datadog/core/utils/time.rb +3 -3
  116. data/lib/datadog/core/utils.rb +2 -2
  117. data/lib/datadog/core/vendor/multipart-post/multipart/post/multipartable.rb +2 -2
  118. data/lib/datadog/core/vendor/multipart-post/net/http/post/multipart.rb +3 -3
  119. data/lib/datadog/core/workers/async.rb +1 -1
  120. data/lib/datadog/core/workers/polling.rb +2 -2
  121. data/lib/datadog/core/workers/runtime_metrics.rb +4 -4
  122. data/lib/datadog/core.rb +50 -50
  123. data/lib/datadog/kit.rb +1 -1
  124. data/lib/datadog/opentracer/distributed_headers.rb +2 -2
  125. data/lib/datadog/opentracer/rack_propagator.rb +11 -7
  126. data/lib/datadog/opentracer/span.rb +1 -1
  127. data/lib/datadog/opentracer/text_map_propagator.rb +9 -6
  128. data/lib/datadog/opentracer/thread_local_scope_manager.rb +1 -1
  129. data/lib/datadog/opentracer/tracer.rb +19 -15
  130. data/lib/datadog/opentracer.rb +16 -16
  131. data/lib/datadog/profiling/buffer.rb +3 -3
  132. data/lib/datadog/profiling/collectors/cpu_and_wall_time.rb +4 -19
  133. data/lib/datadog/profiling/collectors/cpu_and_wall_time_worker.rb +74 -0
  134. data/lib/datadog/profiling/collectors/old_stack.rb +7 -7
  135. data/lib/datadog/profiling/collectors/stack.rb +3 -8
  136. data/lib/datadog/profiling/encoding/profile.rb +1 -1
  137. data/lib/datadog/profiling/events/stack.rb +1 -1
  138. data/lib/datadog/profiling/exporter.rb +17 -9
  139. data/lib/datadog/profiling/ext/forking.rb +36 -37
  140. data/lib/datadog/profiling/ext.rb +1 -0
  141. data/lib/datadog/profiling/flush.rb +0 -3
  142. data/lib/datadog/profiling/http_transport.rb +4 -3
  143. data/lib/datadog/profiling/old_recorder.rb +2 -7
  144. data/lib/datadog/profiling/pprof/builder.rb +4 -4
  145. data/lib/datadog/profiling/pprof/converter.rb +1 -1
  146. data/lib/datadog/profiling/pprof/message_set.rb +1 -1
  147. data/lib/datadog/profiling/pprof/stack_sample.rb +4 -4
  148. data/lib/datadog/profiling/pprof/string_table.rb +1 -1
  149. data/lib/datadog/profiling/pprof/template.rb +5 -5
  150. data/lib/datadog/profiling/preload.rb +1 -1
  151. data/lib/datadog/profiling/scheduler.rb +5 -4
  152. data/lib/datadog/profiling/stack_recorder.rb +14 -4
  153. data/lib/datadog/profiling/tag_builder.rb +6 -1
  154. data/lib/datadog/profiling/tasks/setup.rb +2 -2
  155. data/lib/datadog/profiling/trace_identifiers/ddtrace.rb +2 -2
  156. data/lib/datadog/profiling/trace_identifiers/helper.rb +1 -1
  157. data/lib/datadog/profiling/transport/http/api/endpoint.rb +5 -5
  158. data/lib/datadog/profiling/transport/http/api/instance.rb +2 -2
  159. data/lib/datadog/profiling/transport/http/api/spec.rb +1 -1
  160. data/lib/datadog/profiling/transport/http/api.rb +5 -5
  161. data/lib/datadog/profiling/transport/http/builder.rb +3 -3
  162. data/lib/datadog/profiling/transport/http/client.rb +2 -2
  163. data/lib/datadog/profiling/transport/http/response.rb +1 -1
  164. data/lib/datadog/profiling/transport/http.rb +21 -15
  165. data/lib/datadog/profiling.rb +21 -20
  166. data/lib/datadog/tracing/analytics.rb +1 -1
  167. data/lib/datadog/tracing/buffer.rb +5 -5
  168. data/lib/datadog/tracing/context.rb +1 -1
  169. data/lib/datadog/tracing/context_provider.rb +2 -2
  170. data/lib/datadog/tracing/contrib/action_cable/configuration/settings.rb +2 -2
  171. data/lib/datadog/tracing/contrib/action_cable/event.rb +4 -5
  172. data/lib/datadog/tracing/contrib/action_cable/events/broadcast.rb +4 -4
  173. data/lib/datadog/tracing/contrib/action_cable/events/perform_action.rb +3 -3
  174. data/lib/datadog/tracing/contrib/action_cable/events/transmit.rb +4 -4
  175. data/lib/datadog/tracing/contrib/action_cable/events.rb +4 -4
  176. data/lib/datadog/tracing/contrib/action_cable/instrumentation.rb +3 -4
  177. data/lib/datadog/tracing/contrib/action_cable/integration.rb +4 -4
  178. data/lib/datadog/tracing/contrib/action_cable/patcher.rb +4 -4
  179. data/lib/datadog/tracing/contrib/action_mailer/configuration/settings.rb +2 -2
  180. data/lib/datadog/tracing/contrib/action_mailer/event.rb +3 -3
  181. data/lib/datadog/tracing/contrib/action_mailer/events/deliver.rb +3 -3
  182. data/lib/datadog/tracing/contrib/action_mailer/events/process.rb +3 -3
  183. data/lib/datadog/tracing/contrib/action_mailer/events.rb +2 -2
  184. data/lib/datadog/tracing/contrib/action_mailer/integration.rb +4 -4
  185. data/lib/datadog/tracing/contrib/action_mailer/patcher.rb +3 -3
  186. data/lib/datadog/tracing/contrib/action_pack/action_controller/instrumentation.rb +6 -6
  187. data/lib/datadog/tracing/contrib/action_pack/action_controller/patcher.rb +2 -2
  188. data/lib/datadog/tracing/contrib/action_pack/configuration/settings.rb +2 -2
  189. data/lib/datadog/tracing/contrib/action_pack/integration.rb +4 -4
  190. data/lib/datadog/tracing/contrib/action_pack/patcher.rb +2 -2
  191. data/lib/datadog/tracing/contrib/action_pack/utils.rb +1 -1
  192. data/lib/datadog/tracing/contrib/action_view/configuration/settings.rb +2 -2
  193. data/lib/datadog/tracing/contrib/action_view/event.rb +1 -1
  194. data/lib/datadog/tracing/contrib/action_view/events/render_partial.rb +5 -5
  195. data/lib/datadog/tracing/contrib/action_view/events/render_template.rb +5 -5
  196. data/lib/datadog/tracing/contrib/action_view/events.rb +2 -2
  197. data/lib/datadog/tracing/contrib/action_view/instrumentation/partial_renderer.rb +2 -2
  198. data/lib/datadog/tracing/contrib/action_view/instrumentation/template_renderer.rb +2 -2
  199. data/lib/datadog/tracing/contrib/action_view/integration.rb +4 -4
  200. data/lib/datadog/tracing/contrib/action_view/patcher.rb +7 -7
  201. data/lib/datadog/tracing/contrib/action_view/utils.rb +1 -1
  202. data/lib/datadog/tracing/contrib/active_job/configuration/settings.rb +3 -3
  203. data/lib/datadog/tracing/contrib/active_job/event.rb +3 -3
  204. data/lib/datadog/tracing/contrib/active_job/events/discard.rb +4 -4
  205. data/lib/datadog/tracing/contrib/active_job/events/enqueue.rb +4 -4
  206. data/lib/datadog/tracing/contrib/active_job/events/enqueue_at.rb +4 -4
  207. data/lib/datadog/tracing/contrib/active_job/events/enqueue_retry.rb +4 -4
  208. data/lib/datadog/tracing/contrib/active_job/events/perform.rb +4 -4
  209. data/lib/datadog/tracing/contrib/active_job/events/retry_stopped.rb +4 -4
  210. data/lib/datadog/tracing/contrib/active_job/events.rb +6 -6
  211. data/lib/datadog/tracing/contrib/active_job/integration.rb +4 -4
  212. data/lib/datadog/tracing/contrib/active_job/log_injection.rb +0 -2
  213. data/lib/datadog/tracing/contrib/active_job/patcher.rb +4 -4
  214. data/lib/datadog/tracing/contrib/active_model_serializers/configuration/settings.rb +2 -2
  215. data/lib/datadog/tracing/contrib/active_model_serializers/event.rb +4 -5
  216. data/lib/datadog/tracing/contrib/active_model_serializers/events/render.rb +3 -3
  217. data/lib/datadog/tracing/contrib/active_model_serializers/events/serialize.rb +2 -2
  218. data/lib/datadog/tracing/contrib/active_model_serializers/events.rb +2 -2
  219. data/lib/datadog/tracing/contrib/active_model_serializers/integration.rb +3 -3
  220. data/lib/datadog/tracing/contrib/active_model_serializers/patcher.rb +3 -4
  221. data/lib/datadog/tracing/contrib/active_record/configuration/resolver.rb +2 -2
  222. data/lib/datadog/tracing/contrib/active_record/configuration/settings.rb +3 -3
  223. data/lib/datadog/tracing/contrib/active_record/event.rb +1 -1
  224. data/lib/datadog/tracing/contrib/active_record/events/instantiation.rb +4 -4
  225. data/lib/datadog/tracing/contrib/active_record/events/sql.rb +6 -6
  226. data/lib/datadog/tracing/contrib/active_record/events.rb +2 -2
  227. data/lib/datadog/tracing/contrib/active_record/integration.rb +6 -6
  228. data/lib/datadog/tracing/contrib/active_record/patcher.rb +2 -2
  229. data/lib/datadog/tracing/contrib/active_record/utils.rb +2 -2
  230. data/lib/datadog/tracing/contrib/active_support/cache/instrumentation.rb +19 -9
  231. data/lib/datadog/tracing/contrib/active_support/cache/patcher.rb +2 -2
  232. data/lib/datadog/tracing/contrib/active_support/cache/redis.rb +1 -1
  233. data/lib/datadog/tracing/contrib/active_support/configuration/settings.rb +2 -2
  234. data/lib/datadog/tracing/contrib/active_support/integration.rb +5 -5
  235. data/lib/datadog/tracing/contrib/active_support/notifications/event.rb +1 -1
  236. data/lib/datadog/tracing/contrib/active_support/notifications/subscriber.rb +1 -1
  237. data/lib/datadog/tracing/contrib/active_support/patcher.rb +2 -2
  238. data/lib/datadog/tracing/contrib/analytics.rb +1 -1
  239. data/lib/datadog/tracing/contrib/auto_instrument.rb +4 -4
  240. data/lib/datadog/tracing/contrib/aws/configuration/settings.rb +2 -2
  241. data/lib/datadog/tracing/contrib/aws/instrumentation.rb +3 -4
  242. data/lib/datadog/tracing/contrib/aws/integration.rb +3 -3
  243. data/lib/datadog/tracing/contrib/aws/patcher.rb +5 -5
  244. data/lib/datadog/tracing/contrib/concurrent_ruby/configuration/settings.rb +2 -2
  245. data/lib/datadog/tracing/contrib/concurrent_ruby/future_patch.rb +1 -1
  246. data/lib/datadog/tracing/contrib/concurrent_ruby/integration.rb +3 -3
  247. data/lib/datadog/tracing/contrib/concurrent_ruby/patcher.rb +2 -2
  248. data/lib/datadog/tracing/contrib/configurable.rb +2 -2
  249. data/lib/datadog/tracing/contrib/configuration/resolvers/pattern_resolver.rb +1 -1
  250. data/lib/datadog/tracing/contrib/configuration/settings.rb +2 -2
  251. data/lib/datadog/tracing/contrib/dalli/configuration/settings.rb +2 -2
  252. data/lib/datadog/tracing/contrib/dalli/instrumentation.rb +4 -5
  253. data/lib/datadog/tracing/contrib/dalli/integration.rb +3 -3
  254. data/lib/datadog/tracing/contrib/dalli/patcher.rb +3 -3
  255. data/lib/datadog/tracing/contrib/dalli/quantize.rb +1 -1
  256. data/lib/datadog/tracing/contrib/delayed_job/configuration/settings.rb +3 -3
  257. data/lib/datadog/tracing/contrib/delayed_job/ext.rb +2 -0
  258. data/lib/datadog/tracing/contrib/delayed_job/integration.rb +3 -3
  259. data/lib/datadog/tracing/contrib/delayed_job/patcher.rb +8 -2
  260. data/lib/datadog/tracing/contrib/delayed_job/plugin.rb +3 -4
  261. data/lib/datadog/tracing/contrib/delayed_job/server_internal_tracer/worker.rb +32 -0
  262. data/lib/datadog/tracing/contrib/elasticsearch/configuration/settings.rb +2 -2
  263. data/lib/datadog/tracing/contrib/elasticsearch/integration.rb +3 -3
  264. data/lib/datadog/tracing/contrib/elasticsearch/patcher.rb +6 -7
  265. data/lib/datadog/tracing/contrib/elasticsearch/quantize.rb +1 -1
  266. data/lib/datadog/tracing/contrib/ethon/configuration/settings.rb +2 -2
  267. data/lib/datadog/tracing/contrib/ethon/easy_patch.rb +4 -5
  268. data/lib/datadog/tracing/contrib/ethon/integration.rb +4 -4
  269. data/lib/datadog/tracing/contrib/ethon/multi_patch.rb +3 -4
  270. data/lib/datadog/tracing/contrib/ethon/patcher.rb +3 -3
  271. data/lib/datadog/tracing/contrib/excon/configuration/settings.rb +2 -2
  272. data/lib/datadog/tracing/contrib/excon/integration.rb +4 -4
  273. data/lib/datadog/tracing/contrib/excon/middleware.rb +6 -7
  274. data/lib/datadog/tracing/contrib/excon/patcher.rb +2 -2
  275. data/lib/datadog/tracing/contrib/extensions.rb +5 -3
  276. data/lib/datadog/tracing/contrib/faraday/configuration/settings.rb +2 -2
  277. data/lib/datadog/tracing/contrib/faraday/integration.rb +4 -4
  278. data/lib/datadog/tracing/contrib/faraday/middleware.rb +5 -6
  279. data/lib/datadog/tracing/contrib/faraday/patcher.rb +5 -5
  280. data/lib/datadog/tracing/contrib/grape/configuration/settings.rb +3 -3
  281. data/lib/datadog/tracing/contrib/grape/endpoint.rb +4 -5
  282. data/lib/datadog/tracing/contrib/grape/integration.rb +3 -3
  283. data/lib/datadog/tracing/contrib/grape/patcher.rb +4 -4
  284. data/lib/datadog/tracing/contrib/graphql/configuration/settings.rb +2 -2
  285. data/lib/datadog/tracing/contrib/graphql/integration.rb +3 -3
  286. data/lib/datadog/tracing/contrib/graphql/patcher.rb +2 -3
  287. data/lib/datadog/tracing/contrib/grpc/configuration/settings.rb +3 -3
  288. data/lib/datadog/tracing/contrib/grpc/datadog_interceptor/client.rb +13 -4
  289. data/lib/datadog/tracing/contrib/grpc/datadog_interceptor/server.rb +6 -6
  290. data/lib/datadog/tracing/contrib/grpc/datadog_interceptor.rb +3 -4
  291. data/lib/datadog/tracing/contrib/grpc/ext.rb +1 -0
  292. data/lib/datadog/tracing/contrib/grpc/integration.rb +3 -3
  293. data/lib/datadog/tracing/contrib/grpc/patcher.rb +5 -5
  294. data/lib/datadog/tracing/contrib/http/circuit_breaker.rb +1 -2
  295. data/lib/datadog/tracing/contrib/http/configuration/settings.rb +2 -2
  296. data/lib/datadog/tracing/contrib/http/instrumentation.rb +3 -4
  297. data/lib/datadog/tracing/contrib/http/integration.rb +6 -6
  298. data/lib/datadog/tracing/contrib/http/patcher.rb +3 -3
  299. data/lib/datadog/tracing/contrib/httpclient/configuration/settings.rb +2 -2
  300. data/lib/datadog/tracing/contrib/httpclient/instrumentation.rb +4 -5
  301. data/lib/datadog/tracing/contrib/httpclient/integration.rb +4 -4
  302. data/lib/datadog/tracing/contrib/httpclient/patcher.rb +3 -3
  303. data/lib/datadog/tracing/contrib/httprb/configuration/settings.rb +2 -2
  304. data/lib/datadog/tracing/contrib/httprb/instrumentation.rb +4 -5
  305. data/lib/datadog/tracing/contrib/httprb/integration.rb +4 -4
  306. data/lib/datadog/tracing/contrib/httprb/patcher.rb +3 -3
  307. data/lib/datadog/tracing/contrib/integration.rb +3 -3
  308. data/lib/datadog/tracing/contrib/kafka/configuration/settings.rb +2 -2
  309. data/lib/datadog/tracing/contrib/kafka/event.rb +3 -3
  310. data/lib/datadog/tracing/contrib/kafka/events/connection/request.rb +2 -2
  311. data/lib/datadog/tracing/contrib/kafka/events/consumer/process_batch.rb +3 -3
  312. data/lib/datadog/tracing/contrib/kafka/events/consumer/process_message.rb +3 -3
  313. data/lib/datadog/tracing/contrib/kafka/events/consumer_group/heartbeat.rb +4 -4
  314. data/lib/datadog/tracing/contrib/kafka/events/consumer_group/join_group.rb +4 -4
  315. data/lib/datadog/tracing/contrib/kafka/events/consumer_group/leave_group.rb +4 -4
  316. data/lib/datadog/tracing/contrib/kafka/events/consumer_group/sync_group.rb +4 -4
  317. data/lib/datadog/tracing/contrib/kafka/events/produce_operation/send_messages.rb +2 -2
  318. data/lib/datadog/tracing/contrib/kafka/events/producer/deliver_messages.rb +2 -2
  319. data/lib/datadog/tracing/contrib/kafka/events.rb +9 -9
  320. data/lib/datadog/tracing/contrib/kafka/integration.rb +3 -3
  321. data/lib/datadog/tracing/contrib/kafka/patcher.rb +3 -3
  322. data/lib/datadog/tracing/contrib/lograge/configuration/settings.rb +2 -2
  323. data/lib/datadog/tracing/contrib/lograge/instrumentation.rb +1 -2
  324. data/lib/datadog/tracing/contrib/lograge/integration.rb +3 -3
  325. data/lib/datadog/tracing/contrib/lograge/patcher.rb +2 -2
  326. data/lib/datadog/tracing/contrib/mongodb/configuration/settings.rb +2 -2
  327. data/lib/datadog/tracing/contrib/mongodb/instrumentation.rb +3 -3
  328. data/lib/datadog/tracing/contrib/mongodb/integration.rb +4 -4
  329. data/lib/datadog/tracing/contrib/mongodb/parsers.rb +1 -1
  330. data/lib/datadog/tracing/contrib/mongodb/patcher.rb +3 -3
  331. data/lib/datadog/tracing/contrib/mongodb/subscribers.rb +4 -4
  332. data/lib/datadog/tracing/contrib/mysql2/configuration/settings.rb +2 -2
  333. data/lib/datadog/tracing/contrib/mysql2/instrumentation.rb +3 -4
  334. data/lib/datadog/tracing/contrib/mysql2/integration.rb +3 -3
  335. data/lib/datadog/tracing/contrib/mysql2/patcher.rb +2 -2
  336. data/lib/datadog/tracing/contrib/patcher.rb +13 -2
  337. data/lib/datadog/tracing/contrib/pg/configuration/settings.rb +2 -2
  338. data/lib/datadog/tracing/contrib/pg/instrumentation.rb +3 -4
  339. data/lib/datadog/tracing/contrib/pg/integration.rb +3 -3
  340. data/lib/datadog/tracing/contrib/pg/patcher.rb +2 -2
  341. data/lib/datadog/tracing/contrib/presto/configuration/settings.rb +2 -2
  342. data/lib/datadog/tracing/contrib/presto/instrumentation.rb +2 -3
  343. data/lib/datadog/tracing/contrib/presto/integration.rb +3 -3
  344. data/lib/datadog/tracing/contrib/presto/patcher.rb +4 -4
  345. data/lib/datadog/tracing/contrib/qless/configuration/settings.rb +2 -2
  346. data/lib/datadog/tracing/contrib/qless/integration.rb +3 -3
  347. data/lib/datadog/tracing/contrib/qless/patcher.rb +1 -2
  348. data/lib/datadog/tracing/contrib/qless/qless_job.rb +2 -3
  349. data/lib/datadog/tracing/contrib/qless/tracer_cleaner.rb +0 -2
  350. data/lib/datadog/tracing/contrib/que/configuration/settings.rb +3 -3
  351. data/lib/datadog/tracing/contrib/que/integration.rb +4 -4
  352. data/lib/datadog/tracing/contrib/que/patcher.rb +1 -1
  353. data/lib/datadog/tracing/contrib/que/tracer.rb +1 -1
  354. data/lib/datadog/tracing/contrib/racecar/configuration/settings.rb +2 -2
  355. data/lib/datadog/tracing/contrib/racecar/event.rb +4 -5
  356. data/lib/datadog/tracing/contrib/racecar/events/batch.rb +2 -2
  357. data/lib/datadog/tracing/contrib/racecar/events/consume.rb +2 -2
  358. data/lib/datadog/tracing/contrib/racecar/events/message.rb +2 -2
  359. data/lib/datadog/tracing/contrib/racecar/events.rb +3 -3
  360. data/lib/datadog/tracing/contrib/racecar/integration.rb +3 -3
  361. data/lib/datadog/tracing/contrib/racecar/patcher.rb +3 -3
  362. data/lib/datadog/tracing/contrib/rack/configuration/settings.rb +2 -2
  363. data/lib/datadog/tracing/contrib/rack/integration.rb +4 -4
  364. data/lib/datadog/tracing/contrib/rack/middlewares.rb +24 -20
  365. data/lib/datadog/tracing/contrib/rack/patcher.rb +12 -2
  366. data/lib/datadog/tracing/contrib/rails/auto_instrument_railtie.rb +1 -1
  367. data/lib/datadog/tracing/contrib/rails/configuration/settings.rb +1 -1
  368. data/lib/datadog/tracing/contrib/rails/framework.rb +16 -21
  369. data/lib/datadog/tracing/contrib/rails/integration.rb +4 -4
  370. data/lib/datadog/tracing/contrib/rails/log_injection.rb +0 -2
  371. data/lib/datadog/tracing/contrib/rails/middlewares.rb +1 -2
  372. data/lib/datadog/tracing/contrib/rails/patcher.rb +7 -8
  373. data/lib/datadog/tracing/contrib/rails/railtie.rb +3 -3
  374. data/lib/datadog/tracing/contrib/rails/utils.rb +1 -1
  375. data/lib/datadog/tracing/contrib/rake/configuration/settings.rb +17 -2
  376. data/lib/datadog/tracing/contrib/rake/instrumentation.rb +12 -7
  377. data/lib/datadog/tracing/contrib/rake/integration.rb +3 -3
  378. data/lib/datadog/tracing/contrib/rake/patcher.rb +3 -4
  379. data/lib/datadog/tracing/contrib/redis/configuration/resolver.rb +1 -1
  380. data/lib/datadog/tracing/contrib/redis/configuration/settings.rb +2 -2
  381. data/lib/datadog/tracing/contrib/redis/instrumentation.rb +6 -7
  382. data/lib/datadog/tracing/contrib/redis/integration.rb +3 -3
  383. data/lib/datadog/tracing/contrib/redis/patcher.rb +6 -6
  384. data/lib/datadog/tracing/contrib/redis/tags.rb +3 -4
  385. data/lib/datadog/tracing/contrib/resque/configuration/settings.rb +3 -3
  386. data/lib/datadog/tracing/contrib/resque/integration.rb +3 -3
  387. data/lib/datadog/tracing/contrib/resque/patcher.rb +2 -2
  388. data/lib/datadog/tracing/contrib/resque/resque_job.rb +3 -4
  389. data/lib/datadog/tracing/contrib/rest_client/configuration/settings.rb +2 -2
  390. data/lib/datadog/tracing/contrib/rest_client/integration.rb +3 -3
  391. data/lib/datadog/tracing/contrib/rest_client/patcher.rb +2 -2
  392. data/lib/datadog/tracing/contrib/rest_client/request_patch.rb +4 -5
  393. data/lib/datadog/tracing/contrib/semantic_logger/configuration/settings.rb +2 -2
  394. data/lib/datadog/tracing/contrib/semantic_logger/instrumentation.rb +1 -2
  395. data/lib/datadog/tracing/contrib/semantic_logger/integration.rb +3 -3
  396. data/lib/datadog/tracing/contrib/semantic_logger/patcher.rb +2 -2
  397. data/lib/datadog/tracing/contrib/sequel/configuration/settings.rb +2 -2
  398. data/lib/datadog/tracing/contrib/sequel/database.rb +4 -5
  399. data/lib/datadog/tracing/contrib/sequel/dataset.rb +4 -5
  400. data/lib/datadog/tracing/contrib/sequel/integration.rb +3 -3
  401. data/lib/datadog/tracing/contrib/sequel/patcher.rb +3 -3
  402. data/lib/datadog/tracing/contrib/sequel/utils.rb +2 -2
  403. data/lib/datadog/tracing/contrib/shoryuken/configuration/settings.rb +3 -3
  404. data/lib/datadog/tracing/contrib/shoryuken/integration.rb +4 -4
  405. data/lib/datadog/tracing/contrib/shoryuken/patcher.rb +1 -1
  406. data/lib/datadog/tracing/contrib/shoryuken/tracer.rb +1 -1
  407. data/lib/datadog/tracing/contrib/sidekiq/client_tracer.rb +4 -5
  408. data/lib/datadog/tracing/contrib/sidekiq/configuration/settings.rb +3 -3
  409. data/lib/datadog/tracing/contrib/sidekiq/ext.rb +6 -0
  410. data/lib/datadog/tracing/contrib/sidekiq/integration.rb +3 -3
  411. data/lib/datadog/tracing/contrib/sidekiq/patcher.rb +14 -7
  412. data/lib/datadog/tracing/contrib/sidekiq/server_internal_tracer/heartbeat.rb +19 -1
  413. data/lib/datadog/tracing/contrib/sidekiq/server_internal_tracer/{scheduled_push.rb → redis_info.rb} +5 -6
  414. data/lib/datadog/tracing/contrib/sidekiq/server_internal_tracer/scheduled_poller.rb +53 -0
  415. data/lib/datadog/tracing/contrib/sidekiq/server_tracer.rb +5 -6
  416. data/lib/datadog/tracing/contrib/sidekiq/tracing.rb +2 -2
  417. data/lib/datadog/tracing/contrib/sinatra/configuration/settings.rb +2 -2
  418. data/lib/datadog/tracing/contrib/sinatra/env.rb +2 -2
  419. data/lib/datadog/tracing/contrib/sinatra/framework.rb +0 -2
  420. data/lib/datadog/tracing/contrib/sinatra/headers.rb +1 -1
  421. data/lib/datadog/tracing/contrib/sinatra/integration.rb +3 -3
  422. data/lib/datadog/tracing/contrib/sinatra/patcher.rb +5 -5
  423. data/lib/datadog/tracing/contrib/sinatra/tracer.rb +7 -8
  424. data/lib/datadog/tracing/contrib/sinatra/tracer_middleware.rb +6 -7
  425. data/lib/datadog/tracing/contrib/sneakers/configuration/settings.rb +2 -2
  426. data/lib/datadog/tracing/contrib/sneakers/integration.rb +4 -4
  427. data/lib/datadog/tracing/contrib/sneakers/patcher.rb +2 -2
  428. data/lib/datadog/tracing/contrib/sneakers/tracer.rb +2 -3
  429. data/lib/datadog/tracing/contrib/status_code_matcher.rb +2 -2
  430. data/lib/datadog/tracing/contrib/sucker_punch/configuration/settings.rb +2 -2
  431. data/lib/datadog/tracing/contrib/sucker_punch/instrumentation.rb +3 -4
  432. data/lib/datadog/tracing/contrib/sucker_punch/integration.rb +3 -3
  433. data/lib/datadog/tracing/contrib/sucker_punch/patcher.rb +4 -5
  434. data/lib/datadog/tracing/contrib.rb +48 -48
  435. data/lib/datadog/tracing/correlation.rb +1 -1
  436. data/lib/datadog/tracing/distributed/headers/b3.rb +4 -4
  437. data/lib/datadog/tracing/distributed/headers/b3_single.rb +4 -4
  438. data/lib/datadog/tracing/distributed/headers/datadog.rb +3 -3
  439. data/lib/datadog/tracing/distributed/headers/parser.rb +1 -1
  440. data/lib/datadog/tracing/distributed/helpers.rb +2 -2
  441. data/lib/datadog/tracing/distributed/metadata/b3.rb +4 -4
  442. data/lib/datadog/tracing/distributed/metadata/b3_single.rb +4 -4
  443. data/lib/datadog/tracing/distributed/metadata/datadog.rb +2 -2
  444. data/lib/datadog/tracing/distributed/metadata/parser.rb +1 -1
  445. data/lib/datadog/tracing/event.rb +1 -1
  446. data/lib/datadog/tracing/metadata/analytics.rb +2 -2
  447. data/lib/datadog/tracing/metadata/errors.rb +2 -2
  448. data/lib/datadog/tracing/metadata/tagging.rb +2 -2
  449. data/lib/datadog/tracing/metadata.rb +3 -3
  450. data/lib/datadog/tracing/pipeline/span_filter.rb +10 -6
  451. data/lib/datadog/tracing/pipeline.rb +3 -3
  452. data/lib/datadog/tracing/propagation/grpc.rb +6 -6
  453. data/lib/datadog/tracing/propagation/http.rb +8 -8
  454. data/lib/datadog/tracing/runtime/metrics.rb +1 -1
  455. data/lib/datadog/tracing/sampling/all_sampler.rb +1 -1
  456. data/lib/datadog/tracing/sampling/priority_sampler.rb +5 -5
  457. data/lib/datadog/tracing/sampling/rate_by_key_sampler.rb +2 -2
  458. data/lib/datadog/tracing/sampling/rate_by_service_sampler.rb +3 -3
  459. data/lib/datadog/tracing/sampling/rate_limiter.rb +1 -1
  460. data/lib/datadog/tracing/sampling/rate_sampler.rb +5 -5
  461. data/lib/datadog/tracing/sampling/rule.rb +3 -3
  462. data/lib/datadog/tracing/sampling/rule_sampler.rb +4 -4
  463. data/lib/datadog/tracing/span.rb +4 -4
  464. data/lib/datadog/tracing/span_operation.rb +9 -9
  465. data/lib/datadog/tracing/sync_writer.rb +5 -5
  466. data/lib/datadog/tracing/trace_operation.rb +16 -9
  467. data/lib/datadog/tracing/trace_segment.rb +5 -5
  468. data/lib/datadog/tracing/tracer.rb +15 -15
  469. data/lib/datadog/tracing/workers/trace_writer.rb +9 -9
  470. data/lib/datadog/tracing/workers.rb +3 -3
  471. data/lib/datadog/tracing/writer.rb +5 -5
  472. data/lib/datadog/tracing.rb +8 -8
  473. data/lib/ddtrace/auto_instrument.rb +9 -2
  474. data/lib/ddtrace/transport/ext.rb +7 -1
  475. data/lib/ddtrace/transport/http/adapters/net.rb +3 -2
  476. data/lib/ddtrace/transport/http/adapters/test.rb +1 -1
  477. data/lib/ddtrace/transport/http/adapters/unix_socket.rb +2 -2
  478. data/lib/ddtrace/transport/http/api/map.rb +1 -1
  479. data/lib/ddtrace/transport/http/api.rb +4 -4
  480. data/lib/ddtrace/transport/http/builder.rb +5 -5
  481. data/lib/ddtrace/transport/http/client.rb +2 -2
  482. data/lib/ddtrace/transport/http/response.rb +1 -1
  483. data/lib/ddtrace/transport/http/statistics.rb +1 -1
  484. data/lib/ddtrace/transport/http/traces.rb +5 -5
  485. data/lib/ddtrace/transport/http.rb +12 -9
  486. data/lib/ddtrace/transport/io/client.rb +2 -2
  487. data/lib/ddtrace/transport/io/response.rb +1 -1
  488. data/lib/ddtrace/transport/io/traces.rb +3 -3
  489. data/lib/ddtrace/transport/io.rb +3 -3
  490. data/lib/ddtrace/transport/statistics.rb +2 -2
  491. data/lib/ddtrace/transport/trace_formatter.rb +5 -5
  492. data/lib/ddtrace/transport/traces.rb +5 -5
  493. data/lib/ddtrace/version.rb +1 -1
  494. data/lib/ddtrace.rb +6 -6
  495. metadata +35 -22
  496. data/.editorconfig +0 -22
  497. data/.gitignore +0 -58
  498. data/CONTRIBUTING.md +0 -81
  499. data/ddtrace.gemspec +0 -71
  500. data/docs/0.x-trace.png +0 -0
  501. data/docs/1.0-trace.png +0 -0
  502. data/docs/AutoInstrumentation.md +0 -36
  503. data/docs/Deprecation.md +0 -8
  504. data/docs/DevelopmentGuide.md +0 -259
  505. data/docs/GettingStarted.md +0 -2712
  506. data/docs/ProfilingDevelopment.md +0 -109
  507. data/docs/PublicApi.md +0 -14
  508. data/docs/UpgradeGuide.md +0 -736
@@ -0,0 +1,234 @@
1
+ # frozen_string_literal: true
2
+
3
+ # typed: true
4
+
5
+ require 'etc'
6
+
7
+ require_relative '../configuration/agent_settings_resolver'
8
+ require_relative '../environment/ext'
9
+ require_relative '../environment/platform'
10
+ require_relative 'v1/application'
11
+ require_relative 'v1/dependency'
12
+ require_relative 'v1/host'
13
+ require_relative 'v1/integration'
14
+ require_relative 'v1/product'
15
+ require_relative '../../../ddtrace/transport/ext'
16
+
17
+ module Datadog
18
+ module Core
19
+ module Telemetry
20
+ # Module defining methods for collecting metadata for telemetry
21
+ # rubocop:disable Metrics/ModuleLength
22
+ module Collector
23
+ include Datadog::Core::Configuration
24
+
25
+ # Forms a hash of configuration key value pairs to be sent in the additional payload
26
+ def additional_payload
27
+ additional_payload_variables
28
+ end
29
+
30
+ # Forms a telemetry application object
31
+ def application
32
+ Telemetry::V1::Application.new(
33
+ env: env,
34
+ language_name: Datadog::Core::Environment::Ext::LANG,
35
+ language_version: Datadog::Core::Environment::Ext::LANG_VERSION,
36
+ products: products,
37
+ runtime_name: Datadog::Core::Environment::Ext::RUBY_ENGINE,
38
+ runtime_version: Datadog::Core::Environment::Ext::ENGINE_VERSION,
39
+ service_name: service_name,
40
+ service_version: service_version,
41
+ tracer_version: library_version
42
+ )
43
+ end
44
+
45
+ # Forms a hash of standard key value pairs to be sent in the app-started event configuration
46
+ def configurations
47
+ configurations = {
48
+ DD_AGENT_HOST: Datadog.configuration.agent.host,
49
+ DD_AGENT_TRANSPORT: agent_transport,
50
+ DD_TRACE_SAMPLE_RATE: format_configuration_value(Datadog.configuration.tracing.sampling.default_rate),
51
+ }
52
+ compact_hash(configurations)
53
+ end
54
+
55
+ # Forms a telemetry app-started dependencies object
56
+ def dependencies
57
+ Gem.loaded_specs.collect do |name, loaded_gem|
58
+ Datadog::Core::Telemetry::V1::Dependency.new(
59
+ name: name, version: loaded_gem.version.to_s, hash: loaded_gem.hash.to_s
60
+ )
61
+ end
62
+ end
63
+
64
+ # Forms a telemetry host object
65
+ def host
66
+ Telemetry::V1::Host.new(
67
+ container_id: Core::Environment::Container.container_id,
68
+ hostname: Core::Environment::Platform.hostname,
69
+ kernel_name: Core::Environment::Platform.kernel_name,
70
+ kernel_release: Core::Environment::Platform.kernel_release,
71
+ kernel_version: Core::Environment::Platform.kernel_version
72
+ )
73
+ end
74
+
75
+ # Forms a telemetry app-started integrations object
76
+ def integrations
77
+ Datadog.registry.map do |integration|
78
+ is_instrumented = instrumented?(integration)
79
+ is_enabled = is_instrumented && patched?(integration)
80
+ Telemetry::V1::Integration.new(
81
+ name: integration.name.to_s,
82
+ enabled: is_enabled,
83
+ version: integration_version(integration),
84
+ compatible: integration_compatible?(integration),
85
+ error: (patch_error(integration) if is_instrumented && !is_enabled),
86
+ auto_enabled: is_enabled ? integration_auto_instrument?(integration) : nil
87
+ )
88
+ end
89
+ end
90
+
91
+ # Returns the runtime ID of the current process
92
+ def runtime_id
93
+ Datadog::Core::Environment::Identity.id
94
+ end
95
+
96
+ # Returns the current as a UNIX timestamp in seconds
97
+ def tracer_time
98
+ Time.now.to_i
99
+ end
100
+
101
+ private
102
+
103
+ TARGET_OPTIONS = [
104
+ 'ci.enabled',
105
+ 'logger.level',
106
+ 'profiling.advanced.code_provenance_enabled',
107
+ 'profiling.advanced.endpoint.collection.enabled',
108
+ 'profiling.enabled',
109
+ 'runtime_metrics.enabled',
110
+ 'tracing.analytics.enabled',
111
+ 'tracing.distributed_tracing.propagation_inject_style',
112
+ 'tracing.distributed_tracing.propagation_extract_style',
113
+ 'tracing.enabled',
114
+ 'tracing.log_injection',
115
+ 'tracing.partial_flush.enabled',
116
+ 'tracing.partial_flush.min_spans_threshold',
117
+ 'tracing.priority_sampling',
118
+ 'tracing.report_hostname',
119
+ 'tracing.sampling.default_rate',
120
+ 'tracing.sampling.rate_limit'
121
+ ].freeze
122
+
123
+ def additional_payload_variables
124
+ # Whitelist of configuration options to send in additional payload object
125
+ configuration = Datadog.configuration
126
+ options = TARGET_OPTIONS.each_with_object({}) do |option, hash|
127
+ split_option = option.split('.')
128
+ hash[option] = format_configuration_value(configuration.dig(*split_option))
129
+ end
130
+
131
+ # Add some more custom additional payload values here
132
+ options['tracing.auto_instrument.enabled'] = !defined?(Datadog::AutoInstrument::LOADED).nil?
133
+ options['tracing.writer_options.buffer_size'] =
134
+ format_configuration_value(configuration.tracing.writer_options[:buffer_size])
135
+ options['tracing.writer_options.flush_interval'] =
136
+ format_configuration_value(configuration.tracing.writer_options[:flush_interval])
137
+ options['logger.instance'] = configuration.logger.instance.class.to_s
138
+ options['appsec.enabled'] = configuration.dig('appsec', 'enabled') if configuration.respond_to?('appsec')
139
+ compact_hash(options)
140
+ end
141
+
142
+ def format_configuration_value(value)
143
+ # TODO: Add float if telemetry starts accepting it
144
+ case value
145
+ when Integer, String, true, false, nil
146
+ value
147
+ else
148
+ value.to_s
149
+ end
150
+ end
151
+
152
+ # Manual implementation of hash.compact used because it is unsupported by older Ruby versions (<2.4)
153
+ def compact_hash(hash)
154
+ hash.delete_if { |_k, v| v.nil? }
155
+ end
156
+
157
+ def env
158
+ Datadog.configuration.env
159
+ end
160
+
161
+ def service_name
162
+ Datadog.configuration.service
163
+ end
164
+
165
+ def service_version
166
+ Datadog.configuration.version
167
+ end
168
+
169
+ def library_version
170
+ Core::Environment::Identity.tracer_version
171
+ end
172
+
173
+ def products
174
+ Telemetry::V1::Product.new(profiler: profiler, appsec: appsec)
175
+ end
176
+
177
+ def profiler
178
+ { version: library_version }
179
+ end
180
+
181
+ def appsec
182
+ { version: library_version }
183
+ end
184
+
185
+ def agent_transport
186
+ adapter = Core::Configuration::AgentSettingsResolver.call(Datadog.configuration).adapter
187
+ if adapter == Datadog::Transport::Ext::UnixSocket::ADAPTER
188
+ 'UDS'
189
+ else
190
+ 'TCP'
191
+ end
192
+ end
193
+
194
+ def instrumented_integrations
195
+ Datadog.configuration.tracing.instrumented_integrations
196
+ end
197
+
198
+ def instrumented?(integration)
199
+ instrumented_integrations.include?(integration.name)
200
+ end
201
+
202
+ def patched?(integration)
203
+ !!integration.klass.patcher.patch_successful
204
+ end
205
+
206
+ def integration_auto_instrument?(integration)
207
+ integration.klass.auto_instrument?
208
+ end
209
+
210
+ def integration_compatible?(integration)
211
+ integration.klass.class.compatible?
212
+ end
213
+
214
+ def integration_version(integration)
215
+ integration.klass.class.version ? integration.klass.class.version.to_s : nil
216
+ end
217
+
218
+ def patch_error(integration)
219
+ patch_error_result = integration.klass.patcher.patch_error_result
220
+ if patch_error_result.nil? # if no error occurred during patching, but integration is still not instrumented
221
+ desc = "Available?: #{integration.klass.class.available?}"
222
+ desc += ", Loaded? #{integration.klass.class.loaded?}"
223
+ desc += ", Compatible? #{integration.klass.class.compatible?}"
224
+ desc += ", Patchable? #{integration.klass.class.patchable?}"
225
+ desc
226
+ else
227
+ patch_error_result.to_s
228
+ end
229
+ end
230
+ end
231
+ # rubocop:enable Metrics/ModuleLength
232
+ end
233
+ end
234
+ end
@@ -0,0 +1,48 @@
1
+ # typed: true
2
+
3
+ require_relative 'event'
4
+ require_relative 'http/transport'
5
+ require_relative '../utils/sequence'
6
+ require_relative '../utils/forking'
7
+
8
+ module Datadog
9
+ module Core
10
+ module Telemetry
11
+ # Class that emits telemetry events
12
+ class Emitter
13
+ attr_reader :http_transport
14
+
15
+ extend Core::Utils::Forking
16
+
17
+ # @param sequence [Datadog::Core::Utils::Sequence] Sequence object that stores and increments a counter
18
+ # @param http_transport [Datadog::Core::Telemetry::Http::Transport] Transport object that can be used to send
19
+ # telemetry requests via the agent
20
+ def initialize(http_transport: Datadog::Core::Telemetry::Http::Transport.new)
21
+ @http_transport = http_transport
22
+ end
23
+
24
+ # Retrieves and emits a TelemetryRequest object based on the request type specified
25
+ # @param request_type [String] the type of telemetry request to collect data for
26
+ def request(request_type)
27
+ begin
28
+ request = Datadog::Core::Telemetry::Event.new.telemetry_request(
29
+ request_type: request_type,
30
+ seq_id: self.class.sequence.next
31
+ ).to_h
32
+ @http_transport.request(request_type: request_type.to_s, payload: request.to_json)
33
+ rescue StandardError => e
34
+ Datadog.logger.debug("Unable to send telemetry request for event `#{request_type}`: #{e}")
35
+ Telemetry::Http::InternalErrorResponse.new(e)
36
+ end
37
+ end
38
+
39
+ # Initializes a Sequence object to track seq_id if not already initialized; else returns stored
40
+ # Sequence object
41
+ def self.sequence
42
+ after_fork! { @sequence = Datadog::Core::Utils::Sequence.new(1) }
43
+ @sequence ||= Datadog::Core::Utils::Sequence.new(1)
44
+ end
45
+ end
46
+ end
47
+ end
48
+ end
@@ -0,0 +1,71 @@
1
+ # typed: true
2
+
3
+ require_relative 'collector'
4
+ require_relative 'v1/app_event'
5
+ require_relative 'v1/telemetry_request'
6
+
7
+ module Datadog
8
+ module Core
9
+ module Telemetry
10
+ # Class defining methods to construct a Telemetry event
11
+ class Event
12
+ include Kernel
13
+
14
+ include Telemetry::Collector
15
+
16
+ API_VERSION = 'v1'.freeze
17
+
18
+ attr_reader \
19
+ :api_version
20
+
21
+ def initialize
22
+ @api_version = API_VERSION
23
+ end
24
+
25
+ # Forms a TelemetryRequest object based on the event request_type
26
+ # @param request_type [String] the type of telemetry request to collect data for
27
+ # @param seq_id [Integer] the ID of the request; incremented each time a telemetry request is sent to the API
28
+ def telemetry_request(request_type:, seq_id:)
29
+ Telemetry::V1::TelemetryRequest.new(
30
+ api_version: @api_version,
31
+ application: application,
32
+ host: host,
33
+ payload: payload(request_type),
34
+ request_type: request_type,
35
+ runtime_id: runtime_id,
36
+ seq_id: seq_id,
37
+ tracer_time: tracer_time,
38
+ )
39
+ end
40
+
41
+ private
42
+
43
+ def payload(request_type)
44
+ case request_type
45
+ when :'app-started'
46
+ app_started
47
+ when :'app-closing', :'app-heartbeat'
48
+ {}
49
+ when :'app-integrations-change'
50
+ app_integrations_change
51
+ else
52
+ raise ArgumentError, "Request type invalid, received request_type: #{@request_type}"
53
+ end
54
+ end
55
+
56
+ def app_started
57
+ Telemetry::V1::AppEvent.new(
58
+ dependencies: dependencies,
59
+ integrations: integrations,
60
+ configuration: configurations,
61
+ additional_payload: additional_payload
62
+ )
63
+ end
64
+
65
+ def app_integrations_change
66
+ Telemetry::V1::AppEvent.new(integrations: integrations)
67
+ end
68
+ end
69
+ end
70
+ end
71
+ end
@@ -0,0 +1,11 @@
1
+ # typed: true
2
+
3
+ module Datadog
4
+ module Core
5
+ module Telemetry
6
+ module Ext
7
+ ENV_ENABLED = 'DD_INSTRUMENTATION_TELEMETRY_ENABLED'.freeze
8
+ end
9
+ end
10
+ end
11
+ end
@@ -0,0 +1,37 @@
1
+ # typed: false
2
+
3
+ require_relative '../worker'
4
+ require_relative '../workers/polling'
5
+
6
+ module Datadog
7
+ module Core
8
+ module Telemetry
9
+ # Periodically (every DEFAULT_INTERVAL_SECONDS) sends a heartbeat event to the telemetry API.
10
+ class Heartbeat < Core::Worker
11
+ include Core::Workers::Polling
12
+
13
+ DEFAULT_INTERVAL_SECONDS = 60
14
+
15
+ def initialize(enabled: true, interval: DEFAULT_INTERVAL_SECONDS, &block)
16
+ # Workers::Polling settings
17
+ self.enabled = enabled
18
+ # Workers::IntervalLoop settings
19
+ self.loop_base_interval = interval
20
+ self.fork_policy = Core::Workers::Async::Thread::FORK_POLICY_STOP
21
+ super(&block)
22
+ start
23
+ end
24
+
25
+ def loop_wait_before_first_iteration?
26
+ true
27
+ end
28
+
29
+ private
30
+
31
+ def start
32
+ perform
33
+ end
34
+ end
35
+ end
36
+ end
37
+ end
@@ -0,0 +1,113 @@
1
+ # typed: true
2
+
3
+ require_relative '../response'
4
+
5
+ module Datadog
6
+ module Core
7
+ module Telemetry
8
+ module Http
9
+ module Adapters
10
+ # Class defining methods to make http requests via NET
11
+ class Net
12
+ attr_reader \
13
+ :hostname,
14
+ :port,
15
+ :timeout,
16
+ :ssl
17
+
18
+ DEFAULT_TIMEOUT = 30
19
+
20
+ def initialize(hostname:, port: nil, timeout: DEFAULT_TIMEOUT, ssl: true)
21
+ @hostname = hostname
22
+ @port = port
23
+ @timeout = timeout
24
+ @ssl = ssl.nil? ? true : ssl
25
+ end
26
+
27
+ def open(&block)
28
+ req = ::Net::HTTP.new(@hostname, @port)
29
+
30
+ req.use_ssl = @ssl
31
+ req.open_timeout = req.read_timeout = @timeout
32
+
33
+ req.start(&block)
34
+ end
35
+
36
+ def post(env)
37
+ begin
38
+ post = ::Net::HTTP::Post.new(env.path, env.headers)
39
+ post.body = env.body
40
+
41
+ http_response = open do |http|
42
+ http.request(post)
43
+ end
44
+
45
+ Response.new(http_response)
46
+ rescue StandardError => e
47
+ Datadog.logger.debug("Unable to send telemetry event to agent: #{e}")
48
+ Telemetry::Http::InternalErrorResponse.new(e)
49
+ end
50
+ end
51
+
52
+ # Data structure for an HTTP Response
53
+ class Response
54
+ include Datadog::Core::Telemetry::Http::Response
55
+
56
+ attr_reader :http_response
57
+
58
+ def initialize(http_response)
59
+ @http_response = http_response
60
+ end
61
+
62
+ def payload
63
+ return super if http_response.nil?
64
+
65
+ http_response.body
66
+ end
67
+
68
+ def code
69
+ return super if http_response.nil?
70
+
71
+ http_response.code.to_i
72
+ end
73
+
74
+ def ok?
75
+ return super if http_response.nil?
76
+
77
+ code.between?(200, 299)
78
+ end
79
+
80
+ def unsupported?
81
+ return super if http_response.nil?
82
+
83
+ code == 415
84
+ end
85
+
86
+ def not_found?
87
+ return super if http_response.nil?
88
+
89
+ code == 404
90
+ end
91
+
92
+ def client_error?
93
+ return super if http_response.nil?
94
+
95
+ code.between?(400, 499)
96
+ end
97
+
98
+ def server_error?
99
+ return super if http_response.nil?
100
+
101
+ code.between?(500, 599)
102
+ end
103
+
104
+ def inspect
105
+ "#{super}, http_response:#{http_response}"
106
+ end
107
+ end
108
+ end
109
+ end
110
+ end
111
+ end
112
+ end
113
+ end
@@ -0,0 +1,20 @@
1
+ # typed: true
2
+
3
+ module Datadog
4
+ module Core
5
+ module Telemetry
6
+ module Http
7
+ # Data structure for an HTTP request
8
+ class Env
9
+ attr_accessor :path, :body
10
+
11
+ attr_writer :headers
12
+
13
+ def headers
14
+ @headers ||= {}
15
+ end
16
+ end
17
+ end
18
+ end
19
+ end
20
+ end
@@ -0,0 +1,20 @@
1
+ module Datadog
2
+ module Core
3
+ module Telemetry
4
+ module Http
5
+ module Ext
6
+ HEADER_DD_API_KEY = 'DD-API-KEY'.freeze
7
+ HEADER_CONTENT_TYPE = 'Content-Type'.freeze
8
+ HEADER_CONTENT_LENGTH = 'Content-Length'.freeze
9
+ HEADER_DD_TELEMETRY_API_VERSION = 'DD-Telemetry-API-Version'.freeze
10
+ HEADER_DD_TELEMETRY_REQUEST_TYPE = 'DD-Telemetry-Request-Type'.freeze
11
+
12
+ CONTENT_TYPE_APPLICATION_JSON = 'application/json'.freeze
13
+ API_VERSION = 'v1'.freeze
14
+
15
+ AGENT_ENDPOINT = '/telemetry/proxy/api/v2/apmtelemetry'.freeze
16
+ end
17
+ end
18
+ end
19
+ end
20
+ end
@@ -0,0 +1,68 @@
1
+ # typed: true
2
+
3
+ module Datadog
4
+ module Core
5
+ module Telemetry
6
+ module Http
7
+ # Module for base HTTP response
8
+ module Response
9
+ include Kernel
10
+
11
+ def payload
12
+ nil
13
+ end
14
+
15
+ def ok?
16
+ nil
17
+ end
18
+
19
+ def unsupported?
20
+ nil
21
+ end
22
+
23
+ def not_found?
24
+ nil
25
+ end
26
+
27
+ def client_error?
28
+ nil
29
+ end
30
+
31
+ def server_error?
32
+ nil
33
+ end
34
+
35
+ def internal_error?
36
+ nil
37
+ end
38
+
39
+ def inspect
40
+ "#{self.class} ok?:#{ok?} unsupported?:#{unsupported?}, " \
41
+ "not_found?:#{not_found?}, client_error?:#{client_error?}, " \
42
+ "server_error?:#{server_error?}, internal_error?:#{internal_error?}, " \
43
+ "payload:#{payload}"
44
+ end
45
+ end
46
+
47
+ # A generic error response for internal errors
48
+ class InternalErrorResponse
49
+ include Response
50
+
51
+ attr_reader :error
52
+
53
+ def initialize(error)
54
+ @error = error
55
+ end
56
+
57
+ def internal_error?
58
+ true
59
+ end
60
+
61
+ def inspect
62
+ "#{super}, error_type:#{error.class} error:#{error}"
63
+ end
64
+ end
65
+ end
66
+ end
67
+ end
68
+ end
@@ -0,0 +1,53 @@
1
+ # typed: true
2
+
3
+ require_relative '../../configuration/settings'
4
+ require_relative 'env'
5
+ require_relative 'ext'
6
+ require_relative 'adapters/net'
7
+
8
+ module Datadog
9
+ module Core
10
+ module Telemetry
11
+ module Http
12
+ # Class to send telemetry data to Telemetry API
13
+ class Transport
14
+ attr_reader \
15
+ :host,
16
+ :port,
17
+ :ssl,
18
+ :path
19
+
20
+ def initialize
21
+ agent_settings = Configuration::AgentSettingsResolver.call(Datadog.configuration)
22
+ @host = agent_settings.hostname
23
+ @port = agent_settings.port
24
+ @ssl = false
25
+ @path = Http::Ext::AGENT_ENDPOINT
26
+ end
27
+
28
+ def request(request_type:, payload:)
29
+ env = Http::Env.new
30
+ env.path = @path
31
+ env.body = payload
32
+ env.headers = headers(request_type: request_type)
33
+ adapter.post(env)
34
+ end
35
+
36
+ private
37
+
38
+ def headers(request_type:, api_version: Http::Ext::API_VERSION)
39
+ {
40
+ Http::Ext::HEADER_CONTENT_TYPE => Http::Ext::CONTENT_TYPE_APPLICATION_JSON,
41
+ Http::Ext::HEADER_DD_TELEMETRY_API_VERSION => api_version,
42
+ Http::Ext::HEADER_DD_TELEMETRY_REQUEST_TYPE => request_type,
43
+ }
44
+ end
45
+
46
+ def adapter
47
+ @adapter ||= Http::Adapters::Net.new(hostname: @host, port: @port, ssl: @ssl)
48
+ end
49
+ end
50
+ end
51
+ end
52
+ end
53
+ end