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
|
@@ -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
|
|
@@ -9,14 +9,17 @@ module Datadog
|
|
|
9
9
|
module Events
|
|
10
10
|
# The second version of Business Logic Events SDK
|
|
11
11
|
module V2
|
|
12
|
+
SIGNUP_EVENT = 'users.signup'
|
|
12
13
|
LOGIN_SUCCESS_EVENT = 'users.login.success'
|
|
13
14
|
LOGIN_FAILURE_EVENT = 'users.login.failure'
|
|
15
|
+
|
|
14
16
|
TELEMETRY_METRICS_NAMESPACE = 'appsec'
|
|
15
17
|
TELEMETRY_METRICS_SDK_EVENT = 'sdk.event'
|
|
16
18
|
TELEMETRY_METRICS_SDK_VERSION = 'v2'
|
|
17
19
|
TELEMETRY_METRICS_EVENTS_INTO_TYPES = {
|
|
18
20
|
LOGIN_SUCCESS_EVENT => 'login_success',
|
|
19
|
-
LOGIN_FAILURE_EVENT => 'login_failure'
|
|
21
|
+
LOGIN_FAILURE_EVENT => 'login_failure',
|
|
22
|
+
SIGNUP_EVENT => 'signup'
|
|
20
23
|
}.freeze
|
|
21
24
|
|
|
22
25
|
class << self
|
|
@@ -66,8 +69,7 @@ module Datadog
|
|
|
66
69
|
record_event_telemetry_metric(LOGIN_SUCCESS_EVENT)
|
|
67
70
|
::Datadog::AppSec::Instrumentation.gateway.push('appsec.events.user_lifecycle', LOGIN_SUCCESS_EVENT)
|
|
68
71
|
|
|
69
|
-
|
|
70
|
-
return Kit::Identity.set_user(trace, span, **user_attributes) if user_attributes.key?(:id) # steep:ignore
|
|
72
|
+
return Kit::Identity.set_user(trace, span, **user_attributes) if user_attributes.key?(:id)
|
|
71
73
|
|
|
72
74
|
# NOTE: This is a fallback for the case when we don't have an ID,
|
|
73
75
|
# but need to trigger WAF.
|
|
@@ -126,6 +128,61 @@ module Datadog
|
|
|
126
128
|
::Datadog::AppSec::Instrumentation.gateway.push('identity.set_user', user)
|
|
127
129
|
end
|
|
128
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
|
+
|
|
129
186
|
private
|
|
130
187
|
|
|
131
188
|
# NOTE: Current tracer implementation does not provide a way to
|
|
@@ -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
|
|
@@ -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
|
|
@@ -0,0 +1,100 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
require_relative 'transport'
|
|
4
|
+
require_relative 'evaluation_engine'
|
|
5
|
+
require_relative 'exposures/buffer'
|
|
6
|
+
require_relative 'exposures/worker'
|
|
7
|
+
require_relative 'exposures/deduplicator'
|
|
8
|
+
require_relative 'exposures/reporter'
|
|
9
|
+
require_relative 'metrics/flag_eval_metrics'
|
|
10
|
+
|
|
11
|
+
module Datadog
|
|
12
|
+
module OpenFeature
|
|
13
|
+
# This class is the entry point for the OpenFeature component
|
|
14
|
+
class Component
|
|
15
|
+
attr_reader :engine, :flag_eval_metrics_hook, :flag_eval_evp_hook
|
|
16
|
+
|
|
17
|
+
def self.build(settings, agent_settings, logger:, telemetry:)
|
|
18
|
+
return unless settings.respond_to?(:open_feature) && settings.open_feature.enabled
|
|
19
|
+
|
|
20
|
+
unless settings.respond_to?(:remote) && settings.remote.enabled
|
|
21
|
+
message = 'OpenFeature could not be enabled as Remote Configuration is currently disabled. ' \
|
|
22
|
+
'To enable Remote Configuration, see https://docs.datadoghq.com/remote_configuration/.'
|
|
23
|
+
|
|
24
|
+
logger.warn(message)
|
|
25
|
+
return
|
|
26
|
+
end
|
|
27
|
+
|
|
28
|
+
if RUBY_ENGINE != 'ruby'
|
|
29
|
+
message = 'OpenFeature could not be enabled as MRI is required, ' \
|
|
30
|
+
"but running on #{RUBY_ENGINE.inspect}"
|
|
31
|
+
|
|
32
|
+
logger.warn(message)
|
|
33
|
+
return
|
|
34
|
+
end
|
|
35
|
+
|
|
36
|
+
if (libdatadog_api_failure = Core::LIBDATADOG_API_FAILURE)
|
|
37
|
+
message = 'OpenFeature could not be enabled as `libdatadog` is not loaded: ' \
|
|
38
|
+
"#{libdatadog_api_failure.inspect}. For help solving this issue, " \
|
|
39
|
+
'please contact Datadog support at https://docs.datadoghq.com/help/.'
|
|
40
|
+
|
|
41
|
+
logger.warn(message)
|
|
42
|
+
return
|
|
43
|
+
end
|
|
44
|
+
|
|
45
|
+
new(settings, agent_settings, logger: logger, telemetry: telemetry)
|
|
46
|
+
end
|
|
47
|
+
|
|
48
|
+
def initialize(settings, agent_settings, logger:, telemetry:)
|
|
49
|
+
transport = Transport::HTTP.build(agent_settings: agent_settings, logger: logger)
|
|
50
|
+
@worker = Exposures::Worker.new(settings: settings, transport: transport, telemetry: telemetry, logger: logger)
|
|
51
|
+
|
|
52
|
+
reporter = Exposures::Reporter.new(@worker, telemetry: telemetry, logger: logger)
|
|
53
|
+
@engine = EvaluationEngine.new(reporter, telemetry: telemetry, logger: logger)
|
|
54
|
+
|
|
55
|
+
@telemetry = telemetry
|
|
56
|
+
@logger = logger
|
|
57
|
+
@settings = settings
|
|
58
|
+
@agent_settings = agent_settings
|
|
59
|
+
@flag_eval_metrics_hook = create_flag_eval_metrics_hook
|
|
60
|
+
@flag_eval_evp_hook = create_flag_eval_evp_hook
|
|
61
|
+
end
|
|
62
|
+
|
|
63
|
+
def shutdown!
|
|
64
|
+
@worker.graceful_shutdown
|
|
65
|
+
@flag_eval_evp_writer&.stop
|
|
66
|
+
end
|
|
67
|
+
|
|
68
|
+
private
|
|
69
|
+
|
|
70
|
+
def create_flag_eval_metrics_hook
|
|
71
|
+
require_relative 'hooks/flag_eval_metrics_hook'
|
|
72
|
+
return unless Hooks::FlagEvalMetricsHook.available?
|
|
73
|
+
|
|
74
|
+
metrics = Metrics::FlagEvalMetrics.new(telemetry: @telemetry, logger: @logger)
|
|
75
|
+
Hooks::FlagEvalMetricsHook.new(metrics)
|
|
76
|
+
rescue LoadError
|
|
77
|
+
nil
|
|
78
|
+
end
|
|
79
|
+
|
|
80
|
+
# Killswitch: DD_FLAGGING_EVALUATION_COUNTS_ENABLED (default on) gates only the EVP path.
|
|
81
|
+
# Read through the datadog config registry, not raw ENV.
|
|
82
|
+
def create_flag_eval_evp_hook
|
|
83
|
+
return unless @settings.open_feature.evaluation_counts_enabled
|
|
84
|
+
|
|
85
|
+
require_relative 'hooks/flag_eval_evp_hook'
|
|
86
|
+
return unless Hooks::FlagEvalEVPHook.available?
|
|
87
|
+
|
|
88
|
+
evp_transport = Transport::HTTP.build_flagevaluations(
|
|
89
|
+
agent_settings: @agent_settings,
|
|
90
|
+
logger: @logger,
|
|
91
|
+
)
|
|
92
|
+
require_relative 'flag_evaluation/writer'
|
|
93
|
+
@flag_eval_evp_writer = FlagEvaluation::Writer.new(transport: evp_transport, logger: @logger, telemetry: @telemetry)
|
|
94
|
+
Hooks::FlagEvalEVPHook.new(@flag_eval_evp_writer)
|
|
95
|
+
rescue LoadError
|
|
96
|
+
nil
|
|
97
|
+
end
|
|
98
|
+
end
|
|
99
|
+
end
|
|
100
|
+
end
|
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
module Datadog
|
|
4
|
+
module OpenFeature
|
|
5
|
+
module Configuration
|
|
6
|
+
# A settings class for the OpenFeature component.
|
|
7
|
+
module Settings
|
|
8
|
+
def self.extended(base)
|
|
9
|
+
base = base.singleton_class unless base.is_a?(Class)
|
|
10
|
+
add_settings!(base)
|
|
11
|
+
end
|
|
12
|
+
|
|
13
|
+
def self.add_settings!(base)
|
|
14
|
+
base.class_eval do
|
|
15
|
+
# Steep does not update `self` for this `class_eval` block.
|
|
16
|
+
# @type self: Datadog::Core::Configuration::Base::_DslContext
|
|
17
|
+
settings :open_feature do
|
|
18
|
+
option :enabled do |o|
|
|
19
|
+
o.type :bool
|
|
20
|
+
o.env 'DD_EXPERIMENTAL_FLAGGING_PROVIDER_ENABLED'
|
|
21
|
+
o.default false
|
|
22
|
+
end
|
|
23
|
+
|
|
24
|
+
# Killswitch for the EVP `flagevaluation` emission path only. Default on; when
|
|
25
|
+
# disabled the existing OTel `feature_flag.evaluations` metric is unaffected.
|
|
26
|
+
option :evaluation_counts_enabled do |o|
|
|
27
|
+
o.type :bool
|
|
28
|
+
o.env 'DD_FLAGGING_EVALUATION_COUNTS_ENABLED'
|
|
29
|
+
o.default true
|
|
30
|
+
end
|
|
31
|
+
end
|
|
32
|
+
end
|
|
33
|
+
end
|
|
34
|
+
end
|
|
35
|
+
end
|
|
36
|
+
end
|
|
37
|
+
end
|
|
@@ -0,0 +1,70 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
require_relative 'ext'
|
|
4
|
+
require_relative 'noop_evaluator'
|
|
5
|
+
require_relative 'native_evaluator'
|
|
6
|
+
require_relative 'resolution_details'
|
|
7
|
+
|
|
8
|
+
module Datadog
|
|
9
|
+
module OpenFeature
|
|
10
|
+
# This class performs the evaluation of the feature flag
|
|
11
|
+
class EvaluationEngine
|
|
12
|
+
# Steep: https://github.com/soutaro/steep/issues/1880
|
|
13
|
+
ReconfigurationError = Class.new(StandardError) # steep:ignore IncompatibleAssignment
|
|
14
|
+
|
|
15
|
+
ALLOWED_TYPES = %i[boolean string number float integer object].freeze
|
|
16
|
+
|
|
17
|
+
def initialize(reporter, telemetry:, logger:)
|
|
18
|
+
@reporter = reporter
|
|
19
|
+
@telemetry = telemetry
|
|
20
|
+
@logger = logger
|
|
21
|
+
|
|
22
|
+
@evaluator = NoopEvaluator.new(nil)
|
|
23
|
+
end
|
|
24
|
+
|
|
25
|
+
def fetch_value(flag_key, default_value:, expected_type:, evaluation_context: nil)
|
|
26
|
+
unless ALLOWED_TYPES.include?(expected_type)
|
|
27
|
+
message = "unknown type #{expected_type.inspect}, allowed types #{ALLOWED_TYPES.join(", ")}"
|
|
28
|
+
return ResolutionDetails.build_error(
|
|
29
|
+
value: default_value, error_code: Ext::UNKNOWN_TYPE, error_message: message
|
|
30
|
+
)
|
|
31
|
+
end
|
|
32
|
+
|
|
33
|
+
context = evaluation_context&.fields.to_h
|
|
34
|
+
result = @evaluator.get_assignment(
|
|
35
|
+
flag_key, default_value: default_value, context: context, expected_type: expected_type
|
|
36
|
+
)
|
|
37
|
+
|
|
38
|
+
@reporter.report(result, flag_key: flag_key, context: evaluation_context)
|
|
39
|
+
|
|
40
|
+
result
|
|
41
|
+
rescue => e
|
|
42
|
+
@telemetry.report(e, description: 'OpenFeature: Failed to fetch flag value')
|
|
43
|
+
|
|
44
|
+
ResolutionDetails.build_error(
|
|
45
|
+
value: default_value, error_code: Ext::GENERAL, error_message: "#{e.class}: #{e.message}"
|
|
46
|
+
)
|
|
47
|
+
end
|
|
48
|
+
|
|
49
|
+
# NOTE: In a currect implementation configuration is expected to be a raw
|
|
50
|
+
# JSON string containing feature flags (straight from the remote config)
|
|
51
|
+
# in the format expected by `libdatadog` without any modifications
|
|
52
|
+
def reconfigure!(configuration)
|
|
53
|
+
if configuration.nil?
|
|
54
|
+
@logger.debug('OpenFeature: Removing configuration')
|
|
55
|
+
|
|
56
|
+
return @evaluator = NoopEvaluator.new(configuration)
|
|
57
|
+
end
|
|
58
|
+
|
|
59
|
+
@evaluator = NativeEvaluator.new(configuration)
|
|
60
|
+
rescue => e
|
|
61
|
+
message = 'OpenFeature: Failed to reconfigure, reverting to the previous configuration'
|
|
62
|
+
|
|
63
|
+
@logger.error("#{message}, #{e.class}: #{e.message}")
|
|
64
|
+
@telemetry.report(e, description: "#{message} (#{e.class})")
|
|
65
|
+
|
|
66
|
+
raise ReconfigurationError, "#{e.class}: #{e.message}"
|
|
67
|
+
end
|
|
68
|
+
end
|
|
69
|
+
end
|
|
70
|
+
end
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
module Datadog
|
|
4
|
+
module OpenFeature
|
|
5
|
+
module Exposures
|
|
6
|
+
# This class builds a batch of exposures and context to be sent to the Agent
|
|
7
|
+
class BatchBuilder
|
|
8
|
+
def initialize(settings)
|
|
9
|
+
@context = build_context(settings)
|
|
10
|
+
end
|
|
11
|
+
|
|
12
|
+
def payload_for(events)
|
|
13
|
+
{
|
|
14
|
+
context: @context,
|
|
15
|
+
exposures: events
|
|
16
|
+
}
|
|
17
|
+
end
|
|
18
|
+
|
|
19
|
+
private
|
|
20
|
+
|
|
21
|
+
def build_context(settings)
|
|
22
|
+
context = {}
|
|
23
|
+
context[:env] = settings.env if settings.env
|
|
24
|
+
context[:service] = settings.service if settings.service
|
|
25
|
+
context[:version] = settings.version if settings.version
|
|
26
|
+
|
|
27
|
+
context
|
|
28
|
+
end
|
|
29
|
+
end
|
|
30
|
+
end
|
|
31
|
+
end
|
|
32
|
+
end
|
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
require_relative '../../core/buffer/cruby'
|
|
4
|
+
|
|
5
|
+
module Datadog
|
|
6
|
+
module OpenFeature
|
|
7
|
+
module Exposures
|
|
8
|
+
# This class is a buffer for exposure events that evicts at random and
|
|
9
|
+
# keeps track of the number of dropped events
|
|
10
|
+
#
|
|
11
|
+
# WARNING: This class does not work as intended on JRuby
|
|
12
|
+
class Buffer < Core::Buffer::CRuby
|
|
13
|
+
DEFAULT_LIMIT = 1_000
|
|
14
|
+
|
|
15
|
+
attr_reader :dropped_count
|
|
16
|
+
|
|
17
|
+
def initialize(limit = DEFAULT_LIMIT)
|
|
18
|
+
@dropped = 0
|
|
19
|
+
@dropped_count = 0
|
|
20
|
+
|
|
21
|
+
super
|
|
22
|
+
end
|
|
23
|
+
|
|
24
|
+
protected
|
|
25
|
+
|
|
26
|
+
def drain!
|
|
27
|
+
drained = super
|
|
28
|
+
|
|
29
|
+
@dropped_count = @dropped
|
|
30
|
+
@dropped = 0
|
|
31
|
+
|
|
32
|
+
drained
|
|
33
|
+
end
|
|
34
|
+
|
|
35
|
+
def replace!(item)
|
|
36
|
+
@dropped += 1
|
|
37
|
+
|
|
38
|
+
super
|
|
39
|
+
end
|
|
40
|
+
end
|
|
41
|
+
end
|
|
42
|
+
end
|
|
43
|
+
end
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
require_relative '../../core/utils/lru_cache'
|
|
4
|
+
|
|
5
|
+
module Datadog
|
|
6
|
+
module OpenFeature
|
|
7
|
+
module Exposures
|
|
8
|
+
# This class is a deduplication buffer based on LRU cache for exposure events
|
|
9
|
+
class Deduplicator
|
|
10
|
+
DEFAULT_CACHE_LIMIT = 1_000
|
|
11
|
+
|
|
12
|
+
def initialize(limit: DEFAULT_CACHE_LIMIT)
|
|
13
|
+
@cache = Datadog::Core::Utils::LRUCache.new(limit)
|
|
14
|
+
@mutex = Mutex.new
|
|
15
|
+
end
|
|
16
|
+
|
|
17
|
+
def duplicate?(key, value)
|
|
18
|
+
@mutex.synchronize do
|
|
19
|
+
stored = @cache[key]
|
|
20
|
+
return true if stored == value
|
|
21
|
+
|
|
22
|
+
@cache[key] = value
|
|
23
|
+
end
|
|
24
|
+
|
|
25
|
+
false
|
|
26
|
+
end
|
|
27
|
+
end
|
|
28
|
+
end
|
|
29
|
+
end
|
|
30
|
+
end
|