ddtrace 1.12.1 → 1.23.2
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 +613 -9
- data/LICENSE-3rdparty.csv +1 -1
- data/bin/ddprofrb +15 -0
- data/bin/ddtracerb +3 -1
- data/ext/{ddtrace_profiling_loader/ddtrace_profiling_loader.c → datadog_profiling_loader/datadog_profiling_loader.c} +2 -2
- data/ext/{ddtrace_profiling_loader → datadog_profiling_loader}/extconf.rb +3 -3
- data/ext/{ddtrace_profiling_native_extension → datadog_profiling_native_extension}/NativeExtensionDesign.md +3 -5
- data/ext/{ddtrace_profiling_native_extension → datadog_profiling_native_extension}/clock_id.h +0 -3
- data/ext/{ddtrace_profiling_native_extension → datadog_profiling_native_extension}/clock_id_from_pthread.c +3 -22
- data/ext/{ddtrace_profiling_native_extension → datadog_profiling_native_extension}/clock_id_noop.c +0 -1
- data/ext/{ddtrace_profiling_native_extension → datadog_profiling_native_extension}/collectors_cpu_and_wall_time_worker.c +338 -108
- data/ext/datadog_profiling_native_extension/collectors_discrete_dynamic_sampler.c +422 -0
- data/ext/datadog_profiling_native_extension/collectors_discrete_dynamic_sampler.h +101 -0
- data/ext/{ddtrace_profiling_native_extension → datadog_profiling_native_extension}/collectors_dynamic_sampling_rate.c +22 -14
- data/ext/{ddtrace_profiling_native_extension → datadog_profiling_native_extension}/collectors_dynamic_sampling_rate.h +4 -0
- data/ext/datadog_profiling_native_extension/collectors_gc_profiling_helper.c +156 -0
- data/ext/datadog_profiling_native_extension/collectors_gc_profiling_helper.h +5 -0
- data/ext/{ddtrace_profiling_native_extension → datadog_profiling_native_extension}/collectors_idle_sampling_helper.c +3 -0
- data/ext/{ddtrace_profiling_native_extension → datadog_profiling_native_extension}/collectors_stack.c +111 -118
- data/ext/{ddtrace_profiling_native_extension → datadog_profiling_native_extension}/collectors_stack.h +11 -4
- data/ext/{ddtrace_profiling_native_extension → datadog_profiling_native_extension}/collectors_thread_context.c +545 -144
- data/ext/{ddtrace_profiling_native_extension → datadog_profiling_native_extension}/collectors_thread_context.h +3 -2
- data/ext/{ddtrace_profiling_native_extension → datadog_profiling_native_extension}/extconf.rb +68 -17
- data/ext/datadog_profiling_native_extension/heap_recorder.c +1047 -0
- data/ext/datadog_profiling_native_extension/heap_recorder.h +166 -0
- data/ext/{ddtrace_profiling_native_extension → datadog_profiling_native_extension}/helpers.h +6 -0
- data/ext/{ddtrace_profiling_native_extension → datadog_profiling_native_extension}/http_transport.c +60 -32
- data/ext/datadog_profiling_native_extension/libdatadog_helpers.c +62 -0
- data/ext/datadog_profiling_native_extension/libdatadog_helpers.h +42 -0
- data/ext/{ddtrace_profiling_native_extension → datadog_profiling_native_extension}/native_extension_helpers.rb +50 -4
- data/ext/{ddtrace_profiling_native_extension → datadog_profiling_native_extension}/private_vm_api_access.c +155 -32
- data/ext/{ddtrace_profiling_native_extension → datadog_profiling_native_extension}/private_vm_api_access.h +16 -0
- data/ext/{ddtrace_profiling_native_extension → datadog_profiling_native_extension}/profiling.c +19 -3
- data/ext/datadog_profiling_native_extension/ruby_helpers.c +267 -0
- data/ext/{ddtrace_profiling_native_extension → datadog_profiling_native_extension}/ruby_helpers.h +33 -0
- data/ext/datadog_profiling_native_extension/stack_recorder.c +1040 -0
- data/ext/datadog_profiling_native_extension/stack_recorder.h +27 -0
- data/ext/datadog_profiling_native_extension/time_helpers.c +53 -0
- data/ext/datadog_profiling_native_extension/time_helpers.h +26 -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 +57 -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 +77 -27
- 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/auto_instrument.rb +3 -0
- 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 +20 -7
- data/lib/datadog/core/configuration/ext.rb +28 -5
- data/lib/datadog/core/configuration/option.rb +271 -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 +398 -119
- data/lib/datadog/core/configuration.rb +24 -4
- data/lib/datadog/core/diagnostics/environment_logger.rb +132 -235
- data/lib/datadog/core/environment/class_count.rb +6 -6
- data/lib/datadog/core/environment/execution.rb +103 -0
- data/lib/datadog/core/environment/ext.rb +13 -11
- data/lib/datadog/core/environment/git.rb +25 -0
- data/lib/datadog/core/environment/identity.rb +18 -48
- data/lib/datadog/core/environment/platform.rb +7 -1
- 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 +6 -23
- 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 +7 -2
- data/lib/datadog/core/remote/client.rb +3 -0
- data/lib/datadog/core/remote/component.rb +52 -48
- 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 +2 -1
- data/lib/datadog/core/remote/negotiation.rb +20 -7
- data/lib/datadog/core/remote/tie/tracing.rb +39 -0
- data/lib/datadog/core/remote/tie.rb +27 -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/{transport → remote/transport}/negotiation.rb +25 -23
- data/lib/datadog/core/remote/worker.rb +11 -5
- 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 +28 -10
- data/lib/datadog/core/telemetry/emitter.rb +9 -11
- data/lib/datadog/core/telemetry/event.rb +250 -44
- data/lib/datadog/core/telemetry/ext.rb +8 -1
- data/lib/datadog/core/telemetry/heartbeat.rb +3 -7
- data/lib/datadog/core/telemetry/http/ext.rb +13 -8
- data/lib/datadog/core/telemetry/http/response.rb +4 -0
- data/lib/datadog/core/telemetry/http/transport.rb +10 -3
- data/lib/datadog/core/telemetry/request.rb +59 -0
- data/lib/datadog/core/transport/ext.rb +49 -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/url.rb +25 -0
- 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 +5 -3
- 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 +4 -0
- data/lib/datadog/opentracer/text_map_propagator.rb +2 -1
- data/lib/datadog/opentracer.rb +9 -0
- data/lib/datadog/profiling/collectors/code_provenance.rb +10 -4
- data/lib/datadog/profiling/collectors/cpu_and_wall_time_worker.rb +43 -20
- data/lib/datadog/profiling/collectors/idle_sampling_helper.rb +3 -1
- data/lib/datadog/profiling/collectors/info.rb +101 -0
- data/lib/datadog/profiling/collectors/thread_context.rb +17 -2
- data/lib/datadog/profiling/component.rb +248 -97
- data/lib/datadog/profiling/exporter.rb +26 -5
- data/lib/datadog/profiling/ext.rb +2 -12
- data/lib/datadog/profiling/flush.rb +10 -5
- data/lib/datadog/profiling/http_transport.rb +23 -6
- data/lib/datadog/profiling/load_native_extension.rb +25 -6
- data/lib/datadog/profiling/native_extension.rb +1 -22
- data/lib/datadog/profiling/profiler.rb +36 -13
- data/lib/datadog/profiling/scheduler.rb +20 -15
- data/lib/datadog/profiling/stack_recorder.rb +19 -4
- data/lib/datadog/profiling/tag_builder.rb +5 -0
- data/lib/datadog/profiling/tasks/exec.rb +3 -3
- data/lib/datadog/profiling/tasks/help.rb +3 -3
- data/lib/datadog/profiling.rb +28 -79
- 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 -33
- data/lib/datadog/tracing/configuration/http.rb +74 -0
- data/lib/datadog/tracing/configuration/settings.rb +136 -99
- data/lib/datadog/tracing/contrib/action_cable/configuration/settings.rb +10 -6
- data/lib/datadog/tracing/contrib/action_cable/ext.rb +21 -18
- data/lib/datadog/tracing/contrib/action_mailer/configuration/settings.rb +10 -6
- data/lib/datadog/tracing/contrib/action_mailer/events/deliver.rb +1 -1
- data/lib/datadog/tracing/contrib/action_mailer/ext.rb +21 -18
- data/lib/datadog/tracing/contrib/action_pack/configuration/settings.rb +10 -7
- data/lib/datadog/tracing/contrib/action_pack/ext.rb +11 -8
- data/lib/datadog/tracing/contrib/action_view/configuration/settings.rb +10 -6
- data/lib/datadog/tracing/contrib/action_view/ext.rb +13 -10
- data/lib/datadog/tracing/contrib/active_job/configuration/settings.rb +14 -7
- data/lib/datadog/tracing/contrib/active_job/ext.rb +26 -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 +10 -6
- data/lib/datadog/tracing/contrib/active_model_serializers/ext.rb +13 -10
- data/lib/datadog/tracing/contrib/active_record/configuration/resolver.rb +29 -15
- data/lib/datadog/tracing/contrib/active_record/configuration/settings.rb +10 -7
- data/lib/datadog/tracing/contrib/active_record/events/sql.rb +2 -6
- data/lib/datadog/tracing/contrib/active_record/ext.rb +18 -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 +10 -7
- data/lib/datadog/tracing/contrib/active_support/ext.rb +19 -16
- data/lib/datadog/tracing/contrib/analytics.rb +0 -1
- data/lib/datadog/tracing/contrib/aws/configuration/settings.rb +15 -7
- data/lib/datadog/tracing/contrib/aws/ext.rb +38 -24
- data/lib/datadog/tracing/contrib/aws/instrumentation.rb +16 -5
- data/lib/datadog/tracing/contrib/concurrent_ruby/async_patch.rb +20 -0
- 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 +19 -2
- 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/settings.rb +1 -1
- data/lib/datadog/tracing/contrib/dalli/configuration/settings.rb +21 -7
- data/lib/datadog/tracing/contrib/dalli/ext.rb +27 -11
- data/lib/datadog/tracing/contrib/dalli/instrumentation.rb +17 -8
- data/lib/datadog/tracing/contrib/delayed_job/configuration/settings.rb +14 -7
- data/lib/datadog/tracing/contrib/delayed_job/ext.rb +17 -14
- data/lib/datadog/tracing/contrib/elasticsearch/configuration/settings.rb +15 -7
- data/lib/datadog/tracing/contrib/elasticsearch/ext.rb +22 -15
- data/lib/datadog/tracing/contrib/elasticsearch/patcher.rb +104 -99
- data/lib/datadog/tracing/contrib/ethon/configuration/settings.rb +17 -9
- data/lib/datadog/tracing/contrib/ethon/easy_patch.rb +48 -3
- data/lib/datadog/tracing/contrib/ethon/ext.rb +20 -11
- data/lib/datadog/tracing/contrib/ethon/multi_patch.rb +6 -3
- data/lib/datadog/tracing/contrib/excon/configuration/settings.rb +20 -10
- data/lib/datadog/tracing/contrib/excon/ext.rb +17 -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 +38 -2
- data/lib/datadog/tracing/contrib/faraday/configuration/settings.rb +27 -10
- data/lib/datadog/tracing/contrib/faraday/ext.rb +17 -8
- data/lib/datadog/tracing/contrib/faraday/middleware.rb +22 -6
- data/lib/datadog/tracing/contrib/grape/configuration/settings.rb +9 -6
- data/lib/datadog/tracing/contrib/grape/ext.rb +17 -14
- data/lib/datadog/tracing/contrib/graphql/configuration/settings.rb +9 -6
- data/lib/datadog/tracing/contrib/graphql/ext.rb +8 -5
- data/lib/datadog/tracing/contrib/grpc/configuration/settings.rb +40 -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 +17 -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 +34 -11
- data/lib/datadog/tracing/contrib/http/distributed/fetcher.rb +2 -2
- data/lib/datadog/tracing/contrib/http/ext.rb +17 -9
- data/lib/datadog/tracing/contrib/http/instrumentation.rb +27 -7
- data/lib/datadog/tracing/contrib/httpclient/configuration/settings.rb +34 -11
- data/lib/datadog/tracing/contrib/httpclient/ext.rb +18 -9
- data/lib/datadog/tracing/contrib/httpclient/instrumentation.rb +22 -5
- data/lib/datadog/tracing/contrib/httprb/configuration/settings.rb +34 -11
- data/lib/datadog/tracing/contrib/httprb/ext.rb +17 -9
- data/lib/datadog/tracing/contrib/httprb/instrumentation.rb +22 -5
- data/lib/datadog/tracing/contrib/kafka/configuration/settings.rb +10 -6
- data/lib/datadog/tracing/contrib/kafka/ext.rb +43 -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 +15 -7
- data/lib/datadog/tracing/contrib/mongodb/ext.rb +21 -16
- data/lib/datadog/tracing/contrib/mongodb/subscribers.rb +16 -5
- data/lib/datadog/tracing/contrib/mysql2/configuration/settings.rb +22 -14
- data/lib/datadog/tracing/contrib/mysql2/ext.rb +16 -10
- data/lib/datadog/tracing/contrib/mysql2/instrumentation.rb +22 -7
- data/lib/datadog/tracing/contrib/opensearch/configuration/settings.rb +53 -0
- data/lib/datadog/tracing/contrib/opensearch/ext.rb +38 -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 +23 -14
- data/lib/datadog/tracing/contrib/pg/ext.rb +23 -19
- data/lib/datadog/tracing/contrib/pg/instrumentation.rb +49 -9
- data/lib/datadog/tracing/contrib/presto/configuration/settings.rb +15 -7
- data/lib/datadog/tracing/contrib/presto/ext.rb +26 -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 +13 -8
- data/lib/datadog/tracing/contrib/qless/ext.rb +15 -12
- data/lib/datadog/tracing/contrib/que/configuration/settings.rb +22 -12
- data/lib/datadog/tracing/contrib/que/ext.rb +1 -0
- data/lib/datadog/tracing/contrib/racecar/configuration/settings.rb +10 -7
- data/lib/datadog/tracing/contrib/racecar/event.rb +5 -5
- data/lib/datadog/tracing/contrib/racecar/ext.rb +21 -18
- data/lib/datadog/tracing/contrib/rack/configuration/settings.rb +17 -12
- data/lib/datadog/tracing/contrib/rack/ext.rb +19 -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 +16 -50
- data/lib/datadog/tracing/contrib/rails/auto_instrument_railtie.rb +0 -2
- data/lib/datadog/tracing/contrib/rails/configuration/settings.rb +20 -15
- data/lib/datadog/tracing/contrib/rails/ext.rb +8 -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 +14 -10
- data/lib/datadog/tracing/contrib/rake/ext.rb +15 -12
- data/lib/datadog/tracing/contrib/redis/configuration/settings.rb +18 -9
- data/lib/datadog/tracing/contrib/redis/ext.rb +23 -15
- data/lib/datadog/tracing/contrib/redis/instrumentation.rb +5 -40
- data/lib/datadog/tracing/contrib/redis/patcher.rb +34 -21
- 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 +14 -7
- data/lib/datadog/tracing/contrib/resque/ext.rb +10 -7
- data/lib/datadog/tracing/contrib/rest_client/configuration/settings.rb +17 -9
- data/lib/datadog/tracing/contrib/rest_client/ext.rb +16 -8
- data/lib/datadog/tracing/contrib/rest_client/request_patch.rb +25 -5
- data/lib/datadog/tracing/contrib/roda/configuration/settings.rb +10 -6
- data/lib/datadog/tracing/contrib/roda/ext.rb +1 -0
- 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 +10 -6
- data/lib/datadog/tracing/contrib/sequel/ext.rb +11 -8
- data/lib/datadog/tracing/contrib/sequel/utils.rb +7 -7
- data/lib/datadog/tracing/contrib/shoryuken/configuration/settings.rb +15 -8
- data/lib/datadog/tracing/contrib/shoryuken/ext.rb +15 -12
- data/lib/datadog/tracing/contrib/sidekiq/configuration/settings.rb +19 -11
- data/lib/datadog/tracing/contrib/sidekiq/ext.rb +33 -30
- data/lib/datadog/tracing/contrib/sinatra/configuration/settings.rb +12 -9
- data/lib/datadog/tracing/contrib/sinatra/env.rb +0 -17
- data/lib/datadog/tracing/contrib/sinatra/ext.rb +22 -19
- data/lib/datadog/tracing/contrib/sinatra/tracer_middleware.rb +3 -14
- data/lib/datadog/tracing/contrib/sneakers/configuration/settings.rb +15 -8
- data/lib/datadog/tracing/contrib/sneakers/ext.rb +2 -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 +10 -6
- data/lib/datadog/tracing/contrib/stripe/ext.rb +1 -0
- data/lib/datadog/tracing/contrib/sucker_punch/configuration/settings.rb +10 -6
- data/lib/datadog/tracing/contrib/sucker_punch/ext.rb +16 -13
- data/lib/datadog/tracing/contrib/trilogy/configuration/settings.rb +58 -0
- data/lib/datadog/tracing/contrib/trilogy/ext.rb +27 -0
- data/lib/datadog/tracing/contrib/trilogy/instrumentation.rb +94 -0
- data/lib/datadog/tracing/contrib/trilogy/integration.rb +43 -0
- data/lib/datadog/{ci/contrib/cucumber → tracing/contrib/trilogy}/patcher.rb +10 -6
- 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 +2 -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/matcher.rb +23 -3
- data/lib/datadog/tracing/sampling/rule.rb +7 -2
- data/lib/datadog/tracing/sampling/rule_sampler.rb +31 -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 +17 -5
- 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 +125 -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 +240 -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/datadog/tracing.rb +8 -2
- data/lib/ddtrace/transport/ext.rb +22 -14
- data/lib/ddtrace/version.rb +9 -12
- data/lib/ddtrace.rb +1 -1
- metadata +157 -139
- data/ext/ddtrace_profiling_native_extension/libdatadog_helpers.h +0 -25
- data/ext/ddtrace_profiling_native_extension/ruby_helpers.c +0 -110
- data/ext/ddtrace_profiling_native_extension/stack_recorder.c +0 -591
- data/ext/ddtrace_profiling_native_extension/stack_recorder.h +0 -14
- data/ext/ddtrace_profiling_native_extension/time_helpers.c +0 -17
- data/ext/ddtrace_profiling_native_extension/time_helpers.h +0 -10
- 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/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/telemetry/collector.rb +0 -231
- data/lib/datadog/core/telemetry/v1/app_event.rb +0 -52
- data/lib/datadog/core/telemetry/v1/application.rb +0 -92
- data/lib/datadog/core/telemetry/v1/configuration.rb +0 -25
- data/lib/datadog/core/telemetry/v1/dependency.rb +0 -43
- data/lib/datadog/core/telemetry/v1/host.rb +0 -59
- data/lib/datadog/core/telemetry/v1/integration.rb +0 -64
- data/lib/datadog/core/telemetry/v1/product.rb +0 -36
- data/lib/datadog/core/telemetry/v1/telemetry_request.rb +0 -106
- 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
- /data/ext/{ddtrace_profiling_native_extension → datadog_profiling_native_extension}/collectors_idle_sampling_helper.h +0 -0
- /data/ext/{ddtrace_profiling_native_extension → datadog_profiling_native_extension}/setup_signal_handler.c +0 -0
- /data/ext/{ddtrace_profiling_native_extension → datadog_profiling_native_extension}/setup_signal_handler.h +0 -0
|
@@ -7,8 +7,8 @@ module Datadog
|
|
|
7
7
|
# Passing in a `nil` tracer is supported and will disable the following profiling features:
|
|
8
8
|
# * Code Hotspots panel in the trace viewer, as well as scoping a profile down to a span
|
|
9
9
|
# * Endpoint aggregation in the profiler UX, including normalization (resource per endpoint call)
|
|
10
|
-
def self.build_profiler_component(settings:, agent_settings:, optional_tracer:)
|
|
11
|
-
return unless settings.profiling.enabled
|
|
10
|
+
def self.build_profiler_component(settings:, agent_settings:, optional_tracer:) # rubocop:disable Metrics/MethodLength
|
|
11
|
+
return [nil, { profiling_enabled: false }] unless settings.profiling.enabled
|
|
12
12
|
|
|
13
13
|
# Workaround for weird dependency direction: the Core::Configuration::Components class currently has a
|
|
14
14
|
# dependency on individual products, in this case the Profiler.
|
|
@@ -28,91 +28,75 @@ module Datadog
|
|
|
28
28
|
# done, then profiling may not be loaded, and thus to avoid this issue we do a require here (which is a
|
|
29
29
|
# no-op if profiling is already loaded).
|
|
30
30
|
require_relative '../profiling'
|
|
31
|
-
return unless Profiling.supported?
|
|
32
31
|
|
|
33
|
-
unless
|
|
34
|
-
# In #1545 a user reported a NameError due to this constant being uninitialized
|
|
35
|
-
# I've documented my suspicion on why that happened in
|
|
36
|
-
# https://github.com/DataDog/dd-trace-rb/issues/1545#issuecomment-856049025
|
|
37
|
-
#
|
|
38
|
-
# > Thanks for the info! It seems to feed into my theory: there's two moments in the code where we check if
|
|
39
|
-
# > profiler is "supported": 1) when loading ddtrace (inside preload) and 2) when starting the profile
|
|
40
|
-
# > after Datadog.configure gets run.
|
|
41
|
-
# > The problem is that the code assumes that both checks 1) and 2) will always reach the same conclusion:
|
|
42
|
-
# > either profiler is supported, or profiler is not supported.
|
|
43
|
-
# > In the problematic case, it looks like in your case check 1 decides that profiler is not
|
|
44
|
-
# > supported => doesn't load it, and then check 2 decides that it is => assumes it is loaded and tries to
|
|
45
|
-
# > start it.
|
|
46
|
-
#
|
|
47
|
-
# I was never able to validate if this was the issue or why exactly .supported? would change its mind BUT
|
|
48
|
-
# just in case it happens again, I've left this check which avoids breaking the user's application AND
|
|
49
|
-
# would instead direct them to report it to us instead, so that we can investigate what's wrong.
|
|
50
|
-
#
|
|
51
|
-
# TODO: As of June 2021, most checks in .supported? are related to the google-protobuf gem; so it's
|
|
52
|
-
# very likely that it was the origin of the issue we saw. Thus, if, as planned we end up moving away from
|
|
53
|
-
# protobuf OR enough time has passed and no users saw the issue again, we can remove this check altogether.
|
|
54
|
-
Datadog.logger.error(
|
|
55
|
-
'Profiling was marked as supported and enabled, but setup task was not loaded properly. ' \
|
|
56
|
-
'Please report this at https://github.com/DataDog/dd-trace-rb/blob/master/CONTRIBUTING.md#found-a-bug'
|
|
57
|
-
)
|
|
58
|
-
|
|
59
|
-
return
|
|
60
|
-
end
|
|
32
|
+
return [nil, { profiling_enabled: false }] unless Profiling.supported?
|
|
61
33
|
|
|
62
|
-
#
|
|
34
|
+
# Activate forking extensions
|
|
63
35
|
Profiling::Tasks::Setup.new.run
|
|
64
36
|
|
|
65
37
|
# NOTE: Please update the Initialization section of ProfilingDevelopment.md with any changes to this method
|
|
66
38
|
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
39
|
+
no_signals_workaround_enabled = no_signals_workaround_enabled?(settings)
|
|
40
|
+
timeline_enabled = settings.profiling.advanced.timeline_enabled
|
|
41
|
+
allocation_profiling_enabled = enable_allocation_profiling?(settings)
|
|
42
|
+
heap_sample_every = get_heap_sample_every(settings)
|
|
43
|
+
heap_profiling_enabled = enable_heap_profiling?(settings, allocation_profiling_enabled, heap_sample_every)
|
|
44
|
+
heap_size_profiling_enabled = enable_heap_size_profiling?(settings, heap_profiling_enabled)
|
|
45
|
+
|
|
46
|
+
overhead_target_percentage = valid_overhead_target(settings.profiling.advanced.overhead_target_percentage)
|
|
47
|
+
upload_period_seconds = [60, settings.profiling.advanced.upload_period_seconds].max
|
|
48
|
+
|
|
49
|
+
recorder = Datadog::Profiling::StackRecorder.new(
|
|
50
|
+
cpu_time_enabled: RUBY_PLATFORM.include?('linux'), # Only supported on Linux currently
|
|
51
|
+
alloc_samples_enabled: allocation_profiling_enabled,
|
|
52
|
+
heap_samples_enabled: heap_profiling_enabled,
|
|
53
|
+
heap_size_enabled: heap_size_profiling_enabled,
|
|
54
|
+
heap_sample_every: heap_sample_every,
|
|
55
|
+
timeline_enabled: timeline_enabled,
|
|
56
|
+
)
|
|
57
|
+
thread_context_collector = build_thread_context_collector(settings, recorder, optional_tracer, timeline_enabled)
|
|
58
|
+
worker = Datadog::Profiling::Collectors::CpuAndWallTimeWorker.new(
|
|
59
|
+
gc_profiling_enabled: enable_gc_profiling?(settings),
|
|
60
|
+
no_signals_workaround_enabled: no_signals_workaround_enabled,
|
|
61
|
+
thread_context_collector: thread_context_collector,
|
|
62
|
+
dynamic_sampling_rate_overhead_target_percentage: overhead_target_percentage,
|
|
63
|
+
allocation_profiling_enabled: allocation_profiling_enabled,
|
|
64
|
+
)
|
|
83
65
|
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
66
|
+
internal_metadata = {
|
|
67
|
+
no_signals_workaround_enabled: no_signals_workaround_enabled,
|
|
68
|
+
timeline_enabled: timeline_enabled,
|
|
69
|
+
heap_sample_every: heap_sample_every,
|
|
70
|
+
}.freeze
|
|
87
71
|
|
|
88
|
-
exporter = build_profiler_exporter(settings, recorder)
|
|
72
|
+
exporter = build_profiler_exporter(settings, recorder, worker, internal_metadata: internal_metadata)
|
|
89
73
|
transport = build_profiler_transport(settings, agent_settings)
|
|
90
|
-
scheduler = Profiling::Scheduler.new(exporter: exporter, transport: transport)
|
|
74
|
+
scheduler = Profiling::Scheduler.new(exporter: exporter, transport: transport, interval: upload_period_seconds)
|
|
91
75
|
|
|
92
|
-
Profiling::Profiler.new(
|
|
76
|
+
[Profiling::Profiler.new(worker: worker, scheduler: scheduler), { profiling_enabled: true }]
|
|
93
77
|
end
|
|
94
78
|
|
|
95
|
-
private_class_method def self.
|
|
96
|
-
Profiling::
|
|
79
|
+
private_class_method def self.build_thread_context_collector(settings, recorder, optional_tracer, timeline_enabled)
|
|
80
|
+
Datadog::Profiling::Collectors::ThreadContext.new(
|
|
81
|
+
recorder: recorder,
|
|
82
|
+
max_frames: settings.profiling.advanced.max_frames,
|
|
83
|
+
tracer: optional_tracer,
|
|
84
|
+
endpoint_collection_enabled: settings.profiling.advanced.endpoint.collection.enabled,
|
|
85
|
+
timeline_enabled: timeline_enabled,
|
|
86
|
+
)
|
|
97
87
|
end
|
|
98
88
|
|
|
99
|
-
private_class_method def self.build_profiler_exporter(settings, recorder)
|
|
89
|
+
private_class_method def self.build_profiler_exporter(settings, recorder, worker, internal_metadata:)
|
|
90
|
+
info_collector = Profiling::Collectors::Info.new(settings)
|
|
100
91
|
code_provenance_collector =
|
|
101
92
|
(Profiling::Collectors::CodeProvenance.new if settings.profiling.advanced.code_provenance_enabled)
|
|
102
93
|
|
|
103
|
-
Profiling::Exporter.new(
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
endpoint_collection_enabled: settings.profiling.advanced.endpoint.collection.enabled
|
|
110
|
-
)
|
|
111
|
-
|
|
112
|
-
Profiling::Collectors::OldStack.new(
|
|
113
|
-
old_recorder,
|
|
114
|
-
trace_identifiers_helper: trace_identifiers_helper,
|
|
115
|
-
max_frames: settings.profiling.advanced.max_frames
|
|
94
|
+
Profiling::Exporter.new(
|
|
95
|
+
pprof_recorder: recorder,
|
|
96
|
+
worker: worker,
|
|
97
|
+
info_collector: info_collector,
|
|
98
|
+
code_provenance_collector: code_provenance_collector,
|
|
99
|
+
internal_metadata: internal_metadata,
|
|
116
100
|
)
|
|
117
101
|
end
|
|
118
102
|
|
|
@@ -127,29 +111,133 @@ module Datadog
|
|
|
127
111
|
end
|
|
128
112
|
|
|
129
113
|
private_class_method def self.enable_gc_profiling?(settings)
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
|
|
134
|
-
|
|
135
|
-
|
|
136
|
-
|
|
137
|
-
|
|
114
|
+
return false unless settings.profiling.advanced.gc_enabled
|
|
115
|
+
|
|
116
|
+
# SEVERE - Only with Ractors
|
|
117
|
+
# On Ruby versions 3.0 (all), 3.1.0 to 3.1.3, and 3.2.0 to 3.2.2 gc profiling can trigger a VM bug
|
|
118
|
+
# that causes a segmentation fault during garbage collection of Ractors
|
|
119
|
+
# (https://bugs.ruby-lang.org/issues/18464). We don't allow enabling gc profiling on such Rubies.
|
|
120
|
+
# This bug is fixed on Ruby versions 3.1.4, 3.2.3 and 3.3.0.
|
|
121
|
+
if RUBY_VERSION.start_with?('3.0.') ||
|
|
122
|
+
(RUBY_VERSION.start_with?('3.1.') && RUBY_VERSION < '3.1.4') ||
|
|
123
|
+
(RUBY_VERSION.start_with?('3.2.') && RUBY_VERSION < '3.2.3')
|
|
124
|
+
Datadog.logger.warn(
|
|
125
|
+
"Current Ruby version (#{RUBY_VERSION}) has a VM bug where enabling GC profiling would cause "\
|
|
126
|
+
'crashes (https://bugs.ruby-lang.org/issues/18464). GC profiling has been disabled.'
|
|
127
|
+
)
|
|
128
|
+
return false
|
|
129
|
+
elsif RUBY_VERSION.start_with?('3.')
|
|
130
|
+
Datadog.logger.debug(
|
|
131
|
+
'In all known versions of Ruby 3.x, using Ractors may result in GC profiling unexpectedly ' \
|
|
132
|
+
'stopping (https://bugs.ruby-lang.org/issues/19112). Note that this stop has no impact in your ' \
|
|
133
|
+
'application stability or performance. This does not happen if Ractors are not used.'
|
|
134
|
+
)
|
|
135
|
+
end
|
|
138
136
|
|
|
139
|
-
|
|
140
|
-
|
|
141
|
-
|
|
137
|
+
true
|
|
138
|
+
end
|
|
139
|
+
|
|
140
|
+
private_class_method def self.get_heap_sample_every(settings)
|
|
141
|
+
heap_sample_rate = settings.profiling.advanced.experimental_heap_sample_rate
|
|
142
|
+
|
|
143
|
+
raise ArgumentError, "Heap sample rate must be a positive integer. Was #{heap_sample_rate}" if heap_sample_rate <= 0
|
|
144
|
+
|
|
145
|
+
heap_sample_rate
|
|
146
|
+
end
|
|
147
|
+
|
|
148
|
+
private_class_method def self.enable_allocation_profiling?(settings)
|
|
149
|
+
return false unless settings.profiling.allocation_enabled
|
|
150
|
+
|
|
151
|
+
# Allocation sampling is safe and supported on Ruby 2.x, but has a few caveats on Ruby 3.x.
|
|
152
|
+
|
|
153
|
+
# SEVERE - All configurations
|
|
154
|
+
# Ruby 3.2.0 to 3.2.2 have a bug in the newobj tracepoint (https://bugs.ruby-lang.org/issues/19482,
|
|
155
|
+
# https://github.com/ruby/ruby/pull/7464) that makes this crash in any configuration. This bug is
|
|
156
|
+
# fixed on Ruby versions 3.2.3 and 3.3.0.
|
|
157
|
+
if RUBY_VERSION.start_with?('3.2.') && RUBY_VERSION < '3.2.3'
|
|
158
|
+
Datadog.logger.warn(
|
|
159
|
+
'Allocation profiling is not supported in Ruby versions 3.2.0, 3.2.1 and 3.2.2 and will be forcibly '\
|
|
160
|
+
'disabled. This is due to a VM bug that can lead to crashes (https://bugs.ruby-lang.org/issues/19482). '\
|
|
161
|
+
'Other Ruby versions do not suffer from this issue.'
|
|
162
|
+
)
|
|
163
|
+
return false
|
|
164
|
+
end
|
|
165
|
+
|
|
166
|
+
# SEVERE - Only with Ractors
|
|
167
|
+
# On Ruby versions 3.0 (all), 3.1.0 to 3.1.3, and 3.2.0 to 3.2.2 allocation profiling can trigger a VM bug
|
|
168
|
+
# that causes a segmentation fault during garbage collection of Ractors
|
|
169
|
+
# (https://bugs.ruby-lang.org/issues/18464). We don't recommend using this feature on such Rubies.
|
|
170
|
+
# This bug is fixed on Ruby versions 3.1.4, 3.2.3 and 3.3.0.
|
|
171
|
+
if RUBY_VERSION.start_with?('3.0.') ||
|
|
172
|
+
(RUBY_VERSION.start_with?('3.1.') && RUBY_VERSION < '3.1.4') ||
|
|
173
|
+
(RUBY_VERSION.start_with?('3.2.') && RUBY_VERSION < '3.2.3')
|
|
174
|
+
Datadog.logger.warn(
|
|
175
|
+
"Current Ruby version (#{RUBY_VERSION}) has a VM bug where enabling allocation profiling while using "\
|
|
176
|
+
'Ractors may cause unexpected issues, including crashes (https://bugs.ruby-lang.org/issues/18464). '\
|
|
177
|
+
'This does not happen if Ractors are not used.'
|
|
178
|
+
)
|
|
179
|
+
# ANNOYANCE - Only with Ractors
|
|
180
|
+
# On all known versions of Ruby 3.x, due to https://bugs.ruby-lang.org/issues/19112, when a ractor gets
|
|
181
|
+
# garbage collected, Ruby will disable all active tracepoints, which this feature internally relies on.
|
|
182
|
+
elsif RUBY_VERSION.start_with?('3.')
|
|
183
|
+
Datadog.logger.warn(
|
|
184
|
+
'In all known versions of Ruby 3.x, using Ractors may result in allocation profiling unexpectedly ' \
|
|
185
|
+
'stopping (https://bugs.ruby-lang.org/issues/19112). Note that this stop has no impact in your ' \
|
|
186
|
+
'application stability or performance. This does not happen if Ractors are not used.'
|
|
187
|
+
)
|
|
142
188
|
end
|
|
189
|
+
|
|
190
|
+
Datadog.logger.debug('Enabled allocation profiling')
|
|
191
|
+
|
|
192
|
+
true
|
|
143
193
|
end
|
|
144
194
|
|
|
145
|
-
private_class_method def self.
|
|
146
|
-
|
|
195
|
+
private_class_method def self.enable_heap_profiling?(settings, allocation_profiling_enabled, heap_sample_rate)
|
|
196
|
+
heap_profiling_enabled = settings.profiling.advanced.experimental_heap_enabled
|
|
197
|
+
|
|
198
|
+
return false unless heap_profiling_enabled
|
|
199
|
+
|
|
200
|
+
if RUBY_VERSION.start_with?('2.') && RUBY_VERSION < '2.7'
|
|
147
201
|
Datadog.logger.warn(
|
|
148
|
-
'
|
|
202
|
+
'Heap profiling currently relies on features introduced in Ruby 2.7 and will be forcibly disabled. '\
|
|
203
|
+
'Please upgrade to Ruby >= 2.7 in order to use this feature.'
|
|
149
204
|
)
|
|
150
205
|
return false
|
|
151
206
|
end
|
|
152
207
|
|
|
208
|
+
if RUBY_VERSION < '3.1'
|
|
209
|
+
Datadog.logger.debug(
|
|
210
|
+
"Current Ruby version (#{RUBY_VERSION}) supports forced object recycling which has a bug that the " \
|
|
211
|
+
'heap profiler is forced to work around to remain accurate. This workaround requires force-setting '\
|
|
212
|
+
"the SEEN_OBJ_ID flag on objects that should have it but don't. Full details can be found in " \
|
|
213
|
+
'https://github.com/DataDog/dd-trace-rb/pull/3360. This workaround should be safe but can be ' \
|
|
214
|
+
'bypassed by disabling the heap profiler or upgrading to Ruby >= 3.1 where forced object recycling ' \
|
|
215
|
+
'was completely removed (https://bugs.ruby-lang.org/issues/18290).'
|
|
216
|
+
)
|
|
217
|
+
end
|
|
218
|
+
|
|
219
|
+
unless allocation_profiling_enabled
|
|
220
|
+
raise ArgumentError,
|
|
221
|
+
'Heap profiling requires allocation profiling to be enabled'
|
|
222
|
+
end
|
|
223
|
+
|
|
224
|
+
Datadog.logger.warn(
|
|
225
|
+
"Enabled experimental heap profiling: heap_sample_rate=#{heap_sample_rate}. This is experimental, not " \
|
|
226
|
+
'recommended, and will increase overhead!'
|
|
227
|
+
)
|
|
228
|
+
|
|
229
|
+
true
|
|
230
|
+
end
|
|
231
|
+
|
|
232
|
+
private_class_method def self.enable_heap_size_profiling?(settings, heap_profiling_enabled)
|
|
233
|
+
heap_size_profiling_enabled = settings.profiling.advanced.experimental_heap_size_enabled
|
|
234
|
+
|
|
235
|
+
return false unless heap_profiling_enabled && heap_size_profiling_enabled
|
|
236
|
+
|
|
237
|
+
Datadog.logger.warn(
|
|
238
|
+
'Enabled experimental heap size profiling. This is experimental, not recommended, and will increase overhead!'
|
|
239
|
+
)
|
|
240
|
+
|
|
153
241
|
true
|
|
154
242
|
end
|
|
155
243
|
|
|
@@ -198,7 +286,7 @@ module Datadog
|
|
|
198
286
|
if Gem.loaded_specs['mysql2'] && incompatible_libmysqlclient_version?(settings)
|
|
199
287
|
Datadog.logger.warn(
|
|
200
288
|
'Enabling the profiling "no signals" workaround because an incompatible version of the mysql2 gem is ' \
|
|
201
|
-
'installed. Profiling data will have lower quality.' \
|
|
289
|
+
'installed. Profiling data will have lower quality. ' \
|
|
202
290
|
'To fix this, upgrade the libmysqlclient in your OS image to version 8.0.0 or above.'
|
|
203
291
|
)
|
|
204
292
|
return true
|
|
@@ -214,6 +302,15 @@ module Datadog
|
|
|
214
302
|
return true
|
|
215
303
|
end
|
|
216
304
|
|
|
305
|
+
if (defined?(::PhusionPassenger) || Gem.loaded_specs['passenger']) && incompatible_passenger_version?
|
|
306
|
+
Datadog.logger.warn(
|
|
307
|
+
'Enabling the profiling "no signals" workaround because an incompatible version of the passenger gem is ' \
|
|
308
|
+
'installed. Profiling data will have lower quality.' \
|
|
309
|
+
'To fix this, upgrade the passenger gem to version 6.0.19 or above.'
|
|
310
|
+
)
|
|
311
|
+
return true
|
|
312
|
+
end
|
|
313
|
+
|
|
217
314
|
false
|
|
218
315
|
end
|
|
219
316
|
|
|
@@ -236,11 +333,27 @@ module Datadog
|
|
|
236
333
|
begin
|
|
237
334
|
require 'mysql2'
|
|
238
335
|
|
|
239
|
-
|
|
336
|
+
# The mysql2-aurora gem likes to monkey patch itself in replacement of Mysql2::Client, and uses
|
|
337
|
+
# `method_missing` to delegate to the original BUT unfortunately does not implement `respond_to_missing?` and
|
|
338
|
+
# thus our `respond_to?(:info)` below was failing.
|
|
339
|
+
#
|
|
340
|
+
# But on the bright side, the gem does stash a reference to the original Mysql2::Client class in a constant,
|
|
341
|
+
# so if that constant exists, we use that for our probing.
|
|
342
|
+
mysql2_client_class =
|
|
343
|
+
if defined?(Mysql2::Aurora::ORIGINAL_CLIENT_CLASS)
|
|
344
|
+
Mysql2::Aurora::ORIGINAL_CLIENT_CLASS
|
|
345
|
+
elsif defined?(Mysql2::Client)
|
|
346
|
+
Mysql2::Client
|
|
347
|
+
end
|
|
240
348
|
|
|
241
|
-
|
|
349
|
+
return true unless mysql2_client_class && mysql2_client_class.respond_to?(:info)
|
|
242
350
|
|
|
243
|
-
|
|
351
|
+
info = mysql2_client_class.info
|
|
352
|
+
libmysqlclient_version = Gem::Version.new(info[:version])
|
|
353
|
+
|
|
354
|
+
compatible =
|
|
355
|
+
libmysqlclient_version >= Gem::Version.new('8.0.0') ||
|
|
356
|
+
looks_like_mariadb?(info, libmysqlclient_version)
|
|
244
357
|
|
|
245
358
|
Datadog.logger.debug(
|
|
246
359
|
"The `mysql2` gem is using #{compatible ? 'a compatible' : 'an incompatible'} version of " \
|
|
@@ -258,17 +371,55 @@ module Datadog
|
|
|
258
371
|
end
|
|
259
372
|
end
|
|
260
373
|
|
|
261
|
-
#
|
|
374
|
+
# See https://github.com/datadog/dd-trace-rb/issues/2976 for details.
|
|
375
|
+
private_class_method def self.incompatible_passenger_version?
|
|
376
|
+
if Gem.loaded_specs['passenger']
|
|
377
|
+
Gem.loaded_specs['passenger'].version < Gem::Version.new('6.0.19')
|
|
378
|
+
else
|
|
379
|
+
true
|
|
380
|
+
end
|
|
381
|
+
end
|
|
382
|
+
|
|
383
|
+
private_class_method def self.valid_overhead_target(overhead_target_percentage)
|
|
384
|
+
if overhead_target_percentage > 0 && overhead_target_percentage <= 20
|
|
385
|
+
overhead_target_percentage
|
|
386
|
+
else
|
|
387
|
+
Datadog.logger.error(
|
|
388
|
+
'Ignoring invalid value for profiling overhead_target_percentage setting: ' \
|
|
389
|
+
"#{overhead_target_percentage.inspect}. Falling back to default value."
|
|
390
|
+
)
|
|
391
|
+
|
|
392
|
+
2.0
|
|
393
|
+
end
|
|
394
|
+
end
|
|
395
|
+
|
|
396
|
+
# To add just a bit more complexity to our detection code, in https://github.com/DataDog/dd-trace-rb/issues/3334
|
|
397
|
+
# a user reported that our code was incorrectly flagging the mariadb variant of libmysqlclient as being
|
|
398
|
+
# incompatible. In fact we have no reports of the mariadb variant needing the "no signals" workaround,
|
|
399
|
+
# so we flag it as compatible when it's in use.
|
|
400
|
+
#
|
|
401
|
+
# A problem is that there doesn't seem to be an obvious way to query the mysql2 gem on which kind of
|
|
402
|
+
# libmysqlclient it's using, so we detect it by looking at the version.
|
|
403
|
+
#
|
|
404
|
+
# The info method for mysql2 with mariadb looks something like this:
|
|
405
|
+
# `{:id=>30308, :version=>"3.3.8", :header_version=>"11.2.2"}`
|
|
406
|
+
#
|
|
407
|
+
# * The version seems to come from https://github.com/mariadb-corporation/mariadb-connector-c and the latest
|
|
408
|
+
# one is 3.x.
|
|
409
|
+
# * The header_version is what people usually see as the "mariadb version"
|
|
262
410
|
#
|
|
263
|
-
#
|
|
264
|
-
#
|
|
265
|
-
# code paths.
|
|
411
|
+
# As a comparison, for libmysql the info looks like:
|
|
412
|
+
# * `{:id=>80035, :version=>"8.0.35", :header_version=>"8.0.35"}`
|
|
266
413
|
#
|
|
267
|
-
#
|
|
268
|
-
#
|
|
269
|
-
#
|
|
270
|
-
private_class_method def self.
|
|
271
|
-
|
|
414
|
+
# Thus our detection is version 4 or older, because libmysqlclient 4 is almost 20 years old so it's most probably
|
|
415
|
+
# not that one + header_version being 10 or newer, since according to https://endoflife.date/mariadb that's a
|
|
416
|
+
# sane range for modern mariadb releases.
|
|
417
|
+
private_class_method def self.looks_like_mariadb?(info, libmysqlclient_version)
|
|
418
|
+
header_version = Gem::Version.new(info[:header_version]) if info[:header_version]
|
|
419
|
+
|
|
420
|
+
!!(header_version &&
|
|
421
|
+
libmysqlclient_version < Gem::Version.new('5.0.0') &&
|
|
422
|
+
header_version >= Gem::Version.new('10.0.0'))
|
|
272
423
|
end
|
|
273
424
|
end
|
|
274
425
|
end
|
|
@@ -22,29 +22,41 @@ module Datadog
|
|
|
22
22
|
:minimum_duration_seconds,
|
|
23
23
|
:time_provider,
|
|
24
24
|
:last_flush_finish_at,
|
|
25
|
-
:created_at
|
|
25
|
+
:created_at,
|
|
26
|
+
:internal_metadata,
|
|
27
|
+
:info_json
|
|
26
28
|
|
|
27
29
|
public
|
|
28
30
|
|
|
29
31
|
def initialize(
|
|
30
32
|
pprof_recorder:,
|
|
33
|
+
worker:,
|
|
34
|
+
info_collector:,
|
|
31
35
|
code_provenance_collector:,
|
|
36
|
+
internal_metadata:,
|
|
32
37
|
minimum_duration_seconds: PROFILE_DURATION_THRESHOLD_SECONDS,
|
|
33
38
|
time_provider: Time
|
|
34
39
|
)
|
|
35
40
|
@pprof_recorder = pprof_recorder
|
|
41
|
+
@worker = worker
|
|
36
42
|
@code_provenance_collector = code_provenance_collector
|
|
37
43
|
@minimum_duration_seconds = minimum_duration_seconds
|
|
38
44
|
@time_provider = time_provider
|
|
39
45
|
@last_flush_finish_at = nil
|
|
40
46
|
@created_at = time_provider.now.utc
|
|
47
|
+
@internal_metadata = internal_metadata
|
|
48
|
+
# NOTE: At the time of this comment collected info does not change over time so we'll hardcode
|
|
49
|
+
# it on startup to prevent serializing the same info on every flush.
|
|
50
|
+
@info_json = JSON.fast_generate(info_collector.info).freeze
|
|
41
51
|
end
|
|
42
52
|
|
|
43
53
|
def flush
|
|
44
|
-
|
|
45
|
-
|
|
54
|
+
worker_stats = @worker.stats_and_reset_not_thread_safe
|
|
55
|
+
serialization_result = pprof_recorder.serialize
|
|
56
|
+
return if serialization_result.nil?
|
|
46
57
|
|
|
47
|
-
|
|
58
|
+
start, finish, compressed_pprof, profile_stats = serialization_result
|
|
59
|
+
@last_flush_finish_at = finish
|
|
48
60
|
|
|
49
61
|
if duration_below_threshold?(start, finish)
|
|
50
62
|
Datadog.logger.debug('Skipped exporting profiling events as profile duration is below minimum')
|
|
@@ -57,10 +69,19 @@ module Datadog
|
|
|
57
69
|
start: start,
|
|
58
70
|
finish: finish,
|
|
59
71
|
pprof_file_name: Datadog::Profiling::Ext::Transport::HTTP::PPROF_DEFAULT_FILENAME,
|
|
60
|
-
pprof_data:
|
|
72
|
+
pprof_data: compressed_pprof.to_s,
|
|
61
73
|
code_provenance_file_name: Datadog::Profiling::Ext::Transport::HTTP::CODE_PROVENANCE_FILENAME,
|
|
62
74
|
code_provenance_data: uncompressed_code_provenance,
|
|
63
75
|
tags_as_array: Datadog::Profiling::TagBuilder.call(settings: Datadog.configuration).to_a,
|
|
76
|
+
internal_metadata: internal_metadata.merge(
|
|
77
|
+
{
|
|
78
|
+
worker_stats: worker_stats,
|
|
79
|
+
profile_stats: profile_stats,
|
|
80
|
+
recorder_stats: pprof_recorder.stats,
|
|
81
|
+
gc: GC.stat,
|
|
82
|
+
}
|
|
83
|
+
),
|
|
84
|
+
info_json: info_json,
|
|
64
85
|
)
|
|
65
86
|
end
|
|
66
87
|
|
|
@@ -9,18 +9,6 @@ module Datadog
|
|
|
9
9
|
ENV_AGENTLESS = 'DD_PROFILING_AGENTLESS'
|
|
10
10
|
ENV_ENDPOINT_COLLECTION_ENABLED = 'DD_PROFILING_ENDPOINT_COLLECTION_ENABLED'
|
|
11
11
|
|
|
12
|
-
# TODO: Consider removing this once the Ruby-based pprof encoding is removed and replaced by libdatadog
|
|
13
|
-
module Pprof
|
|
14
|
-
LABEL_KEY_LOCAL_ROOT_SPAN_ID = 'local root span id'
|
|
15
|
-
LABEL_KEY_SPAN_ID = 'span id'
|
|
16
|
-
LABEL_KEY_THREAD_ID = 'thread id'
|
|
17
|
-
LABEL_KEY_TRACE_ENDPOINT = 'trace endpoint'
|
|
18
|
-
SAMPLE_VALUE_NO_VALUE = 0
|
|
19
|
-
VALUE_TYPE_CPU = 'cpu-time'
|
|
20
|
-
VALUE_TYPE_WALL = 'wall-time'
|
|
21
|
-
VALUE_UNIT_NANOSECONDS = 'nanoseconds'
|
|
22
|
-
end
|
|
23
|
-
|
|
24
12
|
module Transport
|
|
25
13
|
module HTTP
|
|
26
14
|
FORM_FIELD_TAG_ENV = 'env'
|
|
@@ -35,6 +23,8 @@ module Datadog
|
|
|
35
23
|
FORM_FIELD_TAG_RUNTIME_VERSION = 'runtime_version'
|
|
36
24
|
FORM_FIELD_TAG_SERVICE = 'service'
|
|
37
25
|
FORM_FIELD_TAG_VERSION = 'version'
|
|
26
|
+
TAG_GIT_REPOSITORY_URL = 'git.repository_url'
|
|
27
|
+
TAG_GIT_COMMIT_SHA = 'git.commit.sha'
|
|
38
28
|
|
|
39
29
|
PPROF_DEFAULT_FILENAME = 'rubyprofile.pprof'
|
|
40
30
|
CODE_PROVENANCE_FILENAME = 'code-provenance.json'
|
|
@@ -1,10 +1,9 @@
|
|
|
1
1
|
# frozen_string_literal: true
|
|
2
2
|
|
|
3
|
+
require 'json'
|
|
4
|
+
|
|
3
5
|
module Datadog
|
|
4
6
|
module Profiling
|
|
5
|
-
# Represents a collection of events of a specific type being flushed.
|
|
6
|
-
EventGroup = Struct.new(:event_class, :events)
|
|
7
|
-
|
|
8
7
|
# Entity class used to represent metadata for a given profile
|
|
9
8
|
class Flush
|
|
10
9
|
attr_reader \
|
|
@@ -14,7 +13,9 @@ module Datadog
|
|
|
14
13
|
:pprof_data, # gzipped pprof bytes
|
|
15
14
|
:code_provenance_file_name,
|
|
16
15
|
:code_provenance_data, # gzipped json bytes
|
|
17
|
-
:tags_as_array
|
|
16
|
+
:tags_as_array,
|
|
17
|
+
:internal_metadata_json,
|
|
18
|
+
:info_json
|
|
18
19
|
|
|
19
20
|
def initialize(
|
|
20
21
|
start:,
|
|
@@ -23,7 +24,9 @@ module Datadog
|
|
|
23
24
|
pprof_data:,
|
|
24
25
|
code_provenance_file_name:,
|
|
25
26
|
code_provenance_data:,
|
|
26
|
-
tags_as_array
|
|
27
|
+
tags_as_array:,
|
|
28
|
+
internal_metadata:,
|
|
29
|
+
info_json:
|
|
27
30
|
)
|
|
28
31
|
@start = start
|
|
29
32
|
@finish = finish
|
|
@@ -32,6 +35,8 @@ module Datadog
|
|
|
32
35
|
@code_provenance_file_name = code_provenance_file_name
|
|
33
36
|
@code_provenance_data = code_provenance_data
|
|
34
37
|
@tags_as_array = tags_as_array
|
|
38
|
+
@internal_metadata_json = JSON.fast_generate(internal_metadata)
|
|
39
|
+
@info_json = info_json
|
|
35
40
|
end
|
|
36
41
|
end
|
|
37
42
|
end
|
|
@@ -1,3 +1,5 @@
|
|
|
1
|
+
require_relative '../core/transport/ext'
|
|
2
|
+
|
|
1
3
|
module Datadog
|
|
2
4
|
module Profiling
|
|
3
5
|
# Used to report profiling data to Datadog.
|
|
@@ -40,6 +42,9 @@ module Datadog
|
|
|
40
42
|
code_provenance_data: flush.code_provenance_data,
|
|
41
43
|
|
|
42
44
|
tags_as_array: flush.tags_as_array,
|
|
45
|
+
internal_metadata_json: flush.internal_metadata_json,
|
|
46
|
+
|
|
47
|
+
info_json: flush.info_json
|
|
43
48
|
)
|
|
44
49
|
|
|
45
50
|
if status == :ok
|
|
@@ -47,11 +52,14 @@ module Datadog
|
|
|
47
52
|
Datadog.logger.debug('Successfully reported profiling data')
|
|
48
53
|
true
|
|
49
54
|
else
|
|
50
|
-
Datadog.logger.error(
|
|
55
|
+
Datadog.logger.error(
|
|
56
|
+
"Failed to report profiling data (#{config_without_api_key}): " \
|
|
57
|
+
"server returned unexpected HTTP #{result} status code"
|
|
58
|
+
)
|
|
51
59
|
false
|
|
52
60
|
end
|
|
53
61
|
else
|
|
54
|
-
Datadog.logger.error("Failed to report profiling data: #{result}")
|
|
62
|
+
Datadog.logger.error("Failed to report profiling data (#{config_without_api_key}): #{result}")
|
|
55
63
|
false
|
|
56
64
|
end
|
|
57
65
|
end
|
|
@@ -66,9 +74,9 @@ module Datadog
|
|
|
66
74
|
|
|
67
75
|
def base_url_from(agent_settings)
|
|
68
76
|
case agent_settings.adapter
|
|
69
|
-
when Datadog::Transport::Ext::HTTP::ADAPTER
|
|
77
|
+
when Datadog::Core::Transport::Ext::HTTP::ADAPTER
|
|
70
78
|
"#{agent_settings.ssl ? 'https' : 'http'}://#{agent_settings.hostname}:#{agent_settings.port}/"
|
|
71
|
-
when Datadog::Transport::Ext::UnixSocket::ADAPTER
|
|
79
|
+
when Datadog::Core::Transport::Ext::UnixSocket::ADAPTER
|
|
72
80
|
"unix://#{agent_settings.uds_path}"
|
|
73
81
|
else
|
|
74
82
|
raise ArgumentError, "Unexpected adapter: #{agent_settings.adapter}"
|
|
@@ -76,7 +84,8 @@ module Datadog
|
|
|
76
84
|
end
|
|
77
85
|
|
|
78
86
|
def validate_agent_settings(agent_settings)
|
|
79
|
-
supported_adapters = [Datadog::Transport::Ext::HTTP::ADAPTER,
|
|
87
|
+
supported_adapters = [Datadog::Core::Transport::Ext::HTTP::ADAPTER,
|
|
88
|
+
Datadog::Core::Transport::Ext::UnixSocket::ADAPTER]
|
|
80
89
|
unless supported_adapters.include?(agent_settings.adapter)
|
|
81
90
|
raise ArgumentError,
|
|
82
91
|
"Unsupported transport configuration for profiling: Adapter #{agent_settings.adapter} " \
|
|
@@ -109,7 +118,9 @@ module Datadog
|
|
|
109
118
|
pprof_data:,
|
|
110
119
|
code_provenance_file_name:,
|
|
111
120
|
code_provenance_data:,
|
|
112
|
-
tags_as_array
|
|
121
|
+
tags_as_array:,
|
|
122
|
+
internal_metadata_json:,
|
|
123
|
+
info_json:
|
|
113
124
|
)
|
|
114
125
|
self.class._native_do_export(
|
|
115
126
|
exporter_configuration,
|
|
@@ -123,8 +134,14 @@ module Datadog
|
|
|
123
134
|
code_provenance_file_name,
|
|
124
135
|
code_provenance_data,
|
|
125
136
|
tags_as_array,
|
|
137
|
+
internal_metadata_json,
|
|
138
|
+
info_json,
|
|
126
139
|
)
|
|
127
140
|
end
|
|
141
|
+
|
|
142
|
+
def config_without_api_key
|
|
143
|
+
[@exporter_configuration[0..1]].to_h
|
|
144
|
+
end
|
|
128
145
|
end
|
|
129
146
|
end
|
|
130
147
|
end
|