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
|
@@ -0,0 +1,53 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
require_relative '../core/configuration/ext'
|
|
4
|
+
require_relative '../core/environment/socket'
|
|
5
|
+
|
|
6
|
+
module Datadog
|
|
7
|
+
module OpenTelemetry
|
|
8
|
+
# Shared resource building and signal-specific config fallback logic for Logs and Metrics.
|
|
9
|
+
module SignalConfiguration
|
|
10
|
+
private
|
|
11
|
+
|
|
12
|
+
def create_resource
|
|
13
|
+
resource_attributes = {}
|
|
14
|
+
|
|
15
|
+
@settings.tags&.each do |key, value| # steep:ignore
|
|
16
|
+
otel_key = case key
|
|
17
|
+
when 'service' then 'service.name'
|
|
18
|
+
when 'env' then 'deployment.environment'
|
|
19
|
+
when 'version' then 'service.version'
|
|
20
|
+
else key
|
|
21
|
+
end
|
|
22
|
+
resource_attributes[otel_key] = value
|
|
23
|
+
end
|
|
24
|
+
|
|
25
|
+
resource_attributes['service.name'] = @settings.service_without_fallback || resource_attributes['service.name'] || Datadog::Core::Environment::Ext::FALLBACK_SERVICE_NAME # steep:ignore
|
|
26
|
+
resource_attributes['deployment.environment'] = @settings.env if @settings.env # steep:ignore
|
|
27
|
+
resource_attributes['service.version'] = @settings.version if @settings.version # steep:ignore
|
|
28
|
+
|
|
29
|
+
hostname = Datadog::Core::Environment::Socket.resolved_hostname(@settings) # steep:ignore
|
|
30
|
+
if hostname
|
|
31
|
+
if hostname == @settings.hostname # steep:ignore
|
|
32
|
+
resource_attributes['host.name'] = hostname
|
|
33
|
+
elsif !resource_attributes.key?('host.name')
|
|
34
|
+
resource_attributes['host.name'] = hostname
|
|
35
|
+
end
|
|
36
|
+
end
|
|
37
|
+
|
|
38
|
+
::OpenTelemetry::SDK::Resources::Resource.create(resource_attributes)
|
|
39
|
+
end
|
|
40
|
+
|
|
41
|
+
# Returns the signal-specific option value when explicitly set,
|
|
42
|
+
# otherwise falls back to the general OTLP exporter config or computed_default.
|
|
43
|
+
def config_or_exporter_fallback(signal:, option_name:, computed_default: nil)
|
|
44
|
+
signal_settings = @settings.opentelemetry.public_send(signal) # steep:ignore
|
|
45
|
+
if signal_settings.using_default?(option_name)
|
|
46
|
+
@settings.opentelemetry.exporter.public_send(option_name) || computed_default # steep:ignore
|
|
47
|
+
else
|
|
48
|
+
signal_settings.public_send(option_name)
|
|
49
|
+
end
|
|
50
|
+
end
|
|
51
|
+
end
|
|
52
|
+
end
|
|
53
|
+
end
|
|
@@ -22,6 +22,9 @@ require_relative 'opentelemetry/api/baggage'
|
|
|
22
22
|
require_relative 'opentelemetry/sdk/configurator' if defined?(OpenTelemetry::SDK)
|
|
23
23
|
require_relative 'opentelemetry/sdk/trace/span' if defined?(OpenTelemetry::SDK)
|
|
24
24
|
|
|
25
|
+
require_relative 'opentelemetry/metrics' if defined?(OpenTelemetry::SDK::Metrics)
|
|
26
|
+
require_relative 'opentelemetry/logs' if defined?(OpenTelemetry::SDK::Logs)
|
|
27
|
+
|
|
25
28
|
module Datadog
|
|
26
29
|
# Datadog OpenTelemetry integration.
|
|
27
30
|
module OpenTelemetry
|
|
@@ -47,6 +50,7 @@ end
|
|
|
47
50
|
# Currently, this closely translates to Datadog's partial flushing.
|
|
48
51
|
#
|
|
49
52
|
# @see OpenTelemetry::SDK::Trace::SpanProcessor#on_finish
|
|
53
|
+
|
|
50
54
|
Datadog.configure do |c|
|
|
51
55
|
c.tracing.partial_flush.enabled = true
|
|
52
56
|
end
|
|
@@ -14,6 +14,9 @@ module Datadog
|
|
|
14
14
|
#
|
|
15
15
|
# This class acts both as a collector (collecting data) as well as a recorder (records/serializes it)
|
|
16
16
|
class CodeProvenance
|
|
17
|
+
# @rbs standard_library_path: ::String
|
|
18
|
+
# @rbs ruby_native_filename: ::String?
|
|
19
|
+
# @rbs return: void
|
|
17
20
|
def initialize(
|
|
18
21
|
standard_library_path: RbConfig::CONFIG.fetch("rubylibdir"),
|
|
19
22
|
ruby_native_filename: Datadog::Profiling::Collectors::Stack._native_ruby_native_filename
|
|
@@ -22,6 +25,7 @@ module Datadog
|
|
|
22
25
|
@libraries_by_path = {}
|
|
23
26
|
@seen_files = Set.new
|
|
24
27
|
@seen_libraries = Set.new
|
|
28
|
+
@executable_paths = [Gem.bindir, bundler_bin_path].uniq.compact.freeze
|
|
25
29
|
|
|
26
30
|
record_library(
|
|
27
31
|
Library.new(
|
|
@@ -29,11 +33,14 @@ module Datadog
|
|
|
29
33
|
name: "stdlib",
|
|
30
34
|
version: RUBY_VERSION,
|
|
31
35
|
path: standard_library_path,
|
|
32
|
-
|
|
36
|
+
extra_paths: [ruby_native_filename],
|
|
33
37
|
)
|
|
34
38
|
)
|
|
35
39
|
end
|
|
36
40
|
|
|
41
|
+
# @rbs loaded_files: ::Array[::String]
|
|
42
|
+
# @rbs loaded_specs: ::Array[::Gem::BasicSpecification]
|
|
43
|
+
# @rbs return: self
|
|
37
44
|
def refresh(loaded_files: $LOADED_FEATURES, loaded_specs: Gem.loaded_specs.values)
|
|
38
45
|
record_loaded_specs(loaded_specs)
|
|
39
46
|
record_loaded_files(loaded_files)
|
|
@@ -41,18 +48,20 @@ module Datadog
|
|
|
41
48
|
self
|
|
42
49
|
end
|
|
43
50
|
|
|
51
|
+
#: () -> ::String
|
|
44
52
|
def generate_json
|
|
45
53
|
JSON.generate(v1: seen_libraries.to_a)
|
|
46
54
|
end
|
|
47
55
|
|
|
48
56
|
private
|
|
49
57
|
|
|
50
|
-
attr_reader
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
58
|
+
attr_reader :libraries_by_name #: ::Hash[::String, Library]
|
|
59
|
+
attr_reader :libraries_by_path #: ::Hash[::String, Library]
|
|
60
|
+
attr_reader :seen_files #: ::Set[::String]
|
|
61
|
+
attr_reader :seen_libraries #: ::Set[Library]
|
|
62
|
+
attr_reader :executable_paths #: ::Array[::String]
|
|
55
63
|
|
|
64
|
+
#: (Library) -> void
|
|
56
65
|
def record_library(library)
|
|
57
66
|
libraries_by_name[library.name] = library
|
|
58
67
|
libraries_by_path[library.path] = library
|
|
@@ -69,23 +78,32 @@ module Datadog
|
|
|
69
78
|
#
|
|
70
79
|
# Alternatively/in the future we could instead use a trie to match paths, but I doubt for the data sizes we're
|
|
71
80
|
# looking at that a trie is that much faster than using Ruby's built-in native collections.
|
|
81
|
+
#: () -> void
|
|
72
82
|
def sort_libraries_by_longest_path_first
|
|
73
83
|
@libraries_by_path = @libraries_by_path.sort.reverse!.to_h
|
|
74
84
|
end
|
|
75
85
|
|
|
86
|
+
#: (::Array[::Gem::BasicSpecification]) -> void
|
|
76
87
|
def record_loaded_specs(loaded_specs)
|
|
77
88
|
recorded_library = false
|
|
78
89
|
|
|
79
90
|
loaded_specs.each do |spec|
|
|
80
91
|
next if libraries_by_name.key?(spec.name)
|
|
81
92
|
|
|
93
|
+
extra_paths = [(spec.extension_dir if spec.extensions.any?)]
|
|
94
|
+
spec.executables&.each do |executable|
|
|
95
|
+
executable_paths.each do |path|
|
|
96
|
+
extra_paths << File.join(path, executable)
|
|
97
|
+
end
|
|
98
|
+
end
|
|
99
|
+
|
|
82
100
|
record_library(
|
|
83
101
|
Library.new(
|
|
84
102
|
kind: "library",
|
|
85
103
|
name: spec.name,
|
|
86
104
|
version: spec.version,
|
|
87
105
|
path: spec.gem_dir,
|
|
88
|
-
|
|
106
|
+
extra_paths: extra_paths,
|
|
89
107
|
)
|
|
90
108
|
)
|
|
91
109
|
recorded_library = true
|
|
@@ -94,6 +112,7 @@ module Datadog
|
|
|
94
112
|
sort_libraries_by_longest_path_first if recorded_library
|
|
95
113
|
end
|
|
96
114
|
|
|
115
|
+
#: (::Array[::String]) -> void
|
|
97
116
|
def record_loaded_files(loaded_files)
|
|
98
117
|
loaded_files.each do |file_path|
|
|
99
118
|
next if seen_files.include?(file_path)
|
|
@@ -107,6 +126,31 @@ module Datadog
|
|
|
107
126
|
end
|
|
108
127
|
end
|
|
109
128
|
|
|
129
|
+
# This is intended to mirror bundler's `Bundler.bin_path` with one key difference: the bundler version of the
|
|
130
|
+
# method **tries to create the path** if it doesn't exist, whereas our version doesn't.
|
|
131
|
+
#
|
|
132
|
+
# This "try to create the path" is annoying because creating the path can fail if e.g. the app doesn't have
|
|
133
|
+
# permissions to do that, see https://github.com/DataDog/dd-trace-rb/issues/5137.
|
|
134
|
+
# Thus we have our own version that a) Avoids creating the path, and b) Rescues exceptions to avoid any
|
|
135
|
+
# bundler complaints here impacting the application. (Bundler tends to go "something is wrong, raise!" which
|
|
136
|
+
# I think makes a lot of sense given how bundler is intended to be used, but for this our kind of "ask a few
|
|
137
|
+
# questions usage" it's not what we want.)
|
|
138
|
+
#: () -> ::String?
|
|
139
|
+
def bundler_bin_path
|
|
140
|
+
return unless defined?(Bundler)
|
|
141
|
+
|
|
142
|
+
path = Bundler.settings[:bin] || "bin"
|
|
143
|
+
root = Bundler.root
|
|
144
|
+
result = Pathname.new(path).expand_path(root).expand_path
|
|
145
|
+
result.to_s
|
|
146
|
+
rescue Exception => e # rubocop:disable Lint/RescueException
|
|
147
|
+
Datadog.logger.debug(
|
|
148
|
+
"CodeProvenance#bundler_bin_path failed. " \
|
|
149
|
+
"Cause: #{e.class}: #{e.message} Location: #{Array(e.backtrace).first}"
|
|
150
|
+
)
|
|
151
|
+
nil
|
|
152
|
+
end
|
|
153
|
+
|
|
110
154
|
# Represents metadata we have for a ruby gem
|
|
111
155
|
#
|
|
112
156
|
# Important note: This class gets encoded to JSON with the built-in JSON gem. But, we've found that in some
|
|
@@ -116,21 +160,36 @@ module Datadog
|
|
|
116
160
|
# Thus, this class was setup to match the JSON output. Take this into consideration if you are adding new
|
|
117
161
|
# fields. (Also, we have a spec for this)
|
|
118
162
|
class Library
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
|
|
163
|
+
# @rbs @kind: ::String
|
|
164
|
+
# @rbs @name: ::String
|
|
165
|
+
# @rbs @version: ::String
|
|
166
|
+
# @rbs @paths: ::Array[::String]
|
|
167
|
+
|
|
168
|
+
attr_reader :kind #: ::String
|
|
169
|
+
attr_reader :name #: ::String
|
|
170
|
+
attr_reader :version #: ::String
|
|
171
|
+
|
|
172
|
+
# @rbs kind: ::String
|
|
173
|
+
# @rbs name: ::String
|
|
174
|
+
# @rbs version: ::String | ::Gem::Version
|
|
175
|
+
# @rbs path: ::String
|
|
176
|
+
# @rbs extra_paths: ::Array[::String?]
|
|
177
|
+
# @rbs return: void
|
|
178
|
+
def initialize(kind:, name:, version:, path:, extra_paths:)
|
|
179
|
+
extra_paths = Array(extra_paths).compact.reject(&:empty?).map { |p| p.dup.freeze }
|
|
123
180
|
@kind = kind.freeze
|
|
124
181
|
@name = name.dup.freeze
|
|
125
182
|
@version = version.to_s.dup.freeze
|
|
126
|
-
@paths = [path.dup.freeze,
|
|
183
|
+
@paths = [path.dup.freeze, *extra_paths].freeze
|
|
127
184
|
freeze
|
|
128
185
|
end
|
|
129
186
|
|
|
187
|
+
#: (?::JSON::State?) -> ::String
|
|
130
188
|
def to_json(arg = nil)
|
|
131
189
|
{kind: @kind, name: @name, version: @version, paths: @paths}.to_json(arg)
|
|
132
190
|
end
|
|
133
191
|
|
|
192
|
+
#: () -> ::String
|
|
134
193
|
def path
|
|
135
194
|
@paths.first
|
|
136
195
|
end
|
|
@@ -9,12 +9,32 @@ module Datadog
|
|
|
9
9
|
#
|
|
10
10
|
# Methods prefixed with _native_ are implemented in `collectors_cpu_and_wall_time_worker.c`
|
|
11
11
|
class CpuAndWallTimeWorker
|
|
12
|
+
# @rbs @worker_thread: untyped
|
|
13
|
+
# @rbs @start_stop_mutex: ::Thread::Mutex
|
|
14
|
+
# @rbs @failure_exception: ::Exception?
|
|
15
|
+
# @rbs @idle_sampling_helper: IdleSamplingHelper
|
|
16
|
+
# @rbs @wait_until_running_mutex: ::Thread::Mutex
|
|
17
|
+
# @rbs @wait_until_running_condition: ::Thread::ConditionVariable
|
|
18
|
+
|
|
12
19
|
private
|
|
13
20
|
|
|
14
|
-
attr_accessor :failure_exception
|
|
21
|
+
attr_accessor :failure_exception #: ::Exception?
|
|
15
22
|
|
|
16
23
|
public
|
|
17
24
|
|
|
25
|
+
# @rbs gc_profiling_enabled: bool
|
|
26
|
+
# @rbs no_signals_workaround_enabled: bool
|
|
27
|
+
# @rbs thread_context_collector: Datadog::Profiling::Collectors::ThreadContext
|
|
28
|
+
# @rbs dynamic_sampling_rate_overhead_target_percentage: Float
|
|
29
|
+
# @rbs cpu_sampling_interval_ms: ::Integer
|
|
30
|
+
# @rbs idle_sampling_helper: Datadog::Profiling::Collectors::IdleSamplingHelper
|
|
31
|
+
# @rbs dynamic_sampling_rate_enabled: bool
|
|
32
|
+
# @rbs allocation_profiling_enabled: bool
|
|
33
|
+
# @rbs allocation_counting_enabled: bool
|
|
34
|
+
# @rbs gvl_profiling_enabled: bool
|
|
35
|
+
# @rbs sighandler_sampling_enabled: bool
|
|
36
|
+
# @rbs skip_idle_samples_for_testing: false
|
|
37
|
+
# @rbs return: void
|
|
18
38
|
def initialize(
|
|
19
39
|
gc_profiling_enabled:,
|
|
20
40
|
no_signals_workaround_enabled:,
|
|
@@ -24,11 +44,12 @@ module Datadog
|
|
|
24
44
|
allocation_counting_enabled:,
|
|
25
45
|
gvl_profiling_enabled:,
|
|
26
46
|
sighandler_sampling_enabled:,
|
|
47
|
+
cpu_sampling_interval_ms:,
|
|
27
48
|
# **NOTE**: This should only be used for testing; disabling the dynamic sampling rate will increase the
|
|
28
49
|
# profiler overhead!
|
|
29
50
|
dynamic_sampling_rate_enabled: true,
|
|
30
51
|
skip_idle_samples_for_testing: false,
|
|
31
|
-
idle_sampling_helper: IdleSamplingHelper.new
|
|
52
|
+
idle_sampling_helper: IdleSamplingHelper.new(thread_context_collector: thread_context_collector)
|
|
32
53
|
)
|
|
33
54
|
unless dynamic_sampling_rate_enabled
|
|
34
55
|
Datadog.logger.warn(
|
|
@@ -39,6 +60,10 @@ module Datadog
|
|
|
39
60
|
)
|
|
40
61
|
end
|
|
41
62
|
|
|
63
|
+
if cpu_sampling_interval_ms < 1
|
|
64
|
+
raise ArgumentError, "cpu_sampling_interval_ms must be a positive integer, got #{cpu_sampling_interval_ms}"
|
|
65
|
+
end
|
|
66
|
+
|
|
42
67
|
self.class._native_initialize(
|
|
43
68
|
self_instance: self,
|
|
44
69
|
thread_context_collector: thread_context_collector,
|
|
@@ -52,6 +77,7 @@ module Datadog
|
|
|
52
77
|
gvl_profiling_enabled: gvl_profiling_enabled,
|
|
53
78
|
sighandler_sampling_enabled: sighandler_sampling_enabled,
|
|
54
79
|
skip_idle_samples_for_testing: skip_idle_samples_for_testing,
|
|
80
|
+
cpu_sampling_interval_ms: cpu_sampling_interval_ms,
|
|
55
81
|
)
|
|
56
82
|
@worker_thread = nil
|
|
57
83
|
@failure_exception = nil
|
|
@@ -61,6 +87,8 @@ module Datadog
|
|
|
61
87
|
@wait_until_running_condition = ConditionVariable.new
|
|
62
88
|
end
|
|
63
89
|
|
|
90
|
+
# @rbs on_failure_proc: (^(?log_failure: bool) -> void)?
|
|
91
|
+
# @rbs return: bool?
|
|
64
92
|
def start(on_failure_proc: nil)
|
|
65
93
|
@start_stop_mutex.synchronize do
|
|
66
94
|
return if @worker_thread&.alive?
|
|
@@ -75,14 +103,22 @@ module Datadog
|
|
|
75
103
|
self.class._native_sampling_loop(self)
|
|
76
104
|
|
|
77
105
|
Datadog.logger.debug("CpuAndWallTimeWorker thread stopping cleanly")
|
|
106
|
+
rescue Profiling::ExistingSignalHandler => e
|
|
107
|
+
@failure_exception = e
|
|
108
|
+
Datadog.logger.warn(
|
|
109
|
+
"Profiling was not started as another profiler or gem is already using the SIGPROF signal. " \
|
|
110
|
+
"Please disable the other profiler to use Datadog profiling."
|
|
111
|
+
)
|
|
112
|
+
on_failure_proc&.call(log_failure: false)
|
|
78
113
|
rescue Exception => e # rubocop:disable Lint/RescueException
|
|
79
114
|
@failure_exception = e
|
|
115
|
+
operation_name = self.class._native_failure_exception_during_operation(self).inspect
|
|
80
116
|
Datadog.logger.warn(
|
|
81
117
|
"CpuAndWallTimeWorker thread error. " \
|
|
82
|
-
"Cause: #{e.class
|
|
118
|
+
"Operation: #{operation_name} Cause: #{e.class}: #{e.message} Location: #{Array(e.backtrace).first}"
|
|
83
119
|
)
|
|
84
120
|
on_failure_proc&.call
|
|
85
|
-
Datadog::Core::Telemetry::Logger.report(e, description: "CpuAndWallTimeWorker thread error
|
|
121
|
+
Datadog::Core::Telemetry::Logger.report(e, description: "CpuAndWallTimeWorker thread error: #{operation_name}")
|
|
86
122
|
end
|
|
87
123
|
@worker_thread.name = self.class.name # Repeated from above to make sure thread gets named asap
|
|
88
124
|
@worker_thread.thread_variable_set(:fork_safe, true)
|
|
@@ -91,6 +127,7 @@ module Datadog
|
|
|
91
127
|
true
|
|
92
128
|
end
|
|
93
129
|
|
|
130
|
+
#: () -> void
|
|
94
131
|
def stop
|
|
95
132
|
@start_stop_mutex.synchronize do
|
|
96
133
|
Datadog.logger.debug("Requesting CpuAndWallTimeWorker thread shut down")
|
|
@@ -107,14 +144,17 @@ module Datadog
|
|
|
107
144
|
end
|
|
108
145
|
end
|
|
109
146
|
|
|
147
|
+
#: () -> true
|
|
110
148
|
def reset_after_fork
|
|
111
149
|
self.class._native_reset_after_fork(self)
|
|
112
150
|
end
|
|
113
151
|
|
|
152
|
+
#: () -> ::Hash[::Symbol, untyped]
|
|
114
153
|
def stats
|
|
115
154
|
self.class._native_stats(self)
|
|
116
155
|
end
|
|
117
156
|
|
|
157
|
+
#: () -> ::Hash[::Symbol, untyped]
|
|
118
158
|
def stats_and_reset_not_thread_safe
|
|
119
159
|
stats = self.stats
|
|
120
160
|
self.class._native_stats_reset_not_thread_safe(self)
|
|
@@ -122,22 +162,30 @@ module Datadog
|
|
|
122
162
|
end
|
|
123
163
|
|
|
124
164
|
# Useful for testing, to e.g. make sure the profiler is running before we start running some code we want to observe
|
|
165
|
+
# @rbs timeout_seconds: ::Integer?
|
|
166
|
+
# @rbs return: true
|
|
125
167
|
def wait_until_running(timeout_seconds: 5)
|
|
126
168
|
@wait_until_running_mutex.synchronize do
|
|
127
169
|
return true if self.class._native_is_running?(self)
|
|
128
170
|
|
|
129
171
|
@wait_until_running_condition.wait(@wait_until_running_mutex, timeout_seconds)
|
|
130
172
|
|
|
173
|
+
# Not using `_native_is_running?(self) || raise(...)` here: `_native_is_running?` is declared
|
|
174
|
+
# to return `bool`, so steep infers the `||` expression as `bool` too and rejects it against
|
|
175
|
+
# this method's declared `true` return type. The explicit `if`/`else` type-checks correctly.
|
|
176
|
+
# rubocop:disable Style/RedundantCondition
|
|
131
177
|
if self.class._native_is_running?(self)
|
|
132
178
|
true
|
|
133
179
|
else
|
|
134
180
|
raise "Timeout waiting for #{self.class.name} to start (waited for #{timeout_seconds} seconds)"
|
|
135
181
|
end
|
|
182
|
+
# rubocop:enable Style/RedundantCondition
|
|
136
183
|
end
|
|
137
184
|
end
|
|
138
185
|
|
|
139
186
|
private
|
|
140
187
|
|
|
188
|
+
#: () -> void
|
|
141
189
|
def signal_running
|
|
142
190
|
@wait_until_running_mutex.synchronize { @wait_until_running_condition.broadcast }
|
|
143
191
|
end
|
|
@@ -8,17 +8,24 @@ module Datadog
|
|
|
8
8
|
#
|
|
9
9
|
# Methods prefixed with _native_ are implemented in `collectors_idle_sampling_helper.c`
|
|
10
10
|
class IdleSamplingHelper
|
|
11
|
+
# @rbs @worker_thread: untyped
|
|
12
|
+
# @rbs @start_stop_mutex: ::Thread::Mutex
|
|
13
|
+
# @rbs @thread_context_collector: Datadog::Profiling::Collectors::ThreadContext?
|
|
14
|
+
|
|
11
15
|
private
|
|
12
16
|
|
|
13
|
-
attr_accessor :failure_exception
|
|
17
|
+
attr_accessor :failure_exception #: ::Exception?
|
|
14
18
|
|
|
15
19
|
public
|
|
16
20
|
|
|
17
|
-
|
|
21
|
+
#: (thread_context_collector: Datadog::Profiling::Collectors::ThreadContext) -> void
|
|
22
|
+
def initialize(thread_context_collector:)
|
|
18
23
|
@worker_thread = nil
|
|
19
24
|
@start_stop_mutex = Mutex.new
|
|
25
|
+
@thread_context_collector = thread_context_collector
|
|
20
26
|
end
|
|
21
27
|
|
|
28
|
+
#: () -> (nil | true)
|
|
22
29
|
def start
|
|
23
30
|
@start_stop_mutex.synchronize do
|
|
24
31
|
return if @worker_thread&.alive?
|
|
@@ -32,16 +39,16 @@ module Datadog
|
|
|
32
39
|
@worker_thread = Thread.new do
|
|
33
40
|
Thread.current.name = self.class.name
|
|
34
41
|
|
|
35
|
-
self.class._native_idle_sampling_loop(self)
|
|
42
|
+
self.class._native_idle_sampling_loop(self, @thread_context_collector)
|
|
36
43
|
|
|
37
44
|
Datadog.logger.debug("IdleSamplingHelper thread stopping cleanly")
|
|
38
45
|
rescue Exception => e # rubocop:disable Lint/RescueException
|
|
39
46
|
@failure_exception = e
|
|
40
47
|
Datadog.logger.warn(
|
|
41
48
|
"IdleSamplingHelper thread error. " \
|
|
42
|
-
"Cause: #{e.class
|
|
49
|
+
"Cause: #{e.class}: #{e.message} Location: #{Array(e.backtrace).first}"
|
|
43
50
|
)
|
|
44
|
-
Datadog::Core::Telemetry::Logger.report(e, description: "IdleSamplingHelper thread error"
|
|
51
|
+
Datadog::Core::Telemetry::Logger.report(e, description: "IdleSamplingHelper thread error")
|
|
45
52
|
end
|
|
46
53
|
@worker_thread.name = self.class.name # Repeated from above to make sure thread gets named asap
|
|
47
54
|
@worker_thread.thread_variable_set(:fork_safe, true)
|
|
@@ -50,6 +57,7 @@ module Datadog
|
|
|
50
57
|
true
|
|
51
58
|
end
|
|
52
59
|
|
|
60
|
+
#: () -> void
|
|
53
61
|
def stop
|
|
54
62
|
@start_stop_mutex.synchronize do
|
|
55
63
|
Datadog.logger.debug("Requesting IdleSamplingHelper thread shut down")
|
|
@@ -14,8 +14,17 @@ module Datadog
|
|
|
14
14
|
# could be seen as overkill for this case but it allows us to centralize information
|
|
15
15
|
# gathering and easily support more flexible/dynamic info collection in the future.
|
|
16
16
|
class Info
|
|
17
|
+
# @rbs @info: ::Hash[::Symbol, ::Hash[::Symbol, untyped]]
|
|
18
|
+
# @rbs @platform_info: ::Hash[::Symbol, untyped]
|
|
19
|
+
# @rbs @runtime_info: ::Hash[::Symbol, untyped]
|
|
20
|
+
# @rbs @application_info: ::Hash[::Symbol, untyped]
|
|
21
|
+
# @rbs @profiler_info: ::Hash[::Symbol, untyped]?
|
|
22
|
+
# @rbs @gc_tuning_info: ::Hash[::Symbol, ::String]
|
|
23
|
+
|
|
24
|
+
#: (untyped) -> void
|
|
17
25
|
def initialize(settings)
|
|
18
26
|
@profiler_info = nil
|
|
27
|
+
|
|
19
28
|
@info = {
|
|
20
29
|
platform: collect_platform_info,
|
|
21
30
|
runtime: collect_runtime_info,
|
|
@@ -24,7 +33,7 @@ module Datadog
|
|
|
24
33
|
}.freeze
|
|
25
34
|
end
|
|
26
35
|
|
|
27
|
-
attr_reader :info
|
|
36
|
+
attr_reader :info #: ::Hash[::Symbol, ::Hash[::Symbol, untyped]]
|
|
28
37
|
|
|
29
38
|
private
|
|
30
39
|
|
|
@@ -67,6 +76,7 @@ module Datadog
|
|
|
67
76
|
# gets initialized before a user has a chance to configure the library.
|
|
68
77
|
START_TIME = Time.now.utc.freeze
|
|
69
78
|
|
|
79
|
+
#: () -> ::Hash[::Symbol, untyped]
|
|
70
80
|
def collect_platform_info
|
|
71
81
|
@platform_info ||= {
|
|
72
82
|
container_id: Datadog::Core::Environment::Container.container_id,
|
|
@@ -77,6 +87,7 @@ module Datadog
|
|
|
77
87
|
}.freeze
|
|
78
88
|
end
|
|
79
89
|
|
|
90
|
+
#: () -> ::Hash[::Symbol, untyped]
|
|
80
91
|
def collect_runtime_info
|
|
81
92
|
@runtime_info ||= {
|
|
82
93
|
engine: Datadog::Core::Environment::Identity.lang_engine,
|
|
@@ -86,6 +97,7 @@ module Datadog
|
|
|
86
97
|
}.freeze
|
|
87
98
|
end
|
|
88
99
|
|
|
100
|
+
#: (untyped) -> ::Hash[::Symbol, untyped]
|
|
89
101
|
def collect_application_info(settings)
|
|
90
102
|
@application_info ||= {
|
|
91
103
|
start_time: START_TIME.iso8601,
|
|
@@ -95,8 +107,9 @@ module Datadog
|
|
|
95
107
|
}.freeze
|
|
96
108
|
end
|
|
97
109
|
|
|
110
|
+
#: (untyped) -> ::Hash[::Symbol, untyped]
|
|
98
111
|
def collect_profiler_info(settings)
|
|
99
|
-
|
|
112
|
+
@profiler_info ||= begin
|
|
100
113
|
lib_datadog_gem = ::Gem.loaded_specs["libdatadog"]
|
|
101
114
|
|
|
102
115
|
libdatadog_version =
|
|
@@ -108,13 +121,12 @@ module Datadog
|
|
|
108
121
|
"#{Libdatadog::VERSION}-(unknown)"
|
|
109
122
|
end
|
|
110
123
|
|
|
111
|
-
|
|
124
|
+
{
|
|
112
125
|
version: Datadog::Core::Environment::Identity.gem_datadog_version,
|
|
113
126
|
libdatadog: libdatadog_version,
|
|
114
127
|
settings: collect_settings_recursively(settings.profiling),
|
|
115
128
|
}.freeze
|
|
116
129
|
end
|
|
117
|
-
@profiler_info
|
|
118
130
|
end
|
|
119
131
|
|
|
120
132
|
# The settings/option model isn't directly serializable because
|
|
@@ -122,6 +134,7 @@ module Datadog
|
|
|
122
134
|
# instances without proper serialization.
|
|
123
135
|
# This method navigates a settings object recursively, converting
|
|
124
136
|
# it into more basic types that are trivially convertible to JSON.
|
|
137
|
+
#: (untyped) -> untyped
|
|
125
138
|
def collect_settings_recursively(v)
|
|
126
139
|
v = v.options_hash if v.respond_to?(:options_hash)
|
|
127
140
|
|
|
@@ -142,6 +155,7 @@ module Datadog
|
|
|
142
155
|
end
|
|
143
156
|
end
|
|
144
157
|
|
|
158
|
+
#: () -> ::Hash[::Symbol, ::String]
|
|
145
159
|
def collect_gc_tuning_info
|
|
146
160
|
return @gc_tuning_info if defined?(@gc_tuning_info)
|
|
147
161
|
|
|
@@ -19,7 +19,6 @@ module Datadog
|
|
|
19
19
|
max_frames:,
|
|
20
20
|
tracer:,
|
|
21
21
|
endpoint_collection_enabled:,
|
|
22
|
-
timeline_enabled:,
|
|
23
22
|
waiting_for_gvl_threshold_ns:,
|
|
24
23
|
otel_context_enabled:,
|
|
25
24
|
native_filenames_enabled:
|
|
@@ -31,10 +30,10 @@ module Datadog
|
|
|
31
30
|
max_frames: max_frames,
|
|
32
31
|
tracer_context_key: tracer_context_key,
|
|
33
32
|
endpoint_collection_enabled: endpoint_collection_enabled,
|
|
34
|
-
timeline_enabled: timeline_enabled,
|
|
35
33
|
waiting_for_gvl_threshold_ns: waiting_for_gvl_threshold_ns,
|
|
36
34
|
otel_context_enabled: otel_context_enabled,
|
|
37
35
|
native_filenames_enabled: validate_native_filenames(native_filenames_enabled),
|
|
36
|
+
overhead_filename: __FILE__,
|
|
38
37
|
)
|
|
39
38
|
end
|
|
40
39
|
|
|
@@ -43,23 +42,29 @@ module Datadog
|
|
|
43
42
|
max_frames: 400,
|
|
44
43
|
tracer: nil,
|
|
45
44
|
endpoint_collection_enabled: false,
|
|
46
|
-
timeline_enabled: false,
|
|
47
45
|
waiting_for_gvl_threshold_ns: 10_000_000,
|
|
48
46
|
otel_context_enabled: false,
|
|
49
47
|
native_filenames_enabled: true,
|
|
48
|
+
trigger_global_reset: true,
|
|
50
49
|
**options
|
|
51
50
|
)
|
|
52
|
-
new(
|
|
51
|
+
collector = new(
|
|
53
52
|
recorder: recorder,
|
|
54
53
|
max_frames: max_frames,
|
|
55
54
|
tracer: tracer,
|
|
56
55
|
endpoint_collection_enabled: endpoint_collection_enabled,
|
|
57
|
-
timeline_enabled: timeline_enabled,
|
|
58
56
|
waiting_for_gvl_threshold_ns: waiting_for_gvl_threshold_ns,
|
|
59
57
|
otel_context_enabled: otel_context_enabled,
|
|
60
58
|
native_filenames_enabled: native_filenames_enabled,
|
|
61
59
|
**options,
|
|
62
60
|
)
|
|
61
|
+
|
|
62
|
+
# By default, mirror what the CpuAndWallTimeWorker does when profiling starts: reset the global per-thread
|
|
63
|
+
# context state, which (among other things) resizes the per-thread sampling buffers to this collector's
|
|
64
|
+
# max_frames. Tests that need to control this explicitly can pass `trigger_global_reset: false`.
|
|
65
|
+
Testing._native_global_reset_per_thread_context(collector) if trigger_global_reset
|
|
66
|
+
|
|
67
|
+
collector
|
|
63
68
|
end
|
|
64
69
|
|
|
65
70
|
def inspect
|