ddtrace 1.12.1 → 1.18.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 +388 -10
- data/ext/ddtrace_profiling_native_extension/NativeExtensionDesign.md +3 -5
- data/ext/ddtrace_profiling_native_extension/clock_id.h +0 -3
- data/ext/ddtrace_profiling_native_extension/clock_id_from_pthread.c +3 -22
- 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 +41 -6
- data/ext/ddtrace_profiling_native_extension/collectors_idle_sampling_helper.c +3 -0
- data/ext/ddtrace_profiling_native_extension/collectors_stack.c +76 -24
- data/ext/ddtrace_profiling_native_extension/collectors_stack.h +1 -1
- data/ext/ddtrace_profiling_native_extension/collectors_thread_context.c +292 -27
- data/ext/ddtrace_profiling_native_extension/collectors_thread_context.h +1 -1
- data/ext/ddtrace_profiling_native_extension/extconf.rb +40 -10
- data/ext/ddtrace_profiling_native_extension/http_transport.c +48 -16
- data/ext/ddtrace_profiling_native_extension/libdatadog_helpers.c +42 -0
- data/ext/ddtrace_profiling_native_extension/libdatadog_helpers.h +6 -0
- data/ext/ddtrace_profiling_native_extension/native_extension_helpers.rb +1 -1
- 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 +136 -32
- data/ext/ddtrace_profiling_native_extension/private_vm_api_access.h +12 -0
- data/ext/ddtrace_profiling_native_extension/profiling.c +1 -2
- data/ext/ddtrace_profiling_native_extension/stack_recorder.c +81 -50
- data/ext/ddtrace_profiling_native_extension/stack_recorder.h +13 -3
- data/ext/ddtrace_profiling_native_extension/time_helpers.c +40 -4
- data/ext/ddtrace_profiling_native_extension/time_helpers.h +14 -0
- data/lib/datadog/appsec/assets/waf_rules/processors.json +92 -0
- data/lib/datadog/appsec/assets/waf_rules/recommended.json +698 -75
- data/lib/datadog/appsec/assets/waf_rules/scanners.json +114 -0
- data/lib/datadog/appsec/assets/waf_rules/strict.json +98 -8
- data/lib/datadog/appsec/assets.rb +8 -0
- data/lib/datadog/appsec/component.rb +21 -2
- data/lib/datadog/appsec/configuration/settings.rb +167 -189
- data/lib/datadog/appsec/configuration.rb +0 -79
- data/lib/datadog/appsec/contrib/auto_instrument.rb +2 -4
- 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/rack/ext.rb +2 -1
- data/lib/datadog/appsec/contrib/rack/gateway/request.rb +6 -2
- data/lib/datadog/appsec/contrib/rack/gateway/watcher.rb +8 -6
- data/lib/datadog/appsec/contrib/rack/reactive/request.rb +3 -8
- data/lib/datadog/appsec/contrib/rack/reactive/request_body.rb +3 -6
- data/lib/datadog/appsec/contrib/rack/reactive/response.rb +3 -6
- data/lib/datadog/appsec/contrib/rack/request_body_middleware.rb +3 -2
- data/lib/datadog/appsec/contrib/rack/request_middleware.rb +36 -17
- data/lib/datadog/appsec/contrib/rails/ext.rb +3 -2
- data/lib/datadog/appsec/contrib/rails/framework.rb +1 -3
- data/lib/datadog/appsec/contrib/rails/gateway/watcher.rb +3 -2
- data/lib/datadog/appsec/contrib/rails/patcher.rb +17 -11
- data/lib/datadog/appsec/contrib/rails/reactive/action.rb +3 -6
- data/lib/datadog/appsec/contrib/sinatra/ext.rb +2 -1
- data/lib/datadog/appsec/contrib/sinatra/framework.rb +1 -3
- data/lib/datadog/appsec/contrib/sinatra/gateway/watcher.rb +6 -4
- data/lib/datadog/appsec/contrib/sinatra/patcher.rb +13 -7
- data/lib/datadog/appsec/contrib/sinatra/reactive/routed.rb +3 -6
- data/lib/datadog/appsec/event.rb +106 -50
- data/lib/datadog/appsec/extensions.rb +1 -130
- data/lib/datadog/appsec/monitor/gateway/watcher.rb +3 -3
- data/lib/datadog/appsec/monitor/reactive/set_user.rb +3 -6
- data/lib/datadog/appsec/processor/actions.rb +49 -0
- data/lib/datadog/appsec/processor/rule_loader.rb +60 -0
- data/lib/datadog/appsec/processor/rule_merger.rb +22 -2
- data/lib/datadog/appsec/processor.rb +35 -7
- data/lib/datadog/appsec/rate_limiter.rb +1 -1
- data/lib/datadog/appsec/remote.rb +17 -11
- data/lib/datadog/appsec/response.rb +82 -4
- data/lib/datadog/appsec/sample_rate.rb +21 -0
- data/lib/datadog/appsec.rb +3 -4
- data/lib/datadog/core/backport.rb +51 -0
- data/lib/datadog/core/configuration/agent_settings_resolver.rb +38 -29
- data/lib/datadog/core/configuration/base.rb +6 -16
- data/lib/datadog/core/configuration/components.rb +15 -3
- data/lib/datadog/core/configuration/ext.rb +28 -5
- data/lib/datadog/core/configuration/option.rb +269 -21
- data/lib/datadog/core/configuration/option_definition.rb +73 -32
- data/lib/datadog/core/configuration/options.rb +27 -15
- data/lib/datadog/core/configuration/settings.rb +182 -102
- data/lib/datadog/core/configuration.rb +4 -0
- data/lib/datadog/core/diagnostics/environment_logger.rb +130 -234
- data/lib/datadog/core/environment/execution.rb +103 -0
- data/lib/datadog/core/environment/ext.rb +13 -11
- data/lib/datadog/core/environment/variable_helpers.rb +0 -69
- data/lib/datadog/core/environment/yjit.rb +58 -0
- data/lib/datadog/core/error.rb +1 -0
- data/lib/datadog/core/git/ext.rb +26 -22
- data/lib/datadog/core/logging/ext.rb +3 -1
- data/lib/datadog/core/metrics/ext.rb +7 -5
- data/lib/datadog/core/remote/client/capabilities.rb +6 -1
- data/lib/datadog/core/remote/client.rb +3 -0
- data/lib/datadog/core/remote/component.rb +27 -36
- data/lib/datadog/core/remote/configuration/content.rb +28 -1
- data/lib/datadog/core/remote/configuration/repository.rb +3 -1
- data/lib/datadog/core/remote/ext.rb +1 -1
- data/lib/datadog/core/remote/negotiation.rb +19 -6
- 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/{transport → remote/transport}/negotiation.rb +25 -23
- data/lib/datadog/core/remote/worker.rb +4 -1
- data/lib/datadog/core/runtime/ext.rb +22 -12
- data/lib/datadog/core/runtime/metrics.rb +43 -0
- data/lib/datadog/core/telemetry/client.rb +12 -2
- data/lib/datadog/core/telemetry/collector.rb +13 -4
- data/lib/datadog/core/telemetry/emitter.rb +4 -2
- data/lib/datadog/core/telemetry/event.rb +19 -4
- data/lib/datadog/core/telemetry/ext.rb +4 -1
- data/lib/datadog/core/telemetry/heartbeat.rb +2 -4
- data/lib/datadog/core/telemetry/http/ext.rb +10 -8
- data/lib/datadog/core/telemetry/http/transport.rb +2 -0
- 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/duration.rb +52 -0
- data/lib/datadog/core/utils/hash.rb +47 -0
- data/lib/datadog/core/utils/network.rb +1 -1
- data/lib/datadog/core/utils/safe_dup.rb +27 -20
- data/lib/datadog/core/utils.rb +1 -1
- data/lib/datadog/core/workers/async.rb +3 -2
- data/lib/datadog/core/workers/polling.rb +2 -2
- data/lib/datadog/kit/appsec/events.rb +139 -89
- data/lib/datadog/kit/enable_core_dumps.rb +5 -6
- data/lib/datadog/kit/identity.rb +80 -65
- data/lib/datadog/opentelemetry/api/context.rb +10 -3
- data/lib/datadog/opentelemetry/sdk/propagator.rb +2 -1
- data/lib/datadog/opentelemetry/sdk/span_processor.rb +48 -5
- data/lib/datadog/opentelemetry/sdk/trace/span.rb +167 -0
- data/lib/datadog/opentelemetry/trace.rb +58 -0
- data/lib/datadog/opentelemetry.rb +1 -0
- data/lib/datadog/opentracer/text_map_propagator.rb +2 -1
- data/lib/datadog/opentracer.rb +9 -0
- data/lib/datadog/profiling/collectors/cpu_and_wall_time_worker.rb +16 -17
- data/lib/datadog/profiling/collectors/idle_sampling_helper.rb +3 -1
- data/lib/datadog/profiling/collectors/thread_context.rb +17 -2
- data/lib/datadog/profiling/component.rb +69 -94
- data/lib/datadog/profiling/diagnostics/environment_logger.rb +39 -0
- data/lib/datadog/profiling/exporter.rb +5 -1
- data/lib/datadog/profiling/ext.rb +0 -12
- data/lib/datadog/profiling/flush.rb +7 -5
- data/lib/datadog/profiling/http_transport.rb +19 -6
- data/lib/datadog/profiling/load_native_extension.rb +7 -1
- data/lib/datadog/profiling/native_extension.rb +0 -21
- data/lib/datadog/profiling/profiler.rb +36 -13
- data/lib/datadog/profiling/scheduler.rb +16 -9
- data/lib/datadog/profiling.rb +16 -78
- data/lib/datadog/tracing/component.rb +70 -11
- 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 +40 -32
- data/lib/datadog/tracing/configuration/http.rb +74 -0
- data/lib/datadog/tracing/configuration/settings.rb +134 -98
- data/lib/datadog/tracing/contrib/action_cable/configuration/settings.rb +9 -6
- data/lib/datadog/tracing/contrib/action_cable/ext.rb +20 -18
- data/lib/datadog/tracing/contrib/action_mailer/configuration/settings.rb +9 -6
- data/lib/datadog/tracing/contrib/action_mailer/ext.rb +20 -18
- data/lib/datadog/tracing/contrib/action_pack/configuration/settings.rb +9 -7
- data/lib/datadog/tracing/contrib/action_pack/ext.rb +10 -8
- data/lib/datadog/tracing/contrib/action_view/configuration/settings.rb +9 -6
- data/lib/datadog/tracing/contrib/action_view/ext.rb +12 -10
- data/lib/datadog/tracing/contrib/active_job/configuration/settings.rb +13 -7
- data/lib/datadog/tracing/contrib/active_job/ext.rb +25 -23
- data/lib/datadog/tracing/contrib/active_job/log_injection.rb +1 -1
- data/lib/datadog/tracing/contrib/active_job/patcher.rb +1 -1
- data/lib/datadog/tracing/contrib/active_model_serializers/configuration/settings.rb +9 -6
- data/lib/datadog/tracing/contrib/active_model_serializers/ext.rb +12 -10
- data/lib/datadog/tracing/contrib/active_record/configuration/resolver.rb +18 -11
- data/lib/datadog/tracing/contrib/active_record/configuration/settings.rb +9 -7
- data/lib/datadog/tracing/contrib/active_record/events/sql.rb +2 -6
- data/lib/datadog/tracing/contrib/active_record/ext.rb +17 -15
- data/lib/datadog/tracing/contrib/active_record/utils.rb +1 -1
- data/lib/datadog/tracing/contrib/active_support/cache/instrumentation.rb +106 -202
- data/lib/datadog/tracing/contrib/active_support/cache/patcher.rb +3 -0
- data/lib/datadog/tracing/contrib/active_support/configuration/settings.rb +9 -7
- data/lib/datadog/tracing/contrib/active_support/ext.rb +18 -16
- data/lib/datadog/tracing/contrib/aws/configuration/settings.rb +14 -7
- data/lib/datadog/tracing/contrib/aws/ext.rb +37 -24
- data/lib/datadog/tracing/contrib/aws/instrumentation.rb +16 -5
- data/lib/datadog/tracing/contrib/concurrent_ruby/configuration/settings.rb +3 -2
- data/lib/datadog/tracing/contrib/concurrent_ruby/context_composite_executor_service.rb +14 -14
- data/lib/datadog/tracing/contrib/concurrent_ruby/ext.rb +4 -2
- data/lib/datadog/tracing/contrib/concurrent_ruby/future_patch.rb +3 -10
- data/lib/datadog/tracing/contrib/concurrent_ruby/integration.rb +2 -1
- data/lib/datadog/tracing/contrib/concurrent_ruby/patcher.rb +8 -1
- data/lib/datadog/tracing/contrib/concurrent_ruby/promises_future_patch.rb +22 -0
- data/lib/datadog/tracing/contrib/configuration/settings.rb +1 -1
- data/lib/datadog/tracing/contrib/dalli/configuration/settings.rb +20 -7
- data/lib/datadog/tracing/contrib/dalli/ext.rb +26 -11
- data/lib/datadog/tracing/contrib/dalli/instrumentation.rb +17 -8
- data/lib/datadog/tracing/contrib/delayed_job/configuration/settings.rb +13 -7
- data/lib/datadog/tracing/contrib/delayed_job/ext.rb +16 -14
- data/lib/datadog/tracing/contrib/elasticsearch/configuration/settings.rb +14 -7
- data/lib/datadog/tracing/contrib/elasticsearch/ext.rb +21 -15
- data/lib/datadog/tracing/contrib/elasticsearch/patcher.rb +104 -99
- data/lib/datadog/tracing/contrib/ethon/configuration/settings.rb +16 -9
- data/lib/datadog/tracing/contrib/ethon/easy_patch.rb +48 -3
- data/lib/datadog/tracing/contrib/ethon/ext.rb +19 -11
- data/lib/datadog/tracing/contrib/ethon/multi_patch.rb +6 -3
- data/lib/datadog/tracing/contrib/excon/configuration/settings.rb +19 -10
- data/lib/datadog/tracing/contrib/excon/ext.rb +16 -8
- data/lib/datadog/tracing/contrib/excon/middleware.rb +25 -5
- data/lib/datadog/tracing/contrib/ext.rb +26 -1
- data/lib/datadog/tracing/contrib/extensions.rb +32 -0
- data/lib/datadog/tracing/contrib/faraday/configuration/settings.rb +20 -10
- data/lib/datadog/tracing/contrib/faraday/ext.rb +16 -8
- data/lib/datadog/tracing/contrib/faraday/middleware.rb +21 -5
- data/lib/datadog/tracing/contrib/grape/configuration/settings.rb +8 -6
- data/lib/datadog/tracing/contrib/grape/ext.rb +16 -14
- data/lib/datadog/tracing/contrib/graphql/configuration/settings.rb +8 -6
- data/lib/datadog/tracing/contrib/graphql/ext.rb +7 -5
- data/lib/datadog/tracing/contrib/grpc/configuration/settings.rb +39 -9
- data/lib/datadog/tracing/contrib/grpc/datadog_interceptor/client.rb +39 -20
- data/lib/datadog/tracing/contrib/grpc/datadog_interceptor/server.rb +37 -18
- data/lib/datadog/tracing/contrib/grpc/datadog_interceptor.rb +0 -4
- data/lib/datadog/tracing/contrib/grpc/ext.rb +16 -13
- data/lib/datadog/tracing/contrib/grpc/formatting.rb +127 -0
- data/lib/datadog/tracing/contrib/hanami/configuration/settings.rb +3 -2
- data/lib/datadog/tracing/contrib/hanami/ext.rb +10 -8
- data/lib/datadog/tracing/contrib/http/circuit_breaker.rb +5 -8
- data/lib/datadog/tracing/contrib/http/configuration/settings.rb +33 -11
- data/lib/datadog/tracing/contrib/http/ext.rb +16 -9
- data/lib/datadog/tracing/contrib/http/instrumentation.rb +27 -7
- data/lib/datadog/tracing/contrib/httpclient/configuration/settings.rb +33 -11
- data/lib/datadog/tracing/contrib/httpclient/ext.rb +17 -9
- data/lib/datadog/tracing/contrib/httpclient/instrumentation.rb +22 -5
- data/lib/datadog/tracing/contrib/httprb/configuration/settings.rb +33 -11
- data/lib/datadog/tracing/contrib/httprb/ext.rb +16 -9
- data/lib/datadog/tracing/contrib/httprb/instrumentation.rb +22 -5
- data/lib/datadog/tracing/contrib/kafka/configuration/settings.rb +9 -6
- data/lib/datadog/tracing/contrib/kafka/ext.rb +42 -39
- data/lib/datadog/tracing/contrib/lograge/configuration/settings.rb +3 -2
- data/lib/datadog/tracing/contrib/lograge/ext.rb +3 -1
- data/lib/datadog/tracing/contrib/lograge/instrumentation.rb +2 -17
- data/lib/datadog/tracing/contrib/mongodb/configuration/settings.rb +14 -7
- data/lib/datadog/tracing/contrib/mongodb/ext.rb +20 -16
- data/lib/datadog/tracing/contrib/mongodb/subscribers.rb +16 -5
- data/lib/datadog/tracing/contrib/mysql2/configuration/settings.rb +17 -14
- data/lib/datadog/tracing/contrib/mysql2/ext.rb +15 -10
- data/lib/datadog/tracing/contrib/mysql2/instrumentation.rb +20 -6
- 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/pg/configuration/settings.rb +22 -14
- data/lib/datadog/tracing/contrib/pg/ext.rb +22 -19
- data/lib/datadog/tracing/contrib/pg/instrumentation.rb +38 -5
- data/lib/datadog/tracing/contrib/presto/configuration/settings.rb +14 -7
- data/lib/datadog/tracing/contrib/presto/ext.rb +25 -20
- data/lib/datadog/tracing/contrib/presto/instrumentation.rb +14 -5
- data/lib/datadog/tracing/contrib/propagation/sql_comment/ext.rb +12 -10
- data/lib/datadog/tracing/contrib/propagation/sql_comment.rb +1 -1
- data/lib/datadog/tracing/contrib/qless/configuration/settings.rb +12 -8
- data/lib/datadog/tracing/contrib/qless/ext.rb +14 -12
- data/lib/datadog/tracing/contrib/que/configuration/settings.rb +21 -12
- data/lib/datadog/tracing/contrib/racecar/configuration/settings.rb +9 -7
- data/lib/datadog/tracing/contrib/racecar/event.rb +5 -5
- data/lib/datadog/tracing/contrib/racecar/ext.rb +20 -18
- data/lib/datadog/tracing/contrib/rack/configuration/settings.rb +16 -12
- data/lib/datadog/tracing/contrib/rack/ext.rb +18 -16
- data/lib/datadog/tracing/contrib/rack/header_collection.rb +3 -0
- data/lib/datadog/tracing/contrib/rack/header_tagging.rb +63 -0
- data/lib/datadog/tracing/contrib/rack/middlewares.rb +8 -49
- data/lib/datadog/tracing/contrib/rails/configuration/settings.rb +19 -15
- data/lib/datadog/tracing/contrib/rails/ext.rb +7 -5
- data/lib/datadog/tracing/contrib/rails/log_injection.rb +7 -10
- data/lib/datadog/tracing/contrib/rails/patcher.rb +10 -41
- data/lib/datadog/tracing/contrib/rails/railtie.rb +3 -3
- data/lib/datadog/tracing/contrib/rake/configuration/settings.rb +13 -10
- data/lib/datadog/tracing/contrib/rake/ext.rb +14 -12
- data/lib/datadog/tracing/contrib/redis/configuration/settings.rb +17 -9
- data/lib/datadog/tracing/contrib/redis/ext.rb +22 -15
- data/lib/datadog/tracing/contrib/redis/instrumentation.rb +3 -38
- data/lib/datadog/tracing/contrib/redis/tags.rb +16 -7
- data/lib/datadog/tracing/contrib/redis/trace_middleware.rb +46 -33
- data/lib/datadog/tracing/contrib/resque/configuration/settings.rb +13 -7
- data/lib/datadog/tracing/contrib/resque/ext.rb +9 -7
- data/lib/datadog/tracing/contrib/rest_client/configuration/settings.rb +16 -9
- data/lib/datadog/tracing/contrib/rest_client/ext.rb +15 -8
- data/lib/datadog/tracing/contrib/rest_client/request_patch.rb +25 -5
- data/lib/datadog/tracing/contrib/roda/configuration/settings.rb +9 -6
- data/lib/datadog/tracing/contrib/semantic_logger/configuration/settings.rb +3 -2
- data/lib/datadog/tracing/contrib/semantic_logger/ext.rb +3 -1
- data/lib/datadog/tracing/contrib/semantic_logger/instrumentation.rb +4 -20
- data/lib/datadog/tracing/contrib/sequel/configuration/settings.rb +9 -6
- data/lib/datadog/tracing/contrib/sequel/ext.rb +10 -8
- data/lib/datadog/tracing/contrib/sequel/utils.rb +7 -7
- data/lib/datadog/tracing/contrib/shoryuken/configuration/settings.rb +14 -8
- data/lib/datadog/tracing/contrib/shoryuken/ext.rb +14 -12
- data/lib/datadog/tracing/contrib/sidekiq/configuration/settings.rb +18 -11
- data/lib/datadog/tracing/contrib/sidekiq/ext.rb +32 -30
- data/lib/datadog/tracing/contrib/sinatra/configuration/settings.rb +11 -9
- data/lib/datadog/tracing/contrib/sinatra/env.rb +0 -17
- data/lib/datadog/tracing/contrib/sinatra/ext.rb +21 -19
- data/lib/datadog/tracing/contrib/sinatra/tracer_middleware.rb +3 -14
- data/lib/datadog/tracing/contrib/sneakers/configuration/settings.rb +14 -8
- data/lib/datadog/tracing/contrib/sneakers/ext.rb +1 -0
- data/lib/datadog/tracing/contrib/sneakers/tracer.rb +1 -1
- data/lib/datadog/tracing/contrib/span_attribute_schema.rb +74 -10
- data/lib/datadog/tracing/contrib/stripe/configuration/settings.rb +9 -6
- data/lib/datadog/tracing/contrib/sucker_punch/configuration/settings.rb +9 -6
- data/lib/datadog/tracing/contrib/sucker_punch/ext.rb +15 -13
- data/lib/datadog/tracing/contrib/utils/database.rb +5 -3
- data/lib/datadog/tracing/contrib/utils/quantization/http.rb +11 -11
- data/lib/datadog/tracing/contrib.rb +1 -0
- data/lib/datadog/tracing/correlation.rb +29 -12
- data/lib/datadog/tracing/diagnostics/environment_logger.rb +165 -0
- data/lib/datadog/tracing/diagnostics/ext.rb +21 -19
- data/lib/datadog/tracing/distributed/b3_multi.rb +2 -2
- data/lib/datadog/tracing/distributed/b3_single.rb +1 -1
- data/lib/datadog/tracing/distributed/datadog.rb +0 -1
- data/lib/datadog/tracing/distributed/propagation.rb +35 -34
- data/lib/datadog/tracing/distributed/trace_context.rb +52 -17
- data/lib/datadog/tracing/metadata/ext.rb +9 -6
- data/lib/datadog/tracing/metadata/tagging.rb +3 -3
- data/lib/datadog/tracing/remote.rb +78 -0
- data/lib/datadog/tracing/sampling/rule_sampler.rb +29 -0
- data/lib/datadog/tracing/span_operation.rb +3 -15
- data/lib/datadog/tracing/sync_writer.rb +3 -3
- data/lib/datadog/tracing/trace_digest.rb +31 -0
- data/lib/datadog/tracing/trace_operation.rb +16 -3
- data/lib/datadog/tracing/trace_segment.rb +5 -2
- data/lib/datadog/tracing/tracer.rb +12 -1
- data/lib/datadog/{core → tracing}/transport/http/api/instance.rb +1 -1
- data/lib/datadog/{core → tracing}/transport/http/api/spec.rb +1 -1
- data/lib/datadog/tracing/transport/http/api.rb +43 -0
- data/lib/datadog/{core → tracing}/transport/http/builder.rb +13 -68
- 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/workers/trace_writer.rb +6 -4
- data/lib/datadog/tracing/workers.rb +4 -2
- data/lib/datadog/tracing/writer.rb +5 -2
- data/lib/ddtrace/transport/ext.rb +22 -14
- data/lib/ddtrace/version.rb +9 -12
- data/lib/ddtrace.rb +1 -1
- metadata +101 -93
- 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 -20
- 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 -47
- data/lib/datadog/ci/contrib/cucumber/patcher.rb +0 -27
- data/lib/datadog/ci/contrib/rspec/configuration/settings.rb +0 -33
- data/lib/datadog/ci/contrib/rspec/example.rb +0 -68
- data/lib/datadog/ci/contrib/rspec/ext.rb +0 -19
- data/lib/datadog/ci/contrib/rspec/integration.rb +0 -48
- data/lib/datadog/ci/contrib/rspec/patcher.rb +0 -27
- data/lib/datadog/ci/ext/app_types.rb +0 -9
- data/lib/datadog/ci/ext/environment.rb +0 -575
- data/lib/datadog/ci/ext/settings.rb +0 -10
- data/lib/datadog/ci/ext/test.rb +0 -35
- data/lib/datadog/ci/extensions.rb +0 -19
- data/lib/datadog/ci/flush.rb +0 -38
- data/lib/datadog/ci/test.rb +0 -81
- 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/transport/config.rb +0 -58
- data/lib/datadog/core/transport/http/api.rb +0 -57
- data/lib/datadog/core/transport/http/client.rb +0 -45
- data/lib/datadog/core/transport/http/config.rb +0 -268
- data/lib/datadog/core/transport/http/negotiation.rb +0 -144
- data/lib/datadog/core/transport/http.rb +0 -169
- data/lib/datadog/core/utils/object_set.rb +0 -43
- data/lib/datadog/core/utils/string_table.rb +0 -47
- data/lib/datadog/profiling/backtrace_location.rb +0 -34
- data/lib/datadog/profiling/buffer.rb +0 -43
- data/lib/datadog/profiling/collectors/old_stack.rb +0 -301
- data/lib/datadog/profiling/encoding/profile.rb +0 -41
- data/lib/datadog/profiling/event.rb +0 -15
- data/lib/datadog/profiling/events/stack.rb +0 -82
- data/lib/datadog/profiling/old_recorder.rb +0 -107
- data/lib/datadog/profiling/pprof/builder.rb +0 -125
- data/lib/datadog/profiling/pprof/converter.rb +0 -102
- 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 -81
- data/lib/datadog/profiling/pprof/stack_sample.rb +0 -139
- data/lib/datadog/profiling/pprof/string_table.rb +0 -12
- data/lib/datadog/profiling/pprof/template.rb +0 -118
- data/lib/datadog/profiling/trace_identifiers/ddtrace.rb +0 -43
- data/lib/datadog/profiling/trace_identifiers/helper.rb +0 -45
- data/lib/datadog/tracing/contrib/sinatra/headers.rb +0 -35
- data/lib/ddtrace/transport/http/adapters/net.rb +0 -168
- data/lib/ddtrace/transport/http/adapters/registry.rb +0 -27
- data/lib/ddtrace/transport/http/adapters/test.rb +0 -85
- data/lib/ddtrace/transport/http/adapters/unix_socket.rb +0 -77
- 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 -39
- data/lib/ddtrace/transport/http/builder.rb +0 -176
- data/lib/ddtrace/transport/http/client.rb +0 -52
- 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 -43
- data/lib/ddtrace/transport/http/traces.rb +0 -144
- data/lib/ddtrace/transport/http.rb +0 -117
- data/lib/ddtrace/transport/io/client.rb +0 -85
- data/lib/ddtrace/transport/io/response.rb +0 -25
- data/lib/ddtrace/transport/io/traces.rb +0 -99
- data/lib/ddtrace/transport/io.rb +0 -28
- data/lib/ddtrace/transport/parcel.rb +0 -20
- data/lib/ddtrace/transport/request.rb +0 -15
- data/lib/ddtrace/transport/response.rb +0 -60
- data/lib/ddtrace/transport/serializable_trace.rb +0 -122
- data/lib/ddtrace/transport/statistics.rb +0 -75
- data/lib/ddtrace/transport/trace_formatter.rb +0 -198
- data/lib/ddtrace/transport/traces.rb +0 -216
|
@@ -83,6 +83,7 @@ struct cpu_and_wall_time_worker_state {
|
|
|
83
83
|
bool allocation_counting_enabled;
|
|
84
84
|
bool no_signals_workaround_enabled;
|
|
85
85
|
bool dynamic_sampling_rate_enabled;
|
|
86
|
+
int allocation_sample_every; // Temporarily used for development/testing of allocation profiling
|
|
86
87
|
VALUE self_instance;
|
|
87
88
|
VALUE thread_context_collector_instance;
|
|
88
89
|
VALUE idle_sampling_helper_instance;
|
|
@@ -150,7 +151,8 @@ static VALUE _native_initialize(
|
|
|
150
151
|
VALUE idle_sampling_helper_instance,
|
|
151
152
|
VALUE allocation_counting_enabled,
|
|
152
153
|
VALUE no_signals_workaround_enabled,
|
|
153
|
-
VALUE dynamic_sampling_rate_enabled
|
|
154
|
+
VALUE dynamic_sampling_rate_enabled,
|
|
155
|
+
VALUE allocation_sample_every
|
|
154
156
|
);
|
|
155
157
|
static void cpu_and_wall_time_worker_typed_data_mark(void *state_ptr);
|
|
156
158
|
static VALUE _native_sampling_loop(VALUE self, VALUE instance);
|
|
@@ -183,9 +185,10 @@ static void grab_gvl_and_sample(void);
|
|
|
183
185
|
static void reset_stats(struct cpu_and_wall_time_worker_state *state);
|
|
184
186
|
static void sleep_for(uint64_t time_ns);
|
|
185
187
|
static VALUE _native_allocation_count(DDTRACE_UNUSED VALUE self);
|
|
186
|
-
static void on_newobj_event(
|
|
188
|
+
static void on_newobj_event(VALUE tracepoint_data, DDTRACE_UNUSED void *unused);
|
|
187
189
|
static void disable_tracepoints(struct cpu_and_wall_time_worker_state *state);
|
|
188
190
|
static VALUE _native_with_blocked_sigprof(DDTRACE_UNUSED VALUE self);
|
|
191
|
+
static VALUE rescued_sample_allocation(VALUE tracepoint_data);
|
|
189
192
|
|
|
190
193
|
// Note on sampler global state safety:
|
|
191
194
|
//
|
|
@@ -223,7 +226,7 @@ void collectors_cpu_and_wall_time_worker_init(VALUE profiling_module) {
|
|
|
223
226
|
// https://bugs.ruby-lang.org/issues/18007 for a discussion around this.
|
|
224
227
|
rb_define_alloc_func(collectors_cpu_and_wall_time_worker_class, _native_new);
|
|
225
228
|
|
|
226
|
-
rb_define_singleton_method(collectors_cpu_and_wall_time_worker_class, "_native_initialize", _native_initialize,
|
|
229
|
+
rb_define_singleton_method(collectors_cpu_and_wall_time_worker_class, "_native_initialize", _native_initialize, 8);
|
|
227
230
|
rb_define_singleton_method(collectors_cpu_and_wall_time_worker_class, "_native_sampling_loop", _native_sampling_loop, 1);
|
|
228
231
|
rb_define_singleton_method(collectors_cpu_and_wall_time_worker_class, "_native_stop", _native_stop, 2);
|
|
229
232
|
rb_define_singleton_method(collectors_cpu_and_wall_time_worker_class, "_native_reset_after_fork", _native_reset_after_fork, 1);
|
|
@@ -257,10 +260,14 @@ static const rb_data_type_t cpu_and_wall_time_worker_typed_data = {
|
|
|
257
260
|
static VALUE _native_new(VALUE klass) {
|
|
258
261
|
struct cpu_and_wall_time_worker_state *state = ruby_xcalloc(1, sizeof(struct cpu_and_wall_time_worker_state));
|
|
259
262
|
|
|
263
|
+
// Note: Any exceptions raised from this note until the TypedData_Wrap_Struct call will lead to the state memory
|
|
264
|
+
// being leaked.
|
|
265
|
+
|
|
260
266
|
state->gc_profiling_enabled = false;
|
|
261
267
|
state->allocation_counting_enabled = false;
|
|
262
268
|
state->no_signals_workaround_enabled = false;
|
|
263
269
|
state->dynamic_sampling_rate_enabled = true;
|
|
270
|
+
state->allocation_sample_every = 0;
|
|
264
271
|
state->thread_context_collector_instance = Qnil;
|
|
265
272
|
state->idle_sampling_helper_instance = Qnil;
|
|
266
273
|
state->owner_thread = Qnil;
|
|
@@ -287,12 +294,14 @@ static VALUE _native_initialize(
|
|
|
287
294
|
VALUE idle_sampling_helper_instance,
|
|
288
295
|
VALUE allocation_counting_enabled,
|
|
289
296
|
VALUE no_signals_workaround_enabled,
|
|
290
|
-
VALUE dynamic_sampling_rate_enabled
|
|
297
|
+
VALUE dynamic_sampling_rate_enabled,
|
|
298
|
+
VALUE allocation_sample_every
|
|
291
299
|
) {
|
|
292
300
|
ENFORCE_BOOLEAN(gc_profiling_enabled);
|
|
293
301
|
ENFORCE_BOOLEAN(allocation_counting_enabled);
|
|
294
302
|
ENFORCE_BOOLEAN(no_signals_workaround_enabled);
|
|
295
303
|
ENFORCE_BOOLEAN(dynamic_sampling_rate_enabled);
|
|
304
|
+
ENFORCE_TYPE(allocation_sample_every, T_FIXNUM);
|
|
296
305
|
|
|
297
306
|
struct cpu_and_wall_time_worker_state *state;
|
|
298
307
|
TypedData_Get_Struct(self_instance, struct cpu_and_wall_time_worker_state, &cpu_and_wall_time_worker_typed_data, state);
|
|
@@ -301,6 +310,12 @@ static VALUE _native_initialize(
|
|
|
301
310
|
state->allocation_counting_enabled = (allocation_counting_enabled == Qtrue);
|
|
302
311
|
state->no_signals_workaround_enabled = (no_signals_workaround_enabled == Qtrue);
|
|
303
312
|
state->dynamic_sampling_rate_enabled = (dynamic_sampling_rate_enabled == Qtrue);
|
|
313
|
+
state->allocation_sample_every = NUM2INT(allocation_sample_every);
|
|
314
|
+
|
|
315
|
+
if (state->allocation_sample_every < 0) {
|
|
316
|
+
rb_raise(rb_eArgError, "Unexpected value for allocation_sample_every: %d. This value must be >= 0.", state->allocation_sample_every);
|
|
317
|
+
}
|
|
318
|
+
|
|
304
319
|
state->thread_context_collector_instance = enforce_thread_context_collector_instance(thread_context_collector_instance);
|
|
305
320
|
state->idle_sampling_helper_instance = idle_sampling_helper_instance;
|
|
306
321
|
state->gc_tracepoint = rb_tracepoint_new(Qnil, RUBY_INTERNAL_EVENT_GC_ENTER | RUBY_INTERNAL_EVENT_GC_EXIT, on_gc_event, NULL /* unused */);
|
|
@@ -880,7 +895,7 @@ static VALUE _native_allocation_count(DDTRACE_UNUSED VALUE self) {
|
|
|
880
895
|
|
|
881
896
|
// Implements memory-related profiling events. This function is called by Ruby via the `object_allocation_tracepoint`
|
|
882
897
|
// when the RUBY_INTERNAL_EVENT_NEWOBJ event is triggered.
|
|
883
|
-
static void on_newobj_event(
|
|
898
|
+
static void on_newobj_event(VALUE tracepoint_data, DDTRACE_UNUSED void *unused) {
|
|
884
899
|
// Update thread-local allocation count
|
|
885
900
|
if (RB_UNLIKELY(allocation_count == UINT64_MAX)) {
|
|
886
901
|
allocation_count = 0;
|
|
@@ -907,7 +922,12 @@ static void on_newobj_event(DDTRACE_UNUSED VALUE tracepoint_data, DDTRACE_UNUSED
|
|
|
907
922
|
// defined as not being able to allocate) sets this.
|
|
908
923
|
state->during_sample = true;
|
|
909
924
|
|
|
910
|
-
// TODO:
|
|
925
|
+
// TODO: This is a placeholder sampling decision strategy. We plan to replace it with a better one soon (e.g. before
|
|
926
|
+
// beta), and having something here allows us to test the rest of feature, sampling decision aside.
|
|
927
|
+
if (state->allocation_sample_every > 0 && ((allocation_count % state->allocation_sample_every) == 0)) {
|
|
928
|
+
// Rescue against any exceptions that happen during sampling
|
|
929
|
+
safely_call(rescued_sample_allocation, tracepoint_data, state->self_instance);
|
|
930
|
+
}
|
|
911
931
|
|
|
912
932
|
state->during_sample = false;
|
|
913
933
|
}
|
|
@@ -929,3 +949,18 @@ static VALUE _native_with_blocked_sigprof(DDTRACE_UNUSED VALUE self) {
|
|
|
929
949
|
return result;
|
|
930
950
|
}
|
|
931
951
|
}
|
|
952
|
+
|
|
953
|
+
static VALUE rescued_sample_allocation(VALUE tracepoint_data) {
|
|
954
|
+
struct cpu_and_wall_time_worker_state *state = active_sampler_instance_state; // Read from global variable, see "sampler global state safety" note above
|
|
955
|
+
|
|
956
|
+
// This should not happen in a normal situation because on_newobj_event already checked for this, but just in case...
|
|
957
|
+
if (state == NULL) return Qnil;
|
|
958
|
+
|
|
959
|
+
rb_trace_arg_t *data = rb_tracearg_from_tracepoint(tracepoint_data);
|
|
960
|
+
VALUE new_object = rb_tracearg_object(data);
|
|
961
|
+
|
|
962
|
+
thread_context_collector_sample_allocation(state->thread_context_collector_instance, state->allocation_sample_every, new_object);
|
|
963
|
+
|
|
964
|
+
// Return a dummy VALUE because we're called from rb_rescue2 which requires it
|
|
965
|
+
return Qnil;
|
|
966
|
+
}
|
|
@@ -78,6 +78,9 @@ static const rb_data_type_t idle_sampling_helper_typed_data = {
|
|
|
78
78
|
static VALUE _native_new(VALUE klass) {
|
|
79
79
|
struct idle_sampling_loop_state *state = ruby_xcalloc(1, sizeof(struct idle_sampling_loop_state));
|
|
80
80
|
|
|
81
|
+
// Note: Any exceptions raised from this note until the TypedData_Wrap_Struct call will lead to the state memory
|
|
82
|
+
// being leaked.
|
|
83
|
+
|
|
81
84
|
reset_state(state);
|
|
82
85
|
|
|
83
86
|
return TypedData_Wrap_Struct(klass, &idle_sampling_helper_typed_data, state);
|
|
@@ -23,7 +23,6 @@ struct sampling_buffer {
|
|
|
23
23
|
int *lines_buffer;
|
|
24
24
|
bool *is_ruby_frame;
|
|
25
25
|
ddog_prof_Location *locations;
|
|
26
|
-
ddog_prof_Line *lines;
|
|
27
26
|
}; // Note: typedef'd in the header to sampling_buffer
|
|
28
27
|
|
|
29
28
|
static VALUE _native_sample(
|
|
@@ -41,7 +40,7 @@ static void record_placeholder_stack_in_native_code(
|
|
|
41
40
|
sampling_buffer* buffer,
|
|
42
41
|
VALUE recorder_instance,
|
|
43
42
|
sample_values values,
|
|
44
|
-
|
|
43
|
+
sample_labels labels,
|
|
45
44
|
sampling_buffer *record_buffer,
|
|
46
45
|
int extra_frames_in_record_buffer
|
|
47
46
|
);
|
|
@@ -50,7 +49,7 @@ static void sample_thread_internal(
|
|
|
50
49
|
sampling_buffer* buffer,
|
|
51
50
|
VALUE recorder_instance,
|
|
52
51
|
sample_values values,
|
|
53
|
-
|
|
52
|
+
sample_labels labels,
|
|
54
53
|
sampling_buffer *record_buffer,
|
|
55
54
|
int extra_frames_in_record_buffer
|
|
56
55
|
);
|
|
@@ -86,13 +85,14 @@ static VALUE _native_sample(
|
|
|
86
85
|
VALUE zero = INT2NUM(0);
|
|
87
86
|
sample_values values = {
|
|
88
87
|
.cpu_time_ns = NUM2UINT(rb_hash_lookup2(metric_values_hash, rb_str_new_cstr("cpu-time"), zero)),
|
|
89
|
-
.
|
|
88
|
+
.cpu_or_wall_samples = NUM2UINT(rb_hash_lookup2(metric_values_hash, rb_str_new_cstr("cpu-samples"), zero)),
|
|
90
89
|
.wall_time_ns = NUM2UINT(rb_hash_lookup2(metric_values_hash, rb_str_new_cstr("wall-time"), zero)),
|
|
91
90
|
.alloc_samples = NUM2UINT(rb_hash_lookup2(metric_values_hash, rb_str_new_cstr("alloc-samples"), zero)),
|
|
92
91
|
};
|
|
93
92
|
|
|
94
93
|
long labels_count = RARRAY_LEN(labels_array) + RARRAY_LEN(numeric_labels_array);
|
|
95
94
|
ddog_prof_Label labels[labels_count];
|
|
95
|
+
ddog_prof_Label *state_label = NULL;
|
|
96
96
|
|
|
97
97
|
for (int i = 0; i < RARRAY_LEN(labels_array); i++) {
|
|
98
98
|
VALUE key_str_pair = rb_ary_entry(labels_array, i);
|
|
@@ -101,6 +101,10 @@ static VALUE _native_sample(
|
|
|
101
101
|
.key = char_slice_from_ruby_string(rb_ary_entry(key_str_pair, 0)),
|
|
102
102
|
.str = char_slice_from_ruby_string(rb_ary_entry(key_str_pair, 1))
|
|
103
103
|
};
|
|
104
|
+
|
|
105
|
+
if (rb_str_equal(rb_ary_entry(key_str_pair, 0), rb_str_new_cstr("state"))) {
|
|
106
|
+
state_label = &labels[i];
|
|
107
|
+
}
|
|
104
108
|
}
|
|
105
109
|
for (int i = 0; i < RARRAY_LEN(numeric_labels_array); i++) {
|
|
106
110
|
VALUE key_str_pair = rb_ary_entry(numeric_labels_array, i);
|
|
@@ -116,12 +120,14 @@ static VALUE _native_sample(
|
|
|
116
120
|
|
|
117
121
|
sampling_buffer *buffer = sampling_buffer_new(max_frames_requested);
|
|
118
122
|
|
|
123
|
+
ddog_prof_Slice_Label slice_labels = {.ptr = labels, .len = labels_count};
|
|
124
|
+
|
|
119
125
|
sample_thread(
|
|
120
126
|
thread,
|
|
121
127
|
buffer,
|
|
122
128
|
recorder_instance,
|
|
123
129
|
values,
|
|
124
|
-
(
|
|
130
|
+
(sample_labels) {.labels = slice_labels, .state_label = state_label},
|
|
125
131
|
RTEST(in_gc) ? SAMPLE_IN_GC : SAMPLE_REGULAR
|
|
126
132
|
);
|
|
127
133
|
|
|
@@ -135,7 +141,7 @@ void sample_thread(
|
|
|
135
141
|
sampling_buffer* buffer,
|
|
136
142
|
VALUE recorder_instance,
|
|
137
143
|
sample_values values,
|
|
138
|
-
|
|
144
|
+
sample_labels labels,
|
|
139
145
|
sample_type type
|
|
140
146
|
) {
|
|
141
147
|
// Samples thread into recorder
|
|
@@ -150,7 +156,7 @@ void sample_thread(
|
|
|
150
156
|
if (type == SAMPLE_IN_GC) {
|
|
151
157
|
ddog_CharSlice function_name = DDOG_CHARSLICE_C("");
|
|
152
158
|
ddog_CharSlice function_filename = DDOG_CHARSLICE_C("Garbage Collection");
|
|
153
|
-
buffer->
|
|
159
|
+
buffer->locations[0] = (ddog_prof_Location) {
|
|
154
160
|
.function = (ddog_prof_Function) {.name = function_name, .filename = function_filename},
|
|
155
161
|
.line = 0
|
|
156
162
|
};
|
|
@@ -162,7 +168,6 @@ void sample_thread(
|
|
|
162
168
|
.lines_buffer = buffer->lines_buffer + 1,
|
|
163
169
|
.is_ruby_frame = buffer->is_ruby_frame + 1,
|
|
164
170
|
.locations = buffer->locations + 1,
|
|
165
|
-
.lines = buffer->lines + 1
|
|
166
171
|
};
|
|
167
172
|
sampling_buffer *record_buffer = buffer; // We pass in the original buffer as the record_buffer, but not as the regular buffer
|
|
168
173
|
int extra_frames_in_record_buffer = 1;
|
|
@@ -173,6 +178,8 @@ void sample_thread(
|
|
|
173
178
|
rb_raise(rb_eArgError, "Unexpected value for sample_type: %d", type);
|
|
174
179
|
}
|
|
175
180
|
|
|
181
|
+
#define CHARSLICE_EQUALS(must_be_a_literal, charslice) (strlen("" must_be_a_literal) == charslice.len && strncmp(must_be_a_literal, charslice.ptr, charslice.len) == 0)
|
|
182
|
+
|
|
176
183
|
// Idea: Should we release the global vm lock (GVL) after we get the data from `rb_profile_frames`? That way other Ruby threads
|
|
177
184
|
// could continue making progress while the sample was ingested into the profile.
|
|
178
185
|
//
|
|
@@ -197,7 +204,7 @@ static void sample_thread_internal(
|
|
|
197
204
|
sampling_buffer* buffer,
|
|
198
205
|
VALUE recorder_instance,
|
|
199
206
|
sample_values values,
|
|
200
|
-
|
|
207
|
+
sample_labels labels,
|
|
201
208
|
sampling_buffer *record_buffer,
|
|
202
209
|
int extra_frames_in_record_buffer
|
|
203
210
|
) {
|
|
@@ -230,6 +237,15 @@ static void sample_thread_internal(
|
|
|
230
237
|
VALUE last_ruby_frame = Qnil;
|
|
231
238
|
int last_ruby_line = 0;
|
|
232
239
|
|
|
240
|
+
ddog_prof_Label *state_label = labels.state_label;
|
|
241
|
+
bool cpu_or_wall_sample = values.cpu_or_wall_samples > 0;
|
|
242
|
+
bool has_cpu_time = cpu_or_wall_sample && values.cpu_time_ns > 0;
|
|
243
|
+
bool only_wall_time = cpu_or_wall_sample && values.cpu_time_ns == 0 && values.wall_time_ns > 0;
|
|
244
|
+
|
|
245
|
+
if (cpu_or_wall_sample && state_label == NULL) rb_raise(rb_eRuntimeError, "BUG: Unexpected missing state_label");
|
|
246
|
+
|
|
247
|
+
if (has_cpu_time) state_label->str = DDOG_CHARSLICE_C("had cpu");
|
|
248
|
+
|
|
233
249
|
for (int i = captured_frames - 1; i >= 0; i--) {
|
|
234
250
|
VALUE name, filename;
|
|
235
251
|
int line;
|
|
@@ -250,10 +266,55 @@ static void sample_thread_internal(
|
|
|
250
266
|
name = NIL_P(name) ? missing_string : name;
|
|
251
267
|
filename = NIL_P(filename) ? missing_string : filename;
|
|
252
268
|
|
|
253
|
-
|
|
269
|
+
ddog_CharSlice name_slice = char_slice_from_ruby_string(name);
|
|
270
|
+
ddog_CharSlice filename_slice = char_slice_from_ruby_string(filename);
|
|
271
|
+
|
|
272
|
+
bool top_of_the_stack = i == 0;
|
|
273
|
+
|
|
274
|
+
// When there's only wall-time in a sample, this means that the thread was not active in the sampled period.
|
|
275
|
+
//
|
|
276
|
+
// We try to categorize what it was doing based on what we observe at the top of the stack. This is a very rough
|
|
277
|
+
// approximation, and in the future we hope to replace this with a more accurate approach (such as using the
|
|
278
|
+
// GVL instrumentation API.)
|
|
279
|
+
if (top_of_the_stack && only_wall_time) {
|
|
280
|
+
if (!buffer->is_ruby_frame[i]) {
|
|
281
|
+
// We know that known versions of Ruby implement these using native code; thus if we find a method with the
|
|
282
|
+
// same name that is not native code, we ignore it, as it's probably a user method that coincidentally
|
|
283
|
+
// has the same name. Thus, even though "matching just by method name" is kinda weak,
|
|
284
|
+
// "matching by method name" + is native code seems actually to be good enough for a lot of cases.
|
|
285
|
+
|
|
286
|
+
if (CHARSLICE_EQUALS("sleep", name_slice)) { // Expected to be Kernel.sleep
|
|
287
|
+
state_label->str = DDOG_CHARSLICE_C("sleeping");
|
|
288
|
+
} else if (CHARSLICE_EQUALS("select", name_slice)) { // Expected to be Kernel.select
|
|
289
|
+
state_label->str = DDOG_CHARSLICE_C("waiting");
|
|
290
|
+
} else if (
|
|
291
|
+
CHARSLICE_EQUALS("synchronize", name_slice) || // Expected to be Monitor/Mutex#synchronize
|
|
292
|
+
CHARSLICE_EQUALS("lock", name_slice) || // Expected to be Mutex#lock
|
|
293
|
+
CHARSLICE_EQUALS("join", name_slice) // Expected to be Thread#join
|
|
294
|
+
) {
|
|
295
|
+
state_label->str = DDOG_CHARSLICE_C("blocked");
|
|
296
|
+
} else if (CHARSLICE_EQUALS("wait_readable", name_slice)) { // Expected to be IO#wait_readable
|
|
297
|
+
state_label->str = DDOG_CHARSLICE_C("network");
|
|
298
|
+
}
|
|
299
|
+
#ifdef NO_PRIMITIVE_POP // Ruby < 3.2
|
|
300
|
+
else if (CHARSLICE_EQUALS("pop", name_slice)) { // Expected to be Queue/SizedQueue#pop
|
|
301
|
+
state_label->str = DDOG_CHARSLICE_C("waiting");
|
|
302
|
+
}
|
|
303
|
+
#endif
|
|
304
|
+
} else {
|
|
305
|
+
#ifndef NO_PRIMITIVE_POP // Ruby >= 3.2
|
|
306
|
+
// Unlike the above, Ruby actually treats this one specially and gives it a nice file name we can match on!
|
|
307
|
+
if (CHARSLICE_EQUALS("pop", name_slice) && CHARSLICE_EQUALS("<internal:thread_sync>", filename_slice)) { // Expected to be Queue/SizedQueue#pop
|
|
308
|
+
state_label->str = DDOG_CHARSLICE_C("waiting");
|
|
309
|
+
}
|
|
310
|
+
#endif
|
|
311
|
+
}
|
|
312
|
+
}
|
|
313
|
+
|
|
314
|
+
buffer->locations[i] = (ddog_prof_Location) {
|
|
254
315
|
.function = (ddog_prof_Function) {
|
|
255
|
-
.name =
|
|
256
|
-
.filename =
|
|
316
|
+
.name = name_slice,
|
|
317
|
+
.filename = filename_slice,
|
|
257
318
|
},
|
|
258
319
|
.line = line,
|
|
259
320
|
};
|
|
@@ -292,7 +353,7 @@ static void maybe_add_placeholder_frames_omitted(VALUE thread, sampling_buffer*
|
|
|
292
353
|
// `record_sample`. So be careful where it gets allocated. (We do have tests for this, at least!)
|
|
293
354
|
ddog_CharSlice function_name = DDOG_CHARSLICE_C("");
|
|
294
355
|
ddog_CharSlice function_filename = {.ptr = frames_omitted_message, .len = strlen(frames_omitted_message)};
|
|
295
|
-
buffer->
|
|
356
|
+
buffer->locations[buffer->max_frames - 1] = (ddog_prof_Location) {
|
|
296
357
|
.function = (ddog_prof_Function) {.name = function_name, .filename = function_filename},
|
|
297
358
|
.line = 0,
|
|
298
359
|
};
|
|
@@ -322,13 +383,13 @@ static void record_placeholder_stack_in_native_code(
|
|
|
322
383
|
sampling_buffer* buffer,
|
|
323
384
|
VALUE recorder_instance,
|
|
324
385
|
sample_values values,
|
|
325
|
-
|
|
386
|
+
sample_labels labels,
|
|
326
387
|
sampling_buffer *record_buffer,
|
|
327
388
|
int extra_frames_in_record_buffer
|
|
328
389
|
) {
|
|
329
390
|
ddog_CharSlice function_name = DDOG_CHARSLICE_C("");
|
|
330
391
|
ddog_CharSlice function_filename = DDOG_CHARSLICE_C("In native code");
|
|
331
|
-
buffer->
|
|
392
|
+
buffer->locations[0] = (ddog_prof_Location) {
|
|
332
393
|
.function = (ddog_prof_Function) {.name = function_name, .filename = function_filename},
|
|
333
394
|
.line = 0
|
|
334
395
|
};
|
|
@@ -354,14 +415,6 @@ sampling_buffer *sampling_buffer_new(unsigned int max_frames) {
|
|
|
354
415
|
buffer->lines_buffer = ruby_xcalloc(max_frames, sizeof(int));
|
|
355
416
|
buffer->is_ruby_frame = ruby_xcalloc(max_frames, sizeof(bool));
|
|
356
417
|
buffer->locations = ruby_xcalloc(max_frames, sizeof(ddog_prof_Location));
|
|
357
|
-
buffer->lines = ruby_xcalloc(max_frames, sizeof(ddog_prof_Line));
|
|
358
|
-
|
|
359
|
-
// Currently we have a 1-to-1 correspondence between lines and locations, so we just initialize the locations once
|
|
360
|
-
// here and then only mutate the contents of the lines.
|
|
361
|
-
for (unsigned int i = 0; i < max_frames; i++) {
|
|
362
|
-
ddog_prof_Slice_Line lines = (ddog_prof_Slice_Line) {.ptr = &buffer->lines[i], .len = 1};
|
|
363
|
-
buffer->locations[i] = (ddog_prof_Location) {.lines = lines};
|
|
364
|
-
}
|
|
365
418
|
|
|
366
419
|
return buffer;
|
|
367
420
|
}
|
|
@@ -373,7 +426,6 @@ void sampling_buffer_free(sampling_buffer *buffer) {
|
|
|
373
426
|
ruby_xfree(buffer->lines_buffer);
|
|
374
427
|
ruby_xfree(buffer->is_ruby_frame);
|
|
375
428
|
ruby_xfree(buffer->locations);
|
|
376
|
-
ruby_xfree(buffer->lines);
|
|
377
429
|
|
|
378
430
|
ruby_xfree(buffer);
|
|
379
431
|
}
|