ddtrace 1.9.0 → 1.10.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- data/CHANGELOG.md +63 -2
- data/ext/ddtrace_profiling_loader/extconf.rb +0 -2
- data/ext/ddtrace_profiling_native_extension/collectors_cpu_and_wall_time_worker.c +81 -36
- data/ext/ddtrace_profiling_native_extension/collectors_idle_sampling_helper.c +3 -3
- data/ext/ddtrace_profiling_native_extension/collectors_stack.c +37 -48
- data/ext/ddtrace_profiling_native_extension/collectors_stack.h +3 -1
- data/ext/ddtrace_profiling_native_extension/{collectors_cpu_and_wall_time.c → collectors_thread_context.c} +222 -143
- data/ext/ddtrace_profiling_native_extension/collectors_thread_context.h +14 -0
- data/ext/ddtrace_profiling_native_extension/extconf.rb +7 -18
- data/ext/ddtrace_profiling_native_extension/http_transport.c +25 -32
- data/ext/ddtrace_profiling_native_extension/libdatadog_helpers.h +9 -2
- data/ext/ddtrace_profiling_native_extension/native_extension_helpers.rb +9 -9
- data/ext/ddtrace_profiling_native_extension/private_vm_api_access.c +7 -121
- data/ext/ddtrace_profiling_native_extension/private_vm_api_access.h +1 -1
- data/ext/ddtrace_profiling_native_extension/profiling.c +2 -2
- data/ext/ddtrace_profiling_native_extension/ruby_helpers.c +2 -2
- data/ext/ddtrace_profiling_native_extension/ruby_helpers.h +1 -1
- data/ext/ddtrace_profiling_native_extension/stack_recorder.c +125 -21
- data/ext/ddtrace_profiling_native_extension/stack_recorder.h +9 -34
- data/lib/datadog/appsec/assets/waf_rules/recommended.json +321 -185
- data/lib/datadog/appsec/assets/waf_rules/strict.json +59 -2
- data/lib/datadog/appsec/assets.rb +0 -2
- data/lib/datadog/appsec/autoload.rb +4 -11
- data/lib/datadog/appsec/component.rb +41 -0
- data/lib/datadog/appsec/configuration/settings.rb +8 -3
- data/lib/datadog/appsec/configuration.rb +4 -2
- data/lib/datadog/appsec/contrib/auto_instrument.rb +0 -2
- data/lib/datadog/appsec/contrib/configuration/settings.rb +0 -2
- data/lib/datadog/appsec/contrib/integration.rb +0 -2
- data/lib/datadog/appsec/contrib/patcher.rb +0 -2
- data/lib/datadog/appsec/contrib/rack/configuration/settings.rb +0 -2
- data/lib/datadog/appsec/contrib/rack/ext.rb +0 -2
- data/lib/datadog/appsec/contrib/rack/gateway/request.rb +104 -0
- data/lib/datadog/appsec/contrib/rack/gateway/response.rb +30 -0
- data/lib/datadog/appsec/contrib/rack/gateway/watcher.rb +111 -109
- data/lib/datadog/appsec/contrib/rack/integration.rb +0 -2
- data/lib/datadog/appsec/contrib/rack/patcher.rb +2 -2
- data/lib/datadog/appsec/contrib/rack/reactive/request.rb +18 -21
- data/lib/datadog/appsec/contrib/rack/reactive/request_body.rb +10 -11
- data/lib/datadog/appsec/contrib/rack/reactive/response.rb +10 -11
- data/lib/datadog/appsec/contrib/rack/request_body_middleware.rb +6 -4
- data/lib/datadog/appsec/contrib/rack/request_middleware.rb +40 -26
- data/lib/datadog/appsec/contrib/rails/configuration/settings.rb +0 -2
- data/lib/datadog/appsec/contrib/rails/ext.rb +0 -2
- data/lib/datadog/appsec/contrib/rails/framework.rb +0 -2
- data/lib/datadog/appsec/contrib/rails/gateway/request.rb +67 -0
- data/lib/datadog/appsec/contrib/rails/gateway/watcher.rb +41 -37
- data/lib/datadog/appsec/contrib/rails/integration.rb +0 -2
- data/lib/datadog/appsec/contrib/rails/patcher.rb +3 -3
- data/lib/datadog/appsec/contrib/rails/reactive/action.rb +12 -11
- data/lib/datadog/appsec/contrib/rails/request.rb +0 -2
- data/lib/datadog/appsec/contrib/rails/request_middleware.rb +0 -2
- data/lib/datadog/appsec/contrib/sinatra/configuration/settings.rb +0 -2
- data/lib/datadog/appsec/contrib/sinatra/ext.rb +0 -2
- data/lib/datadog/appsec/contrib/sinatra/framework.rb +0 -2
- data/lib/datadog/appsec/contrib/sinatra/gateway/request.rb +17 -0
- data/lib/datadog/appsec/contrib/sinatra/gateway/route_params.rb +23 -0
- data/lib/datadog/appsec/contrib/sinatra/gateway/watcher.rb +76 -71
- data/lib/datadog/appsec/contrib/sinatra/integration.rb +0 -2
- data/lib/datadog/appsec/contrib/sinatra/patcher.rb +12 -4
- data/lib/datadog/appsec/contrib/sinatra/reactive/routed.rb +10 -9
- data/lib/datadog/appsec/contrib/sinatra/request_middleware.rb +0 -2
- data/lib/datadog/appsec/event.rb +4 -8
- data/lib/datadog/appsec/ext.rb +9 -0
- data/lib/datadog/appsec/extensions.rb +10 -2
- data/lib/datadog/appsec/instrumentation/gateway/argument.rb +24 -0
- data/lib/datadog/appsec/instrumentation/gateway.rb +11 -5
- data/lib/datadog/appsec/instrumentation.rb +9 -0
- data/lib/datadog/appsec/monitor/gateway/watcher.rb +86 -0
- data/lib/datadog/appsec/monitor/reactive/set_user.rb +61 -0
- data/lib/datadog/appsec/monitor.rb +11 -0
- data/lib/datadog/appsec/processor.rb +74 -25
- data/lib/datadog/appsec/rate_limiter.rb +0 -2
- data/lib/datadog/appsec/reactive/address_hash.rb +6 -2
- data/lib/datadog/appsec/reactive/engine.rb +10 -7
- data/lib/datadog/appsec/reactive/operation.rb +19 -2
- data/lib/datadog/appsec/reactive/subscriber.rb +2 -1
- data/lib/datadog/appsec/response.rb +0 -2
- data/lib/datadog/appsec/utils/http/media_range.rb +0 -2
- data/lib/datadog/appsec/utils/http/media_type.rb +0 -2
- data/lib/datadog/appsec.rb +20 -2
- data/lib/datadog/ci/configuration/components.rb +0 -2
- data/lib/datadog/ci/configuration/settings.rb +0 -2
- data/lib/datadog/ci/contrib/cucumber/configuration/settings.rb +0 -2
- data/lib/datadog/ci/contrib/cucumber/ext.rb +0 -2
- data/lib/datadog/ci/contrib/cucumber/formatter.rb +0 -2
- data/lib/datadog/ci/contrib/cucumber/instrumentation.rb +0 -2
- data/lib/datadog/ci/contrib/cucumber/integration.rb +0 -2
- data/lib/datadog/ci/contrib/cucumber/patcher.rb +0 -2
- data/lib/datadog/ci/contrib/rspec/configuration/settings.rb +0 -2
- data/lib/datadog/ci/contrib/rspec/example.rb +0 -2
- data/lib/datadog/ci/contrib/rspec/ext.rb +0 -2
- data/lib/datadog/ci/contrib/rspec/integration.rb +0 -2
- data/lib/datadog/ci/contrib/rspec/patcher.rb +0 -2
- data/lib/datadog/ci/ext/app_types.rb +0 -2
- data/lib/datadog/ci/ext/environment.rb +0 -4
- data/lib/datadog/ci/ext/settings.rb +0 -2
- data/lib/datadog/ci/ext/test.rb +0 -2
- data/lib/datadog/ci/extensions.rb +0 -2
- data/lib/datadog/ci/flush.rb +0 -2
- data/lib/datadog/ci/test.rb +0 -2
- data/lib/datadog/ci.rb +0 -2
- data/lib/datadog/core/buffer/cruby.rb +0 -2
- data/lib/datadog/core/buffer/random.rb +0 -2
- data/lib/datadog/core/buffer/thread_safe.rb +0 -2
- data/lib/datadog/core/chunker.rb +0 -2
- data/lib/datadog/core/configuration/agent_settings_resolver.rb +0 -17
- data/lib/datadog/core/configuration/base.rb +0 -2
- data/lib/datadog/core/configuration/components.rb +14 -318
- data/lib/datadog/core/configuration/dependency_resolver.rb +0 -2
- data/lib/datadog/core/configuration/ext.rb +0 -2
- data/lib/datadog/core/configuration/option.rb +0 -2
- data/lib/datadog/core/configuration/option_definition.rb +0 -2
- data/lib/datadog/core/configuration/option_definition_set.rb +0 -2
- data/lib/datadog/core/configuration/option_set.rb +0 -2
- data/lib/datadog/core/configuration/options.rb +0 -2
- data/lib/datadog/core/configuration/settings.rb +14 -5
- data/lib/datadog/core/configuration.rb +0 -4
- data/lib/datadog/core/diagnostics/environment_logger.rb +0 -2
- data/lib/datadog/core/diagnostics/health.rb +0 -2
- data/lib/datadog/core/encoding.rb +0 -4
- data/lib/datadog/core/environment/cgroup.rb +0 -4
- data/lib/datadog/core/environment/class_count.rb +0 -2
- data/lib/datadog/core/environment/container.rb +0 -4
- data/lib/datadog/core/environment/ext.rb +0 -2
- data/lib/datadog/core/environment/gc.rb +0 -2
- data/lib/datadog/core/environment/identity.rb +0 -2
- data/lib/datadog/core/environment/platform.rb +0 -2
- data/lib/datadog/core/environment/socket.rb +0 -2
- data/lib/datadog/core/environment/thread_count.rb +0 -2
- data/lib/datadog/core/environment/variable_helpers.rb +0 -2
- data/lib/datadog/core/environment/vm_cache.rb +17 -2
- data/lib/datadog/core/error.rb +0 -2
- data/lib/datadog/core/extensions.rb +0 -2
- data/lib/datadog/core/git/ext.rb +0 -2
- data/lib/datadog/core/logger.rb +0 -2
- data/lib/datadog/core/metrics/client.rb +0 -2
- data/lib/datadog/core/metrics/ext.rb +0 -2
- data/lib/datadog/core/metrics/helpers.rb +0 -2
- data/lib/datadog/core/metrics/logging.rb +0 -2
- data/lib/datadog/core/metrics/metric.rb +0 -2
- data/lib/datadog/core/metrics/options.rb +0 -2
- data/lib/datadog/core/pin.rb +0 -2
- data/lib/datadog/core/runtime/ext.rb +2 -2
- data/lib/datadog/core/runtime/metrics.rb +21 -7
- data/lib/datadog/core/telemetry/client.rb +0 -2
- data/lib/datadog/core/telemetry/collector.rb +0 -2
- data/lib/datadog/core/telemetry/emitter.rb +0 -2
- data/lib/datadog/core/telemetry/event.rb +0 -4
- data/lib/datadog/core/telemetry/ext.rb +0 -2
- data/lib/datadog/core/telemetry/heartbeat.rb +0 -2
- data/lib/datadog/core/telemetry/http/adapters/net.rb +0 -2
- data/lib/datadog/core/telemetry/http/env.rb +0 -2
- data/lib/datadog/core/telemetry/http/response.rb +0 -4
- data/lib/datadog/core/telemetry/http/transport.rb +0 -2
- data/lib/datadog/core/telemetry/v1/app_event.rb +0 -2
- data/lib/datadog/core/utils/compression.rb +0 -2
- data/lib/datadog/core/utils/forking.rb +0 -2
- data/lib/datadog/core/utils/object_set.rb +0 -2
- data/lib/datadog/core/utils/only_once.rb +0 -2
- data/lib/datadog/core/utils/safe_dup.rb +0 -2
- data/lib/datadog/core/utils/sequence.rb +0 -2
- data/lib/datadog/core/utils/string_table.rb +0 -2
- data/lib/datadog/core/utils/time.rb +0 -4
- data/lib/datadog/core/utils.rb +0 -2
- data/lib/datadog/core/vendor/multipart-post/multipart/post/composite_read_io.rb +0 -2
- data/lib/datadog/core/vendor/multipart-post/multipart/post/multipartable.rb +0 -2
- data/lib/datadog/core/vendor/multipart-post/multipart/post/parts.rb +0 -2
- data/lib/datadog/core/vendor/multipart-post/multipart/post/version.rb +0 -2
- data/lib/datadog/core/vendor/multipart-post/multipart/post.rb +0 -2
- data/lib/datadog/core/vendor/multipart-post/multipart.rb +0 -2
- data/lib/datadog/core/vendor/multipart-post/net/http/post/multipart.rb +0 -2
- data/lib/datadog/core/worker.rb +0 -2
- data/lib/datadog/core/workers/async.rb +0 -2
- data/lib/datadog/core/workers/interval_loop.rb +0 -2
- data/lib/datadog/core/workers/polling.rb +0 -2
- data/lib/datadog/core/workers/queue.rb +0 -2
- data/lib/datadog/core/workers/runtime_metrics.rb +0 -2
- data/lib/datadog/core.rb +0 -1
- data/lib/datadog/kit/appsec/events.rb +0 -1
- data/lib/datadog/kit/enable_core_dumps.rb +5 -6
- data/lib/datadog/kit/identity.rb +7 -1
- data/lib/datadog/kit.rb +0 -2
- data/lib/datadog/opentelemetry/api/context.rb +0 -1
- data/lib/datadog/opentelemetry/api/trace/span.rb +0 -1
- data/lib/datadog/opentelemetry/sdk/configurator.rb +0 -1
- data/lib/datadog/opentelemetry/sdk/id_generator.rb +0 -1
- data/lib/datadog/opentelemetry/sdk/propagator.rb +0 -1
- data/lib/datadog/opentelemetry/sdk/span_processor.rb +0 -1
- data/lib/datadog/opentelemetry.rb +0 -1
- data/lib/datadog/opentracer/binary_propagator.rb +0 -2
- data/lib/datadog/opentracer/carrier.rb +0 -2
- data/lib/datadog/opentracer/distributed_headers.rb +0 -2
- data/lib/datadog/opentracer/global_tracer.rb +0 -2
- data/lib/datadog/opentracer/propagator.rb +0 -2
- data/lib/datadog/opentracer/rack_propagator.rb +0 -2
- data/lib/datadog/opentracer/scope.rb +0 -2
- data/lib/datadog/opentracer/scope_manager.rb +0 -2
- data/lib/datadog/opentracer/span.rb +0 -2
- data/lib/datadog/opentracer/span_context.rb +0 -2
- data/lib/datadog/opentracer/span_context_factory.rb +0 -2
- data/lib/datadog/opentracer/text_map_propagator.rb +0 -2
- data/lib/datadog/opentracer/thread_local_scope.rb +0 -2
- data/lib/datadog/opentracer/thread_local_scope_manager.rb +0 -2
- data/lib/datadog/opentracer/tracer.rb +0 -2
- data/lib/datadog/opentracer.rb +0 -2
- data/lib/datadog/profiling/backtrace_location.rb +0 -2
- data/lib/datadog/profiling/buffer.rb +0 -2
- data/lib/datadog/profiling/collectors/code_provenance.rb +0 -2
- data/lib/datadog/profiling/collectors/cpu_and_wall_time_worker.rb +12 -7
- data/lib/datadog/profiling/collectors/dynamic_sampling_rate.rb +0 -2
- data/lib/datadog/profiling/collectors/idle_sampling_helper.rb +1 -3
- data/lib/datadog/profiling/collectors/old_stack.rb +1 -5
- data/lib/datadog/profiling/collectors/stack.rb +0 -2
- data/lib/datadog/profiling/collectors/{cpu_and_wall_time.rb → thread_context.rb} +8 -5
- data/lib/datadog/profiling/component.rb +161 -0
- data/lib/datadog/profiling/encoding/profile.rb +0 -2
- data/lib/datadog/profiling/event.rb +0 -2
- data/lib/datadog/profiling/events/stack.rb +0 -2
- data/lib/datadog/profiling/exporter.rb +0 -2
- data/lib/datadog/profiling/ext/forking.rb +0 -2
- data/lib/datadog/profiling/ext.rb +0 -2
- data/lib/datadog/profiling/flush.rb +0 -2
- data/lib/datadog/profiling/http_transport.rb +0 -2
- data/lib/datadog/profiling/load_native_extension.rb +0 -2
- data/lib/datadog/profiling/native_extension.rb +0 -2
- data/lib/datadog/profiling/old_recorder.rb +0 -2
- data/lib/datadog/profiling/pprof/builder.rb +0 -2
- data/lib/datadog/profiling/pprof/converter.rb +0 -2
- data/lib/datadog/profiling/pprof/message_set.rb +0 -2
- data/lib/datadog/profiling/pprof/payload.rb +0 -2
- data/lib/datadog/profiling/pprof/pprof_pb.rb +0 -2
- data/lib/datadog/profiling/pprof/stack_sample.rb +0 -2
- data/lib/datadog/profiling/pprof/string_table.rb +0 -2
- data/lib/datadog/profiling/pprof/template.rb +0 -2
- data/lib/datadog/profiling/preload.rb +0 -2
- data/lib/datadog/profiling/profiler.rb +0 -2
- data/lib/datadog/profiling/scheduler.rb +0 -2
- data/lib/datadog/profiling/stack_recorder.rb +3 -8
- data/lib/datadog/profiling/tag_builder.rb +0 -2
- data/lib/datadog/profiling/tasks/exec.rb +0 -2
- data/lib/datadog/profiling/tasks/help.rb +0 -2
- data/lib/datadog/profiling/tasks/setup.rb +0 -2
- data/lib/datadog/profiling/trace_identifiers/ddtrace.rb +0 -2
- data/lib/datadog/profiling/trace_identifiers/helper.rb +0 -2
- data/lib/datadog/profiling.rb +44 -7
- data/lib/datadog/tracing/analytics.rb +0 -2
- data/lib/datadog/tracing/buffer.rb +0 -4
- data/lib/datadog/tracing/client_ip.rb +0 -2
- data/lib/datadog/tracing/component.rb +176 -0
- data/lib/datadog/tracing/configuration/ext.rb +2 -2
- data/lib/datadog/tracing/configuration/settings.rb +20 -2
- data/lib/datadog/tracing/context.rb +0 -2
- data/lib/datadog/tracing/context_provider.rb +0 -2
- data/lib/datadog/tracing/contrib/action_cable/configuration/settings.rb +0 -2
- data/lib/datadog/tracing/contrib/action_cable/event.rb +0 -2
- data/lib/datadog/tracing/contrib/action_cable/events/broadcast.rb +0 -2
- data/lib/datadog/tracing/contrib/action_cable/events/perform_action.rb +0 -2
- data/lib/datadog/tracing/contrib/action_cable/events/transmit.rb +0 -2
- data/lib/datadog/tracing/contrib/action_cable/events.rb +0 -2
- data/lib/datadog/tracing/contrib/action_cable/ext.rb +0 -2
- data/lib/datadog/tracing/contrib/action_cable/instrumentation.rb +0 -2
- data/lib/datadog/tracing/contrib/action_cable/integration.rb +0 -2
- data/lib/datadog/tracing/contrib/action_cable/patcher.rb +0 -2
- data/lib/datadog/tracing/contrib/action_mailer/configuration/settings.rb +0 -2
- data/lib/datadog/tracing/contrib/action_mailer/event.rb +0 -2
- data/lib/datadog/tracing/contrib/action_mailer/events/deliver.rb +0 -2
- data/lib/datadog/tracing/contrib/action_mailer/events/process.rb +0 -2
- data/lib/datadog/tracing/contrib/action_mailer/events.rb +0 -2
- data/lib/datadog/tracing/contrib/action_mailer/ext.rb +0 -2
- data/lib/datadog/tracing/contrib/action_mailer/integration.rb +0 -2
- data/lib/datadog/tracing/contrib/action_mailer/patcher.rb +0 -2
- data/lib/datadog/tracing/contrib/action_pack/action_controller/instrumentation.rb +0 -2
- data/lib/datadog/tracing/contrib/action_pack/action_controller/patcher.rb +0 -2
- data/lib/datadog/tracing/contrib/action_pack/configuration/settings.rb +0 -2
- data/lib/datadog/tracing/contrib/action_pack/ext.rb +0 -2
- data/lib/datadog/tracing/contrib/action_pack/integration.rb +0 -2
- data/lib/datadog/tracing/contrib/action_pack/patcher.rb +0 -2
- data/lib/datadog/tracing/contrib/action_pack/utils.rb +0 -2
- data/lib/datadog/tracing/contrib/action_view/configuration/settings.rb +0 -2
- data/lib/datadog/tracing/contrib/action_view/event.rb +0 -2
- data/lib/datadog/tracing/contrib/action_view/events/render_partial.rb +0 -2
- data/lib/datadog/tracing/contrib/action_view/events/render_template.rb +0 -2
- data/lib/datadog/tracing/contrib/action_view/events.rb +0 -2
- data/lib/datadog/tracing/contrib/action_view/ext.rb +0 -2
- data/lib/datadog/tracing/contrib/action_view/instrumentation/partial_renderer.rb +0 -2
- data/lib/datadog/tracing/contrib/action_view/instrumentation/template_renderer.rb +0 -2
- data/lib/datadog/tracing/contrib/action_view/integration.rb +0 -2
- data/lib/datadog/tracing/contrib/action_view/patcher.rb +0 -2
- data/lib/datadog/tracing/contrib/action_view/utils.rb +0 -2
- data/lib/datadog/tracing/contrib/active_job/configuration/settings.rb +0 -2
- data/lib/datadog/tracing/contrib/active_job/event.rb +0 -2
- data/lib/datadog/tracing/contrib/active_job/events/discard.rb +0 -2
- data/lib/datadog/tracing/contrib/active_job/events/enqueue.rb +0 -2
- data/lib/datadog/tracing/contrib/active_job/events/enqueue_at.rb +0 -2
- data/lib/datadog/tracing/contrib/active_job/events/enqueue_retry.rb +0 -2
- data/lib/datadog/tracing/contrib/active_job/events/perform.rb +0 -2
- data/lib/datadog/tracing/contrib/active_job/events/retry_stopped.rb +0 -2
- data/lib/datadog/tracing/contrib/active_job/events.rb +0 -2
- data/lib/datadog/tracing/contrib/active_job/ext.rb +0 -2
- data/lib/datadog/tracing/contrib/active_job/integration.rb +0 -2
- data/lib/datadog/tracing/contrib/active_job/log_injection.rb +0 -2
- data/lib/datadog/tracing/contrib/active_job/patcher.rb +0 -2
- data/lib/datadog/tracing/contrib/active_model_serializers/configuration/settings.rb +0 -2
- data/lib/datadog/tracing/contrib/active_model_serializers/event.rb +0 -2
- data/lib/datadog/tracing/contrib/active_model_serializers/events/render.rb +0 -2
- data/lib/datadog/tracing/contrib/active_model_serializers/events/serialize.rb +0 -2
- data/lib/datadog/tracing/contrib/active_model_serializers/events.rb +0 -2
- data/lib/datadog/tracing/contrib/active_model_serializers/ext.rb +0 -2
- data/lib/datadog/tracing/contrib/active_model_serializers/integration.rb +0 -2
- data/lib/datadog/tracing/contrib/active_model_serializers/patcher.rb +0 -2
- data/lib/datadog/tracing/contrib/active_record/configuration/makara_resolver.rb +0 -2
- data/lib/datadog/tracing/contrib/active_record/configuration/resolver.rb +0 -2
- data/lib/datadog/tracing/contrib/active_record/configuration/settings.rb +0 -2
- data/lib/datadog/tracing/contrib/active_record/event.rb +0 -2
- data/lib/datadog/tracing/contrib/active_record/events/instantiation.rb +0 -2
- data/lib/datadog/tracing/contrib/active_record/events/sql.rb +0 -2
- data/lib/datadog/tracing/contrib/active_record/events.rb +0 -2
- data/lib/datadog/tracing/contrib/active_record/ext.rb +0 -2
- data/lib/datadog/tracing/contrib/active_record/integration.rb +0 -2
- data/lib/datadog/tracing/contrib/active_record/patcher.rb +0 -2
- data/lib/datadog/tracing/contrib/active_record/utils.rb +0 -2
- data/lib/datadog/tracing/contrib/active_record/vendor/connection_specification.rb +0 -2
- data/lib/datadog/tracing/contrib/active_support/cache/instrumentation.rb +0 -2
- data/lib/datadog/tracing/contrib/active_support/cache/patcher.rb +0 -2
- data/lib/datadog/tracing/contrib/active_support/cache/redis.rb +0 -2
- data/lib/datadog/tracing/contrib/active_support/configuration/settings.rb +0 -2
- data/lib/datadog/tracing/contrib/active_support/ext.rb +0 -2
- data/lib/datadog/tracing/contrib/active_support/integration.rb +0 -2
- data/lib/datadog/tracing/contrib/active_support/notifications/event.rb +0 -2
- data/lib/datadog/tracing/contrib/active_support/notifications/subscriber.rb +0 -2
- data/lib/datadog/tracing/contrib/active_support/notifications/subscription.rb +0 -2
- data/lib/datadog/tracing/contrib/active_support/patcher.rb +0 -2
- data/lib/datadog/tracing/contrib/analytics.rb +0 -2
- data/lib/datadog/tracing/contrib/auto_instrument.rb +0 -2
- data/lib/datadog/tracing/contrib/aws/configuration/settings.rb +0 -2
- data/lib/datadog/tracing/contrib/aws/ext.rb +0 -2
- data/lib/datadog/tracing/contrib/aws/instrumentation.rb +0 -2
- data/lib/datadog/tracing/contrib/aws/integration.rb +0 -2
- data/lib/datadog/tracing/contrib/aws/parsed_context.rb +0 -2
- data/lib/datadog/tracing/contrib/aws/patcher.rb +0 -2
- data/lib/datadog/tracing/contrib/aws/services.rb +0 -2
- data/lib/datadog/tracing/contrib/concurrent_ruby/configuration/settings.rb +0 -2
- data/lib/datadog/tracing/contrib/concurrent_ruby/context_composite_executor_service.rb +0 -2
- data/lib/datadog/tracing/contrib/concurrent_ruby/ext.rb +0 -2
- data/lib/datadog/tracing/contrib/concurrent_ruby/future_patch.rb +0 -2
- data/lib/datadog/tracing/contrib/concurrent_ruby/integration.rb +0 -2
- data/lib/datadog/tracing/contrib/concurrent_ruby/patcher.rb +0 -3
- data/lib/datadog/tracing/contrib/configurable.rb +0 -2
- data/lib/datadog/tracing/contrib/configuration/resolver.rb +0 -2
- data/lib/datadog/tracing/contrib/configuration/resolvers/pattern_resolver.rb +0 -2
- data/lib/datadog/tracing/contrib/configuration/settings.rb +0 -4
- data/lib/datadog/tracing/contrib/dalli/configuration/settings.rb +0 -2
- data/lib/datadog/tracing/contrib/dalli/ext.rb +0 -2
- data/lib/datadog/tracing/contrib/dalli/instrumentation.rb +2 -2
- data/lib/datadog/tracing/contrib/dalli/integration.rb +0 -2
- data/lib/datadog/tracing/contrib/dalli/patcher.rb +0 -2
- data/lib/datadog/tracing/contrib/dalli/quantize.rb +0 -2
- data/lib/datadog/tracing/contrib/delayed_job/configuration/settings.rb +0 -2
- data/lib/datadog/tracing/contrib/delayed_job/ext.rb +0 -2
- data/lib/datadog/tracing/contrib/delayed_job/integration.rb +0 -2
- data/lib/datadog/tracing/contrib/delayed_job/patcher.rb +0 -2
- data/lib/datadog/tracing/contrib/delayed_job/plugin.rb +4 -2
- data/lib/datadog/tracing/contrib/delayed_job/server_internal_tracer/worker.rb +2 -2
- data/lib/datadog/tracing/contrib/elasticsearch/configuration/settings.rb +0 -2
- data/lib/datadog/tracing/contrib/elasticsearch/ext.rb +0 -2
- data/lib/datadog/tracing/contrib/elasticsearch/integration.rb +0 -2
- data/lib/datadog/tracing/contrib/elasticsearch/patcher.rb +3 -4
- data/lib/datadog/tracing/contrib/elasticsearch/quantize.rb +0 -4
- data/lib/datadog/tracing/contrib/ethon/configuration/settings.rb +0 -2
- data/lib/datadog/tracing/contrib/ethon/easy_patch.rb +0 -2
- data/lib/datadog/tracing/contrib/ethon/ext.rb +0 -2
- data/lib/datadog/tracing/contrib/ethon/integration.rb +0 -2
- data/lib/datadog/tracing/contrib/ethon/multi_patch.rb +0 -2
- data/lib/datadog/tracing/contrib/ethon/patcher.rb +0 -3
- data/lib/datadog/tracing/contrib/excon/configuration/settings.rb +0 -2
- data/lib/datadog/tracing/contrib/excon/ext.rb +0 -2
- data/lib/datadog/tracing/contrib/excon/integration.rb +0 -2
- data/lib/datadog/tracing/contrib/excon/middleware.rb +0 -2
- data/lib/datadog/tracing/contrib/excon/patcher.rb +0 -2
- data/lib/datadog/tracing/contrib/ext.rb +5 -0
- data/lib/datadog/tracing/contrib/extensions.rb +0 -2
- data/lib/datadog/tracing/contrib/faraday/configuration/settings.rb +0 -2
- data/lib/datadog/tracing/contrib/faraday/connection.rb +0 -2
- data/lib/datadog/tracing/contrib/faraday/ext.rb +0 -2
- data/lib/datadog/tracing/contrib/faraday/integration.rb +0 -2
- data/lib/datadog/tracing/contrib/faraday/middleware.rb +0 -2
- data/lib/datadog/tracing/contrib/faraday/patcher.rb +0 -2
- data/lib/datadog/tracing/contrib/faraday/rack_builder.rb +0 -2
- data/lib/datadog/tracing/contrib/grape/configuration/settings.rb +0 -2
- data/lib/datadog/tracing/contrib/grape/endpoint.rb +0 -2
- data/lib/datadog/tracing/contrib/grape/ext.rb +0 -2
- data/lib/datadog/tracing/contrib/grape/instrumentation.rb +0 -2
- data/lib/datadog/tracing/contrib/grape/integration.rb +0 -2
- data/lib/datadog/tracing/contrib/grape/patcher.rb +0 -2
- data/lib/datadog/tracing/contrib/graphql/configuration/settings.rb +0 -2
- data/lib/datadog/tracing/contrib/graphql/ext.rb +0 -2
- data/lib/datadog/tracing/contrib/graphql/integration.rb +0 -2
- data/lib/datadog/tracing/contrib/graphql/patcher.rb +0 -2
- data/lib/datadog/tracing/contrib/grpc/configuration/settings.rb +0 -2
- data/lib/datadog/tracing/contrib/grpc/datadog_interceptor/client.rb +0 -2
- data/lib/datadog/tracing/contrib/grpc/datadog_interceptor/server.rb +0 -2
- data/lib/datadog/tracing/contrib/grpc/datadog_interceptor.rb +0 -2
- data/lib/datadog/tracing/contrib/grpc/distributed/fetcher.rb +0 -1
- data/lib/datadog/tracing/contrib/grpc/distributed/propagation.rb +0 -1
- data/lib/datadog/tracing/contrib/grpc/ext.rb +0 -2
- data/lib/datadog/tracing/contrib/grpc/integration.rb +8 -3
- data/lib/datadog/tracing/contrib/grpc/intercept_with_datadog.rb +0 -2
- data/lib/datadog/tracing/contrib/grpc/patcher.rb +0 -3
- data/lib/datadog/tracing/contrib/hanami/action_tracer.rb +0 -2
- data/lib/datadog/tracing/contrib/hanami/configuration/settings.rb +0 -2
- data/lib/datadog/tracing/contrib/hanami/ext.rb +0 -2
- data/lib/datadog/tracing/contrib/hanami/integration.rb +0 -2
- data/lib/datadog/tracing/contrib/hanami/patcher.rb +0 -2
- data/lib/datadog/tracing/contrib/hanami/plugin.rb +0 -2
- data/lib/datadog/tracing/contrib/hanami/renderer_policy_tracing.rb +0 -2
- data/lib/datadog/tracing/contrib/hanami/router_tracing.rb +0 -2
- data/lib/datadog/tracing/contrib/http/circuit_breaker.rb +0 -2
- data/lib/datadog/tracing/contrib/http/configuration/settings.rb +0 -2
- data/lib/datadog/tracing/contrib/http/distributed/fetcher.rb +0 -1
- data/lib/datadog/tracing/contrib/http/distributed/propagation.rb +0 -1
- data/lib/datadog/tracing/contrib/http/ext.rb +0 -2
- data/lib/datadog/tracing/contrib/http/instrumentation.rb +0 -2
- data/lib/datadog/tracing/contrib/http/integration.rb +0 -2
- data/lib/datadog/tracing/contrib/http/patcher.rb +0 -2
- data/lib/datadog/tracing/contrib/http_annotation_helper.rb +0 -2
- data/lib/datadog/tracing/contrib/httpclient/configuration/settings.rb +0 -2
- data/lib/datadog/tracing/contrib/httpclient/ext.rb +0 -2
- data/lib/datadog/tracing/contrib/httpclient/instrumentation.rb +0 -2
- data/lib/datadog/tracing/contrib/httpclient/integration.rb +0 -2
- data/lib/datadog/tracing/contrib/httpclient/patcher.rb +0 -2
- data/lib/datadog/tracing/contrib/httprb/configuration/settings.rb +0 -2
- data/lib/datadog/tracing/contrib/httprb/ext.rb +0 -2
- data/lib/datadog/tracing/contrib/httprb/instrumentation.rb +0 -2
- data/lib/datadog/tracing/contrib/httprb/integration.rb +0 -2
- data/lib/datadog/tracing/contrib/httprb/patcher.rb +0 -2
- data/lib/datadog/tracing/contrib/integration.rb +0 -2
- data/lib/datadog/tracing/contrib/kafka/configuration/settings.rb +0 -2
- data/lib/datadog/tracing/contrib/kafka/consumer_event.rb +0 -2
- data/lib/datadog/tracing/contrib/kafka/consumer_group_event.rb +0 -2
- data/lib/datadog/tracing/contrib/kafka/event.rb +1 -2
- data/lib/datadog/tracing/contrib/kafka/events/connection/request.rb +0 -2
- data/lib/datadog/tracing/contrib/kafka/events/consumer/process_batch.rb +0 -2
- data/lib/datadog/tracing/contrib/kafka/events/consumer/process_message.rb +0 -2
- data/lib/datadog/tracing/contrib/kafka/events/consumer_group/heartbeat.rb +0 -2
- data/lib/datadog/tracing/contrib/kafka/events/consumer_group/join_group.rb +0 -2
- data/lib/datadog/tracing/contrib/kafka/events/consumer_group/leave_group.rb +0 -2
- data/lib/datadog/tracing/contrib/kafka/events/consumer_group/sync_group.rb +0 -2
- data/lib/datadog/tracing/contrib/kafka/events/produce_operation/send_messages.rb +0 -2
- data/lib/datadog/tracing/contrib/kafka/events/producer/deliver_messages.rb +0 -2
- data/lib/datadog/tracing/contrib/kafka/events.rb +0 -2
- data/lib/datadog/tracing/contrib/kafka/ext.rb +1 -2
- data/lib/datadog/tracing/contrib/kafka/integration.rb +0 -2
- data/lib/datadog/tracing/contrib/kafka/patcher.rb +0 -2
- data/lib/datadog/tracing/contrib/lograge/configuration/settings.rb +0 -2
- data/lib/datadog/tracing/contrib/lograge/ext.rb +0 -2
- data/lib/datadog/tracing/contrib/lograge/instrumentation.rb +0 -2
- data/lib/datadog/tracing/contrib/lograge/integration.rb +0 -2
- data/lib/datadog/tracing/contrib/lograge/patcher.rb +0 -2
- data/lib/datadog/tracing/contrib/mongodb/configuration/settings.rb +0 -2
- data/lib/datadog/tracing/contrib/mongodb/ext.rb +0 -2
- data/lib/datadog/tracing/contrib/mongodb/instrumentation.rb +0 -2
- data/lib/datadog/tracing/contrib/mongodb/integration.rb +0 -2
- data/lib/datadog/tracing/contrib/mongodb/parsers.rb +0 -2
- data/lib/datadog/tracing/contrib/mongodb/patcher.rb +0 -2
- data/lib/datadog/tracing/contrib/mongodb/subscribers.rb +0 -2
- data/lib/datadog/tracing/contrib/mysql2/configuration/settings.rb +0 -2
- data/lib/datadog/tracing/contrib/mysql2/ext.rb +0 -2
- data/lib/datadog/tracing/contrib/mysql2/instrumentation.rb +0 -2
- data/lib/datadog/tracing/contrib/mysql2/integration.rb +0 -2
- data/lib/datadog/tracing/contrib/mysql2/patcher.rb +0 -2
- data/lib/datadog/tracing/contrib/patchable.rb +0 -2
- data/lib/datadog/tracing/contrib/patcher.rb +0 -2
- data/lib/datadog/tracing/contrib/pg/configuration/settings.rb +0 -2
- data/lib/datadog/tracing/contrib/pg/ext.rb +0 -2
- data/lib/datadog/tracing/contrib/pg/instrumentation.rb +0 -2
- data/lib/datadog/tracing/contrib/pg/integration.rb +0 -2
- data/lib/datadog/tracing/contrib/pg/patcher.rb +0 -2
- data/lib/datadog/tracing/contrib/presto/configuration/settings.rb +0 -2
- data/lib/datadog/tracing/contrib/presto/ext.rb +1 -2
- data/lib/datadog/tracing/contrib/presto/instrumentation.rb +3 -2
- data/lib/datadog/tracing/contrib/presto/integration.rb +0 -2
- data/lib/datadog/tracing/contrib/presto/patcher.rb +0 -2
- data/lib/datadog/tracing/contrib/propagation/sql_comment/comment.rb +0 -2
- data/lib/datadog/tracing/contrib/propagation/sql_comment/ext.rb +0 -2
- data/lib/datadog/tracing/contrib/propagation/sql_comment/mode.rb +0 -2
- data/lib/datadog/tracing/contrib/propagation/sql_comment.rb +0 -2
- data/lib/datadog/tracing/contrib/qless/configuration/settings.rb +0 -2
- data/lib/datadog/tracing/contrib/qless/ext.rb +0 -2
- data/lib/datadog/tracing/contrib/qless/integration.rb +0 -2
- data/lib/datadog/tracing/contrib/qless/patcher.rb +0 -3
- data/lib/datadog/tracing/contrib/qless/qless_job.rb +3 -2
- data/lib/datadog/tracing/contrib/qless/tracer_cleaner.rb +0 -2
- data/lib/datadog/tracing/contrib/que/configuration/settings.rb +0 -2
- data/lib/datadog/tracing/contrib/que/ext.rb +0 -2
- data/lib/datadog/tracing/contrib/que/integration.rb +0 -2
- data/lib/datadog/tracing/contrib/que/patcher.rb +0 -2
- data/lib/datadog/tracing/contrib/que/tracer.rb +2 -2
- data/lib/datadog/tracing/contrib/racecar/configuration/settings.rb +0 -2
- data/lib/datadog/tracing/contrib/racecar/event.rb +1 -2
- data/lib/datadog/tracing/contrib/racecar/events/batch.rb +0 -2
- data/lib/datadog/tracing/contrib/racecar/events/consume.rb +0 -2
- data/lib/datadog/tracing/contrib/racecar/events/message.rb +0 -2
- data/lib/datadog/tracing/contrib/racecar/events.rb +0 -2
- data/lib/datadog/tracing/contrib/racecar/ext.rb +1 -2
- data/lib/datadog/tracing/contrib/racecar/integration.rb +0 -2
- data/lib/datadog/tracing/contrib/racecar/patcher.rb +0 -2
- data/lib/datadog/tracing/contrib/rack/configuration/settings.rb +0 -2
- data/lib/datadog/tracing/contrib/rack/ext.rb +5 -2
- data/lib/datadog/tracing/contrib/rack/integration.rb +0 -2
- data/lib/datadog/tracing/contrib/rack/middlewares.rb +42 -18
- data/lib/datadog/tracing/contrib/rack/patcher.rb +0 -2
- data/lib/datadog/tracing/contrib/rack/request_queue.rb +0 -2
- data/lib/datadog/tracing/contrib/rails/auto_instrument_railtie.rb +0 -2
- data/lib/datadog/tracing/contrib/rails/configuration/settings.rb +0 -2
- data/lib/datadog/tracing/contrib/rails/ext.rb +0 -2
- data/lib/datadog/tracing/contrib/rails/framework.rb +0 -2
- data/lib/datadog/tracing/contrib/rails/integration.rb +0 -2
- data/lib/datadog/tracing/contrib/rails/log_injection.rb +0 -2
- data/lib/datadog/tracing/contrib/rails/middlewares.rb +0 -2
- data/lib/datadog/tracing/contrib/rails/patcher.rb +0 -2
- data/lib/datadog/tracing/contrib/rails/railtie.rb +0 -2
- data/lib/datadog/tracing/contrib/rails/utils.rb +0 -2
- data/lib/datadog/tracing/contrib/rake/configuration/settings.rb +0 -2
- data/lib/datadog/tracing/contrib/rake/ext.rb +0 -2
- data/lib/datadog/tracing/contrib/rake/instrumentation.rb +0 -2
- data/lib/datadog/tracing/contrib/rake/integration.rb +0 -2
- data/lib/datadog/tracing/contrib/rake/patcher.rb +0 -2
- data/lib/datadog/tracing/contrib/redis/configuration/resolver.rb +0 -2
- data/lib/datadog/tracing/contrib/redis/configuration/settings.rb +0 -2
- data/lib/datadog/tracing/contrib/redis/ext.rb +0 -2
- data/lib/datadog/tracing/contrib/redis/instrumentation.rb +0 -2
- data/lib/datadog/tracing/contrib/redis/integration.rb +0 -2
- data/lib/datadog/tracing/contrib/redis/patcher.rb +0 -2
- data/lib/datadog/tracing/contrib/redis/quantize.rb +0 -2
- data/lib/datadog/tracing/contrib/redis/tags.rb +0 -2
- data/lib/datadog/tracing/contrib/redis/trace_middleware.rb +0 -2
- data/lib/datadog/tracing/contrib/redis/vendor/resolver.rb +0 -2
- data/lib/datadog/tracing/contrib/registerable.rb +0 -2
- data/lib/datadog/tracing/contrib/registry.rb +0 -2
- data/lib/datadog/tracing/contrib/resque/configuration/settings.rb +0 -2
- data/lib/datadog/tracing/contrib/resque/ext.rb +0 -2
- data/lib/datadog/tracing/contrib/resque/integration.rb +0 -2
- data/lib/datadog/tracing/contrib/resque/patcher.rb +0 -2
- data/lib/datadog/tracing/contrib/resque/resque_job.rb +2 -2
- data/lib/datadog/tracing/contrib/rest_client/configuration/settings.rb +0 -2
- data/lib/datadog/tracing/contrib/rest_client/ext.rb +0 -2
- data/lib/datadog/tracing/contrib/rest_client/integration.rb +0 -2
- data/lib/datadog/tracing/contrib/rest_client/patcher.rb +0 -3
- data/lib/datadog/tracing/contrib/rest_client/request_patch.rb +0 -2
- data/lib/datadog/tracing/contrib/semantic_logger/configuration/settings.rb +0 -2
- data/lib/datadog/tracing/contrib/semantic_logger/ext.rb +0 -2
- data/lib/datadog/tracing/contrib/semantic_logger/instrumentation.rb +0 -2
- data/lib/datadog/tracing/contrib/semantic_logger/integration.rb +0 -2
- data/lib/datadog/tracing/contrib/semantic_logger/patcher.rb +0 -2
- data/lib/datadog/tracing/contrib/sequel/configuration/settings.rb +0 -2
- data/lib/datadog/tracing/contrib/sequel/database.rb +0 -2
- data/lib/datadog/tracing/contrib/sequel/dataset.rb +0 -2
- data/lib/datadog/tracing/contrib/sequel/ext.rb +0 -2
- data/lib/datadog/tracing/contrib/sequel/integration.rb +0 -2
- data/lib/datadog/tracing/contrib/sequel/patcher.rb +0 -2
- data/lib/datadog/tracing/contrib/sequel/utils.rb +0 -2
- data/lib/datadog/tracing/contrib/shoryuken/configuration/settings.rb +0 -2
- data/lib/datadog/tracing/contrib/shoryuken/ext.rb +1 -2
- data/lib/datadog/tracing/contrib/shoryuken/integration.rb +0 -2
- data/lib/datadog/tracing/contrib/shoryuken/patcher.rb +0 -2
- data/lib/datadog/tracing/contrib/shoryuken/tracer.rb +2 -2
- data/lib/datadog/tracing/contrib/sidekiq/client_tracer.rb +2 -2
- data/lib/datadog/tracing/contrib/sidekiq/configuration/settings.rb +0 -2
- data/lib/datadog/tracing/contrib/sidekiq/ext.rb +0 -2
- data/lib/datadog/tracing/contrib/sidekiq/integration.rb +0 -2
- data/lib/datadog/tracing/contrib/sidekiq/patcher.rb +0 -2
- data/lib/datadog/tracing/contrib/sidekiq/server_internal_tracer/heartbeat.rb +4 -2
- data/lib/datadog/tracing/contrib/sidekiq/server_internal_tracer/job_fetch.rb +2 -2
- data/lib/datadog/tracing/contrib/sidekiq/server_internal_tracer/redis_info.rb +2 -2
- data/lib/datadog/tracing/contrib/sidekiq/server_internal_tracer/scheduled_poller.rb +4 -2
- data/lib/datadog/tracing/contrib/sidekiq/server_tracer.rb +2 -2
- data/lib/datadog/tracing/contrib/sidekiq/tracing.rb +0 -2
- data/lib/datadog/tracing/contrib/sinatra/configuration/settings.rb +0 -2
- data/lib/datadog/tracing/contrib/sinatra/env.rb +0 -2
- data/lib/datadog/tracing/contrib/sinatra/ext.rb +0 -2
- data/lib/datadog/tracing/contrib/sinatra/framework.rb +0 -2
- data/lib/datadog/tracing/contrib/sinatra/headers.rb +0 -2
- data/lib/datadog/tracing/contrib/sinatra/integration.rb +0 -2
- data/lib/datadog/tracing/contrib/sinatra/patcher.rb +0 -3
- data/lib/datadog/tracing/contrib/sinatra/tracer.rb +0 -2
- data/lib/datadog/tracing/contrib/sinatra/tracer_middleware.rb +0 -2
- data/lib/datadog/tracing/contrib/sneakers/configuration/settings.rb +0 -2
- data/lib/datadog/tracing/contrib/sneakers/ext.rb +1 -2
- data/lib/datadog/tracing/contrib/sneakers/integration.rb +0 -2
- data/lib/datadog/tracing/contrib/sneakers/patcher.rb +0 -2
- data/lib/datadog/tracing/contrib/sneakers/tracer.rb +3 -2
- data/lib/datadog/tracing/contrib/status_code_matcher.rb +0 -2
- data/lib/datadog/tracing/contrib/stripe/patcher.rb +0 -1
- data/lib/datadog/tracing/contrib/sucker_punch/configuration/settings.rb +0 -2
- data/lib/datadog/tracing/contrib/sucker_punch/exception_handler.rb +0 -2
- data/lib/datadog/tracing/contrib/sucker_punch/ext.rb +0 -2
- data/lib/datadog/tracing/contrib/sucker_punch/instrumentation.rb +0 -2
- data/lib/datadog/tracing/contrib/sucker_punch/integration.rb +0 -2
- data/lib/datadog/tracing/contrib/sucker_punch/patcher.rb +0 -3
- data/lib/datadog/tracing/contrib/utils/database.rb +0 -2
- data/lib/datadog/tracing/contrib/utils/quantization/hash.rb +0 -2
- data/lib/datadog/tracing/contrib/utils/quantization/http.rb +0 -4
- data/lib/datadog/tracing/contrib.rb +0 -2
- data/lib/datadog/tracing/correlation.rb +15 -3
- data/lib/datadog/tracing/diagnostics/ext.rb +0 -2
- data/lib/datadog/tracing/diagnostics/health.rb +0 -2
- data/lib/datadog/tracing/distributed/b3_multi.rb +12 -6
- data/lib/datadog/tracing/distributed/b3_single.rb +8 -6
- data/lib/datadog/tracing/distributed/datadog.rb +58 -11
- data/lib/datadog/tracing/distributed/datadog_tags_codec.rb +0 -1
- data/lib/datadog/tracing/distributed/fetcher.rb +0 -9
- data/lib/datadog/tracing/distributed/headers/ext.rb +0 -1
- data/lib/datadog/tracing/distributed/helpers.rb +21 -36
- data/lib/datadog/tracing/distributed/none.rb +0 -1
- data/lib/datadog/tracing/distributed/propagation.rb +0 -1
- data/lib/datadog/tracing/distributed/trace_context.rb +8 -13
- data/lib/datadog/tracing/event.rb +0 -2
- data/lib/datadog/tracing/flush.rb +0 -2
- data/lib/datadog/tracing/metadata/analytics.rb +0 -2
- data/lib/datadog/tracing/metadata/errors.rb +0 -2
- data/lib/datadog/tracing/metadata/ext.rb +6 -2
- data/lib/datadog/tracing/metadata/tagging.rb +0 -2
- data/lib/datadog/tracing/metadata.rb +0 -2
- data/lib/datadog/tracing/pipeline/span_filter.rb +0 -2
- data/lib/datadog/tracing/pipeline/span_processor.rb +0 -2
- data/lib/datadog/tracing/pipeline.rb +0 -2
- data/lib/datadog/tracing/propagation/http.rb +0 -2
- data/lib/datadog/tracing/runtime/metrics.rb +0 -2
- data/lib/datadog/tracing/sampling/all_sampler.rb +0 -2
- data/lib/datadog/tracing/sampling/ext.rb +0 -2
- data/lib/datadog/tracing/sampling/matcher.rb +0 -2
- data/lib/datadog/tracing/sampling/priority_sampler.rb +0 -2
- data/lib/datadog/tracing/sampling/rate_by_key_sampler.rb +0 -2
- data/lib/datadog/tracing/sampling/rate_by_service_sampler.rb +0 -2
- data/lib/datadog/tracing/sampling/rate_limiter.rb +0 -2
- data/lib/datadog/tracing/sampling/rate_sampler.rb +0 -2
- data/lib/datadog/tracing/sampling/rule.rb +0 -2
- data/lib/datadog/tracing/sampling/rule_sampler.rb +0 -2
- data/lib/datadog/tracing/sampling/sampler.rb +0 -2
- data/lib/datadog/tracing/span.rb +0 -2
- data/lib/datadog/tracing/span_operation.rb +1 -3
- data/lib/datadog/tracing/sync_writer.rb +0 -2
- data/lib/datadog/tracing/trace_digest.rb +0 -2
- data/lib/datadog/tracing/trace_operation.rb +1 -3
- data/lib/datadog/tracing/trace_segment.rb +7 -2
- data/lib/datadog/tracing/tracer.rb +0 -2
- data/lib/datadog/tracing/utils.rb +33 -2
- data/lib/datadog/tracing/workers/trace_writer.rb +0 -2
- data/lib/datadog/tracing/workers.rb +0 -2
- data/lib/datadog/tracing/writer.rb +0 -2
- data/lib/datadog/tracing.rb +0 -2
- data/lib/ddtrace/auto_instrument.rb +0 -2
- data/lib/ddtrace/auto_instrument_base.rb +0 -2
- data/lib/ddtrace/profiling/preload.rb +0 -2
- data/lib/ddtrace/transport/ext.rb +0 -2
- data/lib/ddtrace/transport/http/adapters/net.rb +0 -2
- data/lib/ddtrace/transport/http/adapters/registry.rb +0 -2
- data/lib/ddtrace/transport/http/adapters/test.rb +0 -2
- data/lib/ddtrace/transport/http/adapters/unix_socket.rb +0 -2
- data/lib/ddtrace/transport/http/api/endpoint.rb +0 -2
- data/lib/ddtrace/transport/http/api/fallbacks.rb +0 -2
- data/lib/ddtrace/transport/http/api/instance.rb +0 -2
- data/lib/ddtrace/transport/http/api/map.rb +0 -2
- data/lib/ddtrace/transport/http/api/spec.rb +0 -2
- data/lib/ddtrace/transport/http/api.rb +0 -2
- data/lib/ddtrace/transport/http/builder.rb +0 -2
- data/lib/ddtrace/transport/http/client.rb +0 -2
- data/lib/ddtrace/transport/http/env.rb +0 -2
- data/lib/ddtrace/transport/http/response.rb +0 -2
- data/lib/ddtrace/transport/http/statistics.rb +0 -2
- data/lib/ddtrace/transport/http/traces.rb +0 -2
- data/lib/ddtrace/transport/http.rb +0 -4
- data/lib/ddtrace/transport/io/client.rb +0 -2
- data/lib/ddtrace/transport/io/response.rb +0 -2
- data/lib/ddtrace/transport/io/traces.rb +0 -4
- data/lib/ddtrace/transport/io.rb +0 -2
- data/lib/ddtrace/transport/parcel.rb +0 -4
- data/lib/ddtrace/transport/request.rb +0 -2
- data/lib/ddtrace/transport/response.rb +0 -2
- data/lib/ddtrace/transport/serializable_trace.rb +9 -5
- data/lib/ddtrace/transport/statistics.rb +0 -2
- data/lib/ddtrace/transport/trace_formatter.rb +7 -2
- data/lib/ddtrace/transport/traces.rb +0 -2
- data/lib/ddtrace/version.rb +1 -3
- data/lib/ddtrace.rb +1 -5
- metadata +27 -16
- data/ext/ddtrace_profiling_native_extension/collectors_cpu_and_wall_time.h +0 -9
- data/lib/datadog/appsec/assets/waf_rules/risky.json +0 -1499
- data/lib/datadog/appsec/contrib/rack/request.rb +0 -78
- data/lib/datadog/appsec/contrib/rack/response.rb +0 -24
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
#include <ruby.h>
|
|
2
2
|
|
|
3
|
+
#include "collectors_thread_context.h"
|
|
3
4
|
#include "clock_id.h"
|
|
4
|
-
#include "collectors_cpu_and_wall_time.h"
|
|
5
5
|
#include "collectors_stack.h"
|
|
6
6
|
#include "helpers.h"
|
|
7
7
|
#include "libdatadog_helpers.h"
|
|
@@ -9,29 +9,32 @@
|
|
|
9
9
|
#include "stack_recorder.h"
|
|
10
10
|
#include "time_helpers.h"
|
|
11
11
|
|
|
12
|
-
// Used to
|
|
12
|
+
// Used to trigger sampling of threads, based on external "events", such as:
|
|
13
|
+
// * periodic timer for cpu-time and wall-time
|
|
14
|
+
// * VM garbage collection events
|
|
15
|
+
// * VM object allocation events
|
|
13
16
|
//
|
|
14
|
-
// This file implements the native bits of the Datadog::Profiling::Collectors::
|
|
17
|
+
// This file implements the native bits of the Datadog::Profiling::Collectors::ThreadContext class
|
|
15
18
|
//
|
|
16
|
-
// Triggering of this component (e.g.
|
|
19
|
+
// Triggering of this component (e.g. watching for the above "events") is implemented by Collectors::CpuAndWallTimeWorker.
|
|
17
20
|
|
|
18
21
|
// ---
|
|
19
22
|
// ## Tracking of cpu-time and wall-time spent during garbage collection
|
|
20
23
|
//
|
|
21
|
-
// This feature works by having
|
|
24
|
+
// This feature works by having a special state that a thread can be in: doing garbage collection. This state is
|
|
22
25
|
// tracked inside the thread's `per_thread_context.gc_tracking` data, and three functions, listed below. The functions
|
|
23
26
|
// will get called by the `Collectors::CpuAndWallTimeWorker` at very specific times in the VM lifetime.
|
|
24
27
|
//
|
|
25
|
-
// * `
|
|
28
|
+
// * `thread_context_collector_on_gc_start`: Called at the very beginning of the garbage collection process.
|
|
26
29
|
// The internal VM `during_gc` flag is set to `true`, but Ruby has not done any work yet.
|
|
27
|
-
// * `
|
|
30
|
+
// * `thread_context_collector_on_gc_finish`: Called at the very end of the garbage collection process.
|
|
28
31
|
// The internal VM `during_gc` flag is still set to `true`, but all the work has been done.
|
|
29
|
-
// * `
|
|
32
|
+
// * `thread_context_collector_sample_after_gc`: Called shortly after the garbage collection process.
|
|
30
33
|
// The internal VM `during_gc` flag is set to `false`.
|
|
31
34
|
//
|
|
32
35
|
// Inside this component, here's what happens inside those three functions:
|
|
33
36
|
//
|
|
34
|
-
// When `
|
|
37
|
+
// When `thread_context_collector_on_gc_start` gets called, the current cpu and wall-time get recorded to the thread
|
|
35
38
|
// context: `cpu_time_at_gc_start_ns` and `wall_time_at_gc_start_ns`.
|
|
36
39
|
//
|
|
37
40
|
// While these fields are set, regular samples (if any) do not account for any time that passes after these two
|
|
@@ -39,10 +42,10 @@
|
|
|
39
42
|
//
|
|
40
43
|
// (Regular samples can still account for the time between the previous sample and the start of GC.)
|
|
41
44
|
//
|
|
42
|
-
// When `
|
|
45
|
+
// When `thread_context_collector_on_gc_finish` gets called, the current cpu and wall-time again get recorded to the
|
|
43
46
|
// thread context: `cpu_time_at_gc_finish_ns` and `wall_time_at_gc_finish_ns`.
|
|
44
47
|
//
|
|
45
|
-
// Finally, when `
|
|
48
|
+
// Finally, when `thread_context_collector_sample_after_gc` gets called, the following happens:
|
|
46
49
|
//
|
|
47
50
|
// 1. A sample gets taken, using the special `SAMPLE_IN_GC` sample type, which produces a stack with a placeholder
|
|
48
51
|
// `Garbage Collection` frame as the latest frame. This sample gets assigned the cpu-time and wall-time period that was
|
|
@@ -54,8 +57,8 @@
|
|
|
54
57
|
// GC, so that all time is accounted for -- e.g. the next sample will not get "blamed" by time spent in GC.
|
|
55
58
|
//
|
|
56
59
|
// In an earlier attempt at implementing this functionality (https://github.com/DataDog/dd-trace-rb/pull/2308), we
|
|
57
|
-
// discovered that we needed to factor the sampling work away from `
|
|
58
|
-
// separate `
|
|
60
|
+
// discovered that we needed to factor the sampling work away from `thread_context_collector_on_gc_finish` and into a
|
|
61
|
+
// separate `thread_context_collector_sample_after_gc` because (as documented in more detail below),
|
|
59
62
|
// `sample_after_gc` could trigger memory allocation in rare occasions (usually exceptions), which is actually not
|
|
60
63
|
// allowed to happen during Ruby's garbage collection start/finish hooks.
|
|
61
64
|
// ---
|
|
@@ -73,8 +76,8 @@ static ID at_resource_id; // id of :@resource in Ruby
|
|
|
73
76
|
static ID at_root_span_id; // id of :@root_span in Ruby
|
|
74
77
|
static ID at_type_id; // id of :@type in Ruby
|
|
75
78
|
|
|
76
|
-
// Contains state for a single
|
|
77
|
-
struct
|
|
79
|
+
// Contains state for a single ThreadContext instance
|
|
80
|
+
struct thread_context_collector_state {
|
|
78
81
|
// Note: Places in this file that usually need to be changed when this struct is changed are tagged with
|
|
79
82
|
// "Update this when modifying state struct"
|
|
80
83
|
|
|
@@ -92,11 +95,13 @@ struct cpu_and_wall_time_collector_state {
|
|
|
92
95
|
// Currently **outside** of stats struct because we also use it to decide when to clean the contexts, and thus this
|
|
93
96
|
// is not (just) a stat.
|
|
94
97
|
unsigned int sample_count;
|
|
98
|
+
// Reusable array to get list of threads
|
|
99
|
+
VALUE thread_list_buffer;
|
|
95
100
|
|
|
96
101
|
struct stats {
|
|
97
102
|
// Track how many garbage collection samples we've taken.
|
|
98
103
|
unsigned int gc_samples;
|
|
99
|
-
// See
|
|
104
|
+
// See thread_context_collector_on_gc_start for details
|
|
100
105
|
unsigned int gc_samples_missed_due_to_missing_context;
|
|
101
106
|
} stats;
|
|
102
107
|
};
|
|
@@ -124,71 +129,80 @@ struct per_thread_context {
|
|
|
124
129
|
|
|
125
130
|
// Used to correlate profiles with traces
|
|
126
131
|
struct trace_identifiers {
|
|
127
|
-
#define MAXIMUM_LENGTH_64_BIT_IDENTIFIER 21 // Why 21? 2^64 => 20 digits + 1 for \0
|
|
128
|
-
|
|
129
132
|
bool valid;
|
|
130
|
-
|
|
133
|
+
uint64_t local_root_span_id;
|
|
131
134
|
uint64_t span_id;
|
|
132
|
-
char local_root_span_id_buffer[MAXIMUM_LENGTH_64_BIT_IDENTIFIER];
|
|
133
135
|
VALUE trace_endpoint;
|
|
134
136
|
};
|
|
135
137
|
|
|
136
|
-
static void
|
|
137
|
-
static void
|
|
138
|
+
static void thread_context_collector_typed_data_mark(void *state_ptr);
|
|
139
|
+
static void thread_context_collector_typed_data_free(void *state_ptr);
|
|
138
140
|
static int hash_map_per_thread_context_mark(st_data_t key_thread, st_data_t _value, st_data_t _argument);
|
|
139
141
|
static int hash_map_per_thread_context_free_values(st_data_t _thread, st_data_t value_per_thread_context, st_data_t _argument);
|
|
140
142
|
static VALUE _native_new(VALUE klass);
|
|
141
143
|
static VALUE _native_initialize(VALUE self, VALUE collector_instance, VALUE recorder_instance, VALUE max_frames, VALUE tracer_context_key);
|
|
142
|
-
static VALUE _native_sample(VALUE self, VALUE collector_instance);
|
|
144
|
+
static VALUE _native_sample(VALUE self, VALUE collector_instance, VALUE profiler_overhead_stack_thread);
|
|
143
145
|
static VALUE _native_on_gc_start(VALUE self, VALUE collector_instance);
|
|
144
146
|
static VALUE _native_on_gc_finish(VALUE self, VALUE collector_instance);
|
|
145
147
|
static VALUE _native_sample_after_gc(DDTRACE_UNUSED VALUE self, VALUE collector_instance);
|
|
148
|
+
void update_metrics_and_sample(
|
|
149
|
+
struct thread_context_collector_state *state,
|
|
150
|
+
VALUE thread_being_sampled,
|
|
151
|
+
VALUE profiler_overhead_stack_thread,
|
|
152
|
+
struct per_thread_context *thread_context,
|
|
153
|
+
long current_cpu_time_ns,
|
|
154
|
+
long current_monotonic_wall_time_ns
|
|
155
|
+
);
|
|
146
156
|
static void trigger_sample_for_thread(
|
|
147
|
-
struct
|
|
157
|
+
struct thread_context_collector_state *state,
|
|
148
158
|
VALUE thread,
|
|
159
|
+
VALUE stack_from_thread,
|
|
149
160
|
struct per_thread_context *thread_context,
|
|
150
|
-
|
|
161
|
+
sample_values values,
|
|
151
162
|
sample_type type
|
|
152
163
|
);
|
|
153
164
|
static VALUE _native_thread_list(VALUE self);
|
|
154
|
-
static struct per_thread_context *get_or_create_context_for(VALUE thread, struct
|
|
155
|
-
static struct per_thread_context *get_context_for(VALUE thread, struct
|
|
165
|
+
static struct per_thread_context *get_or_create_context_for(VALUE thread, struct thread_context_collector_state *state);
|
|
166
|
+
static struct per_thread_context *get_context_for(VALUE thread, struct thread_context_collector_state *state);
|
|
156
167
|
static void initialize_context(VALUE thread, struct per_thread_context *thread_context);
|
|
157
168
|
static VALUE _native_inspect(VALUE self, VALUE collector_instance);
|
|
158
|
-
static VALUE per_thread_context_st_table_as_ruby_hash(struct
|
|
169
|
+
static VALUE per_thread_context_st_table_as_ruby_hash(struct thread_context_collector_state *state);
|
|
159
170
|
static int per_thread_context_as_ruby_hash(st_data_t key_thread, st_data_t value_context, st_data_t result_hash);
|
|
160
|
-
static VALUE stats_as_ruby_hash(struct
|
|
161
|
-
static void remove_context_for_dead_threads(struct
|
|
171
|
+
static VALUE stats_as_ruby_hash(struct thread_context_collector_state *state);
|
|
172
|
+
static void remove_context_for_dead_threads(struct thread_context_collector_state *state);
|
|
162
173
|
static int remove_if_dead_thread(st_data_t key_thread, st_data_t value_context, st_data_t _argument);
|
|
163
174
|
static VALUE _native_per_thread_context(VALUE self, VALUE collector_instance);
|
|
164
175
|
static long update_time_since_previous_sample(long *time_at_previous_sample_ns, long current_time_ns, long gc_start_time_ns, bool is_wall_time);
|
|
165
176
|
static long cpu_time_now_ns(struct per_thread_context *thread_context);
|
|
166
177
|
static long thread_id_for(VALUE thread);
|
|
167
178
|
static VALUE _native_stats(VALUE self, VALUE collector_instance);
|
|
168
|
-
static void trace_identifiers_for(struct
|
|
179
|
+
static void trace_identifiers_for(struct thread_context_collector_state *state, VALUE thread, struct trace_identifiers *trace_identifiers_result);
|
|
169
180
|
static bool is_type_web(VALUE root_span_type);
|
|
170
181
|
static VALUE _native_reset_after_fork(DDTRACE_UNUSED VALUE self, VALUE collector_instance);
|
|
182
|
+
static VALUE thread_list(struct thread_context_collector_state *state);
|
|
183
|
+
static VALUE _native_sample_allocation(VALUE self, VALUE collector_instance, VALUE sample_weight);
|
|
171
184
|
|
|
172
|
-
void
|
|
185
|
+
void collectors_thread_context_init(VALUE profiling_module) {
|
|
173
186
|
VALUE collectors_module = rb_define_module_under(profiling_module, "Collectors");
|
|
174
|
-
VALUE
|
|
187
|
+
VALUE collectors_thread_context_class = rb_define_class_under(collectors_module, "ThreadContext", rb_cObject);
|
|
175
188
|
// Hosts methods used for testing the native code using RSpec
|
|
176
|
-
VALUE testing_module = rb_define_module_under(
|
|
189
|
+
VALUE testing_module = rb_define_module_under(collectors_thread_context_class, "Testing");
|
|
177
190
|
|
|
178
|
-
// Instances of the
|
|
191
|
+
// Instances of the ThreadContext class are "TypedData" objects.
|
|
179
192
|
// "TypedData" objects are special objects in the Ruby VM that can wrap C structs.
|
|
180
|
-
// In this case, it wraps the
|
|
193
|
+
// In this case, it wraps the thread_context_collector_state.
|
|
181
194
|
//
|
|
182
195
|
// Because Ruby doesn't know how to initialize native-level structs, we MUST override the allocation function for objects
|
|
183
196
|
// of this class so that we can manage this part. Not overriding or disabling the allocation function is a common
|
|
184
197
|
// gotcha for "TypedData" objects that can very easily lead to VM crashes, see for instance
|
|
185
198
|
// https://bugs.ruby-lang.org/issues/18007 for a discussion around this.
|
|
186
|
-
rb_define_alloc_func(
|
|
199
|
+
rb_define_alloc_func(collectors_thread_context_class, _native_new);
|
|
187
200
|
|
|
188
|
-
rb_define_singleton_method(
|
|
189
|
-
rb_define_singleton_method(
|
|
190
|
-
rb_define_singleton_method(
|
|
191
|
-
rb_define_singleton_method(testing_module, "_native_sample", _native_sample,
|
|
201
|
+
rb_define_singleton_method(collectors_thread_context_class, "_native_initialize", _native_initialize, 4);
|
|
202
|
+
rb_define_singleton_method(collectors_thread_context_class, "_native_inspect", _native_inspect, 1);
|
|
203
|
+
rb_define_singleton_method(collectors_thread_context_class, "_native_reset_after_fork", _native_reset_after_fork, 1);
|
|
204
|
+
rb_define_singleton_method(testing_module, "_native_sample", _native_sample, 2);
|
|
205
|
+
rb_define_singleton_method(testing_module, "_native_sample_allocation", _native_sample_allocation, 2);
|
|
192
206
|
rb_define_singleton_method(testing_module, "_native_on_gc_start", _native_on_gc_start, 1);
|
|
193
207
|
rb_define_singleton_method(testing_module, "_native_on_gc_finish", _native_on_gc_finish, 1);
|
|
194
208
|
rb_define_singleton_method(testing_module, "_native_sample_after_gc", _native_sample_after_gc, 1);
|
|
@@ -204,13 +218,13 @@ void collectors_cpu_and_wall_time_init(VALUE profiling_module) {
|
|
|
204
218
|
at_type_id = rb_intern_const("@type");
|
|
205
219
|
}
|
|
206
220
|
|
|
207
|
-
// This structure is used to define a Ruby object that stores a pointer to a struct
|
|
221
|
+
// This structure is used to define a Ruby object that stores a pointer to a struct thread_context_collector_state
|
|
208
222
|
// See also https://github.com/ruby/ruby/blob/master/doc/extension.rdoc for how this works
|
|
209
|
-
static const rb_data_type_t
|
|
210
|
-
.wrap_struct_name = "Datadog::Profiling::Collectors::
|
|
223
|
+
static const rb_data_type_t thread_context_collector_typed_data = {
|
|
224
|
+
.wrap_struct_name = "Datadog::Profiling::Collectors::ThreadContext",
|
|
211
225
|
.function = {
|
|
212
|
-
.dmark =
|
|
213
|
-
.dfree =
|
|
226
|
+
.dmark = thread_context_collector_typed_data_mark,
|
|
227
|
+
.dfree = thread_context_collector_typed_data_free,
|
|
214
228
|
.dsize = NULL, // We don't track profile memory usage (although it'd be cool if we did!)
|
|
215
229
|
//.dcompact = NULL, // FIXME: Add support for compaction
|
|
216
230
|
},
|
|
@@ -219,16 +233,17 @@ static const rb_data_type_t cpu_and_wall_time_collector_typed_data = {
|
|
|
219
233
|
|
|
220
234
|
// This function is called by the Ruby GC to give us a chance to mark any Ruby objects that we're holding on to,
|
|
221
235
|
// so that they don't get garbage collected
|
|
222
|
-
static void
|
|
223
|
-
struct
|
|
236
|
+
static void thread_context_collector_typed_data_mark(void *state_ptr) {
|
|
237
|
+
struct thread_context_collector_state *state = (struct thread_context_collector_state *) state_ptr;
|
|
224
238
|
|
|
225
239
|
// Update this when modifying state struct
|
|
226
240
|
rb_gc_mark(state->recorder_instance);
|
|
227
241
|
st_foreach(state->hash_map_per_thread_context, hash_map_per_thread_context_mark, 0 /* unused */);
|
|
242
|
+
rb_gc_mark(state->thread_list_buffer);
|
|
228
243
|
}
|
|
229
244
|
|
|
230
|
-
static void
|
|
231
|
-
struct
|
|
245
|
+
static void thread_context_collector_typed_data_free(void *state_ptr) {
|
|
246
|
+
struct thread_context_collector_state *state = (struct thread_context_collector_state *) state_ptr;
|
|
232
247
|
|
|
233
248
|
// Update this when modifying state struct
|
|
234
249
|
|
|
@@ -259,7 +274,7 @@ static int hash_map_per_thread_context_free_values(DDTRACE_UNUSED st_data_t _thr
|
|
|
259
274
|
}
|
|
260
275
|
|
|
261
276
|
static VALUE _native_new(VALUE klass) {
|
|
262
|
-
struct
|
|
277
|
+
struct thread_context_collector_state *state = ruby_xcalloc(1, sizeof(struct thread_context_collector_state));
|
|
263
278
|
|
|
264
279
|
// Update this when modifying state struct
|
|
265
280
|
state->sampling_buffer = NULL;
|
|
@@ -268,13 +283,14 @@ static VALUE _native_new(VALUE klass) {
|
|
|
268
283
|
st_init_numtable();
|
|
269
284
|
state->recorder_instance = Qnil;
|
|
270
285
|
state->tracer_context_key = MISSING_TRACER_CONTEXT_KEY;
|
|
286
|
+
state->thread_list_buffer = rb_ary_new();
|
|
271
287
|
|
|
272
|
-
return TypedData_Wrap_Struct(klass, &
|
|
288
|
+
return TypedData_Wrap_Struct(klass, &thread_context_collector_typed_data, state);
|
|
273
289
|
}
|
|
274
290
|
|
|
275
291
|
static VALUE _native_initialize(DDTRACE_UNUSED VALUE _self, VALUE collector_instance, VALUE recorder_instance, VALUE max_frames, VALUE tracer_context_key) {
|
|
276
|
-
struct
|
|
277
|
-
TypedData_Get_Struct(collector_instance, struct
|
|
292
|
+
struct thread_context_collector_state *state;
|
|
293
|
+
TypedData_Get_Struct(collector_instance, struct thread_context_collector_state, &thread_context_collector_typed_data, state);
|
|
278
294
|
|
|
279
295
|
int max_frames_requested = NUM2INT(max_frames);
|
|
280
296
|
if (max_frames_requested < 0) rb_raise(rb_eArgError, "Invalid max_frames: value must not be negative");
|
|
@@ -295,31 +311,33 @@ static VALUE _native_initialize(DDTRACE_UNUSED VALUE _self, VALUE collector_inst
|
|
|
295
311
|
return Qtrue;
|
|
296
312
|
}
|
|
297
313
|
|
|
298
|
-
// This method exists only to enable testing Datadog::Profiling::Collectors::
|
|
314
|
+
// This method exists only to enable testing Datadog::Profiling::Collectors::ThreadContext behavior using RSpec.
|
|
299
315
|
// It SHOULD NOT be used for other purposes.
|
|
300
|
-
static VALUE _native_sample(DDTRACE_UNUSED VALUE _self, VALUE collector_instance) {
|
|
301
|
-
|
|
316
|
+
static VALUE _native_sample(DDTRACE_UNUSED VALUE _self, VALUE collector_instance, VALUE profiler_overhead_stack_thread) {
|
|
317
|
+
if (!is_thread_alive(profiler_overhead_stack_thread)) rb_raise(rb_eArgError, "Unexpected: profiler_overhead_stack_thread is not alive");
|
|
318
|
+
|
|
319
|
+
thread_context_collector_sample(collector_instance, monotonic_wall_time_now_ns(RAISE_ON_FAILURE), profiler_overhead_stack_thread);
|
|
302
320
|
return Qtrue;
|
|
303
321
|
}
|
|
304
322
|
|
|
305
|
-
// This method exists only to enable testing Datadog::Profiling::Collectors::
|
|
323
|
+
// This method exists only to enable testing Datadog::Profiling::Collectors::ThreadContext behavior using RSpec.
|
|
306
324
|
// It SHOULD NOT be used for other purposes.
|
|
307
325
|
static VALUE _native_on_gc_start(DDTRACE_UNUSED VALUE self, VALUE collector_instance) {
|
|
308
|
-
|
|
326
|
+
thread_context_collector_on_gc_start(collector_instance);
|
|
309
327
|
return Qtrue;
|
|
310
328
|
}
|
|
311
329
|
|
|
312
|
-
// This method exists only to enable testing Datadog::Profiling::Collectors::
|
|
330
|
+
// This method exists only to enable testing Datadog::Profiling::Collectors::ThreadContext behavior using RSpec.
|
|
313
331
|
// It SHOULD NOT be used for other purposes.
|
|
314
332
|
static VALUE _native_on_gc_finish(DDTRACE_UNUSED VALUE self, VALUE collector_instance) {
|
|
315
|
-
|
|
333
|
+
thread_context_collector_on_gc_finish(collector_instance);
|
|
316
334
|
return Qtrue;
|
|
317
335
|
}
|
|
318
336
|
|
|
319
|
-
// This method exists only to enable testing Datadog::Profiling::Collectors::
|
|
337
|
+
// This method exists only to enable testing Datadog::Profiling::Collectors::ThreadContext behavior using RSpec.
|
|
320
338
|
// It SHOULD NOT be used for other purposes.
|
|
321
339
|
static VALUE _native_sample_after_gc(DDTRACE_UNUSED VALUE self, VALUE collector_instance) {
|
|
322
|
-
|
|
340
|
+
thread_context_collector_sample_after_gc(collector_instance);
|
|
323
341
|
return Qtrue;
|
|
324
342
|
}
|
|
325
343
|
|
|
@@ -330,44 +348,35 @@ static VALUE _native_sample_after_gc(DDTRACE_UNUSED VALUE self, VALUE collector_
|
|
|
330
348
|
// Assumption 3: This function IS NOT called from a signal handler. This function is not async-signal-safe.
|
|
331
349
|
// Assumption 4: This function IS NOT called in a reentrant way.
|
|
332
350
|
// Assumption 5: This function is called from the main Ractor (if Ruby has support for Ractors).
|
|
333
|
-
|
|
334
|
-
|
|
335
|
-
|
|
351
|
+
//
|
|
352
|
+
// The `profiler_overhead_stack_thread` is used to attribute the profiler overhead to a stack borrowed from a different thread
|
|
353
|
+
// (belonging to ddtrace), so that the overhead is visible in the profile rather than blamed on user code.
|
|
354
|
+
void thread_context_collector_sample(VALUE self_instance, long current_monotonic_wall_time_ns, VALUE profiler_overhead_stack_thread) {
|
|
355
|
+
struct thread_context_collector_state *state;
|
|
356
|
+
TypedData_Get_Struct(self_instance, struct thread_context_collector_state, &thread_context_collector_typed_data, state);
|
|
357
|
+
|
|
358
|
+
VALUE current_thread = rb_thread_current();
|
|
359
|
+
struct per_thread_context *current_thread_context = get_or_create_context_for(current_thread, state);
|
|
360
|
+
long cpu_time_at_sample_start_for_current_thread = cpu_time_now_ns(current_thread_context);
|
|
336
361
|
|
|
337
|
-
VALUE threads =
|
|
362
|
+
VALUE threads = thread_list(state);
|
|
338
363
|
|
|
339
364
|
const long thread_count = RARRAY_LEN(threads);
|
|
340
365
|
for (long i = 0; i < thread_count; i++) {
|
|
341
366
|
VALUE thread = RARRAY_AREF(threads, i);
|
|
342
367
|
struct per_thread_context *thread_context = get_or_create_context_for(thread, state);
|
|
343
368
|
|
|
344
|
-
|
|
345
|
-
|
|
346
|
-
long
|
|
347
|
-
&thread_context->cpu_time_at_previous_sample_ns,
|
|
348
|
-
current_cpu_time_ns,
|
|
349
|
-
thread_context->gc_tracking.cpu_time_at_start_ns,
|
|
350
|
-
IS_NOT_WALL_TIME
|
|
351
|
-
);
|
|
352
|
-
long wall_time_elapsed_ns = update_time_since_previous_sample(
|
|
353
|
-
&thread_context->wall_time_at_previous_sample_ns,
|
|
354
|
-
current_monotonic_wall_time_ns,
|
|
355
|
-
thread_context->gc_tracking.wall_time_at_start_ns,
|
|
356
|
-
IS_WALL_TIME
|
|
357
|
-
);
|
|
358
|
-
|
|
359
|
-
int64_t metric_values[ENABLED_VALUE_TYPES_COUNT] = {0};
|
|
360
|
-
|
|
361
|
-
metric_values[CPU_TIME_VALUE_POS] = cpu_time_elapsed_ns;
|
|
362
|
-
metric_values[CPU_SAMPLES_VALUE_POS] = 1;
|
|
363
|
-
metric_values[WALL_TIME_VALUE_POS] = wall_time_elapsed_ns;
|
|
369
|
+
// We account for cpu-time for the current thread in a different way -- we use the cpu-time at sampling start, to avoid
|
|
370
|
+
// blaming the time the profiler took on whatever's running on the thread right now
|
|
371
|
+
long current_cpu_time_ns = thread != current_thread ? cpu_time_now_ns(thread_context) : cpu_time_at_sample_start_for_current_thread;
|
|
364
372
|
|
|
365
|
-
|
|
373
|
+
update_metrics_and_sample(
|
|
366
374
|
state,
|
|
367
|
-
thread,
|
|
375
|
+
/* thread_being_sampled: */ thread,
|
|
376
|
+
/* stack_from_thread: */ thread,
|
|
368
377
|
thread_context,
|
|
369
|
-
|
|
370
|
-
|
|
378
|
+
current_cpu_time_ns,
|
|
379
|
+
current_monotonic_wall_time_ns
|
|
371
380
|
);
|
|
372
381
|
}
|
|
373
382
|
|
|
@@ -376,6 +385,46 @@ void cpu_and_wall_time_collector_sample(VALUE self_instance, long current_monoto
|
|
|
376
385
|
// TODO: This seems somewhat overkill and inefficient to do often; right now we just do it every few samples
|
|
377
386
|
// but there's probably a better way to do this if we actually track when threads finish
|
|
378
387
|
if (state->sample_count % 100 == 0) remove_context_for_dead_threads(state);
|
|
388
|
+
|
|
389
|
+
update_metrics_and_sample(
|
|
390
|
+
state,
|
|
391
|
+
/* thread_being_sampled: */ current_thread,
|
|
392
|
+
/* stack_from_thread: */ profiler_overhead_stack_thread,
|
|
393
|
+
current_thread_context,
|
|
394
|
+
cpu_time_now_ns(current_thread_context),
|
|
395
|
+
monotonic_wall_time_now_ns(RAISE_ON_FAILURE)
|
|
396
|
+
);
|
|
397
|
+
}
|
|
398
|
+
|
|
399
|
+
void update_metrics_and_sample(
|
|
400
|
+
struct thread_context_collector_state *state,
|
|
401
|
+
VALUE thread_being_sampled,
|
|
402
|
+
VALUE stack_from_thread, // This can be different when attributing profiler overhead using a different stack
|
|
403
|
+
struct per_thread_context *thread_context,
|
|
404
|
+
long current_cpu_time_ns,
|
|
405
|
+
long current_monotonic_wall_time_ns
|
|
406
|
+
) {
|
|
407
|
+
long cpu_time_elapsed_ns = update_time_since_previous_sample(
|
|
408
|
+
&thread_context->cpu_time_at_previous_sample_ns,
|
|
409
|
+
current_cpu_time_ns,
|
|
410
|
+
thread_context->gc_tracking.cpu_time_at_start_ns,
|
|
411
|
+
IS_NOT_WALL_TIME
|
|
412
|
+
);
|
|
413
|
+
long wall_time_elapsed_ns = update_time_since_previous_sample(
|
|
414
|
+
&thread_context->wall_time_at_previous_sample_ns,
|
|
415
|
+
current_monotonic_wall_time_ns,
|
|
416
|
+
thread_context->gc_tracking.wall_time_at_start_ns,
|
|
417
|
+
IS_WALL_TIME
|
|
418
|
+
);
|
|
419
|
+
|
|
420
|
+
trigger_sample_for_thread(
|
|
421
|
+
state,
|
|
422
|
+
thread_being_sampled,
|
|
423
|
+
stack_from_thread,
|
|
424
|
+
thread_context,
|
|
425
|
+
(sample_values) {.cpu_time_ns = cpu_time_elapsed_ns, .cpu_samples = 1, .wall_time_ns = wall_time_elapsed_ns},
|
|
426
|
+
SAMPLE_REGULAR
|
|
427
|
+
);
|
|
379
428
|
}
|
|
380
429
|
|
|
381
430
|
// This function gets called when Ruby is about to start running the Garbage Collector on the current thread.
|
|
@@ -388,11 +437,11 @@ void cpu_and_wall_time_collector_sample(VALUE self_instance, long current_monoto
|
|
|
388
437
|
//
|
|
389
438
|
// Assumption 1: This function is called in a thread that is holding the Global VM Lock. Caller is responsible for enforcing this.
|
|
390
439
|
// Assumption 2: This function is called from the main Ractor (if Ruby has support for Ractors).
|
|
391
|
-
void
|
|
392
|
-
struct
|
|
393
|
-
if (!rb_typeddata_is_kind_of(self_instance, &
|
|
440
|
+
void thread_context_collector_on_gc_start(VALUE self_instance) {
|
|
441
|
+
struct thread_context_collector_state *state;
|
|
442
|
+
if (!rb_typeddata_is_kind_of(self_instance, &thread_context_collector_typed_data)) return;
|
|
394
443
|
// This should never fail the the above check passes
|
|
395
|
-
TypedData_Get_Struct(self_instance, struct
|
|
444
|
+
TypedData_Get_Struct(self_instance, struct thread_context_collector_state, &thread_context_collector_typed_data, state);
|
|
396
445
|
|
|
397
446
|
struct per_thread_context *thread_context = get_context_for(rb_thread_current(), state);
|
|
398
447
|
|
|
@@ -433,11 +482,11 @@ void cpu_and_wall_time_collector_on_gc_start(VALUE self_instance) {
|
|
|
433
482
|
//
|
|
434
483
|
// Assumption 1: This function is called in a thread that is holding the Global VM Lock. Caller is responsible for enforcing this.
|
|
435
484
|
// Assumption 2: This function is called from the main Ractor (if Ruby has support for Ractors).
|
|
436
|
-
void
|
|
437
|
-
struct
|
|
438
|
-
if (!rb_typeddata_is_kind_of(self_instance, &
|
|
485
|
+
void thread_context_collector_on_gc_finish(VALUE self_instance) {
|
|
486
|
+
struct thread_context_collector_state *state;
|
|
487
|
+
if (!rb_typeddata_is_kind_of(self_instance, &thread_context_collector_typed_data)) return;
|
|
439
488
|
// This should never fail the the above check passes
|
|
440
|
-
TypedData_Get_Struct(self_instance, struct
|
|
489
|
+
TypedData_Get_Struct(self_instance, struct thread_context_collector_state, &thread_context_collector_typed_data, state);
|
|
441
490
|
|
|
442
491
|
struct per_thread_context *thread_context = get_context_for(rb_thread_current(), state);
|
|
443
492
|
|
|
@@ -470,11 +519,11 @@ void cpu_and_wall_time_collector_on_gc_finish(VALUE self_instance) {
|
|
|
470
519
|
// Assumption 2: This function is allowed to raise exceptions. Caller is responsible for handling them, if needed.
|
|
471
520
|
// Assumption 3: Unlike `on_gc_start` and `on_gc_finish`, this method is allowed to allocate memory as needed.
|
|
472
521
|
// Assumption 4: This function is called from the main Ractor (if Ruby has support for Ractors).
|
|
473
|
-
VALUE
|
|
474
|
-
struct
|
|
475
|
-
TypedData_Get_Struct(self_instance, struct
|
|
522
|
+
VALUE thread_context_collector_sample_after_gc(VALUE self_instance) {
|
|
523
|
+
struct thread_context_collector_state *state;
|
|
524
|
+
TypedData_Get_Struct(self_instance, struct thread_context_collector_state, &thread_context_collector_typed_data, state);
|
|
476
525
|
|
|
477
|
-
VALUE threads =
|
|
526
|
+
VALUE threads = thread_list(state);
|
|
478
527
|
bool sampled_any_thread = false;
|
|
479
528
|
|
|
480
529
|
const long thread_count = RARRAY_LEN(threads);
|
|
@@ -510,17 +559,12 @@ VALUE cpu_and_wall_time_collector_sample_after_gc(VALUE self_instance) {
|
|
|
510
559
|
rb_raise(rb_eRuntimeError, "BUG: Unexpected zero value for gc_tracking.wall_time_at_start_ns");
|
|
511
560
|
}
|
|
512
561
|
|
|
513
|
-
int64_t metric_values[ENABLED_VALUE_TYPES_COUNT] = {0};
|
|
514
|
-
|
|
515
|
-
metric_values[CPU_TIME_VALUE_POS] = gc_cpu_time_elapsed_ns;
|
|
516
|
-
metric_values[CPU_SAMPLES_VALUE_POS] = 1;
|
|
517
|
-
metric_values[WALL_TIME_VALUE_POS] = gc_wall_time_elapsed_ns;
|
|
518
|
-
|
|
519
562
|
trigger_sample_for_thread(
|
|
520
563
|
state,
|
|
521
|
-
thread,
|
|
564
|
+
/* thread: */ thread,
|
|
565
|
+
/* stack_from_thread: */ thread,
|
|
522
566
|
thread_context,
|
|
523
|
-
(
|
|
567
|
+
(sample_values) {.cpu_time_ns = gc_cpu_time_elapsed_ns, .cpu_samples = 1, .wall_time_ns = gc_wall_time_elapsed_ns},
|
|
524
568
|
SAMPLE_IN_GC
|
|
525
569
|
);
|
|
526
570
|
|
|
@@ -546,15 +590,17 @@ VALUE cpu_and_wall_time_collector_sample_after_gc(VALUE self_instance) {
|
|
|
546
590
|
}
|
|
547
591
|
|
|
548
592
|
static void trigger_sample_for_thread(
|
|
549
|
-
struct
|
|
593
|
+
struct thread_context_collector_state *state,
|
|
550
594
|
VALUE thread,
|
|
595
|
+
VALUE stack_from_thread, // This can be different when attributing profiler overhead using a different stack
|
|
551
596
|
struct per_thread_context *thread_context,
|
|
552
|
-
|
|
597
|
+
sample_values values,
|
|
553
598
|
sample_type type
|
|
554
599
|
) {
|
|
555
600
|
int max_label_count =
|
|
556
601
|
1 + // thread id
|
|
557
602
|
1 + // thread name
|
|
603
|
+
1 + // profiler overhead
|
|
558
604
|
2; // local root span id and span id
|
|
559
605
|
ddog_prof_Label labels[max_label_count];
|
|
560
606
|
int label_pos = 0;
|
|
@@ -576,7 +622,7 @@ static void trigger_sample_for_thread(
|
|
|
576
622
|
trace_identifiers_for(state, thread, &trace_identifiers_result);
|
|
577
623
|
|
|
578
624
|
if (trace_identifiers_result.valid) {
|
|
579
|
-
labels[label_pos++] = (ddog_prof_Label) {.key = DDOG_CHARSLICE_C("local root span id"), .
|
|
625
|
+
labels[label_pos++] = (ddog_prof_Label) {.key = DDOG_CHARSLICE_C("local root span id"), .num = trace_identifiers_result.local_root_span_id};
|
|
580
626
|
labels[label_pos++] = (ddog_prof_Label) {.key = DDOG_CHARSLICE_C("span id"), .num = trace_identifiers_result.span_id};
|
|
581
627
|
|
|
582
628
|
if (trace_identifiers_result.trace_endpoint != Qnil) {
|
|
@@ -597,6 +643,13 @@ static void trigger_sample_for_thread(
|
|
|
597
643
|
}
|
|
598
644
|
}
|
|
599
645
|
|
|
646
|
+
if (thread != stack_from_thread) {
|
|
647
|
+
labels[label_pos++] = (ddog_prof_Label) {
|
|
648
|
+
.key = DDOG_CHARSLICE_C("profiler overhead"),
|
|
649
|
+
.num = 1
|
|
650
|
+
};
|
|
651
|
+
}
|
|
652
|
+
|
|
600
653
|
// The number of times `label_pos++` shows up in this function needs to match `max_label_count`. To avoid "oops I
|
|
601
654
|
// forgot to update max_label_count" in the future, we've also added this validation.
|
|
602
655
|
// @ivoanjo: I wonder if C compilers are smart enough to statically prove when this check never triggers happens and
|
|
@@ -606,22 +659,24 @@ static void trigger_sample_for_thread(
|
|
|
606
659
|
}
|
|
607
660
|
|
|
608
661
|
sample_thread(
|
|
609
|
-
|
|
662
|
+
stack_from_thread,
|
|
610
663
|
state->sampling_buffer,
|
|
611
664
|
state->recorder_instance,
|
|
612
|
-
|
|
665
|
+
values,
|
|
613
666
|
(ddog_prof_Slice_Label) {.ptr = labels, .len = label_pos},
|
|
614
667
|
type
|
|
615
668
|
);
|
|
616
669
|
}
|
|
617
670
|
|
|
618
|
-
// This method exists only to enable testing Datadog::Profiling::Collectors::
|
|
671
|
+
// This method exists only to enable testing Datadog::Profiling::Collectors::ThreadContext behavior using RSpec.
|
|
619
672
|
// It SHOULD NOT be used for other purposes.
|
|
620
673
|
static VALUE _native_thread_list(DDTRACE_UNUSED VALUE _self) {
|
|
621
|
-
|
|
674
|
+
VALUE result = rb_ary_new();
|
|
675
|
+
ddtrace_thread_list(result);
|
|
676
|
+
return result;
|
|
622
677
|
}
|
|
623
678
|
|
|
624
|
-
static struct per_thread_context *get_or_create_context_for(VALUE thread, struct
|
|
679
|
+
static struct per_thread_context *get_or_create_context_for(VALUE thread, struct thread_context_collector_state *state) {
|
|
625
680
|
struct per_thread_context* thread_context = NULL;
|
|
626
681
|
st_data_t value_context = 0;
|
|
627
682
|
|
|
@@ -636,7 +691,7 @@ static struct per_thread_context *get_or_create_context_for(VALUE thread, struct
|
|
|
636
691
|
return thread_context;
|
|
637
692
|
}
|
|
638
693
|
|
|
639
|
-
static struct per_thread_context *get_context_for(VALUE thread, struct
|
|
694
|
+
static struct per_thread_context *get_context_for(VALUE thread, struct thread_context_collector_state *state) {
|
|
640
695
|
struct per_thread_context* thread_context = NULL;
|
|
641
696
|
st_data_t value_context = 0;
|
|
642
697
|
|
|
@@ -665,8 +720,8 @@ static void initialize_context(VALUE thread, struct per_thread_context *thread_c
|
|
|
665
720
|
}
|
|
666
721
|
|
|
667
722
|
static VALUE _native_inspect(DDTRACE_UNUSED VALUE _self, VALUE collector_instance) {
|
|
668
|
-
struct
|
|
669
|
-
TypedData_Get_Struct(collector_instance, struct
|
|
723
|
+
struct thread_context_collector_state *state;
|
|
724
|
+
TypedData_Get_Struct(collector_instance, struct thread_context_collector_state, &thread_context_collector_typed_data, state);
|
|
670
725
|
|
|
671
726
|
VALUE result = rb_str_new2(" (native state)");
|
|
672
727
|
|
|
@@ -681,7 +736,7 @@ static VALUE _native_inspect(DDTRACE_UNUSED VALUE _self, VALUE collector_instanc
|
|
|
681
736
|
return result;
|
|
682
737
|
}
|
|
683
738
|
|
|
684
|
-
static VALUE per_thread_context_st_table_as_ruby_hash(struct
|
|
739
|
+
static VALUE per_thread_context_st_table_as_ruby_hash(struct thread_context_collector_state *state) {
|
|
685
740
|
VALUE result = rb_hash_new();
|
|
686
741
|
st_foreach(state->hash_map_per_thread_context, per_thread_context_as_ruby_hash, result);
|
|
687
742
|
return result;
|
|
@@ -711,7 +766,7 @@ static int per_thread_context_as_ruby_hash(st_data_t key_thread, st_data_t value
|
|
|
711
766
|
return ST_CONTINUE;
|
|
712
767
|
}
|
|
713
768
|
|
|
714
|
-
static VALUE stats_as_ruby_hash(struct
|
|
769
|
+
static VALUE stats_as_ruby_hash(struct thread_context_collector_state *state) {
|
|
715
770
|
// Update this when modifying state struct (stats inner struct)
|
|
716
771
|
VALUE stats_as_hash = rb_hash_new();
|
|
717
772
|
VALUE arguments[] = {
|
|
@@ -722,7 +777,7 @@ static VALUE stats_as_ruby_hash(struct cpu_and_wall_time_collector_state *state)
|
|
|
722
777
|
return stats_as_hash;
|
|
723
778
|
}
|
|
724
779
|
|
|
725
|
-
static void remove_context_for_dead_threads(struct
|
|
780
|
+
static void remove_context_for_dead_threads(struct thread_context_collector_state *state) {
|
|
726
781
|
st_foreach(state->hash_map_per_thread_context, remove_if_dead_thread, 0 /* unused */);
|
|
727
782
|
}
|
|
728
783
|
|
|
@@ -736,13 +791,13 @@ static int remove_if_dead_thread(st_data_t key_thread, st_data_t value_context,
|
|
|
736
791
|
return ST_DELETE;
|
|
737
792
|
}
|
|
738
793
|
|
|
739
|
-
// This method exists only to enable testing Datadog::Profiling::Collectors::
|
|
794
|
+
// This method exists only to enable testing Datadog::Profiling::Collectors::ThreadContext behavior using RSpec.
|
|
740
795
|
// It SHOULD NOT be used for other purposes.
|
|
741
796
|
//
|
|
742
797
|
// Returns the whole contents of the per_thread_context structs being tracked.
|
|
743
798
|
static VALUE _native_per_thread_context(DDTRACE_UNUSED VALUE _self, VALUE collector_instance) {
|
|
744
|
-
struct
|
|
745
|
-
TypedData_Get_Struct(collector_instance, struct
|
|
799
|
+
struct thread_context_collector_state *state;
|
|
800
|
+
TypedData_Get_Struct(collector_instance, struct thread_context_collector_state, &thread_context_collector_typed_data, state);
|
|
746
801
|
|
|
747
802
|
return per_thread_context_st_table_as_ruby_hash(state);
|
|
748
803
|
}
|
|
@@ -817,24 +872,24 @@ static long thread_id_for(VALUE thread) {
|
|
|
817
872
|
return FIXNUM_P(object_id) ? FIX2LONG(object_id) : -1;
|
|
818
873
|
}
|
|
819
874
|
|
|
820
|
-
VALUE
|
|
821
|
-
Check_TypedStruct(object, &
|
|
875
|
+
VALUE enforce_thread_context_collector_instance(VALUE object) {
|
|
876
|
+
Check_TypedStruct(object, &thread_context_collector_typed_data);
|
|
822
877
|
return object;
|
|
823
878
|
}
|
|
824
879
|
|
|
825
|
-
// This method exists only to enable testing Datadog::Profiling::Collectors::
|
|
880
|
+
// This method exists only to enable testing Datadog::Profiling::Collectors::ThreadContext behavior using RSpec.
|
|
826
881
|
// It SHOULD NOT be used for other purposes.
|
|
827
882
|
//
|
|
828
883
|
// Returns the whole contents of the per_thread_context structs being tracked.
|
|
829
884
|
static VALUE _native_stats(DDTRACE_UNUSED VALUE _self, VALUE collector_instance) {
|
|
830
|
-
struct
|
|
831
|
-
TypedData_Get_Struct(collector_instance, struct
|
|
885
|
+
struct thread_context_collector_state *state;
|
|
886
|
+
TypedData_Get_Struct(collector_instance, struct thread_context_collector_state, &thread_context_collector_typed_data, state);
|
|
832
887
|
|
|
833
888
|
return stats_as_ruby_hash(state);
|
|
834
889
|
}
|
|
835
890
|
|
|
836
891
|
// Assumption 1: This function is called in a thread that is holding the Global VM Lock. Caller is responsible for enforcing this.
|
|
837
|
-
static void trace_identifiers_for(struct
|
|
892
|
+
static void trace_identifiers_for(struct thread_context_collector_state *state, VALUE thread, struct trace_identifiers *trace_identifiers_result) {
|
|
838
893
|
if (state->tracer_context_key == MISSING_TRACER_CONTEXT_KEY) return;
|
|
839
894
|
|
|
840
895
|
VALUE current_context = rb_thread_local_aref(thread, state->tracer_context_key);
|
|
@@ -851,13 +906,7 @@ static void trace_identifiers_for(struct cpu_and_wall_time_collector_state *stat
|
|
|
851
906
|
VALUE numeric_span_id = rb_ivar_get(active_span, at_id_id /* @id */);
|
|
852
907
|
if (numeric_local_root_span_id == Qnil || numeric_span_id == Qnil) return;
|
|
853
908
|
|
|
854
|
-
|
|
855
|
-
snprintf(trace_identifiers_result->local_root_span_id_buffer, MAXIMUM_LENGTH_64_BIT_IDENTIFIER, "%llu", local_root_span_id);
|
|
856
|
-
|
|
857
|
-
trace_identifiers_result->local_root_span_id = (ddog_CharSlice) {
|
|
858
|
-
.ptr = trace_identifiers_result->local_root_span_id_buffer,
|
|
859
|
-
.len = strlen(trace_identifiers_result->local_root_span_id_buffer)
|
|
860
|
-
};
|
|
909
|
+
trace_identifiers_result->local_root_span_id = NUM2ULL(numeric_local_root_span_id);
|
|
861
910
|
trace_identifiers_result->span_id = NUM2ULL(numeric_span_id);
|
|
862
911
|
|
|
863
912
|
trace_identifiers_result->valid = true;
|
|
@@ -886,8 +935,8 @@ static bool is_type_web(VALUE root_span_type) {
|
|
|
886
935
|
// Assumption: This method gets called BEFORE restarting profiling -- e.g. there are no components attempting to
|
|
887
936
|
// trigger samples at the same time.
|
|
888
937
|
static VALUE _native_reset_after_fork(DDTRACE_UNUSED VALUE self, VALUE collector_instance) {
|
|
889
|
-
struct
|
|
890
|
-
TypedData_Get_Struct(collector_instance, struct
|
|
938
|
+
struct thread_context_collector_state *state;
|
|
939
|
+
TypedData_Get_Struct(collector_instance, struct thread_context_collector_state, &thread_context_collector_typed_data, state);
|
|
891
940
|
|
|
892
941
|
st_clear(state->hash_map_per_thread_context);
|
|
893
942
|
|
|
@@ -897,3 +946,33 @@ static VALUE _native_reset_after_fork(DDTRACE_UNUSED VALUE self, VALUE collector
|
|
|
897
946
|
|
|
898
947
|
return Qtrue;
|
|
899
948
|
}
|
|
949
|
+
|
|
950
|
+
static VALUE thread_list(struct thread_context_collector_state *state) {
|
|
951
|
+
VALUE result = state->thread_list_buffer;
|
|
952
|
+
rb_ary_clear(result);
|
|
953
|
+
ddtrace_thread_list(result);
|
|
954
|
+
return result;
|
|
955
|
+
}
|
|
956
|
+
|
|
957
|
+
void thread_context_collector_sample_allocation(VALUE self_instance, unsigned int sample_weight) {
|
|
958
|
+
struct thread_context_collector_state *state;
|
|
959
|
+
TypedData_Get_Struct(self_instance, struct thread_context_collector_state, &thread_context_collector_typed_data, state);
|
|
960
|
+
|
|
961
|
+
VALUE current_thread = rb_thread_current();
|
|
962
|
+
|
|
963
|
+
trigger_sample_for_thread(
|
|
964
|
+
state,
|
|
965
|
+
/* thread: */ current_thread,
|
|
966
|
+
/* stack_from_thread: */ current_thread,
|
|
967
|
+
get_or_create_context_for(current_thread, state),
|
|
968
|
+
(sample_values) {.alloc_samples = sample_weight},
|
|
969
|
+
SAMPLE_REGULAR
|
|
970
|
+
);
|
|
971
|
+
}
|
|
972
|
+
|
|
973
|
+
// This method exists only to enable testing Datadog::Profiling::Collectors::ThreadContext behavior using RSpec.
|
|
974
|
+
// It SHOULD NOT be used for other purposes.
|
|
975
|
+
static VALUE _native_sample_allocation(DDTRACE_UNUSED VALUE self, VALUE collector_instance, VALUE sample_weight) {
|
|
976
|
+
thread_context_collector_sample_allocation(collector_instance, NUM2UINT(sample_weight));
|
|
977
|
+
return Qtrue;
|
|
978
|
+
}
|