ddtrace 0.35.2 → 1.1.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/.editorconfig +22 -0
- data/.gitignore +16 -17
- data/CHANGELOG.md +1969 -293
- data/CONTRIBUTING.md +3 -7
- data/LICENSE-3rdparty.csv +4 -0
- data/README.md +5 -0
- data/bin/ddtracerb +15 -0
- data/ddtrace.gemspec +34 -32
- data/docs/0.x-trace.png +0 -0
- data/docs/1.0-trace.png +0 -0
- data/docs/AutoInstrumentation.md +36 -0
- data/docs/Deprecation.md +8 -0
- data/docs/DevelopmentGuide.md +73 -9
- data/docs/GettingStarted.md +989 -496
- data/docs/ProfilingDevelopment.md +110 -0
- data/docs/PublicApi.md +14 -0
- data/docs/UpgradeGuide.md +736 -0
- data/ext/ddtrace_profiling_loader/ddtrace_profiling_loader.c +118 -0
- data/ext/ddtrace_profiling_loader/extconf.rb +53 -0
- data/ext/ddtrace_profiling_native_extension/NativeExtensionDesign.md +112 -0
- data/ext/ddtrace_profiling_native_extension/clock_id.h +4 -0
- data/ext/ddtrace_profiling_native_extension/clock_id_from_pthread.c +44 -0
- data/ext/ddtrace_profiling_native_extension/clock_id_noop.c +14 -0
- data/ext/ddtrace_profiling_native_extension/collectors_stack.c +278 -0
- data/ext/ddtrace_profiling_native_extension/extconf.rb +176 -0
- data/ext/ddtrace_profiling_native_extension/libddprof_helpers.h +13 -0
- data/ext/ddtrace_profiling_native_extension/native_extension_helpers.rb +186 -0
- data/ext/ddtrace_profiling_native_extension/private_vm_api_access.c +607 -0
- data/ext/ddtrace_profiling_native_extension/private_vm_api_access.h +33 -0
- data/ext/ddtrace_profiling_native_extension/profiling.c +31 -0
- data/ext/ddtrace_profiling_native_extension/stack_recorder.c +139 -0
- data/ext/ddtrace_profiling_native_extension/stack_recorder.h +28 -0
- data/lib/datadog/appsec/assets/blocked.html +4 -0
- data/lib/datadog/appsec/assets/waf_rules/README.md +7 -0
- data/lib/datadog/appsec/assets/waf_rules/recommended.json +5638 -0
- data/lib/datadog/appsec/assets/waf_rules/risky.json +1499 -0
- data/lib/datadog/appsec/assets/waf_rules/strict.json +1298 -0
- data/lib/datadog/appsec/assets.rb +38 -0
- data/lib/datadog/appsec/autoload.rb +16 -0
- data/lib/datadog/appsec/configuration/settings.rb +194 -0
- data/lib/datadog/appsec/configuration.rb +80 -0
- data/lib/datadog/appsec/contrib/auto_instrument.rb +29 -0
- data/lib/datadog/appsec/contrib/configuration/settings.rb +20 -0
- data/lib/datadog/appsec/contrib/integration.rb +37 -0
- data/lib/datadog/appsec/contrib/patcher.rb +12 -0
- data/lib/datadog/appsec/contrib/rack/configuration/settings.rb +22 -0
- data/lib/datadog/appsec/contrib/rack/ext.rb +15 -0
- data/lib/datadog/appsec/contrib/rack/gateway/watcher.rb +169 -0
- data/lib/datadog/appsec/contrib/rack/integration.rb +49 -0
- data/lib/datadog/appsec/contrib/rack/patcher.rb +32 -0
- data/lib/datadog/appsec/contrib/rack/reactive/request.rb +87 -0
- data/lib/datadog/appsec/contrib/rack/reactive/request_body.rb +64 -0
- data/lib/datadog/appsec/contrib/rack/reactive/response.rb +64 -0
- data/lib/datadog/appsec/contrib/rack/request.rb +58 -0
- data/lib/datadog/appsec/contrib/rack/request_body_middleware.rb +41 -0
- data/lib/datadog/appsec/contrib/rack/request_middleware.rb +112 -0
- data/lib/datadog/appsec/contrib/rack/response.rb +24 -0
- data/lib/datadog/appsec/contrib/rails/configuration/settings.rb +22 -0
- data/lib/datadog/appsec/contrib/rails/ext.rb +15 -0
- data/lib/datadog/appsec/contrib/rails/framework.rb +30 -0
- data/lib/datadog/appsec/contrib/rails/gateway/watcher.rb +81 -0
- data/lib/datadog/appsec/contrib/rails/integration.rb +48 -0
- data/lib/datadog/appsec/contrib/rails/patcher.rb +158 -0
- data/lib/datadog/appsec/contrib/rails/reactive/action.rb +68 -0
- data/lib/datadog/appsec/contrib/rails/request.rb +33 -0
- data/lib/datadog/appsec/contrib/rails/request_middleware.rb +20 -0
- data/lib/datadog/appsec/contrib/sinatra/configuration/settings.rb +22 -0
- data/lib/datadog/appsec/contrib/sinatra/ext.rb +15 -0
- data/lib/datadog/appsec/contrib/sinatra/framework.rb +34 -0
- data/lib/datadog/appsec/contrib/sinatra/gateway/watcher.rb +124 -0
- data/lib/datadog/appsec/contrib/sinatra/integration.rb +48 -0
- data/lib/datadog/appsec/contrib/sinatra/patcher.rb +144 -0
- data/lib/datadog/appsec/contrib/sinatra/reactive/routed.rb +63 -0
- data/lib/datadog/appsec/contrib/sinatra/request_middleware.rb +20 -0
- data/lib/datadog/appsec/event.rb +121 -0
- data/lib/datadog/appsec/extensions.rb +118 -0
- data/lib/datadog/appsec/instrumentation/gateway.rb +44 -0
- data/lib/datadog/appsec/processor.rb +164 -0
- data/lib/datadog/appsec/rate_limiter.rb +60 -0
- data/lib/datadog/appsec/reactive/address_hash.rb +18 -0
- data/lib/datadog/appsec/reactive/engine.rb +44 -0
- data/lib/datadog/appsec/reactive/operation.rb +51 -0
- data/lib/datadog/appsec/reactive/subscriber.rb +18 -0
- data/lib/datadog/appsec.rb +23 -0
- data/lib/datadog/ci/configuration/components.rb +32 -0
- data/lib/datadog/ci/configuration/settings.rb +53 -0
- data/lib/datadog/ci/contrib/cucumber/configuration/settings.rb +33 -0
- data/lib/datadog/ci/contrib/cucumber/ext.rb +22 -0
- data/lib/datadog/ci/contrib/cucumber/formatter.rb +94 -0
- data/lib/datadog/ci/contrib/cucumber/instrumentation.rb +28 -0
- data/lib/datadog/ci/contrib/cucumber/integration.rb +49 -0
- data/lib/datadog/ci/contrib/cucumber/patcher.rb +27 -0
- data/lib/datadog/ci/contrib/rspec/configuration/settings.rb +33 -0
- data/lib/datadog/ci/contrib/rspec/example.rb +70 -0
- data/lib/datadog/ci/contrib/rspec/ext.rb +21 -0
- data/lib/datadog/ci/contrib/rspec/integration.rb +50 -0
- data/lib/datadog/ci/contrib/rspec/patcher.rb +27 -0
- data/lib/datadog/ci/ext/app_types.rb +11 -0
- data/lib/datadog/ci/ext/environment.rb +503 -0
- data/lib/datadog/ci/ext/settings.rb +12 -0
- data/lib/datadog/ci/ext/test.rb +37 -0
- data/lib/datadog/ci/extensions.rb +19 -0
- data/lib/datadog/ci/flush.rb +38 -0
- data/lib/datadog/ci/test.rb +83 -0
- data/lib/datadog/ci.rb +20 -0
- data/lib/datadog/core/buffer/cruby.rb +55 -0
- data/lib/datadog/core/buffer/random.rb +134 -0
- data/lib/datadog/core/buffer/thread_safe.rb +58 -0
- data/lib/datadog/core/chunker.rb +35 -0
- data/lib/datadog/core/configuration/agent_settings_resolver.rb +365 -0
- data/lib/datadog/core/configuration/base.rb +89 -0
- data/lib/datadog/core/configuration/components.rb +411 -0
- data/lib/datadog/core/configuration/dependency_resolver.rb +28 -0
- data/lib/datadog/core/configuration/option.rb +69 -0
- data/lib/datadog/core/configuration/option_definition.rb +126 -0
- data/lib/datadog/core/configuration/option_definition_set.rb +22 -0
- data/lib/datadog/core/configuration/option_set.rb +10 -0
- data/lib/datadog/core/configuration/options.rb +118 -0
- data/lib/datadog/core/configuration/settings.rb +618 -0
- data/lib/datadog/core/configuration.rb +286 -0
- data/lib/datadog/core/diagnostics/environment_logger.rb +283 -0
- data/lib/datadog/core/diagnostics/ext.rb +41 -0
- data/lib/datadog/core/diagnostics/health.rb +37 -0
- data/lib/datadog/core/encoding.rb +76 -0
- data/lib/datadog/core/environment/cgroup.rb +55 -0
- data/lib/datadog/core/environment/class_count.rb +21 -0
- data/lib/datadog/core/environment/container.rb +93 -0
- data/lib/datadog/core/environment/ext.rb +46 -0
- data/lib/datadog/core/environment/gc.rb +20 -0
- data/lib/datadog/core/environment/identity.rb +58 -0
- data/lib/datadog/core/environment/socket.rb +24 -0
- data/lib/datadog/core/environment/thread_count.rb +20 -0
- data/lib/datadog/core/environment/variable_helpers.rb +68 -0
- data/lib/datadog/core/environment/vm_cache.rb +47 -0
- data/lib/datadog/core/error.rb +101 -0
- data/lib/datadog/core/extensions.rb +16 -0
- data/lib/datadog/core/git/ext.rb +35 -0
- data/lib/datadog/core/logger.rb +46 -0
- data/lib/datadog/core/logging/ext.rb +11 -0
- data/lib/datadog/core/metrics/client.rb +198 -0
- data/lib/datadog/core/metrics/ext.rb +20 -0
- data/lib/datadog/core/metrics/helpers.rb +25 -0
- data/lib/datadog/core/metrics/logging.rb +44 -0
- data/lib/datadog/core/metrics/metric.rb +14 -0
- data/lib/datadog/core/metrics/options.rb +50 -0
- data/lib/datadog/core/pin.rb +75 -0
- data/lib/datadog/core/runtime/ext.rb +28 -0
- data/lib/datadog/core/runtime/metrics.rb +126 -0
- data/lib/datadog/core/utils/compression.rb +32 -0
- data/lib/datadog/core/utils/forking.rb +63 -0
- data/lib/datadog/core/utils/object_set.rb +43 -0
- data/lib/datadog/core/utils/only_once.rb +44 -0
- data/lib/datadog/core/utils/safe_dup.rb +27 -0
- data/lib/datadog/core/utils/sequence.rb +21 -0
- data/lib/datadog/core/utils/string_table.rb +49 -0
- data/lib/datadog/core/utils/time.rb +54 -0
- data/lib/datadog/core/utils.rb +115 -0
- data/lib/datadog/core/vendor/multipart-post/LICENSE +11 -0
- data/lib/datadog/core/vendor/multipart-post/multipart/post/composite_read_io.rb +120 -0
- data/lib/datadog/core/vendor/multipart-post/multipart/post/multipartable.rb +61 -0
- data/lib/datadog/core/vendor/multipart-post/multipart/post/parts.rb +139 -0
- data/lib/datadog/core/vendor/multipart-post/multipart/post/version.rb +13 -0
- data/lib/datadog/core/vendor/multipart-post/multipart/post.rb +12 -0
- data/lib/datadog/core/vendor/multipart-post/multipart.rb +16 -0
- data/lib/datadog/core/vendor/multipart-post/net/http/post/multipart.rb +36 -0
- data/lib/datadog/core/worker.rb +24 -0
- data/lib/datadog/core/workers/async.rb +182 -0
- data/lib/datadog/core/workers/interval_loop.rb +119 -0
- data/lib/datadog/core/workers/polling.rb +59 -0
- data/lib/datadog/core/workers/queue.rb +44 -0
- data/lib/datadog/core/workers/runtime_metrics.rb +62 -0
- data/lib/datadog/core.rb +80 -0
- data/lib/datadog/kit/enable_core_dumps.rb +50 -0
- data/lib/datadog/kit/identity.rb +63 -0
- data/lib/datadog/kit.rb +11 -0
- data/lib/datadog/opentracer/binary_propagator.rb +26 -0
- data/lib/datadog/opentracer/carrier.rb +9 -0
- data/lib/datadog/opentracer/distributed_headers.rb +58 -0
- data/lib/datadog/opentracer/global_tracer.rb +17 -0
- data/lib/datadog/opentracer/propagator.rb +26 -0
- data/lib/datadog/opentracer/rack_propagator.rb +72 -0
- data/lib/datadog/opentracer/scope.rb +18 -0
- data/lib/datadog/opentracer/scope_manager.rb +9 -0
- data/lib/datadog/opentracer/span.rb +101 -0
- data/lib/datadog/opentracer/span_context.rb +19 -0
- data/lib/datadog/opentracer/span_context_factory.rb +27 -0
- data/lib/datadog/opentracer/text_map_propagator.rb +87 -0
- data/lib/datadog/opentracer/thread_local_scope.rb +34 -0
- data/lib/datadog/opentracer/thread_local_scope_manager.rb +43 -0
- data/lib/datadog/opentracer/tracer.rb +212 -0
- data/lib/datadog/opentracer.rb +24 -0
- data/lib/datadog/profiling/backtrace_location.rb +34 -0
- data/lib/datadog/profiling/buffer.rb +43 -0
- data/lib/datadog/profiling/collectors/code_provenance.rb +114 -0
- data/lib/datadog/profiling/collectors/old_stack.rb +298 -0
- data/lib/datadog/profiling/collectors/stack.rb +16 -0
- data/lib/datadog/profiling/encoding/profile.rb +47 -0
- data/lib/datadog/profiling/event.rb +15 -0
- data/lib/datadog/profiling/events/stack.rb +82 -0
- data/lib/datadog/profiling/exporter.rb +25 -0
- data/lib/datadog/profiling/ext/forking.rb +99 -0
- data/lib/datadog/profiling/ext.rb +57 -0
- data/lib/datadog/profiling/flush.rb +69 -0
- data/lib/datadog/profiling/load_native_extension.rb +22 -0
- data/lib/datadog/profiling/native_extension.rb +41 -0
- data/lib/datadog/profiling/pprof/builder.rb +127 -0
- data/lib/datadog/profiling/pprof/converter.rb +104 -0
- data/lib/datadog/profiling/pprof/message_set.rb +16 -0
- data/lib/datadog/profiling/pprof/payload.rb +20 -0
- data/lib/datadog/profiling/pprof/pprof.proto +212 -0
- data/lib/datadog/profiling/pprof/pprof_pb.rb +83 -0
- data/lib/datadog/profiling/pprof/stack_sample.rb +141 -0
- data/lib/datadog/profiling/pprof/string_table.rb +12 -0
- data/lib/datadog/profiling/pprof/template.rb +120 -0
- data/lib/datadog/profiling/preload.rb +5 -0
- data/lib/datadog/profiling/profiler.rb +34 -0
- data/lib/datadog/profiling/recorder.rb +117 -0
- data/lib/datadog/profiling/scheduler.rb +151 -0
- data/lib/datadog/profiling/stack_recorder.rb +33 -0
- data/lib/datadog/profiling/tag_builder.rb +48 -0
- data/lib/datadog/profiling/tasks/exec.rb +50 -0
- data/lib/datadog/profiling/tasks/help.rb +18 -0
- data/lib/datadog/profiling/tasks/setup.rb +93 -0
- data/lib/datadog/profiling/trace_identifiers/ddtrace.rb +45 -0
- data/lib/datadog/profiling/trace_identifiers/helper.rb +47 -0
- data/lib/datadog/profiling/transport/client.rb +16 -0
- data/lib/datadog/profiling/transport/http/api/endpoint.rb +107 -0
- data/lib/datadog/profiling/transport/http/api/instance.rb +38 -0
- data/lib/datadog/profiling/transport/http/api/spec.rb +42 -0
- data/lib/datadog/profiling/transport/http/api.rb +45 -0
- data/lib/datadog/profiling/transport/http/builder.rb +30 -0
- data/lib/datadog/profiling/transport/http/client.rb +35 -0
- data/lib/datadog/profiling/transport/http/response.rb +23 -0
- data/lib/datadog/profiling/transport/http.rb +112 -0
- data/lib/datadog/profiling/transport/io/client.rb +29 -0
- data/lib/datadog/profiling/transport/io/response.rb +18 -0
- data/lib/datadog/profiling/transport/io.rb +32 -0
- data/lib/datadog/profiling/transport/parcel.rb +19 -0
- data/lib/datadog/profiling/transport/request.rb +17 -0
- data/lib/datadog/profiling/transport/response.rb +10 -0
- data/lib/datadog/profiling.rb +170 -0
- data/lib/datadog/tracing/analytics.rb +25 -0
- data/lib/datadog/tracing/buffer.rb +132 -0
- data/lib/datadog/tracing/configuration/ext.rb +51 -0
- data/lib/datadog/tracing/context.rb +68 -0
- data/lib/datadog/tracing/context_provider.rb +66 -0
- data/lib/datadog/tracing/contrib/action_cable/configuration/settings.rb +35 -0
- data/lib/datadog/tracing/contrib/action_cable/event.rb +72 -0
- data/lib/datadog/tracing/contrib/action_cable/events/broadcast.rb +58 -0
- data/lib/datadog/tracing/contrib/action_cable/events/perform_action.rb +63 -0
- data/lib/datadog/tracing/contrib/action_cable/events/transmit.rb +59 -0
- data/lib/datadog/tracing/contrib/action_cable/events.rb +37 -0
- data/lib/datadog/tracing/contrib/action_cable/ext.rb +32 -0
- data/lib/datadog/tracing/contrib/action_cable/instrumentation.rb +91 -0
- data/lib/datadog/tracing/contrib/action_cable/integration.rb +50 -0
- data/lib/datadog/tracing/contrib/action_cable/patcher.rb +31 -0
- data/lib/datadog/tracing/contrib/action_mailer/configuration/settings.rb +36 -0
- data/lib/datadog/tracing/contrib/action_mailer/event.rb +52 -0
- data/lib/datadog/tracing/contrib/action_mailer/events/deliver.rb +60 -0
- data/lib/datadog/tracing/contrib/action_mailer/events/process.rb +47 -0
- data/lib/datadog/tracing/contrib/action_mailer/events.rb +34 -0
- data/lib/datadog/tracing/contrib/action_mailer/ext.rb +33 -0
- data/lib/datadog/tracing/contrib/action_mailer/integration.rb +50 -0
- data/lib/datadog/tracing/contrib/action_mailer/patcher.rb +29 -0
- data/lib/datadog/tracing/contrib/action_pack/action_controller/instrumentation.rb +156 -0
- data/lib/datadog/tracing/contrib/action_pack/action_controller/patcher.rb +29 -0
- data/lib/datadog/tracing/contrib/action_pack/configuration/settings.rb +36 -0
- data/lib/datadog/tracing/contrib/action_pack/ext.rb +22 -0
- data/lib/datadog/tracing/contrib/action_pack/integration.rb +50 -0
- data/lib/datadog/tracing/contrib/action_pack/patcher.rb +27 -0
- data/lib/datadog/tracing/contrib/action_pack/utils.rb +40 -0
- data/lib/datadog/tracing/contrib/action_view/configuration/settings.rb +36 -0
- data/lib/datadog/tracing/contrib/action_view/event.rb +35 -0
- data/lib/datadog/tracing/contrib/action_view/events/render_partial.rb +54 -0
- data/lib/datadog/tracing/contrib/action_view/events/render_template.rb +57 -0
- data/lib/datadog/tracing/contrib/action_view/events.rb +34 -0
- data/lib/datadog/tracing/contrib/action_view/ext.rb +24 -0
- data/lib/datadog/tracing/contrib/action_view/instrumentation/partial_renderer.rb +78 -0
- data/lib/datadog/tracing/contrib/action_view/instrumentation/template_renderer.rb +91 -0
- data/lib/datadog/tracing/contrib/action_view/integration.rb +57 -0
- data/lib/datadog/tracing/contrib/action_view/patcher.rb +47 -0
- data/lib/datadog/tracing/contrib/action_view/utils.rb +36 -0
- data/lib/datadog/tracing/contrib/active_job/configuration/settings.rb +37 -0
- data/lib/datadog/tracing/contrib/active_job/event.rb +58 -0
- data/lib/datadog/tracing/contrib/active_job/events/discard.rb +50 -0
- data/lib/datadog/tracing/contrib/active_job/events/enqueue.rb +49 -0
- data/lib/datadog/tracing/contrib/active_job/events/enqueue_at.rb +49 -0
- data/lib/datadog/tracing/contrib/active_job/events/enqueue_retry.rb +51 -0
- data/lib/datadog/tracing/contrib/active_job/events/perform.rb +49 -0
- data/lib/datadog/tracing/contrib/active_job/events/retry_stopped.rb +50 -0
- data/lib/datadog/tracing/contrib/active_job/events.rb +42 -0
- data/lib/datadog/tracing/contrib/active_job/ext.rb +39 -0
- data/lib/datadog/tracing/contrib/active_job/integration.rb +50 -0
- data/lib/datadog/tracing/contrib/active_job/log_injection.rb +26 -0
- data/lib/datadog/tracing/contrib/active_job/patcher.rb +36 -0
- data/lib/datadog/tracing/contrib/active_model_serializers/configuration/settings.rb +33 -0
- data/lib/datadog/tracing/contrib/active_model_serializers/event.rb +69 -0
- data/lib/datadog/tracing/contrib/active_model_serializers/events/render.rb +45 -0
- data/lib/datadog/tracing/contrib/active_model_serializers/events/serialize.rb +47 -0
- data/lib/datadog/tracing/contrib/active_model_serializers/events.rb +34 -0
- data/lib/datadog/tracing/contrib/active_model_serializers/ext.rb +24 -0
- data/lib/datadog/tracing/contrib/active_model_serializers/integration.rb +45 -0
- data/lib/datadog/tracing/contrib/active_model_serializers/patcher.rb +33 -0
- data/lib/datadog/tracing/contrib/active_record/configuration/makara_resolver.rb +36 -0
- data/lib/datadog/tracing/contrib/active_record/configuration/resolver.rb +138 -0
- data/lib/datadog/tracing/contrib/active_record/configuration/settings.rb +39 -0
- data/lib/datadog/tracing/contrib/active_record/event.rb +30 -0
- data/lib/datadog/tracing/contrib/active_record/events/instantiation.rb +58 -0
- data/lib/datadog/tracing/contrib/active_record/events/sql.rb +78 -0
- data/lib/datadog/tracing/contrib/active_record/events.rb +34 -0
- data/lib/datadog/tracing/contrib/active_record/ext.rb +29 -0
- data/lib/datadog/tracing/contrib/active_record/integration.rb +56 -0
- data/lib/datadog/tracing/contrib/active_record/patcher.rb +27 -0
- data/lib/datadog/tracing/contrib/active_record/utils.rb +128 -0
- data/lib/datadog/tracing/contrib/active_record/vendor/MIT-LICENSE +20 -0
- data/lib/datadog/tracing/contrib/active_record/vendor/connection_specification.rb +307 -0
- data/lib/datadog/tracing/contrib/active_support/cache/instrumentation.rb +270 -0
- data/lib/datadog/tracing/contrib/active_support/cache/patcher.rb +73 -0
- data/lib/datadog/tracing/contrib/active_support/cache/redis.rb +47 -0
- data/lib/datadog/tracing/contrib/active_support/configuration/settings.rb +35 -0
- data/lib/datadog/tracing/contrib/active_support/ext.rb +31 -0
- data/lib/datadog/tracing/contrib/active_support/integration.rb +51 -0
- data/lib/datadog/tracing/contrib/active_support/notifications/event.rb +71 -0
- data/lib/datadog/tracing/contrib/active_support/notifications/subscriber.rb +71 -0
- data/lib/datadog/tracing/contrib/active_support/notifications/subscription.rb +164 -0
- data/lib/datadog/tracing/contrib/active_support/patcher.rb +27 -0
- data/lib/datadog/tracing/contrib/analytics.rb +29 -0
- data/lib/datadog/tracing/contrib/auto_instrument.rb +53 -0
- data/lib/datadog/tracing/contrib/aws/configuration/settings.rb +35 -0
- data/lib/datadog/tracing/contrib/aws/ext.rb +27 -0
- data/lib/datadog/tracing/contrib/aws/instrumentation.rb +95 -0
- data/lib/datadog/tracing/contrib/aws/integration.rb +47 -0
- data/lib/datadog/tracing/contrib/aws/parsed_context.rb +60 -0
- data/lib/datadog/tracing/contrib/aws/patcher.rb +57 -0
- data/lib/datadog/tracing/contrib/aws/services.rb +123 -0
- data/lib/datadog/tracing/contrib/concurrent_ruby/configuration/settings.rb +23 -0
- data/lib/datadog/tracing/contrib/concurrent_ruby/context_composite_executor_service.rb +53 -0
- data/lib/datadog/tracing/contrib/concurrent_ruby/ext.rb +16 -0
- data/lib/datadog/tracing/contrib/concurrent_ruby/future_patch.rb +27 -0
- data/lib/datadog/tracing/contrib/concurrent_ruby/integration.rb +43 -0
- data/lib/datadog/tracing/contrib/concurrent_ruby/patcher.rb +33 -0
- data/lib/datadog/tracing/contrib/configurable.rb +102 -0
- data/lib/datadog/tracing/contrib/configuration/resolver.rb +85 -0
- data/lib/datadog/tracing/contrib/configuration/resolvers/pattern_resolver.rb +43 -0
- data/lib/datadog/tracing/contrib/configuration/settings.rb +43 -0
- data/lib/datadog/tracing/contrib/dalli/configuration/settings.rb +35 -0
- data/lib/datadog/tracing/contrib/dalli/ext.rb +24 -0
- data/lib/datadog/tracing/contrib/dalli/instrumentation.rb +58 -0
- data/lib/datadog/tracing/contrib/dalli/integration.rb +52 -0
- data/lib/datadog/tracing/contrib/dalli/patcher.rb +28 -0
- data/lib/datadog/tracing/contrib/dalli/quantize.rb +26 -0
- data/lib/datadog/tracing/contrib/delayed_job/configuration/settings.rb +38 -0
- data/lib/datadog/tracing/contrib/delayed_job/ext.rb +26 -0
- data/lib/datadog/tracing/contrib/delayed_job/integration.rb +43 -0
- data/lib/datadog/tracing/contrib/delayed_job/patcher.rb +31 -0
- data/lib/datadog/tracing/contrib/delayed_job/plugin.rb +101 -0
- data/lib/datadog/tracing/contrib/elasticsearch/configuration/settings.rb +36 -0
- data/lib/datadog/tracing/contrib/elasticsearch/ext.rb +26 -0
- data/lib/datadog/tracing/contrib/elasticsearch/integration.rb +50 -0
- data/lib/datadog/tracing/contrib/elasticsearch/patcher.rb +151 -0
- data/lib/datadog/tracing/contrib/elasticsearch/quantize.rb +89 -0
- data/lib/datadog/tracing/contrib/ethon/configuration/settings.rb +37 -0
- data/lib/datadog/tracing/contrib/ethon/easy_patch.rb +177 -0
- data/lib/datadog/tracing/contrib/ethon/ext.rb +24 -0
- data/lib/datadog/tracing/contrib/ethon/integration.rb +48 -0
- data/lib/datadog/tracing/contrib/ethon/multi_patch.rb +96 -0
- data/lib/datadog/tracing/contrib/ethon/patcher.rb +31 -0
- data/lib/datadog/tracing/contrib/excon/configuration/settings.rb +38 -0
- data/lib/datadog/tracing/contrib/excon/ext.rb +21 -0
- data/lib/datadog/tracing/contrib/excon/integration.rb +48 -0
- data/lib/datadog/tracing/contrib/excon/middleware.rb +170 -0
- data/lib/datadog/tracing/contrib/excon/patcher.rb +31 -0
- data/lib/datadog/tracing/contrib/extensions.rb +197 -0
- data/lib/datadog/tracing/contrib/faraday/configuration/settings.rb +42 -0
- data/lib/datadog/tracing/contrib/faraday/connection.rb +22 -0
- data/lib/datadog/tracing/contrib/faraday/ext.rb +21 -0
- data/lib/datadog/tracing/contrib/faraday/integration.rb +48 -0
- data/lib/datadog/tracing/contrib/faraday/middleware.rb +93 -0
- data/lib/datadog/tracing/contrib/faraday/patcher.rb +56 -0
- data/lib/datadog/tracing/contrib/faraday/rack_builder.rb +22 -0
- data/lib/datadog/tracing/contrib/grape/configuration/settings.rb +42 -0
- data/lib/datadog/tracing/contrib/grape/endpoint.rb +253 -0
- data/lib/datadog/tracing/contrib/grape/ext.rb +28 -0
- data/lib/datadog/tracing/contrib/grape/instrumentation.rb +37 -0
- data/lib/datadog/tracing/contrib/grape/integration.rb +44 -0
- data/lib/datadog/tracing/contrib/grape/patcher.rb +33 -0
- data/lib/datadog/tracing/contrib/graphql/configuration/settings.rb +36 -0
- data/lib/datadog/tracing/contrib/graphql/ext.rb +19 -0
- data/lib/datadog/tracing/contrib/graphql/integration.rb +44 -0
- data/lib/datadog/tracing/contrib/graphql/patcher.rb +91 -0
- data/lib/datadog/tracing/contrib/grpc/configuration/settings.rb +37 -0
- data/lib/datadog/tracing/contrib/grpc/datadog_interceptor/client.rb +84 -0
- data/lib/datadog/tracing/contrib/grpc/datadog_interceptor/server.rb +90 -0
- data/lib/datadog/tracing/contrib/grpc/datadog_interceptor.rb +104 -0
- data/lib/datadog/tracing/contrib/grpc/ext.rb +23 -0
- data/lib/datadog/tracing/contrib/grpc/integration.rb +43 -0
- data/lib/datadog/tracing/contrib/grpc/intercept_with_datadog.rb +53 -0
- data/lib/datadog/tracing/contrib/grpc/patcher.rb +37 -0
- data/lib/datadog/tracing/contrib/http/circuit_breaker.rb +44 -0
- data/lib/datadog/tracing/contrib/http/configuration/settings.rb +37 -0
- data/lib/datadog/tracing/contrib/http/ext.rb +21 -0
- data/lib/datadog/tracing/contrib/http/instrumentation.rb +139 -0
- data/lib/datadog/tracing/contrib/http/integration.rb +49 -0
- data/lib/datadog/tracing/contrib/http/patcher.rb +30 -0
- data/lib/datadog/tracing/contrib/http_annotation_helper.rb +17 -0
- data/lib/datadog/tracing/contrib/httpclient/configuration/settings.rb +37 -0
- data/lib/datadog/tracing/contrib/httpclient/ext.rb +21 -0
- data/lib/datadog/tracing/contrib/httpclient/instrumentation.rb +117 -0
- data/lib/datadog/tracing/contrib/httpclient/integration.rb +48 -0
- data/lib/datadog/tracing/contrib/httpclient/patcher.rb +42 -0
- data/lib/datadog/tracing/contrib/httprb/configuration/settings.rb +37 -0
- data/lib/datadog/tracing/contrib/httprb/ext.rb +21 -0
- data/lib/datadog/tracing/contrib/httprb/instrumentation.rb +128 -0
- data/lib/datadog/tracing/contrib/httprb/integration.rb +48 -0
- data/lib/datadog/tracing/contrib/httprb/patcher.rb +42 -0
- data/lib/datadog/tracing/contrib/integration.rb +78 -0
- data/lib/datadog/tracing/contrib/kafka/configuration/settings.rb +35 -0
- data/lib/datadog/tracing/contrib/kafka/consumer_event.rb +18 -0
- data/lib/datadog/tracing/contrib/kafka/consumer_group_event.rb +18 -0
- data/lib/datadog/tracing/contrib/kafka/event.rb +52 -0
- data/lib/datadog/tracing/contrib/kafka/events/connection/request.rb +42 -0
- data/lib/datadog/tracing/contrib/kafka/events/consumer/process_batch.rb +49 -0
- data/lib/datadog/tracing/contrib/kafka/events/consumer/process_message.rb +47 -0
- data/lib/datadog/tracing/contrib/kafka/events/consumer_group/heartbeat.rb +47 -0
- data/lib/datadog/tracing/contrib/kafka/events/consumer_group/join_group.rb +37 -0
- data/lib/datadog/tracing/contrib/kafka/events/consumer_group/leave_group.rb +37 -0
- data/lib/datadog/tracing/contrib/kafka/events/consumer_group/sync_group.rb +37 -0
- data/lib/datadog/tracing/contrib/kafka/events/produce_operation/send_messages.rb +40 -0
- data/lib/datadog/tracing/contrib/kafka/events/producer/deliver_messages.rb +43 -0
- data/lib/datadog/tracing/contrib/kafka/events.rb +48 -0
- data/lib/datadog/tracing/contrib/kafka/ext.rb +52 -0
- data/lib/datadog/tracing/contrib/kafka/integration.rb +44 -0
- data/lib/datadog/tracing/contrib/kafka/patcher.rb +29 -0
- data/lib/datadog/tracing/contrib/lograge/configuration/settings.rb +23 -0
- data/lib/datadog/tracing/contrib/lograge/ext.rb +15 -0
- data/lib/datadog/tracing/contrib/lograge/instrumentation.rb +47 -0
- data/lib/datadog/tracing/contrib/lograge/integration.rb +50 -0
- data/lib/datadog/tracing/contrib/lograge/patcher.rb +29 -0
- data/lib/datadog/tracing/contrib/mongodb/configuration/settings.rb +38 -0
- data/lib/datadog/tracing/contrib/mongodb/ext.rb +27 -0
- data/lib/datadog/tracing/contrib/mongodb/instrumentation.rb +47 -0
- data/lib/datadog/tracing/contrib/mongodb/integration.rb +48 -0
- data/lib/datadog/tracing/contrib/mongodb/parsers.rb +49 -0
- data/lib/datadog/tracing/contrib/mongodb/patcher.rb +34 -0
- data/lib/datadog/tracing/contrib/mongodb/subscribers.rb +121 -0
- data/lib/datadog/tracing/contrib/mysql2/configuration/settings.rb +35 -0
- data/lib/datadog/tracing/contrib/mysql2/ext.rb +22 -0
- data/lib/datadog/tracing/contrib/mysql2/instrumentation.rb +62 -0
- data/lib/datadog/tracing/contrib/mysql2/integration.rb +43 -0
- data/lib/datadog/tracing/contrib/mysql2/patcher.rb +31 -0
- data/lib/datadog/tracing/contrib/patchable.rb +109 -0
- data/lib/datadog/tracing/contrib/patcher.rb +74 -0
- data/lib/datadog/tracing/contrib/presto/configuration/settings.rb +35 -0
- data/lib/datadog/tracing/contrib/presto/ext.rb +32 -0
- data/lib/datadog/tracing/contrib/presto/instrumentation.rb +125 -0
- data/lib/datadog/tracing/contrib/presto/integration.rb +43 -0
- data/lib/datadog/tracing/contrib/presto/patcher.rb +37 -0
- data/lib/datadog/tracing/contrib/qless/configuration/settings.rb +40 -0
- data/lib/datadog/tracing/contrib/qless/ext.rb +26 -0
- data/lib/datadog/tracing/contrib/qless/integration.rb +43 -0
- data/lib/datadog/tracing/contrib/qless/patcher.rb +38 -0
- data/lib/datadog/tracing/contrib/qless/qless_job.rb +75 -0
- data/lib/datadog/tracing/contrib/qless/tracer_cleaner.rb +32 -0
- data/lib/datadog/tracing/contrib/que/configuration/settings.rb +49 -0
- data/lib/datadog/tracing/contrib/que/ext.rb +34 -0
- data/lib/datadog/tracing/contrib/que/integration.rb +46 -0
- data/lib/datadog/tracing/contrib/que/patcher.rb +28 -0
- data/lib/datadog/tracing/contrib/que/tracer.rb +61 -0
- data/lib/datadog/tracing/contrib/racecar/configuration/settings.rb +35 -0
- data/lib/datadog/tracing/contrib/racecar/event.rb +79 -0
- data/lib/datadog/tracing/contrib/racecar/events/batch.rb +35 -0
- data/lib/datadog/tracing/contrib/racecar/events/consume.rb +35 -0
- data/lib/datadog/tracing/contrib/racecar/events/message.rb +35 -0
- data/lib/datadog/tracing/contrib/racecar/events.rb +36 -0
- data/lib/datadog/tracing/contrib/racecar/ext.rb +31 -0
- data/lib/datadog/tracing/contrib/racecar/integration.rb +44 -0
- data/lib/datadog/tracing/contrib/racecar/patcher.rb +29 -0
- data/lib/datadog/tracing/contrib/rack/configuration/settings.rb +51 -0
- data/lib/datadog/tracing/contrib/rack/ext.rb +25 -0
- data/lib/datadog/tracing/contrib/rack/integration.rb +50 -0
- data/lib/datadog/tracing/contrib/rack/middlewares.rb +255 -0
- data/lib/datadog/tracing/contrib/rack/patcher.rb +109 -0
- data/lib/datadog/tracing/contrib/rack/request_queue.rb +48 -0
- data/lib/datadog/tracing/contrib/rails/auto_instrument_railtie.rb +12 -0
- data/lib/datadog/tracing/contrib/rails/configuration/settings.rb +71 -0
- data/lib/datadog/tracing/contrib/rails/ext.rb +19 -0
- data/lib/datadog/tracing/contrib/rails/framework.rb +152 -0
- data/lib/datadog/tracing/contrib/rails/integration.rb +49 -0
- data/lib/datadog/tracing/contrib/rails/log_injection.rb +34 -0
- data/lib/datadog/tracing/contrib/rails/middlewares.rb +47 -0
- data/lib/datadog/tracing/contrib/rails/patcher.rb +121 -0
- data/lib/datadog/tracing/contrib/rails/railtie.rb +19 -0
- data/lib/datadog/tracing/contrib/rails/utils.rb +28 -0
- data/lib/datadog/tracing/contrib/rake/configuration/settings.rb +36 -0
- data/lib/datadog/tracing/contrib/rake/ext.rb +26 -0
- data/lib/datadog/tracing/contrib/rake/instrumentation.rb +98 -0
- data/lib/datadog/tracing/contrib/rake/integration.rb +43 -0
- data/lib/datadog/tracing/contrib/rake/patcher.rb +34 -0
- data/lib/datadog/tracing/contrib/redis/configuration/resolver.rb +49 -0
- data/lib/datadog/tracing/contrib/redis/configuration/settings.rb +40 -0
- data/lib/datadog/tracing/contrib/redis/ext.rb +26 -0
- data/lib/datadog/tracing/contrib/redis/instrumentation.rb +78 -0
- data/lib/datadog/tracing/contrib/redis/integration.rb +47 -0
- data/lib/datadog/tracing/contrib/redis/patcher.rb +35 -0
- data/lib/datadog/tracing/contrib/redis/quantize.rb +79 -0
- data/lib/datadog/tracing/contrib/redis/tags.rb +54 -0
- data/lib/datadog/tracing/contrib/redis/vendor/LICENSE +20 -0
- data/lib/datadog/tracing/contrib/redis/vendor/resolver.rb +162 -0
- data/lib/datadog/tracing/contrib/registerable.rb +50 -0
- data/lib/datadog/tracing/contrib/registry.rb +52 -0
- data/lib/datadog/tracing/contrib/resque/configuration/settings.rb +37 -0
- data/lib/datadog/tracing/contrib/resque/ext.rb +21 -0
- data/lib/datadog/tracing/contrib/resque/integration.rb +48 -0
- data/lib/datadog/tracing/contrib/resque/patcher.rb +29 -0
- data/lib/datadog/tracing/contrib/resque/resque_job.rb +103 -0
- data/lib/datadog/tracing/contrib/rest_client/configuration/settings.rb +36 -0
- data/lib/datadog/tracing/contrib/rest_client/ext.rb +21 -0
- data/lib/datadog/tracing/contrib/rest_client/integration.rb +43 -0
- data/lib/datadog/tracing/contrib/rest_client/patcher.rb +29 -0
- data/lib/datadog/tracing/contrib/rest_client/request_patch.rb +105 -0
- data/lib/datadog/tracing/contrib/semantic_logger/configuration/settings.rb +23 -0
- data/lib/datadog/tracing/contrib/semantic_logger/ext.rb +15 -0
- data/lib/datadog/tracing/contrib/semantic_logger/instrumentation.rb +51 -0
- data/lib/datadog/tracing/contrib/semantic_logger/integration.rb +52 -0
- data/lib/datadog/tracing/contrib/semantic_logger/patcher.rb +29 -0
- data/lib/datadog/tracing/contrib/sequel/configuration/settings.rb +33 -0
- data/lib/datadog/tracing/contrib/sequel/database.rb +60 -0
- data/lib/datadog/tracing/contrib/sequel/dataset.rb +65 -0
- data/lib/datadog/tracing/contrib/sequel/ext.rb +22 -0
- data/lib/datadog/tracing/contrib/sequel/integration.rb +43 -0
- data/lib/datadog/tracing/contrib/sequel/patcher.rb +37 -0
- data/lib/datadog/tracing/contrib/sequel/utils.rb +87 -0
- data/lib/datadog/tracing/contrib/shoryuken/configuration/settings.rb +38 -0
- data/lib/datadog/tracing/contrib/shoryuken/ext.rb +25 -0
- data/lib/datadog/tracing/contrib/shoryuken/integration.rb +44 -0
- data/lib/datadog/tracing/contrib/shoryuken/patcher.rb +28 -0
- data/lib/datadog/tracing/contrib/shoryuken/tracer.rb +61 -0
- data/lib/datadog/tracing/contrib/sidekiq/client_tracer.rb +53 -0
- data/lib/datadog/tracing/contrib/sidekiq/configuration/settings.rb +44 -0
- data/lib/datadog/tracing/contrib/sidekiq/ext.rb +38 -0
- data/lib/datadog/tracing/contrib/sidekiq/integration.rb +53 -0
- data/lib/datadog/tracing/contrib/sidekiq/patcher.rb +71 -0
- data/lib/datadog/tracing/contrib/sidekiq/server_internal_tracer/heartbeat.rb +34 -0
- data/lib/datadog/tracing/contrib/sidekiq/server_internal_tracer/job_fetch.rb +34 -0
- data/lib/datadog/tracing/contrib/sidekiq/server_internal_tracer/scheduled_push.rb +33 -0
- data/lib/datadog/tracing/contrib/sidekiq/server_tracer.rb +98 -0
- data/lib/datadog/tracing/contrib/sidekiq/tracing.rb +44 -0
- data/lib/datadog/tracing/contrib/sinatra/configuration/settings.rb +43 -0
- data/lib/datadog/tracing/contrib/sinatra/env.rb +66 -0
- data/lib/datadog/tracing/contrib/sinatra/ext.rb +32 -0
- data/lib/datadog/tracing/contrib/sinatra/framework.rb +118 -0
- data/lib/datadog/tracing/contrib/sinatra/headers.rb +35 -0
- data/lib/datadog/tracing/contrib/sinatra/integration.rb +43 -0
- data/lib/datadog/tracing/contrib/sinatra/patcher.rb +76 -0
- data/lib/datadog/tracing/contrib/sinatra/tracer.rb +159 -0
- data/lib/datadog/tracing/contrib/sinatra/tracer_middleware.rb +123 -0
- data/lib/datadog/tracing/contrib/sneakers/configuration/settings.rb +38 -0
- data/lib/datadog/tracing/contrib/sneakers/ext.rb +26 -0
- data/lib/datadog/tracing/contrib/sneakers/integration.rb +46 -0
- data/lib/datadog/tracing/contrib/sneakers/patcher.rb +29 -0
- data/lib/datadog/tracing/contrib/sneakers/tracer.rb +58 -0
- data/lib/datadog/tracing/contrib/status_code_matcher.rb +75 -0
- data/lib/datadog/tracing/contrib/sucker_punch/configuration/settings.rb +35 -0
- data/lib/datadog/tracing/contrib/sucker_punch/exception_handler.rb +28 -0
- data/lib/datadog/tracing/contrib/sucker_punch/ext.rb +27 -0
- data/lib/datadog/tracing/contrib/sucker_punch/instrumentation.rb +105 -0
- data/lib/datadog/tracing/contrib/sucker_punch/integration.rb +43 -0
- data/lib/datadog/tracing/contrib/sucker_punch/patcher.rb +37 -0
- data/lib/datadog/tracing/contrib/utils/database.rb +31 -0
- data/lib/datadog/tracing/contrib/utils/quantization/hash.rb +111 -0
- data/lib/datadog/tracing/contrib/utils/quantization/http.rb +99 -0
- data/lib/datadog/tracing/contrib.rb +76 -0
- data/lib/datadog/tracing/correlation.rb +100 -0
- data/lib/datadog/tracing/distributed/headers/b3.rb +55 -0
- data/lib/datadog/tracing/distributed/headers/b3_single.rb +67 -0
- data/lib/datadog/tracing/distributed/headers/datadog.rb +52 -0
- data/lib/datadog/tracing/distributed/headers/ext.rb +31 -0
- data/lib/datadog/tracing/distributed/helpers.rb +44 -0
- data/lib/datadog/tracing/distributed/parser.rb +70 -0
- data/lib/datadog/tracing/event.rb +78 -0
- data/lib/datadog/tracing/flush.rb +74 -0
- data/lib/datadog/tracing/metadata/analytics.rb +26 -0
- data/lib/datadog/tracing/metadata/errors.rb +24 -0
- data/lib/datadog/tracing/metadata/ext.rb +151 -0
- data/lib/datadog/tracing/metadata/tagging.rb +110 -0
- data/lib/datadog/tracing/metadata.rb +20 -0
- data/lib/datadog/tracing/pipeline/span_filter.rb +42 -0
- data/lib/datadog/tracing/pipeline/span_processor.rb +39 -0
- data/lib/datadog/tracing/pipeline.rb +65 -0
- data/lib/datadog/tracing/propagation/grpc.rb +88 -0
- data/lib/datadog/tracing/propagation/http.rb +109 -0
- data/lib/datadog/tracing/runtime/metrics.rb +19 -0
- data/lib/datadog/tracing/sampling/all_sampler.rb +25 -0
- data/lib/datadog/tracing/sampling/ext.rb +27 -0
- data/lib/datadog/tracing/sampling/matcher.rb +68 -0
- data/lib/datadog/tracing/sampling/priority_sampler.rb +112 -0
- data/lib/datadog/tracing/sampling/rate_by_key_sampler.rb +97 -0
- data/lib/datadog/tracing/sampling/rate_by_service_sampler.rb +41 -0
- data/lib/datadog/tracing/sampling/rate_limiter.rb +185 -0
- data/lib/datadog/tracing/sampling/rate_sampler.rb +55 -0
- data/lib/datadog/tracing/sampling/rule.rb +76 -0
- data/lib/datadog/tracing/sampling/rule_sampler.rb +131 -0
- data/lib/datadog/tracing/sampling/sampler.rb +44 -0
- data/lib/datadog/tracing/span.rb +212 -0
- data/lib/datadog/tracing/span_operation.rb +520 -0
- data/lib/datadog/tracing/sync_writer.rb +69 -0
- data/lib/datadog/tracing/trace_digest.rb +60 -0
- data/lib/datadog/tracing/trace_operation.rb +431 -0
- data/lib/datadog/tracing/trace_segment.rb +207 -0
- data/lib/datadog/tracing/tracer.rb +505 -0
- data/lib/datadog/tracing/workers/trace_writer.rb +195 -0
- data/lib/datadog/tracing/workers.rb +125 -0
- data/lib/datadog/tracing/writer.rb +180 -0
- data/lib/datadog/tracing.rb +142 -0
- data/lib/ddtrace/auto_instrument.rb +9 -0
- data/lib/ddtrace/auto_instrument_base.rb +8 -0
- data/lib/ddtrace/profiling/preload.rb +4 -0
- data/lib/ddtrace/transport/ext.rb +35 -0
- data/lib/ddtrace/transport/http/adapters/net.rb +57 -12
- data/lib/ddtrace/transport/http/adapters/registry.rb +3 -0
- data/lib/ddtrace/transport/http/adapters/test.rb +12 -2
- data/lib/ddtrace/transport/http/adapters/unix_socket.rb +30 -15
- data/lib/ddtrace/transport/http/api/endpoint.rb +2 -0
- data/lib/ddtrace/transport/http/api/fallbacks.rb +2 -0
- data/lib/ddtrace/transport/http/api/instance.rb +2 -0
- data/lib/ddtrace/transport/http/api/map.rb +2 -0
- data/lib/ddtrace/transport/http/api/spec.rb +2 -0
- data/lib/ddtrace/transport/http/api.rb +6 -11
- data/lib/ddtrace/transport/http/builder.rb +22 -7
- data/lib/ddtrace/transport/http/client.rb +5 -1
- data/lib/ddtrace/transport/http/env.rb +10 -0
- data/lib/ddtrace/transport/http/response.rb +36 -4
- data/lib/ddtrace/transport/http/statistics.rb +18 -3
- data/lib/ddtrace/transport/http/traces.rb +9 -6
- data/lib/ddtrace/transport/http.rb +66 -39
- data/lib/ddtrace/transport/io/client.rb +20 -9
- data/lib/ddtrace/transport/io/response.rb +3 -3
- data/lib/ddtrace/transport/io/traces.rb +12 -2
- data/lib/ddtrace/transport/io.rb +5 -3
- data/lib/ddtrace/transport/parcel.rb +9 -0
- data/lib/ddtrace/transport/request.rb +2 -0
- data/lib/ddtrace/transport/response.rb +13 -0
- data/lib/ddtrace/transport/serializable_trace.rb +118 -0
- data/lib/ddtrace/transport/statistics.rb +7 -4
- data/lib/ddtrace/transport/trace_formatter.rb +187 -0
- data/lib/ddtrace/transport/traces.rb +43 -10
- data/lib/ddtrace/version.rb +20 -5
- data/lib/ddtrace.rb +10 -71
- metadata +643 -603
- data/.circleci/config.yml +0 -490
- data/.circleci/images/primary/Dockerfile-2.0.0 +0 -73
- data/.circleci/images/primary/Dockerfile-2.1.10 +0 -73
- data/.circleci/images/primary/Dockerfile-2.2.10 +0 -73
- data/.circleci/images/primary/Dockerfile-2.3.8 +0 -75
- data/.circleci/images/primary/Dockerfile-2.4.6 +0 -73
- data/.circleci/images/primary/Dockerfile-2.5.6 +0 -73
- data/.circleci/images/primary/Dockerfile-2.6.4 +0 -73
- data/.circleci/images/primary/Dockerfile-2.7.0 +0 -73
- data/.circleci/images/primary/Dockerfile-jruby-9.2 +0 -77
- data/.dockerignore +0 -1
- data/.env +0 -26
- data/.github/CODEOWNERS +0 -1
- data/.rspec +0 -1
- data/.rubocop.yml +0 -81
- data/.yardopts +0 -5
- data/Appraisals +0 -944
- data/Gemfile +0 -7
- data/Rakefile +0 -731
- data/benchmarks/postgres_database.yml +0 -9
- data/benchmarks/sidekiq_test.rb +0 -154
- data/docker-compose.yml +0 -335
- data/lib/ddtrace/analytics.rb +0 -36
- data/lib/ddtrace/augmentation/method_wrapper.rb +0 -20
- data/lib/ddtrace/augmentation/method_wrapping.rb +0 -38
- data/lib/ddtrace/augmentation/shim.rb +0 -102
- data/lib/ddtrace/augmentation.rb +0 -13
- data/lib/ddtrace/buffer.rb +0 -119
- data/lib/ddtrace/chunker.rb +0 -34
- data/lib/ddtrace/configuration/base.rb +0 -84
- data/lib/ddtrace/configuration/components.rb +0 -154
- data/lib/ddtrace/configuration/dependency_resolver.rb +0 -24
- data/lib/ddtrace/configuration/option.rb +0 -64
- data/lib/ddtrace/configuration/option_definition.rb +0 -123
- data/lib/ddtrace/configuration/option_definition_set.rb +0 -18
- data/lib/ddtrace/configuration/option_set.rb +0 -6
- data/lib/ddtrace/configuration/options.rb +0 -112
- data/lib/ddtrace/configuration/pin_setup.rb +0 -30
- data/lib/ddtrace/configuration/settings.rb +0 -255
- data/lib/ddtrace/configuration.rb +0 -53
- data/lib/ddtrace/context.rb +0 -305
- data/lib/ddtrace/context_flush.rb +0 -69
- data/lib/ddtrace/context_provider.rb +0 -50
- data/lib/ddtrace/contrib/action_cable/configuration/settings.rb +0 -25
- data/lib/ddtrace/contrib/action_cable/event.rb +0 -65
- data/lib/ddtrace/contrib/action_cable/events/broadcast.rb +0 -49
- data/lib/ddtrace/contrib/action_cable/events/perform_action.rb +0 -55
- data/lib/ddtrace/contrib/action_cable/events/transmit.rb +0 -50
- data/lib/ddtrace/contrib/action_cable/events.rb +0 -33
- data/lib/ddtrace/contrib/action_cable/ext.rb +0 -23
- data/lib/ddtrace/contrib/action_cable/instrumentation.rb +0 -31
- data/lib/ddtrace/contrib/action_cable/integration.rb +0 -38
- data/lib/ddtrace/contrib/action_cable/patcher.rb +0 -27
- data/lib/ddtrace/contrib/action_pack/action_controller/instrumentation.rb +0 -148
- data/lib/ddtrace/contrib/action_pack/action_controller/patcher.rb +0 -25
- data/lib/ddtrace/contrib/action_pack/configuration/settings.rb +0 -27
- data/lib/ddtrace/contrib/action_pack/ext.rb +0 -16
- data/lib/ddtrace/contrib/action_pack/integration.rb +0 -38
- data/lib/ddtrace/contrib/action_pack/patcher.rb +0 -23
- data/lib/ddtrace/contrib/action_pack/utils.rb +0 -36
- data/lib/ddtrace/contrib/action_view/configuration/settings.rb +0 -26
- data/lib/ddtrace/contrib/action_view/event.rb +0 -39
- data/lib/ddtrace/contrib/action_view/events/render_partial.rb +0 -45
- data/lib/ddtrace/contrib/action_view/events/render_template.rb +0 -48
- data/lib/ddtrace/contrib/action_view/events.rb +0 -30
- data/lib/ddtrace/contrib/action_view/ext.rb +0 -17
- data/lib/ddtrace/contrib/action_view/instrumentation/partial_renderer.rb +0 -74
- data/lib/ddtrace/contrib/action_view/instrumentation/template_renderer.rb +0 -167
- data/lib/ddtrace/contrib/action_view/integration.rb +0 -45
- data/lib/ddtrace/contrib/action_view/patcher.rb +0 -47
- data/lib/ddtrace/contrib/action_view/utils.rb +0 -32
- data/lib/ddtrace/contrib/active_model_serializers/configuration/settings.rb +0 -25
- data/lib/ddtrace/contrib/active_model_serializers/event.rb +0 -68
- data/lib/ddtrace/contrib/active_model_serializers/events/render.rb +0 -32
- data/lib/ddtrace/contrib/active_model_serializers/events/serialize.rb +0 -35
- data/lib/ddtrace/contrib/active_model_serializers/events.rb +0 -30
- data/lib/ddtrace/contrib/active_model_serializers/ext.rb +0 -17
- data/lib/ddtrace/contrib/active_model_serializers/integration.rb +0 -40
- data/lib/ddtrace/contrib/active_model_serializers/patcher.rb +0 -29
- data/lib/ddtrace/contrib/active_record/configuration/resolver.rb +0 -45
- data/lib/ddtrace/contrib/active_record/configuration/settings.rb +0 -30
- data/lib/ddtrace/contrib/active_record/event.rb +0 -30
- data/lib/ddtrace/contrib/active_record/events/instantiation.rb +0 -60
- data/lib/ddtrace/contrib/active_record/events/sql.rb +0 -64
- data/lib/ddtrace/contrib/active_record/events.rb +0 -30
- data/lib/ddtrace/contrib/active_record/ext.rb +0 -21
- data/lib/ddtrace/contrib/active_record/integration.rb +0 -46
- data/lib/ddtrace/contrib/active_record/patcher.rb +0 -23
- data/lib/ddtrace/contrib/active_record/utils.rb +0 -76
- data/lib/ddtrace/contrib/active_support/cache/instrumentation.rb +0 -157
- data/lib/ddtrace/contrib/active_support/cache/patcher.rb +0 -48
- data/lib/ddtrace/contrib/active_support/cache/redis.rb +0 -47
- data/lib/ddtrace/contrib/active_support/configuration/settings.rb +0 -25
- data/lib/ddtrace/contrib/active_support/ext.rb +0 -21
- data/lib/ddtrace/contrib/active_support/integration.rb +0 -40
- data/lib/ddtrace/contrib/active_support/notifications/event.rb +0 -62
- data/lib/ddtrace/contrib/active_support/notifications/subscriber.rb +0 -66
- data/lib/ddtrace/contrib/active_support/notifications/subscription.rb +0 -159
- data/lib/ddtrace/contrib/active_support/patcher.rb +0 -23
- data/lib/ddtrace/contrib/analytics.rb +0 -24
- data/lib/ddtrace/contrib/aws/configuration/settings.rb +0 -25
- data/lib/ddtrace/contrib/aws/ext.rb +0 -20
- data/lib/ddtrace/contrib/aws/instrumentation.rb +0 -56
- data/lib/ddtrace/contrib/aws/integration.rb +0 -42
- data/lib/ddtrace/contrib/aws/parsed_context.rb +0 -56
- data/lib/ddtrace/contrib/aws/patcher.rb +0 -49
- data/lib/ddtrace/contrib/aws/services.rb +0 -115
- data/lib/ddtrace/contrib/concurrent_ruby/configuration/settings.rb +0 -15
- data/lib/ddtrace/contrib/concurrent_ruby/context_composite_executor_service.rb +0 -35
- data/lib/ddtrace/contrib/concurrent_ruby/ext.rb +0 -11
- data/lib/ddtrace/contrib/concurrent_ruby/future_patch.rb +0 -23
- data/lib/ddtrace/contrib/concurrent_ruby/integration.rb +0 -38
- data/lib/ddtrace/contrib/concurrent_ruby/patcher.rb +0 -28
- data/lib/ddtrace/contrib/configurable.rb +0 -76
- data/lib/ddtrace/contrib/configuration/resolver.rb +0 -16
- data/lib/ddtrace/contrib/configuration/resolvers/pattern_resolver.rb +0 -39
- data/lib/ddtrace/contrib/configuration/settings.rb +0 -35
- data/lib/ddtrace/contrib/dalli/configuration/settings.rb +0 -25
- data/lib/ddtrace/contrib/dalli/ext.rb +0 -17
- data/lib/ddtrace/contrib/dalli/instrumentation.rb +0 -50
- data/lib/ddtrace/contrib/dalli/integration.rb +0 -38
- data/lib/ddtrace/contrib/dalli/patcher.rb +0 -67
- data/lib/ddtrace/contrib/dalli/quantize.rb +0 -22
- data/lib/ddtrace/contrib/delayed_job/configuration/settings.rb +0 -25
- data/lib/ddtrace/contrib/delayed_job/ext.rb +0 -18
- data/lib/ddtrace/contrib/delayed_job/integration.rb +0 -38
- data/lib/ddtrace/contrib/delayed_job/patcher.rb +0 -28
- data/lib/ddtrace/contrib/delayed_job/plugin.rb +0 -61
- data/lib/ddtrace/contrib/elasticsearch/configuration/settings.rb +0 -26
- data/lib/ddtrace/contrib/elasticsearch/ext.rb +0 -19
- data/lib/ddtrace/contrib/elasticsearch/integration.rb +0 -39
- data/lib/ddtrace/contrib/elasticsearch/patcher.rb +0 -118
- data/lib/ddtrace/contrib/elasticsearch/quantize.rb +0 -80
- data/lib/ddtrace/contrib/ethon/configuration/settings.rb +0 -27
- data/lib/ddtrace/contrib/ethon/easy_patch.rb +0 -148
- data/lib/ddtrace/contrib/ethon/ext.rb +0 -15
- data/lib/ddtrace/contrib/ethon/integration.rb +0 -43
- data/lib/ddtrace/contrib/ethon/multi_patch.rb +0 -80
- data/lib/ddtrace/contrib/ethon/patcher.rb +0 -25
- data/lib/ddtrace/contrib/excon/configuration/settings.rb +0 -28
- data/lib/ddtrace/contrib/excon/ext.rb +0 -14
- data/lib/ddtrace/contrib/excon/integration.rb +0 -43
- data/lib/ddtrace/contrib/excon/middleware.rb +0 -157
- data/lib/ddtrace/contrib/excon/patcher.rb +0 -27
- data/lib/ddtrace/contrib/extensions.rb +0 -59
- data/lib/ddtrace/contrib/faraday/configuration/settings.rb +0 -33
- data/lib/ddtrace/contrib/faraday/connection.rb +0 -18
- data/lib/ddtrace/contrib/faraday/ext.rb +0 -14
- data/lib/ddtrace/contrib/faraday/integration.rb +0 -43
- data/lib/ddtrace/contrib/faraday/middleware.rb +0 -81
- data/lib/ddtrace/contrib/faraday/patcher.rb +0 -81
- data/lib/ddtrace/contrib/faraday/rack_builder.rb +0 -18
- data/lib/ddtrace/contrib/grape/configuration/settings.rb +0 -27
- data/lib/ddtrace/contrib/grape/endpoint.rb +0 -208
- data/lib/ddtrace/contrib/grape/ext.rb +0 -19
- data/lib/ddtrace/contrib/grape/instrumentation.rb +0 -33
- data/lib/ddtrace/contrib/grape/integration.rb +0 -39
- data/lib/ddtrace/contrib/grape/patcher.rb +0 -73
- data/lib/ddtrace/contrib/graphql/configuration/settings.rb +0 -27
- data/lib/ddtrace/contrib/graphql/ext.rb +0 -13
- data/lib/ddtrace/contrib/graphql/integration.rb +0 -39
- data/lib/ddtrace/contrib/graphql/patcher.rb +0 -57
- data/lib/ddtrace/contrib/grpc/configuration/settings.rb +0 -25
- data/lib/ddtrace/contrib/grpc/datadog_interceptor/client.rb +0 -56
- data/lib/ddtrace/contrib/grpc/datadog_interceptor/server.rb +0 -76
- data/lib/ddtrace/contrib/grpc/datadog_interceptor.rb +0 -74
- data/lib/ddtrace/contrib/grpc/ext.rb +0 -15
- data/lib/ddtrace/contrib/grpc/integration.rb +0 -38
- data/lib/ddtrace/contrib/grpc/intercept_with_datadog.rb +0 -49
- data/lib/ddtrace/contrib/grpc/patcher.rb +0 -72
- data/lib/ddtrace/contrib/http/circuit_breaker.rb +0 -39
- data/lib/ddtrace/contrib/http/configuration/settings.rb +0 -27
- data/lib/ddtrace/contrib/http/ext.rb +0 -14
- data/lib/ddtrace/contrib/http/instrumentation.rb +0 -170
- data/lib/ddtrace/contrib/http/integration.rb +0 -45
- data/lib/ddtrace/contrib/http/patcher.rb +0 -26
- data/lib/ddtrace/contrib/http_annotation_helper.rb +0 -10
- data/lib/ddtrace/contrib/integration.rb +0 -16
- data/lib/ddtrace/contrib/mongodb/configuration/settings.rb +0 -28
- data/lib/ddtrace/contrib/mongodb/ext.rb +0 -20
- data/lib/ddtrace/contrib/mongodb/instrumentation.rb +0 -68
- data/lib/ddtrace/contrib/mongodb/integration.rb +0 -38
- data/lib/ddtrace/contrib/mongodb/parsers.rb +0 -68
- data/lib/ddtrace/contrib/mongodb/patcher.rb +0 -31
- data/lib/ddtrace/contrib/mongodb/subscribers.rb +0 -108
- data/lib/ddtrace/contrib/mysql2/configuration/settings.rb +0 -25
- data/lib/ddtrace/contrib/mysql2/ext.rb +0 -15
- data/lib/ddtrace/contrib/mysql2/instrumentation.rb +0 -60
- data/lib/ddtrace/contrib/mysql2/integration.rb +0 -38
- data/lib/ddtrace/contrib/mysql2/patcher.rb +0 -27
- data/lib/ddtrace/contrib/patchable.rb +0 -59
- data/lib/ddtrace/contrib/patcher.rb +0 -56
- data/lib/ddtrace/contrib/presto/configuration/settings.rb +0 -25
- data/lib/ddtrace/contrib/presto/ext.rb +0 -25
- data/lib/ddtrace/contrib/presto/instrumentation.rb +0 -107
- data/lib/ddtrace/contrib/presto/integration.rb +0 -38
- data/lib/ddtrace/contrib/presto/patcher.rb +0 -30
- data/lib/ddtrace/contrib/racecar/configuration/settings.rb +0 -25
- data/lib/ddtrace/contrib/racecar/event.rb +0 -71
- data/lib/ddtrace/contrib/racecar/events/batch.rb +0 -27
- data/lib/ddtrace/contrib/racecar/events/message.rb +0 -27
- data/lib/ddtrace/contrib/racecar/events.rb +0 -30
- data/lib/ddtrace/contrib/racecar/ext.rb +0 -21
- data/lib/ddtrace/contrib/racecar/integration.rb +0 -39
- data/lib/ddtrace/contrib/racecar/patcher.rb +0 -26
- data/lib/ddtrace/contrib/rack/configuration/settings.rb +0 -41
- data/lib/ddtrace/contrib/rack/ext.rb +0 -18
- data/lib/ddtrace/contrib/rack/integration.rb +0 -38
- data/lib/ddtrace/contrib/rack/middlewares.rb +0 -287
- data/lib/ddtrace/contrib/rack/patcher.rb +0 -107
- data/lib/ddtrace/contrib/rack/request_queue.rb +0 -39
- data/lib/ddtrace/contrib/rails/configuration/settings.rb +0 -94
- data/lib/ddtrace/contrib/rails/ext.rb +0 -13
- data/lib/ddtrace/contrib/rails/framework.rb +0 -118
- data/lib/ddtrace/contrib/rails/integration.rb +0 -44
- data/lib/ddtrace/contrib/rails/middlewares.rb +0 -38
- data/lib/ddtrace/contrib/rails/patcher.rb +0 -74
- data/lib/ddtrace/contrib/rails/railtie.rb +0 -17
- data/lib/ddtrace/contrib/rails/utils.rb +0 -20
- data/lib/ddtrace/contrib/rake/configuration/settings.rb +0 -27
- data/lib/ddtrace/contrib/rake/ext.rb +0 -18
- data/lib/ddtrace/contrib/rake/instrumentation.rb +0 -88
- data/lib/ddtrace/contrib/rake/integration.rb +0 -38
- data/lib/ddtrace/contrib/rake/patcher.rb +0 -30
- data/lib/ddtrace/contrib/redis/configuration/resolver.rb +0 -36
- data/lib/ddtrace/contrib/redis/configuration/settings.rb +0 -25
- data/lib/ddtrace/contrib/redis/ext.rb +0 -18
- data/lib/ddtrace/contrib/redis/integration.rb +0 -42
- data/lib/ddtrace/contrib/redis/patcher.rb +0 -97
- data/lib/ddtrace/contrib/redis/quantize.rb +0 -47
- data/lib/ddtrace/contrib/redis/tags.rb +0 -38
- data/lib/ddtrace/contrib/redis/vendor/resolver.rb +0 -159
- data/lib/ddtrace/contrib/registerable.rb +0 -33
- data/lib/ddtrace/contrib/registry.rb +0 -42
- data/lib/ddtrace/contrib/resque/configuration/settings.rb +0 -26
- data/lib/ddtrace/contrib/resque/ext.rb +0 -14
- data/lib/ddtrace/contrib/resque/integration.rb +0 -47
- data/lib/ddtrace/contrib/resque/patcher.rb +0 -29
- data/lib/ddtrace/contrib/resque/resque_job.rb +0 -80
- data/lib/ddtrace/contrib/rest_client/configuration/settings.rb +0 -26
- data/lib/ddtrace/contrib/rest_client/ext.rb +0 -14
- data/lib/ddtrace/contrib/rest_client/integration.rb +0 -38
- data/lib/ddtrace/contrib/rest_client/patcher.rb +0 -23
- data/lib/ddtrace/contrib/rest_client/request_patch.rb +0 -89
- data/lib/ddtrace/contrib/sequel/configuration/settings.rb +0 -23
- data/lib/ddtrace/contrib/sequel/database.rb +0 -61
- data/lib/ddtrace/contrib/sequel/dataset.rb +0 -62
- data/lib/ddtrace/contrib/sequel/ext.rb +0 -15
- data/lib/ddtrace/contrib/sequel/integration.rb +0 -38
- data/lib/ddtrace/contrib/sequel/patcher.rb +0 -33
- data/lib/ddtrace/contrib/sequel/utils.rb +0 -46
- data/lib/ddtrace/contrib/shoryuken/configuration/settings.rb +0 -24
- data/lib/ddtrace/contrib/shoryuken/ext.rb +0 -18
- data/lib/ddtrace/contrib/shoryuken/integration.rb +0 -39
- data/lib/ddtrace/contrib/shoryuken/patcher.rb +0 -24
- data/lib/ddtrace/contrib/shoryuken/tracer.rb +0 -49
- data/lib/ddtrace/contrib/sidekiq/client_tracer.rb +0 -43
- data/lib/ddtrace/contrib/sidekiq/configuration/settings.rb +0 -31
- data/lib/ddtrace/contrib/sidekiq/ext.rb +0 -23
- data/lib/ddtrace/contrib/sidekiq/integration.rb +0 -38
- data/lib/ddtrace/contrib/sidekiq/patcher.rb +0 -34
- data/lib/ddtrace/contrib/sidekiq/server_tracer.rb +0 -66
- data/lib/ddtrace/contrib/sidekiq/tracing.rb +0 -45
- data/lib/ddtrace/contrib/sinatra/configuration/settings.rb +0 -34
- data/lib/ddtrace/contrib/sinatra/env.rb +0 -58
- data/lib/ddtrace/contrib/sinatra/ext.rb +0 -24
- data/lib/ddtrace/contrib/sinatra/headers.rb +0 -31
- data/lib/ddtrace/contrib/sinatra/integration.rb +0 -38
- data/lib/ddtrace/contrib/sinatra/patcher.rb +0 -28
- data/lib/ddtrace/contrib/sinatra/tracer.rb +0 -150
- data/lib/ddtrace/contrib/sinatra/tracer_middleware.rb +0 -78
- data/lib/ddtrace/contrib/sucker_punch/configuration/settings.rb +0 -25
- data/lib/ddtrace/contrib/sucker_punch/exception_handler.rb +0 -26
- data/lib/ddtrace/contrib/sucker_punch/ext.rb +0 -18
- data/lib/ddtrace/contrib/sucker_punch/instrumentation.rb +0 -84
- data/lib/ddtrace/contrib/sucker_punch/integration.rb +0 -38
- data/lib/ddtrace/contrib/sucker_punch/patcher.rb +0 -42
- data/lib/ddtrace/correlation.rb +0 -38
- data/lib/ddtrace/diagnostics/health.rb +0 -33
- data/lib/ddtrace/distributed_tracing/headers/b3.rb +0 -44
- data/lib/ddtrace/distributed_tracing/headers/b3_single.rb +0 -56
- data/lib/ddtrace/distributed_tracing/headers/datadog.rb +0 -42
- data/lib/ddtrace/distributed_tracing/headers/headers.rb +0 -70
- data/lib/ddtrace/distributed_tracing/headers/helpers.rb +0 -45
- data/lib/ddtrace/encoding.rb +0 -69
- data/lib/ddtrace/environment.rb +0 -27
- data/lib/ddtrace/error.rb +0 -27
- data/lib/ddtrace/event.rb +0 -52
- data/lib/ddtrace/ext/analytics.rb +0 -12
- data/lib/ddtrace/ext/app_types.rb +0 -11
- data/lib/ddtrace/ext/correlation.rb +0 -11
- data/lib/ddtrace/ext/diagnostics.rb +0 -33
- data/lib/ddtrace/ext/distributed.rb +0 -33
- data/lib/ddtrace/ext/environment.rb +0 -14
- data/lib/ddtrace/ext/errors.rb +0 -10
- data/lib/ddtrace/ext/forced_tracing.rb +0 -25
- data/lib/ddtrace/ext/http.rb +0 -46
- data/lib/ddtrace/ext/manual_tracing.rb +0 -9
- data/lib/ddtrace/ext/metrics.rb +0 -15
- data/lib/ddtrace/ext/net.rb +0 -10
- data/lib/ddtrace/ext/priority.rb +0 -16
- data/lib/ddtrace/ext/runtime.rb +0 -26
- data/lib/ddtrace/ext/sampling.rb +0 -16
- data/lib/ddtrace/ext/sql.rb +0 -8
- data/lib/ddtrace/ext/transport.rb +0 -17
- data/lib/ddtrace/forced_tracing.rb +0 -36
- data/lib/ddtrace/logger.rb +0 -40
- data/lib/ddtrace/metrics.rb +0 -222
- data/lib/ddtrace/monkey.rb +0 -58
- data/lib/ddtrace/opentelemetry/extensions.rb +0 -13
- data/lib/ddtrace/opentelemetry/span.rb +0 -33
- data/lib/ddtrace/opentracer/binary_propagator.rb +0 -24
- data/lib/ddtrace/opentracer/carrier.rb +0 -6
- data/lib/ddtrace/opentracer/distributed_headers.rb +0 -52
- data/lib/ddtrace/opentracer/global_tracer.rb +0 -15
- data/lib/ddtrace/opentracer/propagator.rb +0 -22
- data/lib/ddtrace/opentracer/rack_propagator.rb +0 -60
- data/lib/ddtrace/opentracer/scope.rb +0 -15
- data/lib/ddtrace/opentracer/scope_manager.rb +0 -6
- data/lib/ddtrace/opentracer/span.rb +0 -98
- data/lib/ddtrace/opentracer/span_context.rb +0 -14
- data/lib/ddtrace/opentracer/span_context_factory.rb +0 -23
- data/lib/ddtrace/opentracer/text_map_propagator.rb +0 -75
- data/lib/ddtrace/opentracer/thread_local_scope.rb +0 -30
- data/lib/ddtrace/opentracer/thread_local_scope_manager.rb +0 -40
- data/lib/ddtrace/opentracer/tracer.rb +0 -208
- data/lib/ddtrace/opentracer.rb +0 -40
- data/lib/ddtrace/patcher.rb +0 -47
- data/lib/ddtrace/pin.rb +0 -114
- data/lib/ddtrace/pipeline/span_filter.rb +0 -38
- data/lib/ddtrace/pipeline/span_processor.rb +0 -20
- data/lib/ddtrace/pipeline.rb +0 -46
- data/lib/ddtrace/propagation/grpc_propagator.rb +0 -61
- data/lib/ddtrace/propagation/http_propagator.rb +0 -75
- data/lib/ddtrace/quantization/hash.rb +0 -103
- data/lib/ddtrace/quantization/http.rb +0 -86
- data/lib/ddtrace/runtime/cgroup.rb +0 -44
- data/lib/ddtrace/runtime/class_count.rb +0 -17
- data/lib/ddtrace/runtime/container.rb +0 -73
- data/lib/ddtrace/runtime/gc.rb +0 -16
- data/lib/ddtrace/runtime/identity.rb +0 -41
- data/lib/ddtrace/runtime/metrics.rb +0 -96
- data/lib/ddtrace/runtime/object_space.rb +0 -19
- data/lib/ddtrace/runtime/socket.rb +0 -14
- data/lib/ddtrace/runtime/thread_count.rb +0 -16
- data/lib/ddtrace/sampler.rb +0 -290
- data/lib/ddtrace/sampling/matcher.rb +0 -57
- data/lib/ddtrace/sampling/rate_limiter.rb +0 -127
- data/lib/ddtrace/sampling/rule.rb +0 -61
- data/lib/ddtrace/sampling/rule_sampler.rb +0 -125
- data/lib/ddtrace/sampling.rb +0 -2
- data/lib/ddtrace/span.rb +0 -297
- data/lib/ddtrace/sync_writer.rb +0 -67
- data/lib/ddtrace/tracer.rb +0 -432
- data/lib/ddtrace/utils/database.rb +0 -25
- data/lib/ddtrace/utils/time.rb +0 -14
- data/lib/ddtrace/utils.rb +0 -65
- data/lib/ddtrace/vendor/active_record/connection_specification.rb +0 -301
- data/lib/ddtrace/worker.rb +0 -20
- data/lib/ddtrace/workers/async.rb +0 -165
- data/lib/ddtrace/workers/loop.rb +0 -105
- data/lib/ddtrace/workers/polling.rb +0 -48
- data/lib/ddtrace/workers/queue.rb +0 -39
- data/lib/ddtrace/workers/runtime_metrics.rb +0 -47
- data/lib/ddtrace/workers/trace_writer.rb +0 -199
- data/lib/ddtrace/workers.rb +0 -117
- data/lib/ddtrace/writer.rb +0 -154
- data/tasks/release_gem.rake +0 -28
|
@@ -0,0 +1,118 @@
|
|
|
1
|
+
#include <stdbool.h>
|
|
2
|
+
#include <dlfcn.h>
|
|
3
|
+
#include <ruby.h>
|
|
4
|
+
|
|
5
|
+
// Why this exists:
|
|
6
|
+
//
|
|
7
|
+
// The Datadog::Profiling::Loader exists because when Ruby loads a native extension (using `require`), it uses
|
|
8
|
+
// `dlopen(..., RTLD_LAZY | RTLD_GLOBAL)` (https://github.com/ruby/ruby/blob/67950a4c0a884bdb78d9beb4405ebf7459229b21/dln.c#L362).
|
|
9
|
+
// This means that every symbol exposed directly or indirectly by that native extension becomes visible to every other
|
|
10
|
+
// extension in the Ruby process. This can cause issues, see https://github.com/rubyjs/mini_racer/pull/179.
|
|
11
|
+
//
|
|
12
|
+
// Instead of `RTLD_LAZY | RTLD_GLOBAL`, we want to call `dlopen` with `RTLD_LAZY | RTLD_LOCAL | RTLD_DEEPBIND` when
|
|
13
|
+
// loading the profiling native extension, to avoid leaking any unintended symbols (`RTLD_LOCAL`) and avoid picking
|
|
14
|
+
// up other's symbols (`RTLD_DEEPBIND`).
|
|
15
|
+
//
|
|
16
|
+
// But Ruby's extension loading mechanism is not configurable -- there's no way to tell it to use different flags when
|
|
17
|
+
// calling `dlopen`. To get around this, this file (ddtrace_profiling_loader.c) introduces another extension
|
|
18
|
+
// (profiling loader) which has only a single responsibility: mimic Ruby's extension loading mechanism, but when calling
|
|
19
|
+
// `dlopen` use a different set of flags.
|
|
20
|
+
// This idea was shamelessly stolen from @lloeki's work in https://github.com/rubyjs/mini_racer/pull/179, big thanks!
|
|
21
|
+
//
|
|
22
|
+
// Extra note: Currently (May 2022), that we know of, the profiling native extension only exposes one potentially
|
|
23
|
+
// problematic symbol: `rust_eh_personality` (coming from libddprof/libdatadog).
|
|
24
|
+
// Future versions of Rust have been patched not to expose this
|
|
25
|
+
// (see https://github.com/rust-lang/rust/pull/95604#issuecomment-1108563434) so we may want to revisit the need
|
|
26
|
+
// for this loader in the future, and perhaps delete it if we no longer require its services :)
|
|
27
|
+
|
|
28
|
+
#ifndef RTLD_DEEPBIND
|
|
29
|
+
#define RTLD_DEEPBIND 0
|
|
30
|
+
#endif
|
|
31
|
+
|
|
32
|
+
static VALUE ok_symbol = Qnil; // :ok in Ruby
|
|
33
|
+
static VALUE error_symbol = Qnil; // :error in Ruby
|
|
34
|
+
|
|
35
|
+
static VALUE _native_load(VALUE self, VALUE ruby_path, VALUE ruby_init_name);
|
|
36
|
+
static bool failed_to_load(void *handle, VALUE *failure_details);
|
|
37
|
+
static bool incompatible_library(void *handle, VALUE *failure_details);
|
|
38
|
+
static bool failed_to_initialize(void *handle, char *init_name, VALUE *failure_details);
|
|
39
|
+
static void set_failure_from_dlerror(VALUE *failure_details);
|
|
40
|
+
static void unload_failed_library(void *handle);
|
|
41
|
+
|
|
42
|
+
#define DDTRACE_EXPORT __attribute__ ((visibility ("default")))
|
|
43
|
+
|
|
44
|
+
void DDTRACE_EXPORT Init_ddtrace_profiling_loader() {
|
|
45
|
+
VALUE datadog_module = rb_define_module("Datadog");
|
|
46
|
+
VALUE profiling_module = rb_define_module_under(datadog_module, "Profiling");
|
|
47
|
+
VALUE loader_module = rb_define_module_under(profiling_module, "Loader");
|
|
48
|
+
rb_define_singleton_method(loader_module, "_native_load", _native_load, 2);
|
|
49
|
+
|
|
50
|
+
ok_symbol = ID2SYM(rb_intern_const("ok"));
|
|
51
|
+
error_symbol = ID2SYM(rb_intern_const("error"));
|
|
52
|
+
}
|
|
53
|
+
|
|
54
|
+
static VALUE _native_load(VALUE self, VALUE ruby_path, VALUE ruby_init_name) {
|
|
55
|
+
Check_Type(ruby_path, T_STRING);
|
|
56
|
+
Check_Type(ruby_init_name, T_STRING);
|
|
57
|
+
|
|
58
|
+
char *path = StringValueCStr(ruby_path);
|
|
59
|
+
char *init_name = StringValueCStr(ruby_init_name);
|
|
60
|
+
|
|
61
|
+
void *handle = dlopen(path, RTLD_LAZY | RTLD_LOCAL | RTLD_DEEPBIND);
|
|
62
|
+
|
|
63
|
+
VALUE failure_details = Qnil;
|
|
64
|
+
|
|
65
|
+
if (
|
|
66
|
+
failed_to_load(handle, &failure_details) ||
|
|
67
|
+
incompatible_library(handle, &failure_details) ||
|
|
68
|
+
failed_to_initialize(handle, init_name, &failure_details)
|
|
69
|
+
) {
|
|
70
|
+
return rb_ary_new_from_args(2, error_symbol, failure_details);
|
|
71
|
+
}
|
|
72
|
+
|
|
73
|
+
return rb_ary_new_from_args(2, ok_symbol, Qnil);
|
|
74
|
+
}
|
|
75
|
+
|
|
76
|
+
static bool failed_to_load(void *handle, VALUE *failure_details) {
|
|
77
|
+
if (handle == NULL) {
|
|
78
|
+
set_failure_from_dlerror(failure_details);
|
|
79
|
+
return true;
|
|
80
|
+
} else {
|
|
81
|
+
return false;
|
|
82
|
+
}
|
|
83
|
+
}
|
|
84
|
+
|
|
85
|
+
static bool incompatible_library(void *handle, VALUE *failure_details) {
|
|
86
|
+
// The library being loaded may be linked to a different libruby than the current executing Ruby.
|
|
87
|
+
// We check if this is the case by checking if a well-known symbol resolves to a common address.
|
|
88
|
+
if (dlsym(handle, "ruby_xmalloc") != &ruby_xmalloc) {
|
|
89
|
+
*failure_details = rb_str_new_cstr("library was compiled and linked to a different Ruby version");
|
|
90
|
+
unload_failed_library(handle);
|
|
91
|
+
return true;
|
|
92
|
+
} else {
|
|
93
|
+
return false;
|
|
94
|
+
}
|
|
95
|
+
}
|
|
96
|
+
|
|
97
|
+
static bool failed_to_initialize(void *handle, char *init_name, VALUE *failure_details) {
|
|
98
|
+
void (*initialization_function)(void) = dlsym(handle, init_name);
|
|
99
|
+
|
|
100
|
+
if (initialization_function == NULL) {
|
|
101
|
+
set_failure_from_dlerror(failure_details);
|
|
102
|
+
unload_failed_library(handle);
|
|
103
|
+
return true;
|
|
104
|
+
} else {
|
|
105
|
+
(*initialization_function)();
|
|
106
|
+
return false;
|
|
107
|
+
}
|
|
108
|
+
}
|
|
109
|
+
|
|
110
|
+
static void set_failure_from_dlerror(VALUE *failure_details) {
|
|
111
|
+
char *failure = dlerror();
|
|
112
|
+
*failure_details = failure == NULL ? Qnil : rb_str_new_cstr(failure);
|
|
113
|
+
}
|
|
114
|
+
|
|
115
|
+
static void unload_failed_library(void *handle) {
|
|
116
|
+
// Note: According to the Ruby VM sources, this may fail with a segfault on really old versions of macOS (< 10.11)
|
|
117
|
+
dlclose(handle);
|
|
118
|
+
}
|
|
@@ -0,0 +1,53 @@
|
|
|
1
|
+
# typed: ignore
|
|
2
|
+
# rubocop:disable Style/StderrPuts
|
|
3
|
+
# rubocop:disable Style/GlobalVars
|
|
4
|
+
|
|
5
|
+
if RUBY_ENGINE != 'ruby' || Gem.win_platform?
|
|
6
|
+
$stderr.puts(
|
|
7
|
+
'WARN: Skipping build of ddtrace profiling loader. See ddtrace profiling native extension note for details.'
|
|
8
|
+
)
|
|
9
|
+
|
|
10
|
+
File.write('Makefile', 'all install clean: # dummy makefile that does nothing')
|
|
11
|
+
exit
|
|
12
|
+
end
|
|
13
|
+
|
|
14
|
+
require 'mkmf'
|
|
15
|
+
|
|
16
|
+
# mkmf on modern Rubies actually has an append_cflags that does something similar
|
|
17
|
+
# (see https://github.com/ruby/ruby/pull/5760), but as usual we need a bit more boilerplate to deal with legacy Rubies
|
|
18
|
+
def add_compiler_flag(flag)
|
|
19
|
+
if try_cflags(flag)
|
|
20
|
+
$CFLAGS << ' ' << flag
|
|
21
|
+
else
|
|
22
|
+
$stderr.puts("WARNING: '#{flag}' not accepted by compiler, skipping it")
|
|
23
|
+
end
|
|
24
|
+
end
|
|
25
|
+
|
|
26
|
+
# Gets really noisy when we include the MJIT header, let's omit it
|
|
27
|
+
add_compiler_flag '-Wno-unused-function'
|
|
28
|
+
|
|
29
|
+
# Allow defining variables at any point in a function
|
|
30
|
+
add_compiler_flag '-Wno-declaration-after-statement'
|
|
31
|
+
|
|
32
|
+
# If we forget to include a Ruby header, the function call may still appear to work, but then
|
|
33
|
+
# cause a segfault later. Let's ensure that never happens.
|
|
34
|
+
add_compiler_flag '-Werror-implicit-function-declaration'
|
|
35
|
+
|
|
36
|
+
# The native extension is not intended to expose any symbols/functions for other native libraries to use;
|
|
37
|
+
# the sole exception being `Init_ddtrace_profiling_loader` which needs to be visible for Ruby to call it when
|
|
38
|
+
# it `dlopen`s the library.
|
|
39
|
+
#
|
|
40
|
+
# By setting this compiler flag, we tell it to assume that everything is private unless explicitly stated.
|
|
41
|
+
# For more details see https://gcc.gnu.org/wiki/Visibility
|
|
42
|
+
add_compiler_flag '-fvisibility=hidden'
|
|
43
|
+
|
|
44
|
+
# Tag the native extension library with the Ruby version and Ruby platform.
|
|
45
|
+
# This makes it easier for development (avoids "oops I forgot to rebuild when I switched my Ruby") and ensures that
|
|
46
|
+
# the wrong library is never loaded.
|
|
47
|
+
# When requiring, we need to use the exact same string, including the version and the platform.
|
|
48
|
+
EXTENSION_NAME = "ddtrace_profiling_loader.#{RUBY_VERSION}_#{RUBY_PLATFORM}".freeze
|
|
49
|
+
|
|
50
|
+
create_makefile(EXTENSION_NAME)
|
|
51
|
+
|
|
52
|
+
# rubocop:enable Style/GlobalVars
|
|
53
|
+
# rubocop:enable Style/StderrPuts
|
|
@@ -0,0 +1,112 @@
|
|
|
1
|
+
# Profiling Native Extension Design
|
|
2
|
+
|
|
3
|
+
The profiling native extension is used to:
|
|
4
|
+
1. Implement features which are expensive (in terms of resources) or otherwise impossible to implement using Ruby code.
|
|
5
|
+
2. Bridge between Ruby-specific profiling features and [`libddprof`](https://github.com/DataDog/libddprof), a Rust-based
|
|
6
|
+
library with common profiling functionality.
|
|
7
|
+
|
|
8
|
+
Due to (1), this extension is quite coupled with MRI Ruby ("C Ruby") internals, and is not intended to support other rubies such as
|
|
9
|
+
JRuby or TruffleRuby. When below we say "Ruby", read it as "MRI Ruby".
|
|
10
|
+
|
|
11
|
+
## Disabling
|
|
12
|
+
|
|
13
|
+
The profiling native extension can be disabled by setting `DD_PROFILING_NO_EXTENSION=true` when installing or running
|
|
14
|
+
the gem. Setting `DD_PROFILING_NO_EXTENSION` at installation time skips compilation of the extension entirely.
|
|
15
|
+
|
|
16
|
+
(If you're a customer and needed to use this, please tell us why on <https://github.com/DataDog/dd-trace-rb/issues/new>.)
|
|
17
|
+
|
|
18
|
+
Currently the profiler can still "limp along" when the native extension is disabled, but the plan is to require it
|
|
19
|
+
in future releases -- e.g. disabling the extension will disable profiling entirely.
|
|
20
|
+
|
|
21
|
+
## Must not block or break users that cannot use it
|
|
22
|
+
|
|
23
|
+
The profiling native extension is (and must always be) designed to **not cause failures** during gem installation, even
|
|
24
|
+
if some features, Ruby versions, or operating systems are not supported.
|
|
25
|
+
|
|
26
|
+
E.g. the extension must not break installation on Ruby 2.1 (or the oldest Ruby version we support at the time) on 64-bit ARM macOS,
|
|
27
|
+
even if at run time it will effectively do nothing for such a setup.
|
|
28
|
+
|
|
29
|
+
We have a CI setup to help validate this, but this is really important to keep in mind when adding to or changing the
|
|
30
|
+
existing codebase.
|
|
31
|
+
|
|
32
|
+
## Memory leaks and Interaction with Ruby VM APIs
|
|
33
|
+
|
|
34
|
+
When adding to or changing the native extension, we must always consider what API calls can lead to Ruby exceptions to
|
|
35
|
+
be raised, and whether there are is dynamically-allocated memory that can be leaked if that happens.
|
|
36
|
+
|
|
37
|
+
(When a Ruby exception is raised, the VM will use `setjmp` and `longjmp` to jump back in the stack and thus skip
|
|
38
|
+
our clean-up code, like in a Ruby-level exception.)
|
|
39
|
+
|
|
40
|
+
We avoid issues using a combination of:
|
|
41
|
+
|
|
42
|
+
* Avoiding dynamic allocation as much as possible
|
|
43
|
+
* Getting all needed data and doing all validations before doing any dynamic allocations
|
|
44
|
+
* Avoiding calling Ruby VM APIs after doing dynamic allocations
|
|
45
|
+
* Wrapping dynamic allocations into Ruby GC-managed objects (using `TypedData_Wrap_Struct`), so that Ruby will manage
|
|
46
|
+
their lifetime and call `free` when the GC-managed object is no longer being referenced
|
|
47
|
+
|
|
48
|
+
Non-exhaustive list of APIs that cause exceptions to be raised:
|
|
49
|
+
|
|
50
|
+
* `Check_TypedStruct`, `Check_Type`
|
|
51
|
+
* `rb_funcall`
|
|
52
|
+
* `rb_thread_call_without_gvl`, `rb_thread_call_without_gvl2`
|
|
53
|
+
* [Numeric conversion APIs, e.g. `NUM2LONG`, `NUM2INT`, etc.](https://silverhammermba.github.io/emberb/c/?utm_source=pocket_mylist#translation)
|
|
54
|
+
* Our `char_slice_from_ruby_string` helper
|
|
55
|
+
|
|
56
|
+
## Usage of private VM headers
|
|
57
|
+
|
|
58
|
+
To implement some of the features below, we sometimes require access to private Ruby header files (that describe VM
|
|
59
|
+
internal types, structures and functions).
|
|
60
|
+
|
|
61
|
+
Because these private header files are not included in regular Ruby installations, we have two different workarounds:
|
|
62
|
+
|
|
63
|
+
1. for Ruby versions >= 2.6 we make use use the Ruby private MJIT header
|
|
64
|
+
2. for Ruby versions < 2.6 (legacy Rubies) we make use of the `debase-ruby_core_source` gem
|
|
65
|
+
|
|
66
|
+
Functions which make use of these headers are defined in the <private_vm_api_acccess.c> file.
|
|
67
|
+
|
|
68
|
+
**Important Note**: Our medium/long-term plan is to stop relying on all private Ruby headers, and instead request and
|
|
69
|
+
contribute upstream changes so that they become official public VM APIs.
|
|
70
|
+
|
|
71
|
+
### Approach 1: Using the Ruby private MJIT header
|
|
72
|
+
|
|
73
|
+
Ruby versions >= 2.6 introduced a JIT compiler called MJIT. This compiler does not directly generate machine code;
|
|
74
|
+
instead it generates C code and uses the system C compiler to turn it into machine code.
|
|
75
|
+
|
|
76
|
+
The generated C code `#include`s a private header -- which we reference as "the MJIT header" everywhere.
|
|
77
|
+
The MJIT header gets shipped with all MJIT-enabled Rubies and includes the layout of many internal VM structures;
|
|
78
|
+
and of course the intention is that it is only used by the Ruby MJIT compiler.
|
|
79
|
+
|
|
80
|
+
This header is placed inside the `include/` directory in a Ruby installation, and is named for that specific Ruby
|
|
81
|
+
version. e.g. `rb_mjit_min_header-2.7.4.h`.
|
|
82
|
+
|
|
83
|
+
### Approach 2: Using the `debase-ruby_core_source` gem
|
|
84
|
+
|
|
85
|
+
The [`debase-ruby_core_source`](https://github.com/ruby-debug/debase-ruby_core_source) contains almost no code;
|
|
86
|
+
instead, it just contains per-Ruby-version folders with the private VM headers (`.h`) files for that version.
|
|
87
|
+
|
|
88
|
+
Thus, even though a regular Ruby installation does not include these files, we can access the copy inside this gem.
|
|
89
|
+
|
|
90
|
+
## Feature: Getting thread CPU-time clock_ids
|
|
91
|
+
|
|
92
|
+
* **OS support**: Linux
|
|
93
|
+
* **Ruby support**: 2.6+
|
|
94
|
+
|
|
95
|
+
To enable CPU-time profiling, we use the `pthread_getcpuclockid(pthread_t thread, clockid_t *clockid)` C function to
|
|
96
|
+
obtain a `clockid_t` that can then be used with the `Process.clock_gettime` method (or directly with the
|
|
97
|
+
`clock_gettime()` C function).
|
|
98
|
+
|
|
99
|
+
The challenge with using `pthread_getcpuclockid()` is that we need to get the `pthread_t` for a given Ruby `Thread`
|
|
100
|
+
object. We previously did this with a weird combination of monkey patching and `pthread_self()` (effectively patching
|
|
101
|
+
every `Thread` to run `pthread_self()` at initialization time and stash that value somewhere), but this had a number
|
|
102
|
+
of downsides.
|
|
103
|
+
|
|
104
|
+
The approach we use in the profiling native extension is to reach inside the internal structure of the `Thread` object,
|
|
105
|
+
and extract the `pthread_t` that Ruby itself keeps, but does not expose. This is implemented in the `pthread_id_for()`
|
|
106
|
+
function in `private_vm_api_acccess.c`. Thus, using this trick we can at any point in execution go from a `Thread`
|
|
107
|
+
object into the `clockid_t` that we need.
|
|
108
|
+
|
|
109
|
+
Note that `pthread_getcpuclockid()` is not available on macOS (nor, obviously, on Windows), and hence this feature
|
|
110
|
+
is currently Linux-specific. Thus, in the <clock_id_from_pthread.c> file we implement the feature for supported Ruby
|
|
111
|
+
setups but if something is missing we instead compile in <clock_id_noop.c> that includes a no-op implementation of the
|
|
112
|
+
feature.
|
|
@@ -0,0 +1,44 @@
|
|
|
1
|
+
#include "extconf.h"
|
|
2
|
+
|
|
3
|
+
// This file is only compiled on systems where pthread_getcpuclockid() is available;
|
|
4
|
+
// Otherwise we compile clock_id_noop.c
|
|
5
|
+
#ifdef HAVE_PTHREAD_GETCPUCLOCKID
|
|
6
|
+
|
|
7
|
+
#include <pthread.h>
|
|
8
|
+
#include <time.h>
|
|
9
|
+
#include <errno.h>
|
|
10
|
+
|
|
11
|
+
#include <ruby.h>
|
|
12
|
+
#include "private_vm_api_access.h"
|
|
13
|
+
#include "clock_id.h"
|
|
14
|
+
|
|
15
|
+
// Validate that our home-cooked pthread_id_for() matches pthread_self() for the current thread
|
|
16
|
+
void self_test_clock_id() {
|
|
17
|
+
rb_nativethread_id_t expected_pthread_id = pthread_self();
|
|
18
|
+
rb_nativethread_id_t actual_pthread_id = pthread_id_for(rb_thread_current());
|
|
19
|
+
|
|
20
|
+
if (expected_pthread_id != actual_pthread_id) rb_raise(rb_eRuntimeError, "pthread_id_for() self-test failed");
|
|
21
|
+
}
|
|
22
|
+
|
|
23
|
+
VALUE clock_id_for(VALUE self, VALUE thread) {
|
|
24
|
+
rb_nativethread_id_t thread_id = pthread_id_for(thread);
|
|
25
|
+
|
|
26
|
+
clockid_t clock_id;
|
|
27
|
+
int error = pthread_getcpuclockid(thread_id, &clock_id);
|
|
28
|
+
|
|
29
|
+
if (error == 0) {
|
|
30
|
+
return CLOCKID2NUM(clock_id);
|
|
31
|
+
} else {
|
|
32
|
+
switch(error) {
|
|
33
|
+
// The more specific error messages are based on the pthread_getcpuclockid(3) man page
|
|
34
|
+
case ENOENT:
|
|
35
|
+
rb_exc_raise(rb_syserr_new(error, "Failed to get clock_id for given thread: Per-thread CPU time clocks are not supported by the system."));
|
|
36
|
+
case ESRCH:
|
|
37
|
+
rb_exc_raise(rb_syserr_new(error, "Failed to get clock_id for given thread: No thread could be found."));
|
|
38
|
+
default:
|
|
39
|
+
rb_exc_raise(rb_syserr_new(error, "Failed to get clock_id for given thread"));
|
|
40
|
+
}
|
|
41
|
+
}
|
|
42
|
+
}
|
|
43
|
+
|
|
44
|
+
#endif
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
#include "extconf.h"
|
|
2
|
+
|
|
3
|
+
// This file is the dual of clock_id_from_pthread.c for systems where that info
|
|
4
|
+
// is not available.
|
|
5
|
+
#ifndef HAVE_PTHREAD_GETCPUCLOCKID
|
|
6
|
+
|
|
7
|
+
#include <ruby.h>
|
|
8
|
+
|
|
9
|
+
#include "clock_id.h"
|
|
10
|
+
|
|
11
|
+
void self_test_clock_id() { } // Nothing to check
|
|
12
|
+
VALUE clock_id_for(VALUE self, VALUE thread) { return Qnil; } // Nothing to return
|
|
13
|
+
|
|
14
|
+
#endif
|
|
@@ -0,0 +1,278 @@
|
|
|
1
|
+
#include <ruby.h>
|
|
2
|
+
#include <ruby/debug.h>
|
|
3
|
+
#include "extconf.h"
|
|
4
|
+
#include "libddprof_helpers.h"
|
|
5
|
+
#include "private_vm_api_access.h"
|
|
6
|
+
#include "stack_recorder.h"
|
|
7
|
+
|
|
8
|
+
// Gathers stack traces from running threads, storing them in a StackRecorder instance
|
|
9
|
+
// This file implements the native bits of the Datadog::Profiling::Collectors::Stack class
|
|
10
|
+
|
|
11
|
+
#define MAX_FRAMES_LIMIT 10000
|
|
12
|
+
#define MAX_FRAMES_LIMIT_AS_STRING "10000"
|
|
13
|
+
|
|
14
|
+
static VALUE missing_string = Qnil;
|
|
15
|
+
|
|
16
|
+
// Used as scratch space during sampling
|
|
17
|
+
typedef struct sampling_buffer {
|
|
18
|
+
unsigned int max_frames;
|
|
19
|
+
VALUE *stack_buffer;
|
|
20
|
+
int *lines_buffer;
|
|
21
|
+
bool *is_ruby_frame;
|
|
22
|
+
ddprof_ffi_Location *locations;
|
|
23
|
+
ddprof_ffi_Line *lines;
|
|
24
|
+
} sampling_buffer;
|
|
25
|
+
|
|
26
|
+
static VALUE _native_sample(VALUE self, VALUE thread, VALUE recorder_instance, VALUE metric_values_hash, VALUE labels_array, VALUE max_frames);
|
|
27
|
+
void sample(VALUE thread, sampling_buffer* buffer, VALUE recorder_instance, ddprof_ffi_Slice_i64 metric_values, ddprof_ffi_Slice_label labels);
|
|
28
|
+
void maybe_add_placeholder_frames_omitted(VALUE thread, sampling_buffer* buffer, char *frames_omitted_message, int frames_omitted_message_size);
|
|
29
|
+
void record_placeholder_stack_in_native_code(VALUE recorder_instance, ddprof_ffi_Slice_i64 metric_values, ddprof_ffi_Slice_label labels);
|
|
30
|
+
sampling_buffer *sampling_buffer_new(unsigned int max_frames);
|
|
31
|
+
void sampling_buffer_free(sampling_buffer *buffer);
|
|
32
|
+
|
|
33
|
+
void collectors_stack_init(VALUE profiling_module) {
|
|
34
|
+
VALUE collectors_module = rb_define_module_under(profiling_module, "Collectors");
|
|
35
|
+
VALUE collectors_stack_class = rb_define_class_under(collectors_module, "Stack", rb_cObject);
|
|
36
|
+
|
|
37
|
+
rb_define_singleton_method(collectors_stack_class, "_native_sample", _native_sample, 5);
|
|
38
|
+
|
|
39
|
+
missing_string = rb_str_new2("");
|
|
40
|
+
rb_global_variable(&missing_string);
|
|
41
|
+
}
|
|
42
|
+
|
|
43
|
+
// This method exists only to enable testing Collectors::Stack behavior using RSpec.
|
|
44
|
+
// It SHOULD NOT be used for other purposes.
|
|
45
|
+
static VALUE _native_sample(VALUE self, VALUE thread, VALUE recorder_instance, VALUE metric_values_hash, VALUE labels_array, VALUE max_frames) {
|
|
46
|
+
Check_Type(metric_values_hash, T_HASH);
|
|
47
|
+
Check_Type(labels_array, T_ARRAY);
|
|
48
|
+
|
|
49
|
+
if (RHASH_SIZE(metric_values_hash) != ENABLED_VALUE_TYPES_COUNT) {
|
|
50
|
+
rb_raise(
|
|
51
|
+
rb_eArgError,
|
|
52
|
+
"Mismatched values for metrics; expected %lu values and got %lu instead",
|
|
53
|
+
ENABLED_VALUE_TYPES_COUNT,
|
|
54
|
+
RHASH_SIZE(metric_values_hash)
|
|
55
|
+
);
|
|
56
|
+
}
|
|
57
|
+
|
|
58
|
+
int64_t metric_values[ENABLED_VALUE_TYPES_COUNT];
|
|
59
|
+
for (unsigned int i = 0; i < ENABLED_VALUE_TYPES_COUNT; i++) {
|
|
60
|
+
VALUE metric_value = rb_hash_fetch(metric_values_hash, rb_str_new_cstr(enabled_value_types[i].type_.ptr));
|
|
61
|
+
metric_values[i] = NUM2LONG(metric_value);
|
|
62
|
+
}
|
|
63
|
+
|
|
64
|
+
long labels_count = RARRAY_LEN(labels_array);
|
|
65
|
+
ddprof_ffi_Label labels[labels_count];
|
|
66
|
+
|
|
67
|
+
for (int i = 0; i < labels_count; i++) {
|
|
68
|
+
VALUE key_str_pair = rb_ary_entry(labels_array, i);
|
|
69
|
+
|
|
70
|
+
labels[i] = (ddprof_ffi_Label) {
|
|
71
|
+
.key = char_slice_from_ruby_string(rb_ary_entry(key_str_pair, 0)),
|
|
72
|
+
.str = char_slice_from_ruby_string(rb_ary_entry(key_str_pair, 1))
|
|
73
|
+
};
|
|
74
|
+
}
|
|
75
|
+
|
|
76
|
+
int max_frames_requested = NUM2INT(max_frames);
|
|
77
|
+
if (max_frames_requested < 0) rb_raise(rb_eArgError, "Invalid max_frames: value must not be negative");
|
|
78
|
+
|
|
79
|
+
sampling_buffer *buffer = sampling_buffer_new(max_frames_requested);
|
|
80
|
+
|
|
81
|
+
sample(
|
|
82
|
+
thread,
|
|
83
|
+
buffer,
|
|
84
|
+
recorder_instance,
|
|
85
|
+
(ddprof_ffi_Slice_i64) {.ptr = metric_values, .len = ENABLED_VALUE_TYPES_COUNT},
|
|
86
|
+
(ddprof_ffi_Slice_label) {.ptr = labels, .len = labels_count}
|
|
87
|
+
);
|
|
88
|
+
|
|
89
|
+
sampling_buffer_free(buffer);
|
|
90
|
+
|
|
91
|
+
return Qtrue;
|
|
92
|
+
}
|
|
93
|
+
|
|
94
|
+
void sample(VALUE thread, sampling_buffer* buffer, VALUE recorder_instance, ddprof_ffi_Slice_i64 metric_values, ddprof_ffi_Slice_label labels) {
|
|
95
|
+
int captured_frames = ddtrace_rb_profile_frames(
|
|
96
|
+
thread,
|
|
97
|
+
0 /* stack starting depth */,
|
|
98
|
+
buffer->max_frames,
|
|
99
|
+
buffer->stack_buffer,
|
|
100
|
+
buffer->lines_buffer,
|
|
101
|
+
buffer->is_ruby_frame
|
|
102
|
+
);
|
|
103
|
+
|
|
104
|
+
// Idea: Should we release the global vm lock (GVL) after we get the data from `rb_profile_frames`? That way other Ruby threads
|
|
105
|
+
// could continue making progress while the sample was ingested into the profile.
|
|
106
|
+
//
|
|
107
|
+
// Other things to take into consideration if we go in that direction:
|
|
108
|
+
// * Is it safe to call `rb_profile_frame_...` methods on things from the `stack_buffer` without the GVL acquired?
|
|
109
|
+
// * We need to make `VALUE` references in the `stack_buffer` visible to the Ruby GC
|
|
110
|
+
// * Should we move this into a different thread entirely?
|
|
111
|
+
// * If we don't move it into a different thread, does releasing the GVL on a Ruby thread mean that we're introducing
|
|
112
|
+
// a new thread switch point where there previously was none?
|
|
113
|
+
|
|
114
|
+
// Ruby does not give us path and line number for methods implemented using native code.
|
|
115
|
+
// The convention in Kernel#caller_locations is to instead use the path and line number of the first Ruby frame
|
|
116
|
+
// on the stack that is below (e.g. directly or indirectly has called) the native method.
|
|
117
|
+
// Thus, we keep that frame here to able to replicate that behavior.
|
|
118
|
+
// (This is why we also iterate the sampling buffers backwards below -- so that it's easier to keep the last_ruby_frame)
|
|
119
|
+
VALUE last_ruby_frame = Qnil;
|
|
120
|
+
int last_ruby_line = 0;
|
|
121
|
+
|
|
122
|
+
if (captured_frames == PLACEHOLDER_STACK_IN_NATIVE_CODE) {
|
|
123
|
+
record_placeholder_stack_in_native_code(recorder_instance, metric_values, labels);
|
|
124
|
+
return;
|
|
125
|
+
}
|
|
126
|
+
|
|
127
|
+
for (int i = captured_frames - 1; i >= 0; i--) {
|
|
128
|
+
VALUE name, filename;
|
|
129
|
+
int line;
|
|
130
|
+
|
|
131
|
+
if (buffer->is_ruby_frame[i]) {
|
|
132
|
+
last_ruby_frame = buffer->stack_buffer[i];
|
|
133
|
+
last_ruby_line = buffer->lines_buffer[i];
|
|
134
|
+
|
|
135
|
+
name = rb_profile_frame_base_label(buffer->stack_buffer[i]);
|
|
136
|
+
filename = rb_profile_frame_path(buffer->stack_buffer[i]);
|
|
137
|
+
line = buffer->lines_buffer[i];
|
|
138
|
+
} else {
|
|
139
|
+
// **IMPORTANT**: Be very careful when calling any `rb_profile_frame_...` API with a non-Ruby frame, as legacy
|
|
140
|
+
// Rubies may assume that what's in a buffer will lead to a Ruby frame.
|
|
141
|
+
//
|
|
142
|
+
// In particular for Ruby 2.2 and below the buffer contains a Ruby string (see the notes on our custom
|
|
143
|
+
// rb_profile_frames for Ruby 2.2 and below) and CALLING **ANY** OF THOSE APIs ON IT WILL CAUSE INSTANT VM CRASHES
|
|
144
|
+
|
|
145
|
+
#ifndef USE_LEGACY_RB_PROFILE_FRAMES // Modern Rubies
|
|
146
|
+
name = ddtrace_rb_profile_frame_method_name(buffer->stack_buffer[i]);
|
|
147
|
+
#else // Ruby < 2.3
|
|
148
|
+
name = buffer->stack_buffer[i];
|
|
149
|
+
#endif
|
|
150
|
+
|
|
151
|
+
filename = NIL_P(last_ruby_frame) ? Qnil : rb_profile_frame_path(last_ruby_frame);
|
|
152
|
+
line = last_ruby_line;
|
|
153
|
+
}
|
|
154
|
+
|
|
155
|
+
name = NIL_P(name) ? missing_string : name;
|
|
156
|
+
filename = NIL_P(filename) ? missing_string : filename;
|
|
157
|
+
|
|
158
|
+
buffer->lines[i] = (ddprof_ffi_Line) {
|
|
159
|
+
.function = (ddprof_ffi_Function) {
|
|
160
|
+
.name = char_slice_from_ruby_string(name),
|
|
161
|
+
.filename = char_slice_from_ruby_string(filename)
|
|
162
|
+
},
|
|
163
|
+
.line = line,
|
|
164
|
+
};
|
|
165
|
+
|
|
166
|
+
buffer->locations[i] = (ddprof_ffi_Location) {.lines = (ddprof_ffi_Slice_line) {.ptr = &buffer->lines[i], .len = 1}};
|
|
167
|
+
}
|
|
168
|
+
|
|
169
|
+
// Used below; since we want to stack-allocate this, we must do it here rather than in maybe_add_placeholder_frames_omitted
|
|
170
|
+
const int frames_omitted_message_size = sizeof(MAX_FRAMES_LIMIT_AS_STRING " frames omitted");
|
|
171
|
+
char frames_omitted_message[frames_omitted_message_size];
|
|
172
|
+
|
|
173
|
+
// If we filled up the buffer, some frames may have been omitted. In that case, we'll add a placeholder frame
|
|
174
|
+
// with that info.
|
|
175
|
+
if (captured_frames == (long) buffer->max_frames) {
|
|
176
|
+
maybe_add_placeholder_frames_omitted(thread, buffer, frames_omitted_message, frames_omitted_message_size);
|
|
177
|
+
}
|
|
178
|
+
|
|
179
|
+
record_sample(
|
|
180
|
+
recorder_instance,
|
|
181
|
+
(ddprof_ffi_Sample) {
|
|
182
|
+
.locations = (ddprof_ffi_Slice_location) {.ptr = buffer->locations, .len = captured_frames},
|
|
183
|
+
.values = metric_values,
|
|
184
|
+
.labels = labels,
|
|
185
|
+
}
|
|
186
|
+
);
|
|
187
|
+
}
|
|
188
|
+
|
|
189
|
+
void maybe_add_placeholder_frames_omitted(VALUE thread, sampling_buffer* buffer, char *frames_omitted_message, int frames_omitted_message_size) {
|
|
190
|
+
ptrdiff_t frames_omitted = stack_depth_for(thread) - buffer->max_frames;
|
|
191
|
+
|
|
192
|
+
if (frames_omitted == 0) return; // Perfect fit!
|
|
193
|
+
|
|
194
|
+
// The placeholder frame takes over a space, so if 10 frames were left out and we consume one other space for the
|
|
195
|
+
// placeholder, then 11 frames are omitted in total
|
|
196
|
+
frames_omitted++;
|
|
197
|
+
|
|
198
|
+
snprintf(frames_omitted_message, frames_omitted_message_size, "%td frames omitted", frames_omitted);
|
|
199
|
+
|
|
200
|
+
// Important note: `frames_omitted_message` MUST have a lifetime that is at least as long as the call to
|
|
201
|
+
// `record_sample`. So be careful where it gets allocated. (We do have tests for this, at least!)
|
|
202
|
+
buffer->lines[buffer->max_frames - 1] = (ddprof_ffi_Line) {
|
|
203
|
+
.function = (ddprof_ffi_Function) {
|
|
204
|
+
.name = DDPROF_FFI_CHARSLICE_C(""),
|
|
205
|
+
.filename = ((ddprof_ffi_CharSlice) {.ptr = frames_omitted_message, .len = strlen(frames_omitted_message)})
|
|
206
|
+
},
|
|
207
|
+
.line = 0,
|
|
208
|
+
};
|
|
209
|
+
}
|
|
210
|
+
|
|
211
|
+
// Our custom rb_profile_frames returning PLACEHOLDER_STACK_IN_NATIVE_CODE is equivalent to when the
|
|
212
|
+
// Ruby `Thread#backtrace` API returns an empty array: we know that a thread is alive but we don't know what it's doing:
|
|
213
|
+
//
|
|
214
|
+
// 1. It can be starting up
|
|
215
|
+
// ```
|
|
216
|
+
// > Thread.new { sleep }.backtrace
|
|
217
|
+
// => [] # <-- note the thread hasn't actually started running sleep yet, we got there first
|
|
218
|
+
// ```
|
|
219
|
+
// 2. It can be running native code
|
|
220
|
+
// ```
|
|
221
|
+
// > t = Process.detach(fork { sleep })
|
|
222
|
+
// => #<Process::Waiter:0x00007ffe7285f7a0 run>
|
|
223
|
+
// > t.backtrace
|
|
224
|
+
// => [] # <-- this can happen even minutes later, e.g. it's not a race as in 1.
|
|
225
|
+
// ```
|
|
226
|
+
// This effect has been observed in threads created by the Iodine web server and the ffi gem,
|
|
227
|
+
// see for instance https://github.com/ffi/ffi/pull/883 and https://github.com/DataDog/dd-trace-rb/pull/1719 .
|
|
228
|
+
//
|
|
229
|
+
// To give customers visibility into these threads, rather than reporting an empty stack, we replace the empty stack
|
|
230
|
+
// with one containing a placeholder frame, so that these threads are properly represented in the UX.
|
|
231
|
+
void record_placeholder_stack_in_native_code(VALUE recorder_instance, ddprof_ffi_Slice_i64 metric_values, ddprof_ffi_Slice_label labels) {
|
|
232
|
+
ddprof_ffi_Line placeholder_stack_in_native_code_line = {
|
|
233
|
+
.function = (ddprof_ffi_Function) {
|
|
234
|
+
.name = DDPROF_FFI_CHARSLICE_C(""),
|
|
235
|
+
.filename = DDPROF_FFI_CHARSLICE_C("In native code")
|
|
236
|
+
},
|
|
237
|
+
.line = 0
|
|
238
|
+
};
|
|
239
|
+
ddprof_ffi_Location placeholder_stack_in_native_code_location =
|
|
240
|
+
{.lines = (ddprof_ffi_Slice_line) {.ptr = &placeholder_stack_in_native_code_line, .len = 1}};
|
|
241
|
+
|
|
242
|
+
record_sample(
|
|
243
|
+
recorder_instance,
|
|
244
|
+
(ddprof_ffi_Sample) {
|
|
245
|
+
.locations = (ddprof_ffi_Slice_location) {.ptr = &placeholder_stack_in_native_code_location, .len = 1},
|
|
246
|
+
.values = metric_values,
|
|
247
|
+
.labels = labels,
|
|
248
|
+
}
|
|
249
|
+
);
|
|
250
|
+
}
|
|
251
|
+
|
|
252
|
+
sampling_buffer *sampling_buffer_new(unsigned int max_frames) {
|
|
253
|
+
if (max_frames < 5) rb_raise(rb_eArgError, "Invalid max_frames: value must be >= 5");
|
|
254
|
+
if (max_frames > MAX_FRAMES_LIMIT) rb_raise(rb_eArgError, "Invalid max_frames: value must be <= " MAX_FRAMES_LIMIT_AS_STRING);
|
|
255
|
+
|
|
256
|
+
// Note: never returns NULL; if out of memory, it calls the Ruby out-of-memory handlers
|
|
257
|
+
sampling_buffer* buffer = ruby_xcalloc(1, sizeof(sampling_buffer));
|
|
258
|
+
|
|
259
|
+
buffer->max_frames = max_frames;
|
|
260
|
+
|
|
261
|
+
buffer->stack_buffer = ruby_xcalloc(max_frames, sizeof(VALUE));
|
|
262
|
+
buffer->lines_buffer = ruby_xcalloc(max_frames, sizeof(int));
|
|
263
|
+
buffer->is_ruby_frame = ruby_xcalloc(max_frames, sizeof(bool));
|
|
264
|
+
buffer->locations = ruby_xcalloc(max_frames, sizeof(ddprof_ffi_Location));
|
|
265
|
+
buffer->lines = ruby_xcalloc(max_frames, sizeof(ddprof_ffi_Line));
|
|
266
|
+
|
|
267
|
+
return buffer;
|
|
268
|
+
}
|
|
269
|
+
|
|
270
|
+
void sampling_buffer_free(sampling_buffer *buffer) {
|
|
271
|
+
ruby_xfree(buffer->stack_buffer);
|
|
272
|
+
ruby_xfree(buffer->lines_buffer);
|
|
273
|
+
ruby_xfree(buffer->is_ruby_frame);
|
|
274
|
+
ruby_xfree(buffer->locations);
|
|
275
|
+
ruby_xfree(buffer->lines);
|
|
276
|
+
|
|
277
|
+
ruby_xfree(buffer);
|
|
278
|
+
}
|