datadog 2.36.0 → 2.40.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 +119 -1
- data/bin/ddprofrb +4 -4
- data/ext/datadog_profiling_native_extension/clock_id_from_mach.c +5 -12
- data/ext/datadog_profiling_native_extension/collectors_cpu_and_wall_time_worker.c +105 -18
- data/ext/datadog_profiling_native_extension/collectors_idle_sampling_helper.c +17 -3
- data/ext/datadog_profiling_native_extension/collectors_stack.c +228 -162
- data/ext/datadog_profiling_native_extension/collectors_stack.h +16 -3
- data/ext/datadog_profiling_native_extension/collectors_thread_context.c +357 -217
- data/ext/datadog_profiling_native_extension/collectors_thread_context.h +3 -0
- data/ext/datadog_profiling_native_extension/crashtracking_runtime_stacks.c +5 -4
- data/ext/datadog_profiling_native_extension/datadog_ruby_common.c +19 -11
- data/ext/datadog_profiling_native_extension/datadog_ruby_common.h +7 -0
- data/ext/datadog_profiling_native_extension/extconf.rb +24 -11
- data/ext/datadog_profiling_native_extension/private_vm_api_access.c +261 -62
- data/ext/datadog_profiling_native_extension/private_vm_api_access.h +17 -9
- data/ext/datadog_profiling_native_extension/ruby_helpers.c +7 -0
- data/ext/datadog_profiling_native_extension/setup_signal_handler.c +2 -0
- data/ext/datadog_profiling_native_extension/time_helpers.h +12 -7
- data/ext/libdatadog_api/datadog_ruby_common.c +19 -11
- data/ext/libdatadog_api/datadog_ruby_common.h +7 -0
- data/ext/libdatadog_api/di.c +76 -0
- data/ext/libdatadog_api/extconf.rb +29 -23
- data/ext/libdatadog_api/feature_flags.c +26 -0
- data/ext/libdatadog_api/init.c +4 -0
- data/ext/libdatadog_api/trace_exporter.c +974 -0
- data/ext/libdatadog_api/trace_exporter.h +5 -0
- data/ext/libdatadog_extconf_helpers.rb +9 -9
- data/lib/datadog/ai_guard/api_client.rb +8 -6
- data/lib/datadog/ai_guard/component.rb +10 -10
- data/lib/datadog/ai_guard/evaluation.rb +1 -0
- data/lib/datadog/ai_guard/ext.rb +2 -0
- data/lib/datadog/appsec/actions_handler/serializable_backtrace.rb +16 -16
- data/lib/datadog/appsec/actions_handler.rb +6 -6
- data/lib/datadog/appsec/anonymizer.rb +1 -1
- data/lib/datadog/appsec/api_security/endpoint_collection/grape_route_serializer.rb +1 -1
- data/lib/datadog/appsec/api_security/endpoint_collection/rails_collector.rb +6 -6
- data/lib/datadog/appsec/api_security/endpoint_collection/sinatra_route_serializer.rb +1 -1
- data/lib/datadog/appsec/api_security/route_extractor.rb +18 -15
- data/lib/datadog/appsec/api_security/sampler.rb +5 -5
- data/lib/datadog/appsec/api_security.rb +1 -1
- data/lib/datadog/appsec/assets.rb +7 -7
- data/lib/datadog/appsec/autoload.rb +3 -3
- data/lib/datadog/appsec/component.rb +15 -15
- data/lib/datadog/appsec/compressed_json.rb +6 -6
- data/lib/datadog/appsec/configuration.rb +73 -58
- data/lib/datadog/appsec/context.rb +9 -7
- data/lib/datadog/appsec/contrib/active_record/instrumentation.rb +6 -6
- data/lib/datadog/appsec/contrib/active_record/integration.rb +4 -4
- data/lib/datadog/appsec/contrib/active_record/patcher.rb +4 -4
- data/lib/datadog/appsec/contrib/aws_lambda/gateway/watcher.rb +7 -7
- data/lib/datadog/appsec/contrib/aws_lambda/integration.rb +2 -2
- data/lib/datadog/appsec/contrib/aws_lambda/patcher.rb +2 -2
- data/lib/datadog/appsec/contrib/aws_lambda/waf_addresses.rb +36 -34
- data/lib/datadog/appsec/contrib/devise/data_extractor.rb +3 -3
- data/lib/datadog/appsec/contrib/devise/ext.rb +20 -20
- data/lib/datadog/appsec/contrib/devise/integration.rb +4 -4
- data/lib/datadog/appsec/contrib/devise/patcher.rb +8 -8
- data/lib/datadog/appsec/contrib/devise/patches/signin_tracking_patch.rb +12 -12
- data/lib/datadog/appsec/contrib/devise/patches/signup_tracking_patch.rb +8 -8
- data/lib/datadog/appsec/contrib/devise/tracking_middleware.rb +24 -9
- data/lib/datadog/appsec/contrib/excon/integration.rb +4 -4
- data/lib/datadog/appsec/contrib/excon/patcher.rb +1 -1
- data/lib/datadog/appsec/contrib/excon/ssrf_detection_middleware.rb +76 -21
- data/lib/datadog/appsec/contrib/faraday/integration.rb +4 -4
- data/lib/datadog/appsec/contrib/faraday/patcher.rb +4 -4
- data/lib/datadog/appsec/contrib/faraday/ssrf_detection_middleware.rb +72 -18
- data/lib/datadog/appsec/contrib/graphql/appsec_trace.rb +4 -4
- data/lib/datadog/appsec/contrib/graphql/gateway/multiplex.rb +3 -3
- data/lib/datadog/appsec/contrib/graphql/gateway/watcher.rb +7 -7
- data/lib/datadog/appsec/contrib/graphql/integration.rb +9 -9
- data/lib/datadog/appsec/contrib/graphql/patcher.rb +3 -3
- data/lib/datadog/appsec/contrib/rack/buffered_input.rb +1 -1
- data/lib/datadog/appsec/contrib/rack/ext.rb +29 -29
- data/lib/datadog/appsec/contrib/rack/gateway/request.rb +18 -17
- data/lib/datadog/appsec/contrib/rack/gateway/response.rb +1 -1
- data/lib/datadog/appsec/contrib/rack/gateway/watcher.rb +25 -21
- data/lib/datadog/appsec/contrib/rack/input_peeker.rb +9 -22
- data/lib/datadog/appsec/contrib/rack/integration.rb +6 -6
- data/lib/datadog/appsec/contrib/rack/patcher.rb +3 -3
- data/lib/datadog/appsec/contrib/rack/request_body_middleware.rb +11 -8
- data/lib/datadog/appsec/contrib/rack/request_middleware.rb +45 -24
- data/lib/datadog/appsec/contrib/rack/response_body.rb +1 -1
- data/lib/datadog/appsec/contrib/rails/gateway/request.rb +14 -8
- data/lib/datadog/appsec/contrib/rails/gateway/watcher.rb +10 -10
- data/lib/datadog/appsec/contrib/rails/integration.rb +5 -5
- data/lib/datadog/appsec/contrib/rails/patcher.rb +17 -17
- data/lib/datadog/appsec/contrib/rails/patches/process_action_patch.rb +2 -2
- data/lib/datadog/appsec/contrib/rails/patches/render_to_body_patch.rb +3 -3
- data/lib/datadog/appsec/contrib/rails/request.rb +3 -3
- data/lib/datadog/appsec/contrib/rails/request_middleware.rb +2 -1
- data/lib/datadog/appsec/contrib/rest_client/integration.rb +5 -5
- data/lib/datadog/appsec/contrib/rest_client/patcher.rb +1 -1
- data/lib/datadog/appsec/contrib/rest_client/request_ssrf_detection_patch.rb +74 -21
- data/lib/datadog/appsec/contrib/sinatra/gateway/request.rb +1 -1
- data/lib/datadog/appsec/contrib/sinatra/gateway/route_params.rb +1 -1
- data/lib/datadog/appsec/contrib/sinatra/gateway/watcher.rb +16 -12
- data/lib/datadog/appsec/contrib/sinatra/integration.rb +5 -5
- data/lib/datadog/appsec/contrib/sinatra/patcher.rb +11 -11
- data/lib/datadog/appsec/contrib/sinatra/patches/json_patch.rb +3 -3
- data/lib/datadog/appsec/contrib/sinatra/request_middleware.rb +2 -1
- data/lib/datadog/appsec/counter_sampler.rb +1 -1
- data/lib/datadog/appsec/event.rb +14 -14
- data/lib/datadog/appsec/ext.rb +11 -10
- data/lib/datadog/appsec/extensions.rb +2 -2
- data/lib/datadog/appsec/instrumentation/gateway.rb +1 -1
- data/lib/datadog/appsec/metrics/collector.rb +18 -1
- data/lib/datadog/appsec/metrics/exporter.rb +17 -11
- data/lib/datadog/appsec/metrics/telemetry.rb +7 -7
- data/lib/datadog/appsec/metrics/telemetry_exporter.rb +4 -4
- data/lib/datadog/appsec/metrics.rb +4 -4
- data/lib/datadog/appsec/monitor/gateway/watcher.rb +16 -12
- data/lib/datadog/appsec/monitor.rb +1 -1
- data/lib/datadog/appsec/processor/rule_loader.rb +26 -26
- data/lib/datadog/appsec/rate_limiter.rb +1 -1
- data/lib/datadog/appsec/remote.rb +15 -9
- data/lib/datadog/appsec/response.rb +21 -21
- data/lib/datadog/appsec/route_normalizer/rails_route_pattern.rb +176 -0
- data/lib/datadog/appsec/route_normalizer/route_pattern.rb +378 -0
- data/lib/datadog/appsec/route_normalizer/route_text.rb +57 -0
- data/lib/datadog/appsec/route_normalizer.rb +80 -0
- data/lib/datadog/appsec/security_engine/engine.rb +37 -37
- data/lib/datadog/appsec/security_engine/runner.rb +2 -2
- data/lib/datadog/appsec/security_event.rb +2 -2
- data/lib/datadog/appsec/utils/http/body.rb +11 -8
- data/lib/datadog/appsec/utils/http/body_reader.rb +61 -0
- data/lib/datadog/appsec/utils/http/media_range.rb +15 -15
- data/lib/datadog/appsec/utils/http/media_type.rb +4 -4
- data/lib/datadog/appsec/utils/http/url_encoded.rb +80 -25
- data/lib/datadog/appsec.rb +16 -16
- data/lib/datadog/auto_instrument.rb +2 -2
- data/lib/datadog/core/buffer/cruby.rb +1 -1
- data/lib/datadog/core/buffer/thread_safe.rb +1 -1
- data/lib/datadog/core/configuration/agent_settings.rb +1 -1
- data/lib/datadog/core/configuration/agent_settings_resolver.rb +15 -15
- data/lib/datadog/core/configuration/agentless_settings_resolver.rb +2 -2
- data/lib/datadog/core/configuration/base.rb +2 -2
- data/lib/datadog/core/configuration/components.rb +115 -31
- data/lib/datadog/core/configuration/components_state.rb +6 -1
- data/lib/datadog/core/configuration/config_helper.rb +3 -3
- data/lib/datadog/core/configuration/deprecations.rb +6 -6
- data/lib/datadog/core/configuration/ext.rb +11 -11
- data/lib/datadog/core/configuration/option.rb +16 -16
- data/lib/datadog/core/configuration/option_definition.rb +4 -4
- data/lib/datadog/core/configuration/options.rb +1 -1
- data/lib/datadog/core/configuration/settings.rb +93 -104
- data/lib/datadog/core/configuration/stable_config.rb +1 -1
- data/lib/datadog/core/configuration/supported_configurations.rb +8 -1
- data/lib/datadog/core/configuration.rb +8 -8
- data/lib/datadog/core/contrib/rails/railtie.rb +3 -3
- data/lib/datadog/core/crashtracking/component.rb +9 -9
- data/lib/datadog/core/crashtracking/tag_builder.rb +5 -5
- data/lib/datadog/core/deprecations.rb +1 -1
- data/lib/datadog/core/diagnostics/environment_logger.rb +6 -6
- data/lib/datadog/core/diagnostics/health.rb +2 -2
- data/lib/datadog/core/encoding.rb +4 -4
- data/lib/datadog/core/environment/agent_info.rb +2 -2
- data/lib/datadog/core/environment/cgroup.rb +4 -4
- data/lib/datadog/core/environment/container.rb +9 -9
- data/lib/datadog/core/environment/execution.rb +3 -3
- data/lib/datadog/core/environment/ext.rb +18 -18
- data/lib/datadog/core/environment/gc.rb +1 -1
- data/lib/datadog/core/environment/git.rb +2 -2
- data/lib/datadog/core/environment/identity.rb +10 -10
- data/lib/datadog/core/environment/platform.rb +8 -8
- data/lib/datadog/core/environment/process.rb +3 -3
- data/lib/datadog/core/environment/socket.rb +2 -2
- data/lib/datadog/core/environment/variable_helpers.rb +1 -1
- data/lib/datadog/core/environment/vm_cache.rb +1 -1
- data/lib/datadog/core/environment/yjit.rb +2 -2
- data/lib/datadog/core/error.rb +5 -5
- data/lib/datadog/core/evp.rb +11 -0
- data/lib/datadog/core/extensions.rb +1 -1
- data/lib/datadog/core/feature_flags.rb +2 -2
- data/lib/datadog/core/git/ext.rb +4 -4
- data/lib/datadog/core/knuth_sampler.rb +3 -1
- data/lib/datadog/core/logger.rb +3 -3
- data/lib/datadog/core/logging/ext.rb +1 -1
- data/lib/datadog/core/metrics/client.rb +21 -21
- data/lib/datadog/core/metrics/ext.rb +5 -5
- data/lib/datadog/core/metrics/logging.rb +2 -2
- data/lib/datadog/core/metrics/options.rb +3 -3
- data/lib/datadog/core/pin.rb +1 -1
- data/lib/datadog/core/process_discovery.rb +8 -8
- data/lib/datadog/core/rate_limiter.rb +1 -1
- data/lib/datadog/core/remote/client/capabilities.rb +62 -19
- data/lib/datadog/core/remote/client.rb +16 -16
- data/lib/datadog/core/remote/component.rb +20 -12
- data/lib/datadog/core/remote/configuration/content.rb +3 -3
- data/lib/datadog/core/remote/configuration/digest.rb +1 -1
- data/lib/datadog/core/remote/configuration/path.rb +9 -9
- data/lib/datadog/core/remote/configuration/repository.rb +2 -2
- data/lib/datadog/core/remote/configuration/target.rb +9 -9
- data/lib/datadog/core/remote/configuration.rb +4 -4
- data/lib/datadog/core/remote/ext.rb +3 -3
- data/lib/datadog/core/remote/negotiation.rb +1 -1
- data/lib/datadog/core/remote/tie/tracing.rb +7 -7
- data/lib/datadog/core/remote/transport/config.rb +4 -4
- data/lib/datadog/core/remote/transport/http/config.rb +7 -7
- data/lib/datadog/core/remote/transport/http/negotiation.rb +4 -4
- data/lib/datadog/core/remote/transport/http.rb +10 -10
- data/lib/datadog/core/remote/transport/negotiation.rb +3 -3
- data/lib/datadog/core/remote/worker.rb +5 -5
- data/lib/datadog/core/runtime/ext.rb +22 -22
- data/lib/datadog/core/runtime/metrics.rb +9 -9
- data/lib/datadog/core/tag_builder.rb +18 -18
- data/lib/datadog/core/tag_normalizer.rb +7 -7
- data/lib/datadog/core/telemetry/component.rb +13 -13
- data/lib/datadog/core/telemetry/emitter.rb +4 -4
- data/lib/datadog/core/telemetry/event/app_client_configuration_change.rb +5 -5
- data/lib/datadog/core/telemetry/event/app_closing.rb +2 -2
- data/lib/datadog/core/telemetry/event/app_dependencies_loaded.rb +2 -2
- data/lib/datadog/core/telemetry/event/app_endpoints_loaded.rb +2 -2
- data/lib/datadog/core/telemetry/event/app_extended_heartbeat.rb +2 -2
- data/lib/datadog/core/telemetry/event/app_heartbeat.rb +2 -2
- data/lib/datadog/core/telemetry/event/app_integrations_change.rb +2 -2
- data/lib/datadog/core/telemetry/event/app_started.rb +41 -34
- data/lib/datadog/core/telemetry/event/base.rb +1 -1
- data/lib/datadog/core/telemetry/event/distributions.rb +2 -2
- data/lib/datadog/core/telemetry/event/generate_metrics.rb +2 -2
- data/lib/datadog/core/telemetry/event/log.rb +4 -4
- data/lib/datadog/core/telemetry/event/message_batch.rb +1 -1
- data/lib/datadog/core/telemetry/event/synth_app_client_configuration_change.rb +3 -3
- data/lib/datadog/core/telemetry/event.rb +16 -16
- data/lib/datadog/core/telemetry/ext.rb +11 -11
- data/lib/datadog/core/telemetry/logger.rb +1 -1
- data/lib/datadog/core/telemetry/logging.rb +5 -5
- data/lib/datadog/core/telemetry/metric.rb +7 -7
- data/lib/datadog/core/telemetry/metrics_collection.rb +2 -2
- data/lib/datadog/core/telemetry/metrics_manager.rb +1 -1
- data/lib/datadog/core/telemetry/request.rb +4 -4
- data/lib/datadog/core/telemetry/transport/http/telemetry.rb +14 -14
- data/lib/datadog/core/telemetry/transport/http.rb +7 -7
- data/lib/datadog/core/telemetry/transport/telemetry.rb +3 -3
- data/lib/datadog/core/telemetry/worker.rb +6 -6
- data/lib/datadog/core/transport/ext.rb +14 -14
- data/lib/datadog/core/transport/http/adapters/net.rb +4 -4
- data/lib/datadog/core/transport/http/adapters/test.rb +1 -1
- data/lib/datadog/core/transport/http/adapters/unix_socket.rb +4 -4
- data/lib/datadog/core/transport/http/api/endpoint.rb +1 -1
- data/lib/datadog/core/transport/http/api/map.rb +1 -1
- data/lib/datadog/core/transport/http/builder.rb +6 -6
- data/lib/datadog/core/transport/http/client.rb +2 -2
- data/lib/datadog/core/transport/http/response.rb +1 -1
- data/lib/datadog/core/transport/http.rb +8 -8
- data/lib/datadog/core/transport/transport.rb +1 -1
- data/lib/datadog/core/utils/at_fork_monkey_patch.rb +83 -15
- data/lib/datadog/core/utils/base64_codec.rb +3 -3
- data/lib/datadog/core/utils/duration.rb +1 -1
- data/lib/datadog/core/utils/forking.rb +2 -2
- data/lib/datadog/core/utils/lru_cache.rb +3 -3
- data/lib/datadog/core/utils/network.rb +11 -11
- data/lib/datadog/core/utils/only_once_successful.rb +1 -1
- data/lib/datadog/core/utils/safe_dup.rb +2 -1
- data/lib/datadog/core/utils/sequence.rb +3 -6
- data/lib/datadog/core/utils/spawn_monkey_patch.rb +2 -2
- data/lib/datadog/core/utils/time.rb +18 -52
- data/lib/datadog/core/utils/url.rb +1 -1
- data/lib/datadog/core/utils.rb +4 -4
- data/lib/datadog/core/workers/async.rb +1 -1
- data/lib/datadog/core/workers/polling.rb +2 -2
- data/lib/datadog/core/workers/runtime_metrics.rb +4 -4
- data/lib/datadog/core.rb +4 -4
- data/lib/datadog/data_streams/configuration.rb +3 -3
- data/lib/datadog/data_streams/ext.rb +1 -1
- data/lib/datadog/data_streams/extensions.rb +2 -2
- data/lib/datadog/data_streams/pathway_context.rb +5 -5
- data/lib/datadog/data_streams/processor.rb +52 -52
- data/lib/datadog/data_streams/transport/http/stats.rb +5 -5
- data/lib/datadog/data_streams/transport/http.rb +5 -5
- data/lib/datadog/data_streams/transport/stats.rb +7 -7
- data/lib/datadog/data_streams.rb +5 -5
- data/lib/datadog/di/base.rb +6 -4
- data/lib/datadog/di/boot.rb +25 -22
- data/lib/datadog/di/capture_expression.rb +21 -0
- data/lib/datadog/di/capture_expression_evaluator.rb +71 -0
- data/lib/datadog/di/capture_limits.rb +41 -0
- data/lib/datadog/di/code_tracker.rb +10 -7
- data/lib/datadog/di/component.rb +122 -40
- data/lib/datadog/di/configuration.rb +7 -1
- data/lib/datadog/di/context.rb +9 -3
- data/lib/datadog/di/contrib/railtie.rb +1 -1
- data/lib/datadog/di/contrib.rb +5 -5
- data/lib/datadog/di/el/compiler.rb +91 -38
- data/lib/datadog/di/el/evaluator.rb +82 -2
- data/lib/datadog/di/el/expression.rb +10 -2
- data/lib/datadog/di/el.rb +3 -3
- data/lib/datadog/di/error.rb +10 -0
- data/lib/datadog/di/fatal_exceptions.rb +26 -0
- data/lib/datadog/di/instrumenter.rb +426 -169
- data/lib/datadog/di/logger.rb +1 -1
- data/lib/datadog/di/preload.rb +1 -1
- data/lib/datadog/di/probe.rb +61 -2
- data/lib/datadog/di/probe_builder.rb +96 -14
- data/lib/datadog/di/probe_file_loader/railtie.rb +1 -1
- data/lib/datadog/di/probe_file_loader.rb +12 -7
- data/lib/datadog/di/probe_manager.rb +67 -9
- data/lib/datadog/di/probe_notification_builder.rb +66 -22
- data/lib/datadog/di/probe_notifier_worker.rb +57 -37
- data/lib/datadog/di/probe_repository.rb +1 -1
- data/lib/datadog/di/redactor.rb +16 -1
- data/lib/datadog/di/remote.rb +178 -17
- data/lib/datadog/di/serializer.rb +47 -28
- data/lib/datadog/di/transport/diagnostics.rb +5 -5
- data/lib/datadog/di/transport/http/diagnostics.rb +3 -3
- data/lib/datadog/di/transport/http/input.rb +2 -2
- data/lib/datadog/di/transport/http.rb +10 -10
- data/lib/datadog/di/transport/input.rb +16 -12
- data/lib/datadog/di/utils.rb +4 -4
- data/lib/datadog/di.rb +66 -3
- data/lib/datadog/error_tracking/collector.rb +2 -2
- data/lib/datadog/error_tracking/component.rb +12 -12
- data/lib/datadog/error_tracking/configuration.rb +2 -2
- data/lib/datadog/error_tracking/ext.rb +7 -7
- data/lib/datadog/error_tracking/extensions.rb +2 -2
- data/lib/datadog/error_tracking/filters.rb +4 -4
- data/lib/datadog/error_tracking.rb +6 -6
- data/lib/datadog/kit/appsec/events/v2.rb +90 -32
- data/lib/datadog/kit/appsec/events.rb +25 -25
- data/lib/datadog/kit/enable_core_dumps.rb +2 -2
- data/lib/datadog/kit/identity.rb +18 -18
- data/lib/datadog/kit/tracing/method_tracer.rb +7 -7
- data/lib/datadog/kit.rb +1 -1
- data/lib/datadog/open_feature/component.rb +53 -21
- data/lib/datadog/open_feature/configuration.rb +22 -1
- data/lib/datadog/open_feature/evaluation_engine.rb +7 -7
- data/lib/datadog/open_feature/exposures/buffer.rb +1 -1
- data/lib/datadog/open_feature/exposures/deduplicator.rb +1 -1
- data/lib/datadog/open_feature/exposures/event.rb +2 -2
- data/lib/datadog/open_feature/exposures/reporter.rb +3 -3
- data/lib/datadog/open_feature/exposures/worker.rb +6 -6
- data/lib/datadog/open_feature/ext.rb +13 -6
- data/lib/datadog/open_feature/flag_evaluation/aggregator.rb +286 -0
- data/lib/datadog/open_feature/flag_evaluation/writer.rb +433 -0
- data/lib/datadog/open_feature/hooks/flag_eval_evp_hook.rb +102 -0
- data/lib/datadog/open_feature/hooks/{flag_eval_hook.rb → flag_eval_metrics_hook.rb} +4 -2
- data/lib/datadog/open_feature/hooks/span_enrichment_hook/codec.rb +58 -0
- data/lib/datadog/open_feature/hooks/span_enrichment_hook/span_enrichment_state.rb +96 -0
- data/lib/datadog/open_feature/hooks/span_enrichment_hook/span_enrichment_state_store.rb +49 -0
- data/lib/datadog/open_feature/hooks/span_enrichment_hook.rb +184 -0
- data/lib/datadog/open_feature/metrics/flag_eval_metrics.rb +24 -24
- data/lib/datadog/open_feature/native_evaluator.rb +23 -1
- data/lib/datadog/open_feature/noop_evaluator.rb +3 -3
- data/lib/datadog/open_feature/provider.rb +97 -30
- data/lib/datadog/open_feature/remote.rb +2 -2
- data/lib/datadog/open_feature/resolution_details.rb +4 -2
- data/lib/datadog/open_feature/transport.rb +65 -11
- data/lib/datadog/open_feature.rb +2 -2
- data/lib/datadog/opentelemetry/api/baggage.rb +3 -3
- data/lib/datadog/opentelemetry/api/context.rb +4 -4
- data/lib/datadog/opentelemetry/configuration/settings.rb +41 -41
- data/lib/datadog/opentelemetry/ext.rb +1 -1
- data/lib/datadog/opentelemetry/logs.rb +5 -5
- data/lib/datadog/opentelemetry/metrics.rb +7 -7
- data/lib/datadog/opentelemetry/sdk/configurator.rb +8 -8
- data/lib/datadog/opentelemetry/sdk/id_generator.rb +2 -2
- data/lib/datadog/opentelemetry/sdk/logs_exporter.rb +10 -17
- data/lib/datadog/opentelemetry/sdk/metrics_exporter.rb +8 -15
- data/lib/datadog/opentelemetry/sdk/propagator.rb +7 -7
- data/lib/datadog/opentelemetry/sdk/span_processor.rb +15 -15
- data/lib/datadog/opentelemetry/sdk/trace/span.rb +32 -32
- data/lib/datadog/opentelemetry/sdk.rb +19 -0
- data/lib/datadog/opentelemetry/signal_configuration.rb +11 -11
- data/lib/datadog/opentelemetry/trace.rb +1 -1
- data/lib/datadog/opentelemetry.rb +8 -8
- data/lib/datadog/profiling/collectors/cpu_and_wall_time_worker.rb +6 -1
- data/lib/datadog/profiling/collectors/idle_sampling_helper.rb +5 -3
- data/lib/datadog/profiling/collectors/thread_context.rb +15 -14
- data/lib/datadog/profiling/component.rb +18 -0
- data/lib/datadog/profiling/exporter.rb +1 -1
- data/lib/datadog/profiling/http_transport.rb +1 -1
- data/lib/datadog/profiling/sequence_tracker.rb +1 -1
- data/lib/datadog/profiling/tag_builder.rb +19 -19
- data/lib/datadog/profiling.rb +31 -27
- data/lib/datadog/single_step_instrument.rb +1 -1
- data/lib/datadog/symbol_database/component.rb +177 -60
- data/lib/datadog/symbol_database/configuration.rb +15 -7
- data/lib/datadog/symbol_database/extensions.rb +19 -0
- data/lib/datadog/symbol_database/extractor.rb +167 -130
- data/lib/datadog/symbol_database/file_hash.rb +5 -3
- data/lib/datadog/symbol_database/logger.rb +1 -1
- data/lib/datadog/symbol_database/remote.rb +28 -8
- data/lib/datadog/symbol_database/scope.rb +2 -2
- data/lib/datadog/symbol_database/scope_batcher.rb +8 -4
- data/lib/datadog/symbol_database/service_version.rb +4 -4
- data/lib/datadog/symbol_database/symbol.rb +1 -1
- data/lib/datadog/symbol_database/transport/http/endpoint.rb +1 -1
- data/lib/datadog/symbol_database/transport/http.rb +6 -6
- data/lib/datadog/symbol_database/transport.rb +4 -4
- data/lib/datadog/symbol_database/uploader.rb +28 -21
- data/lib/datadog/symbol_database.rb +22 -0
- data/lib/datadog/tracing/analytics.rb +1 -1
- data/lib/datadog/tracing/buffer.rb +5 -5
- data/lib/datadog/tracing/client_ip.rb +4 -4
- data/lib/datadog/tracing/component.rb +28 -7
- data/lib/datadog/tracing/configuration/dynamic.rb +8 -8
- data/lib/datadog/tracing/configuration/ext.rb +43 -42
- data/lib/datadog/tracing/configuration/http.rb +2 -2
- data/lib/datadog/tracing/configuration/settings.rb +32 -16
- data/lib/datadog/tracing/context.rb +1 -1
- data/lib/datadog/tracing/context_provider.rb +2 -2
- data/lib/datadog/tracing/contrib/action_cable/configuration/settings.rb +2 -2
- data/lib/datadog/tracing/contrib/action_cable/event.rb +4 -4
- data/lib/datadog/tracing/contrib/action_cable/events/broadcast.rb +5 -5
- data/lib/datadog/tracing/contrib/action_cable/events/perform_action.rb +4 -4
- data/lib/datadog/tracing/contrib/action_cable/events/transmit.rb +5 -5
- data/lib/datadog/tracing/contrib/action_cable/events.rb +4 -4
- data/lib/datadog/tracing/contrib/action_cable/ext.rb +18 -18
- data/lib/datadog/tracing/contrib/action_cable/instrumentation.rb +4 -4
- data/lib/datadog/tracing/contrib/action_cable/integration.rb +7 -7
- data/lib/datadog/tracing/contrib/action_cable/patcher.rb +4 -4
- data/lib/datadog/tracing/contrib/action_mailer/configuration/settings.rb +2 -2
- data/lib/datadog/tracing/contrib/action_mailer/event.rb +3 -3
- data/lib/datadog/tracing/contrib/action_mailer/events/deliver.rb +8 -8
- data/lib/datadog/tracing/contrib/action_mailer/events/process.rb +4 -4
- data/lib/datadog/tracing/contrib/action_mailer/events.rb +2 -2
- data/lib/datadog/tracing/contrib/action_mailer/ext.rb +18 -18
- data/lib/datadog/tracing/contrib/action_mailer/integration.rb +7 -7
- data/lib/datadog/tracing/contrib/action_mailer/patcher.rb +3 -3
- data/lib/datadog/tracing/contrib/action_pack/action_controller/instrumentation.rb +8 -8
- data/lib/datadog/tracing/contrib/action_pack/action_controller/patcher.rb +2 -2
- data/lib/datadog/tracing/contrib/action_pack/action_dispatch/instrumentation.rb +4 -4
- data/lib/datadog/tracing/contrib/action_pack/action_dispatch/patcher.rb +4 -4
- data/lib/datadog/tracing/contrib/action_pack/configuration/settings.rb +3 -3
- data/lib/datadog/tracing/contrib/action_pack/ext.rb +10 -10
- data/lib/datadog/tracing/contrib/action_pack/integration.rb +7 -7
- data/lib/datadog/tracing/contrib/action_pack/patcher.rb +3 -3
- data/lib/datadog/tracing/contrib/action_pack/utils.rb +1 -1
- data/lib/datadog/tracing/contrib/action_view/configuration/settings.rb +3 -3
- data/lib/datadog/tracing/contrib/action_view/event.rb +1 -1
- data/lib/datadog/tracing/contrib/action_view/events/render_partial.rb +6 -6
- data/lib/datadog/tracing/contrib/action_view/events/render_template.rb +6 -6
- data/lib/datadog/tracing/contrib/action_view/events.rb +2 -2
- data/lib/datadog/tracing/contrib/action_view/ext.rb +10 -10
- data/lib/datadog/tracing/contrib/action_view/integration.rb +11 -11
- data/lib/datadog/tracing/contrib/action_view/patcher.rb +5 -5
- data/lib/datadog/tracing/contrib/action_view/utils.rb +2 -2
- data/lib/datadog/tracing/contrib/active_job/configuration/settings.rb +2 -2
- data/lib/datadog/tracing/contrib/active_job/data_streams.rb +62 -0
- data/lib/datadog/tracing/contrib/active_job/event.rb +3 -3
- data/lib/datadog/tracing/contrib/active_job/events/discard.rb +5 -5
- data/lib/datadog/tracing/contrib/active_job/events/enqueue.rb +5 -5
- data/lib/datadog/tracing/contrib/active_job/events/enqueue_at.rb +5 -5
- data/lib/datadog/tracing/contrib/active_job/events/enqueue_retry.rb +5 -5
- data/lib/datadog/tracing/contrib/active_job/events/perform.rb +5 -5
- data/lib/datadog/tracing/contrib/active_job/events/retry_stopped.rb +5 -5
- data/lib/datadog/tracing/contrib/active_job/events.rb +6 -6
- data/lib/datadog/tracing/contrib/active_job/ext.rb +23 -23
- data/lib/datadog/tracing/contrib/active_job/integration.rb +7 -7
- data/lib/datadog/tracing/contrib/active_job/patcher.rb +17 -5
- data/lib/datadog/tracing/contrib/active_model_serializers/configuration/settings.rb +2 -2
- data/lib/datadog/tracing/contrib/active_model_serializers/event.rb +4 -4
- data/lib/datadog/tracing/contrib/active_model_serializers/events/render.rb +6 -6
- data/lib/datadog/tracing/contrib/active_model_serializers/events/serialize.rb +7 -8
- data/lib/datadog/tracing/contrib/active_model_serializers/events.rb +2 -2
- data/lib/datadog/tracing/contrib/active_model_serializers/ext.rb +10 -10
- data/lib/datadog/tracing/contrib/active_model_serializers/integration.rb +5 -5
- data/lib/datadog/tracing/contrib/active_model_serializers/patcher.rb +3 -3
- data/lib/datadog/tracing/contrib/active_record/configuration/makara_resolver.rb +1 -1
- data/lib/datadog/tracing/contrib/active_record/configuration/resolver.rb +6 -6
- data/lib/datadog/tracing/contrib/active_record/configuration/settings.rb +4 -4
- data/lib/datadog/tracing/contrib/active_record/event.rb +1 -1
- data/lib/datadog/tracing/contrib/active_record/events/instantiation.rb +8 -8
- data/lib/datadog/tracing/contrib/active_record/events/sql.rb +9 -9
- data/lib/datadog/tracing/contrib/active_record/events.rb +2 -2
- data/lib/datadog/tracing/contrib/active_record/ext.rb +15 -15
- data/lib/datadog/tracing/contrib/active_record/integration.rb +11 -11
- data/lib/datadog/tracing/contrib/active_record/patcher.rb +2 -2
- data/lib/datadog/tracing/contrib/active_record/utils.rb +3 -3
- data/lib/datadog/tracing/contrib/active_support/cache/event.rb +1 -1
- data/lib/datadog/tracing/contrib/active_support/cache/events/cache.rb +11 -11
- data/lib/datadog/tracing/contrib/active_support/cache/events.rb +1 -1
- data/lib/datadog/tracing/contrib/active_support/cache/instrumentation.rb +4 -4
- data/lib/datadog/tracing/contrib/active_support/cache/patcher.rb +5 -5
- data/lib/datadog/tracing/contrib/active_support/cache/redis.rb +4 -4
- data/lib/datadog/tracing/contrib/active_support/configuration/settings.rb +3 -3
- data/lib/datadog/tracing/contrib/active_support/ext.rb +16 -16
- data/lib/datadog/tracing/contrib/active_support/integration.rb +8 -8
- data/lib/datadog/tracing/contrib/active_support/notifications/event.rb +1 -1
- data/lib/datadog/tracing/contrib/active_support/notifications/subscriber.rb +2 -2
- data/lib/datadog/tracing/contrib/active_support/notifications/subscription.rb +1 -1
- data/lib/datadog/tracing/contrib/active_support/patcher.rb +2 -2
- data/lib/datadog/tracing/contrib/analytics.rb +1 -1
- data/lib/datadog/tracing/contrib/auto_instrument.rb +4 -4
- data/lib/datadog/tracing/contrib/aws/configuration/settings.rb +3 -3
- data/lib/datadog/tracing/contrib/aws/ext.rb +25 -25
- data/lib/datadog/tracing/contrib/aws/instrumentation.rb +5 -5
- data/lib/datadog/tracing/contrib/aws/integration.rb +9 -9
- data/lib/datadog/tracing/contrib/aws/parsed_context.rb +1 -1
- data/lib/datadog/tracing/contrib/aws/patcher.rb +5 -5
- data/lib/datadog/tracing/contrib/aws/service/dynamodb.rb +2 -2
- data/lib/datadog/tracing/contrib/aws/service/eventbridge.rb +2 -2
- data/lib/datadog/tracing/contrib/aws/service/kinesis.rb +4 -4
- data/lib/datadog/tracing/contrib/aws/service/s3.rb +2 -2
- data/lib/datadog/tracing/contrib/aws/service/sns.rb +3 -3
- data/lib/datadog/tracing/contrib/aws/service/sqs.rb +3 -3
- data/lib/datadog/tracing/contrib/aws/service/states.rb +5 -5
- data/lib/datadog/tracing/contrib/aws/services.rb +14 -14
- data/lib/datadog/tracing/contrib/concurrent_ruby/async_patch.rb +1 -1
- data/lib/datadog/tracing/contrib/concurrent_ruby/configuration/settings.rb +2 -2
- data/lib/datadog/tracing/contrib/concurrent_ruby/context_composite_executor_service.rb +1 -1
- data/lib/datadog/tracing/contrib/concurrent_ruby/ext.rb +2 -2
- data/lib/datadog/tracing/contrib/concurrent_ruby/future_patch.rb +1 -1
- data/lib/datadog/tracing/contrib/concurrent_ruby/integration.rb +6 -6
- data/lib/datadog/tracing/contrib/concurrent_ruby/patcher.rb +4 -4
- data/lib/datadog/tracing/contrib/concurrent_ruby/promises_future_patch.rb +1 -1
- data/lib/datadog/tracing/contrib/configurable.rb +2 -2
- data/lib/datadog/tracing/contrib/configuration/resolvers/pattern_resolver.rb +1 -1
- data/lib/datadog/tracing/contrib/configuration/settings.rb +2 -2
- data/lib/datadog/tracing/contrib/dalli/configuration/settings.rb +2 -2
- data/lib/datadog/tracing/contrib/dalli/ext.rb +13 -13
- data/lib/datadog/tracing/contrib/dalli/instrumentation.rb +5 -5
- data/lib/datadog/tracing/contrib/dalli/integration.rb +7 -7
- data/lib/datadog/tracing/contrib/dalli/patcher.rb +3 -3
- data/lib/datadog/tracing/contrib/dalli/quantize.rb +2 -2
- data/lib/datadog/tracing/contrib/delayed_job/configuration/settings.rb +2 -2
- data/lib/datadog/tracing/contrib/delayed_job/ext.rb +14 -14
- data/lib/datadog/tracing/contrib/delayed_job/integration.rb +5 -5
- data/lib/datadog/tracing/contrib/delayed_job/patcher.rb +3 -3
- data/lib/datadog/tracing/contrib/delayed_job/plugin.rb +5 -5
- data/lib/datadog/tracing/contrib/elasticsearch/configuration/settings.rb +2 -2
- data/lib/datadog/tracing/contrib/elasticsearch/ext.rb +15 -15
- data/lib/datadog/tracing/contrib/elasticsearch/integration.rb +6 -6
- data/lib/datadog/tracing/contrib/elasticsearch/patcher.rb +10 -10
- data/lib/datadog/tracing/contrib/elasticsearch/quantize.rb +2 -2
- data/lib/datadog/tracing/contrib/ethon/configuration/settings.rb +2 -2
- data/lib/datadog/tracing/contrib/ethon/easy_patch.rb +8 -8
- data/lib/datadog/tracing/contrib/ethon/ext.rb +13 -13
- data/lib/datadog/tracing/contrib/ethon/integration.rb +6 -6
- data/lib/datadog/tracing/contrib/ethon/multi_patch.rb +3 -3
- data/lib/datadog/tracing/contrib/ethon/patcher.rb +3 -3
- data/lib/datadog/tracing/contrib/excon/configuration/settings.rb +5 -5
- data/lib/datadog/tracing/contrib/excon/ext.rb +11 -11
- data/lib/datadog/tracing/contrib/excon/integration.rb +6 -6
- data/lib/datadog/tracing/contrib/excon/middleware.rb +8 -8
- data/lib/datadog/tracing/contrib/excon/patcher.rb +2 -2
- data/lib/datadog/tracing/contrib/ext.rb +15 -15
- data/lib/datadog/tracing/contrib/extensions.rb +2 -2
- data/lib/datadog/tracing/contrib/faraday/configuration/settings.rb +4 -4
- data/lib/datadog/tracing/contrib/faraday/ext.rb +11 -11
- data/lib/datadog/tracing/contrib/faraday/integration.rb +6 -6
- data/lib/datadog/tracing/contrib/faraday/middleware.rb +8 -8
- data/lib/datadog/tracing/contrib/faraday/patcher.rb +6 -6
- data/lib/datadog/tracing/contrib/grape/configuration/settings.rb +4 -4
- data/lib/datadog/tracing/contrib/grape/endpoint.rb +20 -20
- data/lib/datadog/tracing/contrib/grape/ext.rb +15 -15
- data/lib/datadog/tracing/contrib/grape/instrumentation.rb +3 -3
- data/lib/datadog/tracing/contrib/grape/integration.rb +5 -5
- data/lib/datadog/tracing/contrib/grape/patcher.rb +5 -5
- data/lib/datadog/tracing/contrib/graphql/configuration/error_extension_env_parser.rb +1 -1
- data/lib/datadog/tracing/contrib/graphql/configuration/settings.rb +3 -3
- data/lib/datadog/tracing/contrib/graphql/ext.rb +9 -9
- data/lib/datadog/tracing/contrib/graphql/integration.rb +9 -9
- data/lib/datadog/tracing/contrib/graphql/patcher.rb +7 -7
- data/lib/datadog/tracing/contrib/graphql/unified_trace.rb +37 -37
- data/lib/datadog/tracing/contrib/graphql/unified_trace_patcher.rb +2 -2
- data/lib/datadog/tracing/contrib/grpc/configuration/settings.rb +2 -2
- data/lib/datadog/tracing/contrib/grpc/datadog_interceptor/client.rb +7 -7
- data/lib/datadog/tracing/contrib/grpc/datadog_interceptor/server.rb +7 -7
- data/lib/datadog/tracing/contrib/grpc/datadog_interceptor.rb +6 -6
- data/lib/datadog/tracing/contrib/grpc/distributed/fetcher.rb +1 -1
- data/lib/datadog/tracing/contrib/grpc/distributed/propagation.rb +8 -8
- data/lib/datadog/tracing/contrib/grpc/ext.rb +14 -14
- data/lib/datadog/tracing/contrib/grpc/formatting.rb +7 -7
- data/lib/datadog/tracing/contrib/grpc/integration.rb +5 -5
- data/lib/datadog/tracing/contrib/grpc/intercept_with_datadog.rb +1 -1
- data/lib/datadog/tracing/contrib/grpc/patcher.rb +3 -3
- data/lib/datadog/tracing/contrib/grpc.rb +6 -6
- data/lib/datadog/tracing/contrib/hanami/action_tracer.rb +3 -3
- data/lib/datadog/tracing/contrib/hanami/configuration/settings.rb +2 -2
- data/lib/datadog/tracing/contrib/hanami/ext.rb +8 -8
- data/lib/datadog/tracing/contrib/hanami/integration.rb +6 -6
- data/lib/datadog/tracing/contrib/hanami/patcher.rb +5 -5
- data/lib/datadog/tracing/contrib/hanami/renderer_policy_tracing.rb +3 -3
- data/lib/datadog/tracing/contrib/hanami/router_tracing.rb +5 -4
- data/lib/datadog/tracing/contrib/http/circuit_breaker.rb +1 -1
- data/lib/datadog/tracing/contrib/http/configuration/settings.rb +4 -4
- data/lib/datadog/tracing/contrib/http/distributed/fetcher.rb +3 -3
- data/lib/datadog/tracing/contrib/http/distributed/propagation.rb +8 -8
- data/lib/datadog/tracing/contrib/http/ext.rb +11 -11
- data/lib/datadog/tracing/contrib/http/instrumentation.rb +6 -6
- data/lib/datadog/tracing/contrib/http/integration.rb +7 -7
- data/lib/datadog/tracing/contrib/http/patcher.rb +3 -3
- data/lib/datadog/tracing/contrib/http.rb +6 -6
- data/lib/datadog/tracing/contrib/httpclient/configuration/settings.rb +4 -4
- data/lib/datadog/tracing/contrib/httpclient/ext.rb +11 -11
- data/lib/datadog/tracing/contrib/httpclient/instrumentation.rb +5 -5
- data/lib/datadog/tracing/contrib/httpclient/integration.rb +6 -6
- data/lib/datadog/tracing/contrib/httpclient/patcher.rb +3 -3
- data/lib/datadog/tracing/contrib/httprb/configuration/settings.rb +4 -4
- data/lib/datadog/tracing/contrib/httprb/ext.rb +11 -11
- data/lib/datadog/tracing/contrib/httprb/instrumentation.rb +6 -6
- data/lib/datadog/tracing/contrib/httprb/integration.rb +7 -7
- data/lib/datadog/tracing/contrib/httprb/patcher.rb +3 -3
- data/lib/datadog/tracing/contrib/integration.rb +3 -3
- data/lib/datadog/tracing/contrib/kafka/configuration/settings.rb +2 -2
- data/lib/datadog/tracing/contrib/kafka/event.rb +3 -3
- data/lib/datadog/tracing/contrib/kafka/events/connection/request.rb +7 -3
- data/lib/datadog/tracing/contrib/kafka/events/consumer/process_batch.rb +4 -4
- data/lib/datadog/tracing/contrib/kafka/events/consumer/process_message.rb +4 -4
- data/lib/datadog/tracing/contrib/kafka/events/consumer_group/heartbeat.rb +5 -5
- data/lib/datadog/tracing/contrib/kafka/events/consumer_group/join_group.rb +5 -5
- data/lib/datadog/tracing/contrib/kafka/events/consumer_group/leave_group.rb +5 -5
- data/lib/datadog/tracing/contrib/kafka/events/consumer_group/sync_group.rb +5 -5
- data/lib/datadog/tracing/contrib/kafka/events/produce_operation/send_messages.rb +10 -5
- data/lib/datadog/tracing/contrib/kafka/events/producer/deliver_messages.rb +10 -5
- data/lib/datadog/tracing/contrib/kafka/events.rb +9 -9
- data/lib/datadog/tracing/contrib/kafka/ext.rb +40 -40
- data/lib/datadog/tracing/contrib/kafka/instrumentation/consumer.rb +2 -2
- data/lib/datadog/tracing/contrib/kafka/instrumentation/producer.rb +4 -4
- data/lib/datadog/tracing/contrib/kafka/integration.rb +6 -6
- data/lib/datadog/tracing/contrib/kafka/patcher.rb +5 -5
- data/lib/datadog/tracing/contrib/karafka/configuration/settings.rb +2 -2
- data/lib/datadog/tracing/contrib/karafka/distributed/propagation.rb +8 -8
- data/lib/datadog/tracing/contrib/karafka/ext.rb +13 -13
- data/lib/datadog/tracing/contrib/karafka/integration.rb +5 -5
- data/lib/datadog/tracing/contrib/karafka/monitor.rb +14 -14
- data/lib/datadog/tracing/contrib/karafka/patcher.rb +8 -8
- data/lib/datadog/tracing/contrib/karafka.rb +6 -6
- data/lib/datadog/tracing/contrib/lograge/configuration/settings.rb +2 -2
- data/lib/datadog/tracing/contrib/lograge/ext.rb +1 -1
- data/lib/datadog/tracing/contrib/lograge/integration.rb +5 -5
- data/lib/datadog/tracing/contrib/lograge/patcher.rb +9 -9
- data/lib/datadog/tracing/contrib/mongodb/configuration/settings.rb +2 -2
- data/lib/datadog/tracing/contrib/mongodb/ext.rb +18 -18
- data/lib/datadog/tracing/contrib/mongodb/instrumentation.rb +3 -3
- data/lib/datadog/tracing/contrib/mongodb/integration.rb +7 -7
- data/lib/datadog/tracing/contrib/mongodb/parsers.rb +5 -5
- data/lib/datadog/tracing/contrib/mongodb/patcher.rb +3 -3
- data/lib/datadog/tracing/contrib/mongodb/subscribers.rb +13 -13
- data/lib/datadog/tracing/contrib/mysql2/configuration/settings.rb +3 -3
- data/lib/datadog/tracing/contrib/mysql2/ext.rb +11 -11
- data/lib/datadog/tracing/contrib/mysql2/instrumentation.rb +6 -6
- data/lib/datadog/tracing/contrib/mysql2/integration.rb +5 -5
- data/lib/datadog/tracing/contrib/mysql2/patcher.rb +2 -2
- data/lib/datadog/tracing/contrib/opensearch/configuration/settings.rb +2 -2
- data/lib/datadog/tracing/contrib/opensearch/ext.rb +22 -22
- data/lib/datadog/tracing/contrib/opensearch/integration.rb +6 -6
- data/lib/datadog/tracing/contrib/opensearch/patcher.rb +13 -13
- data/lib/datadog/tracing/contrib/opensearch/quantize.rb +3 -3
- data/lib/datadog/tracing/contrib/patcher.rb +2 -2
- data/lib/datadog/tracing/contrib/pg/configuration/settings.rb +3 -3
- data/lib/datadog/tracing/contrib/pg/ext.rb +19 -19
- data/lib/datadog/tracing/contrib/pg/instrumentation.rb +18 -18
- data/lib/datadog/tracing/contrib/pg/integration.rb +5 -5
- data/lib/datadog/tracing/contrib/pg/patcher.rb +2 -2
- data/lib/datadog/tracing/contrib/presto/configuration/settings.rb +2 -2
- data/lib/datadog/tracing/contrib/presto/ext.rb +21 -21
- data/lib/datadog/tracing/contrib/presto/instrumentation.rb +2 -2
- data/lib/datadog/tracing/contrib/presto/integration.rb +6 -6
- data/lib/datadog/tracing/contrib/presto/patcher.rb +4 -4
- data/lib/datadog/tracing/contrib/propagation/sql_comment/comment.rb +2 -2
- data/lib/datadog/tracing/contrib/propagation/sql_comment/ext.rb +17 -17
- data/lib/datadog/tracing/contrib/propagation/sql_comment/mode.rb +1 -1
- data/lib/datadog/tracing/contrib/propagation/sql_comment.rb +5 -5
- data/lib/datadog/tracing/contrib/que/configuration/settings.rb +2 -2
- data/lib/datadog/tracing/contrib/que/ext.rb +19 -19
- data/lib/datadog/tracing/contrib/que/integration.rb +6 -6
- data/lib/datadog/tracing/contrib/que/patcher.rb +1 -1
- data/lib/datadog/tracing/contrib/que/tracer.rb +1 -1
- data/lib/datadog/tracing/contrib/racecar/configuration/settings.rb +3 -3
- data/lib/datadog/tracing/contrib/racecar/event.rb +4 -4
- data/lib/datadog/tracing/contrib/racecar/events/batch.rb +3 -3
- data/lib/datadog/tracing/contrib/racecar/events/consume.rb +3 -3
- data/lib/datadog/tracing/contrib/racecar/events/message.rb +3 -3
- data/lib/datadog/tracing/contrib/racecar/events.rb +3 -3
- data/lib/datadog/tracing/contrib/racecar/ext.rb +18 -18
- data/lib/datadog/tracing/contrib/racecar/integration.rb +5 -5
- data/lib/datadog/tracing/contrib/racecar/patcher.rb +3 -3
- data/lib/datadog/tracing/contrib/rack/configuration/settings.rb +2 -2
- data/lib/datadog/tracing/contrib/rack/ext.rb +33 -33
- data/lib/datadog/tracing/contrib/rack/header_collection.rb +3 -3
- data/lib/datadog/tracing/contrib/rack/header_tagging.rb +4 -4
- data/lib/datadog/tracing/contrib/rack/integration.rb +6 -6
- data/lib/datadog/tracing/contrib/rack/middlewares.rb +24 -24
- data/lib/datadog/tracing/contrib/rack/patcher.rb +3 -3
- data/lib/datadog/tracing/contrib/rack/request_queue.rb +3 -3
- data/lib/datadog/tracing/contrib/rack/route_inference.rb +11 -11
- data/lib/datadog/tracing/contrib/rack/trace_proxy_middleware.rb +15 -15
- data/lib/datadog/tracing/contrib/rails/auto_instrument_railtie.rb +1 -1
- data/lib/datadog/tracing/contrib/rails/configuration/settings.rb +3 -3
- data/lib/datadog/tracing/contrib/rails/ext.rb +15 -15
- data/lib/datadog/tracing/contrib/rails/framework.rb +11 -11
- data/lib/datadog/tracing/contrib/rails/integration.rb +5 -5
- data/lib/datadog/tracing/contrib/rails/middlewares.rb +1 -1
- data/lib/datadog/tracing/contrib/rails/patcher.rb +8 -8
- data/lib/datadog/tracing/contrib/rails/railtie.rb +4 -4
- data/lib/datadog/tracing/contrib/rails/runner.rb +1 -1
- data/lib/datadog/tracing/contrib/rake/configuration/settings.rb +3 -3
- data/lib/datadog/tracing/contrib/rake/ext.rb +12 -12
- data/lib/datadog/tracing/contrib/rake/instrumentation.rb +4 -4
- data/lib/datadog/tracing/contrib/rake/integration.rb +5 -5
- data/lib/datadog/tracing/contrib/rake/patcher.rb +3 -3
- data/lib/datadog/tracing/contrib/redis/configuration/resolver.rb +2 -2
- data/lib/datadog/tracing/contrib/redis/configuration/settings.rb +2 -2
- data/lib/datadog/tracing/contrib/redis/ext.rb +16 -16
- data/lib/datadog/tracing/contrib/redis/instrumentation.rb +6 -6
- data/lib/datadog/tracing/contrib/redis/integration.rb +7 -7
- data/lib/datadog/tracing/contrib/redis/patcher.rb +10 -10
- data/lib/datadog/tracing/contrib/redis/quantize.rb +4 -4
- data/lib/datadog/tracing/contrib/redis/tags.rb +5 -5
- data/lib/datadog/tracing/contrib/redis/trace_middleware.rb +5 -5
- data/lib/datadog/tracing/contrib/resque/configuration/settings.rb +2 -2
- data/lib/datadog/tracing/contrib/resque/ext.rb +7 -7
- data/lib/datadog/tracing/contrib/resque/integration.rb +5 -5
- data/lib/datadog/tracing/contrib/resque/patcher.rb +3 -3
- data/lib/datadog/tracing/contrib/resque/resque_job.rb +5 -5
- data/lib/datadog/tracing/contrib/rest_client/configuration/settings.rb +2 -2
- data/lib/datadog/tracing/contrib/rest_client/ext.rb +10 -10
- data/lib/datadog/tracing/contrib/rest_client/integration.rb +6 -6
- data/lib/datadog/tracing/contrib/rest_client/patcher.rb +2 -2
- data/lib/datadog/tracing/contrib/rest_client/request_patch.rb +5 -5
- data/lib/datadog/tracing/contrib/roda/configuration/settings.rb +2 -2
- data/lib/datadog/tracing/contrib/roda/ext.rb +6 -6
- data/lib/datadog/tracing/contrib/roda/instrumentation.rb +4 -4
- data/lib/datadog/tracing/contrib/roda/integration.rb +6 -6
- data/lib/datadog/tracing/contrib/roda/patcher.rb +3 -3
- data/lib/datadog/tracing/contrib/semantic_logger/configuration/settings.rb +2 -2
- data/lib/datadog/tracing/contrib/semantic_logger/ext.rb +1 -1
- data/lib/datadog/tracing/contrib/semantic_logger/integration.rb +5 -5
- data/lib/datadog/tracing/contrib/semantic_logger/patcher.rb +2 -2
- data/lib/datadog/tracing/contrib/sequel/configuration/settings.rb +2 -2
- data/lib/datadog/tracing/contrib/sequel/database.rb +6 -10
- data/lib/datadog/tracing/contrib/sequel/dataset.rb +5 -5
- data/lib/datadog/tracing/contrib/sequel/ext.rb +12 -8
- data/lib/datadog/tracing/contrib/sequel/integration.rb +5 -5
- data/lib/datadog/tracing/contrib/sequel/patcher.rb +3 -3
- data/lib/datadog/tracing/contrib/sequel/utils.rb +115 -10
- data/lib/datadog/tracing/contrib/shoryuken/configuration/settings.rb +2 -2
- data/lib/datadog/tracing/contrib/shoryuken/ext.rb +12 -12
- data/lib/datadog/tracing/contrib/shoryuken/integration.rb +6 -6
- data/lib/datadog/tracing/contrib/shoryuken/patcher.rb +1 -1
- data/lib/datadog/tracing/contrib/shoryuken/tracer.rb +2 -2
- data/lib/datadog/tracing/contrib/sidekiq/client_tracer.rb +8 -8
- data/lib/datadog/tracing/contrib/sidekiq/configuration/settings.rb +2 -2
- data/lib/datadog/tracing/contrib/sidekiq/distributed/propagation.rb +9 -9
- data/lib/datadog/tracing/contrib/sidekiq/ext.rb +30 -30
- data/lib/datadog/tracing/contrib/sidekiq/integration.rb +7 -7
- data/lib/datadog/tracing/contrib/sidekiq/patcher.rb +8 -8
- data/lib/datadog/tracing/contrib/sidekiq/server_tracer.rb +14 -14
- data/lib/datadog/tracing/contrib/sidekiq/utils.rb +9 -9
- data/lib/datadog/tracing/contrib/sidekiq.rb +6 -6
- data/lib/datadog/tracing/contrib/sinatra/configuration/settings.rb +2 -2
- data/lib/datadog/tracing/contrib/sinatra/env.rb +6 -6
- data/lib/datadog/tracing/contrib/sinatra/ext.rb +17 -17
- data/lib/datadog/tracing/contrib/sinatra/framework.rb +2 -2
- data/lib/datadog/tracing/contrib/sinatra/integration.rb +5 -5
- data/lib/datadog/tracing/contrib/sinatra/patcher.rb +5 -5
- data/lib/datadog/tracing/contrib/sinatra/tracer.rb +10 -10
- data/lib/datadog/tracing/contrib/sinatra/tracer_middleware.rb +8 -8
- data/lib/datadog/tracing/contrib/sneakers/configuration/settings.rb +1 -1
- data/lib/datadog/tracing/contrib/sneakers/ext.rb +12 -12
- data/lib/datadog/tracing/contrib/sneakers/integration.rb +7 -7
- data/lib/datadog/tracing/contrib/sneakers/patcher.rb +2 -2
- data/lib/datadog/tracing/contrib/sneakers/tracer.rb +3 -3
- data/lib/datadog/tracing/contrib/span_attribute_schema.rb +2 -2
- data/lib/datadog/tracing/contrib/status_range_env_parser.rb +2 -2
- data/lib/datadog/tracing/contrib/status_range_matcher.rb +1 -1
- data/lib/datadog/tracing/contrib/stripe/configuration/settings.rb +2 -2
- data/lib/datadog/tracing/contrib/stripe/ext.rb +12 -12
- data/lib/datadog/tracing/contrib/stripe/integration.rb +5 -5
- data/lib/datadog/tracing/contrib/stripe/patcher.rb +2 -2
- data/lib/datadog/tracing/contrib/stripe/request.rb +3 -3
- data/lib/datadog/tracing/contrib/sucker_punch/configuration/settings.rb +2 -2
- data/lib/datadog/tracing/contrib/sucker_punch/exception_handler.rb +1 -1
- data/lib/datadog/tracing/contrib/sucker_punch/ext.rb +13 -13
- data/lib/datadog/tracing/contrib/sucker_punch/instrumentation.rb +4 -4
- data/lib/datadog/tracing/contrib/sucker_punch/integration.rb +5 -5
- data/lib/datadog/tracing/contrib/sucker_punch/patcher.rb +4 -4
- data/lib/datadog/tracing/contrib/trilogy/configuration/settings.rb +3 -3
- data/lib/datadog/tracing/contrib/trilogy/ext.rb +11 -11
- data/lib/datadog/tracing/contrib/trilogy/instrumentation.rb +6 -6
- data/lib/datadog/tracing/contrib/trilogy/integration.rb +5 -5
- data/lib/datadog/tracing/contrib/trilogy/patcher.rb +2 -2
- data/lib/datadog/tracing/contrib/utils/database.rb +5 -5
- data/lib/datadog/tracing/contrib/utils/quantization/hash_formatter.rb +1 -1
- data/lib/datadog/tracing/contrib/utils/quantization/http.rb +10 -10
- data/lib/datadog/tracing/contrib/waterdrop/configuration/settings.rb +2 -2
- data/lib/datadog/tracing/contrib/waterdrop/distributed/propagation.rb +8 -8
- data/lib/datadog/tracing/contrib/waterdrop/ext.rb +4 -4
- data/lib/datadog/tracing/contrib/waterdrop/integration.rb +5 -5
- data/lib/datadog/tracing/contrib/waterdrop/middleware.rb +2 -2
- data/lib/datadog/tracing/contrib/waterdrop/patcher.rb +7 -7
- data/lib/datadog/tracing/contrib/waterdrop/producer.rb +3 -3
- data/lib/datadog/tracing/contrib/waterdrop.rb +6 -6
- data/lib/datadog/tracing/contrib.rb +54 -54
- data/lib/datadog/tracing/correlation.rb +10 -10
- data/lib/datadog/tracing/diagnostics/environment_logger.rb +9 -9
- data/lib/datadog/tracing/diagnostics/ext.rb +19 -19
- data/lib/datadog/tracing/diagnostics/health.rb +1 -1
- data/lib/datadog/tracing/distributed/b3_multi.rb +8 -8
- data/lib/datadog/tracing/distributed/b3_single.rb +4 -4
- data/lib/datadog/tracing/distributed/baggage.rb +28 -27
- data/lib/datadog/tracing/distributed/datadog.rb +21 -21
- data/lib/datadog/tracing/distributed/datadog_tags_codec.rb +3 -3
- data/lib/datadog/tracing/distributed/fetcher.rb +1 -1
- data/lib/datadog/tracing/distributed/helpers.rb +3 -3
- data/lib/datadog/tracing/distributed/propagation.rb +12 -12
- data/lib/datadog/tracing/distributed/propagation_policy.rb +5 -0
- data/lib/datadog/tracing/distributed/trace_context.rb +33 -33
- data/lib/datadog/tracing/event.rb +1 -1
- data/lib/datadog/tracing/ext.rb +9 -0
- data/lib/datadog/tracing/metadata/analytics.rb +2 -2
- data/lib/datadog/tracing/metadata/errors.rb +4 -4
- data/lib/datadog/tracing/metadata/ext.rb +69 -69
- data/lib/datadog/tracing/metadata/metastruct.rb +1 -1
- data/lib/datadog/tracing/metadata/metastruct_tagging.rb +1 -1
- data/lib/datadog/tracing/metadata/tagging.rb +2 -2
- data/lib/datadog/tracing/metadata.rb +4 -4
- data/lib/datadog/tracing/pipeline/span_filter.rb +2 -2
- data/lib/datadog/tracing/pipeline.rb +2 -2
- data/lib/datadog/tracing/remote.rb +45 -7
- data/lib/datadog/tracing/sampling/all_sampler.rb +1 -1
- data/lib/datadog/tracing/sampling/ext.rb +8 -8
- data/lib/datadog/tracing/sampling/matcher.rb +4 -4
- data/lib/datadog/tracing/sampling/priority_sampler.rb +4 -4
- data/lib/datadog/tracing/sampling/rate_by_key_sampler.rb +3 -3
- data/lib/datadog/tracing/sampling/rate_by_service_sampler.rb +2 -2
- data/lib/datadog/tracing/sampling/rate_sampler.rb +2 -2
- data/lib/datadog/tracing/sampling/rule.rb +4 -4
- data/lib/datadog/tracing/sampling/rule_sampler.rb +12 -12
- data/lib/datadog/tracing/sampling/sampler.rb +2 -2
- data/lib/datadog/tracing/sampling/span/ext.rb +3 -3
- data/lib/datadog/tracing/sampling/span/matcher.rb +2 -2
- data/lib/datadog/tracing/sampling/span/rule.rb +1 -1
- data/lib/datadog/tracing/sampling/span/rule_parser.rb +8 -8
- data/lib/datadog/tracing/span.rb +8 -8
- data/lib/datadog/tracing/span_event.rb +5 -5
- data/lib/datadog/tracing/span_operation.rb +21 -21
- data/lib/datadog/tracing/sync_writer.rb +12 -7
- data/lib/datadog/tracing/trace_operation.rb +11 -11
- data/lib/datadog/tracing/trace_segment.rb +10 -10
- data/lib/datadog/tracing/tracer.rb +23 -15
- data/lib/datadog/tracing/transport/http/client.rb +4 -4
- data/lib/datadog/tracing/transport/http/statistics.rb +2 -2
- data/lib/datadog/tracing/transport/http/traces.rb +8 -8
- data/lib/datadog/tracing/transport/http.rb +10 -10
- data/lib/datadog/tracing/transport/io/client.rb +2 -2
- data/lib/datadog/tracing/transport/io/response.rb +1 -1
- data/lib/datadog/tracing/transport/io/traces.rb +4 -4
- data/lib/datadog/tracing/transport/io.rb +3 -3
- data/lib/datadog/tracing/transport/native/response.rb +71 -0
- data/lib/datadog/tracing/transport/native.rb +363 -0
- data/lib/datadog/tracing/transport/serializable_trace.rb +19 -19
- data/lib/datadog/tracing/transport/statistics.rb +2 -2
- data/lib/datadog/tracing/transport/trace_formatter.rb +10 -10
- data/lib/datadog/tracing/transport/traces.rb +8 -8
- data/lib/datadog/tracing/utils.rb +2 -2
- data/lib/datadog/tracing/workers.rb +2 -2
- data/lib/datadog/tracing/writer.rb +21 -8
- data/lib/datadog/tracing.rb +3 -3
- data/lib/datadog/version.rb +4 -4
- data/lib/datadog.rb +13 -12
- metadata +33 -8
|
@@ -0,0 +1,974 @@
|
|
|
1
|
+
#include <ruby.h>
|
|
2
|
+
#include <ruby/thread.h>
|
|
3
|
+
#include <stdbool.h>
|
|
4
|
+
#include <datadog/data-pipeline.h>
|
|
5
|
+
#include <datadog/shared-runtime.h>
|
|
6
|
+
|
|
7
|
+
#include "datadog_ruby_common.h"
|
|
8
|
+
#include "helpers.h"
|
|
9
|
+
#include "trace_exporter.h"
|
|
10
|
+
|
|
11
|
+
/* ========================================================================
|
|
12
|
+
* Forward declarations
|
|
13
|
+
* ======================================================================== */
|
|
14
|
+
|
|
15
|
+
/* Internal: convert a Ruby Span to a Rust ddog_TracerSpan* (caller owns) */
|
|
16
|
+
static ddog_TracerSpan *convert_ruby_span_to_rust(VALUE span);
|
|
17
|
+
|
|
18
|
+
/* TracerSpan methods */
|
|
19
|
+
static VALUE _native_from_span(VALUE klass, VALUE span);
|
|
20
|
+
|
|
21
|
+
/* TraceExporter methods */
|
|
22
|
+
static VALUE _native_exporter_new(int argc, VALUE *argv, VALUE klass);
|
|
23
|
+
static VALUE _native_send_traces(VALUE self, VALUE traces);
|
|
24
|
+
static VALUE _native_before_fork(VALUE self);
|
|
25
|
+
static VALUE _native_after_fork_in_parent(VALUE self);
|
|
26
|
+
static VALUE _native_after_fork_in_child(VALUE self);
|
|
27
|
+
|
|
28
|
+
/* Response helpers */
|
|
29
|
+
static VALUE create_ok_response(long trace_count, VALUE payload);
|
|
30
|
+
static VALUE create_error_response(ddog_TraceExporterErrorCode code,
|
|
31
|
+
long trace_count);
|
|
32
|
+
|
|
33
|
+
/* GC / TypedData */
|
|
34
|
+
static void tracer_span_dfree(void *ptr);
|
|
35
|
+
static void trace_exporter_dfree(void *ptr);
|
|
36
|
+
|
|
37
|
+
/* ========================================================================
|
|
38
|
+
* Cached Ruby intern IDs
|
|
39
|
+
* ======================================================================== */
|
|
40
|
+
|
|
41
|
+
/* Instance variable IDs on Datadog::Tracing::Span */
|
|
42
|
+
static ID at_name_id;
|
|
43
|
+
static ID at_service_id;
|
|
44
|
+
static ID at_resource_id;
|
|
45
|
+
static ID at_type_id;
|
|
46
|
+
static ID at_id_id;
|
|
47
|
+
static ID at_parent_id_id;
|
|
48
|
+
static ID at_trace_id_id;
|
|
49
|
+
static ID at_start_time_id;
|
|
50
|
+
static ID at_duration_id;
|
|
51
|
+
static ID at_status_id;
|
|
52
|
+
static ID at_meta_id;
|
|
53
|
+
static ID at_metrics_id;
|
|
54
|
+
|
|
55
|
+
/* Method IDs for time / integer operations */
|
|
56
|
+
static ID id_duration_method;
|
|
57
|
+
|
|
58
|
+
/* Response class (loaded from Ruby) */
|
|
59
|
+
static VALUE response_class = Qnil;
|
|
60
|
+
static ID id_new;
|
|
61
|
+
|
|
62
|
+
/* Response keyword-argument IDs, cached to avoid re-interning per send */
|
|
63
|
+
static ID kw_ok;
|
|
64
|
+
static ID kw_internal_error;
|
|
65
|
+
static ID kw_server_error;
|
|
66
|
+
static ID kw_client_error;
|
|
67
|
+
static ID kw_trace_count;
|
|
68
|
+
static ID kw_payload;
|
|
69
|
+
|
|
70
|
+
/* ========================================================================
|
|
71
|
+
* Ruby class references (marked as GC roots)
|
|
72
|
+
* ======================================================================== */
|
|
73
|
+
|
|
74
|
+
static VALUE tracer_span_class = Qnil;
|
|
75
|
+
static VALUE trace_exporter_class = Qnil;
|
|
76
|
+
|
|
77
|
+
/* ========================================================================
|
|
78
|
+
* TypedData definitions
|
|
79
|
+
* ======================================================================== */
|
|
80
|
+
|
|
81
|
+
static const rb_data_type_t tracer_span_typed_data = {
|
|
82
|
+
.wrap_struct_name = "Datadog::Tracing::Transport::Native::TracerSpan",
|
|
83
|
+
.function = {
|
|
84
|
+
.dmark = NULL,
|
|
85
|
+
.dfree = tracer_span_dfree,
|
|
86
|
+
.dsize = NULL,
|
|
87
|
+
},
|
|
88
|
+
.flags = RUBY_TYPED_FREE_IMMEDIATELY
|
|
89
|
+
};
|
|
90
|
+
|
|
91
|
+
static void tracer_span_dfree(void *ptr) {
|
|
92
|
+
if (ptr != NULL) {
|
|
93
|
+
ddog_tracer_span_free((ddog_TracerSpan *)ptr);
|
|
94
|
+
}
|
|
95
|
+
}
|
|
96
|
+
|
|
97
|
+
/*
|
|
98
|
+
* The TraceExporter wrapper owns both the Rust exporter and the SharedRuntime
|
|
99
|
+
* that drives its background workers. Fork-safety hooks operate on the
|
|
100
|
+
* runtime, while send/receive operate on the exporter.
|
|
101
|
+
*/
|
|
102
|
+
typedef struct {
|
|
103
|
+
ddog_TraceExporter *exporter;
|
|
104
|
+
const ddog_SharedRuntime *runtime;
|
|
105
|
+
} trace_exporter_t;
|
|
106
|
+
|
|
107
|
+
static const rb_data_type_t trace_exporter_typed_data = {
|
|
108
|
+
.wrap_struct_name = "Datadog::Tracing::Transport::Native::TraceExporter",
|
|
109
|
+
.function = {
|
|
110
|
+
.dmark = NULL,
|
|
111
|
+
.dfree = trace_exporter_dfree,
|
|
112
|
+
.dsize = NULL,
|
|
113
|
+
},
|
|
114
|
+
.flags = RUBY_TYPED_FREE_IMMEDIATELY
|
|
115
|
+
};
|
|
116
|
+
|
|
117
|
+
static void trace_exporter_dfree(void *ptr) {
|
|
118
|
+
if (ptr != NULL) {
|
|
119
|
+
trace_exporter_t *wrapper = (trace_exporter_t *)ptr;
|
|
120
|
+
if (wrapper->exporter != NULL) {
|
|
121
|
+
ddog_trace_exporter_free(wrapper->exporter);
|
|
122
|
+
}
|
|
123
|
+
if (wrapper->runtime != NULL) {
|
|
124
|
+
ddog_shared_runtime_free(wrapper->runtime);
|
|
125
|
+
}
|
|
126
|
+
ruby_xfree(wrapper);
|
|
127
|
+
}
|
|
128
|
+
}
|
|
129
|
+
|
|
130
|
+
/* ========================================================================
|
|
131
|
+
* Error handling
|
|
132
|
+
* ======================================================================== */
|
|
133
|
+
|
|
134
|
+
/*
|
|
135
|
+
* If +err+ is non-NULL, copies the message, frees the error struct, and
|
|
136
|
+
* raises a Ruby RuntimeError. Does not return on error.
|
|
137
|
+
*/
|
|
138
|
+
static inline void check_exporter_error(const char *context,
|
|
139
|
+
ddog_TraceExporterError *err) {
|
|
140
|
+
if (err == NULL) return;
|
|
141
|
+
|
|
142
|
+
char buf[MAX_RAISE_MESSAGE_SIZE];
|
|
143
|
+
if (err->msg != NULL) {
|
|
144
|
+
snprintf(buf, sizeof(buf), "%s: %s", context, err->msg);
|
|
145
|
+
} else {
|
|
146
|
+
snprintf(buf, sizeof(buf), "%s: (unknown error)", context);
|
|
147
|
+
}
|
|
148
|
+
ddog_trace_exporter_error_free(err);
|
|
149
|
+
raise_error(rb_eRuntimeError, "%s", buf);
|
|
150
|
+
}
|
|
151
|
+
|
|
152
|
+
/*
|
|
153
|
+
* If +err+ is non-NULL, copies the message, frees the error struct, and
|
|
154
|
+
* raises a Ruby RuntimeError. Does not return on error.
|
|
155
|
+
*/
|
|
156
|
+
static inline void check_shared_runtime_error(const char *context,
|
|
157
|
+
ddog_SharedRuntimeFFIError *err) {
|
|
158
|
+
if (err == NULL) return;
|
|
159
|
+
|
|
160
|
+
char buf[MAX_RAISE_MESSAGE_SIZE];
|
|
161
|
+
if (err->msg != NULL) {
|
|
162
|
+
snprintf(buf, sizeof(buf), "%s: %s", context, err->msg);
|
|
163
|
+
} else {
|
|
164
|
+
snprintf(buf, sizeof(buf), "%s: (unknown error)", context);
|
|
165
|
+
}
|
|
166
|
+
ddog_shared_runtime_error_free(err);
|
|
167
|
+
raise_error(rb_eRuntimeError, "%s", buf);
|
|
168
|
+
}
|
|
169
|
+
|
|
170
|
+
/* ========================================================================
|
|
171
|
+
* Config helpers
|
|
172
|
+
* ======================================================================== */
|
|
173
|
+
|
|
174
|
+
typedef ddog_TraceExporterError *(*config_setter_fn)(
|
|
175
|
+
ddog_TraceExporterConfig *, ddog_CharSlice);
|
|
176
|
+
|
|
177
|
+
/*
|
|
178
|
+
* Set a single string-valued config field. `rb_val` MUST be a Ruby String
|
|
179
|
+
* (or nil, which is skipped): it is passed to char_slice_from_ruby_string,
|
|
180
|
+
* which enforces the String type. This helper does not handle numeric or
|
|
181
|
+
* other non-string config settings.
|
|
182
|
+
*/
|
|
183
|
+
static inline void set_config_field(
|
|
184
|
+
ddog_TraceExporterConfig *config,
|
|
185
|
+
config_setter_fn setter,
|
|
186
|
+
VALUE rb_val,
|
|
187
|
+
const char *label) {
|
|
188
|
+
if (rb_val == Qnil) return;
|
|
189
|
+
|
|
190
|
+
ddog_TraceExporterError *err =
|
|
191
|
+
setter(config, char_slice_from_ruby_string(rb_val));
|
|
192
|
+
if (err) {
|
|
193
|
+
ddog_trace_exporter_config_free(config);
|
|
194
|
+
check_exporter_error(label, err);
|
|
195
|
+
}
|
|
196
|
+
}
|
|
197
|
+
|
|
198
|
+
/* ========================================================================
|
|
199
|
+
* Conversion helpers (Ruby -> C, require the GVL)
|
|
200
|
+
* ======================================================================== */
|
|
201
|
+
|
|
202
|
+
/* Nullable Ruby String -> ddog_CharSlice (nil -> empty slice) */
|
|
203
|
+
static inline ddog_CharSlice nullable_char_slice(VALUE str) {
|
|
204
|
+
if (str == Qnil) {
|
|
205
|
+
return (ddog_CharSlice){.ptr = "", .len = 0};
|
|
206
|
+
}
|
|
207
|
+
return char_slice_from_ruby_string(str);
|
|
208
|
+
}
|
|
209
|
+
|
|
210
|
+
/* Ruby Time -> int64_t nanoseconds since Unix epoch */
|
|
211
|
+
static inline int64_t time_to_nanos(VALUE time) {
|
|
212
|
+
struct timespec ts = rb_time_timespec(time);
|
|
213
|
+
return (int64_t)ts.tv_sec * 1000000000LL + (int64_t)ts.tv_nsec;
|
|
214
|
+
}
|
|
215
|
+
|
|
216
|
+
/* 128-bit trace ID split into two 64-bit halves */
|
|
217
|
+
typedef struct {
|
|
218
|
+
uint64_t low;
|
|
219
|
+
uint64_t high;
|
|
220
|
+
} trace_id_t;
|
|
221
|
+
|
|
222
|
+
/* Ruby 128-bit Integer -> trace_id_t */
|
|
223
|
+
static inline trace_id_t split_trace_id(VALUE trace_id) {
|
|
224
|
+
/* Fast path: Fixnum fits in 63 bits, no high half */
|
|
225
|
+
if (FIXNUM_P(trace_id)) {
|
|
226
|
+
return (trace_id_t){
|
|
227
|
+
.low = (uint64_t)FIX2LONG(trace_id),
|
|
228
|
+
.high = 0,
|
|
229
|
+
};
|
|
230
|
+
}
|
|
231
|
+
|
|
232
|
+
/* Bignum path: extract raw bytes into two 64-bit words */
|
|
233
|
+
unsigned long words[2] = {0, 0};
|
|
234
|
+
rb_big_pack(trace_id, words, 2);
|
|
235
|
+
return (trace_id_t){
|
|
236
|
+
.low = (uint64_t)words[0],
|
|
237
|
+
.high = (uint64_t)words[1],
|
|
238
|
+
};
|
|
239
|
+
}
|
|
240
|
+
|
|
241
|
+
/* ========================================================================
|
|
242
|
+
* Hash iteration callbacks for meta / metrics
|
|
243
|
+
*
|
|
244
|
+
* The libdatadog setters return owned errors rather than raising. Stash the
|
|
245
|
+
* first error in a context struct and stop iteration with ST_STOP so the
|
|
246
|
+
* caller can free the still-unowned Rust span before turning the error into
|
|
247
|
+
* a Ruby exception. (This is about span ownership, not hash iteration: MRI
|
|
248
|
+
* restores rb_hash_foreach's iteration state via rb_ensure if a callback
|
|
249
|
+
* exits non-locally.)
|
|
250
|
+
* ======================================================================== */
|
|
251
|
+
|
|
252
|
+
typedef struct {
|
|
253
|
+
ddog_TracerSpan *span;
|
|
254
|
+
ddog_TraceExporterError *error; /* first error, if any */
|
|
255
|
+
long skipped; /* entries skipped due to wrong type */
|
|
256
|
+
} hash_iter_ctx;
|
|
257
|
+
|
|
258
|
+
static int meta_iter_cb(VALUE key, VALUE value, VALUE arg) {
|
|
259
|
+
hash_iter_ctx *ctx = (hash_iter_ctx *)arg;
|
|
260
|
+
|
|
261
|
+
/*
|
|
262
|
+
* The types are checked below, so build the ddog_CharSlice directly instead
|
|
263
|
+
* of repeating char_slice_from_ruby_string()'s ENFORCE_TYPE check.
|
|
264
|
+
* libdatadog copies both slices before the FFI call returns and retains no
|
|
265
|
+
* pointer into the Ruby-owned string storage.
|
|
266
|
+
*/
|
|
267
|
+
if (!RB_TYPE_P(key, T_STRING) || !RB_TYPE_P(value, T_STRING)) {
|
|
268
|
+
ctx->skipped++;
|
|
269
|
+
return ST_CONTINUE;
|
|
270
|
+
}
|
|
271
|
+
|
|
272
|
+
ddog_CharSlice ks = {.ptr = RSTRING_PTR(key), .len = RSTRING_LEN(key)};
|
|
273
|
+
ddog_CharSlice vs = {.ptr = RSTRING_PTR(value), .len = RSTRING_LEN(value)};
|
|
274
|
+
|
|
275
|
+
ddog_TraceExporterError *err = ddog_tracer_span_set_meta(ctx->span, ks, vs);
|
|
276
|
+
if (err != NULL) {
|
|
277
|
+
ctx->error = err;
|
|
278
|
+
return ST_STOP;
|
|
279
|
+
}
|
|
280
|
+
|
|
281
|
+
return ST_CONTINUE;
|
|
282
|
+
}
|
|
283
|
+
|
|
284
|
+
static int metrics_iter_cb(VALUE key, VALUE value, VALUE arg) {
|
|
285
|
+
hash_iter_ctx *ctx = (hash_iter_ctx *)arg;
|
|
286
|
+
|
|
287
|
+
if (!RB_TYPE_P(key, T_STRING) ||
|
|
288
|
+
(!RB_TYPE_P(value, T_FLOAT) && !RB_TYPE_P(value, T_FIXNUM) &&
|
|
289
|
+
!RB_TYPE_P(value, T_BIGNUM))) {
|
|
290
|
+
ctx->skipped++;
|
|
291
|
+
return ST_CONTINUE;
|
|
292
|
+
}
|
|
293
|
+
|
|
294
|
+
/* See meta_iter_cb: the key type is checked above, so build the slice
|
|
295
|
+
* directly. */
|
|
296
|
+
ddog_CharSlice ks = {.ptr = RSTRING_PTR(key), .len = RSTRING_LEN(key)};
|
|
297
|
+
|
|
298
|
+
ddog_TraceExporterError *err =
|
|
299
|
+
ddog_tracer_span_set_metric(ctx->span, ks, NUM2DBL(value));
|
|
300
|
+
if (err != NULL) {
|
|
301
|
+
ctx->error = err;
|
|
302
|
+
return ST_STOP;
|
|
303
|
+
}
|
|
304
|
+
|
|
305
|
+
return ST_CONTINUE;
|
|
306
|
+
}
|
|
307
|
+
|
|
308
|
+
/*
|
|
309
|
+
* Emit a warning while a raw ddog_TracerSpan is held.
|
|
310
|
+
*
|
|
311
|
+
* log_warning calls into Ruby (Datadog.logger.warn), which can raise or be
|
|
312
|
+
* interrupted. A non-local exit here would leak rust_span (it is not yet
|
|
313
|
+
* owned by any chunk), so run the call under rb_protect and, on a pending
|
|
314
|
+
* jump, free rust_span before re-raising with rb_jump_tag.
|
|
315
|
+
*/
|
|
316
|
+
static void log_warning_owning_span(ddog_TracerSpan *rust_span, VALUE message) {
|
|
317
|
+
int state = 0;
|
|
318
|
+
rb_protect(log_warning, message, &state);
|
|
319
|
+
if (state) {
|
|
320
|
+
ddog_tracer_span_free(rust_span);
|
|
321
|
+
rb_jump_tag(state);
|
|
322
|
+
}
|
|
323
|
+
}
|
|
324
|
+
|
|
325
|
+
/* ========================================================================
|
|
326
|
+
* Internal: convert a Ruby Span -> ddog_TracerSpan*
|
|
327
|
+
*
|
|
328
|
+
* The returned pointer is Rust-heap-allocated. Ownership is transferred
|
|
329
|
+
* to the caller (either wrap it in TypedData or push it into trace chunks).
|
|
330
|
+
* ======================================================================== */
|
|
331
|
+
|
|
332
|
+
static ddog_TracerSpan *convert_ruby_span_to_rust(VALUE span) {
|
|
333
|
+
/* 1. Read Ruby ivars */
|
|
334
|
+
VALUE rb_name = rb_ivar_get(span, at_name_id);
|
|
335
|
+
VALUE rb_service = rb_ivar_get(span, at_service_id);
|
|
336
|
+
VALUE rb_resource = rb_ivar_get(span, at_resource_id);
|
|
337
|
+
VALUE rb_type = rb_ivar_get(span, at_type_id);
|
|
338
|
+
VALUE rb_span_id = rb_ivar_get(span, at_id_id);
|
|
339
|
+
VALUE rb_parent_id = rb_ivar_get(span, at_parent_id_id);
|
|
340
|
+
VALUE rb_trace_id = rb_ivar_get(span, at_trace_id_id);
|
|
341
|
+
VALUE rb_status = rb_ivar_get(span, at_status_id);
|
|
342
|
+
|
|
343
|
+
/* 2. Convert scalars */
|
|
344
|
+
ddog_CharSlice name_s = char_slice_from_ruby_string(rb_name);
|
|
345
|
+
ddog_CharSlice service_s = nullable_char_slice(rb_service);
|
|
346
|
+
ddog_CharSlice resource_s = nullable_char_slice(rb_resource);
|
|
347
|
+
ddog_CharSlice type_s = nullable_char_slice(rb_type);
|
|
348
|
+
|
|
349
|
+
uint64_t span_id = NUM2ULL(rb_span_id);
|
|
350
|
+
uint64_t parent_id = NUM2ULL(rb_parent_id);
|
|
351
|
+
int32_t error_val = NUM2INT(rb_status);
|
|
352
|
+
|
|
353
|
+
trace_id_t trace_id = split_trace_id(rb_trace_id);
|
|
354
|
+
|
|
355
|
+
/* start (ns) */
|
|
356
|
+
int64_t start_ns = 0;
|
|
357
|
+
VALUE rb_start_time = rb_ivar_get(span, at_start_time_id);
|
|
358
|
+
if (rb_start_time != Qnil) {
|
|
359
|
+
start_ns = time_to_nanos(rb_start_time);
|
|
360
|
+
}
|
|
361
|
+
|
|
362
|
+
/* duration (ns) */
|
|
363
|
+
int64_t duration_ns = 0;
|
|
364
|
+
VALUE rb_duration_ivar = rb_ivar_get(span, at_duration_id);
|
|
365
|
+
if (rb_duration_ivar != Qnil) {
|
|
366
|
+
duration_ns = (int64_t)(NUM2DBL(rb_duration_ivar) * 1e9);
|
|
367
|
+
} else {
|
|
368
|
+
VALUE dur = rb_funcall(span, id_duration_method, 0);
|
|
369
|
+
if (dur != Qnil) duration_ns = (int64_t)(NUM2DBL(dur) * 1e9);
|
|
370
|
+
}
|
|
371
|
+
|
|
372
|
+
/* 3. Create Rust span */
|
|
373
|
+
ddog_TracerSpanFields fields = {
|
|
374
|
+
.service = service_s,
|
|
375
|
+
.name = name_s,
|
|
376
|
+
.resource = resource_s,
|
|
377
|
+
.span_type = type_s,
|
|
378
|
+
.trace_id_low = trace_id.low,
|
|
379
|
+
.trace_id_high = trace_id.high,
|
|
380
|
+
.span_id = span_id,
|
|
381
|
+
.parent_id = parent_id,
|
|
382
|
+
.start = start_ns,
|
|
383
|
+
.duration = duration_ns,
|
|
384
|
+
.error = error_val,
|
|
385
|
+
};
|
|
386
|
+
|
|
387
|
+
ddog_TracerSpan *rust_span = NULL;
|
|
388
|
+
ddog_TraceExporterError *err = ddog_tracer_span_new(&rust_span, &fields);
|
|
389
|
+
check_exporter_error("Failed to create TracerSpan", err);
|
|
390
|
+
|
|
391
|
+
/* 4. Populate meta and metrics */
|
|
392
|
+
hash_iter_ctx ctx = {.span = rust_span, .error = NULL, .skipped = 0};
|
|
393
|
+
|
|
394
|
+
VALUE rb_meta = rb_ivar_get(span, at_meta_id);
|
|
395
|
+
if (RB_TYPE_P(rb_meta, T_HASH) && RHASH_SIZE(rb_meta) > 0) {
|
|
396
|
+
rb_hash_foreach(rb_meta, meta_iter_cb, (VALUE)&ctx);
|
|
397
|
+
if (ctx.error != NULL) {
|
|
398
|
+
ddog_tracer_span_free(rust_span);
|
|
399
|
+
check_exporter_error("Failed to set span meta", ctx.error);
|
|
400
|
+
}
|
|
401
|
+
if (ctx.skipped > 0) {
|
|
402
|
+
log_warning_owning_span(rust_span, rb_sprintf(
|
|
403
|
+
"Native trace exporter: skipped %ld non-string meta entries",
|
|
404
|
+
ctx.skipped));
|
|
405
|
+
ctx.skipped = 0;
|
|
406
|
+
}
|
|
407
|
+
}
|
|
408
|
+
|
|
409
|
+
VALUE rb_metrics = rb_ivar_get(span, at_metrics_id);
|
|
410
|
+
if (RB_TYPE_P(rb_metrics, T_HASH) && RHASH_SIZE(rb_metrics) > 0) {
|
|
411
|
+
rb_hash_foreach(rb_metrics, metrics_iter_cb, (VALUE)&ctx);
|
|
412
|
+
if (ctx.error != NULL) {
|
|
413
|
+
ddog_tracer_span_free(rust_span);
|
|
414
|
+
check_exporter_error("Failed to set span metric", ctx.error);
|
|
415
|
+
}
|
|
416
|
+
if (ctx.skipped > 0) {
|
|
417
|
+
log_warning_owning_span(rust_span, rb_sprintf(
|
|
418
|
+
"Native trace exporter: skipped %ld non-numeric metrics entries",
|
|
419
|
+
ctx.skipped));
|
|
420
|
+
}
|
|
421
|
+
}
|
|
422
|
+
|
|
423
|
+
return rust_span;
|
|
424
|
+
}
|
|
425
|
+
|
|
426
|
+
/* ========================================================================
|
|
427
|
+
* TracerSpan._native_from_span
|
|
428
|
+
* ======================================================================== */
|
|
429
|
+
|
|
430
|
+
static VALUE _native_from_span(DDTRACE_UNUSED VALUE klass, VALUE span) {
|
|
431
|
+
ddog_TracerSpan *rust_span = convert_ruby_span_to_rust(span);
|
|
432
|
+
return TypedData_Wrap_Struct(tracer_span_class, &tracer_span_typed_data,
|
|
433
|
+
rust_span);
|
|
434
|
+
}
|
|
435
|
+
|
|
436
|
+
/* ========================================================================
|
|
437
|
+
* Response class helpers
|
|
438
|
+
* ======================================================================== */
|
|
439
|
+
|
|
440
|
+
/*
|
|
441
|
+
* Build an error response, classifying the error code into the
|
|
442
|
+
* Transport::Response categories:
|
|
443
|
+
*
|
|
444
|
+
* HTTP_CLIENT -> client_error? (4xx family)
|
|
445
|
+
* HTTP_SERVER -> server_error? (5xx family)
|
|
446
|
+
* everything else -> internal_error?
|
|
447
|
+
*/
|
|
448
|
+
static VALUE create_error_response(ddog_TraceExporterErrorCode code,
|
|
449
|
+
long trace_count) {
|
|
450
|
+
VALUE kwargs = rb_hash_new();
|
|
451
|
+
rb_hash_aset(kwargs, ID2SYM(kw_ok), Qfalse);
|
|
452
|
+
rb_hash_aset(kwargs, ID2SYM(kw_internal_error), (code != DDOG_TRACE_EXPORTER_ERROR_CODE_HTTP_CLIENT &&
|
|
453
|
+
code != DDOG_TRACE_EXPORTER_ERROR_CODE_HTTP_SERVER) ? Qtrue : Qfalse);
|
|
454
|
+
rb_hash_aset(kwargs, ID2SYM(kw_server_error), code == DDOG_TRACE_EXPORTER_ERROR_CODE_HTTP_SERVER ? Qtrue : Qfalse);
|
|
455
|
+
rb_hash_aset(kwargs, ID2SYM(kw_client_error), code == DDOG_TRACE_EXPORTER_ERROR_CODE_HTTP_CLIENT ? Qtrue : Qfalse);
|
|
456
|
+
rb_hash_aset(kwargs, ID2SYM(kw_trace_count), LONG2NUM(trace_count));
|
|
457
|
+
return rb_funcallv_kw(response_class, id_new, 1, &kwargs, RB_PASS_KEYWORDS);
|
|
458
|
+
}
|
|
459
|
+
|
|
460
|
+
/*
|
|
461
|
+
* Build a success response, optionally carrying the agent's response body
|
|
462
|
+
* as +payload+.
|
|
463
|
+
*
|
|
464
|
+
* +payload+ is the raw HTTP response body returned by the Datadog Agent
|
|
465
|
+
* (typically JSON containing +rate_by_service+). It is surfaced here so
|
|
466
|
+
* that callers matching the +Datadog::Core::Transport::Response+ interface
|
|
467
|
+
* can parse service sampling rates, just as the Net::HTTP transport does.
|
|
468
|
+
*/
|
|
469
|
+
static VALUE create_ok_response(long trace_count, VALUE payload) {
|
|
470
|
+
VALUE kwargs = rb_hash_new();
|
|
471
|
+
rb_hash_aset(kwargs, ID2SYM(kw_ok), Qtrue);
|
|
472
|
+
rb_hash_aset(kwargs, ID2SYM(kw_trace_count), LONG2NUM(trace_count));
|
|
473
|
+
rb_hash_aset(kwargs, ID2SYM(kw_payload), payload);
|
|
474
|
+
return rb_funcallv_kw(response_class, id_new, 1, &kwargs, RB_PASS_KEYWORDS);
|
|
475
|
+
}
|
|
476
|
+
|
|
477
|
+
/* ========================================================================
|
|
478
|
+
* TraceExporter._native_new
|
|
479
|
+
*
|
|
480
|
+
* Creates a Rust TraceExporter with the given configuration.
|
|
481
|
+
*
|
|
482
|
+
* Ruby signature:
|
|
483
|
+
* TraceExporter._native_new(
|
|
484
|
+
* url:, tracer_version: nil, language: nil, language_version: nil,
|
|
485
|
+
* language_interpreter: nil, hostname: nil, env: nil,
|
|
486
|
+
* service: nil, version: nil) -> TraceExporter
|
|
487
|
+
*
|
|
488
|
+
* +url+ is required (String). All other arguments may be nil.
|
|
489
|
+
* ======================================================================== */
|
|
490
|
+
|
|
491
|
+
static VALUE _native_exporter_new(
|
|
492
|
+
int argc, VALUE *argv, DDTRACE_UNUSED VALUE klass
|
|
493
|
+
) {
|
|
494
|
+
VALUE options;
|
|
495
|
+
rb_scan_args(argc, argv, "0:", &options);
|
|
496
|
+
if (options == Qnil) options = rb_hash_new();
|
|
497
|
+
|
|
498
|
+
VALUE rb_url = rb_hash_fetch(options, ID2SYM(rb_intern("url")));
|
|
499
|
+
VALUE rb_tracer_version = rb_hash_fetch(options, ID2SYM(rb_intern("tracer_version")));
|
|
500
|
+
VALUE rb_language = rb_hash_fetch(options, ID2SYM(rb_intern("language")));
|
|
501
|
+
VALUE rb_language_version = rb_hash_fetch(options, ID2SYM(rb_intern("language_version")));
|
|
502
|
+
VALUE rb_language_interpreter = rb_hash_fetch(options, ID2SYM(rb_intern("language_interpreter")));
|
|
503
|
+
VALUE rb_hostname = rb_hash_fetch(options, ID2SYM(rb_intern("hostname")));
|
|
504
|
+
VALUE rb_env = rb_hash_fetch(options, ID2SYM(rb_intern("env")));
|
|
505
|
+
VALUE rb_service = rb_hash_fetch(options, ID2SYM(rb_intern("service")));
|
|
506
|
+
VALUE rb_version = rb_hash_fetch(options, ID2SYM(rb_intern("version")));
|
|
507
|
+
|
|
508
|
+
/* Phase 1: validate types (may raise, no Rust resources yet) */
|
|
509
|
+
ENFORCE_TYPE(rb_url, T_STRING);
|
|
510
|
+
if (rb_tracer_version != Qnil) ENFORCE_TYPE(rb_tracer_version, T_STRING);
|
|
511
|
+
if (rb_language != Qnil) ENFORCE_TYPE(rb_language, T_STRING);
|
|
512
|
+
if (rb_language_version != Qnil) ENFORCE_TYPE(rb_language_version, T_STRING);
|
|
513
|
+
if (rb_language_interpreter != Qnil) ENFORCE_TYPE(rb_language_interpreter, T_STRING);
|
|
514
|
+
if (rb_hostname != Qnil) ENFORCE_TYPE(rb_hostname, T_STRING);
|
|
515
|
+
if (rb_env != Qnil) ENFORCE_TYPE(rb_env, T_STRING);
|
|
516
|
+
if (rb_service != Qnil) ENFORCE_TYPE(rb_service, T_STRING);
|
|
517
|
+
if (rb_version != Qnil) ENFORCE_TYPE(rb_version, T_STRING);
|
|
518
|
+
|
|
519
|
+
/* Phase 2: create config (cleanup on error) */
|
|
520
|
+
ddog_TraceExporterConfig *config = NULL;
|
|
521
|
+
ddog_trace_exporter_config_new(&config);
|
|
522
|
+
|
|
523
|
+
/*
|
|
524
|
+
* Create a SharedRuntime and attach it to the config before building the
|
|
525
|
+
* exporter. The exporter holds a clone of the runtime's Arc; we keep our
|
|
526
|
+
* own handle in the wrapper to drive fork-safety hooks and to free it when
|
|
527
|
+
* the exporter is collected.
|
|
528
|
+
*/
|
|
529
|
+
const ddog_SharedRuntime *runtime = NULL;
|
|
530
|
+
ddog_SharedRuntimeFFIError *rt_err = ddog_shared_runtime_new(&runtime);
|
|
531
|
+
if (rt_err != NULL) {
|
|
532
|
+
ddog_trace_exporter_config_free(config);
|
|
533
|
+
check_shared_runtime_error("Failed to create SharedRuntime", rt_err);
|
|
534
|
+
}
|
|
535
|
+
|
|
536
|
+
/*
|
|
537
|
+
* Const asymmetry: ddog_shared_runtime_new yields a `const ddog_SharedRuntime *`
|
|
538
|
+
* but the setter takes a non-const pointer. The setter only clones the Arc,
|
|
539
|
+
* so casting away const here is safe.
|
|
540
|
+
*/
|
|
541
|
+
{
|
|
542
|
+
ddog_TraceExporterError *attach_err = ddog_trace_exporter_config_set_shared_runtime(
|
|
543
|
+
config, (ddog_SharedRuntime *)runtime);
|
|
544
|
+
if (attach_err != NULL) {
|
|
545
|
+
ddog_trace_exporter_config_free(config);
|
|
546
|
+
ddog_shared_runtime_free(runtime);
|
|
547
|
+
check_exporter_error("Failed to attach SharedRuntime to config", attach_err);
|
|
548
|
+
}
|
|
549
|
+
}
|
|
550
|
+
|
|
551
|
+
set_config_field(config, ddog_trace_exporter_config_set_url, rb_url, "url");
|
|
552
|
+
set_config_field(config, ddog_trace_exporter_config_set_tracer_version, rb_tracer_version, "tracer_version");
|
|
553
|
+
set_config_field(config, ddog_trace_exporter_config_set_language, rb_language, "language");
|
|
554
|
+
set_config_field(config, ddog_trace_exporter_config_set_lang_version, rb_language_version, "language_version");
|
|
555
|
+
set_config_field(config, ddog_trace_exporter_config_set_lang_interpreter, rb_language_interpreter, "language_interpreter");
|
|
556
|
+
set_config_field(config, ddog_trace_exporter_config_set_hostname, rb_hostname, "hostname");
|
|
557
|
+
set_config_field(config, ddog_trace_exporter_config_set_env, rb_env, "env");
|
|
558
|
+
set_config_field(config, ddog_trace_exporter_config_set_service, rb_service, "service");
|
|
559
|
+
set_config_field(config, ddog_trace_exporter_config_set_version, rb_version, "version");
|
|
560
|
+
|
|
561
|
+
/* Phase 3: build the exporter from the config */
|
|
562
|
+
ddog_TraceExporter *exporter = NULL;
|
|
563
|
+
ddog_TraceExporterError *err = ddog_trace_exporter_new(&exporter, config);
|
|
564
|
+
ddog_trace_exporter_config_free(config);
|
|
565
|
+
config = NULL;
|
|
566
|
+
|
|
567
|
+
if (err) {
|
|
568
|
+
ddog_shared_runtime_free(runtime);
|
|
569
|
+
check_exporter_error("Failed to create TraceExporter", err);
|
|
570
|
+
}
|
|
571
|
+
|
|
572
|
+
trace_exporter_t *wrapper = ruby_xmalloc(sizeof(trace_exporter_t));
|
|
573
|
+
wrapper->exporter = exporter;
|
|
574
|
+
wrapper->runtime = runtime;
|
|
575
|
+
|
|
576
|
+
return TypedData_Wrap_Struct(trace_exporter_class, &trace_exporter_typed_data,
|
|
577
|
+
wrapper);
|
|
578
|
+
}
|
|
579
|
+
|
|
580
|
+
/* ========================================================================
|
|
581
|
+
* Fork safety hooks
|
|
582
|
+
*
|
|
583
|
+
* These coordinate the tokio runtime lifecycle around process forks
|
|
584
|
+
* (Puma, Unicorn, Passenger).
|
|
585
|
+
* ======================================================================== */
|
|
586
|
+
|
|
587
|
+
static VALUE _native_before_fork(VALUE self) {
|
|
588
|
+
trace_exporter_t *wrapper;
|
|
589
|
+
TypedData_Get_Struct(self, trace_exporter_t, &trace_exporter_typed_data, wrapper);
|
|
590
|
+
if (wrapper == NULL || wrapper->runtime == NULL) {
|
|
591
|
+
raise_error(rb_eRuntimeError, "TraceExporter has not been initialized or was already freed");
|
|
592
|
+
}
|
|
593
|
+
ddog_SharedRuntimeFFIError *err = ddog_shared_runtime_before_fork(wrapper->runtime);
|
|
594
|
+
check_shared_runtime_error("Failed to prepare for fork", err);
|
|
595
|
+
return Qnil;
|
|
596
|
+
}
|
|
597
|
+
|
|
598
|
+
static VALUE _native_after_fork_in_parent(VALUE self) {
|
|
599
|
+
trace_exporter_t *wrapper;
|
|
600
|
+
TypedData_Get_Struct(self, trace_exporter_t, &trace_exporter_typed_data, wrapper);
|
|
601
|
+
if (wrapper == NULL || wrapper->runtime == NULL) {
|
|
602
|
+
raise_error(rb_eRuntimeError, "TraceExporter has not been initialized or was already freed");
|
|
603
|
+
}
|
|
604
|
+
ddog_SharedRuntimeFFIError *err = ddog_shared_runtime_after_fork_parent(wrapper->runtime);
|
|
605
|
+
check_shared_runtime_error("Failed to restore after fork in parent", err);
|
|
606
|
+
return Qnil;
|
|
607
|
+
}
|
|
608
|
+
|
|
609
|
+
static VALUE _native_after_fork_in_child(VALUE self) {
|
|
610
|
+
trace_exporter_t *wrapper;
|
|
611
|
+
TypedData_Get_Struct(self, trace_exporter_t, &trace_exporter_typed_data, wrapper);
|
|
612
|
+
if (wrapper == NULL || wrapper->runtime == NULL) {
|
|
613
|
+
raise_error(rb_eRuntimeError, "TraceExporter has not been initialized or was already freed");
|
|
614
|
+
}
|
|
615
|
+
ddog_SharedRuntimeFFIError *err = ddog_shared_runtime_after_fork_child(wrapper->runtime);
|
|
616
|
+
check_shared_runtime_error("Failed to restore after fork in child", err);
|
|
617
|
+
return Qnil;
|
|
618
|
+
}
|
|
619
|
+
|
|
620
|
+
/* ========================================================================
|
|
621
|
+
* GVL-release helper for ddog_trace_exporter_send_trace_chunks
|
|
622
|
+
*
|
|
623
|
+
* The send call performs blocking network I/O. Releasing the GVL lets
|
|
624
|
+
* other Ruby threads (application code, test mock servers, etc.) run
|
|
625
|
+
* while we wait for the agent's response.
|
|
626
|
+
* ======================================================================== */
|
|
627
|
+
|
|
628
|
+
typedef struct {
|
|
629
|
+
const ddog_TraceExporter *exporter;
|
|
630
|
+
ddog_TracerTraceChunks *chunks;
|
|
631
|
+
ddog_TraceExporterResponse *response;
|
|
632
|
+
ddog_TraceExporterCancelToken *cancel_token; /* borrowed, not owned */
|
|
633
|
+
ddog_TraceExporterErrorCode error_code;
|
|
634
|
+
bool failed;
|
|
635
|
+
bool send_ran;
|
|
636
|
+
} send_chunks_args_t;
|
|
637
|
+
|
|
638
|
+
static void *send_chunks_without_gvl(void *data) {
|
|
639
|
+
send_chunks_args_t *args = (send_chunks_args_t *)data;
|
|
640
|
+
ddog_TraceExporterError *err = ddog_trace_exporter_send_trace_chunks(
|
|
641
|
+
args->exporter, args->chunks, &args->response, args->cancel_token);
|
|
642
|
+
if (err != NULL) {
|
|
643
|
+
args->error_code = err->code;
|
|
644
|
+
args->failed = true;
|
|
645
|
+
ddog_trace_exporter_error_free(err);
|
|
646
|
+
}
|
|
647
|
+
args->send_ran = true;
|
|
648
|
+
return NULL;
|
|
649
|
+
}
|
|
650
|
+
|
|
651
|
+
/*
|
|
652
|
+
* Unblock function: cooperatively cancel an in-flight send.
|
|
653
|
+
*
|
|
654
|
+
* Called by Ruby when an interrupt (Thread#kill, shutdown) fires while
|
|
655
|
+
* the thread is inside rb_thread_call_without_gvl2. Cancelling the
|
|
656
|
+
* token causes the Rust HTTP pipeline to abort the in-flight request
|
|
657
|
+
* and return promptly, which is not possible with RUBY_UBF_IO's
|
|
658
|
+
* signal-based approach.
|
|
659
|
+
*/
|
|
660
|
+
static void interrupt_exporter_call(void *cancel_token) {
|
|
661
|
+
ddog_trace_exporter_cancel_token_cancel(
|
|
662
|
+
(const ddog_TraceExporterCancelToken *)cancel_token);
|
|
663
|
+
}
|
|
664
|
+
|
|
665
|
+
/*
|
|
666
|
+
* Check for a pending Ruby exception without raising it.
|
|
667
|
+
* Mirrors the profiling extension's check_if_pending_exception().
|
|
668
|
+
*/
|
|
669
|
+
static VALUE process_pending_interruptions(DDTRACE_UNUSED VALUE _) {
|
|
670
|
+
rb_thread_check_ints();
|
|
671
|
+
return Qnil;
|
|
672
|
+
}
|
|
673
|
+
|
|
674
|
+
__attribute__((warn_unused_result))
|
|
675
|
+
static int check_if_pending_exception(void) {
|
|
676
|
+
int pending_exception;
|
|
677
|
+
rb_protect(process_pending_interruptions, Qnil, &pending_exception);
|
|
678
|
+
return pending_exception;
|
|
679
|
+
}
|
|
680
|
+
|
|
681
|
+
/* ========================================================================
|
|
682
|
+
* TraceExporter#_native_send_traces
|
|
683
|
+
*
|
|
684
|
+
* Ruby signature:
|
|
685
|
+
* exporter._native_send_traces(traces) -> Array[Response]
|
|
686
|
+
*
|
|
687
|
+
* +traces+ is an Array of Arrays of Spans:
|
|
688
|
+
* [[span, span, ...], [span, ...], ...]
|
|
689
|
+
*
|
|
690
|
+
* Each inner array maps to one trace chunk (Vec<Span> in Rust).
|
|
691
|
+
*
|
|
692
|
+
* On success returns [Response(ok: true, trace_count: N)].
|
|
693
|
+
* On error returns [Response(ok: false, ...)].
|
|
694
|
+
*
|
|
695
|
+
* The chunk-building loop calls into Ruby (ENFORCE_TYPE,
|
|
696
|
+
* convert_ruby_span_to_rust) which may raise. We use rb_ensure so
|
|
697
|
+
* that the Rust-allocated chunks are freed if an exception fires
|
|
698
|
+
* before the send consumes them.
|
|
699
|
+
* ======================================================================== */
|
|
700
|
+
|
|
701
|
+
/* Context shared between the body and ensure callbacks. */
|
|
702
|
+
typedef struct {
|
|
703
|
+
const ddog_TraceExporter *exporter;
|
|
704
|
+
VALUE traces;
|
|
705
|
+
long trace_count;
|
|
706
|
+
ddog_TracerTraceChunks *chunks; /* NULL after send consumes it */
|
|
707
|
+
} send_traces_ctx;
|
|
708
|
+
|
|
709
|
+
/*
|
|
710
|
+
* Body: build trace chunks from Ruby spans, then send them.
|
|
711
|
+
* Passed to rb_ensure as the "try" block.
|
|
712
|
+
*/
|
|
713
|
+
static VALUE build_and_send_traces(VALUE arg) {
|
|
714
|
+
send_traces_ctx *ctx = (send_traces_ctx *)arg;
|
|
715
|
+
|
|
716
|
+
for (long i = 0; i < ctx->trace_count; i++) {
|
|
717
|
+
VALUE chunk_spans = rb_ary_entry(ctx->traces, i);
|
|
718
|
+
ENFORCE_TYPE(chunk_spans, T_ARRAY);
|
|
719
|
+
|
|
720
|
+
long span_count = RARRAY_LEN(chunk_spans);
|
|
721
|
+
/* Propagate a begin_chunk failure instead of swallowing it: continuing
|
|
722
|
+
* would build an incomplete payload and still report success. rb_ensure
|
|
723
|
+
* frees chunks on the raise. Today this only fails for an absurd
|
|
724
|
+
* span_count, but a future libdatadog change (e.g. a fallible allocator)
|
|
725
|
+
* could make it reachable. */
|
|
726
|
+
ddog_TraceExporterError *begin_err =
|
|
727
|
+
ddog_tracer_trace_chunks_begin_chunk(ctx->chunks, (size_t)span_count);
|
|
728
|
+
check_exporter_error("Failed to begin trace chunk", begin_err);
|
|
729
|
+
for (long j = 0; j < span_count; j++) {
|
|
730
|
+
VALUE rb_span = rb_ary_entry(chunk_spans, j);
|
|
731
|
+
|
|
732
|
+
/* convert_ruby_span_to_rust may raise (type errors, etc.).
|
|
733
|
+
* rb_ensure guarantees chunks is freed in that case. */
|
|
734
|
+
ddog_TracerSpan *rust_span = convert_ruby_span_to_rust(rb_span);
|
|
735
|
+
|
|
736
|
+
/* push_span consumes rust_span (ownership transferred to chunks).
|
|
737
|
+
* The error path should be unreachable: push only fails if no chunk was
|
|
738
|
+
* started (we always call begin_chunk above) or if the handle is NULL.
|
|
739
|
+
* Raise rather than swallow, so that if a future libdatadog change makes
|
|
740
|
+
* it reachable we find out loudly instead of silently sending a
|
|
741
|
+
* truncated chunk. rb_ensure frees chunks on the raise. */
|
|
742
|
+
ddog_TraceExporterError *push_err =
|
|
743
|
+
ddog_tracer_trace_chunks_push_span(ctx->chunks, rust_span);
|
|
744
|
+
check_exporter_error("Failed to push span into trace chunk", push_err);
|
|
745
|
+
}
|
|
746
|
+
}
|
|
747
|
+
|
|
748
|
+
/*
|
|
749
|
+
* Send with the GVL released so other Ruby threads run during I/O.
|
|
750
|
+
*
|
|
751
|
+
* Custom behaviour of this call site:
|
|
752
|
+
* - We use the gvl2 variant precisely because it does NOT auto-raise a
|
|
753
|
+
* pending interrupt on return: the send consumes chunks and allocates
|
|
754
|
+
* a Rust response, so we must inspect/free those before letting any
|
|
755
|
+
* exception propagate (otherwise they leak).
|
|
756
|
+
* - The unblock function cancels a per-send cancellation token, which
|
|
757
|
+
* cooperatively aborts the in-flight Rust HTTP request (RUBY_UBF_IO
|
|
758
|
+
* could not cancel the Rust pipeline).
|
|
759
|
+
* - An interrupt can make gvl2 return before send_chunks_without_gvl
|
|
760
|
+
* runs, so we loop until the send actually executes or an exception
|
|
761
|
+
* is pending.
|
|
762
|
+
*/
|
|
763
|
+
ddog_TraceExporterCancelToken *cancel_token =
|
|
764
|
+
ddog_trace_exporter_cancel_token_new();
|
|
765
|
+
|
|
766
|
+
send_chunks_args_t args = {
|
|
767
|
+
.exporter = ctx->exporter,
|
|
768
|
+
.chunks = ctx->chunks,
|
|
769
|
+
.response = NULL,
|
|
770
|
+
.cancel_token = cancel_token,
|
|
771
|
+
.failed = false,
|
|
772
|
+
.send_ran = false,
|
|
773
|
+
};
|
|
774
|
+
|
|
775
|
+
int pending_exception = 0;
|
|
776
|
+
while (!args.send_ran && !pending_exception) {
|
|
777
|
+
rb_thread_call_without_gvl2(
|
|
778
|
+
send_chunks_without_gvl, &args,
|
|
779
|
+
interrupt_exporter_call, cancel_token);
|
|
780
|
+
|
|
781
|
+
if (!args.send_ran) {
|
|
782
|
+
pending_exception = check_if_pending_exception();
|
|
783
|
+
}
|
|
784
|
+
}
|
|
785
|
+
|
|
786
|
+
ddog_trace_exporter_cancel_token_drop(cancel_token);
|
|
787
|
+
/* Only null chunks when the send actually ran and consumed them.
|
|
788
|
+
* If an interrupt fired before the send executed, chunks are still
|
|
789
|
+
* live and the ensure handler must free them. */
|
|
790
|
+
if (args.send_ran) {
|
|
791
|
+
ctx->chunks = NULL;
|
|
792
|
+
}
|
|
793
|
+
|
|
794
|
+
/* Extract the response body as a Ruby string before freeing. */
|
|
795
|
+
VALUE payload = Qnil;
|
|
796
|
+
if (args.response != NULL) {
|
|
797
|
+
ddog_ByteSlice body =
|
|
798
|
+
ddog_trace_exporter_response_get_body(args.response);
|
|
799
|
+
if (body.len > 0) {
|
|
800
|
+
payload = rb_str_new((const char *)body.ptr, (long)body.len);
|
|
801
|
+
}
|
|
802
|
+
ddog_trace_exporter_response_free(args.response);
|
|
803
|
+
args.response = NULL;
|
|
804
|
+
}
|
|
805
|
+
|
|
806
|
+
/*
|
|
807
|
+
* Re-check for a pending interrupt unconditionally before deciding the
|
|
808
|
+
* outcome. In a race, the unblock function (interrupt_exporter_call) can
|
|
809
|
+
* fire -- cancelling the token -- while the send still completes, so
|
|
810
|
+
* rb_thread_call_without_gvl2 returns with args.send_ran == true. In that
|
|
811
|
+
* case the loop above exits without ever calling check_if_pending_exception(),
|
|
812
|
+
* leaving the interrupt pending. If we did not check here, the cancelled
|
|
813
|
+
* send would fall through and be reported as an ordinary transport error
|
|
814
|
+
* response, swallowing the interrupt (e.g. Thread#kill / shutdown).
|
|
815
|
+
*
|
|
816
|
+
* This runs after the response has already been extracted and freed and
|
|
817
|
+
* after chunks have been handed off to the ensure handler, so re-raising
|
|
818
|
+
* here leaks nothing.
|
|
819
|
+
*/
|
|
820
|
+
if (!pending_exception) {
|
|
821
|
+
pending_exception = check_if_pending_exception();
|
|
822
|
+
}
|
|
823
|
+
if (pending_exception) {
|
|
824
|
+
rb_jump_tag(pending_exception);
|
|
825
|
+
}
|
|
826
|
+
|
|
827
|
+
if (args.failed) {
|
|
828
|
+
VALUE err_resp = create_error_response(args.error_code, ctx->trace_count);
|
|
829
|
+
return rb_ary_new_from_args(1, err_resp);
|
|
830
|
+
}
|
|
831
|
+
|
|
832
|
+
VALUE ok_resp = create_ok_response(ctx->trace_count, payload);
|
|
833
|
+
return rb_ary_new_from_args(1, ok_resp);
|
|
834
|
+
}
|
|
835
|
+
|
|
836
|
+
/*
|
|
837
|
+
* Ensure: free chunks if they haven't been consumed by the send yet.
|
|
838
|
+
* This runs whether build_and_send_traces returned normally or raised.
|
|
839
|
+
*/
|
|
840
|
+
static VALUE free_chunks_if_needed(VALUE arg) {
|
|
841
|
+
send_traces_ctx *ctx = (send_traces_ctx *)arg;
|
|
842
|
+
if (ctx->chunks != NULL) {
|
|
843
|
+
ddog_tracer_trace_chunks_free(ctx->chunks);
|
|
844
|
+
ctx->chunks = NULL;
|
|
845
|
+
}
|
|
846
|
+
return Qnil;
|
|
847
|
+
}
|
|
848
|
+
|
|
849
|
+
static VALUE _native_send_traces(VALUE self, VALUE traces) {
|
|
850
|
+
ENFORCE_TYPE(traces, T_ARRAY);
|
|
851
|
+
|
|
852
|
+
trace_exporter_t *wrapper;
|
|
853
|
+
TypedData_Get_Struct(self, trace_exporter_t, &trace_exporter_typed_data,
|
|
854
|
+
wrapper);
|
|
855
|
+
if (wrapper == NULL || wrapper->exporter == NULL) {
|
|
856
|
+
raise_error(rb_eRuntimeError,
|
|
857
|
+
"TraceExporter has not been initialized or was already freed");
|
|
858
|
+
}
|
|
859
|
+
|
|
860
|
+
long trace_count = RARRAY_LEN(traces);
|
|
861
|
+
|
|
862
|
+
/* Empty batch -> empty response (matches existing transport behaviour) */
|
|
863
|
+
if (trace_count == 0) {
|
|
864
|
+
return rb_ary_new();
|
|
865
|
+
}
|
|
866
|
+
|
|
867
|
+
/* Allocate trace chunks */
|
|
868
|
+
ddog_TracerTraceChunks *chunks = NULL;
|
|
869
|
+
ddog_TraceExporterError *chunks_err =
|
|
870
|
+
ddog_tracer_trace_chunks_new((size_t)trace_count, &chunks);
|
|
871
|
+
if (chunks_err != NULL) {
|
|
872
|
+
ddog_trace_exporter_error_free(chunks_err);
|
|
873
|
+
raise_error(rb_eRuntimeError, "Failed to allocate trace chunks");
|
|
874
|
+
}
|
|
875
|
+
|
|
876
|
+
send_traces_ctx ctx = {
|
|
877
|
+
.exporter = wrapper->exporter,
|
|
878
|
+
.traces = traces,
|
|
879
|
+
.trace_count = trace_count,
|
|
880
|
+
.chunks = chunks,
|
|
881
|
+
};
|
|
882
|
+
|
|
883
|
+
return rb_ensure(
|
|
884
|
+
build_and_send_traces, (VALUE)&ctx,
|
|
885
|
+
free_chunks_if_needed, (VALUE)&ctx);
|
|
886
|
+
}
|
|
887
|
+
|
|
888
|
+
/* ========================================================================
|
|
889
|
+
* Initialization
|
|
890
|
+
* ======================================================================== */
|
|
891
|
+
|
|
892
|
+
void trace_exporter_init(VALUE tracing_module) {
|
|
893
|
+
/* -- Module hierarchy -- */
|
|
894
|
+
VALUE transport_module = rb_define_module_under(tracing_module, "Transport");
|
|
895
|
+
VALUE native_module =
|
|
896
|
+
rb_define_module_under(transport_module, "Native");
|
|
897
|
+
|
|
898
|
+
/* ----------------------------------------------------------------
|
|
899
|
+
* TracerSpan class
|
|
900
|
+
* ---------------------------------------------------------------- */
|
|
901
|
+
tracer_span_class =
|
|
902
|
+
rb_define_class_under(native_module, "TracerSpan", rb_cObject);
|
|
903
|
+
rb_undef_alloc_func(tracer_span_class);
|
|
904
|
+
|
|
905
|
+
/* Factory */
|
|
906
|
+
rb_define_singleton_method(tracer_span_class, "_native_from_span",
|
|
907
|
+
_native_from_span, 1);
|
|
908
|
+
|
|
909
|
+
/* ----------------------------------------------------------------
|
|
910
|
+
* TraceExporter class
|
|
911
|
+
* ---------------------------------------------------------------- */
|
|
912
|
+
trace_exporter_class =
|
|
913
|
+
rb_define_class_under(native_module, "TraceExporter", rb_cObject);
|
|
914
|
+
rb_undef_alloc_func(trace_exporter_class);
|
|
915
|
+
|
|
916
|
+
/* Factory: _native_new(url:, tracer_version:, ...) */
|
|
917
|
+
rb_define_singleton_method(trace_exporter_class, "_native_new",
|
|
918
|
+
_native_exporter_new, -1);
|
|
919
|
+
|
|
920
|
+
/* Instance: _native_send_traces(traces) -> Array[Response] */
|
|
921
|
+
rb_define_method(trace_exporter_class, "_native_send_traces",
|
|
922
|
+
_native_send_traces, 1);
|
|
923
|
+
|
|
924
|
+
/* Instance: fork safety hooks */
|
|
925
|
+
rb_define_method(trace_exporter_class, "_native_before_fork",
|
|
926
|
+
_native_before_fork, 0);
|
|
927
|
+
rb_define_method(trace_exporter_class, "_native_after_fork_in_parent",
|
|
928
|
+
_native_after_fork_in_parent, 0);
|
|
929
|
+
rb_define_method(trace_exporter_class, "_native_after_fork_in_child",
|
|
930
|
+
_native_after_fork_in_child, 0);
|
|
931
|
+
|
|
932
|
+
/* ----------------------------------------------------------------
|
|
933
|
+
* Response class (defined in Ruby, loaded lazily)
|
|
934
|
+
*
|
|
935
|
+
* We resolve it here so create_ok_response / create_error_response
|
|
936
|
+
* can call Response.new without repeated const lookups.
|
|
937
|
+
* ---------------------------------------------------------------- */
|
|
938
|
+
rb_require("datadog/tracing/transport/native/response");
|
|
939
|
+
response_class =
|
|
940
|
+
rb_const_get(native_module, rb_intern("Response"));
|
|
941
|
+
rb_global_variable(&response_class);
|
|
942
|
+
|
|
943
|
+
/* ----------------------------------------------------------------
|
|
944
|
+
* Cache Ruby intern IDs
|
|
945
|
+
* ---------------------------------------------------------------- */
|
|
946
|
+
|
|
947
|
+
/* Span ivars */
|
|
948
|
+
at_name_id = rb_intern("@name");
|
|
949
|
+
at_service_id = rb_intern("@service");
|
|
950
|
+
at_resource_id = rb_intern("@resource");
|
|
951
|
+
at_type_id = rb_intern("@type");
|
|
952
|
+
at_id_id = rb_intern("@id");
|
|
953
|
+
at_parent_id_id = rb_intern("@parent_id");
|
|
954
|
+
at_trace_id_id = rb_intern("@trace_id");
|
|
955
|
+
at_start_time_id = rb_intern("@start_time");
|
|
956
|
+
at_duration_id = rb_intern("@duration");
|
|
957
|
+
at_status_id = rb_intern("@status");
|
|
958
|
+
at_meta_id = rb_intern("@meta");
|
|
959
|
+
at_metrics_id = rb_intern("@metrics");
|
|
960
|
+
|
|
961
|
+
/* Methods */
|
|
962
|
+
id_duration_method = rb_intern("duration");
|
|
963
|
+
|
|
964
|
+
/* Response.new */
|
|
965
|
+
id_new = rb_intern("new");
|
|
966
|
+
|
|
967
|
+
/* Response keyword-argument IDs */
|
|
968
|
+
kw_ok = rb_intern("ok");
|
|
969
|
+
kw_internal_error = rb_intern("internal_error");
|
|
970
|
+
kw_server_error = rb_intern("server_error");
|
|
971
|
+
kw_client_error = rb_intern("client_error");
|
|
972
|
+
kw_trace_count = rb_intern("trace_count");
|
|
973
|
+
kw_payload = rb_intern("payload");
|
|
974
|
+
}
|