ddtrace 1.4.2 → 1.19.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 +986 -2
- data/LICENSE-3rdparty.csv +2 -0
- data/README.md +10 -12
- data/ext/ddtrace_profiling_loader/ddtrace_profiling_loader.c +9 -2
- data/ext/ddtrace_profiling_loader/extconf.rb +21 -3
- data/ext/ddtrace_profiling_native_extension/NativeExtensionDesign.md +48 -12
- data/ext/ddtrace_profiling_native_extension/clock_id.h +1 -3
- data/ext/ddtrace_profiling_native_extension/clock_id_from_pthread.c +6 -23
- data/ext/ddtrace_profiling_native_extension/clock_id_noop.c +0 -1
- data/ext/ddtrace_profiling_native_extension/collectors_cpu_and_wall_time_worker.c +719 -129
- data/ext/ddtrace_profiling_native_extension/collectors_dynamic_sampling_rate.c +150 -0
- data/ext/ddtrace_profiling_native_extension/collectors_dynamic_sampling_rate.h +18 -0
- data/ext/ddtrace_profiling_native_extension/collectors_gc_profiling_helper.c +156 -0
- data/ext/ddtrace_profiling_native_extension/collectors_gc_profiling_helper.h +5 -0
- data/ext/ddtrace_profiling_native_extension/collectors_idle_sampling_helper.c +244 -0
- data/ext/ddtrace_profiling_native_extension/collectors_idle_sampling_helper.h +3 -0
- data/ext/ddtrace_profiling_native_extension/collectors_stack.c +184 -94
- data/ext/ddtrace_profiling_native_extension/collectors_stack.h +20 -2
- data/ext/ddtrace_profiling_native_extension/collectors_thread_context.c +1301 -0
- data/ext/ddtrace_profiling_native_extension/collectors_thread_context.h +15 -0
- data/ext/ddtrace_profiling_native_extension/extconf.rb +103 -28
- data/ext/ddtrace_profiling_native_extension/heap_recorder.c +970 -0
- data/ext/ddtrace_profiling_native_extension/heap_recorder.h +155 -0
- data/ext/ddtrace_profiling_native_extension/helpers.h +7 -0
- data/ext/ddtrace_profiling_native_extension/http_transport.c +133 -88
- data/ext/ddtrace_profiling_native_extension/libdatadog_helpers.c +62 -0
- data/ext/ddtrace_profiling_native_extension/libdatadog_helpers.h +32 -4
- data/ext/ddtrace_profiling_native_extension/native_extension_helpers.rb +55 -26
- data/ext/ddtrace_profiling_native_extension/pid_controller.c +57 -0
- data/ext/ddtrace_profiling_native_extension/pid_controller.h +45 -0
- data/ext/ddtrace_profiling_native_extension/private_vm_api_access.c +317 -131
- data/ext/ddtrace_profiling_native_extension/private_vm_api_access.h +25 -1
- data/ext/ddtrace_profiling_native_extension/profiling.c +219 -4
- data/ext/ddtrace_profiling_native_extension/ruby_helpers.c +233 -1
- data/ext/ddtrace_profiling_native_extension/ruby_helpers.h +60 -8
- data/ext/ddtrace_profiling_native_extension/setup_signal_handler.c +115 -0
- data/ext/ddtrace_profiling_native_extension/setup_signal_handler.h +11 -0
- data/ext/ddtrace_profiling_native_extension/stack_recorder.c +585 -66
- data/ext/ddtrace_profiling_native_extension/stack_recorder.h +19 -30
- data/ext/ddtrace_profiling_native_extension/time_helpers.c +53 -0
- data/ext/ddtrace_profiling_native_extension/time_helpers.h +24 -0
- data/lib/datadog/appsec/assets/blocked.html +98 -3
- data/lib/datadog/appsec/assets/blocked.json +1 -0
- data/lib/datadog/appsec/assets/blocked.text +5 -0
- data/lib/datadog/appsec/assets/waf_rules/processors.json +92 -0
- data/lib/datadog/appsec/assets/waf_rules/recommended.json +2861 -796
- data/lib/datadog/appsec/assets/waf_rules/scanners.json +114 -0
- data/lib/datadog/appsec/assets/waf_rules/strict.json +459 -122
- data/lib/datadog/appsec/assets.rb +10 -4
- data/lib/datadog/appsec/autoload.rb +4 -11
- data/lib/datadog/appsec/component.rb +94 -0
- data/lib/datadog/appsec/configuration/settings.rb +170 -162
- data/lib/datadog/appsec/configuration.rb +1 -70
- data/lib/datadog/appsec/contrib/auto_instrument.rb +3 -5
- data/lib/datadog/appsec/contrib/devise/event.rb +57 -0
- data/lib/datadog/appsec/contrib/devise/ext.rb +13 -0
- data/lib/datadog/appsec/contrib/devise/integration.rb +42 -0
- data/lib/datadog/appsec/contrib/devise/patcher/authenticatable_patch.rb +76 -0
- data/lib/datadog/appsec/contrib/devise/patcher/registration_controller_patch.rb +54 -0
- data/lib/datadog/appsec/contrib/devise/patcher.rb +45 -0
- data/lib/datadog/appsec/contrib/devise/resource.rb +35 -0
- data/lib/datadog/appsec/contrib/devise/tracking.rb +49 -0
- data/lib/datadog/appsec/contrib/integration.rb +1 -1
- data/lib/datadog/appsec/contrib/patcher.rb +1 -1
- data/lib/datadog/appsec/contrib/rack/ext.rb +1 -3
- 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 +112 -121
- data/lib/datadog/appsec/contrib/rack/integration.rb +0 -7
- data/lib/datadog/appsec/contrib/rack/patcher.rb +3 -1
- data/lib/datadog/appsec/contrib/rack/reactive/request.rb +33 -39
- data/lib/datadog/appsec/contrib/rack/reactive/request_body.rb +19 -23
- data/lib/datadog/appsec/contrib/rack/reactive/response.rb +25 -23
- data/lib/datadog/appsec/contrib/rack/request_body_middleware.rb +11 -8
- data/lib/datadog/appsec/contrib/rack/request_middleware.rb +122 -41
- data/lib/datadog/appsec/contrib/rails/ext.rb +2 -4
- data/lib/datadog/appsec/contrib/rails/framework.rb +2 -16
- data/lib/datadog/appsec/contrib/rails/gateway/request.rb +67 -0
- data/lib/datadog/appsec/contrib/rails/gateway/watcher.rb +40 -52
- data/lib/datadog/appsec/contrib/rails/integration.rb +1 -8
- data/lib/datadog/appsec/contrib/rails/patcher.rb +23 -20
- data/lib/datadog/appsec/contrib/rails/reactive/action.rb +21 -23
- data/lib/datadog/appsec/contrib/rails/request.rb +4 -1
- data/lib/datadog/appsec/contrib/rails/request_middleware.rb +1 -1
- data/lib/datadog/appsec/contrib/sinatra/ext.rb +2 -3
- data/lib/datadog/appsec/contrib/sinatra/framework.rb +2 -16
- 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 +78 -87
- data/lib/datadog/appsec/contrib/sinatra/integration.rb +0 -7
- data/lib/datadog/appsec/contrib/sinatra/patcher.rb +33 -15
- data/lib/datadog/appsec/contrib/sinatra/reactive/routed.rb +19 -21
- data/lib/datadog/appsec/contrib/sinatra/request_middleware.rb +1 -1
- data/lib/datadog/appsec/event.rb +98 -50
- data/lib/datadog/appsec/ext.rb +10 -0
- data/lib/datadog/appsec/extensions.rb +2 -105
- data/lib/datadog/appsec/instrumentation/gateway/argument.rb +22 -0
- data/lib/datadog/appsec/instrumentation/gateway.rb +26 -6
- data/lib/datadog/appsec/instrumentation.rb +9 -0
- data/lib/datadog/appsec/monitor/gateway/watcher.rb +67 -0
- data/lib/datadog/appsec/monitor/reactive/set_user.rb +58 -0
- data/lib/datadog/appsec/monitor.rb +11 -0
- data/lib/datadog/appsec/processor/actions.rb +49 -0
- data/lib/datadog/appsec/processor/rule_loader.rb +123 -0
- data/lib/datadog/appsec/processor/rule_merger.rb +152 -0
- data/lib/datadog/appsec/processor.rb +68 -61
- data/lib/datadog/appsec/rate_limiter.rb +1 -3
- 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/remote.rb +129 -0
- data/lib/datadog/appsec/response.rb +151 -0
- data/lib/datadog/appsec/sample_rate.rb +21 -0
- data/lib/datadog/appsec/scope.rb +61 -0
- data/lib/datadog/appsec/utils/http/media_range.rb +199 -0
- data/lib/datadog/appsec/utils/http/media_type.rb +85 -0
- data/lib/datadog/appsec/utils/http.rb +11 -0
- data/lib/datadog/appsec/utils.rb +9 -0
- data/lib/datadog/appsec.rb +41 -4
- data/lib/datadog/core/backport.rb +51 -0
- data/lib/datadog/core/buffer/cruby.rb +1 -1
- data/lib/datadog/core/buffer/random.rb +1 -1
- data/lib/datadog/core/buffer/thread_safe.rb +1 -1
- data/lib/datadog/core/chunker.rb +1 -1
- data/lib/datadog/core/configuration/agent_settings_resolver.rb +96 -56
- data/lib/datadog/core/configuration/base.rb +7 -16
- data/lib/datadog/core/configuration/components.rb +40 -296
- data/lib/datadog/core/configuration/ext.rb +47 -0
- data/lib/datadog/core/configuration/option.rb +270 -22
- data/lib/datadog/core/configuration/option_definition.rb +81 -31
- data/lib/datadog/core/configuration/options.rb +26 -16
- data/lib/datadog/core/configuration/settings.rb +419 -305
- data/lib/datadog/core/configuration.rb +10 -6
- data/lib/datadog/core/diagnostics/environment_logger.rb +129 -230
- data/lib/datadog/core/diagnostics/health.rb +4 -22
- 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 +1 -1
- data/lib/datadog/core/environment/container.rb +0 -4
- data/lib/datadog/core/environment/execution.rb +103 -0
- data/lib/datadog/core/environment/ext.rb +12 -12
- data/lib/datadog/core/environment/gc.rb +1 -1
- data/lib/datadog/core/environment/identity.rb +57 -1
- data/lib/datadog/core/environment/platform.rb +0 -2
- data/lib/datadog/core/environment/socket.rb +1 -1
- data/lib/datadog/core/environment/thread_count.rb +1 -1
- data/lib/datadog/core/environment/variable_helpers.rb +29 -44
- data/lib/datadog/core/environment/vm_cache.rb +18 -1
- data/lib/datadog/core/environment/yjit.rb +58 -0
- data/lib/datadog/core/error.rb +1 -2
- data/lib/datadog/core/extensions.rb +1 -1
- data/lib/datadog/core/git/ext.rb +25 -23
- data/lib/datadog/core/header_collection.rb +43 -0
- data/lib/datadog/core/logger.rb +0 -2
- data/lib/datadog/core/logging/ext.rb +3 -1
- data/lib/datadog/core/metrics/client.rb +3 -4
- data/lib/datadog/core/metrics/ext.rb +6 -8
- data/lib/datadog/core/metrics/helpers.rb +1 -1
- data/lib/datadog/core/metrics/logging.rb +0 -2
- data/lib/datadog/core/metrics/metric.rb +1 -1
- data/lib/datadog/core/metrics/options.rb +0 -2
- data/lib/datadog/core/pin.rb +0 -2
- data/lib/datadog/core/remote/client/capabilities.rb +62 -0
- data/lib/datadog/core/remote/client.rb +232 -0
- data/lib/datadog/core/remote/component.rb +149 -0
- data/lib/datadog/core/remote/configuration/content.rb +111 -0
- data/lib/datadog/core/remote/configuration/digest.rb +62 -0
- data/lib/datadog/core/remote/configuration/path.rb +90 -0
- data/lib/datadog/core/remote/configuration/repository.rb +294 -0
- data/lib/datadog/core/remote/configuration/target.rb +74 -0
- data/lib/datadog/core/remote/configuration.rb +18 -0
- data/lib/datadog/core/remote/dispatcher.rb +59 -0
- data/lib/datadog/core/remote/ext.rb +12 -0
- data/lib/datadog/core/remote/negotiation.rb +70 -0
- data/lib/datadog/core/remote/transport/config.rb +60 -0
- data/lib/datadog/core/remote/transport/http/api/instance.rb +39 -0
- data/lib/datadog/core/remote/transport/http/api/spec.rb +21 -0
- data/lib/datadog/core/remote/transport/http/api.rb +58 -0
- data/lib/datadog/core/remote/transport/http/builder.rb +219 -0
- data/lib/datadog/core/remote/transport/http/client.rb +48 -0
- data/lib/datadog/core/remote/transport/http/config.rb +280 -0
- data/lib/datadog/core/remote/transport/http/negotiation.rb +146 -0
- data/lib/datadog/core/remote/transport/http.rb +179 -0
- data/lib/datadog/core/remote/transport/negotiation.rb +62 -0
- data/lib/datadog/core/remote/worker.rb +99 -0
- data/lib/datadog/core/remote.rb +24 -0
- data/lib/datadog/core/runtime/ext.rb +21 -11
- data/lib/datadog/core/runtime/metrics.rb +64 -7
- data/lib/datadog/core/telemetry/client.rb +12 -4
- data/lib/datadog/core/telemetry/collector.rb +34 -18
- data/lib/datadog/core/telemetry/emitter.rb +4 -4
- data/lib/datadog/core/telemetry/event.rb +20 -8
- data/lib/datadog/core/telemetry/ext.rb +6 -2
- data/lib/datadog/core/telemetry/heartbeat.rb +3 -5
- data/lib/datadog/core/telemetry/http/adapters/net.rb +0 -2
- data/lib/datadog/core/telemetry/http/env.rb +1 -1
- data/lib/datadog/core/telemetry/http/ext.rb +10 -8
- data/lib/datadog/core/telemetry/http/response.rb +0 -4
- data/lib/datadog/core/telemetry/http/transport.rb +4 -1
- data/lib/datadog/core/telemetry/v1/app_event.rb +10 -3
- data/lib/datadog/core/telemetry/v1/application.rb +7 -1
- data/lib/datadog/core/telemetry/v1/dependency.rb +9 -2
- data/lib/datadog/core/telemetry/v1/host.rb +9 -1
- data/lib/datadog/core/telemetry/v1/install_signature.rb +38 -0
- data/lib/datadog/core/telemetry/v1/integration.rb +7 -1
- data/lib/datadog/core/telemetry/v1/product.rb +9 -1
- data/lib/datadog/core/telemetry/v1/telemetry_request.rb +7 -1
- data/lib/datadog/core/telemetry/v2/app_client_configuration_change.rb +41 -0
- data/lib/datadog/core/telemetry/v2/request.rb +29 -0
- data/lib/datadog/core/transport/ext.rb +47 -0
- data/lib/datadog/core/transport/http/adapters/net.rb +168 -0
- data/lib/datadog/core/transport/http/adapters/registry.rb +29 -0
- data/lib/datadog/core/transport/http/adapters/test.rb +89 -0
- data/lib/datadog/core/transport/http/adapters/unix_socket.rb +83 -0
- data/lib/datadog/core/transport/http/api/endpoint.rb +31 -0
- data/lib/datadog/core/transport/http/api/fallbacks.rb +26 -0
- data/lib/datadog/core/transport/http/api/map.rb +18 -0
- data/lib/datadog/core/transport/http/env.rb +62 -0
- data/lib/datadog/core/transport/http/response.rb +60 -0
- data/lib/datadog/core/transport/parcel.rb +22 -0
- data/lib/datadog/core/transport/request.rb +17 -0
- data/lib/datadog/core/transport/response.rb +64 -0
- data/lib/datadog/core/utils/compression.rb +6 -2
- data/lib/datadog/core/utils/duration.rb +52 -0
- data/lib/datadog/core/utils/forking.rb +0 -2
- data/lib/datadog/core/utils/hash.rb +79 -0
- data/lib/datadog/core/utils/network.rb +140 -0
- data/lib/datadog/core/utils/only_once.rb +0 -2
- data/lib/datadog/core/utils/safe_dup.rb +35 -12
- data/lib/datadog/core/utils/sequence.rb +1 -1
- data/lib/datadog/core/utils/time.rb +1 -3
- data/lib/datadog/core/utils.rb +1 -24
- data/lib/datadog/core/vendor/ipaddr.rb +78 -0
- 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 +1 -1
- data/lib/datadog/core/workers/async.rb +7 -6
- data/lib/datadog/core/workers/interval_loop.rb +6 -2
- data/lib/datadog/core/workers/polling.rb +2 -4
- data/lib/datadog/core/workers/queue.rb +1 -1
- data/lib/datadog/core/workers/runtime_metrics.rb +1 -1
- data/lib/datadog/core.rb +20 -55
- data/lib/datadog/kit/appsec/events.rb +169 -0
- data/lib/datadog/kit/enable_core_dumps.rb +8 -9
- data/lib/datadog/kit/identity.rb +90 -49
- data/lib/datadog/kit.rb +1 -1
- data/lib/datadog/opentelemetry/api/context.rb +193 -0
- data/lib/datadog/opentelemetry/api/trace/span.rb +14 -0
- data/lib/datadog/opentelemetry/sdk/configurator.rb +37 -0
- data/lib/datadog/opentelemetry/sdk/id_generator.rb +26 -0
- data/lib/datadog/opentelemetry/sdk/propagator.rb +91 -0
- data/lib/datadog/opentelemetry/sdk/span_processor.rb +134 -0
- data/lib/datadog/opentelemetry/sdk/trace/span.rb +167 -0
- data/lib/datadog/opentelemetry/trace.rb +58 -0
- data/lib/datadog/opentelemetry.rb +48 -0
- data/lib/datadog/opentracer/binary_propagator.rb +1 -1
- data/lib/datadog/opentracer/carrier.rb +1 -1
- data/lib/datadog/opentracer/distributed_headers.rb +7 -11
- data/lib/datadog/opentracer/global_tracer.rb +1 -1
- data/lib/datadog/opentracer/propagator.rb +1 -1
- data/lib/datadog/opentracer/rack_propagator.rb +0 -5
- data/lib/datadog/opentracer/scope.rb +1 -1
- data/lib/datadog/opentracer/scope_manager.rb +1 -1
- data/lib/datadog/opentracer/span.rb +0 -2
- data/lib/datadog/opentracer/span_context.rb +1 -1
- data/lib/datadog/opentracer/span_context_factory.rb +1 -1
- data/lib/datadog/opentracer/text_map_propagator.rb +6 -9
- data/lib/datadog/opentracer/thread_local_scope.rb +1 -1
- data/lib/datadog/opentracer/thread_local_scope_manager.rb +0 -2
- data/lib/datadog/opentracer/tracer.rb +0 -2
- data/lib/datadog/opentracer.rb +10 -1
- data/lib/datadog/profiling/collectors/code_provenance.rb +0 -2
- data/lib/datadog/profiling/collectors/cpu_and_wall_time_worker.rb +53 -19
- data/lib/datadog/profiling/collectors/dynamic_sampling_rate.rb +14 -0
- data/lib/datadog/profiling/collectors/idle_sampling_helper.rb +68 -0
- data/lib/datadog/profiling/collectors/stack.rb +1 -1
- data/lib/datadog/profiling/collectors/thread_context.rb +61 -0
- data/lib/datadog/profiling/component.rb +434 -0
- data/lib/datadog/profiling/diagnostics/environment_logger.rb +39 -0
- data/lib/datadog/profiling/exporter.rb +12 -7
- data/lib/datadog/profiling/ext/forking.rb +0 -2
- data/lib/datadog/profiling/ext.rb +20 -32
- data/lib/datadog/profiling/flush.rb +8 -6
- data/lib/datadog/profiling/http_transport.rb +19 -8
- data/lib/datadog/profiling/load_native_extension.rb +7 -3
- data/lib/datadog/profiling/native_extension.rb +1 -22
- data/lib/datadog/profiling/preload.rb +1 -1
- data/lib/datadog/profiling/profiler.rb +42 -14
- data/lib/datadog/profiling/scheduler.rb +27 -25
- data/lib/datadog/profiling/stack_recorder.rb +30 -6
- data/lib/datadog/profiling/tag_builder.rb +1 -1
- 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 -35
- data/lib/datadog/profiling.rb +53 -74
- data/lib/datadog/tracing/analytics.rb +1 -1
- data/lib/datadog/tracing/buffer.rb +0 -5
- data/lib/datadog/tracing/client_ip.rb +61 -0
- data/lib/datadog/tracing/component.rb +235 -0
- data/lib/datadog/tracing/configuration/agent_settings_resolver.rb +13 -0
- data/lib/datadog/tracing/configuration/dynamic/option.rb +71 -0
- data/lib/datadog/tracing/configuration/dynamic.rb +64 -0
- data/lib/datadog/tracing/configuration/ext.rb +73 -15
- data/lib/datadog/tracing/configuration/http.rb +74 -0
- data/lib/datadog/tracing/configuration/settings.rb +501 -0
- data/lib/datadog/tracing/context.rb +1 -1
- data/lib/datadog/tracing/context_provider.rb +0 -2
- data/lib/datadog/tracing/contrib/action_cable/configuration/settings.rb +10 -7
- data/lib/datadog/tracing/contrib/action_cable/event.rb +1 -1
- 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 +1 -1
- data/lib/datadog/tracing/contrib/action_cable/ext.rb +19 -19
- 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 +1 -1
- data/lib/datadog/tracing/contrib/action_mailer/configuration/settings.rb +10 -7
- data/lib/datadog/tracing/contrib/action_mailer/event.rb +1 -1
- 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 +1 -1
- data/lib/datadog/tracing/contrib/action_mailer/ext.rb +19 -19
- data/lib/datadog/tracing/contrib/action_mailer/integration.rb +0 -2
- data/lib/datadog/tracing/contrib/action_mailer/patcher.rb +1 -1
- data/lib/datadog/tracing/contrib/action_pack/action_controller/instrumentation.rb +2 -26
- data/lib/datadog/tracing/contrib/action_pack/action_controller/patcher.rb +1 -1
- data/lib/datadog/tracing/contrib/action_pack/configuration/settings.rb +22 -9
- data/lib/datadog/tracing/contrib/action_pack/ext.rb +9 -9
- data/lib/datadog/tracing/contrib/action_pack/integration.rb +0 -2
- data/lib/datadog/tracing/contrib/action_pack/patcher.rb +1 -1
- data/lib/datadog/tracing/contrib/action_pack/utils.rb +0 -2
- data/lib/datadog/tracing/contrib/action_view/configuration/settings.rb +9 -8
- data/lib/datadog/tracing/contrib/action_view/event.rb +1 -1
- 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 +1 -1
- data/lib/datadog/tracing/contrib/action_view/ext.rb +11 -11
- 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 +14 -8
- data/lib/datadog/tracing/contrib/active_job/event.rb +1 -1
- 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 +1 -1
- data/lib/datadog/tracing/contrib/active_job/ext.rb +24 -24
- data/lib/datadog/tracing/contrib/active_job/integration.rb +0 -2
- data/lib/datadog/tracing/contrib/active_job/log_injection.rb +2 -2
- data/lib/datadog/tracing/contrib/active_job/patcher.rb +2 -2
- data/lib/datadog/tracing/contrib/active_model_serializers/configuration/settings.rb +10 -7
- data/lib/datadog/tracing/contrib/active_model_serializers/event.rb +1 -1
- 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 +1 -1
- data/lib/datadog/tracing/contrib/active_model_serializers/ext.rb +11 -11
- data/lib/datadog/tracing/contrib/active_model_serializers/integration.rb +0 -2
- data/lib/datadog/tracing/contrib/active_model_serializers/patcher.rb +1 -1
- data/lib/datadog/tracing/contrib/active_record/configuration/makara_resolver.rb +0 -2
- data/lib/datadog/tracing/contrib/active_record/configuration/resolver.rb +18 -13
- data/lib/datadog/tracing/contrib/active_record/configuration/settings.rb +16 -9
- data/lib/datadog/tracing/contrib/active_record/event.rb +1 -1
- data/lib/datadog/tracing/contrib/active_record/events/instantiation.rb +0 -2
- data/lib/datadog/tracing/contrib/active_record/events/sql.rb +3 -6
- data/lib/datadog/tracing/contrib/active_record/events.rb +1 -1
- data/lib/datadog/tracing/contrib/active_record/ext.rb +16 -16
- data/lib/datadog/tracing/contrib/active_record/integration.rb +0 -2
- data/lib/datadog/tracing/contrib/active_record/patcher.rb +1 -1
- data/lib/datadog/tracing/contrib/active_record/utils.rb +1 -3
- data/lib/datadog/tracing/contrib/active_record/vendor/connection_specification.rb +0 -2
- data/lib/datadog/tracing/contrib/active_support/cache/instrumentation.rb +107 -201
- data/lib/datadog/tracing/contrib/active_support/cache/patcher.rb +4 -1
- data/lib/datadog/tracing/contrib/active_support/cache/redis.rb +1 -1
- data/lib/datadog/tracing/contrib/active_support/configuration/settings.rb +18 -8
- data/lib/datadog/tracing/contrib/active_support/ext.rb +17 -17
- data/lib/datadog/tracing/contrib/active_support/integration.rb +0 -2
- data/lib/datadog/tracing/contrib/active_support/notifications/event.rb +1 -1
- data/lib/datadog/tracing/contrib/active_support/notifications/subscriber.rb +1 -1
- data/lib/datadog/tracing/contrib/active_support/notifications/subscription.rb +0 -2
- data/lib/datadog/tracing/contrib/active_support/patcher.rb +1 -1
- data/lib/datadog/tracing/contrib/analytics.rb +1 -1
- data/lib/datadog/tracing/contrib/auto_instrument.rb +1 -1
- data/lib/datadog/tracing/contrib/aws/configuration/settings.rb +24 -8
- data/lib/datadog/tracing/contrib/aws/ext.rb +36 -14
- data/lib/datadog/tracing/contrib/aws/instrumentation.rb +28 -3
- data/lib/datadog/tracing/contrib/aws/integration.rb +0 -2
- data/lib/datadog/tracing/contrib/aws/parsed_context.rb +4 -2
- data/lib/datadog/tracing/contrib/aws/patcher.rb +1 -1
- data/lib/datadog/tracing/contrib/aws/service/base.rb +16 -0
- data/lib/datadog/tracing/contrib/aws/service/dynamodb.rb +22 -0
- data/lib/datadog/tracing/contrib/aws/service/eventbridge.rb +22 -0
- data/lib/datadog/tracing/contrib/aws/service/kinesis.rb +32 -0
- data/lib/datadog/tracing/contrib/aws/service/s3.rb +22 -0
- data/lib/datadog/tracing/contrib/aws/service/sns.rb +30 -0
- data/lib/datadog/tracing/contrib/aws/service/sqs.rb +27 -0
- data/lib/datadog/tracing/contrib/aws/service/states.rb +40 -0
- data/lib/datadog/tracing/contrib/aws/services.rb +17 -3
- data/lib/datadog/tracing/contrib/concurrent_ruby/configuration/settings.rb +4 -3
- data/lib/datadog/tracing/contrib/concurrent_ruby/context_composite_executor_service.rb +15 -15
- data/lib/datadog/tracing/contrib/concurrent_ruby/ext.rb +3 -3
- data/lib/datadog/tracing/contrib/concurrent_ruby/future_patch.rb +4 -11
- data/lib/datadog/tracing/contrib/concurrent_ruby/integration.rb +2 -3
- data/lib/datadog/tracing/contrib/concurrent_ruby/patcher.rb +9 -3
- data/lib/datadog/tracing/contrib/concurrent_ruby/promises_future_patch.rb +22 -0
- data/lib/datadog/tracing/contrib/configurable.rb +1 -1
- data/lib/datadog/tracing/contrib/configuration/resolver.rb +1 -1
- data/lib/datadog/tracing/contrib/configuration/resolvers/pattern_resolver.rb +1 -1
- data/lib/datadog/tracing/contrib/configuration/settings.rb +1 -5
- data/lib/datadog/tracing/contrib/dalli/configuration/settings.rb +29 -8
- data/lib/datadog/tracing/contrib/dalli/ext.rb +25 -10
- data/lib/datadog/tracing/contrib/dalli/instrumentation.rb +23 -7
- data/lib/datadog/tracing/contrib/dalli/integration.rb +0 -2
- data/lib/datadog/tracing/contrib/dalli/patcher.rb +1 -1
- data/lib/datadog/tracing/contrib/dalli/quantize.rb +0 -2
- data/lib/datadog/tracing/contrib/delayed_job/configuration/settings.rb +14 -8
- data/lib/datadog/tracing/contrib/delayed_job/ext.rb +15 -15
- data/lib/datadog/tracing/contrib/delayed_job/integration.rb +0 -2
- data/lib/datadog/tracing/contrib/delayed_job/patcher.rb +1 -1
- data/lib/datadog/tracing/contrib/delayed_job/plugin.rb +9 -1
- data/lib/datadog/tracing/contrib/delayed_job/server_internal_tracer/worker.rb +3 -1
- data/lib/datadog/tracing/contrib/elasticsearch/configuration/settings.rb +24 -8
- data/lib/datadog/tracing/contrib/elasticsearch/ext.rb +20 -13
- data/lib/datadog/tracing/contrib/elasticsearch/integration.rb +0 -2
- data/lib/datadog/tracing/contrib/elasticsearch/patcher.rb +105 -95
- data/lib/datadog/tracing/contrib/elasticsearch/quantize.rb +0 -4
- data/lib/datadog/tracing/contrib/ethon/configuration/settings.rb +27 -10
- data/lib/datadog/tracing/contrib/ethon/easy_patch.rb +52 -7
- data/lib/datadog/tracing/contrib/ethon/ext.rb +18 -11
- data/lib/datadog/tracing/contrib/ethon/integration.rb +0 -2
- data/lib/datadog/tracing/contrib/ethon/multi_patch.rb +10 -3
- data/lib/datadog/tracing/contrib/ethon/patcher.rb +1 -2
- data/lib/datadog/tracing/contrib/excon/configuration/settings.rb +29 -11
- data/lib/datadog/tracing/contrib/excon/ext.rb +15 -8
- data/lib/datadog/tracing/contrib/excon/integration.rb +0 -2
- data/lib/datadog/tracing/contrib/excon/middleware.rb +27 -4
- data/lib/datadog/tracing/contrib/excon/patcher.rb +1 -1
- data/lib/datadog/tracing/contrib/ext.rb +55 -0
- data/lib/datadog/tracing/contrib/extensions.rb +32 -2
- data/lib/datadog/tracing/contrib/faraday/configuration/settings.rb +30 -11
- data/lib/datadog/tracing/contrib/faraday/connection.rb +1 -1
- data/lib/datadog/tracing/contrib/faraday/ext.rb +15 -8
- data/lib/datadog/tracing/contrib/faraday/integration.rb +0 -2
- data/lib/datadog/tracing/contrib/faraday/middleware.rb +24 -6
- data/lib/datadog/tracing/contrib/faraday/patcher.rb +0 -2
- data/lib/datadog/tracing/contrib/faraday/rack_builder.rb +1 -1
- data/lib/datadog/tracing/contrib/grape/configuration/settings.rb +9 -7
- data/lib/datadog/tracing/contrib/grape/endpoint.rb +0 -4
- data/lib/datadog/tracing/contrib/grape/ext.rb +15 -15
- 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 +1 -1
- data/lib/datadog/tracing/contrib/graphql/configuration/settings.rb +10 -8
- data/lib/datadog/tracing/contrib/graphql/ext.rb +6 -6
- 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 +50 -10
- data/lib/datadog/tracing/contrib/grpc/datadog_interceptor/client.rb +45 -19
- data/lib/datadog/tracing/contrib/grpc/datadog_interceptor/server.rb +43 -26
- data/lib/datadog/tracing/contrib/grpc/datadog_interceptor.rb +0 -6
- data/lib/datadog/tracing/contrib/grpc/distributed/fetcher.rb +26 -0
- data/lib/datadog/tracing/contrib/grpc/distributed/propagation.rb +42 -0
- data/lib/datadog/tracing/contrib/grpc/ext.rb +15 -11
- data/lib/datadog/tracing/contrib/grpc/formatting.rb +127 -0
- data/lib/datadog/tracing/contrib/grpc/integration.rb +8 -3
- data/lib/datadog/tracing/contrib/grpc/intercept_with_datadog.rb +1 -1
- data/lib/datadog/tracing/contrib/grpc/patcher.rb +1 -4
- data/lib/datadog/tracing/contrib/hanami/action_tracer.rb +47 -0
- data/lib/datadog/tracing/contrib/hanami/configuration/settings.rb +23 -0
- data/lib/datadog/tracing/contrib/hanami/ext.rb +24 -0
- data/lib/datadog/tracing/contrib/hanami/integration.rb +42 -0
- data/lib/datadog/tracing/contrib/hanami/patcher.rb +33 -0
- data/lib/datadog/tracing/contrib/hanami/plugin.rb +23 -0
- data/lib/datadog/tracing/contrib/hanami/renderer_policy_tracing.rb +41 -0
- data/lib/datadog/tracing/contrib/hanami/router_tracing.rb +44 -0
- data/lib/datadog/tracing/contrib/http/circuit_breaker.rb +6 -9
- data/lib/datadog/tracing/contrib/http/configuration/settings.rb +47 -10
- data/lib/datadog/tracing/contrib/http/distributed/fetcher.rb +38 -0
- data/lib/datadog/tracing/contrib/http/distributed/propagation.rb +37 -0
- data/lib/datadog/tracing/contrib/http/ext.rb +15 -8
- data/lib/datadog/tracing/contrib/http/instrumentation.rb +32 -12
- data/lib/datadog/tracing/contrib/http/integration.rb +1 -1
- data/lib/datadog/tracing/contrib/http/patcher.rb +1 -1
- data/lib/datadog/tracing/contrib/http_annotation_helper.rb +1 -1
- data/lib/datadog/tracing/contrib/httpclient/configuration/settings.rb +47 -10
- data/lib/datadog/tracing/contrib/httpclient/ext.rb +16 -8
- data/lib/datadog/tracing/contrib/httpclient/instrumentation.rb +27 -8
- 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 +47 -10
- data/lib/datadog/tracing/contrib/httprb/ext.rb +15 -8
- data/lib/datadog/tracing/contrib/httprb/instrumentation.rb +27 -9
- 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 +1 -1
- data/lib/datadog/tracing/contrib/kafka/configuration/settings.rb +10 -7
- data/lib/datadog/tracing/contrib/kafka/consumer_event.rb +2 -1
- data/lib/datadog/tracing/contrib/kafka/consumer_group_event.rb +1 -1
- data/lib/datadog/tracing/contrib/kafka/event.rb +2 -1
- 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 +1 -2
- data/lib/datadog/tracing/contrib/kafka/events/producer/deliver_messages.rb +1 -2
- data/lib/datadog/tracing/contrib/kafka/events.rb +1 -1
- data/lib/datadog/tracing/contrib/kafka/ext.rb +41 -39
- data/lib/datadog/tracing/contrib/kafka/integration.rb +0 -2
- data/lib/datadog/tracing/contrib/kafka/patcher.rb +1 -1
- data/lib/datadog/tracing/contrib/lograge/configuration/settings.rb +4 -3
- data/lib/datadog/tracing/contrib/lograge/ext.rb +2 -2
- data/lib/datadog/tracing/contrib/lograge/instrumentation.rb +3 -18
- data/lib/datadog/tracing/contrib/lograge/integration.rb +0 -2
- data/lib/datadog/tracing/contrib/lograge/patcher.rb +1 -1
- data/lib/datadog/tracing/contrib/mongodb/configuration/settings.rb +24 -8
- data/lib/datadog/tracing/contrib/mongodb/ext.rb +24 -14
- data/lib/datadog/tracing/contrib/mongodb/instrumentation.rb +1 -1
- 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 +1 -1
- data/lib/datadog/tracing/contrib/mongodb/subscribers.rb +22 -4
- data/lib/datadog/tracing/contrib/mysql2/configuration/settings.rb +35 -8
- data/lib/datadog/tracing/contrib/mysql2/ext.rb +14 -9
- data/lib/datadog/tracing/contrib/mysql2/instrumentation.rb +38 -4
- data/lib/datadog/tracing/contrib/mysql2/integration.rb +0 -2
- data/lib/datadog/tracing/contrib/mysql2/patcher.rb +1 -1
- data/lib/datadog/tracing/contrib/opensearch/configuration/settings.rb +52 -0
- data/lib/datadog/tracing/contrib/opensearch/ext.rb +37 -0
- data/lib/datadog/tracing/contrib/opensearch/integration.rb +44 -0
- data/lib/datadog/tracing/contrib/opensearch/patcher.rb +135 -0
- data/lib/datadog/tracing/contrib/opensearch/quantize.rb +81 -0
- data/lib/datadog/tracing/contrib/patchable.rb +1 -1
- data/lib/datadog/tracing/contrib/patcher.rb +3 -5
- data/lib/datadog/tracing/contrib/pg/configuration/settings.rb +36 -8
- data/lib/datadog/tracing/contrib/pg/ext.rb +21 -18
- data/lib/datadog/tracing/contrib/pg/instrumentation.rb +115 -39
- data/lib/datadog/tracing/contrib/pg/integration.rb +0 -2
- data/lib/datadog/tracing/contrib/pg/patcher.rb +1 -1
- data/lib/datadog/tracing/contrib/presto/configuration/settings.rb +23 -8
- data/lib/datadog/tracing/contrib/presto/ext.rb +24 -19
- data/lib/datadog/tracing/contrib/presto/instrumentation.rb +17 -5
- 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 +41 -0
- data/lib/datadog/tracing/contrib/propagation/sql_comment/ext.rb +33 -0
- data/lib/datadog/tracing/contrib/propagation/sql_comment/mode.rb +28 -0
- data/lib/datadog/tracing/contrib/propagation/sql_comment.rb +53 -0
- data/lib/datadog/tracing/contrib/qless/configuration/settings.rb +13 -9
- data/lib/datadog/tracing/contrib/qless/ext.rb +13 -13
- data/lib/datadog/tracing/contrib/qless/integration.rb +0 -2
- data/lib/datadog/tracing/contrib/qless/patcher.rb +1 -2
- data/lib/datadog/tracing/contrib/qless/qless_job.rb +3 -2
- data/lib/datadog/tracing/contrib/qless/tracer_cleaner.rb +1 -1
- data/lib/datadog/tracing/contrib/que/configuration/settings.rb +21 -14
- 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 +4 -2
- data/lib/datadog/tracing/contrib/racecar/configuration/settings.rb +18 -8
- data/lib/datadog/tracing/contrib/racecar/event.rb +7 -4
- data/lib/datadog/tracing/contrib/racecar/events/batch.rb +4 -3
- data/lib/datadog/tracing/contrib/racecar/events/consume.rb +0 -2
- data/lib/datadog/tracing/contrib/racecar/events/message.rb +4 -3
- data/lib/datadog/tracing/contrib/racecar/events.rb +1 -1
- data/lib/datadog/tracing/contrib/racecar/ext.rb +19 -18
- data/lib/datadog/tracing/contrib/racecar/integration.rb +0 -2
- data/lib/datadog/tracing/contrib/racecar/patcher.rb +1 -1
- data/lib/datadog/tracing/contrib/rack/configuration/settings.rb +16 -14
- data/lib/datadog/tracing/contrib/rack/ext.rb +17 -12
- data/lib/datadog/tracing/contrib/rack/header_collection.rb +38 -0
- data/lib/datadog/tracing/contrib/rack/header_tagging.rb +63 -0
- data/lib/datadog/tracing/contrib/rack/integration.rb +0 -2
- data/lib/datadog/tracing/contrib/rack/middlewares.rb +130 -81
- 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 -4
- data/lib/datadog/tracing/contrib/rails/configuration/settings.rb +28 -19
- data/lib/datadog/tracing/contrib/rails/ext.rb +6 -6
- data/lib/datadog/tracing/contrib/rails/framework.rb +1 -1
- data/lib/datadog/tracing/contrib/rails/integration.rb +0 -2
- data/lib/datadog/tracing/contrib/rails/log_injection.rb +7 -12
- data/lib/datadog/tracing/contrib/rails/middlewares.rb +1 -1
- data/lib/datadog/tracing/contrib/rails/patcher.rb +10 -43
- data/lib/datadog/tracing/contrib/rails/railtie.rb +3 -5
- data/lib/datadog/tracing/contrib/rails/utils.rb +2 -2
- data/lib/datadog/tracing/contrib/rake/configuration/settings.rb +14 -11
- data/lib/datadog/tracing/contrib/rake/ext.rb +13 -13
- 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 +1 -1
- data/lib/datadog/tracing/contrib/redis/configuration/resolver.rb +0 -2
- data/lib/datadog/tracing/contrib/redis/configuration/settings.rb +26 -10
- data/lib/datadog/tracing/contrib/redis/ext.rb +21 -13
- data/lib/datadog/tracing/contrib/redis/instrumentation.rb +13 -39
- data/lib/datadog/tracing/contrib/redis/integration.rb +34 -3
- data/lib/datadog/tracing/contrib/redis/patcher.rb +53 -11
- data/lib/datadog/tracing/contrib/redis/quantize.rb +11 -10
- data/lib/datadog/tracing/contrib/redis/tags.rb +24 -9
- data/lib/datadog/tracing/contrib/redis/trace_middleware.rb +83 -0
- data/lib/datadog/tracing/contrib/redis/vendor/resolver.rb +0 -2
- data/lib/datadog/tracing/contrib/registerable.rb +1 -1
- data/lib/datadog/tracing/contrib/registry.rb +1 -1
- data/lib/datadog/tracing/contrib/resque/configuration/settings.rb +14 -8
- data/lib/datadog/tracing/contrib/resque/ext.rb +8 -8
- data/lib/datadog/tracing/contrib/resque/integration.rb +0 -2
- data/lib/datadog/tracing/contrib/resque/patcher.rb +1 -1
- data/lib/datadog/tracing/contrib/resque/resque_job.rb +5 -1
- data/lib/datadog/tracing/contrib/rest_client/configuration/settings.rb +27 -10
- data/lib/datadog/tracing/contrib/rest_client/ext.rb +14 -8
- data/lib/datadog/tracing/contrib/rest_client/integration.rb +0 -2
- data/lib/datadog/tracing/contrib/rest_client/patcher.rb +1 -2
- data/lib/datadog/tracing/contrib/rest_client/request_patch.rb +28 -3
- data/lib/datadog/tracing/contrib/roda/configuration/settings.rb +37 -0
- data/lib/datadog/tracing/contrib/roda/ext.rb +18 -0
- data/lib/datadog/tracing/contrib/roda/instrumentation.rb +76 -0
- data/lib/datadog/tracing/contrib/roda/integration.rb +45 -0
- data/lib/datadog/{ci/contrib/cucumber → tracing/contrib/roda}/patcher.rb +10 -7
- data/lib/datadog/tracing/contrib/semantic_logger/configuration/settings.rb +4 -3
- data/lib/datadog/tracing/contrib/semantic_logger/ext.rb +2 -2
- data/lib/datadog/tracing/contrib/semantic_logger/instrumentation.rb +6 -21
- data/lib/datadog/tracing/contrib/semantic_logger/integration.rb +0 -2
- data/lib/datadog/tracing/contrib/semantic_logger/patcher.rb +1 -1
- data/lib/datadog/tracing/contrib/sequel/configuration/settings.rb +10 -7
- data/lib/datadog/tracing/contrib/sequel/database.rb +4 -3
- data/lib/datadog/tracing/contrib/sequel/dataset.rb +5 -2
- data/lib/datadog/tracing/contrib/sequel/ext.rb +9 -9
- data/lib/datadog/tracing/contrib/sequel/integration.rb +0 -2
- data/lib/datadog/tracing/contrib/sequel/patcher.rb +1 -1
- data/lib/datadog/tracing/contrib/sequel/utils.rb +7 -6
- data/lib/datadog/tracing/contrib/shoryuken/configuration/settings.rb +15 -9
- data/lib/datadog/tracing/contrib/shoryuken/ext.rb +13 -12
- data/lib/datadog/tracing/contrib/shoryuken/integration.rb +0 -2
- data/lib/datadog/tracing/contrib/shoryuken/patcher.rb +1 -1
- data/lib/datadog/tracing/contrib/shoryuken/tracer.rb +5 -1
- data/lib/datadog/tracing/contrib/sidekiq/client_tracer.rb +18 -4
- data/lib/datadog/tracing/contrib/sidekiq/configuration/settings.rb +19 -11
- data/lib/datadog/tracing/contrib/sidekiq/distributed/propagation.rb +38 -0
- data/lib/datadog/tracing/contrib/sidekiq/ext.rb +31 -31
- data/lib/datadog/tracing/contrib/sidekiq/integration.rb +8 -2
- data/lib/datadog/tracing/contrib/sidekiq/patcher.rb +15 -3
- data/lib/datadog/tracing/contrib/sidekiq/server_internal_tracer/heartbeat.rb +14 -5
- data/lib/datadog/tracing/contrib/sidekiq/server_internal_tracer/job_fetch.rb +3 -1
- data/lib/datadog/tracing/contrib/sidekiq/server_internal_tracer/redis_info.rb +3 -1
- data/lib/datadog/tracing/contrib/sidekiq/server_internal_tracer/scheduled_poller.rb +5 -1
- data/lib/datadog/tracing/contrib/sidekiq/server_internal_tracer/stop.rb +34 -0
- data/lib/datadog/tracing/contrib/sidekiq/server_tracer.rb +24 -3
- data/lib/datadog/tracing/contrib/sidekiq/{tracing.rb → utils.rb} +2 -2
- data/lib/datadog/tracing/contrib/sinatra/configuration/settings.rb +11 -11
- data/lib/datadog/tracing/contrib/sinatra/env.rb +11 -41
- data/lib/datadog/tracing/contrib/sinatra/ext.rb +23 -19
- data/lib/datadog/tracing/contrib/sinatra/framework.rb +0 -2
- data/lib/datadog/tracing/contrib/sinatra/integration.rb +0 -2
- data/lib/datadog/tracing/contrib/sinatra/patcher.rb +2 -3
- data/lib/datadog/tracing/contrib/sinatra/tracer.rb +8 -82
- data/lib/datadog/tracing/contrib/sinatra/tracer_middleware.rb +14 -20
- data/lib/datadog/tracing/contrib/sneakers/configuration/settings.rb +14 -10
- data/lib/datadog/tracing/contrib/sneakers/ext.rb +2 -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 +5 -2
- data/lib/datadog/tracing/contrib/span_attribute_schema.rb +92 -0
- data/lib/datadog/tracing/contrib/status_code_matcher.rb +0 -3
- data/lib/datadog/tracing/contrib/stripe/configuration/settings.rb +36 -0
- data/lib/datadog/tracing/contrib/stripe/ext.rb +26 -0
- data/lib/datadog/tracing/contrib/stripe/integration.rb +43 -0
- data/lib/datadog/tracing/contrib/stripe/patcher.rb +28 -0
- data/lib/datadog/tracing/contrib/stripe/request.rb +67 -0
- data/lib/datadog/tracing/contrib/sucker_punch/configuration/settings.rb +10 -7
- data/lib/datadog/tracing/contrib/sucker_punch/exception_handler.rb +1 -1
- data/lib/datadog/tracing/contrib/sucker_punch/ext.rb +14 -14
- 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 +1 -2
- data/lib/datadog/tracing/contrib/utils/database.rb +4 -4
- data/lib/datadog/tracing/contrib/utils/quantization/hash.rb +0 -2
- data/lib/datadog/tracing/contrib/utils/quantization/http.rb +92 -14
- data/lib/datadog/tracing/contrib.rb +5 -1
- data/lib/datadog/tracing/correlation.rb +42 -14
- data/lib/datadog/tracing/diagnostics/environment_logger.rb +165 -0
- data/lib/datadog/{core → tracing}/diagnostics/ext.rb +21 -26
- data/lib/datadog/tracing/diagnostics/health.rb +40 -0
- data/lib/datadog/tracing/distributed/b3_multi.rb +72 -0
- data/lib/datadog/tracing/distributed/b3_single.rb +68 -0
- data/lib/datadog/tracing/distributed/datadog.rb +199 -0
- data/lib/datadog/tracing/distributed/datadog_tags_codec.rb +84 -0
- data/lib/datadog/tracing/distributed/fetcher.rb +21 -0
- data/lib/datadog/tracing/distributed/headers/ext.rb +19 -16
- data/lib/datadog/tracing/distributed/helpers.rb +26 -39
- data/lib/datadog/tracing/distributed/none.rb +18 -0
- data/lib/datadog/tracing/distributed/propagation.rb +127 -0
- data/lib/datadog/tracing/distributed/trace_context.rb +415 -0
- data/lib/datadog/tracing/event.rb +0 -4
- data/lib/datadog/tracing/flush.rb +58 -36
- data/lib/datadog/tracing/metadata/analytics.rb +1 -1
- data/lib/datadog/tracing/metadata/errors.rb +1 -1
- data/lib/datadog/tracing/metadata/ext.rb +29 -14
- data/lib/datadog/tracing/metadata/tagging.rb +17 -4
- data/lib/datadog/tracing/metadata.rb +1 -1
- data/lib/datadog/tracing/pipeline/span_filter.rb +1 -1
- data/lib/datadog/tracing/pipeline/span_processor.rb +1 -1
- data/lib/datadog/tracing/pipeline.rb +0 -4
- data/lib/datadog/tracing/propagation/http.rb +4 -99
- data/lib/datadog/tracing/remote.rb +78 -0
- data/lib/datadog/tracing/runtime/metrics.rb +1 -3
- data/lib/datadog/tracing/sampling/all_sampler.rb +1 -1
- data/lib/datadog/tracing/sampling/ext.rb +30 -1
- data/lib/datadog/tracing/sampling/matcher.rb +1 -1
- data/lib/datadog/tracing/sampling/priority_sampler.rb +58 -5
- data/lib/datadog/tracing/sampling/rate_by_key_sampler.rb +8 -11
- data/lib/datadog/tracing/sampling/rate_by_service_sampler.rb +29 -8
- data/lib/datadog/tracing/sampling/rate_limiter.rb +3 -2
- data/lib/datadog/tracing/sampling/rate_sampler.rb +23 -10
- data/lib/datadog/tracing/sampling/rule.rb +0 -4
- data/lib/datadog/tracing/sampling/rule_sampler.rb +33 -7
- data/lib/datadog/tracing/sampling/sampler.rb +0 -2
- data/lib/datadog/tracing/sampling/span/ext.rb +25 -0
- data/lib/datadog/tracing/sampling/span/matcher.rb +9 -0
- data/lib/datadog/tracing/sampling/span/rule.rb +82 -0
- data/lib/datadog/tracing/sampling/span/rule_parser.rb +104 -0
- data/lib/datadog/tracing/sampling/span/sampler.rb +77 -0
- data/lib/datadog/tracing/span.rb +3 -21
- data/lib/datadog/tracing/span_operation.rb +8 -24
- data/lib/datadog/tracing/sync_writer.rb +4 -6
- data/lib/datadog/tracing/trace_digest.rb +120 -3
- data/lib/datadog/tracing/trace_operation.rb +61 -13
- data/lib/datadog/tracing/trace_segment.rb +20 -7
- data/lib/datadog/tracing/tracer.rb +46 -10
- data/lib/datadog/tracing/transport/http/api/instance.rb +37 -0
- data/lib/datadog/tracing/transport/http/api/spec.rb +19 -0
- data/lib/datadog/tracing/transport/http/api.rb +43 -0
- data/lib/datadog/tracing/transport/http/builder.rb +162 -0
- data/lib/datadog/tracing/transport/http/client.rb +57 -0
- data/lib/datadog/tracing/transport/http/statistics.rb +47 -0
- data/lib/datadog/tracing/transport/http/traces.rb +152 -0
- data/lib/datadog/tracing/transport/http.rb +124 -0
- data/lib/datadog/tracing/transport/io/client.rb +89 -0
- data/lib/datadog/tracing/transport/io/response.rb +27 -0
- data/lib/datadog/tracing/transport/io/traces.rb +101 -0
- data/lib/datadog/tracing/transport/io.rb +30 -0
- data/lib/datadog/tracing/transport/serializable_trace.rb +126 -0
- data/lib/datadog/tracing/transport/statistics.rb +77 -0
- data/lib/datadog/tracing/transport/trace_formatter.rb +209 -0
- data/lib/datadog/tracing/transport/traces.rb +224 -0
- data/lib/datadog/tracing/utils.rb +83 -0
- data/lib/datadog/tracing/workers/trace_writer.rb +6 -7
- data/lib/datadog/tracing/workers.rb +4 -6
- data/lib/datadog/tracing/writer.rb +12 -6
- data/lib/datadog/tracing.rb +1 -1
- data/lib/ddtrace/auto_instrument.rb +1 -1
- data/lib/ddtrace/auto_instrument_base.rb +1 -1
- data/lib/ddtrace/profiling/preload.rb +0 -2
- data/lib/ddtrace/transport/ext.rb +21 -15
- data/lib/ddtrace/version.rb +14 -15
- data/lib/ddtrace.rb +3 -5
- metadata +230 -113
- data/ext/ddtrace_profiling_native_extension/collectors_cpu_and_wall_time.c +0 -390
- data/ext/ddtrace_profiling_native_extension/collectors_cpu_and_wall_time.h +0 -6
- data/lib/datadog/appsec/assets/waf_rules/risky.json +0 -1499
- data/lib/datadog/appsec/contrib/configuration/settings.rb +0 -20
- data/lib/datadog/appsec/contrib/rack/configuration/settings.rb +0 -22
- data/lib/datadog/appsec/contrib/rack/request.rb +0 -58
- data/lib/datadog/appsec/contrib/rack/response.rb +0 -24
- data/lib/datadog/appsec/contrib/rails/configuration/settings.rb +0 -22
- data/lib/datadog/appsec/contrib/sinatra/configuration/settings.rb +0 -22
- data/lib/datadog/ci/configuration/components.rb +0 -32
- data/lib/datadog/ci/configuration/settings.rb +0 -53
- data/lib/datadog/ci/contrib/cucumber/configuration/settings.rb +0 -33
- data/lib/datadog/ci/contrib/cucumber/ext.rb +0 -22
- data/lib/datadog/ci/contrib/cucumber/formatter.rb +0 -94
- data/lib/datadog/ci/contrib/cucumber/instrumentation.rb +0 -28
- data/lib/datadog/ci/contrib/cucumber/integration.rb +0 -49
- data/lib/datadog/ci/contrib/rspec/configuration/settings.rb +0 -33
- data/lib/datadog/ci/contrib/rspec/example.rb +0 -70
- data/lib/datadog/ci/contrib/rspec/ext.rb +0 -21
- data/lib/datadog/ci/contrib/rspec/integration.rb +0 -50
- data/lib/datadog/ci/contrib/rspec/patcher.rb +0 -27
- data/lib/datadog/ci/ext/app_types.rb +0 -11
- data/lib/datadog/ci/ext/environment.rb +0 -505
- data/lib/datadog/ci/ext/settings.rb +0 -12
- data/lib/datadog/ci/ext/test.rb +0 -37
- data/lib/datadog/ci/extensions.rb +0 -19
- data/lib/datadog/ci/flush.rb +0 -38
- data/lib/datadog/ci/test.rb +0 -83
- data/lib/datadog/ci.rb +0 -20
- data/lib/datadog/core/configuration/dependency_resolver.rb +0 -28
- data/lib/datadog/core/configuration/option_definition_set.rb +0 -22
- data/lib/datadog/core/configuration/option_set.rb +0 -10
- data/lib/datadog/core/utils/object_set.rb +0 -43
- data/lib/datadog/core/utils/string_table.rb +0 -49
- data/lib/datadog/profiling/backtrace_location.rb +0 -34
- data/lib/datadog/profiling/buffer.rb +0 -43
- data/lib/datadog/profiling/collectors/cpu_and_wall_time.rb +0 -27
- data/lib/datadog/profiling/collectors/old_stack.rb +0 -298
- data/lib/datadog/profiling/encoding/profile.rb +0 -43
- data/lib/datadog/profiling/event.rb +0 -15
- data/lib/datadog/profiling/events/stack.rb +0 -82
- data/lib/datadog/profiling/old_ext.rb +0 -42
- data/lib/datadog/profiling/old_recorder.rb +0 -101
- data/lib/datadog/profiling/pprof/builder.rb +0 -127
- data/lib/datadog/profiling/pprof/converter.rb +0 -104
- data/lib/datadog/profiling/pprof/message_set.rb +0 -16
- data/lib/datadog/profiling/pprof/payload.rb +0 -20
- data/lib/datadog/profiling/pprof/pprof.proto +0 -212
- data/lib/datadog/profiling/pprof/pprof_pb.rb +0 -83
- data/lib/datadog/profiling/pprof/stack_sample.rb +0 -141
- data/lib/datadog/profiling/pprof/string_table.rb +0 -12
- data/lib/datadog/profiling/pprof/template.rb +0 -120
- data/lib/datadog/profiling/trace_identifiers/ddtrace.rb +0 -45
- data/lib/datadog/profiling/trace_identifiers/helper.rb +0 -47
- data/lib/datadog/profiling/transport/http/api/endpoint.rb +0 -85
- data/lib/datadog/profiling/transport/http/api/instance.rb +0 -38
- data/lib/datadog/profiling/transport/http/api/spec.rb +0 -42
- data/lib/datadog/profiling/transport/http/api.rb +0 -45
- data/lib/datadog/profiling/transport/http/builder.rb +0 -30
- data/lib/datadog/profiling/transport/http/client.rb +0 -37
- data/lib/datadog/profiling/transport/http/response.rb +0 -21
- data/lib/datadog/profiling/transport/http.rb +0 -118
- data/lib/datadog/tracing/contrib/sinatra/headers.rb +0 -35
- data/lib/datadog/tracing/distributed/headers/b3.rb +0 -55
- data/lib/datadog/tracing/distributed/headers/b3_single.rb +0 -67
- data/lib/datadog/tracing/distributed/headers/datadog.rb +0 -52
- data/lib/datadog/tracing/distributed/headers/parser.rb +0 -37
- data/lib/datadog/tracing/distributed/metadata/b3.rb +0 -55
- data/lib/datadog/tracing/distributed/metadata/b3_single.rb +0 -66
- data/lib/datadog/tracing/distributed/metadata/datadog.rb +0 -73
- data/lib/datadog/tracing/distributed/metadata/parser.rb +0 -34
- data/lib/datadog/tracing/propagation/grpc.rb +0 -98
- data/lib/ddtrace/transport/http/adapters/net.rb +0 -158
- data/lib/ddtrace/transport/http/adapters/registry.rb +0 -27
- data/lib/ddtrace/transport/http/adapters/test.rb +0 -87
- data/lib/ddtrace/transport/http/adapters/unix_socket.rb +0 -79
- data/lib/ddtrace/transport/http/api/endpoint.rb +0 -29
- data/lib/ddtrace/transport/http/api/fallbacks.rb +0 -24
- data/lib/ddtrace/transport/http/api/instance.rb +0 -35
- data/lib/ddtrace/transport/http/api/map.rb +0 -16
- data/lib/ddtrace/transport/http/api/spec.rb +0 -17
- data/lib/ddtrace/transport/http/api.rb +0 -41
- data/lib/ddtrace/transport/http/builder.rb +0 -178
- data/lib/ddtrace/transport/http/client.rb +0 -54
- data/lib/ddtrace/transport/http/env.rb +0 -58
- data/lib/ddtrace/transport/http/response.rb +0 -58
- data/lib/ddtrace/transport/http/statistics.rb +0 -45
- data/lib/ddtrace/transport/http/traces.rb +0 -146
- data/lib/ddtrace/transport/http.rb +0 -121
- data/lib/ddtrace/transport/io/client.rb +0 -87
- data/lib/ddtrace/transport/io/response.rb +0 -25
- data/lib/ddtrace/transport/io/traces.rb +0 -101
- data/lib/ddtrace/transport/io.rb +0 -28
- data/lib/ddtrace/transport/parcel.rb +0 -22
- data/lib/ddtrace/transport/request.rb +0 -15
- data/lib/ddtrace/transport/response.rb +0 -62
- data/lib/ddtrace/transport/serializable_trace.rb +0 -118
- data/lib/ddtrace/transport/statistics.rb +0 -75
- data/lib/ddtrace/transport/trace_formatter.rb +0 -187
- data/lib/ddtrace/transport/traces.rb +0 -216
|
@@ -6,8 +6,10 @@
|
|
|
6
6
|
#include "stack_recorder.h"
|
|
7
7
|
#include "libdatadog_helpers.h"
|
|
8
8
|
#include "ruby_helpers.h"
|
|
9
|
+
#include "time_helpers.h"
|
|
10
|
+
#include "heap_recorder.h"
|
|
9
11
|
|
|
10
|
-
// Used to wrap a
|
|
12
|
+
// Used to wrap a ddog_prof_Profile in a Ruby object and expose Ruby-level serialization APIs
|
|
11
13
|
// This file implements the native bits of the Datadog::Profiling::StackRecorder class
|
|
12
14
|
|
|
13
15
|
// ---
|
|
@@ -24,7 +26,7 @@
|
|
|
24
26
|
// 2. The thread that serializes and reports profiles, let's call it the **serializer thread**. We enforce that there
|
|
25
27
|
// cannot be more than one thread attempting to serialize profiles at a time.
|
|
26
28
|
//
|
|
27
|
-
// If both the sampler and serializer threads are trying to access the same `
|
|
29
|
+
// If both the sampler and serializer threads are trying to access the same `ddog_prof_Profile` in parallel, we will
|
|
28
30
|
// have a concurrency issue. Thus, the StackRecorder has an added mechanism to avoid this.
|
|
29
31
|
//
|
|
30
32
|
// As an additional constraint, the **sampler thread** has absolute priority and must never block while
|
|
@@ -32,7 +34,7 @@
|
|
|
32
34
|
//
|
|
33
35
|
// ### The solution: Keep two profiles at the same time
|
|
34
36
|
//
|
|
35
|
-
// To solve for the constraints above, the StackRecorder keeps two `
|
|
37
|
+
// To solve for the constraints above, the StackRecorder keeps two `ddog_prof_Profile` profile instances inside itself.
|
|
36
38
|
// They are called the `slot_one_profile` and `slot_two_profile`.
|
|
37
39
|
//
|
|
38
40
|
// Each profile is paired with its own mutex. `slot_one_profile` is protected by `slot_one_mutex` and `slot_two_profile`
|
|
@@ -128,54 +130,122 @@
|
|
|
128
130
|
static VALUE ok_symbol = Qnil; // :ok in Ruby
|
|
129
131
|
static VALUE error_symbol = Qnil; // :error in Ruby
|
|
130
132
|
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
|
|
133
|
+
// Note: Please DO NOT use `VALUE_STRING` anywhere else, instead use `DDOG_CHARSLICE_C`.
|
|
134
|
+
// `VALUE_STRING` is only needed because older versions of gcc (4.9.2, used in our Ruby 2.2 CI test images)
|
|
135
|
+
// tripped when compiling `enabled_value_types` using `-std=gnu99` due to the extra cast that is included in
|
|
136
|
+
// `DDOG_CHARSLICE_C` with the following error:
|
|
137
|
+
//
|
|
138
|
+
// ```
|
|
139
|
+
// compiling ../../../../ext/ddtrace_profiling_native_extension/stack_recorder.c
|
|
140
|
+
// ../../../../ext/ddtrace_profiling_native_extension/stack_recorder.c:23:1: error: initializer element is not constant
|
|
141
|
+
// static const ddog_prof_ValueType enabled_value_types[] = {CPU_TIME_VALUE, CPU_SAMPLES_VALUE, WALL_TIME_VALUE};
|
|
142
|
+
// ^
|
|
143
|
+
// ```
|
|
144
|
+
#define VALUE_STRING(string) {.ptr = "" string, .len = sizeof(string) - 1}
|
|
145
|
+
|
|
146
|
+
#define CPU_TIME_VALUE {.type_ = VALUE_STRING("cpu-time"), .unit = VALUE_STRING("nanoseconds")}
|
|
147
|
+
#define CPU_TIME_VALUE_ID 0
|
|
148
|
+
#define CPU_SAMPLES_VALUE {.type_ = VALUE_STRING("cpu-samples"), .unit = VALUE_STRING("count")}
|
|
149
|
+
#define CPU_SAMPLES_VALUE_ID 1
|
|
150
|
+
#define WALL_TIME_VALUE {.type_ = VALUE_STRING("wall-time"), .unit = VALUE_STRING("nanoseconds")}
|
|
151
|
+
#define WALL_TIME_VALUE_ID 2
|
|
152
|
+
#define ALLOC_SAMPLES_VALUE {.type_ = VALUE_STRING("alloc-samples"), .unit = VALUE_STRING("count")}
|
|
153
|
+
#define ALLOC_SAMPLES_VALUE_ID 3
|
|
154
|
+
#define HEAP_SAMPLES_VALUE {.type_ = VALUE_STRING("heap-live-samples"), .unit = VALUE_STRING("count")}
|
|
155
|
+
#define HEAP_SAMPLES_VALUE_ID 4
|
|
156
|
+
#define HEAP_SIZE_VALUE {.type_ = VALUE_STRING("heap-live-size"), .unit = VALUE_STRING("bytes")}
|
|
157
|
+
#define HEAP_SIZE_VALUE_ID 5
|
|
158
|
+
#define TIMELINE_VALUE {.type_ = VALUE_STRING("timeline"), .unit = VALUE_STRING("nanoseconds")}
|
|
159
|
+
#define TIMELINE_VALUE_ID 6
|
|
160
|
+
|
|
161
|
+
static const ddog_prof_ValueType all_value_types[] =
|
|
162
|
+
{CPU_TIME_VALUE, CPU_SAMPLES_VALUE, WALL_TIME_VALUE, ALLOC_SAMPLES_VALUE, HEAP_SAMPLES_VALUE, HEAP_SIZE_VALUE, TIMELINE_VALUE};
|
|
163
|
+
|
|
164
|
+
// This array MUST be kept in sync with all_value_types above and is intended to act as a "hashmap" between VALUE_ID and the position it
|
|
165
|
+
// occupies on the all_value_types array.
|
|
166
|
+
// E.g. all_value_types_positions[CPU_TIME_VALUE_ID] => 0, means that CPU_TIME_VALUE was declared at position 0 of all_value_types.
|
|
167
|
+
static const uint8_t all_value_types_positions[] =
|
|
168
|
+
{CPU_TIME_VALUE_ID, CPU_SAMPLES_VALUE_ID, WALL_TIME_VALUE_ID, ALLOC_SAMPLES_VALUE_ID, HEAP_SAMPLES_VALUE_ID, HEAP_SIZE_VALUE_ID, TIMELINE_VALUE_ID};
|
|
169
|
+
|
|
170
|
+
#define ALL_VALUE_TYPES_COUNT (sizeof(all_value_types) / sizeof(ddog_prof_ValueType))
|
|
134
171
|
|
|
135
172
|
// Contains native state for each instance
|
|
136
173
|
struct stack_recorder_state {
|
|
174
|
+
// Heap recorder instance
|
|
175
|
+
heap_recorder *heap_recorder;
|
|
176
|
+
|
|
137
177
|
pthread_mutex_t slot_one_mutex;
|
|
138
|
-
|
|
178
|
+
ddog_prof_Profile slot_one_profile;
|
|
139
179
|
|
|
140
180
|
pthread_mutex_t slot_two_mutex;
|
|
141
|
-
|
|
181
|
+
ddog_prof_Profile slot_two_profile;
|
|
142
182
|
|
|
143
183
|
short active_slot; // MUST NEVER BE ACCESSED FROM record_sample; this is NOT for the sampler thread to use.
|
|
184
|
+
|
|
185
|
+
uint8_t position_for[ALL_VALUE_TYPES_COUNT];
|
|
186
|
+
uint8_t enabled_values_count;
|
|
144
187
|
};
|
|
145
188
|
|
|
146
189
|
// Used to return a pair of values from sampler_lock_active_profile()
|
|
147
190
|
struct active_slot_pair {
|
|
148
191
|
pthread_mutex_t *mutex;
|
|
149
|
-
|
|
192
|
+
ddog_prof_Profile *profile;
|
|
150
193
|
};
|
|
151
194
|
|
|
152
195
|
struct call_serialize_without_gvl_arguments {
|
|
153
196
|
// Set by caller
|
|
154
197
|
struct stack_recorder_state *state;
|
|
198
|
+
ddog_Timespec finish_timestamp;
|
|
199
|
+
size_t gc_count_before_serialize;
|
|
155
200
|
|
|
156
201
|
// Set by callee
|
|
157
|
-
|
|
158
|
-
|
|
202
|
+
ddog_prof_Profile *profile;
|
|
203
|
+
ddog_prof_Profile_SerializeResult result;
|
|
159
204
|
|
|
160
205
|
// Set by both
|
|
161
206
|
bool serialize_ran;
|
|
162
207
|
};
|
|
163
208
|
|
|
164
209
|
static VALUE _native_new(VALUE klass);
|
|
210
|
+
static void initialize_slot_concurrency_control(struct stack_recorder_state *state);
|
|
211
|
+
static void initialize_profiles(struct stack_recorder_state *state, ddog_prof_Slice_ValueType sample_types);
|
|
165
212
|
static void stack_recorder_typed_data_free(void *data);
|
|
213
|
+
static VALUE _native_initialize(
|
|
214
|
+
DDTRACE_UNUSED VALUE _self,
|
|
215
|
+
VALUE recorder_instance,
|
|
216
|
+
VALUE cpu_time_enabled,
|
|
217
|
+
VALUE alloc_samples_enabled,
|
|
218
|
+
VALUE heap_samples_enabled,
|
|
219
|
+
VALUE heap_size_enabled,
|
|
220
|
+
VALUE heap_sample_every,
|
|
221
|
+
VALUE timeline_enabled
|
|
222
|
+
);
|
|
166
223
|
static VALUE _native_serialize(VALUE self, VALUE recorder_instance);
|
|
167
|
-
static VALUE ruby_time_from(
|
|
224
|
+
static VALUE ruby_time_from(ddog_Timespec ddprof_time);
|
|
168
225
|
static void *call_serialize_without_gvl(void *call_args);
|
|
169
|
-
static struct active_slot_pair sampler_lock_active_profile();
|
|
226
|
+
static struct active_slot_pair sampler_lock_active_profile(struct stack_recorder_state *state);
|
|
170
227
|
static void sampler_unlock_active_profile(struct active_slot_pair active_slot);
|
|
171
|
-
static
|
|
228
|
+
static ddog_prof_Profile *serializer_flip_active_and_inactive_slots(struct stack_recorder_state *state);
|
|
172
229
|
static VALUE _native_active_slot(DDTRACE_UNUSED VALUE _self, VALUE recorder_instance);
|
|
173
230
|
static VALUE _native_is_slot_one_mutex_locked(DDTRACE_UNUSED VALUE _self, VALUE recorder_instance);
|
|
174
231
|
static VALUE _native_is_slot_two_mutex_locked(DDTRACE_UNUSED VALUE _self, VALUE recorder_instance);
|
|
175
232
|
static VALUE test_slot_mutex_state(VALUE recorder_instance, int slot);
|
|
233
|
+
static ddog_Timespec system_epoch_now_timespec(void);
|
|
234
|
+
static VALUE _native_reset_after_fork(DDTRACE_UNUSED VALUE self, VALUE recorder_instance);
|
|
235
|
+
static void serializer_set_start_timestamp_for_next_profile(struct stack_recorder_state *state, ddog_Timespec start_time);
|
|
236
|
+
static VALUE _native_record_endpoint(DDTRACE_UNUSED VALUE _self, VALUE recorder_instance, VALUE local_root_span_id, VALUE endpoint);
|
|
237
|
+
static void reset_profile(ddog_prof_Profile *profile, ddog_Timespec *start_time /* Can be null */);
|
|
238
|
+
static VALUE _native_track_object(DDTRACE_UNUSED VALUE _self, VALUE recorder_instance, VALUE new_obj, VALUE weight, VALUE alloc_class);
|
|
239
|
+
static VALUE _native_check_heap_hashes(DDTRACE_UNUSED VALUE _self, VALUE locations);
|
|
240
|
+
static VALUE _native_start_fake_slow_heap_serialization(DDTRACE_UNUSED VALUE _self, VALUE recorder_instance);
|
|
241
|
+
static VALUE _native_end_fake_slow_heap_serialization(DDTRACE_UNUSED VALUE _self, VALUE recorder_instance);
|
|
242
|
+
static VALUE _native_debug_heap_recorder(DDTRACE_UNUSED VALUE _self, VALUE recorder_instance);
|
|
243
|
+
static VALUE _native_gc_force_recycle(DDTRACE_UNUSED VALUE _self, VALUE obj);
|
|
244
|
+
static VALUE _native_has_seen_id_flag(DDTRACE_UNUSED VALUE _self, VALUE obj);
|
|
245
|
+
|
|
176
246
|
|
|
177
247
|
void stack_recorder_init(VALUE profiling_module) {
|
|
178
|
-
stack_recorder_class = rb_define_class_under(profiling_module, "StackRecorder", rb_cObject);
|
|
248
|
+
VALUE stack_recorder_class = rb_define_class_under(profiling_module, "StackRecorder", rb_cObject);
|
|
179
249
|
// Hosts methods used for testing the native code using RSpec
|
|
180
250
|
VALUE testing_module = rb_define_module_under(stack_recorder_class, "Testing");
|
|
181
251
|
|
|
@@ -189,17 +259,31 @@ void stack_recorder_init(VALUE profiling_module) {
|
|
|
189
259
|
// https://bugs.ruby-lang.org/issues/18007 for a discussion around this.
|
|
190
260
|
rb_define_alloc_func(stack_recorder_class, _native_new);
|
|
191
261
|
|
|
262
|
+
rb_define_singleton_method(stack_recorder_class, "_native_initialize", _native_initialize, 7);
|
|
192
263
|
rb_define_singleton_method(stack_recorder_class, "_native_serialize", _native_serialize, 1);
|
|
264
|
+
rb_define_singleton_method(stack_recorder_class, "_native_reset_after_fork", _native_reset_after_fork, 1);
|
|
193
265
|
rb_define_singleton_method(testing_module, "_native_active_slot", _native_active_slot, 1);
|
|
194
266
|
rb_define_singleton_method(testing_module, "_native_slot_one_mutex_locked?", _native_is_slot_one_mutex_locked, 1);
|
|
195
267
|
rb_define_singleton_method(testing_module, "_native_slot_two_mutex_locked?", _native_is_slot_two_mutex_locked, 1);
|
|
268
|
+
rb_define_singleton_method(testing_module, "_native_record_endpoint", _native_record_endpoint, 3);
|
|
269
|
+
rb_define_singleton_method(testing_module, "_native_track_object", _native_track_object, 4);
|
|
270
|
+
rb_define_singleton_method(testing_module, "_native_check_heap_hashes", _native_check_heap_hashes, 1);
|
|
271
|
+
rb_define_singleton_method(testing_module, "_native_start_fake_slow_heap_serialization",
|
|
272
|
+
_native_start_fake_slow_heap_serialization, 1);
|
|
273
|
+
rb_define_singleton_method(testing_module, "_native_end_fake_slow_heap_serialization",
|
|
274
|
+
_native_end_fake_slow_heap_serialization, 1);
|
|
275
|
+
rb_define_singleton_method(testing_module, "_native_debug_heap_recorder",
|
|
276
|
+
_native_debug_heap_recorder, 1);
|
|
277
|
+
rb_define_singleton_method(testing_module, "_native_gc_force_recycle",
|
|
278
|
+
_native_gc_force_recycle, 1);
|
|
279
|
+
rb_define_singleton_method(testing_module, "_native_has_seen_id_flag",
|
|
280
|
+
_native_has_seen_id_flag, 1);
|
|
196
281
|
|
|
197
282
|
ok_symbol = ID2SYM(rb_intern_const("ok"));
|
|
198
283
|
error_symbol = ID2SYM(rb_intern_const("error"));
|
|
199
|
-
ruby_time_from_id = rb_intern_const("ruby_time_from");
|
|
200
284
|
}
|
|
201
285
|
|
|
202
|
-
// This structure is used to define a Ruby object that stores a pointer to a
|
|
286
|
+
// This structure is used to define a Ruby object that stores a pointer to a ddog_prof_Profile instance
|
|
203
287
|
// See also https://github.com/ruby/ruby/blob/master/doc/extension.rdoc for how this works
|
|
204
288
|
static const rb_data_type_t stack_recorder_typed_data = {
|
|
205
289
|
.wrap_struct_name = "Datadog::Profiling::StackRecorder",
|
|
@@ -214,44 +298,200 @@ static const rb_data_type_t stack_recorder_typed_data = {
|
|
|
214
298
|
static VALUE _native_new(VALUE klass) {
|
|
215
299
|
struct stack_recorder_state *state = ruby_xcalloc(1, sizeof(struct stack_recorder_state));
|
|
216
300
|
|
|
217
|
-
|
|
301
|
+
// Note: Any exceptions raised from this note until the TypedData_Wrap_Struct call will lead to the state memory
|
|
302
|
+
// being leaked.
|
|
303
|
+
|
|
304
|
+
ddog_prof_Slice_ValueType sample_types = {.ptr = all_value_types, .len = ALL_VALUE_TYPES_COUNT};
|
|
305
|
+
|
|
306
|
+
initialize_slot_concurrency_control(state);
|
|
307
|
+
for (uint8_t i = 0; i < ALL_VALUE_TYPES_COUNT; i++) { state->position_for[i] = all_value_types_positions[i]; }
|
|
308
|
+
state->enabled_values_count = ALL_VALUE_TYPES_COUNT;
|
|
309
|
+
|
|
310
|
+
// Note: At this point, slot_one_profile and slot_two_profile contain null pointers. Libdatadog validates pointers
|
|
311
|
+
// before using them so it's ok for us to go ahead and create the StackRecorder object.
|
|
312
|
+
|
|
313
|
+
VALUE stack_recorder = TypedData_Wrap_Struct(klass, &stack_recorder_typed_data, state);
|
|
314
|
+
|
|
315
|
+
// NOTE: We initialize this because we want a new recorder to be operational even without initialization and our
|
|
316
|
+
// default is everything enabled. However, if during recording initialization it turns out we don't want
|
|
317
|
+
// heap samples, we will free and reset heap_recorder to NULL, effectively disabling all behaviour specific
|
|
318
|
+
// to heap profiling (all calls to heap_recorder_* with a NULL heap recorder are noops).
|
|
319
|
+
state->heap_recorder = heap_recorder_new();
|
|
320
|
+
|
|
321
|
+
// Note: Don't raise exceptions after this point, since it'll lead to libdatadog memory leaking!
|
|
322
|
+
|
|
323
|
+
initialize_profiles(state, sample_types);
|
|
218
324
|
|
|
325
|
+
return stack_recorder;
|
|
326
|
+
}
|
|
327
|
+
|
|
328
|
+
static void initialize_slot_concurrency_control(struct stack_recorder_state *state) {
|
|
219
329
|
state->slot_one_mutex = (pthread_mutex_t) PTHREAD_MUTEX_INITIALIZER;
|
|
220
330
|
state->slot_two_mutex = (pthread_mutex_t) PTHREAD_MUTEX_INITIALIZER;
|
|
221
331
|
|
|
222
332
|
// A newly-created StackRecorder starts with slot one being active for samples, so let's lock slot two
|
|
223
|
-
|
|
224
|
-
if (error) rb_syserr_fail(error, "Unexpected failure during pthread_mutex_lock");
|
|
333
|
+
ENFORCE_SUCCESS_GVL(pthread_mutex_lock(&state->slot_two_mutex));
|
|
225
334
|
|
|
226
335
|
state->active_slot = 1;
|
|
336
|
+
}
|
|
227
337
|
|
|
228
|
-
|
|
338
|
+
static void initialize_profiles(struct stack_recorder_state *state, ddog_prof_Slice_ValueType sample_types) {
|
|
339
|
+
ddog_prof_Profile_NewResult slot_one_profile_result =
|
|
340
|
+
ddog_prof_Profile_new(sample_types, NULL /* period is optional */, NULL /* start_time is optional */);
|
|
341
|
+
|
|
342
|
+
if (slot_one_profile_result.tag == DDOG_PROF_PROFILE_NEW_RESULT_ERR) {
|
|
343
|
+
rb_raise(rb_eRuntimeError, "Failed to initialize slot one profile: %"PRIsVALUE, get_error_details_and_drop(&slot_one_profile_result.err));
|
|
344
|
+
}
|
|
229
345
|
|
|
230
|
-
|
|
231
|
-
|
|
346
|
+
ddog_prof_Profile_NewResult slot_two_profile_result =
|
|
347
|
+
ddog_prof_Profile_new(sample_types, NULL /* period is optional */, NULL /* start_time is optional */);
|
|
348
|
+
|
|
349
|
+
if (slot_two_profile_result.tag == DDOG_PROF_PROFILE_NEW_RESULT_ERR) {
|
|
350
|
+
// Uff! Though spot. We need to make sure to properly clean up the other profile as well first
|
|
351
|
+
ddog_prof_Profile_drop(&slot_one_profile_result.ok);
|
|
352
|
+
// And now we can raise...
|
|
353
|
+
rb_raise(rb_eRuntimeError, "Failed to initialize slot two profile: %"PRIsVALUE, get_error_details_and_drop(&slot_two_profile_result.err));
|
|
354
|
+
}
|
|
232
355
|
|
|
233
|
-
|
|
356
|
+
state->slot_one_profile = slot_one_profile_result.ok;
|
|
357
|
+
state->slot_two_profile = slot_two_profile_result.ok;
|
|
234
358
|
}
|
|
235
359
|
|
|
236
360
|
static void stack_recorder_typed_data_free(void *state_ptr) {
|
|
237
361
|
struct stack_recorder_state *state = (struct stack_recorder_state *) state_ptr;
|
|
238
362
|
|
|
239
363
|
pthread_mutex_destroy(&state->slot_one_mutex);
|
|
240
|
-
|
|
364
|
+
ddog_prof_Profile_drop(&state->slot_one_profile);
|
|
241
365
|
|
|
242
366
|
pthread_mutex_destroy(&state->slot_two_mutex);
|
|
243
|
-
|
|
367
|
+
ddog_prof_Profile_drop(&state->slot_two_profile);
|
|
368
|
+
|
|
369
|
+
heap_recorder_free(state->heap_recorder);
|
|
244
370
|
|
|
245
371
|
ruby_xfree(state);
|
|
246
372
|
}
|
|
247
373
|
|
|
374
|
+
static VALUE _native_initialize(
|
|
375
|
+
DDTRACE_UNUSED VALUE _self,
|
|
376
|
+
VALUE recorder_instance,
|
|
377
|
+
VALUE cpu_time_enabled,
|
|
378
|
+
VALUE alloc_samples_enabled,
|
|
379
|
+
VALUE heap_samples_enabled,
|
|
380
|
+
VALUE heap_size_enabled,
|
|
381
|
+
VALUE heap_sample_every,
|
|
382
|
+
VALUE timeline_enabled
|
|
383
|
+
) {
|
|
384
|
+
ENFORCE_BOOLEAN(cpu_time_enabled);
|
|
385
|
+
ENFORCE_BOOLEAN(alloc_samples_enabled);
|
|
386
|
+
ENFORCE_BOOLEAN(heap_samples_enabled);
|
|
387
|
+
ENFORCE_BOOLEAN(heap_size_enabled);
|
|
388
|
+
ENFORCE_TYPE(heap_sample_every, T_FIXNUM);
|
|
389
|
+
ENFORCE_BOOLEAN(timeline_enabled);
|
|
390
|
+
|
|
391
|
+
struct stack_recorder_state *state;
|
|
392
|
+
TypedData_Get_Struct(recorder_instance, struct stack_recorder_state, &stack_recorder_typed_data, state);
|
|
393
|
+
|
|
394
|
+
heap_recorder_set_sample_rate(state->heap_recorder, NUM2INT(heap_sample_every));
|
|
395
|
+
|
|
396
|
+
uint8_t requested_values_count = ALL_VALUE_TYPES_COUNT -
|
|
397
|
+
(cpu_time_enabled == Qtrue ? 0 : 1) -
|
|
398
|
+
(alloc_samples_enabled == Qtrue? 0 : 1) -
|
|
399
|
+
(heap_samples_enabled == Qtrue ? 0 : 1) -
|
|
400
|
+
(heap_size_enabled == Qtrue ? 0 : 1) -
|
|
401
|
+
(timeline_enabled == Qtrue ? 0 : 1);
|
|
402
|
+
|
|
403
|
+
if (requested_values_count == ALL_VALUE_TYPES_COUNT) return Qtrue; // Nothing to do, this is the default
|
|
404
|
+
|
|
405
|
+
// When some sample types are disabled, we need to reconfigure libdatadog to record less types,
|
|
406
|
+
// as well as reconfigure the position_for array to push the disabled types to the end so they don't get recorded.
|
|
407
|
+
// See record_sample for details on the use of position_for.
|
|
408
|
+
|
|
409
|
+
state->enabled_values_count = requested_values_count;
|
|
410
|
+
|
|
411
|
+
ddog_prof_ValueType enabled_value_types[ALL_VALUE_TYPES_COUNT];
|
|
412
|
+
uint8_t next_enabled_pos = 0;
|
|
413
|
+
uint8_t next_disabled_pos = requested_values_count;
|
|
414
|
+
|
|
415
|
+
// CPU_SAMPLES_VALUE is always enabled
|
|
416
|
+
enabled_value_types[next_enabled_pos] = (ddog_prof_ValueType) CPU_SAMPLES_VALUE;
|
|
417
|
+
state->position_for[CPU_SAMPLES_VALUE_ID] = next_enabled_pos++;
|
|
418
|
+
|
|
419
|
+
// WALL_TIME_VALUE is always enabled
|
|
420
|
+
enabled_value_types[next_enabled_pos] = (ddog_prof_ValueType) WALL_TIME_VALUE;
|
|
421
|
+
state->position_for[WALL_TIME_VALUE_ID] = next_enabled_pos++;
|
|
422
|
+
|
|
423
|
+
if (cpu_time_enabled == Qtrue) {
|
|
424
|
+
enabled_value_types[next_enabled_pos] = (ddog_prof_ValueType) CPU_TIME_VALUE;
|
|
425
|
+
state->position_for[CPU_TIME_VALUE_ID] = next_enabled_pos++;
|
|
426
|
+
} else {
|
|
427
|
+
state->position_for[CPU_TIME_VALUE_ID] = next_disabled_pos++;
|
|
428
|
+
}
|
|
429
|
+
|
|
430
|
+
if (alloc_samples_enabled == Qtrue) {
|
|
431
|
+
enabled_value_types[next_enabled_pos] = (ddog_prof_ValueType) ALLOC_SAMPLES_VALUE;
|
|
432
|
+
state->position_for[ALLOC_SAMPLES_VALUE_ID] = next_enabled_pos++;
|
|
433
|
+
} else {
|
|
434
|
+
state->position_for[ALLOC_SAMPLES_VALUE_ID] = next_disabled_pos++;
|
|
435
|
+
}
|
|
436
|
+
|
|
437
|
+
if (heap_samples_enabled == Qtrue) {
|
|
438
|
+
enabled_value_types[next_enabled_pos] = (ddog_prof_ValueType) HEAP_SAMPLES_VALUE;
|
|
439
|
+
state->position_for[HEAP_SAMPLES_VALUE_ID] = next_enabled_pos++;
|
|
440
|
+
} else {
|
|
441
|
+
state->position_for[HEAP_SAMPLES_VALUE_ID] = next_disabled_pos++;
|
|
442
|
+
}
|
|
443
|
+
|
|
444
|
+
if (heap_size_enabled == Qtrue) {
|
|
445
|
+
enabled_value_types[next_enabled_pos] = (ddog_prof_ValueType) HEAP_SIZE_VALUE;
|
|
446
|
+
state->position_for[HEAP_SIZE_VALUE_ID] = next_enabled_pos++;
|
|
447
|
+
} else {
|
|
448
|
+
state->position_for[HEAP_SIZE_VALUE_ID] = next_disabled_pos++;
|
|
449
|
+
}
|
|
450
|
+
heap_recorder_set_size_enabled(state->heap_recorder, heap_size_enabled);
|
|
451
|
+
|
|
452
|
+
if (heap_samples_enabled == Qfalse && heap_size_enabled == Qfalse) {
|
|
453
|
+
// Turns out heap sampling is disabled but we initialized everything in _native_new
|
|
454
|
+
// assuming all samples were enabled. We need to deinitialize the heap recorder.
|
|
455
|
+
heap_recorder_free(state->heap_recorder);
|
|
456
|
+
state->heap_recorder = NULL;
|
|
457
|
+
}
|
|
458
|
+
|
|
459
|
+
if (timeline_enabled == Qtrue) {
|
|
460
|
+
enabled_value_types[next_enabled_pos] = (ddog_prof_ValueType) TIMELINE_VALUE;
|
|
461
|
+
state->position_for[TIMELINE_VALUE_ID] = next_enabled_pos++;
|
|
462
|
+
} else {
|
|
463
|
+
state->position_for[TIMELINE_VALUE_ID] = next_disabled_pos++;
|
|
464
|
+
}
|
|
465
|
+
|
|
466
|
+
ddog_prof_Profile_drop(&state->slot_one_profile);
|
|
467
|
+
ddog_prof_Profile_drop(&state->slot_two_profile);
|
|
468
|
+
|
|
469
|
+
ddog_prof_Slice_ValueType sample_types = {.ptr = enabled_value_types, .len = state->enabled_values_count};
|
|
470
|
+
initialize_profiles(state, sample_types);
|
|
471
|
+
|
|
472
|
+
return Qtrue;
|
|
473
|
+
}
|
|
474
|
+
|
|
248
475
|
static VALUE _native_serialize(DDTRACE_UNUSED VALUE _self, VALUE recorder_instance) {
|
|
249
476
|
struct stack_recorder_state *state;
|
|
250
477
|
TypedData_Get_Struct(recorder_instance, struct stack_recorder_state, &stack_recorder_typed_data, state);
|
|
251
478
|
|
|
479
|
+
ddog_Timespec finish_timestamp = system_epoch_now_timespec();
|
|
480
|
+
// Need to do this while still holding on to the Global VM Lock; see comments on method for why
|
|
481
|
+
serializer_set_start_timestamp_for_next_profile(state, finish_timestamp);
|
|
482
|
+
|
|
483
|
+
// Prepare the iteration on heap recorder we'll be doing outside the GVL. The preparation needs to
|
|
484
|
+
// happen while holding on to the GVL.
|
|
485
|
+
heap_recorder_prepare_iteration(state->heap_recorder);
|
|
486
|
+
|
|
252
487
|
// We'll release the Global VM Lock while we're calling serialize, so that the Ruby VM can continue to work while this
|
|
253
488
|
// is pending
|
|
254
|
-
struct call_serialize_without_gvl_arguments args = {
|
|
489
|
+
struct call_serialize_without_gvl_arguments args = {
|
|
490
|
+
.state = state,
|
|
491
|
+
.finish_timestamp = finish_timestamp,
|
|
492
|
+
.gc_count_before_serialize = rb_gc_count(),
|
|
493
|
+
.serialize_ran = false
|
|
494
|
+
};
|
|
255
495
|
|
|
256
496
|
while (!args.serialize_ran) {
|
|
257
497
|
// Give the Ruby VM an opportunity to process any pending interruptions (including raising exceptions).
|
|
@@ -267,58 +507,201 @@ static VALUE _native_serialize(DDTRACE_UNUSED VALUE _self, VALUE recorder_instan
|
|
|
267
507
|
rb_thread_call_without_gvl2(call_serialize_without_gvl, &args, NULL /* No interruption function needed in this case */, NULL /* Not needed */);
|
|
268
508
|
}
|
|
269
509
|
|
|
270
|
-
|
|
510
|
+
// Cleanup after heap recorder iteration. This needs to happen while holding on to the GVL.
|
|
511
|
+
heap_recorder_finish_iteration(state->heap_recorder);
|
|
512
|
+
|
|
513
|
+
ddog_prof_Profile_SerializeResult serialized_profile = args.result;
|
|
271
514
|
|
|
272
|
-
if (serialized_profile.tag ==
|
|
273
|
-
|
|
274
|
-
ddprof_ffi_SerializeResult_drop(serialized_profile);
|
|
275
|
-
return rb_ary_new_from_args(2, error_symbol, err_details);
|
|
515
|
+
if (serialized_profile.tag == DDOG_PROF_PROFILE_SERIALIZE_RESULT_ERR) {
|
|
516
|
+
return rb_ary_new_from_args(2, error_symbol, get_error_details_and_drop(&serialized_profile.err));
|
|
276
517
|
}
|
|
277
518
|
|
|
278
519
|
VALUE encoded_pprof = ruby_string_from_vec_u8(serialized_profile.ok.buffer);
|
|
279
520
|
|
|
280
|
-
|
|
281
|
-
|
|
521
|
+
ddog_Timespec ddprof_start = serialized_profile.ok.start;
|
|
522
|
+
ddog_Timespec ddprof_finish = serialized_profile.ok.end;
|
|
282
523
|
|
|
283
|
-
|
|
284
|
-
ddprof_ffi_SerializeResult_drop(serialized_profile);
|
|
524
|
+
ddog_prof_EncodedProfile_drop(&serialized_profile.ok);
|
|
285
525
|
|
|
286
526
|
VALUE start = ruby_time_from(ddprof_start);
|
|
287
527
|
VALUE finish = ruby_time_from(ddprof_finish);
|
|
288
528
|
|
|
289
|
-
|
|
290
|
-
|
|
529
|
+
return rb_ary_new_from_args(2, ok_symbol, rb_ary_new_from_args(3, start, finish, encoded_pprof));
|
|
530
|
+
}
|
|
531
|
+
|
|
532
|
+
static VALUE ruby_time_from(ddog_Timespec ddprof_time) {
|
|
533
|
+
const int utc = INT_MAX - 1; // From Ruby sources
|
|
534
|
+
struct timespec time = {.tv_sec = ddprof_time.seconds, .tv_nsec = ddprof_time.nanoseconds};
|
|
535
|
+
return rb_time_timespec_new(&time, utc);
|
|
536
|
+
}
|
|
537
|
+
|
|
538
|
+
void record_sample(VALUE recorder_instance, ddog_prof_Slice_Location locations, sample_values values, sample_labels labels) {
|
|
539
|
+
struct stack_recorder_state *state;
|
|
540
|
+
TypedData_Get_Struct(recorder_instance, struct stack_recorder_state, &stack_recorder_typed_data, state);
|
|
541
|
+
|
|
542
|
+
struct active_slot_pair active_slot = sampler_lock_active_profile(state);
|
|
543
|
+
|
|
544
|
+
// Note: We initialize this array to have ALL_VALUE_TYPES_COUNT but only tell libdatadog to use the first
|
|
545
|
+
// state->enabled_values_count values. This simplifies handling disabled value types -- we still put them on the
|
|
546
|
+
// array, but in _native_initialize we arrange so their position starts from state->enabled_values_count and thus
|
|
547
|
+
// libdatadog doesn't touch them.
|
|
548
|
+
int64_t metric_values[ALL_VALUE_TYPES_COUNT] = {0};
|
|
549
|
+
uint8_t *position_for = state->position_for;
|
|
550
|
+
|
|
551
|
+
metric_values[position_for[CPU_TIME_VALUE_ID]] = values.cpu_time_ns;
|
|
552
|
+
metric_values[position_for[CPU_SAMPLES_VALUE_ID]] = values.cpu_or_wall_samples;
|
|
553
|
+
metric_values[position_for[WALL_TIME_VALUE_ID]] = values.wall_time_ns;
|
|
554
|
+
metric_values[position_for[ALLOC_SAMPLES_VALUE_ID]] = values.alloc_samples;
|
|
555
|
+
metric_values[position_for[TIMELINE_VALUE_ID]] = values.timeline_wall_time_ns;
|
|
556
|
+
|
|
557
|
+
if (values.alloc_samples != 0) {
|
|
558
|
+
// If we got an allocation sample end the heap allocation recording to commit the heap sample.
|
|
559
|
+
// FIXME: Heap sampling currently has to be done in 2 parts because the construction of locations is happening
|
|
560
|
+
// very late in the allocation-sampling path (which is shared with the cpu sampling path). This can
|
|
561
|
+
// be fixed with some refactoring but for now this leads to a less impactful change.
|
|
562
|
+
end_heap_allocation_recording(state->heap_recorder, locations);
|
|
291
563
|
}
|
|
292
564
|
|
|
293
|
-
|
|
565
|
+
ddog_prof_Profile_Result result = ddog_prof_Profile_add(
|
|
566
|
+
active_slot.profile,
|
|
567
|
+
(ddog_prof_Sample) {
|
|
568
|
+
.locations = locations,
|
|
569
|
+
.values = (ddog_Slice_I64) {.ptr = metric_values, .len = state->enabled_values_count},
|
|
570
|
+
.labels = labels.labels
|
|
571
|
+
},
|
|
572
|
+
labels.end_timestamp_ns
|
|
573
|
+
);
|
|
574
|
+
|
|
575
|
+
sampler_unlock_active_profile(active_slot);
|
|
576
|
+
|
|
577
|
+
if (result.tag == DDOG_PROF_PROFILE_RESULT_ERR) {
|
|
578
|
+
rb_raise(rb_eArgError, "Failed to record sample: %"PRIsVALUE, get_error_details_and_drop(&result.err));
|
|
579
|
+
}
|
|
294
580
|
}
|
|
295
581
|
|
|
296
|
-
|
|
297
|
-
|
|
298
|
-
|
|
299
|
-
|
|
300
|
-
|
|
301
|
-
|
|
302
|
-
|
|
303
|
-
#endif
|
|
582
|
+
void track_object(VALUE recorder_instance, VALUE new_object, unsigned int sample_weight, ddog_CharSlice *alloc_class) {
|
|
583
|
+
struct stack_recorder_state *state;
|
|
584
|
+
TypedData_Get_Struct(recorder_instance, struct stack_recorder_state, &stack_recorder_typed_data, state);
|
|
585
|
+
// FIXME: Heap sampling currently has to be done in 2 parts because the construction of locations is happening
|
|
586
|
+
// very late in the allocation-sampling path (which is shared with the cpu sampling path). This can
|
|
587
|
+
// be fixed with some refactoring but for now this leads to a less impactful change.
|
|
588
|
+
start_heap_allocation_recording(state->heap_recorder, new_object, sample_weight, alloc_class);
|
|
304
589
|
}
|
|
305
590
|
|
|
306
|
-
void
|
|
591
|
+
void record_endpoint(VALUE recorder_instance, uint64_t local_root_span_id, ddog_CharSlice endpoint) {
|
|
307
592
|
struct stack_recorder_state *state;
|
|
308
593
|
TypedData_Get_Struct(recorder_instance, struct stack_recorder_state, &stack_recorder_typed_data, state);
|
|
309
594
|
|
|
310
595
|
struct active_slot_pair active_slot = sampler_lock_active_profile(state);
|
|
311
596
|
|
|
312
|
-
|
|
597
|
+
ddog_prof_Profile_Result result = ddog_prof_Profile_set_endpoint(active_slot.profile, local_root_span_id, endpoint);
|
|
313
598
|
|
|
314
599
|
sampler_unlock_active_profile(active_slot);
|
|
600
|
+
|
|
601
|
+
if (result.tag == DDOG_PROF_PROFILE_RESULT_ERR) {
|
|
602
|
+
rb_raise(rb_eArgError, "Failed to record endpoint: %"PRIsVALUE, get_error_details_and_drop(&result.err));
|
|
603
|
+
}
|
|
604
|
+
}
|
|
605
|
+
|
|
606
|
+
#define MAX_LEN_HEAP_ITERATION_ERROR_MSG 256
|
|
607
|
+
|
|
608
|
+
// Heap recorder iteration context allows us access to stack recorder state and profile being serialized
|
|
609
|
+
// during iteration of heap recorder live objects.
|
|
610
|
+
typedef struct heap_recorder_iteration_context {
|
|
611
|
+
struct stack_recorder_state *state;
|
|
612
|
+
ddog_prof_Profile *profile;
|
|
613
|
+
|
|
614
|
+
bool error;
|
|
615
|
+
char error_msg[MAX_LEN_HEAP_ITERATION_ERROR_MSG];
|
|
616
|
+
|
|
617
|
+
size_t profile_gen;
|
|
618
|
+
} heap_recorder_iteration_context;
|
|
619
|
+
|
|
620
|
+
static bool add_heap_sample_to_active_profile_without_gvl(heap_recorder_iteration_data iteration_data, void *extra_arg) {
|
|
621
|
+
heap_recorder_iteration_context *context = (heap_recorder_iteration_context*) extra_arg;
|
|
622
|
+
|
|
623
|
+
live_object_data *object_data = &iteration_data.object_data;
|
|
624
|
+
|
|
625
|
+
int64_t metric_values[ALL_VALUE_TYPES_COUNT] = {0};
|
|
626
|
+
uint8_t *position_for = context->state->position_for;
|
|
627
|
+
|
|
628
|
+
metric_values[position_for[HEAP_SAMPLES_VALUE_ID]] = object_data->weight;
|
|
629
|
+
metric_values[position_for[HEAP_SIZE_VALUE_ID]] = object_data->size * object_data->weight;
|
|
630
|
+
|
|
631
|
+
ddog_prof_Label labels[2];
|
|
632
|
+
size_t label_offset = 0;
|
|
633
|
+
|
|
634
|
+
if (object_data->class != NULL) {
|
|
635
|
+
labels[label_offset++] = (ddog_prof_Label) {
|
|
636
|
+
.key = DDOG_CHARSLICE_C("allocation class"),
|
|
637
|
+
.str = (ddog_CharSlice) {
|
|
638
|
+
.ptr = object_data->class,
|
|
639
|
+
.len = strlen(object_data->class),
|
|
640
|
+
},
|
|
641
|
+
.num = 0, // This shouldn't be needed but the tracer-2.7 docker image ships a buggy gcc that complains about this
|
|
642
|
+
};
|
|
643
|
+
}
|
|
644
|
+
labels[label_offset++] = (ddog_prof_Label) {
|
|
645
|
+
.key = DDOG_CHARSLICE_C("gc gen age"),
|
|
646
|
+
.num = context->profile_gen - object_data->alloc_gen,
|
|
647
|
+
};
|
|
648
|
+
|
|
649
|
+
ddog_prof_Profile_Result result = ddog_prof_Profile_add(
|
|
650
|
+
context->profile,
|
|
651
|
+
(ddog_prof_Sample) {
|
|
652
|
+
.locations = iteration_data.locations,
|
|
653
|
+
.values = (ddog_Slice_I64) {.ptr = metric_values, .len = context->state->enabled_values_count},
|
|
654
|
+
.labels = (ddog_prof_Slice_Label) {
|
|
655
|
+
.ptr = labels,
|
|
656
|
+
.len = label_offset,
|
|
657
|
+
}
|
|
658
|
+
},
|
|
659
|
+
0
|
|
660
|
+
);
|
|
661
|
+
|
|
662
|
+
if (result.tag == DDOG_PROF_PROFILE_RESULT_ERR) {
|
|
663
|
+
read_ddogerr_string_and_drop(&result.err, context->error_msg, MAX_LEN_HEAP_ITERATION_ERROR_MSG);
|
|
664
|
+
context->error = true;
|
|
665
|
+
// By returning false we cancel the iteration
|
|
666
|
+
return false;
|
|
667
|
+
}
|
|
668
|
+
|
|
669
|
+
// Keep on iterating to next item!
|
|
670
|
+
return true;
|
|
671
|
+
}
|
|
672
|
+
|
|
673
|
+
static void build_heap_profile_without_gvl(struct stack_recorder_state *state, ddog_prof_Profile *profile, size_t gc_count_before_serialize) {
|
|
674
|
+
heap_recorder_iteration_context iteration_context = {
|
|
675
|
+
.state = state,
|
|
676
|
+
.profile = profile,
|
|
677
|
+
.error = false,
|
|
678
|
+
.error_msg = {0},
|
|
679
|
+
.profile_gen = gc_count_before_serialize,
|
|
680
|
+
};
|
|
681
|
+
bool iterated = heap_recorder_for_each_live_object(state->heap_recorder, add_heap_sample_to_active_profile_without_gvl, (void*) &iteration_context);
|
|
682
|
+
// We wait until we're out of the iteration to grab the gvl and raise. This is important because during
|
|
683
|
+
// iteration we may potentially acquire locks in the heap recorder and we could reach a deadlock if the
|
|
684
|
+
// same locks are acquired by the heap recorder while holding the gvl (since we'd be operating on the
|
|
685
|
+
// same locks but acquiring them in different order).
|
|
686
|
+
if (!iterated) {
|
|
687
|
+
grab_gvl_and_raise(rb_eRuntimeError, "Failure during heap profile building: iteration cancelled");
|
|
688
|
+
}
|
|
689
|
+
else if (iteration_context.error) {
|
|
690
|
+
grab_gvl_and_raise(rb_eRuntimeError, "Failure during heap profile building: %s", iteration_context.error_msg);
|
|
691
|
+
}
|
|
315
692
|
}
|
|
316
693
|
|
|
317
694
|
static void *call_serialize_without_gvl(void *call_args) {
|
|
318
695
|
struct call_serialize_without_gvl_arguments *args = (struct call_serialize_without_gvl_arguments *) call_args;
|
|
319
696
|
|
|
320
697
|
args->profile = serializer_flip_active_and_inactive_slots(args->state);
|
|
321
|
-
|
|
698
|
+
|
|
699
|
+
// Now that we have the inactive profile with all but heap samples, lets fill it with heap data
|
|
700
|
+
// without needing to race with the active sampler
|
|
701
|
+
build_heap_profile_without_gvl(args->state, args->profile, args->gc_count_before_serialize);
|
|
702
|
+
|
|
703
|
+
// Note: The profile gets reset by the serialize call
|
|
704
|
+
args->result = ddog_prof_Profile_serialize(args->profile, &args->finish_timestamp, NULL /* duration_nanos is optional */, NULL /* start_time is optional */);
|
|
322
705
|
args->serialize_ran = true;
|
|
323
706
|
|
|
324
707
|
return NULL; // Unused
|
|
@@ -334,18 +717,18 @@ static struct active_slot_pair sampler_lock_active_profile(struct stack_recorder
|
|
|
334
717
|
|
|
335
718
|
for (int attempts = 0; attempts < 2; attempts++) {
|
|
336
719
|
error = pthread_mutex_trylock(&state->slot_one_mutex);
|
|
337
|
-
if (error && error != EBUSY)
|
|
720
|
+
if (error && error != EBUSY) ENFORCE_SUCCESS_GVL(error);
|
|
338
721
|
|
|
339
722
|
// Slot one is active
|
|
340
|
-
if (!error) return (struct active_slot_pair) {.mutex = &state->slot_one_mutex, .profile = state->slot_one_profile};
|
|
723
|
+
if (!error) return (struct active_slot_pair) {.mutex = &state->slot_one_mutex, .profile = &state->slot_one_profile};
|
|
341
724
|
|
|
342
725
|
// If we got here, slot one was not active, let's try slot two
|
|
343
726
|
|
|
344
727
|
error = pthread_mutex_trylock(&state->slot_two_mutex);
|
|
345
|
-
if (error && error != EBUSY)
|
|
728
|
+
if (error && error != EBUSY) ENFORCE_SUCCESS_GVL(error);
|
|
346
729
|
|
|
347
730
|
// Slot two is active
|
|
348
|
-
if (!error) return (struct active_slot_pair) {.mutex = &state->slot_two_mutex, .profile = state->slot_two_profile};
|
|
731
|
+
if (!error) return (struct active_slot_pair) {.mutex = &state->slot_two_mutex, .profile = &state->slot_two_profile};
|
|
349
732
|
}
|
|
350
733
|
|
|
351
734
|
// We already tried both multiple times, and we did not succeed. This is not expected to happen. Let's stop sampling.
|
|
@@ -353,34 +736,30 @@ static struct active_slot_pair sampler_lock_active_profile(struct stack_recorder
|
|
|
353
736
|
}
|
|
354
737
|
|
|
355
738
|
static void sampler_unlock_active_profile(struct active_slot_pair active_slot) {
|
|
356
|
-
|
|
357
|
-
if (error != 0) rb_syserr_fail(error, "Unexpected failure in sampler_unlock_active_profile");
|
|
739
|
+
ENFORCE_SUCCESS_GVL(pthread_mutex_unlock(active_slot.mutex));
|
|
358
740
|
}
|
|
359
741
|
|
|
360
|
-
static
|
|
361
|
-
int error;
|
|
742
|
+
static ddog_prof_Profile *serializer_flip_active_and_inactive_slots(struct stack_recorder_state *state) {
|
|
362
743
|
int previously_active_slot = state->active_slot;
|
|
363
744
|
|
|
364
745
|
if (previously_active_slot != 1 && previously_active_slot != 2) {
|
|
365
|
-
|
|
746
|
+
grab_gvl_and_raise(rb_eRuntimeError, "Unexpected active_slot state %d in serializer_flip_active_and_inactive_slots", previously_active_slot);
|
|
366
747
|
}
|
|
367
748
|
|
|
368
749
|
pthread_mutex_t *previously_active = (previously_active_slot == 1) ? &state->slot_one_mutex : &state->slot_two_mutex;
|
|
369
750
|
pthread_mutex_t *previously_inactive = (previously_active_slot == 1) ? &state->slot_two_mutex : &state->slot_one_mutex;
|
|
370
751
|
|
|
371
752
|
// Release the lock, thus making this slot active
|
|
372
|
-
|
|
373
|
-
if (error) rb_syserr_fail(error, "Unexpected failure during serializer_flip_active_and_inactive_slots for previously_inactive");
|
|
753
|
+
ENFORCE_SUCCESS_NO_GVL(pthread_mutex_unlock(previously_inactive));
|
|
374
754
|
|
|
375
755
|
// Grab the lock, thus making this slot inactive
|
|
376
|
-
|
|
377
|
-
if (error) rb_syserr_fail(error, "Unexpected failure during serializer_flip_active_and_inactive_slots for previously_active");
|
|
756
|
+
ENFORCE_SUCCESS_NO_GVL(pthread_mutex_lock(previously_active));
|
|
378
757
|
|
|
379
758
|
// Update active_slot
|
|
380
759
|
state->active_slot = (previously_active_slot == 1) ? 2 : 1;
|
|
381
760
|
|
|
382
761
|
// Return profile for previously active slot (now inactive)
|
|
383
|
-
return (previously_active_slot == 1) ? state->slot_one_profile : state->slot_two_profile;
|
|
762
|
+
return (previously_active_slot == 1) ? &state->slot_one_profile : &state->slot_two_profile;
|
|
384
763
|
}
|
|
385
764
|
|
|
386
765
|
// This method exists only to enable testing Datadog::Profiling::StackRecorder behavior using RSpec.
|
|
@@ -411,12 +790,152 @@ static VALUE test_slot_mutex_state(VALUE recorder_instance, int slot) {
|
|
|
411
790
|
|
|
412
791
|
if (error == 0) {
|
|
413
792
|
// Mutex was unlocked
|
|
414
|
-
pthread_mutex_unlock(slot_mutex);
|
|
793
|
+
ENFORCE_SUCCESS_GVL(pthread_mutex_unlock(slot_mutex));
|
|
415
794
|
return Qfalse;
|
|
416
795
|
} else if (error == EBUSY) {
|
|
417
796
|
// Mutex was locked
|
|
418
797
|
return Qtrue;
|
|
419
798
|
} else {
|
|
420
|
-
|
|
799
|
+
ENFORCE_SUCCESS_GVL(error);
|
|
800
|
+
rb_raise(rb_eRuntimeError, "Failed to raise exception in test_slot_mutex_state; this should never happen");
|
|
801
|
+
}
|
|
802
|
+
}
|
|
803
|
+
|
|
804
|
+
static ddog_Timespec system_epoch_now_timespec(void) {
|
|
805
|
+
long now_ns = system_epoch_time_now_ns(RAISE_ON_FAILURE);
|
|
806
|
+
return (ddog_Timespec) {.seconds = now_ns / SECONDS_AS_NS(1), .nanoseconds = now_ns % SECONDS_AS_NS(1)};
|
|
807
|
+
}
|
|
808
|
+
|
|
809
|
+
// After the Ruby VM forks, this method gets called in the child process to clean up any leftover state from the parent.
|
|
810
|
+
//
|
|
811
|
+
// Assumption: This method gets called BEFORE restarting profiling -- e.g. there are no components attempting to
|
|
812
|
+
// trigger samples at the same time.
|
|
813
|
+
static VALUE _native_reset_after_fork(DDTRACE_UNUSED VALUE self, VALUE recorder_instance) {
|
|
814
|
+
struct stack_recorder_state *state;
|
|
815
|
+
TypedData_Get_Struct(recorder_instance, struct stack_recorder_state, &stack_recorder_typed_data, state);
|
|
816
|
+
|
|
817
|
+
// In case the fork happened halfway through `serializer_flip_active_and_inactive_slots` execution and the
|
|
818
|
+
// resulting state is inconsistent, we make sure to reset it back to the initial state.
|
|
819
|
+
initialize_slot_concurrency_control(state);
|
|
820
|
+
|
|
821
|
+
reset_profile(&state->slot_one_profile, /* start_time: */ NULL);
|
|
822
|
+
reset_profile(&state->slot_two_profile, /* start_time: */ NULL);
|
|
823
|
+
|
|
824
|
+
heap_recorder_after_fork(state->heap_recorder);
|
|
825
|
+
|
|
826
|
+
return Qtrue;
|
|
827
|
+
}
|
|
828
|
+
|
|
829
|
+
// Assumption 1: This method is called with the GVL being held, because `ddog_prof_Profile_reset` mutates the profile and must
|
|
830
|
+
// not be interrupted part-way through by a VM fork.
|
|
831
|
+
static void serializer_set_start_timestamp_for_next_profile(struct stack_recorder_state *state, ddog_Timespec start_time) {
|
|
832
|
+
// Before making this profile active, we reset it so that it uses the correct start_time for its start
|
|
833
|
+
ddog_prof_Profile *next_profile = (state->active_slot == 1) ? &state->slot_two_profile : &state->slot_one_profile;
|
|
834
|
+
reset_profile(next_profile, &start_time);
|
|
835
|
+
}
|
|
836
|
+
|
|
837
|
+
static VALUE _native_record_endpoint(DDTRACE_UNUSED VALUE _self, VALUE recorder_instance, VALUE local_root_span_id, VALUE endpoint) {
|
|
838
|
+
ENFORCE_TYPE(local_root_span_id, T_FIXNUM);
|
|
839
|
+
record_endpoint(recorder_instance, NUM2ULL(local_root_span_id), char_slice_from_ruby_string(endpoint));
|
|
840
|
+
return Qtrue;
|
|
841
|
+
}
|
|
842
|
+
|
|
843
|
+
static VALUE _native_track_object(DDTRACE_UNUSED VALUE _self, VALUE recorder_instance, VALUE new_obj, VALUE weight, VALUE alloc_class) {
|
|
844
|
+
ENFORCE_TYPE(weight, T_FIXNUM);
|
|
845
|
+
ddog_CharSlice alloc_class_slice = char_slice_from_ruby_string(alloc_class);
|
|
846
|
+
track_object(recorder_instance, new_obj, NUM2UINT(weight), &alloc_class_slice);
|
|
847
|
+
return Qtrue;
|
|
848
|
+
}
|
|
849
|
+
|
|
850
|
+
static VALUE _native_check_heap_hashes(DDTRACE_UNUSED VALUE _self, VALUE locations) {
|
|
851
|
+
ENFORCE_TYPE(locations, T_ARRAY);
|
|
852
|
+
size_t locations_len = rb_array_len(locations);
|
|
853
|
+
ddog_prof_Location locations_arr[locations_len];
|
|
854
|
+
for (size_t i = 0; i < locations_len; i++) {
|
|
855
|
+
VALUE location = rb_ary_entry(locations, i);
|
|
856
|
+
ENFORCE_TYPE(location, T_ARRAY);
|
|
857
|
+
VALUE name = rb_ary_entry(location, 0);
|
|
858
|
+
VALUE filename = rb_ary_entry(location, 1);
|
|
859
|
+
VALUE line = rb_ary_entry(location, 2);
|
|
860
|
+
ENFORCE_TYPE(name, T_STRING);
|
|
861
|
+
ENFORCE_TYPE(filename, T_STRING);
|
|
862
|
+
ENFORCE_TYPE(line, T_FIXNUM);
|
|
863
|
+
locations_arr[i] = (ddog_prof_Location) {
|
|
864
|
+
.line = line,
|
|
865
|
+
.function = (ddog_prof_Function) {
|
|
866
|
+
.name = char_slice_from_ruby_string(name),
|
|
867
|
+
.filename = char_slice_from_ruby_string(filename),
|
|
868
|
+
}
|
|
869
|
+
};
|
|
870
|
+
}
|
|
871
|
+
ddog_prof_Slice_Location ddog_locations = {
|
|
872
|
+
.len = locations_len,
|
|
873
|
+
.ptr = locations_arr,
|
|
874
|
+
};
|
|
875
|
+
heap_recorder_testonly_assert_hash_matches(ddog_locations);
|
|
876
|
+
|
|
877
|
+
return Qnil;
|
|
878
|
+
}
|
|
879
|
+
|
|
880
|
+
static void reset_profile(ddog_prof_Profile *profile, ddog_Timespec *start_time /* Can be null */) {
|
|
881
|
+
ddog_prof_Profile_Result reset_result = ddog_prof_Profile_reset(profile, start_time);
|
|
882
|
+
if (reset_result.tag == DDOG_PROF_PROFILE_RESULT_ERR) {
|
|
883
|
+
rb_raise(rb_eRuntimeError, "Failed to reset profile: %"PRIsVALUE, get_error_details_and_drop(&reset_result.err));
|
|
421
884
|
}
|
|
422
885
|
}
|
|
886
|
+
|
|
887
|
+
// This method exists only to enable testing Datadog::Profiling::StackRecorder behavior using RSpec.
|
|
888
|
+
// It SHOULD NOT be used for other purposes.
|
|
889
|
+
static VALUE _native_start_fake_slow_heap_serialization(DDTRACE_UNUSED VALUE _self, VALUE recorder_instance) {
|
|
890
|
+
struct stack_recorder_state *state;
|
|
891
|
+
TypedData_Get_Struct(recorder_instance, struct stack_recorder_state, &stack_recorder_typed_data, state);
|
|
892
|
+
|
|
893
|
+
heap_recorder_prepare_iteration(state->heap_recorder);
|
|
894
|
+
|
|
895
|
+
return Qnil;
|
|
896
|
+
}
|
|
897
|
+
|
|
898
|
+
// This method exists only to enable testing Datadog::Profiling::StackRecorder behavior using RSpec.
|
|
899
|
+
// It SHOULD NOT be used for other purposes.
|
|
900
|
+
static VALUE _native_end_fake_slow_heap_serialization(DDTRACE_UNUSED VALUE _self, VALUE recorder_instance) {
|
|
901
|
+
struct stack_recorder_state *state;
|
|
902
|
+
TypedData_Get_Struct(recorder_instance, struct stack_recorder_state, &stack_recorder_typed_data, state);
|
|
903
|
+
|
|
904
|
+
heap_recorder_finish_iteration(state->heap_recorder);
|
|
905
|
+
|
|
906
|
+
return Qnil;
|
|
907
|
+
}
|
|
908
|
+
|
|
909
|
+
// This method exists only to enable testing Datadog::Profiling::StackRecorder behavior using RSpec.
|
|
910
|
+
// It SHOULD NOT be used for other purposes.
|
|
911
|
+
static VALUE _native_debug_heap_recorder(DDTRACE_UNUSED VALUE _self, VALUE recorder_instance) {
|
|
912
|
+
struct stack_recorder_state *state;
|
|
913
|
+
TypedData_Get_Struct(recorder_instance, struct stack_recorder_state, &stack_recorder_typed_data, state);
|
|
914
|
+
|
|
915
|
+
return heap_recorder_testonly_debug(state->heap_recorder);
|
|
916
|
+
}
|
|
917
|
+
|
|
918
|
+
#pragma GCC diagnostic push
|
|
919
|
+
// rb_gc_force_recycle was deprecated in latest versions of Ruby and is a noop.
|
|
920
|
+
#pragma GCC diagnostic ignored "-Wdeprecated-declarations"
|
|
921
|
+
// This method exists only to enable testing Datadog::Profiling::StackRecorder behavior using RSpec.
|
|
922
|
+
// It SHOULD NOT be used for other purposes.
|
|
923
|
+
static VALUE _native_gc_force_recycle(DDTRACE_UNUSED VALUE _self, VALUE obj) {
|
|
924
|
+
rb_gc_force_recycle(obj);
|
|
925
|
+
return Qnil;
|
|
926
|
+
}
|
|
927
|
+
#pragma GCC diagnostic pop
|
|
928
|
+
|
|
929
|
+
// This method exists only to enable testing Datadog::Profiling::StackRecorder behavior using RSpec.
|
|
930
|
+
// It SHOULD NOT be used for other purposes.
|
|
931
|
+
static VALUE _native_has_seen_id_flag(DDTRACE_UNUSED VALUE _self, VALUE obj) {
|
|
932
|
+
#ifndef NO_SEEN_OBJ_ID_FLAG
|
|
933
|
+
if (RB_FL_TEST(obj, RUBY_FL_SEEN_OBJ_ID)) {
|
|
934
|
+
return Qtrue;
|
|
935
|
+
} else {
|
|
936
|
+
return Qfalse;
|
|
937
|
+
}
|
|
938
|
+
#else
|
|
939
|
+
return Qfalse;
|
|
940
|
+
#endif
|
|
941
|
+
}
|