ddtrace 1.1.0 → 1.9.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.
- checksums.yaml +4 -4
- data/CHANGELOG.md +423 -1
- data/LICENSE-3rdparty.csv +3 -0
- data/README.md +9 -4
- data/ext/ddtrace_profiling_loader/ddtrace_profiling_loader.c +21 -5
- data/ext/ddtrace_profiling_loader/extconf.rb +22 -1
- data/ext/ddtrace_profiling_native_extension/NativeExtensionDesign.md +52 -8
- data/ext/ddtrace_profiling_native_extension/clock_id.h +22 -1
- data/ext/ddtrace_profiling_native_extension/clock_id_from_pthread.c +34 -3
- data/ext/ddtrace_profiling_native_extension/clock_id_noop.c +11 -2
- data/ext/ddtrace_profiling_native_extension/collectors_cpu_and_wall_time.c +899 -0
- data/ext/ddtrace_profiling_native_extension/collectors_cpu_and_wall_time.h +9 -0
- data/ext/ddtrace_profiling_native_extension/collectors_cpu_and_wall_time_worker.c +776 -0
- data/ext/ddtrace_profiling_native_extension/collectors_dynamic_sampling_rate.c +142 -0
- data/ext/ddtrace_profiling_native_extension/collectors_dynamic_sampling_rate.h +14 -0
- data/ext/ddtrace_profiling_native_extension/collectors_idle_sampling_helper.c +241 -0
- data/ext/ddtrace_profiling_native_extension/collectors_idle_sampling_helper.h +3 -0
- data/ext/ddtrace_profiling_native_extension/collectors_stack.c +175 -63
- data/ext/ddtrace_profiling_native_extension/collectors_stack.h +18 -0
- data/ext/ddtrace_profiling_native_extension/extconf.rb +90 -18
- data/ext/ddtrace_profiling_native_extension/helpers.h +17 -0
- data/ext/ddtrace_profiling_native_extension/http_transport.c +354 -0
- data/ext/ddtrace_profiling_native_extension/libdatadog_helpers.h +18 -0
- data/ext/ddtrace_profiling_native_extension/native_extension_helpers.rb +154 -21
- data/ext/ddtrace_profiling_native_extension/private_vm_api_access.c +256 -17
- data/ext/ddtrace_profiling_native_extension/private_vm_api_access.h +17 -5
- data/ext/ddtrace_profiling_native_extension/profiling.c +223 -3
- data/ext/ddtrace_profiling_native_extension/ruby_helpers.c +110 -0
- data/ext/ddtrace_profiling_native_extension/ruby_helpers.h +89 -0
- data/ext/ddtrace_profiling_native_extension/setup_signal_handler.c +115 -0
- data/ext/ddtrace_profiling_native_extension/setup_signal_handler.h +11 -0
- data/ext/ddtrace_profiling_native_extension/stack_recorder.c +392 -44
- data/ext/ddtrace_profiling_native_extension/stack_recorder.h +25 -14
- data/ext/ddtrace_profiling_native_extension/time_helpers.c +17 -0
- data/ext/ddtrace_profiling_native_extension/time_helpers.h +10 -0
- data/lib/datadog/appsec/assets/blocked.html +98 -3
- data/lib/datadog/appsec/assets/blocked.json +1 -0
- data/lib/datadog/appsec/assets/blocked.text +5 -0
- data/lib/datadog/appsec/assets/waf_rules/recommended.json +1250 -300
- data/lib/datadog/appsec/assets/waf_rules/risky.json +78 -78
- data/lib/datadog/appsec/assets/waf_rules/strict.json +308 -73
- data/lib/datadog/appsec/assets.rb +3 -3
- data/lib/datadog/appsec/autoload.rb +4 -2
- data/lib/datadog/appsec/configuration/settings.rb +40 -23
- data/lib/datadog/appsec/configuration.rb +9 -3
- data/lib/datadog/appsec/contrib/auto_instrument.rb +1 -3
- data/lib/datadog/appsec/contrib/configuration/settings.rb +2 -2
- data/lib/datadog/appsec/contrib/integration.rb +1 -1
- data/lib/datadog/appsec/contrib/patcher.rb +1 -1
- data/lib/datadog/appsec/contrib/rack/configuration/settings.rb +3 -3
- data/lib/datadog/appsec/contrib/rack/ext.rb +1 -1
- data/lib/datadog/appsec/contrib/rack/gateway/watcher.rb +32 -27
- data/lib/datadog/appsec/contrib/rack/integration.rb +5 -5
- data/lib/datadog/appsec/contrib/rack/patcher.rb +2 -2
- data/lib/datadog/appsec/contrib/rack/reactive/request.rb +17 -21
- data/lib/datadog/appsec/contrib/rack/reactive/request_body.rb +13 -13
- data/lib/datadog/appsec/contrib/rack/reactive/response.rb +13 -13
- data/lib/datadog/appsec/contrib/rack/request.rb +21 -1
- data/lib/datadog/appsec/contrib/rack/request_body_middleware.rb +3 -3
- data/lib/datadog/appsec/contrib/rack/request_middleware.rb +50 -23
- data/lib/datadog/appsec/contrib/rack/response.rb +1 -1
- data/lib/datadog/appsec/contrib/rails/configuration/settings.rb +3 -3
- data/lib/datadog/appsec/contrib/rails/ext.rb +1 -1
- data/lib/datadog/appsec/contrib/rails/framework.rb +1 -1
- data/lib/datadog/appsec/contrib/rails/gateway/watcher.rb +12 -11
- data/lib/datadog/appsec/contrib/rails/integration.rb +5 -5
- data/lib/datadog/appsec/contrib/rails/patcher.rb +14 -13
- data/lib/datadog/appsec/contrib/rails/reactive/action.rb +13 -13
- data/lib/datadog/appsec/contrib/rails/request.rb +4 -1
- data/lib/datadog/appsec/contrib/rails/request_middleware.rb +1 -1
- data/lib/datadog/appsec/contrib/sinatra/configuration/settings.rb +3 -3
- data/lib/datadog/appsec/contrib/sinatra/ext.rb +2 -1
- data/lib/datadog/appsec/contrib/sinatra/framework.rb +1 -1
- data/lib/datadog/appsec/contrib/sinatra/gateway/watcher.rb +21 -19
- data/lib/datadog/appsec/contrib/sinatra/integration.rb +4 -4
- data/lib/datadog/appsec/contrib/sinatra/patcher.rb +22 -15
- data/lib/datadog/appsec/contrib/sinatra/reactive/routed.rb +12 -12
- data/lib/datadog/appsec/contrib/sinatra/request_middleware.rb +1 -1
- data/lib/datadog/appsec/event.rb +10 -14
- data/lib/datadog/appsec/extensions.rb +43 -23
- data/lib/datadog/appsec/instrumentation/gateway.rb +17 -3
- data/lib/datadog/appsec/processor.rb +51 -21
- data/lib/datadog/appsec/rate_limiter.rb +1 -1
- data/lib/datadog/appsec/reactive/address_hash.rb +1 -1
- data/lib/datadog/appsec/reactive/engine.rb +3 -3
- data/lib/datadog/appsec/reactive/operation.rb +5 -5
- data/lib/datadog/appsec/reactive/subscriber.rb +1 -1
- data/lib/datadog/appsec/response.rb +63 -0
- data/lib/datadog/appsec/utils/http/media_range.rb +201 -0
- data/lib/datadog/appsec/utils/http/media_type.rb +87 -0
- data/lib/datadog/appsec/utils/http.rb +9 -0
- data/lib/datadog/appsec/utils.rb +7 -0
- data/lib/datadog/appsec.rb +6 -6
- data/lib/datadog/ci/configuration/components.rb +1 -1
- data/lib/datadog/ci/configuration/settings.rb +1 -1
- data/lib/datadog/ci/contrib/cucumber/configuration/settings.rb +2 -2
- data/lib/datadog/ci/contrib/cucumber/formatter.rb +5 -5
- data/lib/datadog/ci/contrib/cucumber/instrumentation.rb +1 -1
- data/lib/datadog/ci/contrib/cucumber/integration.rb +4 -4
- data/lib/datadog/ci/contrib/cucumber/patcher.rb +2 -2
- data/lib/datadog/ci/contrib/rspec/configuration/settings.rb +2 -2
- data/lib/datadog/ci/contrib/rspec/example.rb +5 -5
- data/lib/datadog/ci/contrib/rspec/integration.rb +4 -4
- data/lib/datadog/ci/contrib/rspec/patcher.rb +2 -2
- data/lib/datadog/ci/ext/environment.rb +78 -20
- data/lib/datadog/ci/extensions.rb +4 -4
- data/lib/datadog/ci/flush.rb +2 -2
- data/lib/datadog/ci/test.rb +3 -3
- data/lib/datadog/ci.rb +6 -6
- data/lib/datadog/core/buffer/cruby.rb +1 -1
- data/lib/datadog/core/buffer/thread_safe.rb +1 -1
- data/lib/datadog/core/configuration/agent_settings_resolver.rb +8 -11
- data/lib/datadog/core/configuration/base.rb +14 -2
- data/lib/datadog/core/configuration/components.rb +103 -52
- data/lib/datadog/core/configuration/ext.rb +26 -0
- data/lib/datadog/core/configuration/option_definition.rb +12 -3
- data/lib/datadog/core/configuration/option_definition_set.rb +1 -1
- data/lib/datadog/core/configuration/options.rb +3 -3
- data/lib/datadog/core/configuration/settings.rb +78 -250
- data/lib/datadog/core/configuration.rb +9 -6
- data/lib/datadog/core/diagnostics/environment_logger.rb +10 -5
- data/lib/datadog/core/diagnostics/health.rb +5 -23
- data/lib/datadog/core/environment/cgroup.rb +1 -1
- data/lib/datadog/core/environment/container.rb +1 -1
- data/lib/datadog/core/environment/ext.rb +1 -1
- data/lib/datadog/core/environment/identity.rb +2 -2
- data/lib/datadog/core/environment/platform.rb +40 -0
- data/lib/datadog/core/environment/socket.rb +1 -1
- data/lib/datadog/core/environment/variable_helpers.rb +58 -10
- data/lib/datadog/core/error.rb +1 -1
- data/lib/datadog/core/extensions.rb +1 -1
- data/lib/datadog/core/header_collection.rb +41 -0
- data/lib/datadog/core/metrics/client.rb +10 -9
- data/lib/datadog/core/metrics/ext.rb +0 -2
- data/lib/datadog/core/metrics/options.rb +3 -3
- data/lib/datadog/core/runtime/ext.rb +1 -1
- data/lib/datadog/core/runtime/metrics.rb +6 -6
- data/lib/datadog/core/telemetry/client.rb +79 -0
- data/lib/datadog/core/telemetry/collector.rb +233 -0
- data/lib/datadog/core/telemetry/emitter.rb +48 -0
- data/lib/datadog/core/telemetry/event.rb +71 -0
- data/lib/datadog/core/telemetry/ext.rb +11 -0
- data/lib/datadog/core/telemetry/heartbeat.rb +37 -0
- data/lib/datadog/core/telemetry/http/adapters/net.rb +113 -0
- data/lib/datadog/core/telemetry/http/env.rb +20 -0
- data/lib/datadog/core/telemetry/http/ext.rb +20 -0
- data/lib/datadog/core/telemetry/http/response.rb +68 -0
- data/lib/datadog/core/telemetry/http/transport.rb +53 -0
- data/lib/datadog/core/telemetry/v1/app_event.rb +52 -0
- data/lib/datadog/core/telemetry/v1/application.rb +86 -0
- data/lib/datadog/core/telemetry/v1/configuration.rb +25 -0
- data/lib/datadog/core/telemetry/v1/dependency.rb +36 -0
- data/lib/datadog/core/telemetry/v1/host.rb +51 -0
- data/lib/datadog/core/telemetry/v1/integration.rb +58 -0
- data/lib/datadog/core/telemetry/v1/product.rb +28 -0
- data/lib/datadog/core/telemetry/v1/telemetry_request.rb +100 -0
- data/lib/datadog/core/utils/compression.rb +5 -1
- data/lib/datadog/core/utils/object_set.rb +1 -1
- data/lib/datadog/core/utils/sequence.rb +5 -0
- data/lib/datadog/core/utils/string_table.rb +1 -1
- data/lib/datadog/core/utils/time.rb +3 -3
- data/lib/datadog/core/utils.rb +1 -22
- data/lib/datadog/core/vendor/multipart-post/multipart/post/multipartable.rb +2 -2
- data/lib/datadog/core/vendor/multipart-post/net/http/post/multipart.rb +3 -3
- data/lib/datadog/core/workers/async.rb +1 -3
- data/lib/datadog/core/workers/polling.rb +2 -2
- data/lib/datadog/core/workers/runtime_metrics.rb +4 -4
- data/lib/datadog/core.rb +22 -56
- data/lib/datadog/kit/appsec/events.rb +75 -0
- data/lib/datadog/kit/enable_core_dumps.rb +1 -0
- data/lib/datadog/kit/identity.rb +8 -7
- data/lib/datadog/kit.rb +1 -1
- data/lib/datadog/opentelemetry/api/context.rb +187 -0
- data/lib/datadog/opentelemetry/api/trace/span.rb +15 -0
- data/lib/datadog/opentelemetry/sdk/configurator.rb +38 -0
- data/lib/datadog/opentelemetry/sdk/id_generator.rb +27 -0
- data/lib/datadog/opentelemetry/sdk/propagator.rb +91 -0
- data/lib/datadog/opentelemetry/sdk/span_processor.rb +92 -0
- data/lib/datadog/opentelemetry.rb +48 -0
- data/lib/datadog/opentracer/distributed_headers.rb +7 -9
- data/lib/datadog/opentracer/rack_propagator.rb +10 -9
- data/lib/datadog/opentracer/span.rb +1 -1
- data/lib/datadog/opentracer/text_map_propagator.rb +13 -12
- data/lib/datadog/opentracer/thread_local_scope_manager.rb +26 -3
- data/lib/datadog/opentracer/tracer.rb +23 -21
- data/lib/datadog/opentracer.rb +16 -16
- data/lib/datadog/profiling/buffer.rb +3 -3
- data/lib/datadog/profiling/collectors/code_provenance.rb +1 -0
- data/lib/datadog/profiling/collectors/cpu_and_wall_time.rb +43 -0
- data/lib/datadog/profiling/collectors/cpu_and_wall_time_worker.rb +91 -0
- data/lib/datadog/profiling/collectors/dynamic_sampling_rate.rb +14 -0
- data/lib/datadog/profiling/collectors/idle_sampling_helper.rb +68 -0
- data/lib/datadog/profiling/collectors/old_stack.rb +15 -8
- data/lib/datadog/profiling/collectors/stack.rb +3 -6
- data/lib/datadog/profiling/encoding/profile.rb +8 -12
- data/lib/datadog/profiling/events/stack.rb +1 -1
- data/lib/datadog/profiling/exporter.rb +69 -9
- data/lib/datadog/profiling/ext/forking.rb +41 -42
- data/lib/datadog/profiling/ext.rb +3 -15
- data/lib/datadog/profiling/flush.rb +25 -56
- data/lib/datadog/profiling/http_transport.rb +132 -0
- data/lib/datadog/profiling/old_recorder.rb +109 -0
- data/lib/datadog/profiling/pprof/builder.rb +4 -4
- data/lib/datadog/profiling/pprof/converter.rb +1 -1
- data/lib/datadog/profiling/pprof/message_set.rb +1 -1
- data/lib/datadog/profiling/pprof/stack_sample.rb +4 -4
- data/lib/datadog/profiling/pprof/string_table.rb +1 -1
- data/lib/datadog/profiling/pprof/template.rb +5 -5
- data/lib/datadog/profiling/preload.rb +1 -1
- data/lib/datadog/profiling/profiler.rb +7 -0
- data/lib/datadog/profiling/scheduler.rb +28 -49
- data/lib/datadog/profiling/stack_recorder.rb +50 -4
- data/lib/datadog/profiling/tag_builder.rb +6 -1
- data/lib/datadog/profiling/tasks/setup.rb +2 -9
- data/lib/datadog/profiling/trace_identifiers/ddtrace.rb +2 -2
- data/lib/datadog/profiling/trace_identifiers/helper.rb +1 -1
- data/lib/datadog/profiling.rb +24 -21
- data/lib/datadog/tracing/analytics.rb +1 -1
- data/lib/datadog/tracing/buffer.rb +5 -5
- data/lib/datadog/tracing/client_ip.rb +164 -0
- data/lib/datadog/tracing/configuration/ext.rb +47 -4
- data/lib/datadog/tracing/configuration/settings.rb +433 -0
- data/lib/datadog/tracing/context.rb +1 -1
- data/lib/datadog/tracing/context_provider.rb +18 -2
- data/lib/datadog/tracing/contrib/action_cable/configuration/settings.rb +2 -2
- data/lib/datadog/tracing/contrib/action_cable/event.rb +4 -5
- data/lib/datadog/tracing/contrib/action_cable/events/broadcast.rb +4 -4
- data/lib/datadog/tracing/contrib/action_cable/events/perform_action.rb +3 -3
- data/lib/datadog/tracing/contrib/action_cable/events/transmit.rb +4 -4
- data/lib/datadog/tracing/contrib/action_cable/events.rb +4 -4
- data/lib/datadog/tracing/contrib/action_cable/instrumentation.rb +3 -4
- data/lib/datadog/tracing/contrib/action_cable/integration.rb +4 -4
- data/lib/datadog/tracing/contrib/action_cable/patcher.rb +4 -4
- data/lib/datadog/tracing/contrib/action_mailer/configuration/settings.rb +2 -2
- data/lib/datadog/tracing/contrib/action_mailer/event.rb +3 -3
- data/lib/datadog/tracing/contrib/action_mailer/events/deliver.rb +3 -3
- data/lib/datadog/tracing/contrib/action_mailer/events/process.rb +3 -3
- data/lib/datadog/tracing/contrib/action_mailer/events.rb +2 -2
- data/lib/datadog/tracing/contrib/action_mailer/integration.rb +4 -4
- data/lib/datadog/tracing/contrib/action_mailer/patcher.rb +3 -3
- data/lib/datadog/tracing/contrib/action_pack/action_controller/instrumentation.rb +10 -6
- data/lib/datadog/tracing/contrib/action_pack/action_controller/patcher.rb +2 -2
- data/lib/datadog/tracing/contrib/action_pack/configuration/settings.rb +2 -2
- data/lib/datadog/tracing/contrib/action_pack/integration.rb +4 -4
- data/lib/datadog/tracing/contrib/action_pack/patcher.rb +2 -2
- data/lib/datadog/tracing/contrib/action_pack/utils.rb +1 -1
- data/lib/datadog/tracing/contrib/action_view/configuration/settings.rb +2 -2
- data/lib/datadog/tracing/contrib/action_view/event.rb +1 -1
- data/lib/datadog/tracing/contrib/action_view/events/render_partial.rb +5 -5
- data/lib/datadog/tracing/contrib/action_view/events/render_template.rb +5 -5
- data/lib/datadog/tracing/contrib/action_view/events.rb +2 -2
- data/lib/datadog/tracing/contrib/action_view/instrumentation/partial_renderer.rb +2 -2
- data/lib/datadog/tracing/contrib/action_view/instrumentation/template_renderer.rb +2 -2
- data/lib/datadog/tracing/contrib/action_view/integration.rb +4 -4
- data/lib/datadog/tracing/contrib/action_view/patcher.rb +7 -7
- data/lib/datadog/tracing/contrib/action_view/utils.rb +1 -1
- data/lib/datadog/tracing/contrib/active_job/configuration/settings.rb +3 -3
- data/lib/datadog/tracing/contrib/active_job/event.rb +3 -3
- data/lib/datadog/tracing/contrib/active_job/events/discard.rb +4 -4
- data/lib/datadog/tracing/contrib/active_job/events/enqueue.rb +4 -4
- data/lib/datadog/tracing/contrib/active_job/events/enqueue_at.rb +4 -4
- data/lib/datadog/tracing/contrib/active_job/events/enqueue_retry.rb +4 -4
- data/lib/datadog/tracing/contrib/active_job/events/perform.rb +4 -4
- data/lib/datadog/tracing/contrib/active_job/events/retry_stopped.rb +4 -4
- data/lib/datadog/tracing/contrib/active_job/events.rb +6 -6
- data/lib/datadog/tracing/contrib/active_job/integration.rb +4 -4
- data/lib/datadog/tracing/contrib/active_job/log_injection.rb +0 -2
- data/lib/datadog/tracing/contrib/active_job/patcher.rb +4 -4
- data/lib/datadog/tracing/contrib/active_model_serializers/configuration/settings.rb +2 -2
- data/lib/datadog/tracing/contrib/active_model_serializers/event.rb +4 -5
- data/lib/datadog/tracing/contrib/active_model_serializers/events/render.rb +3 -3
- data/lib/datadog/tracing/contrib/active_model_serializers/events/serialize.rb +2 -2
- data/lib/datadog/tracing/contrib/active_model_serializers/events.rb +2 -2
- data/lib/datadog/tracing/contrib/active_model_serializers/integration.rb +3 -3
- data/lib/datadog/tracing/contrib/active_model_serializers/patcher.rb +3 -4
- data/lib/datadog/tracing/contrib/active_record/configuration/resolver.rb +2 -2
- data/lib/datadog/tracing/contrib/active_record/configuration/settings.rb +3 -3
- data/lib/datadog/tracing/contrib/active_record/event.rb +1 -1
- data/lib/datadog/tracing/contrib/active_record/events/instantiation.rb +4 -4
- data/lib/datadog/tracing/contrib/active_record/events/sql.rb +6 -6
- data/lib/datadog/tracing/contrib/active_record/events.rb +2 -2
- data/lib/datadog/tracing/contrib/active_record/integration.rb +6 -6
- data/lib/datadog/tracing/contrib/active_record/patcher.rb +2 -2
- data/lib/datadog/tracing/contrib/active_record/utils.rb +2 -2
- data/lib/datadog/tracing/contrib/active_support/cache/instrumentation.rb +19 -9
- data/lib/datadog/tracing/contrib/active_support/cache/patcher.rb +2 -2
- data/lib/datadog/tracing/contrib/active_support/cache/redis.rb +1 -1
- data/lib/datadog/tracing/contrib/active_support/configuration/settings.rb +2 -2
- data/lib/datadog/tracing/contrib/active_support/integration.rb +5 -5
- data/lib/datadog/tracing/contrib/active_support/notifications/event.rb +1 -1
- data/lib/datadog/tracing/contrib/active_support/notifications/subscriber.rb +1 -1
- data/lib/datadog/tracing/contrib/active_support/patcher.rb +2 -2
- data/lib/datadog/tracing/contrib/analytics.rb +1 -1
- data/lib/datadog/tracing/contrib/auto_instrument.rb +4 -4
- data/lib/datadog/tracing/contrib/aws/configuration/settings.rb +6 -3
- data/lib/datadog/tracing/contrib/aws/ext.rb +1 -0
- data/lib/datadog/tracing/contrib/aws/instrumentation.rb +5 -4
- data/lib/datadog/tracing/contrib/aws/integration.rb +3 -3
- data/lib/datadog/tracing/contrib/aws/patcher.rb +5 -5
- data/lib/datadog/tracing/contrib/aws/services.rb +0 -2
- data/lib/datadog/tracing/contrib/concurrent_ruby/configuration/settings.rb +2 -2
- data/lib/datadog/tracing/contrib/concurrent_ruby/future_patch.rb +1 -1
- data/lib/datadog/tracing/contrib/concurrent_ruby/integration.rb +3 -3
- data/lib/datadog/tracing/contrib/concurrent_ruby/patcher.rb +2 -2
- data/lib/datadog/tracing/contrib/configurable.rb +2 -2
- data/lib/datadog/tracing/contrib/configuration/resolvers/pattern_resolver.rb +1 -1
- data/lib/datadog/tracing/contrib/configuration/settings.rb +2 -2
- data/lib/datadog/tracing/contrib/dalli/configuration/settings.rb +6 -3
- data/lib/datadog/tracing/contrib/dalli/ext.rb +2 -0
- data/lib/datadog/tracing/contrib/dalli/instrumentation.rb +8 -5
- data/lib/datadog/tracing/contrib/dalli/integration.rb +3 -3
- data/lib/datadog/tracing/contrib/dalli/patcher.rb +3 -3
- data/lib/datadog/tracing/contrib/dalli/quantize.rb +1 -1
- data/lib/datadog/tracing/contrib/delayed_job/configuration/settings.rb +3 -3
- data/lib/datadog/tracing/contrib/delayed_job/ext.rb +2 -0
- data/lib/datadog/tracing/contrib/delayed_job/integration.rb +3 -3
- data/lib/datadog/tracing/contrib/delayed_job/patcher.rb +8 -2
- data/lib/datadog/tracing/contrib/delayed_job/plugin.rb +7 -4
- data/lib/datadog/tracing/contrib/delayed_job/server_internal_tracer/worker.rb +32 -0
- data/lib/datadog/tracing/contrib/elasticsearch/configuration/settings.rb +7 -3
- data/lib/datadog/tracing/contrib/elasticsearch/ext.rb +3 -0
- data/lib/datadog/tracing/contrib/elasticsearch/integration.rb +3 -3
- data/lib/datadog/tracing/contrib/elasticsearch/patcher.rb +9 -7
- data/lib/datadog/tracing/contrib/elasticsearch/quantize.rb +1 -1
- data/lib/datadog/tracing/contrib/ethon/configuration/settings.rb +8 -3
- data/lib/datadog/tracing/contrib/ethon/easy_patch.rb +6 -7
- data/lib/datadog/tracing/contrib/ethon/ext.rb +1 -0
- data/lib/datadog/tracing/contrib/ethon/integration.rb +4 -4
- data/lib/datadog/tracing/contrib/ethon/multi_patch.rb +5 -4
- data/lib/datadog/tracing/contrib/ethon/patcher.rb +3 -3
- data/lib/datadog/tracing/contrib/excon/configuration/settings.rb +7 -3
- data/lib/datadog/tracing/contrib/excon/ext.rb +1 -0
- data/lib/datadog/tracing/contrib/excon/integration.rb +4 -4
- data/lib/datadog/tracing/contrib/excon/middleware.rb +8 -7
- data/lib/datadog/tracing/contrib/excon/patcher.rb +2 -2
- data/lib/datadog/tracing/contrib/ext.rb +25 -0
- data/lib/datadog/tracing/contrib/extensions.rb +5 -3
- data/lib/datadog/tracing/contrib/faraday/configuration/settings.rb +7 -3
- data/lib/datadog/tracing/contrib/faraday/ext.rb +1 -0
- data/lib/datadog/tracing/contrib/faraday/integration.rb +4 -4
- data/lib/datadog/tracing/contrib/faraday/middleware.rb +8 -8
- data/lib/datadog/tracing/contrib/faraday/patcher.rb +5 -5
- data/lib/datadog/tracing/contrib/grape/configuration/settings.rb +3 -3
- data/lib/datadog/tracing/contrib/grape/endpoint.rb +4 -7
- data/lib/datadog/tracing/contrib/grape/integration.rb +3 -3
- data/lib/datadog/tracing/contrib/grape/patcher.rb +4 -4
- data/lib/datadog/tracing/contrib/graphql/configuration/settings.rb +3 -3
- data/lib/datadog/tracing/contrib/graphql/integration.rb +3 -3
- data/lib/datadog/tracing/contrib/graphql/patcher.rb +2 -3
- data/lib/datadog/tracing/contrib/grpc/configuration/settings.rb +10 -4
- data/lib/datadog/tracing/contrib/grpc/datadog_interceptor/client.rb +20 -5
- data/lib/datadog/tracing/contrib/grpc/datadog_interceptor/server.rb +17 -17
- data/lib/datadog/tracing/contrib/grpc/datadog_interceptor.rb +7 -4
- data/lib/datadog/tracing/contrib/grpc/distributed/fetcher.rb +27 -0
- data/lib/datadog/tracing/contrib/grpc/distributed/propagation.rb +43 -0
- data/lib/datadog/tracing/contrib/grpc/ext.rb +4 -0
- data/lib/datadog/tracing/contrib/grpc/integration.rb +3 -3
- data/lib/datadog/tracing/contrib/grpc/patcher.rb +3 -5
- data/lib/datadog/tracing/contrib/hanami/action_tracer.rb +47 -0
- data/lib/datadog/tracing/contrib/hanami/configuration/settings.rb +22 -0
- data/lib/datadog/tracing/contrib/hanami/ext.rb +24 -0
- data/lib/datadog/tracing/contrib/hanami/integration.rb +44 -0
- data/lib/datadog/tracing/contrib/hanami/patcher.rb +33 -0
- data/lib/datadog/tracing/contrib/hanami/plugin.rb +23 -0
- data/lib/datadog/tracing/contrib/hanami/renderer_policy_tracing.rb +41 -0
- data/lib/datadog/tracing/contrib/hanami/router_tracing.rb +44 -0
- data/lib/datadog/tracing/contrib/http/circuit_breaker.rb +1 -2
- data/lib/datadog/tracing/contrib/http/configuration/settings.rb +13 -3
- data/lib/datadog/tracing/contrib/http/distributed/fetcher.rb +39 -0
- data/lib/datadog/tracing/contrib/http/distributed/propagation.rb +38 -0
- data/lib/datadog/tracing/contrib/http/ext.rb +2 -0
- data/lib/datadog/tracing/contrib/http/instrumentation.rb +8 -10
- data/lib/datadog/tracing/contrib/http/integration.rb +6 -6
- data/lib/datadog/tracing/contrib/http/patcher.rb +3 -3
- data/lib/datadog/tracing/contrib/httpclient/configuration/settings.rb +13 -3
- data/lib/datadog/tracing/contrib/httpclient/ext.rb +2 -0
- data/lib/datadog/tracing/contrib/httpclient/instrumentation.rb +9 -9
- data/lib/datadog/tracing/contrib/httpclient/integration.rb +4 -4
- data/lib/datadog/tracing/contrib/httpclient/patcher.rb +3 -3
- data/lib/datadog/tracing/contrib/httprb/configuration/settings.rb +13 -3
- data/lib/datadog/tracing/contrib/httprb/ext.rb +2 -0
- data/lib/datadog/tracing/contrib/httprb/instrumentation.rb +9 -9
- data/lib/datadog/tracing/contrib/httprb/integration.rb +4 -4
- data/lib/datadog/tracing/contrib/httprb/patcher.rb +3 -3
- data/lib/datadog/tracing/contrib/integration.rb +3 -3
- data/lib/datadog/tracing/contrib/kafka/configuration/settings.rb +2 -2
- data/lib/datadog/tracing/contrib/kafka/consumer_event.rb +1 -0
- data/lib/datadog/tracing/contrib/kafka/event.rb +3 -3
- data/lib/datadog/tracing/contrib/kafka/events/connection/request.rb +2 -2
- data/lib/datadog/tracing/contrib/kafka/events/consumer/process_batch.rb +3 -3
- data/lib/datadog/tracing/contrib/kafka/events/consumer/process_message.rb +3 -3
- data/lib/datadog/tracing/contrib/kafka/events/consumer_group/heartbeat.rb +4 -4
- data/lib/datadog/tracing/contrib/kafka/events/consumer_group/join_group.rb +4 -4
- data/lib/datadog/tracing/contrib/kafka/events/consumer_group/leave_group.rb +4 -4
- data/lib/datadog/tracing/contrib/kafka/events/consumer_group/sync_group.rb +4 -4
- data/lib/datadog/tracing/contrib/kafka/events/produce_operation/send_messages.rb +3 -2
- data/lib/datadog/tracing/contrib/kafka/events/producer/deliver_messages.rb +3 -2
- data/lib/datadog/tracing/contrib/kafka/events.rb +9 -9
- data/lib/datadog/tracing/contrib/kafka/integration.rb +3 -3
- data/lib/datadog/tracing/contrib/kafka/patcher.rb +3 -3
- data/lib/datadog/tracing/contrib/lograge/configuration/settings.rb +2 -2
- data/lib/datadog/tracing/contrib/lograge/instrumentation.rb +1 -2
- data/lib/datadog/tracing/contrib/lograge/integration.rb +3 -3
- data/lib/datadog/tracing/contrib/lograge/patcher.rb +2 -2
- data/lib/datadog/tracing/contrib/mongodb/configuration/settings.rb +7 -3
- data/lib/datadog/tracing/contrib/mongodb/ext.rb +8 -0
- data/lib/datadog/tracing/contrib/mongodb/instrumentation.rb +3 -3
- data/lib/datadog/tracing/contrib/mongodb/integration.rb +4 -4
- data/lib/datadog/tracing/contrib/mongodb/parsers.rb +1 -1
- data/lib/datadog/tracing/contrib/mongodb/patcher.rb +3 -3
- data/lib/datadog/tracing/contrib/mongodb/subscribers.rb +10 -4
- data/lib/datadog/tracing/contrib/mysql2/configuration/settings.rb +18 -3
- data/lib/datadog/tracing/contrib/mysql2/ext.rb +2 -0
- data/lib/datadog/tracing/contrib/mysql2/instrumentation.rb +20 -5
- data/lib/datadog/tracing/contrib/mysql2/integration.rb +3 -3
- data/lib/datadog/tracing/contrib/mysql2/patcher.rb +2 -2
- data/lib/datadog/tracing/contrib/patcher.rb +16 -4
- data/lib/datadog/tracing/contrib/pg/configuration/settings.rb +50 -0
- data/lib/datadog/tracing/contrib/pg/ext.rb +33 -0
- data/lib/datadog/tracing/contrib/pg/instrumentation.rb +168 -0
- data/lib/datadog/tracing/contrib/pg/integration.rb +43 -0
- data/lib/datadog/tracing/contrib/pg/patcher.rb +31 -0
- data/lib/datadog/tracing/contrib/presto/configuration/settings.rb +6 -3
- data/lib/datadog/tracing/contrib/presto/ext.rb +1 -0
- data/lib/datadog/tracing/contrib/presto/instrumentation.rb +2 -3
- data/lib/datadog/tracing/contrib/presto/integration.rb +3 -3
- data/lib/datadog/tracing/contrib/presto/patcher.rb +4 -4
- data/lib/datadog/tracing/contrib/propagation/sql_comment/comment.rb +43 -0
- data/lib/datadog/tracing/contrib/propagation/sql_comment/ext.rb +33 -0
- data/lib/datadog/tracing/contrib/propagation/sql_comment/mode.rb +28 -0
- data/lib/datadog/tracing/contrib/propagation/sql_comment.rb +47 -0
- data/lib/datadog/tracing/contrib/qless/configuration/settings.rb +2 -2
- data/lib/datadog/tracing/contrib/qless/integration.rb +3 -3
- data/lib/datadog/tracing/contrib/qless/patcher.rb +1 -2
- data/lib/datadog/tracing/contrib/qless/qless_job.rb +2 -3
- data/lib/datadog/tracing/contrib/qless/tracer_cleaner.rb +0 -2
- data/lib/datadog/tracing/contrib/que/configuration/settings.rb +3 -3
- data/lib/datadog/tracing/contrib/que/integration.rb +4 -4
- data/lib/datadog/tracing/contrib/que/patcher.rb +1 -1
- data/lib/datadog/tracing/contrib/que/tracer.rb +3 -1
- data/lib/datadog/tracing/contrib/racecar/configuration/settings.rb +2 -2
- data/lib/datadog/tracing/contrib/racecar/event.rb +4 -5
- data/lib/datadog/tracing/contrib/racecar/events/batch.rb +6 -3
- data/lib/datadog/tracing/contrib/racecar/events/consume.rb +2 -2
- data/lib/datadog/tracing/contrib/racecar/events/message.rb +6 -3
- data/lib/datadog/tracing/contrib/racecar/events.rb +3 -3
- data/lib/datadog/tracing/contrib/racecar/integration.rb +3 -3
- data/lib/datadog/tracing/contrib/racecar/patcher.rb +3 -3
- data/lib/datadog/tracing/contrib/rack/configuration/settings.rb +2 -2
- data/lib/datadog/tracing/contrib/rack/header_collection.rb +35 -0
- data/lib/datadog/tracing/contrib/rack/integration.rb +4 -4
- data/lib/datadog/tracing/contrib/rack/middlewares.rb +129 -61
- data/lib/datadog/tracing/contrib/rack/patcher.rb +12 -2
- data/lib/datadog/tracing/contrib/rails/auto_instrument_railtie.rb +1 -1
- data/lib/datadog/tracing/contrib/rails/configuration/settings.rb +4 -1
- data/lib/datadog/tracing/contrib/rails/framework.rb +18 -22
- data/lib/datadog/tracing/contrib/rails/integration.rb +4 -4
- data/lib/datadog/tracing/contrib/rails/log_injection.rb +0 -2
- data/lib/datadog/tracing/contrib/rails/middlewares.rb +1 -2
- data/lib/datadog/tracing/contrib/rails/patcher.rb +7 -8
- data/lib/datadog/tracing/contrib/rails/railtie.rb +3 -3
- data/lib/datadog/tracing/contrib/rails/utils.rb +1 -1
- data/lib/datadog/tracing/contrib/rake/configuration/settings.rb +17 -2
- data/lib/datadog/tracing/contrib/rake/instrumentation.rb +12 -7
- data/lib/datadog/tracing/contrib/rake/integration.rb +3 -3
- data/lib/datadog/tracing/contrib/rake/patcher.rb +3 -4
- data/lib/datadog/tracing/contrib/redis/configuration/resolver.rb +1 -1
- data/lib/datadog/tracing/contrib/redis/configuration/settings.rb +6 -3
- data/lib/datadog/tracing/contrib/redis/ext.rb +3 -0
- data/lib/datadog/tracing/contrib/redis/instrumentation.rb +36 -26
- data/lib/datadog/tracing/contrib/redis/integration.rb +37 -4
- data/lib/datadog/tracing/contrib/redis/patcher.rb +57 -13
- data/lib/datadog/tracing/contrib/redis/quantize.rb +12 -9
- data/lib/datadog/tracing/contrib/redis/tags.rb +12 -10
- data/lib/datadog/tracing/contrib/redis/trace_middleware.rb +72 -0
- data/lib/datadog/tracing/contrib/resque/configuration/settings.rb +3 -3
- data/lib/datadog/tracing/contrib/resque/integration.rb +3 -3
- data/lib/datadog/tracing/contrib/resque/patcher.rb +2 -2
- data/lib/datadog/tracing/contrib/resque/resque_job.rb +5 -4
- data/lib/datadog/tracing/contrib/rest_client/configuration/settings.rb +9 -3
- data/lib/datadog/tracing/contrib/rest_client/ext.rb +1 -0
- data/lib/datadog/tracing/contrib/rest_client/integration.rb +3 -3
- data/lib/datadog/tracing/contrib/rest_client/patcher.rb +2 -2
- data/lib/datadog/tracing/contrib/rest_client/request_patch.rb +7 -6
- data/lib/datadog/tracing/contrib/semantic_logger/configuration/settings.rb +2 -2
- data/lib/datadog/tracing/contrib/semantic_logger/instrumentation.rb +1 -2
- data/lib/datadog/tracing/contrib/semantic_logger/integration.rb +3 -3
- data/lib/datadog/tracing/contrib/semantic_logger/patcher.rb +2 -2
- data/lib/datadog/tracing/contrib/sequel/configuration/settings.rb +2 -2
- data/lib/datadog/tracing/contrib/sequel/database.rb +4 -5
- data/lib/datadog/tracing/contrib/sequel/dataset.rb +4 -5
- data/lib/datadog/tracing/contrib/sequel/integration.rb +3 -3
- data/lib/datadog/tracing/contrib/sequel/patcher.rb +3 -3
- data/lib/datadog/tracing/contrib/sequel/utils.rb +2 -2
- data/lib/datadog/tracing/contrib/shoryuken/configuration/settings.rb +3 -3
- data/lib/datadog/tracing/contrib/shoryuken/integration.rb +4 -4
- data/lib/datadog/tracing/contrib/shoryuken/patcher.rb +1 -1
- data/lib/datadog/tracing/contrib/shoryuken/tracer.rb +3 -1
- data/lib/datadog/tracing/contrib/sidekiq/client_tracer.rb +9 -5
- data/lib/datadog/tracing/contrib/sidekiq/configuration/settings.rb +3 -3
- data/lib/datadog/tracing/contrib/sidekiq/ext.rb +6 -0
- data/lib/datadog/tracing/contrib/sidekiq/integration.rb +3 -3
- data/lib/datadog/tracing/contrib/sidekiq/patcher.rb +14 -7
- data/lib/datadog/tracing/contrib/sidekiq/server_internal_tracer/heartbeat.rb +19 -1
- data/lib/datadog/tracing/contrib/sidekiq/server_internal_tracer/{scheduled_push.rb → redis_info.rb} +5 -6
- data/lib/datadog/tracing/contrib/sidekiq/server_internal_tracer/scheduled_poller.rb +53 -0
- data/lib/datadog/tracing/contrib/sidekiq/server_tracer.rb +10 -6
- data/lib/datadog/tracing/contrib/sidekiq/tracing.rb +2 -2
- data/lib/datadog/tracing/contrib/sinatra/configuration/settings.rb +2 -2
- data/lib/datadog/tracing/contrib/sinatra/env.rb +14 -25
- data/lib/datadog/tracing/contrib/sinatra/ext.rb +7 -3
- data/lib/datadog/tracing/contrib/sinatra/framework.rb +0 -2
- data/lib/datadog/tracing/contrib/sinatra/headers.rb +1 -1
- data/lib/datadog/tracing/contrib/sinatra/integration.rb +3 -3
- data/lib/datadog/tracing/contrib/sinatra/patcher.rb +7 -7
- data/lib/datadog/tracing/contrib/sinatra/tracer.rb +15 -88
- data/lib/datadog/tracing/contrib/sinatra/tracer_middleware.rb +20 -16
- data/lib/datadog/tracing/contrib/sneakers/configuration/settings.rb +2 -2
- data/lib/datadog/tracing/contrib/sneakers/integration.rb +4 -4
- data/lib/datadog/tracing/contrib/sneakers/patcher.rb +2 -2
- data/lib/datadog/tracing/contrib/sneakers/tracer.rb +4 -3
- data/lib/datadog/tracing/contrib/status_code_matcher.rb +2 -2
- data/lib/datadog/tracing/contrib/stripe/configuration/settings.rb +33 -0
- data/lib/datadog/tracing/contrib/stripe/ext.rb +26 -0
- data/lib/datadog/tracing/contrib/stripe/integration.rb +43 -0
- data/lib/datadog/tracing/contrib/stripe/patcher.rb +29 -0
- data/lib/datadog/tracing/contrib/stripe/request.rb +67 -0
- data/lib/datadog/tracing/contrib/sucker_punch/configuration/settings.rb +2 -2
- data/lib/datadog/tracing/contrib/sucker_punch/instrumentation.rb +3 -4
- data/lib/datadog/tracing/contrib/sucker_punch/integration.rb +3 -3
- data/lib/datadog/tracing/contrib/sucker_punch/patcher.rb +4 -5
- data/lib/datadog/tracing/contrib/utils/quantization/http.rb +92 -10
- data/lib/datadog/tracing/contrib.rb +50 -47
- data/lib/datadog/tracing/correlation.rb +1 -1
- data/lib/datadog/{core → tracing}/diagnostics/ext.rb +1 -6
- data/lib/datadog/tracing/diagnostics/health.rb +40 -0
- data/lib/datadog/tracing/distributed/b3_multi.rb +66 -0
- data/lib/datadog/tracing/distributed/b3_single.rb +66 -0
- data/lib/datadog/tracing/distributed/datadog.rb +153 -0
- data/lib/datadog/tracing/distributed/datadog_tags_codec.rb +85 -0
- data/lib/datadog/tracing/distributed/fetcher.rb +30 -0
- data/lib/datadog/tracing/distributed/headers/ext.rb +19 -15
- data/lib/datadog/tracing/distributed/helpers.rb +40 -4
- data/lib/datadog/tracing/distributed/none.rb +19 -0
- data/lib/datadog/tracing/distributed/propagation.rb +127 -0
- data/lib/datadog/tracing/distributed/trace_context.rb +378 -0
- data/lib/datadog/tracing/event.rb +1 -1
- data/lib/datadog/tracing/flush.rb +57 -35
- data/lib/datadog/tracing/metadata/analytics.rb +2 -2
- data/lib/datadog/tracing/metadata/errors.rb +2 -2
- data/lib/datadog/tracing/metadata/ext.rb +28 -1
- data/lib/datadog/tracing/metadata/tagging.rb +23 -2
- data/lib/datadog/tracing/metadata.rb +3 -3
- data/lib/datadog/tracing/pipeline/span_filter.rb +10 -6
- data/lib/datadog/tracing/pipeline.rb +3 -3
- data/lib/datadog/tracing/propagation/http.rb +3 -98
- data/lib/datadog/tracing/runtime/metrics.rb +1 -1
- data/lib/datadog/tracing/sampling/all_sampler.rb +1 -1
- data/lib/datadog/tracing/sampling/ext.rb +31 -0
- data/lib/datadog/tracing/sampling/priority_sampler.rb +62 -9
- data/lib/datadog/tracing/sampling/rate_by_key_sampler.rb +10 -11
- data/lib/datadog/tracing/sampling/rate_by_service_sampler.rb +32 -8
- data/lib/datadog/tracing/sampling/rate_limiter.rb +4 -1
- data/lib/datadog/tracing/sampling/rate_sampler.rb +27 -10
- data/lib/datadog/tracing/sampling/rule.rb +3 -3
- data/lib/datadog/tracing/sampling/rule_sampler.rb +8 -7
- data/lib/datadog/tracing/sampling/span/ext.rb +25 -0
- data/lib/datadog/tracing/sampling/span/matcher.rb +89 -0
- data/lib/datadog/tracing/sampling/span/rule.rb +82 -0
- data/lib/datadog/tracing/sampling/span/rule_parser.rb +104 -0
- data/lib/datadog/tracing/sampling/span/sampler.rb +75 -0
- data/lib/datadog/tracing/span.rb +24 -20
- data/lib/datadog/tracing/span_operation.rb +13 -13
- data/lib/datadog/tracing/sync_writer.rb +5 -5
- data/lib/datadog/tracing/trace_digest.rb +88 -2
- data/lib/datadog/tracing/trace_operation.rb +60 -15
- data/lib/datadog/tracing/trace_segment.rb +13 -8
- data/lib/datadog/tracing/tracer.rb +49 -21
- data/lib/datadog/tracing/utils.rb +50 -0
- data/lib/datadog/tracing/workers/trace_writer.rb +9 -9
- data/lib/datadog/tracing/workers.rb +3 -3
- data/lib/datadog/tracing/writer.rb +12 -5
- data/lib/datadog/tracing.rb +8 -8
- data/lib/ddtrace/auto_instrument.rb +9 -2
- data/lib/ddtrace/transport/ext.rb +7 -1
- data/lib/ddtrace/transport/http/adapters/net.rb +3 -2
- data/lib/ddtrace/transport/http/adapters/test.rb +1 -1
- data/lib/ddtrace/transport/http/adapters/unix_socket.rb +2 -2
- data/lib/ddtrace/transport/http/api/map.rb +1 -1
- data/lib/ddtrace/transport/http/api.rb +4 -4
- data/lib/ddtrace/transport/http/builder.rb +5 -5
- data/lib/ddtrace/transport/http/client.rb +2 -2
- data/lib/ddtrace/transport/http/response.rb +1 -1
- data/lib/ddtrace/transport/http/statistics.rb +1 -1
- data/lib/ddtrace/transport/http/traces.rb +5 -5
- data/lib/ddtrace/transport/http.rb +12 -9
- data/lib/ddtrace/transport/io/client.rb +2 -2
- data/lib/ddtrace/transport/io/response.rb +1 -1
- data/lib/ddtrace/transport/io/traces.rb +3 -3
- data/lib/ddtrace/transport/io.rb +3 -3
- data/lib/ddtrace/transport/statistics.rb +2 -2
- data/lib/ddtrace/transport/trace_formatter.rb +14 -10
- data/lib/ddtrace/transport/traces.rb +8 -6
- data/lib/ddtrace/version.rb +1 -1
- data/lib/ddtrace.rb +6 -6
- metadata +127 -48
- data/.editorconfig +0 -22
- data/.gitignore +0 -58
- data/CONTRIBUTING.md +0 -81
- data/ddtrace.gemspec +0 -68
- data/docs/0.x-trace.png +0 -0
- data/docs/1.0-trace.png +0 -0
- data/docs/AutoInstrumentation.md +0 -36
- data/docs/Deprecation.md +0 -8
- data/docs/DevelopmentGuide.md +0 -259
- data/docs/GettingStarted.md +0 -2688
- data/docs/ProfilingDevelopment.md +0 -110
- data/docs/PublicApi.md +0 -14
- data/docs/UpgradeGuide.md +0 -736
- data/ext/ddtrace_profiling_native_extension/libddprof_helpers.h +0 -13
- data/lib/datadog/profiling/recorder.rb +0 -117
- data/lib/datadog/profiling/transport/client.rb +0 -16
- data/lib/datadog/profiling/transport/http/api/endpoint.rb +0 -107
- data/lib/datadog/profiling/transport/http/api/instance.rb +0 -38
- data/lib/datadog/profiling/transport/http/api/spec.rb +0 -42
- data/lib/datadog/profiling/transport/http/api.rb +0 -45
- data/lib/datadog/profiling/transport/http/builder.rb +0 -30
- data/lib/datadog/profiling/transport/http/client.rb +0 -35
- data/lib/datadog/profiling/transport/http/response.rb +0 -23
- data/lib/datadog/profiling/transport/http.rb +0 -112
- data/lib/datadog/profiling/transport/io/client.rb +0 -29
- data/lib/datadog/profiling/transport/io/response.rb +0 -18
- data/lib/datadog/profiling/transport/io.rb +0 -32
- data/lib/datadog/profiling/transport/parcel.rb +0 -19
- data/lib/datadog/profiling/transport/request.rb +0 -17
- data/lib/datadog/profiling/transport/response.rb +0 -10
- data/lib/datadog/tracing/distributed/headers/b3.rb +0 -55
- data/lib/datadog/tracing/distributed/headers/b3_single.rb +0 -67
- data/lib/datadog/tracing/distributed/headers/datadog.rb +0 -52
- data/lib/datadog/tracing/distributed/parser.rb +0 -70
- data/lib/datadog/tracing/propagation/grpc.rb +0 -88
|
@@ -0,0 +1,354 @@
|
|
|
1
|
+
#include <ruby.h>
|
|
2
|
+
#include <ruby/thread.h>
|
|
3
|
+
#include <datadog/profiling.h>
|
|
4
|
+
#include "helpers.h"
|
|
5
|
+
#include "libdatadog_helpers.h"
|
|
6
|
+
#include "ruby_helpers.h"
|
|
7
|
+
|
|
8
|
+
// Used to report profiling data to Datadog.
|
|
9
|
+
// This file implements the native bits of the Datadog::Profiling::HttpTransport class
|
|
10
|
+
|
|
11
|
+
static VALUE ok_symbol = Qnil; // :ok in Ruby
|
|
12
|
+
static VALUE error_symbol = Qnil; // :error in Ruby
|
|
13
|
+
|
|
14
|
+
static ID agentless_id; // id of :agentless in Ruby
|
|
15
|
+
static ID agent_id; // id of :agent in Ruby
|
|
16
|
+
|
|
17
|
+
static ID log_failure_to_process_tag_id; // id of :log_failure_to_process_tag in Ruby
|
|
18
|
+
|
|
19
|
+
static VALUE http_transport_class = Qnil;
|
|
20
|
+
static VALUE library_version_string = Qnil;
|
|
21
|
+
|
|
22
|
+
struct call_exporter_without_gvl_arguments {
|
|
23
|
+
ddog_prof_Exporter *exporter;
|
|
24
|
+
ddog_prof_Exporter_Request *request;
|
|
25
|
+
ddog_CancellationToken *cancel_token;
|
|
26
|
+
ddog_prof_Exporter_SendResult result;
|
|
27
|
+
bool send_ran;
|
|
28
|
+
};
|
|
29
|
+
|
|
30
|
+
inline static ddog_ByteSlice byte_slice_from_ruby_string(VALUE string);
|
|
31
|
+
static VALUE _native_validate_exporter(VALUE self, VALUE exporter_configuration);
|
|
32
|
+
static ddog_prof_Exporter_NewResult create_exporter(VALUE exporter_configuration, VALUE tags_as_array);
|
|
33
|
+
static VALUE handle_exporter_failure(ddog_prof_Exporter_NewResult exporter_result);
|
|
34
|
+
static ddog_Endpoint endpoint_from(VALUE exporter_configuration);
|
|
35
|
+
static ddog_Vec_Tag convert_tags(VALUE tags_as_array);
|
|
36
|
+
static void safely_log_failure_to_process_tag(ddog_Vec_Tag tags, VALUE err_details);
|
|
37
|
+
static VALUE _native_do_export(
|
|
38
|
+
VALUE self,
|
|
39
|
+
VALUE exporter_configuration,
|
|
40
|
+
VALUE upload_timeout_milliseconds,
|
|
41
|
+
VALUE start_timespec_seconds,
|
|
42
|
+
VALUE start_timespec_nanoseconds,
|
|
43
|
+
VALUE finish_timespec_seconds,
|
|
44
|
+
VALUE finish_timespec_nanoseconds,
|
|
45
|
+
VALUE pprof_file_name,
|
|
46
|
+
VALUE pprof_data,
|
|
47
|
+
VALUE code_provenance_file_name,
|
|
48
|
+
VALUE code_provenance_data,
|
|
49
|
+
VALUE tags_as_array
|
|
50
|
+
);
|
|
51
|
+
static void *call_exporter_without_gvl(void *call_args);
|
|
52
|
+
static void interrupt_exporter_call(void *cancel_token);
|
|
53
|
+
static VALUE ddtrace_version(void);
|
|
54
|
+
|
|
55
|
+
void http_transport_init(VALUE profiling_module) {
|
|
56
|
+
http_transport_class = rb_define_class_under(profiling_module, "HttpTransport", rb_cObject);
|
|
57
|
+
|
|
58
|
+
rb_define_singleton_method(http_transport_class, "_native_validate_exporter", _native_validate_exporter, 1);
|
|
59
|
+
rb_define_singleton_method(http_transport_class, "_native_do_export", _native_do_export, 11);
|
|
60
|
+
|
|
61
|
+
ok_symbol = ID2SYM(rb_intern_const("ok"));
|
|
62
|
+
error_symbol = ID2SYM(rb_intern_const("error"));
|
|
63
|
+
agentless_id = rb_intern_const("agentless");
|
|
64
|
+
agent_id = rb_intern_const("agent");
|
|
65
|
+
log_failure_to_process_tag_id = rb_intern_const("log_failure_to_process_tag");
|
|
66
|
+
|
|
67
|
+
library_version_string = ddtrace_version();
|
|
68
|
+
rb_global_variable(&library_version_string);
|
|
69
|
+
}
|
|
70
|
+
|
|
71
|
+
inline static ddog_ByteSlice byte_slice_from_ruby_string(VALUE string) {
|
|
72
|
+
ENFORCE_TYPE(string, T_STRING);
|
|
73
|
+
ddog_ByteSlice byte_slice = {.ptr = (uint8_t *) StringValuePtr(string), .len = RSTRING_LEN(string)};
|
|
74
|
+
return byte_slice;
|
|
75
|
+
}
|
|
76
|
+
|
|
77
|
+
static VALUE _native_validate_exporter(DDTRACE_UNUSED VALUE _self, VALUE exporter_configuration) {
|
|
78
|
+
ENFORCE_TYPE(exporter_configuration, T_ARRAY);
|
|
79
|
+
ddog_prof_Exporter_NewResult exporter_result = create_exporter(exporter_configuration, rb_ary_new());
|
|
80
|
+
|
|
81
|
+
VALUE failure_tuple = handle_exporter_failure(exporter_result);
|
|
82
|
+
if (!NIL_P(failure_tuple)) return failure_tuple;
|
|
83
|
+
|
|
84
|
+
// We don't actually need the exporter for now -- we just wanted to validate that we could create it with the
|
|
85
|
+
// settings we were given
|
|
86
|
+
ddog_prof_Exporter_NewResult_drop(exporter_result);
|
|
87
|
+
|
|
88
|
+
return rb_ary_new_from_args(2, ok_symbol, Qnil);
|
|
89
|
+
}
|
|
90
|
+
|
|
91
|
+
static ddog_prof_Exporter_NewResult create_exporter(VALUE exporter_configuration, VALUE tags_as_array) {
|
|
92
|
+
ENFORCE_TYPE(exporter_configuration, T_ARRAY);
|
|
93
|
+
ENFORCE_TYPE(tags_as_array, T_ARRAY);
|
|
94
|
+
|
|
95
|
+
// This needs to be called BEFORE convert_tags since it can raise an exception and thus cause the ddog_Vec_Tag
|
|
96
|
+
// to be leaked.
|
|
97
|
+
ddog_Endpoint endpoint = endpoint_from(exporter_configuration);
|
|
98
|
+
|
|
99
|
+
ddog_Vec_Tag tags = convert_tags(tags_as_array);
|
|
100
|
+
|
|
101
|
+
ddog_CharSlice library_name = DDOG_CHARSLICE_C("dd-trace-rb");
|
|
102
|
+
ddog_CharSlice library_version = char_slice_from_ruby_string(library_version_string);
|
|
103
|
+
ddog_CharSlice profiling_family = DDOG_CHARSLICE_C("ruby");
|
|
104
|
+
|
|
105
|
+
ddog_prof_Exporter_NewResult exporter_result =
|
|
106
|
+
ddog_prof_Exporter_new(library_name, library_version, profiling_family, &tags, endpoint);
|
|
107
|
+
|
|
108
|
+
ddog_Vec_Tag_drop(tags);
|
|
109
|
+
|
|
110
|
+
return exporter_result;
|
|
111
|
+
}
|
|
112
|
+
|
|
113
|
+
static VALUE handle_exporter_failure(ddog_prof_Exporter_NewResult exporter_result) {
|
|
114
|
+
if (exporter_result.tag == DDOG_PROF_EXPORTER_NEW_RESULT_OK) return Qnil;
|
|
115
|
+
|
|
116
|
+
VALUE err_details = ruby_string_from_prof_vec_u8(exporter_result.err);
|
|
117
|
+
|
|
118
|
+
ddog_prof_Exporter_NewResult_drop(exporter_result);
|
|
119
|
+
|
|
120
|
+
return rb_ary_new_from_args(2, error_symbol, err_details);
|
|
121
|
+
}
|
|
122
|
+
|
|
123
|
+
static ddog_Endpoint endpoint_from(VALUE exporter_configuration) {
|
|
124
|
+
ENFORCE_TYPE(exporter_configuration, T_ARRAY);
|
|
125
|
+
|
|
126
|
+
ID working_mode = SYM2ID(rb_ary_entry(exporter_configuration, 0)); // SYM2ID verifies its input so we can do this safely
|
|
127
|
+
|
|
128
|
+
if (working_mode != agentless_id && working_mode != agent_id) {
|
|
129
|
+
rb_raise(rb_eArgError, "Failed to initialize transport: Unexpected working mode, expected :agentless or :agent");
|
|
130
|
+
}
|
|
131
|
+
|
|
132
|
+
if (working_mode == agentless_id) {
|
|
133
|
+
VALUE site = rb_ary_entry(exporter_configuration, 1);
|
|
134
|
+
VALUE api_key = rb_ary_entry(exporter_configuration, 2);
|
|
135
|
+
ENFORCE_TYPE(site, T_STRING);
|
|
136
|
+
ENFORCE_TYPE(api_key, T_STRING);
|
|
137
|
+
|
|
138
|
+
return ddog_Endpoint_agentless(char_slice_from_ruby_string(site), char_slice_from_ruby_string(api_key));
|
|
139
|
+
} else { // agent_id
|
|
140
|
+
VALUE base_url = rb_ary_entry(exporter_configuration, 1);
|
|
141
|
+
ENFORCE_TYPE(base_url, T_STRING);
|
|
142
|
+
|
|
143
|
+
return ddog_Endpoint_agent(char_slice_from_ruby_string(base_url));
|
|
144
|
+
}
|
|
145
|
+
}
|
|
146
|
+
|
|
147
|
+
__attribute__((warn_unused_result))
|
|
148
|
+
static ddog_Vec_Tag convert_tags(VALUE tags_as_array) {
|
|
149
|
+
ENFORCE_TYPE(tags_as_array, T_ARRAY);
|
|
150
|
+
|
|
151
|
+
long tags_count = RARRAY_LEN(tags_as_array);
|
|
152
|
+
ddog_Vec_Tag tags = ddog_Vec_Tag_new();
|
|
153
|
+
|
|
154
|
+
for (long i = 0; i < tags_count; i++) {
|
|
155
|
+
VALUE name_value_pair = rb_ary_entry(tags_as_array, i);
|
|
156
|
+
|
|
157
|
+
if (!RB_TYPE_P(name_value_pair, T_ARRAY)) {
|
|
158
|
+
ddog_Vec_Tag_drop(tags);
|
|
159
|
+
ENFORCE_TYPE(name_value_pair, T_ARRAY);
|
|
160
|
+
}
|
|
161
|
+
|
|
162
|
+
// Note: We can index the array without checking its size first because rb_ary_entry returns Qnil if out of bounds
|
|
163
|
+
VALUE tag_name = rb_ary_entry(name_value_pair, 0);
|
|
164
|
+
VALUE tag_value = rb_ary_entry(name_value_pair, 1);
|
|
165
|
+
|
|
166
|
+
if (!(RB_TYPE_P(tag_name, T_STRING) && RB_TYPE_P(tag_value, T_STRING))) {
|
|
167
|
+
ddog_Vec_Tag_drop(tags);
|
|
168
|
+
ENFORCE_TYPE(tag_name, T_STRING);
|
|
169
|
+
ENFORCE_TYPE(tag_value, T_STRING);
|
|
170
|
+
}
|
|
171
|
+
|
|
172
|
+
ddog_Vec_Tag_PushResult push_result =
|
|
173
|
+
ddog_Vec_Tag_push(&tags, char_slice_from_ruby_string(tag_name), char_slice_from_ruby_string(tag_value));
|
|
174
|
+
|
|
175
|
+
if (push_result.tag == DDOG_VEC_TAG_PUSH_RESULT_ERR) {
|
|
176
|
+
VALUE err_details = ruby_string_from_vec_u8(push_result.err);
|
|
177
|
+
ddog_Vec_Tag_PushResult_drop(push_result);
|
|
178
|
+
|
|
179
|
+
// libdatadog validates tags and may catch invalid tags that ddtrace didn't actually catch.
|
|
180
|
+
// We warn users about such tags, and then just ignore them.
|
|
181
|
+
safely_log_failure_to_process_tag(tags, err_details);
|
|
182
|
+
} else {
|
|
183
|
+
ddog_Vec_Tag_PushResult_drop(push_result);
|
|
184
|
+
}
|
|
185
|
+
}
|
|
186
|
+
|
|
187
|
+
return tags;
|
|
188
|
+
}
|
|
189
|
+
|
|
190
|
+
static VALUE log_failure_to_process_tag(VALUE err_details) {
|
|
191
|
+
return rb_funcall(http_transport_class, log_failure_to_process_tag_id, 1, err_details);
|
|
192
|
+
}
|
|
193
|
+
|
|
194
|
+
// Since we are calling into Ruby code, it may raise an exception. This method ensure that dynamically-allocated tags
|
|
195
|
+
// get cleaned before propagating the exception.
|
|
196
|
+
static void safely_log_failure_to_process_tag(ddog_Vec_Tag tags, VALUE err_details) {
|
|
197
|
+
int exception_state;
|
|
198
|
+
rb_protect(log_failure_to_process_tag, err_details, &exception_state);
|
|
199
|
+
|
|
200
|
+
if (exception_state) { // An exception was raised
|
|
201
|
+
ddog_Vec_Tag_drop(tags); // clean up
|
|
202
|
+
rb_jump_tag(exception_state); // "Re-raise" exception
|
|
203
|
+
}
|
|
204
|
+
}
|
|
205
|
+
|
|
206
|
+
// Note: This function handles a bunch of libdatadog dynamically-allocated objects, so it MUST not use any Ruby APIs
|
|
207
|
+
// which can raise exceptions, otherwise the objects will be leaked.
|
|
208
|
+
static VALUE perform_export(
|
|
209
|
+
ddog_prof_Exporter_NewResult valid_exporter_result, // Must be called with a valid exporter result
|
|
210
|
+
ddog_Timespec start,
|
|
211
|
+
ddog_Timespec finish,
|
|
212
|
+
ddog_prof_Exporter_Slice_File slice_files,
|
|
213
|
+
ddog_Vec_Tag *additional_tags,
|
|
214
|
+
uint64_t timeout_milliseconds
|
|
215
|
+
) {
|
|
216
|
+
ddog_prof_Exporter *exporter = valid_exporter_result.ok;
|
|
217
|
+
ddog_CancellationToken *cancel_token = ddog_CancellationToken_new();
|
|
218
|
+
ddog_prof_ProfiledEndpointsStats *endpoints_stats = NULL; // Not in use yet
|
|
219
|
+
ddog_prof_Exporter_Request *request =
|
|
220
|
+
ddog_prof_Exporter_Request_build(exporter, start, finish, slice_files, additional_tags, endpoints_stats, timeout_milliseconds);
|
|
221
|
+
|
|
222
|
+
// We'll release the Global VM Lock while we're calling send, so that the Ruby VM can continue to work while this
|
|
223
|
+
// is pending
|
|
224
|
+
struct call_exporter_without_gvl_arguments args =
|
|
225
|
+
{.exporter = exporter, .request = request, .cancel_token = cancel_token, .send_ran = false};
|
|
226
|
+
|
|
227
|
+
// We use rb_thread_call_without_gvl2 instead of rb_thread_call_without_gvl as the gvl2 variant never raises any
|
|
228
|
+
// exceptions.
|
|
229
|
+
//
|
|
230
|
+
// (With rb_thread_call_without_gvl, if someone calls Thread#kill or something like it on the current thread,
|
|
231
|
+
// the exception will be raised without us being able to clean up dynamically-allocated stuff, which would leak.)
|
|
232
|
+
//
|
|
233
|
+
// Instead, we take care of our own exception checking, and delay the exception raising (`rb_jump_tag` call) until
|
|
234
|
+
// after we cleaned up any dynamically-allocated resources.
|
|
235
|
+
//
|
|
236
|
+
// We run rb_thread_call_without_gvl2 in a loop since an "interrupt" may cause it to return before even running
|
|
237
|
+
// our code. In such a case, we retry the call -- unless the interrupt was caused by an exception being pending,
|
|
238
|
+
// and in that case we also give up and break out of the loop.
|
|
239
|
+
int pending_exception = 0;
|
|
240
|
+
|
|
241
|
+
while (!args.send_ran && !pending_exception) {
|
|
242
|
+
rb_thread_call_without_gvl2(call_exporter_without_gvl, &args, interrupt_exporter_call, cancel_token);
|
|
243
|
+
|
|
244
|
+
// To make sure we don't leak memory, we never check for pending exceptions if send ran
|
|
245
|
+
if (!args.send_ran) pending_exception = check_if_pending_exception();
|
|
246
|
+
}
|
|
247
|
+
|
|
248
|
+
// Cleanup exporter and token, no longer needed
|
|
249
|
+
ddog_CancellationToken_drop(cancel_token);
|
|
250
|
+
ddog_prof_Exporter_NewResult_drop(valid_exporter_result);
|
|
251
|
+
|
|
252
|
+
if (pending_exception) {
|
|
253
|
+
// If we got here send did not run, so we need to explicitly dispose of the request
|
|
254
|
+
ddog_prof_Exporter_Request_drop(request);
|
|
255
|
+
|
|
256
|
+
// Let Ruby propagate the exception. This will not return.
|
|
257
|
+
rb_jump_tag(pending_exception);
|
|
258
|
+
}
|
|
259
|
+
|
|
260
|
+
ddog_prof_Exporter_SendResult result = args.result;
|
|
261
|
+
bool success = result.tag == DDOG_PROF_EXPORTER_SEND_RESULT_HTTP_RESPONSE;
|
|
262
|
+
|
|
263
|
+
VALUE ruby_status = success ? ok_symbol : error_symbol;
|
|
264
|
+
VALUE ruby_result = success ? UINT2NUM(result.http_response.code) : ruby_string_from_prof_vec_u8(result.err);
|
|
265
|
+
|
|
266
|
+
ddog_prof_Exporter_SendResult_drop(args.result);
|
|
267
|
+
// The request itself does not need to be freed as libdatadog takes care of it as part of sending.
|
|
268
|
+
|
|
269
|
+
return rb_ary_new_from_args(2, ruby_status, ruby_result);
|
|
270
|
+
}
|
|
271
|
+
|
|
272
|
+
static VALUE _native_do_export(
|
|
273
|
+
DDTRACE_UNUSED VALUE _self,
|
|
274
|
+
VALUE exporter_configuration,
|
|
275
|
+
VALUE upload_timeout_milliseconds,
|
|
276
|
+
VALUE start_timespec_seconds,
|
|
277
|
+
VALUE start_timespec_nanoseconds,
|
|
278
|
+
VALUE finish_timespec_seconds,
|
|
279
|
+
VALUE finish_timespec_nanoseconds,
|
|
280
|
+
VALUE pprof_file_name,
|
|
281
|
+
VALUE pprof_data,
|
|
282
|
+
VALUE code_provenance_file_name,
|
|
283
|
+
VALUE code_provenance_data,
|
|
284
|
+
VALUE tags_as_array
|
|
285
|
+
) {
|
|
286
|
+
ENFORCE_TYPE(upload_timeout_milliseconds, T_FIXNUM);
|
|
287
|
+
ENFORCE_TYPE(start_timespec_seconds, T_FIXNUM);
|
|
288
|
+
ENFORCE_TYPE(start_timespec_nanoseconds, T_FIXNUM);
|
|
289
|
+
ENFORCE_TYPE(finish_timespec_seconds, T_FIXNUM);
|
|
290
|
+
ENFORCE_TYPE(finish_timespec_nanoseconds, T_FIXNUM);
|
|
291
|
+
ENFORCE_TYPE(pprof_file_name, T_STRING);
|
|
292
|
+
ENFORCE_TYPE(pprof_data, T_STRING);
|
|
293
|
+
ENFORCE_TYPE(code_provenance_file_name, T_STRING);
|
|
294
|
+
|
|
295
|
+
// Code provenance can be disabled and in that case will be set to nil
|
|
296
|
+
bool have_code_provenance = !NIL_P(code_provenance_data);
|
|
297
|
+
if (have_code_provenance) ENFORCE_TYPE(code_provenance_data, T_STRING);
|
|
298
|
+
|
|
299
|
+
uint64_t timeout_milliseconds = NUM2ULONG(upload_timeout_milliseconds);
|
|
300
|
+
|
|
301
|
+
ddog_Timespec start =
|
|
302
|
+
{.seconds = NUM2LONG(start_timespec_seconds), .nanoseconds = NUM2UINT(start_timespec_nanoseconds)};
|
|
303
|
+
ddog_Timespec finish =
|
|
304
|
+
{.seconds = NUM2LONG(finish_timespec_seconds), .nanoseconds = NUM2UINT(finish_timespec_nanoseconds)};
|
|
305
|
+
|
|
306
|
+
int files_to_report = 1 + (have_code_provenance ? 1 : 0);
|
|
307
|
+
ddog_prof_Exporter_File files[files_to_report];
|
|
308
|
+
ddog_prof_Exporter_Slice_File slice_files = {.ptr = files, .len = files_to_report};
|
|
309
|
+
|
|
310
|
+
files[0] = (ddog_prof_Exporter_File) {
|
|
311
|
+
.name = char_slice_from_ruby_string(pprof_file_name),
|
|
312
|
+
.file = byte_slice_from_ruby_string(pprof_data)
|
|
313
|
+
};
|
|
314
|
+
if (have_code_provenance) {
|
|
315
|
+
files[1] = (ddog_prof_Exporter_File) {
|
|
316
|
+
.name = char_slice_from_ruby_string(code_provenance_file_name),
|
|
317
|
+
.file = byte_slice_from_ruby_string(code_provenance_data)
|
|
318
|
+
};
|
|
319
|
+
}
|
|
320
|
+
|
|
321
|
+
ddog_Vec_Tag *null_additional_tags = NULL;
|
|
322
|
+
|
|
323
|
+
ddog_prof_Exporter_NewResult exporter_result = create_exporter(exporter_configuration, tags_as_array);
|
|
324
|
+
// Note: Do not add anything that can raise exceptions after this line, as otherwise the exporter memory will leak
|
|
325
|
+
|
|
326
|
+
VALUE failure_tuple = handle_exporter_failure(exporter_result);
|
|
327
|
+
if (!NIL_P(failure_tuple)) return failure_tuple;
|
|
328
|
+
|
|
329
|
+
return perform_export(exporter_result, start, finish, slice_files, null_additional_tags, timeout_milliseconds);
|
|
330
|
+
}
|
|
331
|
+
|
|
332
|
+
static void *call_exporter_without_gvl(void *call_args) {
|
|
333
|
+
struct call_exporter_without_gvl_arguments *args = (struct call_exporter_without_gvl_arguments*) call_args;
|
|
334
|
+
|
|
335
|
+
args->result = ddog_prof_Exporter_send(args->exporter, args->request, args->cancel_token);
|
|
336
|
+
args->send_ran = true;
|
|
337
|
+
|
|
338
|
+
return NULL; // Unused
|
|
339
|
+
}
|
|
340
|
+
|
|
341
|
+
// Called by Ruby when it wants to interrupt call_exporter_without_gvl above, e.g. when the app wants to exit cleanly
|
|
342
|
+
static void interrupt_exporter_call(void *cancel_token) {
|
|
343
|
+
ddog_CancellationToken_cancel((ddog_CancellationToken *) cancel_token);
|
|
344
|
+
}
|
|
345
|
+
|
|
346
|
+
static VALUE ddtrace_version(void) {
|
|
347
|
+
VALUE ddtrace_module = rb_const_get(rb_cObject, rb_intern("DDTrace"));
|
|
348
|
+
ENFORCE_TYPE(ddtrace_module, T_MODULE);
|
|
349
|
+
VALUE version_module = rb_const_get(ddtrace_module, rb_intern("VERSION"));
|
|
350
|
+
ENFORCE_TYPE(version_module, T_MODULE);
|
|
351
|
+
VALUE version_string = rb_const_get(version_module, rb_intern("STRING"));
|
|
352
|
+
ENFORCE_TYPE(version_string, T_STRING);
|
|
353
|
+
return version_string;
|
|
354
|
+
}
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
#pragma once
|
|
2
|
+
|
|
3
|
+
#include <datadog/profiling.h>
|
|
4
|
+
#include "ruby_helpers.h"
|
|
5
|
+
|
|
6
|
+
inline static ddog_CharSlice char_slice_from_ruby_string(VALUE string) {
|
|
7
|
+
ENFORCE_TYPE(string, T_STRING);
|
|
8
|
+
ddog_CharSlice char_slice = {.ptr = StringValuePtr(string), .len = RSTRING_LEN(string)};
|
|
9
|
+
return char_slice;
|
|
10
|
+
}
|
|
11
|
+
|
|
12
|
+
inline static VALUE ruby_string_from_vec_u8(ddog_Vec_U8 string) {
|
|
13
|
+
return rb_str_new((char *) string.ptr, string.len);
|
|
14
|
+
}
|
|
15
|
+
|
|
16
|
+
inline static VALUE ruby_string_from_prof_vec_u8(ddog_prof_Vec_U8 string) {
|
|
17
|
+
return rb_str_new((char *) string.ptr, string.len);
|
|
18
|
+
}
|
|
@@ -2,19 +2,75 @@
|
|
|
2
2
|
|
|
3
3
|
# typed: ignore
|
|
4
4
|
|
|
5
|
-
require '
|
|
5
|
+
require 'rubygems'
|
|
6
|
+
require 'pathname'
|
|
6
7
|
|
|
7
8
|
module Datadog
|
|
8
9
|
module Profiling
|
|
10
|
+
# Helpers for extconf.rb
|
|
9
11
|
module NativeExtensionHelpers
|
|
12
|
+
# Can be set when customers want to skip compiling the native extension entirely
|
|
10
13
|
ENV_NO_EXTENSION = 'DD_PROFILING_NO_EXTENSION'
|
|
14
|
+
# Can be set to force rubygems to fail gem installation when profiling extension could not be built
|
|
15
|
+
ENV_FAIL_INSTALL_IF_MISSING_EXTENSION = 'DD_PROFILING_FAIL_INSTALL_IF_MISSING_EXTENSION'
|
|
11
16
|
|
|
12
17
|
# Older Rubies don't have the MJIT header, used by the JIT compiler, so we need to use a different approach
|
|
13
18
|
CAN_USE_MJIT_HEADER = RUBY_VERSION >= '2.6'
|
|
14
19
|
|
|
20
|
+
LIBDATADOG_VERSION = '~> 1.0.1.1.0'
|
|
21
|
+
|
|
22
|
+
def self.fail_install_if_missing_extension?
|
|
23
|
+
ENV[ENV_FAIL_INSTALL_IF_MISSING_EXTENSION].to_s.strip.downcase == 'true'
|
|
24
|
+
end
|
|
25
|
+
|
|
26
|
+
# Used as an workaround for a limitation with how dynamic linking works in environments where ddtrace and
|
|
27
|
+
# libdatadog are moved after the extension gets compiled.
|
|
28
|
+
#
|
|
29
|
+
# Because the libddpprof native library is installed on a non-standard system path, in order for it to be
|
|
30
|
+
# found by the system dynamic linker (e.g. what takes care of dlopen(), which is used to load the profiling
|
|
31
|
+
# native extension), we need to add a "runpath" -- a list of folders to search for libdatadog.
|
|
32
|
+
#
|
|
33
|
+
# This runpath gets hardcoded at native library linking time. You can look at it using the `readelf` tool in
|
|
34
|
+
# Linux: e.g. `readelf -d ddtrace_profiling_native_extension.2.7.3_x86_64-linux.so`.
|
|
35
|
+
#
|
|
36
|
+
# In older versions of ddtrace, we only set as runpath an absolute path to libdatadog.
|
|
37
|
+
# (This gets set automatically by the call
|
|
38
|
+
# to `pkg_config('datadog_profiling_with_rpath')` in `extconf.rb`). This worked fine as long as libdatadog was **NOT**
|
|
39
|
+
# moved from the folder it was present at ddtrace installation/linking time.
|
|
40
|
+
#
|
|
41
|
+
# Unfortunately, environments such as Heroku and AWS Elastic Beanstalk move gems around in the filesystem after
|
|
42
|
+
# installation. Thus, the profiling native extension could not be loaded in these environments
|
|
43
|
+
# (see https://github.com/DataDog/dd-trace-rb/issues/2067) because libdatadog could not be found.
|
|
44
|
+
#
|
|
45
|
+
# To workaround this issue, this method computes the **relative** path between the folder where the profiling
|
|
46
|
+
# native extension is going to be installed and the folder where libdatadog is installed, and returns it
|
|
47
|
+
# to be set as an additional runpath. (Yes, you can set multiple runpath folders to be searched).
|
|
48
|
+
#
|
|
49
|
+
# This way, if both gems are moved together (and it turns out that they are in these environments),
|
|
50
|
+
# the relative path can still be traversed to find libdatadog.
|
|
51
|
+
#
|
|
52
|
+
# This is incredibly awful, and it's kinda bizarre how it's not possible to just find these paths at runtime
|
|
53
|
+
# and set them correctly; rather than needing to set stuff at linking-time and then praying to $deity that
|
|
54
|
+
# weird moves don't happen.
|
|
55
|
+
#
|
|
56
|
+
# As a curiosity, `LD_LIBRARY_PATH` can be used to influence the folders that get searched but **CANNOT BE
|
|
57
|
+
# SET DYNAMICALLY**, e.g. it needs to be set at the start of the process (Ruby VM) and thus it's not something
|
|
58
|
+
# we could setup when doing a `require`.
|
|
59
|
+
#
|
|
60
|
+
def self.libdatadog_folder_relative_to_native_lib_folder(
|
|
61
|
+
current_folder: __dir__,
|
|
62
|
+
libdatadog_pkgconfig_folder: Libdatadog.pkgconfig_folder
|
|
63
|
+
)
|
|
64
|
+
return unless libdatadog_pkgconfig_folder
|
|
65
|
+
|
|
66
|
+
profiling_native_lib_folder = "#{current_folder}/../../lib/"
|
|
67
|
+
libdatadog_lib_folder = "#{libdatadog_pkgconfig_folder}/../"
|
|
68
|
+
|
|
69
|
+
Pathname.new(libdatadog_lib_folder).relative_path_from(Pathname.new(profiling_native_lib_folder)).to_s
|
|
70
|
+
end
|
|
71
|
+
|
|
15
72
|
# Used to check if profiler is supported, including user-visible clear messages explaining why their
|
|
16
73
|
# system may not be supported.
|
|
17
|
-
# rubocop:disable Metrics/ModuleLength
|
|
18
74
|
module Supported
|
|
19
75
|
private_class_method def self.explain_issue(*reason, suggested:)
|
|
20
76
|
{ reason: reason, suggested: suggested }
|
|
@@ -32,20 +88,37 @@ module Datadog
|
|
|
32
88
|
on_macos? ||
|
|
33
89
|
on_unknown_os? ||
|
|
34
90
|
not_on_amd64_or_arm64? ||
|
|
91
|
+
on_ruby_2_1? ||
|
|
35
92
|
expected_to_use_mjit_but_mjit_is_disabled? ||
|
|
36
|
-
|
|
93
|
+
libdatadog_not_available? ||
|
|
94
|
+
libdatadog_not_usable?
|
|
37
95
|
end
|
|
38
96
|
|
|
39
97
|
# This banner will show up in the logs/terminal while compiling the native extension
|
|
40
|
-
def self.failure_banner_for(reason:, suggested:)
|
|
41
|
-
prettify_lines = proc { |lines| lines.map { |line| "| #{line.ljust(76)} |" }.join("\n") }
|
|
98
|
+
def self.failure_banner_for(reason:, suggested:, fail_install:)
|
|
99
|
+
prettify_lines = proc { |lines| Array(lines).map { |line| "| #{line.ljust(76)} |" }.join("\n") }
|
|
100
|
+
outcome =
|
|
101
|
+
if fail_install
|
|
102
|
+
[
|
|
103
|
+
'Failing installation immediately because the ',
|
|
104
|
+
"`#{ENV_FAIL_INSTALL_IF_MISSING_EXTENSION}` environment variable is set",
|
|
105
|
+
'to `true`.',
|
|
106
|
+
'When contacting support, please include the <mkmf.log> file that is shown ',
|
|
107
|
+
'below.',
|
|
108
|
+
]
|
|
109
|
+
else
|
|
110
|
+
[
|
|
111
|
+
'The Datadog Continuous Profiler will not be available,',
|
|
112
|
+
'but all other ddtrace features will work fine!',
|
|
113
|
+
]
|
|
114
|
+
end
|
|
115
|
+
|
|
42
116
|
%(
|
|
43
117
|
+------------------------------------------------------------------------------+
|
|
44
118
|
| Could not compile the Datadog Continuous Profiler because |
|
|
45
119
|
#{prettify_lines.call(reason)}
|
|
46
120
|
| |
|
|
47
|
-
|
|
48
|
-
| but all other ddtrace features will work fine! |
|
|
121
|
+
#{prettify_lines.call(outcome)}
|
|
49
122
|
| |
|
|
50
123
|
#{prettify_lines.call(suggested)}
|
|
51
124
|
+------------------------------------------------------------------------------+
|
|
@@ -57,23 +130,32 @@ module Datadog
|
|
|
57
130
|
[*reason, *suggested].join(' ')
|
|
58
131
|
end
|
|
59
132
|
|
|
133
|
+
# mkmf sets $PKGCONFIG after the `pkg_config` gets used in extconf.rb. When `pkg_config` is unsuccessful, we use
|
|
134
|
+
# this helper to decide if we can show more specific error message vs a generic "something went wrong".
|
|
135
|
+
def self.pkg_config_missing?(command: $PKGCONFIG) # rubocop:disable Style/GlobalVars
|
|
136
|
+
pkg_config_available = command && xsystem("#{command} --version")
|
|
137
|
+
|
|
138
|
+
pkg_config_available != true
|
|
139
|
+
end
|
|
140
|
+
|
|
60
141
|
CONTACT_SUPPORT = [
|
|
61
142
|
'For help solving this issue, please contact Datadog support at',
|
|
62
143
|
'<https://docs.datadoghq.com/help/>.',
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
REPORT_ISSUE = [
|
|
66
|
-
'If you needed to use this, please tell us why on',
|
|
67
|
-
'<https://github.com/DataDog/dd-trace-rb/issues/new> so we can fix it :)',
|
|
144
|
+
'You can also check out the Continuous Profiler troubleshooting page at',
|
|
145
|
+
'<https://dtdg.co/ruby-profiler-troubleshooting>.'
|
|
68
146
|
].freeze
|
|
69
147
|
|
|
70
148
|
GET_IN_TOUCH = [
|
|
71
149
|
"Get in touch with us if you're interested in profiling your app!"
|
|
72
150
|
].freeze
|
|
73
151
|
|
|
152
|
+
UPGRADE_RUBY = [
|
|
153
|
+
'Upgrade to a modern Ruby to enable profiling for your app.'
|
|
154
|
+
].freeze
|
|
155
|
+
|
|
74
156
|
# Validation for this check is done in extconf.rb because it relies on mkmf
|
|
75
|
-
|
|
76
|
-
'there was a problem in setting up the `
|
|
157
|
+
FAILED_TO_CONFIGURE_LIBDATADOG = explain_issue(
|
|
158
|
+
'there was a problem in setting up the `libdatadog` dependency.',
|
|
77
159
|
suggested: CONTACT_SUPPORT,
|
|
78
160
|
)
|
|
79
161
|
|
|
@@ -84,11 +166,35 @@ module Datadog
|
|
|
84
166
|
suggested: CONTACT_SUPPORT,
|
|
85
167
|
)
|
|
86
168
|
|
|
169
|
+
# Validation for this check is done in extconf.rb because it relies on mkmf
|
|
170
|
+
PKG_CONFIG_IS_MISSING = explain_issue(
|
|
171
|
+
#+-----------------------------------------------------------------------------+
|
|
172
|
+
'the `pkg-config` system tool is missing.',
|
|
173
|
+
'This issue can usually be fixed by installing one of the following:',
|
|
174
|
+
'the `pkg-config` package on Homebrew and Debian/Ubuntu-based Linux;',
|
|
175
|
+
'the `pkgconf` package on Arch and Alpine-based Linux;',
|
|
176
|
+
'the `pkgconf-pkg-config` package on Fedora/Red Hat-based Linux.',
|
|
177
|
+
suggested: CONTACT_SUPPORT,
|
|
178
|
+
)
|
|
179
|
+
|
|
180
|
+
# Validation for this check is done in extconf.rb because it relies on mkmf
|
|
181
|
+
COMPILER_ATOMIC_MISSING = explain_issue(
|
|
182
|
+
'your C compiler is missing support for the <stdatomic.h> header.',
|
|
183
|
+
'This issue can usually be fixed by upgrading to a later version of your',
|
|
184
|
+
'operating system image or compiler.',
|
|
185
|
+
suggested: CONTACT_SUPPORT,
|
|
186
|
+
)
|
|
187
|
+
|
|
87
188
|
private_class_method def self.disabled_via_env?
|
|
189
|
+
report_disabled = [
|
|
190
|
+
'If you needed to use this, please tell us why on',
|
|
191
|
+
'<https://github.com/DataDog/dd-trace-rb/issues/new> so we can fix it :)',
|
|
192
|
+
].freeze
|
|
193
|
+
|
|
88
194
|
disabled_via_env = explain_issue(
|
|
89
195
|
'the `DD_PROFILING_NO_EXTENSION` environment variable is/was set to',
|
|
90
196
|
'`true` during installation.',
|
|
91
|
-
suggested:
|
|
197
|
+
suggested: report_disabled,
|
|
92
198
|
)
|
|
93
199
|
|
|
94
200
|
return unless ENV[ENV_NO_EXTENSION].to_s.strip.downcase == 'true'
|
|
@@ -151,7 +257,16 @@ module Datadog
|
|
|
151
257
|
suggested: GET_IN_TOUCH,
|
|
152
258
|
)
|
|
153
259
|
|
|
154
|
-
architecture_not_supported unless RUBY_PLATFORM.start_with?('x86_64', 'aarch64')
|
|
260
|
+
architecture_not_supported unless RUBY_PLATFORM.start_with?('x86_64', 'aarch64', 'arm64')
|
|
261
|
+
end
|
|
262
|
+
|
|
263
|
+
private_class_method def self.on_ruby_2_1?
|
|
264
|
+
ruby_version_not_supported = explain_issue(
|
|
265
|
+
'the profiler only supports Ruby 2.2 or newer.',
|
|
266
|
+
suggested: UPGRADE_RUBY,
|
|
267
|
+
)
|
|
268
|
+
|
|
269
|
+
ruby_version_not_supported if RUBY_VERSION.start_with?('2.1.')
|
|
155
270
|
end
|
|
156
271
|
|
|
157
272
|
# On some Rubies, we require the mjit header to be present. If Ruby was installed without MJIT support, we also skip
|
|
@@ -167,20 +282,38 @@ module Datadog
|
|
|
167
282
|
ruby_without_mjit if CAN_USE_MJIT_HEADER && RbConfig::CONFIG['MJIT_SUPPORT'] != 'yes'
|
|
168
283
|
end
|
|
169
284
|
|
|
170
|
-
private_class_method def self.
|
|
285
|
+
private_class_method def self.libdatadog_not_available?
|
|
286
|
+
begin
|
|
287
|
+
gem 'libdatadog', LIBDATADOG_VERSION
|
|
288
|
+
require 'libdatadog'
|
|
289
|
+
nil
|
|
290
|
+
# rubocop:disable Lint/RescueException
|
|
291
|
+
rescue Exception => e
|
|
292
|
+
explain_issue(
|
|
293
|
+
'there was an exception during loading of the `libdatadog` gem:',
|
|
294
|
+
e.class.name,
|
|
295
|
+
*e.message.split("\n"),
|
|
296
|
+
*Array(e.backtrace),
|
|
297
|
+
'.',
|
|
298
|
+
suggested: CONTACT_SUPPORT,
|
|
299
|
+
)
|
|
300
|
+
end
|
|
301
|
+
# rubocop:enable Lint/RescueException
|
|
302
|
+
end
|
|
303
|
+
|
|
304
|
+
private_class_method def self.libdatadog_not_usable?
|
|
171
305
|
no_binaries_for_current_platform = explain_issue(
|
|
172
|
-
'the `
|
|
306
|
+
'the `libdatadog` gem installed on your system is missing binaries for your',
|
|
173
307
|
'platform variant.',
|
|
174
308
|
"(Your platform: `#{Gem::Platform.local}`)",
|
|
175
309
|
'(Available binaries: ',
|
|
176
|
-
"`#{
|
|
310
|
+
"`#{Libdatadog.available_binaries.join('`, `')}`)",
|
|
177
311
|
suggested: CONTACT_SUPPORT,
|
|
178
312
|
)
|
|
179
313
|
|
|
180
|
-
no_binaries_for_current_platform unless
|
|
314
|
+
no_binaries_for_current_platform unless Libdatadog.pkgconfig_folder
|
|
181
315
|
end
|
|
182
316
|
end
|
|
183
|
-
# rubocop:enable Metrics/ModuleLength
|
|
184
317
|
end
|
|
185
318
|
end
|
|
186
319
|
end
|