datadog 2.17.0 → 2.37.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 +686 -1
- data/README.md +0 -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 +344 -126
- 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 +314 -91
- data/ext/datadog_profiling_native_extension/collectors_stack.h +26 -3
- data/ext/datadog_profiling_native_extension/collectors_thread_context.c +680 -352
- data/ext/datadog_profiling_native_extension/collectors_thread_context.h +18 -5
- 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 +48 -34
- 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 +455 -430
- data/ext/datadog_profiling_native_extension/heap_recorder.h +16 -7
- data/ext/datadog_profiling_native_extension/http_transport.c +66 -68
- data/ext/datadog_profiling_native_extension/libdatadog_helpers.c +18 -15
- data/ext/datadog_profiling_native_extension/libdatadog_helpers.h +8 -10
- 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 +73 -69
- data/ext/datadog_profiling_native_extension/private_vm_api_access.h +10 -4
- data/ext/datadog_profiling_native_extension/profiling.c +65 -19
- data/ext/datadog_profiling_native_extension/ruby_helpers.c +64 -59
- data/ext/datadog_profiling_native_extension/ruby_helpers.h +20 -16
- 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 +253 -131
- data/ext/datadog_profiling_native_extension/stack_recorder.h +3 -1
- data/ext/datadog_profiling_native_extension/time_helpers.h +1 -0
- 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 +21 -25
- 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 +88 -37
- data/ext/libdatadog_api/library_config.h +6 -0
- data/ext/libdatadog_api/process_discovery.c +25 -24
- data/ext/libdatadog_extconf_helpers.rb +107 -14
- 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 +104 -0
- data/lib/datadog/appsec/api_security/sampler.rb +62 -0
- data/lib/datadog/appsec/api_security.rb +14 -0
- 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 +601 -74
- data/lib/datadog/appsec/assets/waf_rules/strict.json +48 -75
- data/lib/datadog/appsec/assets.rb +1 -1
- data/lib/datadog/appsec/autoload.rb +2 -2
- data/lib/datadog/appsec/component.rb +37 -64
- data/lib/datadog/appsec/compressed_json.rb +3 -3
- data/lib/datadog/appsec/configuration.rb +427 -1
- data/lib/datadog/appsec/context.rb +77 -16
- 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 +4 -2
- data/lib/datadog/appsec/contrib/devise/patches/signup_tracking_patch.rb +2 -1
- data/lib/datadog/appsec/contrib/devise/tracking_middleware.rb +1 -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 -13
- 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 -13
- 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 +47 -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 +80 -62
- data/lib/datadog/appsec/contrib/rack/response_body.rb +36 -0
- data/lib/datadog/appsec/contrib/rails/gateway/request.rb +35 -1
- data/lib/datadog/appsec/contrib/rails/gateway/watcher.rb +47 -5
- data/lib/datadog/appsec/contrib/rails/integration.rb +1 -1
- data/lib/datadog/appsec/contrib/rails/patcher.rb +52 -26
- data/lib/datadog/appsec/contrib/rails/patches/process_action_patch.rb +29 -0
- data/lib/datadog/appsec/contrib/rails/patches/render_to_body_patch.rb +33 -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 -12
- data/lib/datadog/appsec/contrib/sinatra/gateway/watcher.rb +63 -10
- data/lib/datadog/appsec/contrib/sinatra/integration.rb +1 -1
- data/lib/datadog/appsec/contrib/sinatra/patcher.rb +11 -21
- data/lib/datadog/appsec/contrib/sinatra/patches/json_patch.rb +31 -0
- 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 +14 -47
- data/lib/datadog/appsec/ext.rb +3 -0
- data/lib/datadog/appsec/instrumentation/gateway/argument.rb +17 -1
- 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 +47 -5
- data/lib/datadog/appsec/metrics/exporter.rb +16 -3
- data/lib/datadog/appsec/metrics/telemetry.rb +21 -4
- data/lib/datadog/appsec/metrics/telemetry_exporter.rb +47 -0
- data/lib/datadog/appsec/metrics.rb +5 -4
- data/lib/datadog/appsec/monitor/gateway/watcher.rb +8 -6
- data/lib/datadog/appsec/processor/rule_loader.rb +5 -6
- data/lib/datadog/appsec/remote.rb +51 -76
- 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 +197 -0
- data/lib/datadog/appsec/security_engine/result.rb +45 -9
- data/lib/datadog/appsec/security_engine/runner.rb +44 -21
- data/lib/datadog/appsec/security_event.rb +5 -7
- data/lib/datadog/appsec/thread_safe_ref.rb +61 -0
- data/lib/datadog/appsec/trace_keeper.rb +36 -0
- data/lib/datadog/appsec/utils/hash_coercion.rb +23 -0
- 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 +10 -17
- data/lib/datadog/auto_instrument_base.rb +2 -1
- data/lib/datadog/core/configuration/agent_settings.rb +52 -0
- data/lib/datadog/core/configuration/agent_settings_resolver.rb +5 -47
- data/lib/datadog/core/configuration/base.rb +17 -5
- data/lib/datadog/core/configuration/components.rb +192 -20
- data/lib/datadog/core/configuration/components_state.rb +6 -1
- data/lib/datadog/core/configuration/config_helper.rb +109 -0
- data/lib/datadog/core/configuration/deprecations.rb +36 -0
- data/lib/datadog/core/configuration/ext.rb +0 -1
- data/lib/datadog/core/configuration/option.rb +95 -65
- data/lib/datadog/core/configuration/option_definition.rb +42 -23
- data/lib/datadog/core/configuration/options.rb +57 -18
- data/lib/datadog/core/configuration/settings.rb +160 -25
- data/lib/datadog/core/configuration/stable_config.rb +11 -2
- data/lib/datadog/core/configuration/supported_configurations.rb +413 -0
- data/lib/datadog/core/configuration.rb +4 -4
- 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 +9 -21
- data/lib/datadog/core/ddsketch.rb +19 -0
- data/lib/datadog/core/deprecations.rb +2 -2
- 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 -2
- data/lib/datadog/core/environment/git.rb +2 -2
- 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/variable_helpers.rb +3 -3
- 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 +57 -0
- data/lib/datadog/core/logger.rb +1 -1
- data/lib/datadog/core/metrics/client.rb +7 -7
- data/lib/datadog/core/metrics/logging.rb +1 -1
- data/lib/datadog/core/pin.rb +8 -8
- data/lib/datadog/core/process_discovery/tracer_memfd.rb +13 -0
- data/lib/datadog/core/process_discovery.rb +51 -21
- 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 +13 -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/ext.rb +0 -1
- data/lib/datadog/core/runtime/metrics.rb +11 -2
- data/lib/datadog/core/semaphore.rb +1 -4
- data/lib/datadog/core/tag_builder.rb +52 -0
- data/lib/datadog/core/tag_normalizer.rb +84 -0
- data/lib/datadog/core/telemetry/component.rb +65 -17
- data/lib/datadog/core/telemetry/emitter.rb +6 -6
- data/lib/datadog/core/telemetry/event/app_client_configuration_change.rb +3 -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 +203 -89
- 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 +5 -2
- data/lib/datadog/core/telemetry/logging.rb +22 -4
- 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/adapters/net.rb +17 -2
- 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 +11 -7
- data/lib/datadog/core/transport/http/client.rb +80 -0
- data/lib/datadog/core/transport/http/env.rb +8 -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 +1 -1
- 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 -14
- 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 +1 -1
- data/lib/datadog/core/utils.rb +10 -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 +11 -2
- 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 +11 -1
- data/lib/datadog/di/code_tracker.rb +217 -15
- data/lib/datadog/di/component.rb +143 -48
- data/lib/datadog/di/configuration.rb +235 -2
- data/lib/datadog/di/context.rb +76 -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 +620 -132
- data/lib/datadog/di/logger.rb +2 -2
- data/lib/datadog/di/probe.rb +78 -15
- data/lib/datadog/di/probe_builder.rb +42 -3
- data/lib/datadog/di/probe_file_loader/railtie.rb +15 -0
- data/lib/datadog/di/probe_file_loader.rb +87 -0
- data/lib/datadog/di/probe_manager.rb +195 -100
- data/lib/datadog/di/probe_notification_builder.rb +285 -100
- data/lib/datadog/di/probe_notifier_worker.rb +120 -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 -95
- data/lib/datadog/di/serializer.rb +297 -20
- 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 +12 -34
- data/lib/datadog/di/transport/http.rb +43 -19
- data/lib/datadog/di/transport/input.rb +121 -39
- data/lib/datadog/di/utils.rb +42 -14
- data/lib/datadog/di.rb +203 -10
- 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 +253 -0
- data/lib/datadog/kit/appsec/events.rb +11 -10
- data/lib/datadog/kit/enable_core_dumps.rb +1 -1
- data/lib/datadog/kit/identity.rb +17 -11
- 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 +3 -3
- data/lib/datadog/opentelemetry/api/context.rb +10 -9
- 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 +66 -2
- 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 +13 -7
- data/lib/datadog/opentelemetry/sdk/span_processor.rb +12 -9
- data/lib/datadog/opentelemetry/sdk/trace/span.rb +14 -10
- data/lib/datadog/opentelemetry/sdk.rb +19 -0
- data/lib/datadog/opentelemetry/signal_configuration.rb +53 -0
- data/lib/datadog/opentelemetry/trace.rb +4 -4
- data/lib/datadog/opentelemetry.rb +4 -0
- data/lib/datadog/profiling/collectors/code_provenance.rb +83 -15
- data/lib/datadog/profiling/collectors/cpu_and_wall_time_worker.rb +52 -3
- data/lib/datadog/profiling/collectors/idle_sampling_helper.rb +13 -4
- data/lib/datadog/profiling/collectors/info.rb +59 -4
- data/lib/datadog/profiling/collectors/thread_context.rb +17 -5
- data/lib/datadog/profiling/component.rb +73 -49
- data/lib/datadog/profiling/exporter.rb +48 -13
- 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 +2 -15
- data/lib/datadog/profiling/flush.rb +23 -11
- data/lib/datadog/profiling/http_transport.rb +24 -11
- data/lib/datadog/profiling/load_native_extension.rb +2 -2
- data/lib/datadog/profiling/profiler.rb +31 -12
- data/lib/datadog/profiling/scheduler.rb +12 -10
- data/lib/datadog/profiling/sequence_tracker.rb +44 -0
- data/lib/datadog/profiling/stack_recorder.rb +5 -13
- data/lib/datadog/profiling/tag_builder.rb +42 -38
- data/lib/datadog/profiling/tasks/exec.rb +10 -5
- data/lib/datadog/profiling/tasks/help.rb +1 -0
- data/lib/datadog/profiling/tasks/setup.rb +4 -2
- data/lib/datadog/profiling.rb +8 -11
- data/lib/datadog/ruby_version.rb +25 -0
- data/lib/datadog/single_step_instrument.rb +10 -1
- 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/analytics.rb +1 -1
- data/lib/datadog/tracing/buffer.rb +10 -10
- data/lib/datadog/tracing/component.rb +17 -17
- data/lib/datadog/tracing/configuration/dynamic.rb +6 -8
- data/lib/datadog/tracing/configuration/ext.rb +25 -5
- data/lib/datadog/tracing/configuration/settings.rb +125 -11
- data/lib/datadog/tracing/context.rb +2 -2
- data/lib/datadog/tracing/contrib/action_cable/event.rb +1 -1
- 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_cable/integration.rb +1 -1
- data/lib/datadog/tracing/contrib/action_mailer/event.rb +4 -1
- data/lib/datadog/tracing/contrib/action_mailer/integration.rb +1 -1
- data/lib/datadog/tracing/contrib/action_pack/action_controller/instrumentation.rb +29 -11
- data/lib/datadog/tracing/contrib/action_pack/action_dispatch/instrumentation.rb +47 -12
- data/lib/datadog/tracing/contrib/action_pack/action_dispatch/patcher.rb +3 -1
- data/lib/datadog/tracing/contrib/action_pack/ext.rb +2 -0
- data/lib/datadog/tracing/contrib/action_pack/integration.rb +1 -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 +6 -3
- data/lib/datadog/tracing/contrib/active_job/event.rb +8 -8
- data/lib/datadog/tracing/contrib/active_job/events/discard.rb +6 -3
- data/lib/datadog/tracing/contrib/active_job/events/enqueue.rb +6 -3
- data/lib/datadog/tracing/contrib/active_job/events/enqueue_at.rb +6 -3
- data/lib/datadog/tracing/contrib/active_job/events/enqueue_retry.rb +6 -3
- data/lib/datadog/tracing/contrib/active_job/events/perform.rb +6 -3
- data/lib/datadog/tracing/contrib/active_job/events/retry_stopped.rb +6 -3
- data/lib/datadog/tracing/contrib/active_job/integration.rb +1 -1
- data/lib/datadog/tracing/contrib/active_job/log_injection.rb +21 -7
- data/lib/datadog/tracing/contrib/active_job/patcher.rb +5 -1
- data/lib/datadog/tracing/contrib/active_model_serializers/events/render.rb +2 -2
- data/lib/datadog/tracing/contrib/active_model_serializers/events/serialize.rb +4 -4
- data/lib/datadog/tracing/contrib/active_model_serializers/integration.rb +1 -2
- data/lib/datadog/tracing/contrib/active_record/configuration/resolver.rb +3 -3
- data/lib/datadog/tracing/contrib/active_record/events/instantiation.rb +2 -2
- data/lib/datadog/tracing/contrib/active_record/events/sql.rb +7 -10
- data/lib/datadog/tracing/contrib/active_record/integration.rb +1 -1
- data/lib/datadog/tracing/contrib/active_record/utils.rb +16 -16
- data/lib/datadog/tracing/contrib/active_support/cache/events/cache.rb +15 -12
- data/lib/datadog/tracing/contrib/active_support/cache/instrumentation.rb +1 -4
- data/lib/datadog/tracing/contrib/active_support/configuration/settings.rb +13 -0
- data/lib/datadog/tracing/contrib/active_support/integration.rb +1 -1
- data/lib/datadog/tracing/contrib/active_support/notifications/event.rb +2 -1
- data/lib/datadog/tracing/contrib/active_support/notifications/subscription.rb +8 -10
- data/lib/datadog/tracing/contrib/aws/ext.rb +1 -1
- data/lib/datadog/tracing/contrib/aws/instrumentation.rb +8 -10
- data/lib/datadog/tracing/contrib/aws/parsed_context.rb +3 -1
- data/lib/datadog/tracing/contrib/aws/patcher.rb +5 -1
- data/lib/datadog/tracing/contrib/aws/service/base.rb +2 -1
- data/lib/datadog/tracing/contrib/aws/service/dynamodb.rb +1 -1
- data/lib/datadog/tracing/contrib/aws/service/eventbridge.rb +1 -1
- data/lib/datadog/tracing/contrib/aws/service/kinesis.rb +1 -1
- data/lib/datadog/tracing/contrib/aws/service/s3.rb +1 -1
- data/lib/datadog/tracing/contrib/aws/service/sns.rb +1 -1
- data/lib/datadog/tracing/contrib/aws/service/sqs.rb +1 -1
- data/lib/datadog/tracing/contrib/aws/service/states.rb +1 -1
- data/lib/datadog/tracing/contrib/aws/services.rb +7 -7
- data/lib/datadog/tracing/contrib/component.rb +3 -3
- data/lib/datadog/tracing/contrib/concurrent_ruby/async_patch.rb +1 -1
- data/lib/datadog/tracing/contrib/concurrent_ruby/context_composite_executor_service.rb +1 -1
- data/lib/datadog/tracing/contrib/concurrent_ruby/future_patch.rb +1 -1
- data/lib/datadog/tracing/contrib/concurrent_ruby/integration.rb +1 -1
- data/lib/datadog/tracing/contrib/concurrent_ruby/promises_future_patch.rb +1 -1
- data/lib/datadog/tracing/contrib/configurable.rb +22 -7
- data/lib/datadog/tracing/contrib/configuration/resolver.rb +14 -4
- data/lib/datadog/tracing/contrib/configuration/resolvers/pattern_resolver.rb +4 -4
- data/lib/datadog/tracing/contrib/dalli/ext.rb +3 -2
- data/lib/datadog/tracing/contrib/dalli/instrumentation.rb +1 -5
- data/lib/datadog/tracing/contrib/dalli/integration.rb +5 -2
- data/lib/datadog/tracing/contrib/dalli/quantize.rb +1 -1
- data/lib/datadog/tracing/contrib/delayed_job/integration.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/ext.rb +3 -2
- data/lib/datadog/tracing/contrib/elasticsearch/integration.rb +4 -4
- data/lib/datadog/tracing/contrib/elasticsearch/patcher.rb +47 -53
- data/lib/datadog/tracing/contrib/elasticsearch/quantize.rb +7 -7
- data/lib/datadog/tracing/contrib/ethon/configuration/settings.rb +5 -1
- data/lib/datadog/tracing/contrib/ethon/easy_patch.rb +7 -8
- data/lib/datadog/tracing/contrib/ethon/ext.rb +4 -2
- data/lib/datadog/tracing/contrib/ethon/integration.rb +1 -1
- 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 +4 -2
- data/lib/datadog/tracing/contrib/excon/integration.rb +1 -1
- data/lib/datadog/tracing/contrib/excon/middleware.rb +5 -9
- data/lib/datadog/tracing/contrib/ext.rb +6 -4
- data/lib/datadog/tracing/contrib/extensions.rb +28 -11
- data/lib/datadog/tracing/contrib/faraday/configuration/settings.rb +16 -9
- data/lib/datadog/tracing/contrib/faraday/ext.rb +4 -2
- data/lib/datadog/tracing/contrib/faraday/integration.rb +1 -1
- data/lib/datadog/tracing/contrib/faraday/middleware.rb +7 -9
- data/lib/datadog/tracing/contrib/grape/configuration/settings.rb +7 -3
- data/lib/datadog/tracing/contrib/grape/endpoint.rb +18 -15
- data/lib/datadog/tracing/contrib/grape/instrumentation.rb +13 -8
- data/lib/datadog/tracing/contrib/grape/integration.rb +1 -1
- 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/integration.rb +1 -1
- data/lib/datadog/tracing/contrib/graphql/patcher.rb +2 -2
- data/lib/datadog/tracing/contrib/graphql/unified_trace.rb +105 -63
- data/lib/datadog/tracing/contrib/grpc/configuration/settings.rb +5 -2
- data/lib/datadog/tracing/contrib/grpc/datadog_interceptor/client.rb +11 -15
- data/lib/datadog/tracing/contrib/grpc/datadog_interceptor/server.rb +6 -10
- data/lib/datadog/tracing/contrib/grpc/distributed/fetcher.rb +1 -1
- 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/integration.rb +1 -1
- 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/ext.rb +2 -2
- data/lib/datadog/tracing/contrib/hanami/integration.rb +1 -1
- data/lib/datadog/tracing/contrib/hanami/renderer_policy_tracing.rb +2 -1
- data/lib/datadog/tracing/contrib/hanami/router_tracing.rb +10 -11
- data/lib/datadog/tracing/contrib/http/configuration/settings.rb +16 -5
- data/lib/datadog/tracing/contrib/http/distributed/fetcher.rb +4 -4
- data/lib/datadog/tracing/contrib/http/distributed/propagation.rb +2 -0
- data/lib/datadog/tracing/contrib/http/ext.rb +4 -2
- data/lib/datadog/tracing/contrib/http/instrumentation.rb +9 -13
- 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 +4 -2
- data/lib/datadog/tracing/contrib/httpclient/instrumentation.rb +10 -10
- data/lib/datadog/tracing/contrib/httpclient/integration.rb +1 -1
- data/lib/datadog/tracing/contrib/httprb/configuration/settings.rb +16 -5
- data/lib/datadog/tracing/contrib/httprb/ext.rb +4 -2
- data/lib/datadog/tracing/contrib/httprb/instrumentation.rb +8 -12
- data/lib/datadog/tracing/contrib/httprb/integration.rb +1 -1
- data/lib/datadog/tracing/contrib/kafka/event.rb +2 -1
- data/lib/datadog/tracing/contrib/kafka/events/connection/request.rb +1 -1
- data/lib/datadog/tracing/contrib/kafka/events/consumer/process_batch.rb +1 -1
- data/lib/datadog/tracing/contrib/kafka/events/consumer/process_message.rb +1 -1
- data/lib/datadog/tracing/contrib/kafka/events/consumer_group/heartbeat.rb +1 -1
- data/lib/datadog/tracing/contrib/kafka/events/consumer_group/join_group.rb +1 -1
- data/lib/datadog/tracing/contrib/kafka/events/consumer_group/leave_group.rb +1 -1
- data/lib/datadog/tracing/contrib/kafka/events/consumer_group/sync_group.rb +1 -1
- data/lib/datadog/tracing/contrib/kafka/events/produce_operation/send_messages.rb +1 -1
- data/lib/datadog/tracing/contrib/kafka/events/producer/deliver_messages.rb +1 -1
- 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/integration.rb +1 -1
- 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 +24 -13
- data/lib/datadog/tracing/contrib/karafka/patcher.rb +39 -8
- data/lib/datadog/tracing/contrib/karafka.rb +1 -0
- data/lib/datadog/tracing/contrib/lograge/instrumentation.rb +1 -1
- data/lib/datadog/tracing/contrib/lograge/integration.rb +1 -1
- data/lib/datadog/tracing/contrib/lograge/patcher.rb +4 -2
- data/lib/datadog/tracing/contrib/mongodb/configuration/settings.rb +1 -1
- data/lib/datadog/tracing/contrib/mongodb/ext.rb +1 -1
- data/lib/datadog/tracing/contrib/mongodb/integration.rb +1 -1
- data/lib/datadog/tracing/contrib/mongodb/parsers.rb +6 -6
- data/lib/datadog/tracing/contrib/mongodb/subscribers.rb +11 -14
- data/lib/datadog/tracing/contrib/mysql2/configuration/settings.rb +6 -0
- data/lib/datadog/tracing/contrib/mysql2/ext.rb +1 -1
- data/lib/datadog/tracing/contrib/mysql2/instrumentation.rb +19 -12
- data/lib/datadog/tracing/contrib/mysql2/integration.rb +1 -1
- data/lib/datadog/tracing/contrib/opensearch/configuration/settings.rb +1 -1
- data/lib/datadog/tracing/contrib/opensearch/ext.rb +3 -2
- data/lib/datadog/tracing/contrib/opensearch/integration.rb +1 -2
- data/lib/datadog/tracing/contrib/opensearch/patcher.rb +64 -70
- data/lib/datadog/tracing/contrib/opensearch/quantize.rb +7 -7
- data/lib/datadog/tracing/contrib/patcher.rb +7 -9
- data/lib/datadog/tracing/contrib/pg/configuration/settings.rb +6 -0
- data/lib/datadog/tracing/contrib/pg/instrumentation.rb +3 -6
- data/lib/datadog/tracing/contrib/pg/integration.rb +1 -1
- data/lib/datadog/tracing/contrib/presto/ext.rb +1 -1
- data/lib/datadog/tracing/contrib/presto/instrumentation.rb +9 -11
- data/lib/datadog/tracing/contrib/presto/integration.rb +1 -1
- data/lib/datadog/tracing/contrib/propagation/sql_comment/comment.rb +1 -1
- 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 +25 -1
- 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/integration.rb +1 -1
- data/lib/datadog/tracing/contrib/que/tracer.rb +1 -0
- data/lib/datadog/tracing/contrib/racecar/event.rb +2 -6
- data/lib/datadog/tracing/contrib/racecar/events/batch.rb +2 -2
- data/lib/datadog/tracing/contrib/racecar/events/consume.rb +1 -1
- data/lib/datadog/tracing/contrib/racecar/events/message.rb +2 -2
- data/lib/datadog/tracing/contrib/racecar/integration.rb +1 -1
- 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_collection.rb +1 -1
- data/lib/datadog/tracing/contrib/rack/header_tagging.rb +55 -32
- data/lib/datadog/tracing/contrib/rack/integration.rb +1 -1
- data/lib/datadog/tracing/contrib/rack/middlewares.rb +83 -44
- data/lib/datadog/tracing/contrib/rack/patcher.rb +2 -2
- data/lib/datadog/tracing/contrib/rack/request_queue.rb +4 -3
- data/lib/datadog/tracing/contrib/rack/route_inference.rb +67 -0
- data/lib/datadog/tracing/contrib/rack/trace_proxy_middleware.rb +126 -2
- data/lib/datadog/tracing/contrib/rails/configuration/settings.rb +6 -3
- data/lib/datadog/tracing/contrib/rails/ext.rb +3 -1
- data/lib/datadog/tracing/contrib/rails/integration.rb +2 -2
- data/lib/datadog/tracing/contrib/rails/log_injection.rb +2 -2
- data/lib/datadog/tracing/contrib/rails/middlewares.rb +3 -3
- data/lib/datadog/tracing/contrib/rails/patcher.rb +4 -2
- data/lib/datadog/tracing/contrib/rails/runner.rb +64 -40
- data/lib/datadog/tracing/contrib/rake/instrumentation.rb +10 -8
- data/lib/datadog/tracing/contrib/rake/integration.rb +1 -1
- data/lib/datadog/tracing/contrib/redis/configuration/resolver.rb +2 -2
- data/lib/datadog/tracing/contrib/redis/ext.rb +3 -2
- data/lib/datadog/tracing/contrib/redis/integration.rb +2 -2
- data/lib/datadog/tracing/contrib/redis/patcher.rb +4 -4
- data/lib/datadog/tracing/contrib/redis/quantize.rb +2 -2
- data/lib/datadog/tracing/contrib/redis/tags.rb +2 -7
- data/lib/datadog/tracing/contrib/redis/trace_middleware.rb +6 -4
- data/lib/datadog/tracing/contrib/registerable.rb +11 -0
- data/lib/datadog/tracing/contrib/registry.rb +1 -1
- data/lib/datadog/tracing/contrib/resque/integration.rb +1 -1
- data/lib/datadog/tracing/contrib/resque/resque_job.rb +2 -1
- data/lib/datadog/tracing/contrib/rest_client/configuration/settings.rb +5 -2
- data/lib/datadog/tracing/contrib/rest_client/ext.rb +4 -2
- data/lib/datadog/tracing/contrib/rest_client/integration.rb +1 -1
- data/lib/datadog/tracing/contrib/rest_client/request_patch.rb +8 -9
- data/lib/datadog/tracing/contrib/roda/ext.rb +1 -0
- data/lib/datadog/tracing/contrib/roda/instrumentation.rb +8 -3
- data/lib/datadog/tracing/contrib/roda/integration.rb +1 -1
- data/lib/datadog/tracing/contrib/semantic_logger/instrumentation.rb +1 -1
- data/lib/datadog/tracing/contrib/semantic_logger/integration.rb +1 -1
- data/lib/datadog/tracing/contrib/sequel/database.rb +6 -5
- data/lib/datadog/tracing/contrib/sequel/dataset.rb +2 -1
- data/lib/datadog/tracing/contrib/sequel/integration.rb +1 -1
- data/lib/datadog/tracing/contrib/sequel/utils.rb +1 -6
- data/lib/datadog/tracing/contrib/shoryuken/integration.rb +1 -1
- 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 +2 -0
- data/lib/datadog/tracing/contrib/sidekiq/integration.rb +1 -1
- 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 +8 -4
- 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/integration.rb +1 -1
- data/lib/datadog/tracing/contrib/sinatra/tracer.rb +1 -0
- data/lib/datadog/tracing/contrib/sinatra/tracer_middleware.rb +40 -39
- 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/span_attribute_schema.rb +1 -1
- data/lib/datadog/tracing/contrib/status_range_matcher.rb +13 -1
- data/lib/datadog/tracing/contrib/stripe/integration.rb +1 -1
- data/lib/datadog/tracing/contrib/stripe/request.rb +2 -2
- data/lib/datadog/tracing/contrib/sucker_punch/instrumentation.rb +1 -0
- data/lib/datadog/tracing/contrib/sucker_punch/integration.rb +1 -1
- data/lib/datadog/tracing/contrib/trilogy/configuration/settings.rb +6 -0
- data/lib/datadog/tracing/contrib/trilogy/ext.rb +1 -1
- data/lib/datadog/tracing/contrib/trilogy/instrumentation.rb +4 -6
- data/lib/datadog/tracing/contrib/trilogy/integration.rb +1 -1
- data/lib/datadog/tracing/contrib/utils/quantization/{hash.rb → hash_formatter.rb} +15 -13
- data/lib/datadog/tracing/contrib/utils/quantization/http.rb +6 -6
- 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 +12 -4
- data/lib/datadog/tracing/distributed/b3_single.rb +1 -1
- data/lib/datadog/tracing/distributed/baggage.rb +133 -12
- data/lib/datadog/tracing/distributed/datadog.rb +17 -16
- data/lib/datadog/tracing/distributed/datadog_tags_codec.rb +11 -26
- data/lib/datadog/tracing/distributed/helpers.rb +1 -1
- data/lib/datadog/tracing/distributed/none.rb +4 -2
- data/lib/datadog/tracing/distributed/propagation.rb +39 -4
- data/lib/datadog/tracing/distributed/propagation_policy.rb +1 -1
- data/lib/datadog/tracing/distributed/trace_context.rb +107 -78
- data/lib/datadog/tracing/event.rb +5 -7
- data/lib/datadog/tracing/ext.rb +9 -0
- data/lib/datadog/tracing/flush.rb +1 -1
- data/lib/datadog/tracing/metadata/analytics.rb +1 -1
- data/lib/datadog/tracing/metadata/ext.rb +23 -1
- data/lib/datadog/tracing/metadata/tagging.rb +6 -6
- data/lib/datadog/tracing/pipeline/span_filter.rb +3 -1
- data/lib/datadog/tracing/pipeline/span_processor.rb +3 -1
- data/lib/datadog/tracing/pipeline.rb +2 -2
- data/lib/datadog/tracing/remote.rb +36 -13
- data/lib/datadog/tracing/sampling/ext.rb +2 -2
- 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 +77 -48
- data/lib/datadog/tracing/sampling/span/rule_parser.rb +3 -3
- data/lib/datadog/tracing/sampling/span/sampler.rb +0 -7
- data/lib/datadog/tracing/span.rb +2 -2
- data/lib/datadog/tracing/span_event.rb +12 -12
- data/lib/datadog/tracing/span_link.rb +12 -12
- data/lib/datadog/tracing/span_operation.rb +63 -19
- data/lib/datadog/tracing/sync_writer.rb +1 -2
- data/lib/datadog/tracing/trace_digest.rb +28 -23
- data/lib/datadog/tracing/trace_operation.rb +209 -98
- data/lib/datadog/tracing/trace_segment.rb +2 -2
- data/lib/datadog/tracing/tracer.rb +113 -52
- data/lib/datadog/tracing/transport/http/client.rb +12 -26
- data/lib/datadog/tracing/transport/http/traces.rb +4 -52
- data/lib/datadog/tracing/transport/http.rb +15 -9
- data/lib/datadog/tracing/transport/io/client.rb +11 -14
- data/lib/datadog/tracing/transport/io/traces.rb +28 -34
- data/lib/datadog/tracing/transport/statistics.rb +1 -1
- data/lib/datadog/tracing/transport/trace_formatter.rb +22 -0
- data/lib/datadog/tracing/transport/traces.rb +14 -82
- data/lib/datadog/tracing/workers.rb +4 -3
- data/lib/datadog/tracing/writer.rb +1 -1
- data/lib/datadog/tracing.rb +2 -2
- data/lib/datadog/version.rb +2 -2
- data/lib/datadog.rb +14 -0
- metadata +201 -40
- 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/assets/waf_rules/processors.json +0 -321
- data/lib/datadog/appsec/assets/waf_rules/scanners.json +0 -1023
- data/lib/datadog/appsec/configuration/settings.rb +0 -342
- data/lib/datadog/appsec/contrib/rails/ext.rb +0 -13
- data/lib/datadog/appsec/processor/rule_merger.rb +0 -171
- data/lib/datadog/appsec/processor.rb +0 -107
- 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
|
@@ -1,11 +1,64 @@
|
|
|
1
1
|
# frozen_string_literal: true
|
|
2
2
|
|
|
3
|
+
require_relative 'ext'
|
|
4
|
+
|
|
3
5
|
module Datadog
|
|
4
6
|
module ErrorTracking
|
|
5
7
|
# Configuration for ErrorTracking
|
|
6
8
|
module Configuration
|
|
9
|
+
# Settings
|
|
10
|
+
module Settings
|
|
11
|
+
def self.extended(base)
|
|
12
|
+
base = base.singleton_class unless base.is_a?(Class)
|
|
13
|
+
add_settings!(base)
|
|
14
|
+
end
|
|
15
|
+
|
|
16
|
+
def self.add_settings!(base)
|
|
17
|
+
base.class_eval do
|
|
18
|
+
# Error Tracking specific configurations.
|
|
19
|
+
# @public_api
|
|
20
|
+
settings :error_tracking do
|
|
21
|
+
# Enable automatic reporting of handled errors and defines the scope
|
|
22
|
+
# for which to report errors: user code, gems, or both. Possible
|
|
23
|
+
# values are: all | user | third_party.
|
|
24
|
+
#
|
|
25
|
+
# @default 'DD_ERROR_TRACKING_HANDLED_ERRORS' environment variable, otherwise `nil`
|
|
26
|
+
# @return [String, nil]
|
|
27
|
+
option :handled_errors do |o|
|
|
28
|
+
o.type :string, nilable: true
|
|
29
|
+
o.default Ext::DEFAULT_HANDLED_ERRORS
|
|
30
|
+
o.env Ext::ENV_HANDLED_ERRORS
|
|
31
|
+
o.setter do |value|
|
|
32
|
+
next value if Ext::VALID_HANDLED_ERRORS.include?(value)
|
|
33
|
+
|
|
34
|
+
unless value.nil?
|
|
35
|
+
Datadog.logger.warn(
|
|
36
|
+
"Invalid handled errors scope: #{value}. " \
|
|
37
|
+
"Supported values are: #{Ext::VALID_HANDLED_ERRORS.join(" | ")}. " \
|
|
38
|
+
'Deactivating the feature.'
|
|
39
|
+
)
|
|
40
|
+
end
|
|
41
|
+
|
|
42
|
+
Ext::DEFAULT_HANDLED_ERRORS
|
|
43
|
+
end
|
|
44
|
+
end
|
|
45
|
+
|
|
46
|
+
# Enable automatic reporting of handled errors and specify what files should be
|
|
47
|
+
# instrumented. The value is a list of comma separated paths, filenames or gem names.
|
|
48
|
+
# The paths can be absolute, starting with '/' or relative to directory in which the program
|
|
49
|
+
# is launched, starting with './'.
|
|
50
|
+
#
|
|
51
|
+
# @default 'DD_ERROR_TRACKING_HANDLED_ERRORS_MODULES' environment variable, otherwise `nil`
|
|
52
|
+
# @return [String, nil]
|
|
53
|
+
option :handled_errors_include do |o|
|
|
54
|
+
o.type :array
|
|
55
|
+
o.default []
|
|
56
|
+
o.env Ext::ENV_HANDLED_ERRORS_INCLUDE
|
|
57
|
+
end
|
|
58
|
+
end
|
|
59
|
+
end
|
|
60
|
+
end
|
|
61
|
+
end
|
|
7
62
|
end
|
|
8
63
|
end
|
|
9
64
|
end
|
|
10
|
-
|
|
11
|
-
require_relative 'configuration/settings'
|
|
@@ -18,10 +18,10 @@ module Datadog
|
|
|
18
18
|
regex_match = regex.match(file_path)
|
|
19
19
|
return unless regex_match
|
|
20
20
|
|
|
21
|
-
gem_name = regex_match[1]
|
|
21
|
+
gem_name = regex_match[1] #: String
|
|
22
22
|
|
|
23
23
|
begin
|
|
24
|
-
Gem::Specification.find_by_name(gem_name)
|
|
24
|
+
Gem::Specification.find_by_name(gem_name)
|
|
25
25
|
rescue Gem::MissingSpecError
|
|
26
26
|
nil
|
|
27
27
|
end
|
|
@@ -0,0 +1,253 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
require_relative '../../identity'
|
|
4
|
+
require_relative '../../../appsec/trace_keeper'
|
|
5
|
+
|
|
6
|
+
module Datadog
|
|
7
|
+
module Kit
|
|
8
|
+
module AppSec
|
|
9
|
+
module Events
|
|
10
|
+
# The second version of Business Logic Events SDK
|
|
11
|
+
module V2
|
|
12
|
+
SIGNUP_EVENT = 'users.signup'
|
|
13
|
+
LOGIN_SUCCESS_EVENT = 'users.login.success'
|
|
14
|
+
LOGIN_FAILURE_EVENT = 'users.login.failure'
|
|
15
|
+
|
|
16
|
+
TELEMETRY_METRICS_NAMESPACE = 'appsec'
|
|
17
|
+
TELEMETRY_METRICS_SDK_EVENT = 'sdk.event'
|
|
18
|
+
TELEMETRY_METRICS_SDK_VERSION = 'v2'
|
|
19
|
+
TELEMETRY_METRICS_EVENTS_INTO_TYPES = {
|
|
20
|
+
LOGIN_SUCCESS_EVENT => 'login_success',
|
|
21
|
+
LOGIN_FAILURE_EVENT => 'login_failure',
|
|
22
|
+
SIGNUP_EVENT => 'signup'
|
|
23
|
+
}.freeze
|
|
24
|
+
|
|
25
|
+
class << self
|
|
26
|
+
# Attach user login success information to the service entry span
|
|
27
|
+
# and trigger AppSec event processing.
|
|
28
|
+
#
|
|
29
|
+
# @param login [String] The user login (e.g., username or email).
|
|
30
|
+
# @param user_or_id [String, Hash<Symbol, String>] (optional) If a
|
|
31
|
+
# String, considered as a user ID, if a Hash, considered as a user
|
|
32
|
+
# attributes. The Hash must include `:id` as a key.
|
|
33
|
+
# @param metadata [Hash<Symbol, String>] Additional flat free-form
|
|
34
|
+
# metadata to attach to the event.
|
|
35
|
+
#
|
|
36
|
+
# @example Login only
|
|
37
|
+
# Datadog::Kit::AppSec::Events::V2.track_user_login_success('alice@example.com')
|
|
38
|
+
#
|
|
39
|
+
# @example Login and user attributes
|
|
40
|
+
# Datadog::Kit::AppSec::Events::V2.track_user_login_success(
|
|
41
|
+
# 'alice@example.com',
|
|
42
|
+
# { id: 'user-123', email: 'alice@example.com', name: 'Alice' },
|
|
43
|
+
# ip: '192.168.1.1', device: 'mobile', 'usr.country': 'US'
|
|
44
|
+
# )
|
|
45
|
+
#
|
|
46
|
+
# @return [void]
|
|
47
|
+
def track_user_login_success(login, user_or_id = nil, metadata = {})
|
|
48
|
+
trace = service_entry_trace
|
|
49
|
+
span = service_entry_span
|
|
50
|
+
|
|
51
|
+
if trace.nil? || span.nil?
|
|
52
|
+
return Datadog.logger.warn(
|
|
53
|
+
'Kit::AppSec: Tracing is not enabled. Please enable tracing if you want to track events'
|
|
54
|
+
)
|
|
55
|
+
end
|
|
56
|
+
|
|
57
|
+
raise TypeError, '`login` argument must be a String' unless login.is_a?(String)
|
|
58
|
+
raise TypeError, '`metadata` argument must be a Hash' unless metadata.is_a?(Hash)
|
|
59
|
+
|
|
60
|
+
user_attributes = build_user_attributes(user_or_id, login)
|
|
61
|
+
|
|
62
|
+
set_span_tags(span, metadata, namespace: LOGIN_SUCCESS_EVENT)
|
|
63
|
+
set_span_tags(span, user_attributes, namespace: "#{LOGIN_SUCCESS_EVENT}.usr")
|
|
64
|
+
span.set_tag('appsec.events.users.login.success.track', 'true')
|
|
65
|
+
span.set_tag('_dd.appsec.events.users.login.success.sdk', 'true')
|
|
66
|
+
|
|
67
|
+
::Datadog::AppSec::TraceKeeper.keep!(trace)
|
|
68
|
+
|
|
69
|
+
record_event_telemetry_metric(LOGIN_SUCCESS_EVENT)
|
|
70
|
+
::Datadog::AppSec::Instrumentation.gateway.push('appsec.events.user_lifecycle', LOGIN_SUCCESS_EVENT)
|
|
71
|
+
|
|
72
|
+
return Kit::Identity.set_user(trace, span, **user_attributes) if user_attributes.key?(:id)
|
|
73
|
+
|
|
74
|
+
# NOTE: This is a fallback for the case when we don't have an ID,
|
|
75
|
+
# but need to trigger WAF.
|
|
76
|
+
user = ::Datadog::AppSec::Instrumentation::Gateway::User.new(nil, login)
|
|
77
|
+
::Datadog::AppSec::Instrumentation.gateway.push('identity.set_user', user)
|
|
78
|
+
end
|
|
79
|
+
|
|
80
|
+
# Attach user login failure information to the service entry span
|
|
81
|
+
# and trigger AppSec event processing.
|
|
82
|
+
#
|
|
83
|
+
# @param login [String] The user login (e.g., username or email).
|
|
84
|
+
# @param user_exists [Boolean] Whether the user exists in the system.
|
|
85
|
+
# @param metadata [Hash<Symbol, String>] Additional flat free-form
|
|
86
|
+
# metadata to attach to the event.
|
|
87
|
+
#
|
|
88
|
+
# @example Login only
|
|
89
|
+
# Datadog::Kit::AppSec::Events::V2.track_user_login_failure('alice@example.com')
|
|
90
|
+
#
|
|
91
|
+
# @example With user existence and metadata
|
|
92
|
+
# Datadog::Kit::AppSec::Events::V2.track_user_login_failure(
|
|
93
|
+
# 'alice@example.com',
|
|
94
|
+
# true,
|
|
95
|
+
# ip: '192.168.1.1', device: 'mobile', 'usr.country': 'US'
|
|
96
|
+
# )
|
|
97
|
+
#
|
|
98
|
+
# @return [void]
|
|
99
|
+
def track_user_login_failure(login, user_exists = false, metadata = {})
|
|
100
|
+
trace = service_entry_trace
|
|
101
|
+
span = service_entry_span
|
|
102
|
+
|
|
103
|
+
if trace.nil? || span.nil?
|
|
104
|
+
return Datadog.logger.warn(
|
|
105
|
+
'Kit::AppSec: Tracing is not enabled. Please enable tracing if you want to track events'
|
|
106
|
+
)
|
|
107
|
+
end
|
|
108
|
+
|
|
109
|
+
raise TypeError, '`login` argument must be a String' unless login.is_a?(String)
|
|
110
|
+
raise TypeError, '`metadata` argument must be a Hash' unless metadata.is_a?(Hash)
|
|
111
|
+
|
|
112
|
+
unless user_exists.is_a?(TrueClass) || user_exists.is_a?(FalseClass)
|
|
113
|
+
raise TypeError, '`user_exists` argument must be a boolean'
|
|
114
|
+
end
|
|
115
|
+
|
|
116
|
+
set_span_tags(span, metadata, namespace: LOGIN_FAILURE_EVENT)
|
|
117
|
+
span.set_tag('appsec.events.users.login.failure.track', 'true')
|
|
118
|
+
span.set_tag('_dd.appsec.events.users.login.failure.sdk', 'true')
|
|
119
|
+
span.set_tag('appsec.events.users.login.failure.usr.login', login)
|
|
120
|
+
span.set_tag('appsec.events.users.login.failure.usr.exists', user_exists.to_s)
|
|
121
|
+
|
|
122
|
+
::Datadog::AppSec::TraceKeeper.keep!(trace)
|
|
123
|
+
|
|
124
|
+
record_event_telemetry_metric(LOGIN_FAILURE_EVENT)
|
|
125
|
+
::Datadog::AppSec::Instrumentation.gateway.push('appsec.events.user_lifecycle', LOGIN_FAILURE_EVENT)
|
|
126
|
+
|
|
127
|
+
user = ::Datadog::AppSec::Instrumentation::Gateway::User.new(nil, login)
|
|
128
|
+
::Datadog::AppSec::Instrumentation.gateway.push('identity.set_user', user)
|
|
129
|
+
end
|
|
130
|
+
|
|
131
|
+
# Attach user signup information to the service entry span
|
|
132
|
+
# and trigger AppSec event processing.
|
|
133
|
+
#
|
|
134
|
+
# @param login [String] The user login (e.g., username or email).
|
|
135
|
+
# @param user_or_id [String, Hash<Symbol, String>] (optional) If a
|
|
136
|
+
# String, considered as a user ID, if a Hash, considered as a user
|
|
137
|
+
# attributes. The Hash must include `:id` as a key.
|
|
138
|
+
# @param metadata [Hash<Symbol, String>] Additional flat free-form
|
|
139
|
+
# metadata to attach to the event.
|
|
140
|
+
#
|
|
141
|
+
# @example Login only
|
|
142
|
+
# Datadog::Kit::AppSec::Events::V2.track_user_signup('alice@example.com')
|
|
143
|
+
#
|
|
144
|
+
# @example Login, user attributes, and metadata
|
|
145
|
+
# Datadog::Kit::AppSec::Events::V2.track_user_signup(
|
|
146
|
+
# 'alice@example.com',
|
|
147
|
+
# { id: 'user-123', email: 'alice@example.com', name: 'Alice' },
|
|
148
|
+
# ip: '192.168.1.1', device: 'mobile', 'usr.country': 'US'
|
|
149
|
+
# )
|
|
150
|
+
#
|
|
151
|
+
# @return [void]
|
|
152
|
+
def track_user_signup(login, user_or_id = nil, metadata = {})
|
|
153
|
+
trace = service_entry_trace
|
|
154
|
+
span = service_entry_span
|
|
155
|
+
|
|
156
|
+
if trace.nil? || span.nil?
|
|
157
|
+
return Datadog.logger.warn(
|
|
158
|
+
'Kit::AppSec: Tracing is not enabled. Please enable tracing if you want to track events'
|
|
159
|
+
)
|
|
160
|
+
end
|
|
161
|
+
|
|
162
|
+
raise TypeError, '`login` argument must be a String' unless login.is_a?(String)
|
|
163
|
+
raise TypeError, '`metadata` argument must be a Hash' unless metadata.is_a?(Hash)
|
|
164
|
+
|
|
165
|
+
user_attributes = build_user_attributes(user_or_id, login)
|
|
166
|
+
|
|
167
|
+
set_span_tags(span, metadata, namespace: SIGNUP_EVENT)
|
|
168
|
+
set_span_tags(span, user_attributes, namespace: "#{SIGNUP_EVENT}.usr")
|
|
169
|
+
span.set_tag('appsec.events.users.signup.track', 'true')
|
|
170
|
+
span.set_tag('_dd.appsec.events.users.signup.sdk', 'true')
|
|
171
|
+
|
|
172
|
+
::Datadog::AppSec::TraceKeeper.keep!(trace)
|
|
173
|
+
|
|
174
|
+
record_event_telemetry_metric(SIGNUP_EVENT)
|
|
175
|
+
|
|
176
|
+
if user_attributes.key?(:id)
|
|
177
|
+
Kit::Identity.set_user(trace, span, **user_attributes)
|
|
178
|
+
else
|
|
179
|
+
# NOTE: {Datadog::Kit::Identity.set_user} requires an ID,
|
|
180
|
+
# but WAF can evaluate login alone
|
|
181
|
+
user = ::Datadog::AppSec::Instrumentation::Gateway::User.new(nil, login)
|
|
182
|
+
::Datadog::AppSec::Instrumentation.gateway.push('identity.set_user', user)
|
|
183
|
+
end
|
|
184
|
+
end
|
|
185
|
+
|
|
186
|
+
private
|
|
187
|
+
|
|
188
|
+
# NOTE: Current tracer implementation does not provide a way to
|
|
189
|
+
# get the service entry span. This is a shortcut we take now.
|
|
190
|
+
def service_entry_trace
|
|
191
|
+
return Datadog::Tracing.active_trace unless Datadog::AppSec.active_context
|
|
192
|
+
|
|
193
|
+
Datadog::AppSec.active_context&.trace
|
|
194
|
+
end
|
|
195
|
+
|
|
196
|
+
# NOTE: Current tracer implementation does not provide a way to
|
|
197
|
+
# get the service entry span. This is a shortcut we take now.
|
|
198
|
+
def service_entry_span
|
|
199
|
+
return Datadog::Tracing.active_span unless Datadog::AppSec.active_context
|
|
200
|
+
|
|
201
|
+
Datadog::AppSec.active_context&.span
|
|
202
|
+
end
|
|
203
|
+
|
|
204
|
+
def build_user_attributes(user_or_id, login)
|
|
205
|
+
raise TypeError, '`login` argument must be a String' unless login.is_a?(String)
|
|
206
|
+
|
|
207
|
+
case user_or_id
|
|
208
|
+
when nil
|
|
209
|
+
{login: login}
|
|
210
|
+
when String
|
|
211
|
+
{login: login, id: user_or_id}
|
|
212
|
+
when Hash
|
|
213
|
+
raise ArgumentError, 'missing required user key `:id`' unless user_or_id.key?(:id)
|
|
214
|
+
raise TypeError, 'user key `:id` must be a String' unless user_or_id[:id].is_a?(String)
|
|
215
|
+
|
|
216
|
+
user_or_id.merge(login: login)
|
|
217
|
+
else
|
|
218
|
+
raise TypeError, '`user_or_id` argument must be either String or Hash'
|
|
219
|
+
end
|
|
220
|
+
end
|
|
221
|
+
|
|
222
|
+
def set_span_tags(span, tags, namespace:)
|
|
223
|
+
tags.each do |name, value|
|
|
224
|
+
next if value.nil?
|
|
225
|
+
|
|
226
|
+
span.set_tag("appsec.events.#{namespace}.#{name}", value)
|
|
227
|
+
end
|
|
228
|
+
end
|
|
229
|
+
|
|
230
|
+
# TODO: In case if we need to introduce telemetry metrics to the SDK v1
|
|
231
|
+
# or highly increase the number of metrics, this method should be
|
|
232
|
+
# extracted into a proper module.
|
|
233
|
+
def record_event_telemetry_metric(event)
|
|
234
|
+
telemetry = ::Datadog.send(:components, allow_initialization: false)&.telemetry
|
|
235
|
+
|
|
236
|
+
if telemetry.nil?
|
|
237
|
+
return Datadog.logger.debug(
|
|
238
|
+
'Kit::AppSec: Telemetry component is unavailable. Skip recording SDK metrics'
|
|
239
|
+
)
|
|
240
|
+
end
|
|
241
|
+
|
|
242
|
+
tags = {
|
|
243
|
+
event_type: TELEMETRY_METRICS_EVENTS_INTO_TYPES[event],
|
|
244
|
+
sdk_version: TELEMETRY_METRICS_SDK_VERSION
|
|
245
|
+
}
|
|
246
|
+
telemetry.inc(TELEMETRY_METRICS_NAMESPACE, TELEMETRY_METRICS_SDK_EVENT, 1, tags: tags)
|
|
247
|
+
end
|
|
248
|
+
end
|
|
249
|
+
end
|
|
250
|
+
end
|
|
251
|
+
end
|
|
252
|
+
end
|
|
253
|
+
end
|
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
# frozen_string_literal: true
|
|
2
2
|
|
|
3
3
|
require_relative '../identity'
|
|
4
|
+
require_relative '../../appsec/trace_keeper'
|
|
4
5
|
|
|
5
6
|
module Datadog
|
|
6
7
|
module Kit
|
|
@@ -10,7 +11,7 @@ module Datadog
|
|
|
10
11
|
LOGIN_SUCCESS_EVENT = 'users.login.success'
|
|
11
12
|
LOGIN_FAILURE_EVENT = 'users.login.failure'
|
|
12
13
|
SIGNUP_EVENT = 'users.signup'
|
|
13
|
-
USER_LOGIN_KEYS = ['usr.login', :
|
|
14
|
+
USER_LOGIN_KEYS = ['usr.login', :"usr.login"].freeze
|
|
14
15
|
|
|
15
16
|
class << self
|
|
16
17
|
# Attach login success event information to the trace
|
|
@@ -31,12 +32,12 @@ module Datadog
|
|
|
31
32
|
set_trace_and_span_context('track_login_success', trace, span) do |active_trace, active_span|
|
|
32
33
|
user_options = user.dup
|
|
33
34
|
user_id = user_options.delete(:id)
|
|
34
|
-
user_login = user_options[:login] || others[:
|
|
35
|
+
user_login = user_options[:login] || others[:"usr.login"] || others['usr.login'] || user_id
|
|
35
36
|
|
|
36
37
|
raise ArgumentError, 'missing required key: :user => { :id }' if user_id.nil?
|
|
37
38
|
|
|
38
39
|
others = others.reject { |key, _| USER_LOGIN_KEYS.include?(key) }
|
|
39
|
-
others[:
|
|
40
|
+
others[:"usr.login"] = user_login
|
|
40
41
|
track(LOGIN_SUCCESS_EVENT, active_trace, active_span, **others)
|
|
41
42
|
|
|
42
43
|
user_options[:login] = user_login
|
|
@@ -60,7 +61,7 @@ module Datadog
|
|
|
60
61
|
# event information to attach to the trace.
|
|
61
62
|
def track_login_failure(trace = nil, span = nil, user_exists:, user_id: nil, **others)
|
|
62
63
|
set_trace_and_span_context('track_login_failure', trace, span) do |active_trace, active_span|
|
|
63
|
-
others[:
|
|
64
|
+
others[:"usr.login"] = user_id if user_id && !others.key?(:"usr.login") && !others.key?('usr.login')
|
|
64
65
|
track(LOGIN_FAILURE_EVENT, active_trace, active_span, **others)
|
|
65
66
|
|
|
66
67
|
active_span.set_tag('appsec.events.users.login.failure.usr.id', user_id) if user_id
|
|
@@ -86,12 +87,12 @@ module Datadog
|
|
|
86
87
|
set_trace_and_span_context('track_signup', trace, span) do |active_trace, active_span|
|
|
87
88
|
user_options = user.dup
|
|
88
89
|
user_id = user_options.delete(:id)
|
|
89
|
-
user_login = user_options[:login] || others[:
|
|
90
|
+
user_login = user_options[:login] || others[:"usr.login"] || others['usr.login'] || user_id
|
|
90
91
|
|
|
91
92
|
raise ArgumentError, 'missing required key: :user => { :id }' if user_id.nil?
|
|
92
93
|
|
|
93
94
|
others = others.reject { |key, _| USER_LOGIN_KEYS.include?(key) }
|
|
94
|
-
others[:
|
|
95
|
+
others[:"usr.login"] = user_login
|
|
95
96
|
track(SIGNUP_EVENT, active_trace, active_span, **others)
|
|
96
97
|
|
|
97
98
|
user_options[:login] = user_login
|
|
@@ -126,7 +127,7 @@ module Datadog
|
|
|
126
127
|
span.set_tag("appsec.events.#{event}.#{k}", v) unless v.nil?
|
|
127
128
|
end
|
|
128
129
|
|
|
129
|
-
|
|
130
|
+
::Datadog::AppSec::TraceKeeper.keep!(trace)
|
|
130
131
|
else
|
|
131
132
|
set_trace_and_span_context('track', trace, span) do |active_trace, active_span|
|
|
132
133
|
active_span.set_tag("appsec.events.#{event}.track", 'true')
|
|
@@ -138,7 +139,7 @@ module Datadog
|
|
|
138
139
|
active_span.set_tag("appsec.events.#{event}.#{k}", v) unless v.nil?
|
|
139
140
|
end
|
|
140
141
|
|
|
141
|
-
|
|
142
|
+
::Datadog::AppSec::TraceKeeper.keep!(active_trace)
|
|
142
143
|
end
|
|
143
144
|
end
|
|
144
145
|
|
|
@@ -154,11 +155,11 @@ module Datadog
|
|
|
154
155
|
end
|
|
155
156
|
|
|
156
157
|
trace ||= Datadog::Tracing.active_trace
|
|
157
|
-
span ||=
|
|
158
|
+
span ||= trace&.active_span || Datadog::Tracing.active_span
|
|
158
159
|
|
|
159
160
|
unless trace && span
|
|
160
161
|
Datadog.logger.debug(
|
|
161
|
-
"Tracing not enabled. Method ##{method} is a no-op. Please enable tracing if you want ##{method}"\
|
|
162
|
+
"Tracing not enabled. Method ##{method} is a no-op. Please enable tracing if you want ##{method}" \
|
|
162
163
|
' to track this events'
|
|
163
164
|
)
|
|
164
165
|
return
|
|
@@ -30,7 +30,7 @@ module Datadog
|
|
|
30
30
|
Process.setrlimit(:CORE, maximum_size)
|
|
31
31
|
rescue => e
|
|
32
32
|
Kernel.warn(
|
|
33
|
-
"[datadog] Failed to enable core dumps. Cause: #{e.class
|
|
33
|
+
"[datadog] Failed to enable core dumps. Cause: #{e.class}: #{e.message} " \
|
|
34
34
|
"Location: #{Array(e.backtrace).first}"
|
|
35
35
|
)
|
|
36
36
|
return
|
data/lib/datadog/kit/identity.rb
CHANGED
|
@@ -43,12 +43,12 @@ module Datadog
|
|
|
43
43
|
|
|
44
44
|
# enforce types
|
|
45
45
|
|
|
46
|
-
raise TypeError, ':id must be a String'
|
|
47
|
-
raise TypeError, ':email must be a String'
|
|
48
|
-
raise TypeError, ':name must be a String'
|
|
46
|
+
raise TypeError, ':id must be a String' unless id.is_a?(String)
|
|
47
|
+
raise TypeError, ':email must be a String' unless email.nil? || email.is_a?(String)
|
|
48
|
+
raise TypeError, ':name must be a String' unless name.nil? || name.is_a?(String)
|
|
49
49
|
raise TypeError, ':session_id must be a String' unless session_id.nil? || session_id.is_a?(String)
|
|
50
|
-
raise TypeError, ':role must be a String'
|
|
51
|
-
raise TypeError, ':scope must be a String'
|
|
50
|
+
raise TypeError, ':role must be a String' unless role.nil? || role.is_a?(String)
|
|
51
|
+
raise TypeError, ':scope must be a String' unless scope.nil? || scope.is_a?(String)
|
|
52
52
|
|
|
53
53
|
others.each do |k, v|
|
|
54
54
|
raise TypeError, "#{k.inspect} must be a String" unless v.nil? || v.is_a?(String)
|
|
@@ -57,11 +57,11 @@ module Datadog
|
|
|
57
57
|
set_trace_and_span_context('set_user', trace, span) do |_active_trace, active_span|
|
|
58
58
|
# set tags once data is known consistent
|
|
59
59
|
active_span.set_tag('usr.id', id)
|
|
60
|
-
active_span.set_tag('usr.email', email)
|
|
61
|
-
active_span.set_tag('usr.name', name)
|
|
60
|
+
active_span.set_tag('usr.email', email) unless email.nil?
|
|
61
|
+
active_span.set_tag('usr.name', name) unless name.nil?
|
|
62
62
|
active_span.set_tag('usr.session_id', session_id) unless session_id.nil?
|
|
63
|
-
active_span.set_tag('usr.role', role)
|
|
64
|
-
active_span.set_tag('usr.scope', scope)
|
|
63
|
+
active_span.set_tag('usr.role', role) unless role.nil?
|
|
64
|
+
active_span.set_tag('usr.scope', scope) unless scope.nil?
|
|
65
65
|
|
|
66
66
|
others.each do |k, v|
|
|
67
67
|
active_span.set_tag("usr.#{k}", v) unless v.nil?
|
|
@@ -81,6 +81,9 @@ module Datadog
|
|
|
81
81
|
|
|
82
82
|
private
|
|
83
83
|
|
|
84
|
+
# rubocop:disable Metrics/AbcSize
|
|
85
|
+
# rubocop:disable Metrics/CyclomaticComplexity
|
|
86
|
+
# rubocop:disable Metrics/PerceivedComplexity
|
|
84
87
|
def set_trace_and_span_context(method, trace = nil, span = nil)
|
|
85
88
|
if (appsec_context = Datadog::AppSec.active_context)
|
|
86
89
|
trace = appsec_context.trace
|
|
@@ -88,11 +91,11 @@ module Datadog
|
|
|
88
91
|
end
|
|
89
92
|
|
|
90
93
|
trace ||= Datadog::Tracing.active_trace
|
|
91
|
-
span ||= trace
|
|
94
|
+
span ||= trace&.active_span || Datadog::Tracing.active_span
|
|
92
95
|
|
|
93
96
|
unless trace && span
|
|
94
97
|
Datadog.logger.debug(
|
|
95
|
-
"Tracing not enabled. Method ##{method} is a no-op. Please enable tracing if you want ##{method}"\
|
|
98
|
+
"Tracing not enabled. Method ##{method} is a no-op. Please enable tracing if you want ##{method}" \
|
|
96
99
|
' to track this events'
|
|
97
100
|
)
|
|
98
101
|
return
|
|
@@ -102,6 +105,9 @@ module Datadog
|
|
|
102
105
|
|
|
103
106
|
yield(trace, span)
|
|
104
107
|
end
|
|
108
|
+
# rubocop:enable Metrics/AbcSize
|
|
109
|
+
# rubocop:enable Metrics/PerceivedComplexity
|
|
110
|
+
# rubocop:enable Metrics/CyclomaticComplexity
|
|
105
111
|
end
|
|
106
112
|
end
|
|
107
113
|
end
|
|
@@ -0,0 +1,135 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
# Needed since this file can be loaded without core
|
|
4
|
+
require_relative '../../ruby_version'
|
|
5
|
+
|
|
6
|
+
module Datadog
|
|
7
|
+
module Kit
|
|
8
|
+
module Tracing
|
|
9
|
+
# Trace methods easily
|
|
10
|
+
#
|
|
11
|
+
# Use as DSL module:
|
|
12
|
+
#
|
|
13
|
+
# class MyClass
|
|
14
|
+
# extend Datadog::Kit::Tracing::MethodTracer
|
|
15
|
+
#
|
|
16
|
+
# def foo; 'hello'; end
|
|
17
|
+
#
|
|
18
|
+
# trace_method :foo, span_name: 'optional_span_name'
|
|
19
|
+
#
|
|
20
|
+
# def self.bar; 'hi'; end
|
|
21
|
+
#
|
|
22
|
+
# trace_singleton_class_method :bar, span_name: 'optional_span_name'
|
|
23
|
+
# end
|
|
24
|
+
#
|
|
25
|
+
# Or directly:
|
|
26
|
+
#
|
|
27
|
+
# Datadog::Kit::Tracing::MethodTracer.trace_method(MyClass, :foo, span_name: 'optional_span_name')
|
|
28
|
+
# Datadog::Kit::Tracing::MethodTracer.trace_method(MyClass.singleton_class, :bar, span_name: 'optional_span_name')
|
|
29
|
+
#
|
|
30
|
+
# Class argument is implicit via DSL usage; it is required otherwise, and
|
|
31
|
+
# can accept dynamic classes or modules.
|
|
32
|
+
#
|
|
33
|
+
# Span name is optional and defaults to 'Class#method' (or `Class.method`
|
|
34
|
+
# for singleton class methods) but is required if the class or module
|
|
35
|
+
# name is `nil`.
|
|
36
|
+
#
|
|
37
|
+
# Traced methods are only traced if already within a trace (i.e they do
|
|
38
|
+
# not create traces by themselves).
|
|
39
|
+
#
|
|
40
|
+
# Regular methods must be defined before `trace_method` can be called.
|
|
41
|
+
# Dynamic methods (e.g via `method_missing` or defined later) can be
|
|
42
|
+
# traced via `dynamic: true`, which relaxes method existence sanity
|
|
43
|
+
# checks, but will prevent preserving method visibility.
|
|
44
|
+
#
|
|
45
|
+
# Note that this uses `Module#prepend`, so do not use on methods that
|
|
46
|
+
# have been alias method chained or you risk an infinite recusion crash.
|
|
47
|
+
#
|
|
48
|
+
# @public_api
|
|
49
|
+
module MethodTracer
|
|
50
|
+
class << self
|
|
51
|
+
# Trace an instance method by module and name
|
|
52
|
+
#
|
|
53
|
+
# @param mod [Module] module or class containing the method to trace
|
|
54
|
+
# @param method_name [Symbol] name of the method to trace
|
|
55
|
+
# @param span_name [String, nil] optional span name (defaults to "Module#method")
|
|
56
|
+
# @param dynamic [Boolean] if true, skip method existence check (for method_missing-handled methods)
|
|
57
|
+
# @return [void]
|
|
58
|
+
def trace_method(mod, method_name, span_name: nil, dynamic: false)
|
|
59
|
+
raise ArgumentError, 'mod is not a module' unless mod.is_a?(Module)
|
|
60
|
+
raise ArgumentError, 'ambiguous span name: provide one or define mod.name' if mod.name.nil? && span_name.nil?
|
|
61
|
+
|
|
62
|
+
is_private = mod.private_method_defined?(method_name)
|
|
63
|
+
is_protected = mod.protected_method_defined?(method_name)
|
|
64
|
+
is_defined = is_private || mod.method_defined?(method_name)
|
|
65
|
+
|
|
66
|
+
unless is_defined || dynamic
|
|
67
|
+
raise NoMethodError, "undefined method #{method_name.inspect} for class #{mod}"
|
|
68
|
+
end
|
|
69
|
+
|
|
70
|
+
hook_point = "#{mod.name}##{method_name}"
|
|
71
|
+
custom_span_name = span_name
|
|
72
|
+
span_name ||= hook_point
|
|
73
|
+
|
|
74
|
+
unless span_name.is_a?(String)
|
|
75
|
+
raise ArgumentError, 'span name is not a String'
|
|
76
|
+
end
|
|
77
|
+
|
|
78
|
+
args = RubyVersion.is?('>= 2.7') ? '...' : '*args, &block'
|
|
79
|
+
|
|
80
|
+
hook_module = Module.new do
|
|
81
|
+
define_singleton_method(:inspect) do
|
|
82
|
+
suffix = custom_span_name ? ", #{custom_span_name.inspect}" : ''
|
|
83
|
+
name || "#<Datadog::Tracing::Kit::MethodTracer(#{method_name.inspect}#{suffix})>"
|
|
84
|
+
end
|
|
85
|
+
|
|
86
|
+
define_singleton_method(:to_s) do
|
|
87
|
+
suffix = custom_span_name ? ", #{custom_span_name.inspect}" : ''
|
|
88
|
+
name || "#<Datadog::Tracing::Kit::MethodTracer(#{method_name.inspect}#{suffix})>"
|
|
89
|
+
end
|
|
90
|
+
|
|
91
|
+
# this `eval` is safe:
|
|
92
|
+
# - `args` is static
|
|
93
|
+
# - `method_name` is validated by the `method_defined?` check
|
|
94
|
+
# - `span_name` is validated to be a String and inspected to be quoted
|
|
95
|
+
eval(<<-RUBY, nil, __FILE__, __LINE__ + 1) # standard:disable Security/Eval
|
|
96
|
+
def #{method_name}(#{args})
|
|
97
|
+
return super(#{args}) unless ::Datadog::Tracing.active_trace
|
|
98
|
+
|
|
99
|
+
::Datadog::Tracing.trace(#{span_name.inspect}) { super(#{args}) }
|
|
100
|
+
end
|
|
101
|
+
RUBY
|
|
102
|
+
|
|
103
|
+
private method_name if is_private
|
|
104
|
+
protected method_name if is_protected
|
|
105
|
+
end
|
|
106
|
+
|
|
107
|
+
mod.prepend(hook_module)
|
|
108
|
+
end
|
|
109
|
+
end
|
|
110
|
+
|
|
111
|
+
# Trace a method by name in a module context
|
|
112
|
+
#
|
|
113
|
+
# @param method_name [Symbol] name of the method to trace
|
|
114
|
+
# @param span_name [String, nil] optional span name (defaults to "Module#method")
|
|
115
|
+
# @param dynamic [Boolean] if true, skip method existence check (for method_missing-handled methods)
|
|
116
|
+
# @return [void]
|
|
117
|
+
def trace_method(method_name, span_name: nil, dynamic: false)
|
|
118
|
+
MethodTracer.trace_method(self, method_name, span_name: span_name, dynamic: dynamic)
|
|
119
|
+
end
|
|
120
|
+
|
|
121
|
+
# Trace a method by name in a module's singleton context (a.k.a "class method")
|
|
122
|
+
#
|
|
123
|
+
# @param method_name [Symbol] name of the method to trace
|
|
124
|
+
# @param span_name [String, nil] optional span name (defaults to "Module.method")
|
|
125
|
+
# @param dynamic [Boolean] if true, skip method existence check (for method_missing-handled methods)
|
|
126
|
+
# @return [void]
|
|
127
|
+
def trace_singleton_class_method(method_name, span_name: nil, dynamic: false)
|
|
128
|
+
span_name ||= "#{name}.#{method_name}" if respond_to?(:name)
|
|
129
|
+
|
|
130
|
+
MethodTracer.trace_method(singleton_class, method_name, span_name: span_name, dynamic: dynamic)
|
|
131
|
+
end
|
|
132
|
+
end
|
|
133
|
+
end
|
|
134
|
+
end
|
|
135
|
+
end
|