datadog 2.21.0 → 2.38.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 +574 -1
- data/ext/LIBDATADOG_DEVELOPMENT.md +3 -0
- data/ext/datadog_profiling_native_extension/clock_id.h +9 -1
- data/ext/datadog_profiling_native_extension/clock_id_from_mach.c +66 -0
- data/ext/datadog_profiling_native_extension/clock_id_from_pthread.c +3 -2
- data/ext/datadog_profiling_native_extension/collectors_cpu_and_wall_time_worker.c +301 -82
- data/ext/datadog_profiling_native_extension/collectors_discrete_dynamic_sampler.c +4 -4
- data/ext/datadog_profiling_native_extension/collectors_gc_profiling_helper.c +3 -2
- data/ext/datadog_profiling_native_extension/collectors_idle_sampling_helper.c +18 -4
- data/ext/datadog_profiling_native_extension/collectors_stack.c +63 -32
- data/ext/datadog_profiling_native_extension/collectors_stack.h +7 -2
- data/ext/datadog_profiling_native_extension/collectors_thread_context.c +728 -436
- data/ext/datadog_profiling_native_extension/collectors_thread_context.h +19 -6
- data/ext/datadog_profiling_native_extension/crashtracking_runtime_stacks.c +239 -0
- data/ext/datadog_profiling_native_extension/datadog_ruby_common.c +65 -1
- data/ext/datadog_profiling_native_extension/datadog_ruby_common.h +40 -1
- data/ext/datadog_profiling_native_extension/encoded_profile.c +2 -1
- data/ext/datadog_profiling_native_extension/extconf.rb +41 -37
- data/ext/datadog_profiling_native_extension/gvl_profiling_helper.c +4 -43
- data/ext/datadog_profiling_native_extension/gvl_profiling_helper.h +15 -47
- data/ext/datadog_profiling_native_extension/heap_recorder.c +252 -103
- data/ext/datadog_profiling_native_extension/heap_recorder.h +12 -1
- data/ext/datadog_profiling_native_extension/http_transport.c +66 -68
- data/ext/datadog_profiling_native_extension/libdatadog_helpers.c +3 -22
- data/ext/datadog_profiling_native_extension/libdatadog_helpers.h +0 -5
- data/ext/datadog_profiling_native_extension/macos_sampler_thread.h +55 -0
- data/ext/datadog_profiling_native_extension/native_extension_helpers.rb +0 -13
- data/ext/datadog_profiling_native_extension/private_vm_api_access.c +40 -43
- data/ext/datadog_profiling_native_extension/private_vm_api_access.h +6 -0
- data/ext/datadog_profiling_native_extension/profiling.c +65 -19
- data/ext/datadog_profiling_native_extension/ruby_helpers.c +63 -46
- data/ext/datadog_profiling_native_extension/ruby_helpers.h +17 -5
- data/ext/datadog_profiling_native_extension/setup_signal_handler.c +32 -10
- data/ext/datadog_profiling_native_extension/setup_signal_handler.h +2 -1
- data/ext/datadog_profiling_native_extension/stack_recorder.c +110 -85
- data/ext/datadog_profiling_native_extension/stack_recorder.h +3 -1
- data/ext/datadog_profiling_native_extension/time_helpers.h +13 -7
- data/ext/datadog_profiling_native_extension/unsafe_api_calls_check.c +2 -1
- data/ext/datadog_profiling_native_extension/unsafe_api_calls_check.h +9 -4
- data/ext/libdatadog_api/crashtracker.c +16 -15
- data/ext/libdatadog_api/crashtracker_report_exception.c +126 -0
- data/ext/libdatadog_api/datadog_ruby_common.c +65 -1
- data/ext/libdatadog_api/datadog_ruby_common.h +40 -1
- data/ext/libdatadog_api/ddsketch.c +102 -0
- data/ext/libdatadog_api/di.c +203 -0
- data/ext/libdatadog_api/extconf.rb +18 -24
- data/ext/libdatadog_api/feature_flags.c +554 -0
- data/ext/libdatadog_api/feature_flags.h +5 -0
- data/ext/libdatadog_api/helpers.h +27 -0
- data/ext/libdatadog_api/init.c +13 -1
- data/ext/libdatadog_api/library_config.c +34 -25
- data/ext/libdatadog_api/process_discovery.c +19 -13
- data/ext/libdatadog_extconf_helpers.rb +94 -11
- data/lib/datadog/ai_guard/api_client.rb +84 -0
- data/lib/datadog/ai_guard/autoload.rb +10 -0
- data/lib/datadog/ai_guard/component.rb +44 -0
- data/lib/datadog/ai_guard/configuration/ext.rb +17 -0
- data/lib/datadog/ai_guard/configuration.rb +115 -0
- data/lib/datadog/ai_guard/contrib/auto_instrument.rb +24 -0
- data/lib/datadog/ai_guard/contrib/integration.rb +37 -0
- data/lib/datadog/ai_guard/contrib/rack/integration.rb +42 -0
- data/lib/datadog/ai_guard/contrib/rack/patcher.rb +26 -0
- data/lib/datadog/ai_guard/contrib/rack/request_middleware.rb +97 -0
- data/lib/datadog/ai_guard/contrib/rails/integration.rb +41 -0
- data/lib/datadog/ai_guard/contrib/rails/patcher.rb +97 -0
- data/lib/datadog/ai_guard/contrib/ruby_llm/chat_instrumentation.rb +80 -0
- data/lib/datadog/ai_guard/contrib/ruby_llm/integration.rb +41 -0
- data/lib/datadog/ai_guard/contrib/ruby_llm/patcher.rb +30 -0
- data/lib/datadog/ai_guard/evaluation/content_builder.rb +31 -0
- data/lib/datadog/ai_guard/evaluation/content_part.rb +36 -0
- data/lib/datadog/ai_guard/evaluation/message.rb +25 -0
- data/lib/datadog/ai_guard/evaluation/no_op_result.rb +36 -0
- data/lib/datadog/ai_guard/evaluation/request.rb +86 -0
- data/lib/datadog/ai_guard/evaluation/result.rb +45 -0
- data/lib/datadog/ai_guard/evaluation/tool_call.rb +18 -0
- data/lib/datadog/ai_guard/evaluation.rb +108 -0
- data/lib/datadog/ai_guard/ext.rb +29 -0
- data/lib/datadog/ai_guard.rb +181 -0
- data/lib/datadog/appsec/api_security/endpoint_collection/grape_route_serializer.rb +26 -0
- data/lib/datadog/appsec/api_security/endpoint_collection/rails_collector.rb +66 -0
- data/lib/datadog/appsec/api_security/endpoint_collection/rails_route_serializer.rb +36 -0
- data/lib/datadog/appsec/api_security/endpoint_collection/sinatra_route_serializer.rb +26 -0
- data/lib/datadog/appsec/api_security/endpoint_collection.rb +10 -0
- data/lib/datadog/appsec/api_security/route_extractor.rb +38 -9
- data/lib/datadog/appsec/api_security/sampler.rb +7 -4
- data/lib/datadog/appsec/assets/blocked.html +10 -1
- data/lib/datadog/appsec/assets/blocked.json +1 -1
- data/lib/datadog/appsec/assets/blocked.text +3 -1
- data/lib/datadog/appsec/assets/waf_rules/README.md +30 -36
- data/lib/datadog/appsec/assets/waf_rules/recommended.json +359 -4
- data/lib/datadog/appsec/assets/waf_rules/strict.json +43 -2
- data/lib/datadog/appsec/assets.rb +1 -1
- data/lib/datadog/appsec/autoload.rb +1 -1
- data/lib/datadog/appsec/component.rb +16 -9
- data/lib/datadog/appsec/compressed_json.rb +3 -3
- data/lib/datadog/appsec/configuration.rb +427 -1
- data/lib/datadog/appsec/context.rb +51 -13
- data/lib/datadog/appsec/contrib/active_record/instrumentation.rb +3 -1
- data/lib/datadog/appsec/contrib/active_record/integration.rb +1 -1
- data/lib/datadog/appsec/contrib/active_record/patcher.rb +4 -1
- data/lib/datadog/appsec/contrib/aws_lambda/gateway/watcher.rb +75 -0
- data/lib/datadog/appsec/contrib/aws_lambda/integration.rb +39 -0
- data/lib/datadog/appsec/contrib/aws_lambda/patcher.rb +30 -0
- data/lib/datadog/appsec/contrib/aws_lambda/waf_addresses.rb +144 -0
- data/lib/datadog/appsec/contrib/devise/integration.rb +1 -1
- data/lib/datadog/appsec/contrib/devise/patches/signin_tracking_patch.rb +2 -1
- data/lib/datadog/appsec/contrib/excon/integration.rb +1 -1
- data/lib/datadog/appsec/contrib/excon/patcher.rb +3 -1
- data/lib/datadog/appsec/contrib/excon/ssrf_detection_middleware.rb +152 -12
- data/lib/datadog/appsec/contrib/faraday/integration.rb +1 -1
- data/lib/datadog/appsec/contrib/faraday/patcher.rb +1 -1
- data/lib/datadog/appsec/contrib/faraday/ssrf_detection_middleware.rb +138 -12
- data/lib/datadog/appsec/contrib/graphql/gateway/multiplex.rb +74 -24
- data/lib/datadog/appsec/contrib/graphql/gateway/watcher.rb +4 -2
- data/lib/datadog/appsec/contrib/graphql/integration.rb +2 -1
- data/lib/datadog/appsec/contrib/rack/buffered_input.rb +83 -0
- data/lib/datadog/appsec/contrib/rack/ext.rb +1 -1
- data/lib/datadog/appsec/contrib/rack/gateway/request.rb +52 -13
- data/lib/datadog/appsec/contrib/rack/gateway/watcher.rb +40 -19
- data/lib/datadog/appsec/contrib/rack/input_peeker.rb +79 -0
- data/lib/datadog/appsec/contrib/rack/integration.rb +1 -1
- data/lib/datadog/appsec/contrib/rack/request_middleware.rb +48 -33
- data/lib/datadog/appsec/contrib/rack/response_body.rb +36 -0
- data/lib/datadog/appsec/contrib/rails/gateway/request.rb +40 -1
- data/lib/datadog/appsec/contrib/rails/gateway/watcher.rb +26 -5
- data/lib/datadog/appsec/contrib/rails/integration.rb +1 -1
- data/lib/datadog/appsec/contrib/rails/patcher.rb +38 -0
- data/lib/datadog/appsec/contrib/rails/patches/process_action_patch.rb +2 -0
- data/lib/datadog/appsec/contrib/rest_client/integration.rb +1 -1
- data/lib/datadog/appsec/contrib/rest_client/patcher.rb +3 -1
- data/lib/datadog/appsec/contrib/rest_client/request_ssrf_detection_patch.rb +167 -11
- data/lib/datadog/appsec/contrib/sinatra/gateway/watcher.rb +43 -13
- data/lib/datadog/appsec/contrib/sinatra/integration.rb +1 -1
- data/lib/datadog/appsec/contrib/sinatra/patcher.rb +4 -4
- data/lib/datadog/appsec/contrib/sinatra/patches/json_patch.rb +1 -1
- data/lib/datadog/appsec/counter_sampler.rb +25 -0
- data/lib/datadog/appsec/default_header_tags.rb +52 -0
- data/lib/datadog/appsec/event.rb +13 -31
- data/lib/datadog/appsec/ext.rb +3 -0
- data/lib/datadog/appsec/instrumentation/gateway/middleware.rb +2 -3
- data/lib/datadog/appsec/instrumentation/gateway.rb +2 -15
- data/lib/datadog/appsec/metrics/collector.rb +43 -5
- data/lib/datadog/appsec/metrics/exporter.rb +16 -3
- data/lib/datadog/appsec/metrics/telemetry.rb +20 -3
- data/lib/datadog/appsec/metrics/telemetry_exporter.rb +20 -1
- data/lib/datadog/appsec/metrics.rb +5 -5
- data/lib/datadog/appsec/monitor/gateway/watcher.rb +8 -6
- data/lib/datadog/appsec/remote.rb +44 -29
- data/lib/datadog/appsec/response.rb +18 -4
- 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 +26 -5
- data/lib/datadog/appsec/security_engine/result.rb +29 -9
- data/lib/datadog/appsec/security_engine/runner.rb +20 -10
- data/lib/datadog/appsec/security_event.rb +5 -7
- data/lib/datadog/appsec/trace_keeper.rb +18 -6
- data/lib/datadog/appsec/utils/http/body.rb +38 -0
- data/lib/datadog/appsec/utils/http/body_reader.rb +61 -0
- data/lib/datadog/appsec/utils/http/media_range.rb +2 -1
- data/lib/datadog/appsec/utils/http/media_type.rb +32 -26
- data/lib/datadog/appsec/utils/http/url_encoded.rb +52 -0
- data/lib/datadog/appsec.rb +6 -3
- data/lib/datadog/core/configuration/agentless_settings_resolver.rb +2 -2
- data/lib/datadog/core/configuration/base.rb +17 -5
- data/lib/datadog/core/configuration/components.rb +185 -17
- data/lib/datadog/core/configuration/components_state.rb +6 -1
- data/lib/datadog/core/configuration/config_helper.rb +11 -2
- data/lib/datadog/core/configuration/deprecations.rb +2 -2
- data/lib/datadog/core/configuration/option.rb +32 -6
- data/lib/datadog/core/configuration/option_definition.rb +42 -14
- data/lib/datadog/core/configuration/options.rb +49 -12
- data/lib/datadog/core/configuration/settings.rb +115 -16
- data/lib/datadog/core/configuration/stable_config.rb +10 -0
- data/lib/datadog/core/configuration/supported_configurations.rb +379 -300
- data/lib/datadog/core/configuration.rb +3 -3
- data/lib/datadog/core/contrib/rails/railtie.rb +32 -0
- data/lib/datadog/core/contrib/rails/utils.rb +7 -3
- data/lib/datadog/core/crashtracking/component.rb +73 -21
- data/lib/datadog/core/crashtracking/tag_builder.rb +6 -0
- data/lib/datadog/core/ddsketch.rb +19 -0
- data/lib/datadog/core/diagnostics/environment_logger.rb +3 -1
- data/lib/datadog/core/environment/agent_info.rb +65 -1
- data/lib/datadog/core/environment/cgroup.rb +52 -25
- data/lib/datadog/core/environment/container.rb +140 -46
- data/lib/datadog/core/environment/ext.rb +13 -0
- data/lib/datadog/core/environment/identity.rb +40 -4
- data/lib/datadog/core/environment/process.rb +122 -0
- data/lib/datadog/core/environment/socket.rb +13 -0
- data/lib/datadog/core/environment/yjit.rb +2 -1
- data/lib/datadog/core/error.rb +6 -6
- data/lib/datadog/core/evp.rb +11 -0
- data/lib/datadog/core/feature_flags.rb +61 -0
- data/lib/datadog/core/knuth_sampler.rb +59 -0
- data/lib/datadog/core/logger.rb +1 -1
- data/lib/datadog/core/metrics/client.rb +6 -6
- data/lib/datadog/core/metrics/logging.rb +1 -1
- data/lib/datadog/core/pin.rb +8 -8
- data/lib/datadog/core/process_discovery.rb +21 -18
- data/lib/datadog/core/rate_limiter.rb +11 -1
- data/lib/datadog/core/remote/client/capabilities.rb +49 -6
- data/lib/datadog/core/remote/client.rb +15 -7
- data/lib/datadog/core/remote/component.rb +64 -36
- data/lib/datadog/core/remote/configuration/content.rb +15 -2
- data/lib/datadog/core/remote/configuration/digest.rb +14 -7
- data/lib/datadog/core/remote/configuration/repository.rb +1 -1
- data/lib/datadog/core/remote/configuration/target.rb +13 -6
- data/lib/datadog/core/remote/transport/config.rb +9 -36
- data/lib/datadog/core/remote/transport/http/config.rb +15 -55
- data/lib/datadog/core/remote/transport/http/negotiation.rb +14 -44
- data/lib/datadog/core/remote/transport/http.rb +15 -24
- data/lib/datadog/core/remote/transport/negotiation.rb +8 -33
- data/lib/datadog/core/remote/worker.rb +25 -37
- data/lib/datadog/core/runtime/metrics.rb +11 -2
- data/lib/datadog/core/semaphore.rb +1 -4
- data/lib/datadog/core/tag_builder.rb +0 -4
- data/lib/datadog/core/tag_normalizer.rb +84 -0
- data/lib/datadog/core/telemetry/component.rb +59 -15
- data/lib/datadog/core/telemetry/emitter.rb +6 -6
- data/lib/datadog/core/telemetry/event/app_client_configuration_change.rb +2 -3
- data/lib/datadog/core/telemetry/event/app_endpoints_loaded.rb +30 -0
- data/lib/datadog/core/telemetry/event/app_extended_heartbeat.rb +32 -0
- data/lib/datadog/core/telemetry/event/app_started.rb +177 -171
- data/lib/datadog/core/telemetry/event/synth_app_client_configuration_change.rb +27 -4
- data/lib/datadog/core/telemetry/event.rb +2 -7
- data/lib/datadog/core/telemetry/ext.rb +1 -0
- data/lib/datadog/core/telemetry/logger.rb +4 -2
- data/lib/datadog/core/telemetry/logging.rb +17 -5
- data/lib/datadog/core/telemetry/metrics_manager.rb +9 -0
- data/lib/datadog/core/telemetry/request.rb +17 -5
- data/lib/datadog/core/telemetry/transport/http/telemetry.rb +8 -34
- data/lib/datadog/core/telemetry/transport/http.rb +21 -16
- data/lib/datadog/core/telemetry/transport/telemetry.rb +8 -17
- data/lib/datadog/core/telemetry/worker.rb +108 -32
- data/lib/datadog/core/transport/ext.rb +3 -0
- data/lib/datadog/core/transport/http/api/endpoint.rb +9 -4
- data/lib/datadog/core/transport/http/api/instance.rb +4 -21
- data/lib/datadog/core/transport/http/builder.rb +10 -6
- data/lib/datadog/core/transport/http/client.rb +80 -0
- data/lib/datadog/core/transport/http/response.rb +4 -0
- data/lib/datadog/core/transport/http.rb +24 -19
- data/lib/datadog/core/transport/parcel.rb +61 -9
- data/lib/datadog/core/transport/response.rb +16 -2
- data/lib/datadog/core/transport/transport.rb +90 -0
- data/lib/datadog/core/utils/at_fork_monkey_patch.rb +2 -2
- data/lib/datadog/core/utils/{base64.rb → base64_codec.rb} +4 -3
- data/lib/datadog/core/utils/enumerable_compat.rb +29 -0
- data/lib/datadog/core/utils/fnv.rb +26 -0
- data/lib/datadog/core/utils/forking.rb +3 -1
- data/lib/datadog/core/utils/hash.rb +0 -23
- data/lib/datadog/{appsec/api_security → core/utils}/lru_cache.rb +10 -21
- data/lib/datadog/core/utils/network.rb +22 -1
- data/lib/datadog/core/utils/only_once.rb +1 -1
- data/lib/datadog/core/utils/only_once_successful.rb +8 -2
- data/lib/datadog/core/utils/safe_dup.rb +2 -2
- data/lib/datadog/core/utils/sequence.rb +2 -0
- data/lib/datadog/core/utils/spawn_monkey_patch.rb +68 -0
- data/lib/datadog/core/utils/time.rb +6 -2
- data/lib/datadog/core/utils.rb +3 -1
- data/lib/datadog/core/workers/async.rb +11 -2
- data/lib/datadog/core/workers/interval_loop.rb +51 -3
- data/lib/datadog/core/workers/polling.rb +2 -0
- data/lib/datadog/core/workers/queue.rb +96 -1
- data/lib/datadog/core/workers/runtime_metrics.rb +9 -1
- data/lib/datadog/core.rb +10 -3
- data/lib/datadog/data_streams/configuration.rb +50 -0
- data/lib/datadog/data_streams/ext.rb +11 -0
- data/lib/datadog/data_streams/extensions.rb +16 -0
- data/lib/datadog/data_streams/pathway_context.rb +169 -0
- data/lib/datadog/data_streams/processor.rb +511 -0
- data/lib/datadog/data_streams/transport/http/stats.rb +58 -0
- data/lib/datadog/data_streams/transport/http.rb +36 -0
- data/lib/datadog/data_streams/transport/stats.rb +39 -0
- data/lib/datadog/data_streams.rb +100 -0
- data/lib/datadog/di/base.rb +15 -7
- data/lib/datadog/di/boot.rb +7 -2
- 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 +217 -15
- data/lib/datadog/di/component.rb +139 -51
- data/lib/datadog/di/configuration.rb +241 -2
- data/lib/datadog/di/context.rb +82 -0
- data/lib/datadog/di/contrib/active_record.rb +34 -5
- data/lib/datadog/di/el/compiler.rb +168 -0
- data/lib/datadog/di/el/evaluator.rb +159 -0
- data/lib/datadog/di/el/expression.rb +42 -0
- data/lib/datadog/di/el.rb +5 -0
- data/lib/datadog/di/error.rb +44 -0
- data/lib/datadog/di/fatal_exceptions.rb +26 -0
- data/lib/datadog/di/instrumenter.rb +623 -147
- data/lib/datadog/di/logger.rb +2 -2
- data/lib/datadog/di/probe.rb +122 -14
- data/lib/datadog/di/probe_builder.rb +124 -3
- 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 +195 -100
- data/lib/datadog/di/probe_notification_builder.rb +321 -90
- data/lib/datadog/di/probe_notifier_worker.rb +112 -36
- data/lib/datadog/di/probe_repository.rb +198 -0
- data/lib/datadog/di/proc_responder.rb +36 -0
- data/lib/datadog/di/redactor.rb +24 -2
- data/lib/datadog/di/remote.rb +258 -93
- data/lib/datadog/di/serializer.rb +310 -29
- data/lib/datadog/di/transport/diagnostics.rb +12 -42
- data/lib/datadog/di/transport/http/diagnostics.rb +4 -34
- data/lib/datadog/di/transport/http/input.rb +2 -34
- data/lib/datadog/di/transport/http.rb +43 -19
- data/lib/datadog/di/transport/input.rb +112 -38
- data/lib/datadog/di/utils.rb +42 -14
- data/lib/datadog/di.rb +204 -4
- data/lib/datadog/error_tracking/collector.rb +2 -1
- data/lib/datadog/error_tracking/component.rb +2 -2
- data/lib/datadog/error_tracking/configuration.rb +55 -2
- data/lib/datadog/error_tracking/filters.rb +2 -2
- data/lib/datadog/kit/appsec/events/v2.rb +60 -3
- data/lib/datadog/kit/enable_core_dumps.rb +1 -1
- data/lib/datadog/kit/tracing/method_tracer.rb +135 -0
- data/lib/datadog/open_feature/component.rb +100 -0
- data/lib/datadog/open_feature/configuration.rb +37 -0
- data/lib/datadog/open_feature/evaluation_engine.rb +70 -0
- data/lib/datadog/open_feature/exposures/batch_builder.rb +32 -0
- data/lib/datadog/open_feature/exposures/buffer.rb +43 -0
- data/lib/datadog/open_feature/exposures/deduplicator.rb +30 -0
- data/lib/datadog/open_feature/exposures/event.rb +60 -0
- data/lib/datadog/open_feature/exposures/reporter.rb +40 -0
- data/lib/datadog/open_feature/exposures/worker.rb +116 -0
- data/lib/datadog/open_feature/ext.rb +16 -0
- 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 +101 -0
- data/lib/datadog/open_feature/hooks/flag_eval_metrics_hook.rb +49 -0
- data/lib/datadog/open_feature/metrics/flag_eval_metrics.rb +149 -0
- data/lib/datadog/open_feature/native_evaluator.rb +60 -0
- data/lib/datadog/open_feature/noop_evaluator.rb +26 -0
- data/lib/datadog/open_feature/provider.rb +191 -0
- data/lib/datadog/open_feature/remote.rb +67 -0
- data/lib/datadog/open_feature/resolution_details.rb +35 -0
- data/lib/datadog/open_feature/transport.rb +121 -0
- data/lib/datadog/open_feature.rb +19 -0
- data/lib/datadog/opentelemetry/api/baggage.rb +1 -1
- data/lib/datadog/opentelemetry/configuration/settings.rb +226 -0
- data/lib/datadog/opentelemetry/ext.rb +9 -0
- data/lib/datadog/opentelemetry/logs.rb +98 -0
- data/lib/datadog/opentelemetry/metrics.rb +90 -0
- data/lib/datadog/opentelemetry/sdk/configurator.rb +65 -1
- data/lib/datadog/opentelemetry/sdk/id_generator.rb +16 -10
- data/lib/datadog/opentelemetry/sdk/logs_exporter.rb +30 -0
- data/lib/datadog/opentelemetry/sdk/metrics_exporter.rb +28 -0
- data/lib/datadog/opentelemetry/sdk/propagator.rb +9 -3
- data/lib/datadog/opentelemetry/sdk/span_processor.rb +4 -1
- data/lib/datadog/opentelemetry/sdk.rb +19 -0
- data/lib/datadog/opentelemetry/signal_configuration.rb +53 -0
- data/lib/datadog/opentelemetry.rb +4 -0
- data/lib/datadog/profiling/collectors/code_provenance.rb +71 -12
- data/lib/datadog/profiling/collectors/cpu_and_wall_time_worker.rb +52 -4
- data/lib/datadog/profiling/collectors/idle_sampling_helper.rb +13 -5
- data/lib/datadog/profiling/collectors/info.rb +18 -4
- data/lib/datadog/profiling/collectors/thread_context.rb +10 -5
- data/lib/datadog/profiling/component.rb +82 -40
- data/lib/datadog/profiling/exporter.rb +41 -12
- data/lib/datadog/profiling/ext/dir_monkey_patches.rb +24 -5
- data/lib/datadog/profiling/ext/exec_monkey_patch.rb +32 -0
- data/lib/datadog/profiling/ext.rb +0 -2
- data/lib/datadog/profiling/flush.rb +23 -11
- data/lib/datadog/profiling/http_transport.rb +21 -8
- data/lib/datadog/profiling/load_native_extension.rb +2 -2
- data/lib/datadog/profiling/profiler.rb +31 -14
- data/lib/datadog/profiling/scheduler.rb +10 -9
- data/lib/datadog/profiling/stack_recorder.rb +0 -8
- data/lib/datadog/profiling/tag_builder.rb +37 -3
- data/lib/datadog/profiling/tasks/exec.rb +8 -3
- data/lib/datadog/profiling/tasks/help.rb +1 -0
- data/lib/datadog/profiling/tasks/setup.rb +2 -2
- data/lib/datadog/profiling.rb +1 -3
- data/lib/datadog/ruby_version.rb +25 -0
- data/lib/datadog/single_step_instrument.rb +2 -2
- data/lib/datadog/symbol_database/component.rb +734 -0
- data/lib/datadog/symbol_database/configuration.rb +73 -0
- data/lib/datadog/symbol_database/extensions.rb +19 -0
- data/lib/datadog/symbol_database/extractor.rb +1110 -0
- data/lib/datadog/symbol_database/file_hash.rb +48 -0
- data/lib/datadog/symbol_database/logger.rb +43 -0
- data/lib/datadog/symbol_database/remote.rb +180 -0
- data/lib/datadog/symbol_database/scope.rb +102 -0
- data/lib/datadog/symbol_database/scope_batcher.rb +292 -0
- data/lib/datadog/symbol_database/service_version.rb +66 -0
- data/lib/datadog/symbol_database/symbol.rb +69 -0
- data/lib/datadog/symbol_database/transport/http/endpoint.rb +28 -0
- data/lib/datadog/symbol_database/transport/http.rb +45 -0
- data/lib/datadog/symbol_database/transport.rb +54 -0
- data/lib/datadog/symbol_database/uploader.rb +230 -0
- data/lib/datadog/symbol_database.rb +71 -0
- data/lib/datadog/tracing/buffer.rb +3 -3
- data/lib/datadog/tracing/component.rb +17 -17
- data/lib/datadog/tracing/configuration/dynamic.rb +2 -2
- data/lib/datadog/tracing/configuration/ext.rb +22 -0
- data/lib/datadog/tracing/configuration/settings.rb +96 -4
- data/lib/datadog/tracing/contrib/action_cable/events/broadcast.rb +4 -1
- data/lib/datadog/tracing/contrib/action_cable/events/perform_action.rb +4 -1
- data/lib/datadog/tracing/contrib/action_cable/events/transmit.rb +4 -1
- data/lib/datadog/tracing/contrib/action_cable/instrumentation.rb +4 -1
- data/lib/datadog/tracing/contrib/action_mailer/event.rb +4 -1
- data/lib/datadog/tracing/contrib/action_pack/action_controller/instrumentation.rb +10 -7
- data/lib/datadog/tracing/contrib/action_pack/action_dispatch/instrumentation.rb +28 -0
- data/lib/datadog/tracing/contrib/action_pack/action_dispatch/patcher.rb +3 -1
- data/lib/datadog/tracing/contrib/action_pack/utils.rb +1 -2
- data/lib/datadog/tracing/contrib/action_view/events/render_partial.rb +4 -1
- data/lib/datadog/tracing/contrib/action_view/events/render_template.rb +5 -2
- data/lib/datadog/tracing/contrib/active_job/data_streams.rb +62 -0
- data/lib/datadog/tracing/contrib/active_job/events/discard.rb +5 -2
- data/lib/datadog/tracing/contrib/active_job/events/enqueue.rb +5 -2
- data/lib/datadog/tracing/contrib/active_job/events/enqueue_at.rb +5 -2
- data/lib/datadog/tracing/contrib/active_job/events/enqueue_retry.rb +5 -2
- data/lib/datadog/tracing/contrib/active_job/events/perform.rb +5 -2
- data/lib/datadog/tracing/contrib/active_job/events/retry_stopped.rb +5 -2
- data/lib/datadog/tracing/contrib/active_job/log_injection.rb +21 -7
- data/lib/datadog/tracing/contrib/active_job/patcher.rb +17 -1
- data/lib/datadog/tracing/contrib/active_model_serializers/events/render.rb +1 -1
- data/lib/datadog/tracing/contrib/active_model_serializers/events/serialize.rb +3 -4
- data/lib/datadog/tracing/contrib/active_record/configuration/resolver.rb +2 -2
- data/lib/datadog/tracing/contrib/active_record/events/instantiation.rb +1 -1
- data/lib/datadog/tracing/contrib/active_record/events/sql.rb +2 -5
- data/lib/datadog/tracing/contrib/active_record/utils.rb +1 -1
- data/lib/datadog/tracing/contrib/active_support/cache/events/cache.rb +2 -5
- data/lib/datadog/tracing/contrib/active_support/cache/instrumentation.rb +1 -4
- data/lib/datadog/tracing/contrib/active_support/notifications/subscription.rb +2 -2
- data/lib/datadog/tracing/contrib/aws/instrumentation.rb +6 -8
- data/lib/datadog/tracing/contrib/component.rb +3 -3
- data/lib/datadog/tracing/contrib/configurable.rb +18 -3
- data/lib/datadog/tracing/contrib/configuration/resolver.rb +14 -4
- data/lib/datadog/tracing/contrib/dalli/instrumentation.rb +1 -5
- data/lib/datadog/tracing/contrib/dalli/integration.rb +4 -1
- data/lib/datadog/tracing/contrib/dalli/quantize.rb +1 -1
- data/lib/datadog/tracing/contrib/delayed_job/plugin.rb +2 -0
- data/lib/datadog/tracing/contrib/delayed_job/server_internal_tracer/worker.rb +1 -0
- data/lib/datadog/tracing/contrib/elasticsearch/patcher.rb +2 -6
- data/lib/datadog/tracing/contrib/elasticsearch/quantize.rb +2 -2
- data/lib/datadog/tracing/contrib/ethon/configuration/settings.rb +5 -1
- data/lib/datadog/tracing/contrib/ethon/easy_patch.rb +5 -6
- data/lib/datadog/tracing/contrib/ethon/ext.rb +1 -0
- data/lib/datadog/tracing/contrib/ethon/multi_patch.rb +1 -8
- data/lib/datadog/tracing/contrib/excon/configuration/settings.rb +16 -5
- data/lib/datadog/tracing/contrib/excon/ext.rb +1 -0
- data/lib/datadog/tracing/contrib/excon/middleware.rb +3 -7
- data/lib/datadog/tracing/contrib/ext.rb +3 -1
- data/lib/datadog/tracing/contrib/extensions.rb +19 -2
- data/lib/datadog/tracing/contrib/faraday/configuration/settings.rb +16 -9
- data/lib/datadog/tracing/contrib/faraday/ext.rb +1 -0
- data/lib/datadog/tracing/contrib/faraday/middleware.rb +3 -7
- data/lib/datadog/tracing/contrib/grape/configuration/settings.rb +7 -3
- data/lib/datadog/tracing/contrib/grape/endpoint.rb +10 -7
- data/lib/datadog/tracing/contrib/grape/instrumentation.rb +13 -8
- data/lib/datadog/tracing/contrib/grape/patcher.rb +6 -1
- data/lib/datadog/tracing/contrib/graphql/configuration/settings.rb +7 -0
- data/lib/datadog/tracing/contrib/graphql/ext.rb +1 -0
- data/lib/datadog/tracing/contrib/graphql/unified_trace.rb +75 -44
- data/lib/datadog/tracing/contrib/grpc/configuration/settings.rb +5 -2
- data/lib/datadog/tracing/contrib/grpc/datadog_interceptor/client.rb +3 -7
- data/lib/datadog/tracing/contrib/grpc/datadog_interceptor/server.rb +3 -7
- data/lib/datadog/tracing/contrib/grpc/distributed/propagation.rb +2 -0
- data/lib/datadog/tracing/contrib/grpc/ext.rb +1 -0
- data/lib/datadog/tracing/contrib/grpc.rb +1 -0
- data/lib/datadog/tracing/contrib/hanami/action_tracer.rb +1 -0
- data/lib/datadog/tracing/contrib/hanami/renderer_policy_tracing.rb +1 -0
- data/lib/datadog/tracing/contrib/hanami/router_tracing.rb +1 -0
- data/lib/datadog/tracing/contrib/http/configuration/settings.rb +16 -5
- data/lib/datadog/tracing/contrib/http/distributed/propagation.rb +2 -0
- data/lib/datadog/tracing/contrib/http/ext.rb +1 -0
- data/lib/datadog/tracing/contrib/http/instrumentation.rb +4 -8
- data/lib/datadog/tracing/contrib/http/integration.rb +0 -2
- data/lib/datadog/tracing/contrib/http.rb +1 -0
- data/lib/datadog/tracing/contrib/httpclient/configuration/settings.rb +16 -5
- data/lib/datadog/tracing/contrib/httpclient/ext.rb +1 -0
- data/lib/datadog/tracing/contrib/httpclient/instrumentation.rb +7 -7
- data/lib/datadog/tracing/contrib/httprb/configuration/settings.rb +16 -5
- data/lib/datadog/tracing/contrib/httprb/ext.rb +1 -0
- data/lib/datadog/tracing/contrib/httprb/instrumentation.rb +4 -8
- data/lib/datadog/tracing/contrib/kafka/event.rb +1 -0
- data/lib/datadog/tracing/contrib/kafka/instrumentation/consumer.rb +66 -0
- data/lib/datadog/tracing/contrib/kafka/instrumentation/producer.rb +66 -0
- data/lib/datadog/tracing/contrib/kafka/patcher.rb +14 -0
- data/lib/datadog/tracing/contrib/karafka/configuration/settings.rb +5 -1
- data/lib/datadog/tracing/contrib/karafka/distributed/propagation.rb +2 -0
- data/lib/datadog/tracing/contrib/karafka/ext.rb +1 -0
- data/lib/datadog/tracing/contrib/karafka/framework.rb +30 -0
- data/lib/datadog/tracing/contrib/karafka/monitor.rb +11 -0
- data/lib/datadog/tracing/contrib/karafka/patcher.rb +35 -4
- data/lib/datadog/tracing/contrib/karafka.rb +1 -0
- data/lib/datadog/tracing/contrib/mongodb/parsers.rb +5 -5
- data/lib/datadog/tracing/contrib/mongodb/subscribers.rb +5 -8
- data/lib/datadog/tracing/contrib/mysql2/configuration/settings.rb +6 -0
- data/lib/datadog/tracing/contrib/mysql2/instrumentation.rb +3 -6
- data/lib/datadog/tracing/contrib/opensearch/patcher.rb +2 -6
- data/lib/datadog/tracing/contrib/opensearch/quantize.rb +2 -2
- data/lib/datadog/tracing/contrib/pg/configuration/settings.rb +6 -0
- data/lib/datadog/tracing/contrib/pg/instrumentation.rb +15 -18
- data/lib/datadog/tracing/contrib/presto/instrumentation.rb +6 -8
- data/lib/datadog/tracing/contrib/propagation/sql_comment/ext.rb +13 -0
- data/lib/datadog/tracing/contrib/propagation/sql_comment/mode.rb +6 -2
- data/lib/datadog/tracing/contrib/propagation/sql_comment.rb +24 -0
- data/lib/datadog/tracing/contrib/que/configuration/settings.rb +5 -2
- data/lib/datadog/tracing/contrib/que/ext.rb +1 -0
- data/lib/datadog/tracing/contrib/que/tracer.rb +1 -0
- data/lib/datadog/tracing/contrib/racecar/event.rb +1 -5
- data/lib/datadog/tracing/contrib/rack/configuration/settings.rb +11 -1
- data/lib/datadog/tracing/contrib/rack/ext.rb +28 -0
- data/lib/datadog/tracing/contrib/rack/header_tagging.rb +23 -0
- data/lib/datadog/tracing/contrib/rack/middlewares.rb +62 -27
- data/lib/datadog/tracing/contrib/rack/patcher.rb +2 -2
- data/lib/datadog/tracing/contrib/rack/request_queue.rb +1 -1
- data/lib/datadog/tracing/contrib/rack/route_inference.rb +67 -0
- data/lib/datadog/tracing/contrib/rack/trace_proxy_middleware.rb +119 -1
- data/lib/datadog/tracing/contrib/rails/configuration/settings.rb +5 -2
- data/lib/datadog/tracing/contrib/rails/ext.rb +1 -0
- data/lib/datadog/tracing/contrib/rails/log_injection.rb +1 -1
- data/lib/datadog/tracing/contrib/rails/middlewares.rb +2 -2
- data/lib/datadog/tracing/contrib/rails/patcher.rb +0 -1
- data/lib/datadog/tracing/contrib/rails/runner.rb +3 -1
- data/lib/datadog/tracing/contrib/rake/instrumentation.rb +6 -4
- data/lib/datadog/tracing/contrib/redis/quantize.rb +1 -1
- data/lib/datadog/tracing/contrib/redis/tags.rb +1 -6
- data/lib/datadog/tracing/contrib/redis/trace_middleware.rb +2 -0
- data/lib/datadog/tracing/contrib/registerable.rb +11 -0
- data/lib/datadog/tracing/contrib/resque/resque_job.rb +1 -0
- data/lib/datadog/tracing/contrib/rest_client/configuration/settings.rb +5 -2
- data/lib/datadog/tracing/contrib/rest_client/ext.rb +1 -0
- data/lib/datadog/tracing/contrib/rest_client/request_patch.rb +5 -6
- data/lib/datadog/tracing/contrib/roda/ext.rb +1 -0
- data/lib/datadog/tracing/contrib/roda/instrumentation.rb +7 -2
- data/lib/datadog/tracing/contrib/sequel/database.rb +1 -0
- data/lib/datadog/tracing/contrib/sequel/dataset.rb +1 -0
- data/lib/datadog/tracing/contrib/sequel/utils.rb +2 -7
- data/lib/datadog/tracing/contrib/shoryuken/tracer.rb +1 -0
- data/lib/datadog/tracing/contrib/sidekiq/client_tracer.rb +1 -0
- data/lib/datadog/tracing/contrib/sidekiq/configuration/settings.rb +5 -1
- data/lib/datadog/tracing/contrib/sidekiq/distributed/propagation.rb +2 -0
- data/lib/datadog/tracing/contrib/sidekiq/ext.rb +1 -0
- data/lib/datadog/tracing/contrib/sidekiq/server_internal_tracer/heartbeat.rb +2 -0
- data/lib/datadog/tracing/contrib/sidekiq/server_internal_tracer/job_fetch.rb +1 -0
- data/lib/datadog/tracing/contrib/sidekiq/server_internal_tracer/redis_info.rb +1 -0
- data/lib/datadog/tracing/contrib/sidekiq/server_internal_tracer/scheduled_poller.rb +2 -0
- data/lib/datadog/tracing/contrib/sidekiq/server_internal_tracer/stop.rb +1 -0
- data/lib/datadog/tracing/contrib/sidekiq/server_tracer.rb +3 -2
- data/lib/datadog/tracing/contrib/sidekiq/utils.rb +1 -1
- data/lib/datadog/tracing/contrib/sidekiq.rb +1 -0
- data/lib/datadog/tracing/contrib/sinatra/configuration/settings.rb +5 -1
- data/lib/datadog/tracing/contrib/sinatra/ext.rb +1 -0
- data/lib/datadog/tracing/contrib/sinatra/framework.rb +1 -1
- data/lib/datadog/tracing/contrib/sinatra/tracer.rb +1 -0
- data/lib/datadog/tracing/contrib/sinatra/tracer_middleware.rb +4 -1
- data/lib/datadog/tracing/contrib/sneakers/integration.rb +15 -4
- data/lib/datadog/tracing/contrib/sneakers/tracer.rb +1 -0
- data/lib/datadog/tracing/contrib/status_range_matcher.rb +13 -1
- data/lib/datadog/tracing/contrib/stripe/request.rb +1 -1
- data/lib/datadog/tracing/contrib/sucker_punch/instrumentation.rb +1 -0
- data/lib/datadog/tracing/contrib/trilogy/configuration/settings.rb +6 -0
- data/lib/datadog/tracing/contrib/trilogy/instrumentation.rb +4 -6
- data/lib/datadog/tracing/contrib/utils/quantization/{hash.rb → hash_formatter.rb} +4 -2
- data/lib/datadog/tracing/contrib/waterdrop/configuration/settings.rb +31 -0
- data/lib/datadog/tracing/contrib/waterdrop/distributed/propagation.rb +50 -0
- data/lib/datadog/tracing/contrib/waterdrop/ext.rb +18 -0
- data/lib/datadog/tracing/contrib/waterdrop/integration.rb +43 -0
- data/lib/datadog/tracing/contrib/waterdrop/middleware.rb +46 -0
- data/lib/datadog/tracing/contrib/waterdrop/patcher.rb +49 -0
- data/lib/datadog/tracing/contrib/waterdrop/producer.rb +50 -0
- data/lib/datadog/tracing/contrib/waterdrop.rb +42 -0
- data/lib/datadog/tracing/contrib.rb +9 -0
- data/lib/datadog/tracing/diagnostics/environment_logger.rb +4 -2
- data/lib/datadog/tracing/distributed/baggage.rb +64 -8
- data/lib/datadog/tracing/distributed/datadog.rb +13 -11
- data/lib/datadog/tracing/distributed/datadog_tags_codec.rb +1 -14
- data/lib/datadog/tracing/distributed/propagation.rb +35 -3
- data/lib/datadog/tracing/distributed/trace_context.rb +85 -62
- data/lib/datadog/tracing/event.rb +1 -1
- data/lib/datadog/tracing/ext.rb +9 -0
- data/lib/datadog/tracing/metadata/ext.rb +23 -1
- data/lib/datadog/tracing/metadata/tagging.rb +2 -2
- data/lib/datadog/tracing/pipeline.rb +1 -1
- data/lib/datadog/tracing/remote.rb +36 -13
- data/lib/datadog/tracing/sampling/ext.rb +2 -0
- data/lib/datadog/tracing/sampling/priority_sampler.rb +16 -1
- data/lib/datadog/tracing/sampling/rate_sampler.rb +8 -19
- data/lib/datadog/tracing/sampling/rule.rb +1 -1
- data/lib/datadog/tracing/sampling/rule_sampler.rb +54 -25
- data/lib/datadog/tracing/sampling/span/rule_parser.rb +2 -2
- data/lib/datadog/tracing/span.rb +1 -1
- data/lib/datadog/tracing/span_event.rb +2 -2
- data/lib/datadog/tracing/span_operation.rb +34 -10
- data/lib/datadog/tracing/sync_writer.rb +0 -1
- data/lib/datadog/tracing/trace_digest.rb +7 -0
- data/lib/datadog/tracing/trace_operation.rb +123 -16
- data/lib/datadog/tracing/tracer.rb +82 -23
- data/lib/datadog/tracing/transport/http/client.rb +12 -26
- data/lib/datadog/tracing/transport/http/traces.rb +2 -50
- data/lib/datadog/tracing/transport/http.rb +15 -9
- data/lib/datadog/tracing/transport/io/client.rb +6 -9
- data/lib/datadog/tracing/transport/io/traces.rb +28 -34
- data/lib/datadog/tracing/transport/trace_formatter.rb +22 -0
- data/lib/datadog/tracing/transport/traces.rb +13 -81
- data/lib/datadog/tracing/workers.rb +2 -1
- data/lib/datadog/tracing/writer.rb +1 -1
- data/lib/datadog/version.rb +2 -2
- data/lib/datadog.rb +8 -1
- metadata +185 -36
- data/ext/datadog_profiling_native_extension/clock_id_noop.c +0 -21
- data/ext/libdatadog_api/macos_development.md +0 -26
- data/lib/datadog/appsec/configuration/settings.rb +0 -400
- data/lib/datadog/appsec/contrib/rails/ext.rb +0 -13
- data/lib/datadog/core/remote/transport/http/api.rb +0 -53
- data/lib/datadog/core/remote/transport/http/client.rb +0 -49
- data/lib/datadog/core/telemetry/transport/http/api.rb +0 -43
- data/lib/datadog/core/telemetry/transport/http/client.rb +0 -49
- data/lib/datadog/core/transport/http/api/spec.rb +0 -36
- data/lib/datadog/di/configuration/settings.rb +0 -212
- data/lib/datadog/di/transport/http/api.rb +0 -42
- data/lib/datadog/di/transport/http/client.rb +0 -47
- data/lib/datadog/error_tracking/configuration/settings.rb +0 -63
- data/lib/datadog/opentelemetry/api/baggage.rbs +0 -26
- data/lib/datadog/tracing/transport/http/api.rb +0 -44
- data/lib/datadog/tracing/workers/trace_writer.rb +0 -199
|
@@ -238,7 +238,7 @@ module Datadog
|
|
|
238
238
|
yield write_components
|
|
239
239
|
rescue ThreadError => e
|
|
240
240
|
logger_without_components.error(
|
|
241
|
-
|
|
241
|
+
"Detected deadlock during datadog initialization: #{e.class}: #{e.message}. " \
|
|
242
242
|
'Please report this at https://github.com/datadog/dd-trace-rb/blob/master/CONTRIBUTING.md#found-a-bug' \
|
|
243
243
|
"\n\tSource:\n\t#{Array(e.backtrace).join("\n\t")}"
|
|
244
244
|
)
|
|
@@ -284,7 +284,7 @@ module Datadog
|
|
|
284
284
|
# This enables logging during initialization, otherwise we'd run into deadlocks.
|
|
285
285
|
|
|
286
286
|
@temp_logger ||= begin
|
|
287
|
-
logger = configuration.logger.instance || Core::Logger.new($
|
|
287
|
+
logger = configuration.logger.instance || Core::Logger.new($stderr)
|
|
288
288
|
logger.level = configuration.diagnostics.debug ? ::Logger::DEBUG : configuration.logger.level
|
|
289
289
|
logger
|
|
290
290
|
end
|
|
@@ -298,7 +298,7 @@ module Datadog
|
|
|
298
298
|
debug_env_value = DATADOG_ENV[Ext::Diagnostics::ENV_DEBUG_ENABLED]&.strip&.downcase
|
|
299
299
|
debug_value = debug_env_value == 'true' || debug_env_value == '1'
|
|
300
300
|
|
|
301
|
-
logger = Core::Logger.new($
|
|
301
|
+
logger = Core::Logger.new($stderr)
|
|
302
302
|
# We cannot access config and the default level is INFO, so we need to set the level manually
|
|
303
303
|
logger.level = debug_value ? ::Logger::DEBUG : ::Logger::INFO
|
|
304
304
|
logger
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
require_relative 'utils'
|
|
4
|
+
require_relative '../../environment/process'
|
|
5
|
+
require_relative '../../process_discovery'
|
|
6
|
+
|
|
7
|
+
module Datadog
|
|
8
|
+
module Core
|
|
9
|
+
module Contrib
|
|
10
|
+
module Rails
|
|
11
|
+
# Railtie for core Rails setup that benefits all Datadog products.
|
|
12
|
+
class Railtie < ::Rails::Railtie
|
|
13
|
+
def self.after_initialize
|
|
14
|
+
if Datadog.configuration.experimental_propagate_process_tags_enabled
|
|
15
|
+
Datadog::Core::Environment::Process.rails_application_name =
|
|
16
|
+
Datadog::Core::Contrib::Rails::Utils.app_name
|
|
17
|
+
end
|
|
18
|
+
|
|
19
|
+
# Process Discovery should always publish after_initialize since it has access to more information
|
|
20
|
+
Datadog::Core::ProcessDiscovery.publish(Datadog.configuration)
|
|
21
|
+
end
|
|
22
|
+
|
|
23
|
+
# Registered after the method definition so the method exists if on_load fires immediately
|
|
24
|
+
# (which happens when the Railtie is loaded into an already-initialized Rails app).
|
|
25
|
+
::ActiveSupport.on_load(:after_initialize) do
|
|
26
|
+
Datadog::Core::Contrib::Rails::Railtie.after_initialize
|
|
27
|
+
end
|
|
28
|
+
end
|
|
29
|
+
end
|
|
30
|
+
end
|
|
31
|
+
end
|
|
32
|
+
end
|
|
@@ -7,11 +7,15 @@ module Datadog
|
|
|
7
7
|
# common utilities for Rails
|
|
8
8
|
module Utils
|
|
9
9
|
def self.app_name
|
|
10
|
-
if ::Rails::VERSION::MAJOR >= 6
|
|
11
|
-
::Rails.application.class.module_parent_name
|
|
10
|
+
application_name = if ::Rails::VERSION::MAJOR >= 6
|
|
11
|
+
::Rails.application.class.module_parent_name
|
|
12
12
|
else
|
|
13
|
-
::Rails.application.class.parent_name
|
|
13
|
+
::Rails.application.class.parent_name
|
|
14
14
|
end
|
|
15
|
+
application_name&.underscore
|
|
16
|
+
rescue => e
|
|
17
|
+
Datadog.logger.debug("Failed to extract Rails application name: #{e.class}: #{e.message}")
|
|
18
|
+
nil
|
|
15
19
|
end
|
|
16
20
|
|
|
17
21
|
def self.railtie_supported?
|
|
@@ -3,8 +3,6 @@
|
|
|
3
3
|
require 'libdatadog'
|
|
4
4
|
|
|
5
5
|
require_relative 'tag_builder'
|
|
6
|
-
require_relative '../utils/only_once'
|
|
7
|
-
require_relative '../utils/at_fork_monkey_patch'
|
|
8
6
|
|
|
9
7
|
module Datadog
|
|
10
8
|
module Core
|
|
@@ -18,10 +16,8 @@ module Datadog
|
|
|
18
16
|
#
|
|
19
17
|
# Methods prefixed with _native_ are implemented in `crashtracker.c`
|
|
20
18
|
class Component
|
|
21
|
-
ONLY_ONCE = Core::Utils::OnlyOnce.new
|
|
22
|
-
|
|
23
19
|
def self.build(settings, agent_settings, logger:)
|
|
24
|
-
tags =
|
|
20
|
+
tags = latest_tags(settings)
|
|
25
21
|
agent_base_url = agent_settings.url
|
|
26
22
|
|
|
27
23
|
ld_library_path = ::Libdatadog.ld_library_path
|
|
@@ -45,6 +41,32 @@ module Datadog
|
|
|
45
41
|
).tap(&:start)
|
|
46
42
|
end
|
|
47
43
|
|
|
44
|
+
# Reports unhandled exceptions to the crash tracker if available and appropriate.
|
|
45
|
+
# This is called from the at_exit hook to report unhandled exceptions.
|
|
46
|
+
def self.report_unhandled_exception(exception)
|
|
47
|
+
return unless exception && !exception.is_a?(SystemExit) && !exception.is_a?(NoMemoryError)
|
|
48
|
+
|
|
49
|
+
begin
|
|
50
|
+
crashtracker = Datadog.send(:components, allow_initialization: false)&.crashtracker
|
|
51
|
+
return unless crashtracker
|
|
52
|
+
|
|
53
|
+
crashtracker.report_unhandled_exception(exception)
|
|
54
|
+
rescue => e
|
|
55
|
+
# Unhandled exception report triggering means that the application is already in a bad state
|
|
56
|
+
# We don't want to swallow non-StandardError exceptions here; we would rather just let the
|
|
57
|
+
# application crash
|
|
58
|
+
Datadog.logger.debug { "Crashtracker failed to report unhandled exception: #{e.class}: #{e.message}" }
|
|
59
|
+
end
|
|
60
|
+
end
|
|
61
|
+
|
|
62
|
+
# Gets the latest tags from the current configuration.
|
|
63
|
+
#
|
|
64
|
+
# We always fetch fresh tags because:
|
|
65
|
+
# After forking, we need the latest tags, not the parent's tags, such as the pid or runtime-id
|
|
66
|
+
def self.latest_tags(settings)
|
|
67
|
+
TagBuilder.call(settings)
|
|
68
|
+
end
|
|
69
|
+
|
|
48
70
|
def initialize(tags:, agent_base_url:, ld_library_path:, path_to_crashtracking_receiver_binary:, logger:)
|
|
49
71
|
@tags = tags
|
|
50
72
|
@agent_base_url = agent_base_url
|
|
@@ -54,31 +76,61 @@ module Datadog
|
|
|
54
76
|
end
|
|
55
77
|
|
|
56
78
|
def start
|
|
57
|
-
Utils::AtForkMonkeyPatch.apply!
|
|
58
|
-
|
|
59
79
|
start_or_update_on_fork(action: :start, tags: tags)
|
|
60
|
-
|
|
61
|
-
ONLY_ONCE.run do
|
|
62
|
-
Utils::AtForkMonkeyPatch.at_fork(:child) do
|
|
63
|
-
# Must NOT reference `self` here, as only the first instance will
|
|
64
|
-
# be captured by the ONLY_ONCE and we want to pick the latest active one
|
|
65
|
-
# (which may have different tags or agent config)
|
|
66
|
-
Datadog.send(:components, allow_initialization: false)&.crashtracker&.update_on_fork
|
|
67
|
-
end
|
|
68
|
-
end
|
|
69
80
|
end
|
|
70
81
|
|
|
71
82
|
def update_on_fork(settings: Datadog.configuration)
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
83
|
+
start_or_update_on_fork(action: :update_on_fork, tags: self.class.latest_tags(settings))
|
|
84
|
+
end
|
|
85
|
+
|
|
86
|
+
def report_unhandled_exception(exception)
|
|
87
|
+
# Maximum number of stack frames to include in exception crash reports
|
|
88
|
+
# This is the same number used for signal-based crashtracking's runtime stack
|
|
89
|
+
max_exception_stack_frames = 512
|
|
90
|
+
|
|
91
|
+
# extract all frame data upfront; c expects exactly 3 elements, proper types, no nils
|
|
92
|
+
# limit to max_exception_stack_frames frames
|
|
93
|
+
all_backtrace_locations = exception.backtrace_locations || []
|
|
94
|
+
was_truncated = all_backtrace_locations.length > max_exception_stack_frames
|
|
95
|
+
|
|
96
|
+
backtrace_slice = all_backtrace_locations[0...max_exception_stack_frames] || []
|
|
97
|
+
# @type var frames_data: Array[[String, String, Integer]]
|
|
98
|
+
frames_data = backtrace_slice.map do |loc|
|
|
99
|
+
file = loc.path
|
|
100
|
+
file = '<unknown>' if file.nil? || file.empty? || !file.is_a?(String)
|
|
101
|
+
|
|
102
|
+
function = loc.label
|
|
103
|
+
function = '<unknown>' if function.nil? || function.empty? || !function.is_a?(String)
|
|
104
|
+
|
|
105
|
+
line = loc.lineno
|
|
106
|
+
line = 0 if line.nil? || line < 0 || !line.is_a?(Integer)
|
|
107
|
+
|
|
108
|
+
[file, function, line]
|
|
109
|
+
end
|
|
110
|
+
|
|
111
|
+
# Add truncation indicator frame if we had to cut off frames
|
|
112
|
+
if was_truncated
|
|
113
|
+
truncated_count = all_backtrace_locations.length - max_exception_stack_frames
|
|
114
|
+
frames_data << ['<truncated>', "<truncated #{truncated_count} more frames>", 0]
|
|
115
|
+
end
|
|
116
|
+
|
|
117
|
+
exception_message = exception.message
|
|
118
|
+
exception_type = exception.class.to_s
|
|
119
|
+
|
|
120
|
+
success = self.class._native_report_ruby_exception(
|
|
121
|
+
exception_type,
|
|
122
|
+
exception_message,
|
|
123
|
+
frames_data,
|
|
124
|
+
)
|
|
125
|
+
|
|
126
|
+
logger.debug('Crashtracker failed to report unhandled exception to crash tracker') unless success
|
|
75
127
|
end
|
|
76
128
|
|
|
77
129
|
def stop
|
|
78
130
|
self.class._native_stop
|
|
79
131
|
logger.debug('Crash tracking stopped successfully')
|
|
80
132
|
rescue => e
|
|
81
|
-
logger.error("Failed to stop crash tracking: #{e.message}")
|
|
133
|
+
logger.error("Failed to stop crash tracking: #{e.class}: #{e.message}")
|
|
82
134
|
end
|
|
83
135
|
|
|
84
136
|
private
|
|
@@ -97,7 +149,7 @@ module Datadog
|
|
|
97
149
|
)
|
|
98
150
|
logger.debug("Crash tracking action: #{action} successful")
|
|
99
151
|
rescue => e
|
|
100
|
-
logger.error("Failed to #{action} crash tracking: #{e.message}")
|
|
152
|
+
logger.error("Failed to #{action} crash tracking: #{e.class}: #{e.message}")
|
|
101
153
|
end
|
|
102
154
|
end
|
|
103
155
|
end
|
|
@@ -2,6 +2,7 @@
|
|
|
2
2
|
|
|
3
3
|
require_relative '../tag_builder'
|
|
4
4
|
require_relative '../utils'
|
|
5
|
+
require_relative '../environment/process'
|
|
5
6
|
|
|
6
7
|
module Datadog
|
|
7
8
|
module Core
|
|
@@ -13,6 +14,11 @@ module Datadog
|
|
|
13
14
|
'is_crash' => 'true',
|
|
14
15
|
)
|
|
15
16
|
|
|
17
|
+
if settings.experimental_propagate_process_tags_enabled
|
|
18
|
+
process_tags = Environment::Process.serialized
|
|
19
|
+
hash['process_tags'] = process_tags unless process_tags.empty?
|
|
20
|
+
end
|
|
21
|
+
|
|
16
22
|
Utils.encode_tags(hash)
|
|
17
23
|
end
|
|
18
24
|
end
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
module Datadog
|
|
4
|
+
module Core
|
|
5
|
+
# Used to access ddsketch APIs.
|
|
6
|
+
# APIs in this class are implemented as native code.
|
|
7
|
+
class DDSketch
|
|
8
|
+
def self.supported?
|
|
9
|
+
Datadog::Core::LIBDATADOG_API_FAILURE.nil?
|
|
10
|
+
end
|
|
11
|
+
|
|
12
|
+
def initialize
|
|
13
|
+
unless self.class.supported?
|
|
14
|
+
raise(ArgumentError, "DDSketch is not supported: #{Datadog::Core::LIBDATADOG_API_FAILURE}")
|
|
15
|
+
end
|
|
16
|
+
end
|
|
17
|
+
end
|
|
18
|
+
end
|
|
19
|
+
end
|
|
@@ -52,7 +52,9 @@ module Datadog
|
|
|
52
52
|
log_configuration!('CORE', data.to_json)
|
|
53
53
|
end
|
|
54
54
|
rescue => e
|
|
55
|
-
logger.warn(
|
|
55
|
+
logger.warn(
|
|
56
|
+
"Failed to collect core environment information: #{e.class}: #{e.message} Location: #{Array(e.backtrace).first}"
|
|
57
|
+
)
|
|
56
58
|
end
|
|
57
59
|
end
|
|
58
60
|
|
|
@@ -1,5 +1,8 @@
|
|
|
1
1
|
# frozen_string_literal: true
|
|
2
2
|
|
|
3
|
+
require_relative '../utils/fnv'
|
|
4
|
+
require_relative 'process'
|
|
5
|
+
|
|
3
6
|
module Datadog
|
|
4
7
|
module Core
|
|
5
8
|
module Environment
|
|
@@ -59,19 +62,80 @@ module Datadog
|
|
|
59
62
|
@client = Remote::Transport::HTTP.root(agent_settings: agent_settings, logger: logger)
|
|
60
63
|
end
|
|
61
64
|
|
|
62
|
-
# Fetches the information from the
|
|
65
|
+
# Fetches the information from the Trace Agent.
|
|
63
66
|
# @return [Datadog::Core::Remote::Transport::HTTP::Negotiation::Response] the response from the agent
|
|
64
67
|
# @return [nil] if an error occurred while fetching the information
|
|
65
68
|
def fetch
|
|
66
69
|
res = @client.send_info
|
|
67
70
|
return unless res.ok?
|
|
68
71
|
|
|
72
|
+
update_propagation_checksum(res)
|
|
73
|
+
|
|
69
74
|
res
|
|
70
75
|
end
|
|
71
76
|
|
|
72
77
|
def ==(other)
|
|
73
78
|
other.is_a?(self.class) && other.agent_settings == agent_settings
|
|
74
79
|
end
|
|
80
|
+
|
|
81
|
+
# Returns the propagation checksum, comprising of process tags and optionally container tags (from the Trace Agent)
|
|
82
|
+
# Currently called/used by the DBM code to inject the propagation checksum into the SQL comment.
|
|
83
|
+
#
|
|
84
|
+
# This checksum is used for correlation across signals (traces, DBM, data streams, etc.) in environments
|
|
85
|
+
#
|
|
86
|
+
# The checksum is populated by the trace transport's periodic fetch calls.
|
|
87
|
+
# @return [Integer, nil] the FNV hash based on the container and process tags or nil
|
|
88
|
+
attr_reader :propagation_checksum
|
|
89
|
+
|
|
90
|
+
private
|
|
91
|
+
|
|
92
|
+
# Trace Agent 7.69.0+ provides a SHA256 checksum in the response header DATADOG-CONTAINER-TAGS-HASH based on the container id computed in Datadog::Core::Environment::Container
|
|
93
|
+
# This is a short checksum that uniquely identifies this process, its container environment, and
|
|
94
|
+
# the Datadog agent it connects to.
|
|
95
|
+
#
|
|
96
|
+
# This checksum only has to be internally consistent: the same value must be used by every signal
|
|
97
|
+
# emitted by this process+container+agent combinations). It is not required that this checksum is
|
|
98
|
+
# consistent with other SDKs.
|
|
99
|
+
# During calls to the Trace Agent, this checksum is cached but invalidated if a new value is returned
|
|
100
|
+
# The resulting propagation_checksum uses the container_tags_checksum
|
|
101
|
+
# https://github.com/DataDog/datadog-agent/pull/38515
|
|
102
|
+
attr_reader :container_tags_checksum
|
|
103
|
+
|
|
104
|
+
# Setting DD_EXPERIMENTAL_PROPAGATE_PROCESS_TAGS_ENABLED to true enables the following behavior:
|
|
105
|
+
# - Computes a propagation checksum from process tags and optionally container tags when tags change
|
|
106
|
+
# - This is needed in traces (dsm and dbm related spans), DBM, and DSM.
|
|
107
|
+
#
|
|
108
|
+
# Container tags extraction:
|
|
109
|
+
# Datadog::Core::Environment::Container extracts the container id from the cgroup folder if possible
|
|
110
|
+
# (note: not currently available in cgroupv2) and sends it to the Trace Agent via the header Datadog-Container-ID.
|
|
111
|
+
# The Trace Agent takes the container id and looks for matching container tags to compute a SHA256 checksum via the response header DATADOG-CONTAINER-TAGS-HASH
|
|
112
|
+
# https://github.com/DataDog/datadog-agent/blob/c923da011c8e51c35c0d05b6b10d016521915e7d/pkg/trace/api/info.go#L203-L227
|
|
113
|
+
#
|
|
114
|
+
# When deciding whether the propagation checksum should be updated, we need to be aware of some concerns:
|
|
115
|
+
# - The tracer fails to send the container id in the first place
|
|
116
|
+
# - It is possible that older Trace Agents may not have this specific header
|
|
117
|
+
# - It is possible that we don't have access to the value if the Trace Agent is temporarily down. In these cases, we need to check for the value again on the next call to the info endpoint
|
|
118
|
+
# - If we have access to the value, we need to check if it changed from the previous value.
|
|
119
|
+
# - The Trace Agent runs into a permissions/setup issue.
|
|
120
|
+
def update_propagation_checksum(res)
|
|
121
|
+
return unless Datadog.configuration.experimental_propagate_process_tags_enabled
|
|
122
|
+
|
|
123
|
+
header_value = res.headers[Core::Transport::Ext::HTTP::HEADER_CONTAINER_TAGS_HASH]
|
|
124
|
+
new_container_tags_checksum = header_value if header_value && !header_value.empty?
|
|
125
|
+
|
|
126
|
+
# if the Trace Agent returns a new value for the checksum, calculate and cache the propagation checksum
|
|
127
|
+
# If there was no previous propagation_checksum, then we should calculate the checksum by checking the agent and getting process info
|
|
128
|
+
if @propagation_checksum.nil? || (new_container_tags_checksum && new_container_tags_checksum != @container_tags_checksum)
|
|
129
|
+
@container_tags_checksum = new_container_tags_checksum
|
|
130
|
+
|
|
131
|
+
checksum_input = Process.serialized
|
|
132
|
+
# Use local variable for Steep type narrowing (helps Steep with type narrowing)
|
|
133
|
+
container_checksum = @container_tags_checksum
|
|
134
|
+
checksum_input += container_checksum if container_checksum
|
|
135
|
+
|
|
136
|
+
@propagation_checksum = Core::Utils::FNV.fnv1_64(checksum_input)
|
|
137
|
+
end
|
|
138
|
+
end
|
|
75
139
|
end
|
|
76
140
|
end
|
|
77
141
|
end
|
|
@@ -10,40 +10,67 @@ module Datadog
|
|
|
10
10
|
# about the current Linux container identity.
|
|
11
11
|
# @see https://man7.org/linux/man-pages/man7/cgroups.7.html
|
|
12
12
|
module Cgroup
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
:
|
|
17
|
-
:groups,
|
|
13
|
+
# A parsed cgroup entry from /proc/<pid>/cgroup
|
|
14
|
+
Entry = Struct.new(
|
|
15
|
+
:hierarchy,
|
|
16
|
+
:controllers,
|
|
18
17
|
:path,
|
|
19
|
-
:
|
|
18
|
+
:inode
|
|
20
19
|
)
|
|
21
20
|
|
|
22
21
|
module_function
|
|
23
22
|
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
end
|
|
34
|
-
rescue => e
|
|
35
|
-
Datadog.logger.error(
|
|
36
|
-
"Error while parsing cgroup. Cause: #{e.class.name} #{e.message} Location: #{Array(e.backtrace).first}"
|
|
37
|
-
)
|
|
23
|
+
# Parses the /proc/self/cgroup file,
|
|
24
|
+
# @return [Array<Entry>] one entry for each valid cgroup line
|
|
25
|
+
def entries
|
|
26
|
+
filepath = '/proc/self/cgroup'
|
|
27
|
+
return [] unless File.exist?(filepath)
|
|
28
|
+
|
|
29
|
+
ret = []
|
|
30
|
+
File.foreach(filepath) do |entry_line|
|
|
31
|
+
ret << parse(entry_line) unless entry_line.empty?
|
|
38
32
|
end
|
|
33
|
+
ret
|
|
39
34
|
end
|
|
40
35
|
|
|
41
|
-
|
|
42
|
-
|
|
36
|
+
# Parses a single cgroup entry from /proc/<pid>/cgroup.
|
|
37
|
+
#
|
|
38
|
+
# Files can have cgroup v1 and v2 entries mixed. Their format is the same.
|
|
39
|
+
#
|
|
40
|
+
# Each entry has 3 colon-separated fields:
|
|
41
|
+
# hierarchy-ID:controllers:path
|
|
42
|
+
# Examples:
|
|
43
|
+
# 10:memory:/docker/1234567890abcdef (cgroup v1)
|
|
44
|
+
# 0::/docker/1234567890abcdef (cgroup v2)
|
|
45
|
+
#
|
|
46
|
+
# @see https://man7.org/linux/man-pages/man7/cgroups.7.html#:~:text=%2Fproc%2Fpid%2Fcgroup
|
|
47
|
+
# @return [Entry]
|
|
48
|
+
def parse(entry_line)
|
|
49
|
+
hierarchy, controllers, path = entry_line.split(':', 3)
|
|
43
50
|
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
51
|
+
Entry.new(
|
|
52
|
+
hierarchy,
|
|
53
|
+
controllers,
|
|
54
|
+
path,
|
|
55
|
+
inode_for(controllers, path)
|
|
56
|
+
)
|
|
57
|
+
end
|
|
58
|
+
|
|
59
|
+
# We can find the container inode by running a file stat on the cgroup filesystem path.
|
|
60
|
+
# Example:
|
|
61
|
+
# For the entry `0:cpu:/docker/abc123`,
|
|
62
|
+
# we read `stat -c '%i' /sys/fs/cgroup/cpu/docker/abc123`
|
|
63
|
+
def inode_for(controllers, path)
|
|
64
|
+
return if controllers.nil? || path.nil?
|
|
65
|
+
|
|
66
|
+
# In cgroup v1, when multiple controllers are co-mounted, the controllers
|
|
67
|
+
# becomes part of the directory name (with commas preserved).
|
|
68
|
+
# Example entry:
|
|
69
|
+
# For the line "10:cpu,cpuacct:/docker/abc123", the path is
|
|
70
|
+
# "/sys/fs/cgroup/cpu,cpuacct/docker/abc123"
|
|
71
|
+
inode_path = File.join('/sys/fs/cgroup', controllers, path)
|
|
72
|
+
|
|
73
|
+
File.stat(inode_path).ino if File.exist?(inode_path)
|
|
47
74
|
end
|
|
48
75
|
end
|
|
49
76
|
end
|