ddtrace 1.0.0 → 1.9.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 +453 -2
- data/LICENSE-3rdparty.csv +6 -2
- data/README.md +10 -5
- data/ext/ddtrace_profiling_loader/ddtrace_profiling_loader.c +134 -0
- data/ext/ddtrace_profiling_loader/extconf.rb +74 -0
- data/ext/ddtrace_profiling_native_extension/NativeExtensionDesign.md +79 -9
- data/ext/ddtrace_profiling_native_extension/clock_id.h +22 -1
- data/ext/ddtrace_profiling_native_extension/clock_id_from_pthread.c +33 -10
- data/ext/ddtrace_profiling_native_extension/clock_id_noop.c +11 -2
- data/ext/ddtrace_profiling_native_extension/collectors_cpu_and_wall_time.c +899 -0
- data/ext/ddtrace_profiling_native_extension/collectors_cpu_and_wall_time.h +9 -0
- data/ext/ddtrace_profiling_native_extension/collectors_cpu_and_wall_time_worker.c +776 -0
- data/ext/ddtrace_profiling_native_extension/collectors_dynamic_sampling_rate.c +142 -0
- data/ext/ddtrace_profiling_native_extension/collectors_dynamic_sampling_rate.h +14 -0
- data/ext/ddtrace_profiling_native_extension/collectors_idle_sampling_helper.c +241 -0
- data/ext/ddtrace_profiling_native_extension/collectors_idle_sampling_helper.h +3 -0
- data/ext/ddtrace_profiling_native_extension/collectors_stack.c +390 -0
- data/ext/ddtrace_profiling_native_extension/collectors_stack.h +18 -0
- data/ext/ddtrace_profiling_native_extension/extconf.rb +156 -114
- data/ext/ddtrace_profiling_native_extension/helpers.h +17 -0
- data/ext/ddtrace_profiling_native_extension/http_transport.c +354 -0
- data/ext/ddtrace_profiling_native_extension/libdatadog_helpers.h +18 -0
- data/ext/ddtrace_profiling_native_extension/native_extension_helpers.rb +319 -0
- data/ext/ddtrace_profiling_native_extension/private_vm_api_access.c +820 -9
- data/ext/ddtrace_profiling_native_extension/private_vm_api_access.h +42 -0
- data/ext/ddtrace_profiling_native_extension/profiling.c +230 -3
- data/ext/ddtrace_profiling_native_extension/ruby_helpers.c +110 -0
- data/ext/ddtrace_profiling_native_extension/ruby_helpers.h +89 -0
- data/ext/ddtrace_profiling_native_extension/setup_signal_handler.c +115 -0
- data/ext/ddtrace_profiling_native_extension/setup_signal_handler.h +11 -0
- data/ext/ddtrace_profiling_native_extension/stack_recorder.c +487 -0
- data/ext/ddtrace_profiling_native_extension/stack_recorder.h +39 -0
- data/ext/ddtrace_profiling_native_extension/time_helpers.c +17 -0
- data/ext/ddtrace_profiling_native_extension/time_helpers.h +10 -0
- data/lib/datadog/appsec/assets/blocked.html +98 -3
- data/lib/datadog/appsec/assets/blocked.json +1 -0
- data/lib/datadog/appsec/assets/blocked.text +5 -0
- data/lib/datadog/appsec/assets/waf_rules/recommended.json +1250 -300
- data/lib/datadog/appsec/assets/waf_rules/risky.json +78 -78
- data/lib/datadog/appsec/assets/waf_rules/strict.json +308 -73
- data/lib/datadog/appsec/assets.rb +3 -3
- data/lib/datadog/appsec/autoload.rb +6 -4
- data/lib/datadog/appsec/configuration/settings.rb +55 -19
- data/lib/datadog/appsec/configuration.rb +17 -3
- data/lib/datadog/appsec/contrib/auto_instrument.rb +1 -3
- data/lib/datadog/appsec/contrib/configuration/settings.rb +2 -2
- data/lib/datadog/appsec/contrib/integration.rb +1 -1
- data/lib/datadog/appsec/contrib/patcher.rb +1 -1
- data/lib/datadog/appsec/contrib/rack/configuration/settings.rb +3 -3
- data/lib/datadog/appsec/contrib/rack/ext.rb +1 -1
- data/lib/datadog/appsec/contrib/rack/gateway/watcher.rb +95 -47
- data/lib/datadog/appsec/contrib/rack/integration.rb +5 -4
- data/lib/datadog/appsec/contrib/rack/patcher.rb +2 -3
- data/lib/datadog/appsec/contrib/rack/reactive/request.rb +17 -21
- data/lib/datadog/appsec/contrib/rack/reactive/request_body.rb +64 -0
- data/lib/datadog/appsec/contrib/rack/reactive/response.rb +13 -13
- data/lib/datadog/appsec/contrib/rack/request.rb +27 -1
- data/lib/datadog/appsec/contrib/rack/request_body_middleware.rb +41 -0
- data/lib/datadog/appsec/contrib/rack/request_middleware.rb +92 -10
- data/lib/datadog/appsec/contrib/rack/response.rb +1 -1
- data/lib/datadog/appsec/contrib/rails/configuration/settings.rb +3 -3
- data/lib/datadog/appsec/contrib/rails/ext.rb +1 -1
- data/lib/datadog/appsec/contrib/rails/framework.rb +1 -1
- data/lib/datadog/appsec/contrib/rails/gateway/watcher.rb +82 -0
- data/lib/datadog/appsec/contrib/rails/integration.rb +5 -5
- data/lib/datadog/appsec/contrib/rails/patcher.rb +42 -8
- data/lib/datadog/appsec/contrib/rails/reactive/action.rb +68 -0
- data/lib/datadog/appsec/contrib/rails/request.rb +36 -0
- data/lib/datadog/appsec/contrib/rails/request_middleware.rb +1 -1
- data/lib/datadog/appsec/contrib/sinatra/configuration/settings.rb +3 -3
- data/lib/datadog/appsec/contrib/sinatra/ext.rb +2 -1
- data/lib/datadog/appsec/contrib/sinatra/framework.rb +1 -1
- data/lib/datadog/appsec/contrib/sinatra/gateway/watcher.rb +126 -0
- data/lib/datadog/appsec/contrib/sinatra/integration.rb +4 -4
- data/lib/datadog/appsec/contrib/sinatra/patcher.rb +84 -10
- data/lib/datadog/appsec/contrib/sinatra/reactive/routed.rb +63 -0
- data/lib/datadog/appsec/contrib/sinatra/request_middleware.rb +1 -1
- data/lib/datadog/appsec/event.rb +38 -27
- data/lib/datadog/appsec/extensions.rb +43 -26
- data/lib/datadog/appsec/instrumentation/gateway.rb +17 -3
- data/lib/datadog/appsec/processor.rb +86 -13
- data/lib/datadog/appsec/rate_limiter.rb +6 -1
- data/lib/datadog/appsec/reactive/address_hash.rb +1 -1
- data/lib/datadog/appsec/reactive/engine.rb +3 -3
- data/lib/datadog/appsec/reactive/operation.rb +5 -6
- data/lib/datadog/appsec/reactive/subscriber.rb +1 -1
- data/lib/datadog/appsec/response.rb +63 -0
- data/lib/datadog/appsec/utils/http/media_range.rb +201 -0
- data/lib/datadog/appsec/utils/http/media_type.rb +87 -0
- data/lib/datadog/appsec/utils/http.rb +9 -0
- data/lib/datadog/appsec/utils.rb +7 -0
- data/lib/datadog/appsec.rb +6 -6
- data/lib/datadog/ci/configuration/components.rb +1 -1
- data/lib/datadog/ci/configuration/settings.rb +1 -1
- data/lib/datadog/ci/contrib/cucumber/configuration/settings.rb +2 -2
- data/lib/datadog/ci/contrib/cucumber/formatter.rb +5 -5
- data/lib/datadog/ci/contrib/cucumber/instrumentation.rb +1 -1
- data/lib/datadog/ci/contrib/cucumber/integration.rb +4 -4
- data/lib/datadog/ci/contrib/cucumber/patcher.rb +2 -2
- data/lib/datadog/ci/contrib/rspec/configuration/settings.rb +2 -2
- data/lib/datadog/ci/contrib/rspec/example.rb +5 -5
- data/lib/datadog/ci/contrib/rspec/integration.rb +4 -4
- data/lib/datadog/ci/contrib/rspec/patcher.rb +2 -2
- data/lib/datadog/ci/ext/environment.rb +99 -27
- data/lib/datadog/ci/extensions.rb +4 -4
- data/lib/datadog/ci/flush.rb +2 -2
- data/lib/datadog/ci/test.rb +3 -3
- data/lib/datadog/ci.rb +6 -6
- data/lib/datadog/core/buffer/cruby.rb +1 -1
- data/lib/datadog/core/buffer/thread_safe.rb +1 -1
- data/lib/datadog/core/configuration/agent_settings_resolver.rb +9 -12
- data/lib/datadog/core/configuration/base.rb +14 -2
- data/lib/datadog/core/configuration/components.rb +123 -54
- data/lib/datadog/core/configuration/ext.rb +26 -0
- data/lib/datadog/core/configuration/option_definition.rb +12 -3
- data/lib/datadog/core/configuration/option_definition_set.rb +1 -1
- data/lib/datadog/core/configuration/options.rb +3 -3
- data/lib/datadog/core/configuration/settings.rb +79 -251
- data/lib/datadog/core/configuration.rb +16 -11
- data/lib/datadog/core/diagnostics/environment_logger.rb +10 -5
- data/lib/datadog/core/diagnostics/health.rb +5 -23
- data/lib/datadog/core/environment/cgroup.rb +4 -2
- data/lib/datadog/core/environment/container.rb +3 -2
- data/lib/datadog/core/environment/ext.rb +1 -1
- data/lib/datadog/core/environment/identity.rb +2 -2
- data/lib/datadog/core/environment/platform.rb +40 -0
- data/lib/datadog/core/environment/socket.rb +1 -1
- data/lib/datadog/core/environment/variable_helpers.rb +83 -11
- data/lib/datadog/core/error.rb +1 -1
- data/lib/datadog/core/extensions.rb +1 -1
- data/lib/datadog/core/header_collection.rb +41 -0
- data/lib/datadog/core/logging/ext.rb +11 -0
- data/lib/datadog/core/metrics/client.rb +25 -14
- data/lib/datadog/core/metrics/ext.rb +0 -2
- data/lib/datadog/core/metrics/options.rb +3 -3
- data/lib/datadog/core/runtime/ext.rb +1 -1
- data/lib/datadog/core/runtime/metrics.rb +7 -7
- data/lib/datadog/core/telemetry/client.rb +79 -0
- data/lib/datadog/core/telemetry/collector.rb +233 -0
- data/lib/datadog/core/telemetry/emitter.rb +48 -0
- data/lib/datadog/core/telemetry/event.rb +71 -0
- data/lib/datadog/core/telemetry/ext.rb +11 -0
- data/lib/datadog/core/telemetry/heartbeat.rb +37 -0
- data/lib/datadog/core/telemetry/http/adapters/net.rb +113 -0
- data/lib/datadog/core/telemetry/http/env.rb +20 -0
- data/lib/datadog/core/telemetry/http/ext.rb +20 -0
- data/lib/datadog/core/telemetry/http/response.rb +68 -0
- data/lib/datadog/core/telemetry/http/transport.rb +53 -0
- data/lib/datadog/core/telemetry/v1/app_event.rb +52 -0
- data/lib/datadog/core/telemetry/v1/application.rb +86 -0
- data/lib/datadog/core/telemetry/v1/configuration.rb +25 -0
- data/lib/datadog/core/telemetry/v1/dependency.rb +36 -0
- data/lib/datadog/core/telemetry/v1/host.rb +51 -0
- data/lib/datadog/core/telemetry/v1/integration.rb +58 -0
- data/lib/datadog/core/telemetry/v1/product.rb +28 -0
- data/lib/datadog/core/telemetry/v1/telemetry_request.rb +100 -0
- data/lib/datadog/core/utils/compression.rb +5 -1
- data/lib/datadog/core/utils/object_set.rb +1 -1
- data/lib/datadog/core/utils/sequence.rb +5 -0
- data/lib/datadog/core/utils/string_table.rb +1 -1
- data/lib/datadog/core/utils/time.rb +3 -3
- data/lib/datadog/core/utils.rb +1 -22
- data/lib/datadog/core/vendor/multipart-post/multipart/post/multipartable.rb +2 -2
- data/lib/datadog/core/vendor/multipart-post/net/http/post/multipart.rb +3 -3
- data/lib/datadog/core/workers/async.rb +4 -4
- data/lib/datadog/core/workers/polling.rb +2 -2
- data/lib/datadog/core/workers/runtime_metrics.rb +4 -7
- data/lib/datadog/core.rb +28 -56
- data/lib/datadog/kit/appsec/events.rb +75 -0
- data/lib/datadog/kit/enable_core_dumps.rb +51 -0
- data/lib/datadog/kit/identity.rb +64 -0
- data/lib/datadog/kit.rb +11 -0
- data/lib/datadog/opentelemetry/api/context.rb +187 -0
- data/lib/datadog/opentelemetry/api/trace/span.rb +15 -0
- data/lib/datadog/opentelemetry/sdk/configurator.rb +38 -0
- data/lib/datadog/opentelemetry/sdk/id_generator.rb +27 -0
- data/lib/datadog/opentelemetry/sdk/propagator.rb +91 -0
- data/lib/datadog/opentelemetry/sdk/span_processor.rb +92 -0
- data/lib/datadog/opentelemetry.rb +48 -0
- data/lib/datadog/opentracer/distributed_headers.rb +7 -9
- data/lib/datadog/opentracer/rack_propagator.rb +10 -9
- data/lib/datadog/opentracer/span.rb +1 -1
- data/lib/datadog/opentracer/text_map_propagator.rb +13 -12
- data/lib/datadog/opentracer/thread_local_scope_manager.rb +26 -3
- data/lib/datadog/opentracer/tracer.rb +23 -23
- data/lib/datadog/opentracer.rb +16 -16
- data/lib/datadog/profiling/buffer.rb +3 -3
- data/lib/datadog/profiling/collectors/code_provenance.rb +1 -0
- data/lib/datadog/profiling/collectors/cpu_and_wall_time.rb +43 -0
- data/lib/datadog/profiling/collectors/cpu_and_wall_time_worker.rb +91 -0
- data/lib/datadog/profiling/collectors/dynamic_sampling_rate.rb +14 -0
- data/lib/datadog/profiling/collectors/idle_sampling_helper.rb +68 -0
- data/lib/datadog/profiling/collectors/old_stack.rb +305 -0
- data/lib/datadog/profiling/collectors/stack.rb +4 -288
- data/lib/datadog/profiling/encoding/profile.rb +8 -13
- data/lib/datadog/profiling/events/stack.rb +1 -1
- data/lib/datadog/profiling/exporter.rb +69 -9
- data/lib/datadog/profiling/ext/forking.rb +41 -42
- data/lib/datadog/profiling/ext.rb +4 -16
- data/lib/datadog/profiling/flush.rb +25 -56
- data/lib/datadog/profiling/http_transport.rb +132 -0
- data/lib/datadog/profiling/load_native_extension.rb +22 -0
- data/lib/datadog/profiling/old_recorder.rb +109 -0
- data/lib/datadog/profiling/pprof/builder.rb +4 -4
- data/lib/datadog/profiling/pprof/converter.rb +1 -1
- data/lib/datadog/profiling/pprof/message_set.rb +1 -1
- data/lib/datadog/profiling/pprof/stack_sample.rb +4 -4
- data/lib/datadog/profiling/pprof/string_table.rb +1 -1
- data/lib/datadog/profiling/pprof/template.rb +5 -5
- data/lib/datadog/profiling/preload.rb +1 -1
- data/lib/datadog/profiling/profiler.rb +7 -0
- data/lib/datadog/profiling/scheduler.rb +29 -50
- data/lib/datadog/profiling/stack_recorder.rb +79 -0
- data/lib/datadog/profiling/tag_builder.rb +53 -0
- data/lib/datadog/profiling/tasks/exec.rb +2 -2
- data/lib/datadog/profiling/tasks/setup.rb +8 -13
- data/lib/datadog/profiling/trace_identifiers/ddtrace.rb +2 -2
- data/lib/datadog/profiling/trace_identifiers/helper.rb +1 -1
- data/lib/datadog/profiling.rb +49 -44
- data/lib/datadog/tracing/analytics.rb +1 -1
- data/lib/datadog/tracing/buffer.rb +14 -8
- data/lib/datadog/tracing/client_ip.rb +164 -0
- data/lib/datadog/tracing/configuration/ext.rb +47 -4
- data/lib/datadog/tracing/configuration/settings.rb +433 -0
- data/lib/datadog/tracing/context.rb +1 -1
- data/lib/datadog/tracing/context_provider.rb +18 -2
- data/lib/datadog/tracing/contrib/action_cable/configuration/settings.rb +2 -2
- data/lib/datadog/tracing/contrib/action_cable/event.rb +4 -5
- data/lib/datadog/tracing/contrib/action_cable/events/broadcast.rb +4 -4
- data/lib/datadog/tracing/contrib/action_cable/events/perform_action.rb +3 -3
- data/lib/datadog/tracing/contrib/action_cable/events/transmit.rb +4 -4
- data/lib/datadog/tracing/contrib/action_cable/events.rb +4 -4
- data/lib/datadog/tracing/contrib/action_cable/instrumentation.rb +3 -4
- data/lib/datadog/tracing/contrib/action_cable/integration.rb +4 -4
- data/lib/datadog/tracing/contrib/action_cable/patcher.rb +4 -4
- data/lib/datadog/tracing/contrib/action_mailer/configuration/settings.rb +2 -2
- data/lib/datadog/tracing/contrib/action_mailer/event.rb +3 -3
- data/lib/datadog/tracing/contrib/action_mailer/events/deliver.rb +3 -3
- data/lib/datadog/tracing/contrib/action_mailer/events/process.rb +3 -3
- data/lib/datadog/tracing/contrib/action_mailer/events.rb +2 -2
- data/lib/datadog/tracing/contrib/action_mailer/integration.rb +4 -4
- data/lib/datadog/tracing/contrib/action_mailer/patcher.rb +3 -3
- data/lib/datadog/tracing/contrib/action_pack/action_controller/instrumentation.rb +10 -6
- data/lib/datadog/tracing/contrib/action_pack/action_controller/patcher.rb +2 -2
- data/lib/datadog/tracing/contrib/action_pack/configuration/settings.rb +2 -2
- data/lib/datadog/tracing/contrib/action_pack/integration.rb +4 -4
- data/lib/datadog/tracing/contrib/action_pack/patcher.rb +2 -2
- data/lib/datadog/tracing/contrib/action_pack/utils.rb +1 -1
- data/lib/datadog/tracing/contrib/action_view/configuration/settings.rb +2 -2
- data/lib/datadog/tracing/contrib/action_view/event.rb +1 -1
- data/lib/datadog/tracing/contrib/action_view/events/render_partial.rb +5 -5
- data/lib/datadog/tracing/contrib/action_view/events/render_template.rb +5 -5
- data/lib/datadog/tracing/contrib/action_view/events.rb +2 -2
- data/lib/datadog/tracing/contrib/action_view/instrumentation/partial_renderer.rb +2 -2
- data/lib/datadog/tracing/contrib/action_view/instrumentation/template_renderer.rb +2 -2
- data/lib/datadog/tracing/contrib/action_view/integration.rb +4 -4
- data/lib/datadog/tracing/contrib/action_view/patcher.rb +7 -8
- data/lib/datadog/tracing/contrib/action_view/utils.rb +1 -1
- data/lib/datadog/tracing/contrib/active_job/configuration/settings.rb +3 -3
- data/lib/datadog/tracing/contrib/active_job/event.rb +3 -3
- data/lib/datadog/tracing/contrib/active_job/events/discard.rb +4 -4
- data/lib/datadog/tracing/contrib/active_job/events/enqueue.rb +4 -4
- data/lib/datadog/tracing/contrib/active_job/events/enqueue_at.rb +4 -4
- data/lib/datadog/tracing/contrib/active_job/events/enqueue_retry.rb +4 -4
- data/lib/datadog/tracing/contrib/active_job/events/perform.rb +4 -4
- data/lib/datadog/tracing/contrib/active_job/events/retry_stopped.rb +4 -4
- data/lib/datadog/tracing/contrib/active_job/events.rb +6 -6
- data/lib/datadog/tracing/contrib/active_job/integration.rb +4 -4
- data/lib/datadog/tracing/contrib/active_job/log_injection.rb +0 -2
- data/lib/datadog/tracing/contrib/active_job/patcher.rb +4 -4
- data/lib/datadog/tracing/contrib/active_model_serializers/configuration/settings.rb +2 -2
- data/lib/datadog/tracing/contrib/active_model_serializers/event.rb +4 -5
- data/lib/datadog/tracing/contrib/active_model_serializers/events/render.rb +3 -3
- data/lib/datadog/tracing/contrib/active_model_serializers/events/serialize.rb +2 -2
- data/lib/datadog/tracing/contrib/active_model_serializers/events.rb +2 -2
- data/lib/datadog/tracing/contrib/active_model_serializers/integration.rb +3 -3
- data/lib/datadog/tracing/contrib/active_model_serializers/patcher.rb +3 -4
- data/lib/datadog/tracing/contrib/active_record/configuration/resolver.rb +4 -4
- data/lib/datadog/tracing/contrib/active_record/configuration/settings.rb +3 -3
- data/lib/datadog/tracing/contrib/active_record/event.rb +1 -1
- data/lib/datadog/tracing/contrib/active_record/events/instantiation.rb +4 -4
- data/lib/datadog/tracing/contrib/active_record/events/sql.rb +6 -6
- data/lib/datadog/tracing/contrib/active_record/events.rb +2 -2
- data/lib/datadog/tracing/contrib/active_record/integration.rb +6 -6
- data/lib/datadog/tracing/contrib/active_record/patcher.rb +2 -2
- data/lib/datadog/tracing/contrib/active_record/utils.rb +3 -3
- data/lib/datadog/tracing/contrib/active_record/vendor/connection_specification.rb +1 -1
- data/lib/datadog/tracing/contrib/active_support/cache/instrumentation.rb +19 -9
- data/lib/datadog/tracing/contrib/active_support/cache/patcher.rb +2 -2
- data/lib/datadog/tracing/contrib/active_support/cache/redis.rb +1 -1
- data/lib/datadog/tracing/contrib/active_support/configuration/settings.rb +2 -2
- data/lib/datadog/tracing/contrib/active_support/integration.rb +5 -5
- data/lib/datadog/tracing/contrib/active_support/notifications/event.rb +1 -1
- data/lib/datadog/tracing/contrib/active_support/notifications/subscriber.rb +1 -1
- data/lib/datadog/tracing/contrib/active_support/notifications/subscription.rb +4 -2
- data/lib/datadog/tracing/contrib/active_support/patcher.rb +2 -2
- data/lib/datadog/tracing/contrib/analytics.rb +1 -1
- data/lib/datadog/tracing/contrib/auto_instrument.rb +4 -4
- data/lib/datadog/tracing/contrib/aws/configuration/settings.rb +6 -3
- data/lib/datadog/tracing/contrib/aws/ext.rb +1 -0
- data/lib/datadog/tracing/contrib/aws/instrumentation.rb +5 -4
- data/lib/datadog/tracing/contrib/aws/integration.rb +3 -3
- data/lib/datadog/tracing/contrib/aws/patcher.rb +5 -5
- data/lib/datadog/tracing/contrib/aws/services.rb +0 -2
- data/lib/datadog/tracing/contrib/concurrent_ruby/configuration/settings.rb +2 -2
- data/lib/datadog/tracing/contrib/concurrent_ruby/context_composite_executor_service.rb +10 -3
- data/lib/datadog/tracing/contrib/concurrent_ruby/future_patch.rb +1 -1
- data/lib/datadog/tracing/contrib/concurrent_ruby/integration.rb +3 -3
- data/lib/datadog/tracing/contrib/concurrent_ruby/patcher.rb +2 -2
- data/lib/datadog/tracing/contrib/configurable.rb +2 -2
- data/lib/datadog/tracing/contrib/configuration/resolvers/pattern_resolver.rb +1 -1
- data/lib/datadog/tracing/contrib/configuration/settings.rb +2 -2
- data/lib/datadog/tracing/contrib/dalli/configuration/settings.rb +6 -3
- data/lib/datadog/tracing/contrib/dalli/ext.rb +2 -0
- data/lib/datadog/tracing/contrib/dalli/instrumentation.rb +8 -5
- data/lib/datadog/tracing/contrib/dalli/integration.rb +3 -3
- data/lib/datadog/tracing/contrib/dalli/patcher.rb +3 -4
- data/lib/datadog/tracing/contrib/dalli/quantize.rb +1 -1
- data/lib/datadog/tracing/contrib/delayed_job/configuration/settings.rb +3 -3
- data/lib/datadog/tracing/contrib/delayed_job/ext.rb +2 -0
- data/lib/datadog/tracing/contrib/delayed_job/integration.rb +3 -3
- data/lib/datadog/tracing/contrib/delayed_job/patcher.rb +8 -3
- data/lib/datadog/tracing/contrib/delayed_job/plugin.rb +7 -4
- data/lib/datadog/tracing/contrib/delayed_job/server_internal_tracer/worker.rb +32 -0
- data/lib/datadog/tracing/contrib/elasticsearch/configuration/settings.rb +7 -3
- data/lib/datadog/tracing/contrib/elasticsearch/ext.rb +3 -0
- data/lib/datadog/tracing/contrib/elasticsearch/integration.rb +12 -6
- data/lib/datadog/tracing/contrib/elasticsearch/patcher.rb +47 -9
- data/lib/datadog/tracing/contrib/elasticsearch/quantize.rb +1 -1
- data/lib/datadog/tracing/contrib/ethon/configuration/settings.rb +8 -3
- data/lib/datadog/tracing/contrib/ethon/easy_patch.rb +6 -7
- data/lib/datadog/tracing/contrib/ethon/ext.rb +1 -0
- data/lib/datadog/tracing/contrib/ethon/integration.rb +4 -4
- data/lib/datadog/tracing/contrib/ethon/multi_patch.rb +5 -4
- data/lib/datadog/tracing/contrib/ethon/patcher.rb +3 -4
- data/lib/datadog/tracing/contrib/excon/configuration/settings.rb +7 -3
- data/lib/datadog/tracing/contrib/excon/ext.rb +1 -0
- data/lib/datadog/tracing/contrib/excon/integration.rb +4 -4
- data/lib/datadog/tracing/contrib/excon/middleware.rb +8 -7
- data/lib/datadog/tracing/contrib/excon/patcher.rb +2 -2
- data/lib/datadog/tracing/contrib/ext.rb +25 -0
- data/lib/datadog/tracing/contrib/extensions.rb +5 -5
- data/lib/datadog/tracing/contrib/faraday/configuration/settings.rb +7 -3
- data/lib/datadog/tracing/contrib/faraday/ext.rb +1 -0
- data/lib/datadog/tracing/contrib/faraday/integration.rb +4 -4
- data/lib/datadog/tracing/contrib/faraday/middleware.rb +8 -8
- data/lib/datadog/tracing/contrib/faraday/patcher.rb +5 -6
- data/lib/datadog/tracing/contrib/grape/configuration/settings.rb +3 -3
- data/lib/datadog/tracing/contrib/grape/endpoint.rb +4 -7
- data/lib/datadog/tracing/contrib/grape/integration.rb +3 -3
- data/lib/datadog/tracing/contrib/grape/patcher.rb +4 -5
- data/lib/datadog/tracing/contrib/graphql/configuration/settings.rb +3 -3
- data/lib/datadog/tracing/contrib/graphql/integration.rb +3 -3
- data/lib/datadog/tracing/contrib/graphql/patcher.rb +2 -4
- data/lib/datadog/tracing/contrib/grpc/configuration/settings.rb +10 -4
- data/lib/datadog/tracing/contrib/grpc/datadog_interceptor/client.rb +20 -5
- data/lib/datadog/tracing/contrib/grpc/datadog_interceptor/server.rb +17 -17
- data/lib/datadog/tracing/contrib/grpc/datadog_interceptor.rb +7 -4
- data/lib/datadog/tracing/contrib/grpc/distributed/fetcher.rb +27 -0
- data/lib/datadog/tracing/contrib/grpc/distributed/propagation.rb +43 -0
- data/lib/datadog/tracing/contrib/grpc/ext.rb +4 -0
- data/lib/datadog/tracing/contrib/grpc/integration.rb +3 -3
- data/lib/datadog/tracing/contrib/grpc/patcher.rb +3 -6
- data/lib/datadog/tracing/contrib/hanami/action_tracer.rb +47 -0
- data/lib/datadog/tracing/contrib/hanami/configuration/settings.rb +22 -0
- data/lib/datadog/tracing/contrib/hanami/ext.rb +24 -0
- data/lib/datadog/tracing/contrib/hanami/integration.rb +44 -0
- data/lib/datadog/tracing/contrib/hanami/patcher.rb +33 -0
- data/lib/datadog/tracing/contrib/hanami/plugin.rb +23 -0
- data/lib/datadog/tracing/contrib/hanami/renderer_policy_tracing.rb +41 -0
- data/lib/datadog/tracing/contrib/hanami/router_tracing.rb +44 -0
- data/lib/datadog/tracing/contrib/http/circuit_breaker.rb +1 -2
- data/lib/datadog/tracing/contrib/http/configuration/settings.rb +13 -3
- data/lib/datadog/tracing/contrib/http/distributed/fetcher.rb +39 -0
- data/lib/datadog/tracing/contrib/http/distributed/propagation.rb +38 -0
- data/lib/datadog/tracing/contrib/http/ext.rb +2 -0
- data/lib/datadog/tracing/contrib/http/instrumentation.rb +8 -10
- data/lib/datadog/tracing/contrib/http/integration.rb +6 -6
- data/lib/datadog/tracing/contrib/http/patcher.rb +3 -3
- data/lib/datadog/tracing/contrib/httpclient/configuration/settings.rb +13 -3
- data/lib/datadog/tracing/contrib/httpclient/ext.rb +2 -0
- data/lib/datadog/tracing/contrib/httpclient/instrumentation.rb +9 -9
- data/lib/datadog/tracing/contrib/httpclient/integration.rb +4 -4
- data/lib/datadog/tracing/contrib/httpclient/patcher.rb +3 -3
- data/lib/datadog/tracing/contrib/httprb/configuration/settings.rb +13 -3
- data/lib/datadog/tracing/contrib/httprb/ext.rb +2 -0
- data/lib/datadog/tracing/contrib/httprb/instrumentation.rb +9 -9
- data/lib/datadog/tracing/contrib/httprb/integration.rb +4 -4
- data/lib/datadog/tracing/contrib/httprb/patcher.rb +3 -3
- data/lib/datadog/tracing/contrib/integration.rb +3 -3
- data/lib/datadog/tracing/contrib/kafka/configuration/settings.rb +2 -2
- data/lib/datadog/tracing/contrib/kafka/consumer_event.rb +1 -0
- data/lib/datadog/tracing/contrib/kafka/event.rb +3 -3
- data/lib/datadog/tracing/contrib/kafka/events/connection/request.rb +2 -2
- data/lib/datadog/tracing/contrib/kafka/events/consumer/process_batch.rb +3 -3
- data/lib/datadog/tracing/contrib/kafka/events/consumer/process_message.rb +3 -3
- data/lib/datadog/tracing/contrib/kafka/events/consumer_group/heartbeat.rb +4 -4
- data/lib/datadog/tracing/contrib/kafka/events/consumer_group/join_group.rb +4 -4
- data/lib/datadog/tracing/contrib/kafka/events/consumer_group/leave_group.rb +4 -4
- data/lib/datadog/tracing/contrib/kafka/events/consumer_group/sync_group.rb +4 -4
- data/lib/datadog/tracing/contrib/kafka/events/produce_operation/send_messages.rb +3 -2
- data/lib/datadog/tracing/contrib/kafka/events/producer/deliver_messages.rb +3 -2
- data/lib/datadog/tracing/contrib/kafka/events.rb +9 -9
- data/lib/datadog/tracing/contrib/kafka/integration.rb +3 -3
- data/lib/datadog/tracing/contrib/kafka/patcher.rb +3 -4
- data/lib/datadog/tracing/contrib/lograge/configuration/settings.rb +2 -2
- data/lib/datadog/tracing/contrib/lograge/instrumentation.rb +2 -2
- data/lib/datadog/tracing/contrib/lograge/integration.rb +3 -3
- data/lib/datadog/tracing/contrib/lograge/patcher.rb +2 -2
- data/lib/datadog/tracing/contrib/mongodb/configuration/settings.rb +7 -3
- data/lib/datadog/tracing/contrib/mongodb/ext.rb +8 -0
- data/lib/datadog/tracing/contrib/mongodb/instrumentation.rb +3 -3
- data/lib/datadog/tracing/contrib/mongodb/integration.rb +4 -4
- data/lib/datadog/tracing/contrib/mongodb/parsers.rb +1 -1
- data/lib/datadog/tracing/contrib/mongodb/patcher.rb +3 -3
- data/lib/datadog/tracing/contrib/mongodb/subscribers.rb +10 -4
- data/lib/datadog/tracing/contrib/mysql2/configuration/settings.rb +18 -3
- data/lib/datadog/tracing/contrib/mysql2/ext.rb +2 -0
- data/lib/datadog/tracing/contrib/mysql2/instrumentation.rb +20 -5
- data/lib/datadog/tracing/contrib/mysql2/integration.rb +3 -3
- data/lib/datadog/tracing/contrib/mysql2/patcher.rb +2 -2
- data/lib/datadog/tracing/contrib/patcher.rb +16 -4
- data/lib/datadog/tracing/contrib/pg/configuration/settings.rb +50 -0
- data/lib/datadog/tracing/contrib/pg/ext.rb +33 -0
- data/lib/datadog/tracing/contrib/pg/instrumentation.rb +168 -0
- data/lib/datadog/tracing/contrib/pg/integration.rb +43 -0
- data/lib/datadog/tracing/contrib/pg/patcher.rb +31 -0
- data/lib/datadog/tracing/contrib/presto/configuration/settings.rb +6 -3
- data/lib/datadog/tracing/contrib/presto/ext.rb +1 -0
- data/lib/datadog/tracing/contrib/presto/instrumentation.rb +2 -3
- data/lib/datadog/tracing/contrib/presto/integration.rb +3 -3
- data/lib/datadog/tracing/contrib/presto/patcher.rb +4 -4
- data/lib/datadog/tracing/contrib/propagation/sql_comment/comment.rb +43 -0
- data/lib/datadog/tracing/contrib/propagation/sql_comment/ext.rb +33 -0
- data/lib/datadog/tracing/contrib/propagation/sql_comment/mode.rb +28 -0
- data/lib/datadog/tracing/contrib/propagation/sql_comment.rb +47 -0
- data/lib/datadog/tracing/contrib/qless/configuration/settings.rb +2 -2
- data/lib/datadog/tracing/contrib/qless/integration.rb +3 -3
- data/lib/datadog/tracing/contrib/qless/patcher.rb +1 -3
- data/lib/datadog/tracing/contrib/qless/qless_job.rb +2 -3
- data/lib/datadog/tracing/contrib/qless/tracer_cleaner.rb +0 -2
- data/lib/datadog/tracing/contrib/que/configuration/settings.rb +3 -3
- data/lib/datadog/tracing/contrib/que/integration.rb +4 -4
- data/lib/datadog/tracing/contrib/que/patcher.rb +1 -2
- data/lib/datadog/tracing/contrib/que/tracer.rb +3 -1
- data/lib/datadog/tracing/contrib/racecar/configuration/settings.rb +2 -2
- data/lib/datadog/tracing/contrib/racecar/event.rb +4 -5
- data/lib/datadog/tracing/contrib/racecar/events/batch.rb +6 -3
- data/lib/datadog/tracing/contrib/racecar/events/consume.rb +2 -2
- data/lib/datadog/tracing/contrib/racecar/events/message.rb +6 -3
- data/lib/datadog/tracing/contrib/racecar/events.rb +3 -3
- data/lib/datadog/tracing/contrib/racecar/integration.rb +3 -3
- data/lib/datadog/tracing/contrib/racecar/patcher.rb +3 -4
- data/lib/datadog/tracing/contrib/rack/configuration/settings.rb +2 -2
- data/lib/datadog/tracing/contrib/rack/header_collection.rb +35 -0
- data/lib/datadog/tracing/contrib/rack/integration.rb +4 -4
- data/lib/datadog/tracing/contrib/rack/middlewares.rb +129 -61
- data/lib/datadog/tracing/contrib/rack/patcher.rb +12 -2
- data/lib/datadog/tracing/contrib/rails/auto_instrument_railtie.rb +1 -1
- data/lib/datadog/tracing/contrib/rails/configuration/settings.rb +4 -1
- data/lib/datadog/tracing/contrib/rails/framework.rb +18 -22
- data/lib/datadog/tracing/contrib/rails/integration.rb +4 -4
- data/lib/datadog/tracing/contrib/rails/log_injection.rb +3 -18
- data/lib/datadog/tracing/contrib/rails/middlewares.rb +1 -2
- data/lib/datadog/tracing/contrib/rails/patcher.rb +7 -8
- data/lib/datadog/tracing/contrib/rails/railtie.rb +3 -3
- data/lib/datadog/tracing/contrib/rails/utils.rb +1 -1
- data/lib/datadog/tracing/contrib/rake/configuration/settings.rb +17 -2
- data/lib/datadog/tracing/contrib/rake/instrumentation.rb +14 -9
- data/lib/datadog/tracing/contrib/rake/integration.rb +3 -3
- data/lib/datadog/tracing/contrib/rake/patcher.rb +3 -5
- data/lib/datadog/tracing/contrib/redis/configuration/resolver.rb +1 -1
- data/lib/datadog/tracing/contrib/redis/configuration/settings.rb +6 -3
- data/lib/datadog/tracing/contrib/redis/ext.rb +3 -0
- data/lib/datadog/tracing/contrib/redis/instrumentation.rb +36 -26
- data/lib/datadog/tracing/contrib/redis/integration.rb +37 -4
- data/lib/datadog/tracing/contrib/redis/patcher.rb +57 -14
- data/lib/datadog/tracing/contrib/redis/quantize.rb +12 -9
- data/lib/datadog/tracing/contrib/redis/tags.rb +12 -10
- data/lib/datadog/tracing/contrib/redis/trace_middleware.rb +72 -0
- data/lib/datadog/tracing/contrib/resque/configuration/settings.rb +3 -3
- data/lib/datadog/tracing/contrib/resque/integration.rb +3 -3
- data/lib/datadog/tracing/contrib/resque/patcher.rb +2 -3
- data/lib/datadog/tracing/contrib/resque/resque_job.rb +5 -4
- data/lib/datadog/tracing/contrib/rest_client/configuration/settings.rb +9 -3
- data/lib/datadog/tracing/contrib/rest_client/ext.rb +1 -0
- data/lib/datadog/tracing/contrib/rest_client/integration.rb +3 -3
- data/lib/datadog/tracing/contrib/rest_client/patcher.rb +2 -3
- data/lib/datadog/tracing/contrib/rest_client/request_patch.rb +7 -6
- data/lib/datadog/tracing/contrib/semantic_logger/configuration/settings.rb +2 -2
- data/lib/datadog/tracing/contrib/semantic_logger/instrumentation.rb +2 -2
- data/lib/datadog/tracing/contrib/semantic_logger/integration.rb +3 -3
- data/lib/datadog/tracing/contrib/semantic_logger/patcher.rb +2 -2
- data/lib/datadog/tracing/contrib/sequel/configuration/settings.rb +2 -2
- data/lib/datadog/tracing/contrib/sequel/database.rb +4 -5
- data/lib/datadog/tracing/contrib/sequel/dataset.rb +4 -5
- data/lib/datadog/tracing/contrib/sequel/integration.rb +3 -3
- data/lib/datadog/tracing/contrib/sequel/patcher.rb +3 -3
- data/lib/datadog/tracing/contrib/sequel/utils.rb +2 -2
- data/lib/datadog/tracing/contrib/shoryuken/configuration/settings.rb +3 -3
- data/lib/datadog/tracing/contrib/shoryuken/integration.rb +4 -4
- data/lib/datadog/tracing/contrib/shoryuken/patcher.rb +1 -1
- data/lib/datadog/tracing/contrib/shoryuken/tracer.rb +3 -1
- data/lib/datadog/tracing/contrib/sidekiq/client_tracer.rb +9 -5
- data/lib/datadog/tracing/contrib/sidekiq/configuration/settings.rb +4 -3
- data/lib/datadog/tracing/contrib/sidekiq/ext.rb +6 -0
- data/lib/datadog/tracing/contrib/sidekiq/integration.rb +3 -3
- data/lib/datadog/tracing/contrib/sidekiq/patcher.rb +14 -7
- data/lib/datadog/tracing/contrib/sidekiq/server_internal_tracer/heartbeat.rb +19 -1
- data/lib/datadog/tracing/contrib/sidekiq/server_internal_tracer/{scheduled_push.rb → redis_info.rb} +5 -6
- data/lib/datadog/tracing/contrib/sidekiq/server_internal_tracer/scheduled_poller.rb +53 -0
- data/lib/datadog/tracing/contrib/sidekiq/server_tracer.rb +29 -6
- data/lib/datadog/tracing/contrib/sidekiq/tracing.rb +2 -2
- data/lib/datadog/tracing/contrib/sinatra/configuration/settings.rb +2 -2
- data/lib/datadog/tracing/contrib/sinatra/env.rb +14 -25
- data/lib/datadog/tracing/contrib/sinatra/ext.rb +7 -3
- data/lib/datadog/tracing/contrib/sinatra/framework.rb +11 -2
- data/lib/datadog/tracing/contrib/sinatra/headers.rb +1 -1
- data/lib/datadog/tracing/contrib/sinatra/integration.rb +3 -3
- data/lib/datadog/tracing/contrib/sinatra/patcher.rb +7 -8
- data/lib/datadog/tracing/contrib/sinatra/tracer.rb +15 -88
- data/lib/datadog/tracing/contrib/sinatra/tracer_middleware.rb +20 -16
- data/lib/datadog/tracing/contrib/sneakers/configuration/settings.rb +2 -2
- data/lib/datadog/tracing/contrib/sneakers/integration.rb +4 -4
- data/lib/datadog/tracing/contrib/sneakers/patcher.rb +2 -3
- data/lib/datadog/tracing/contrib/sneakers/tracer.rb +4 -3
- data/lib/datadog/tracing/contrib/status_code_matcher.rb +2 -2
- data/lib/datadog/tracing/contrib/stripe/configuration/settings.rb +33 -0
- data/lib/datadog/tracing/contrib/stripe/ext.rb +26 -0
- data/lib/datadog/tracing/contrib/stripe/integration.rb +43 -0
- data/lib/datadog/tracing/contrib/stripe/patcher.rb +29 -0
- data/lib/datadog/tracing/contrib/stripe/request.rb +67 -0
- data/lib/datadog/tracing/contrib/sucker_punch/configuration/settings.rb +2 -2
- data/lib/datadog/tracing/contrib/sucker_punch/instrumentation.rb +3 -4
- data/lib/datadog/tracing/contrib/sucker_punch/integration.rb +3 -3
- data/lib/datadog/tracing/contrib/sucker_punch/patcher.rb +4 -6
- data/lib/datadog/tracing/contrib/utils/quantization/http.rb +92 -10
- data/lib/datadog/tracing/contrib.rb +50 -47
- data/lib/datadog/tracing/correlation.rb +1 -1
- data/lib/datadog/{core → tracing}/diagnostics/ext.rb +1 -6
- data/lib/datadog/tracing/diagnostics/health.rb +40 -0
- data/lib/datadog/tracing/distributed/b3_multi.rb +66 -0
- data/lib/datadog/tracing/distributed/b3_single.rb +66 -0
- data/lib/datadog/tracing/distributed/datadog.rb +153 -0
- data/lib/datadog/tracing/distributed/datadog_tags_codec.rb +85 -0
- data/lib/datadog/tracing/distributed/fetcher.rb +30 -0
- data/lib/datadog/tracing/distributed/headers/ext.rb +19 -15
- data/lib/datadog/tracing/distributed/helpers.rb +40 -4
- data/lib/datadog/tracing/distributed/none.rb +19 -0
- data/lib/datadog/tracing/distributed/propagation.rb +127 -0
- data/lib/datadog/tracing/distributed/trace_context.rb +378 -0
- data/lib/datadog/tracing/event.rb +3 -2
- data/lib/datadog/tracing/flush.rb +57 -35
- data/lib/datadog/tracing/metadata/analytics.rb +2 -2
- data/lib/datadog/tracing/metadata/errors.rb +2 -2
- data/lib/datadog/tracing/metadata/ext.rb +28 -1
- data/lib/datadog/tracing/metadata/tagging.rb +23 -2
- data/lib/datadog/tracing/metadata.rb +3 -3
- data/lib/datadog/tracing/pipeline/span_filter.rb +10 -6
- data/lib/datadog/tracing/pipeline.rb +3 -3
- data/lib/datadog/tracing/propagation/http.rb +3 -98
- data/lib/datadog/tracing/runtime/metrics.rb +1 -1
- data/lib/datadog/tracing/sampling/all_sampler.rb +1 -1
- data/lib/datadog/tracing/sampling/ext.rb +31 -0
- data/lib/datadog/tracing/sampling/priority_sampler.rb +64 -12
- data/lib/datadog/tracing/sampling/rate_by_key_sampler.rb +10 -11
- data/lib/datadog/tracing/sampling/rate_by_service_sampler.rb +32 -8
- data/lib/datadog/tracing/sampling/rate_limiter.rb +4 -1
- data/lib/datadog/tracing/sampling/rate_sampler.rb +27 -10
- data/lib/datadog/tracing/sampling/rule.rb +15 -9
- data/lib/datadog/tracing/sampling/rule_sampler.rb +11 -12
- data/lib/datadog/tracing/sampling/span/ext.rb +25 -0
- data/lib/datadog/tracing/sampling/span/matcher.rb +89 -0
- data/lib/datadog/tracing/sampling/span/rule.rb +82 -0
- data/lib/datadog/tracing/sampling/span/rule_parser.rb +104 -0
- data/lib/datadog/tracing/sampling/span/sampler.rb +75 -0
- data/lib/datadog/tracing/span.rb +24 -20
- data/lib/datadog/tracing/span_operation.rb +15 -16
- data/lib/datadog/tracing/sync_writer.rb +5 -5
- data/lib/datadog/tracing/trace_digest.rb +88 -2
- data/lib/datadog/tracing/trace_operation.rb +60 -16
- data/lib/datadog/tracing/trace_segment.rb +13 -8
- data/lib/datadog/tracing/tracer.rb +49 -21
- data/lib/datadog/tracing/utils.rb +50 -0
- data/lib/datadog/tracing/workers/trace_writer.rb +9 -9
- data/lib/datadog/tracing/workers.rb +3 -3
- data/lib/datadog/tracing/writer.rb +12 -5
- data/lib/datadog/tracing.rb +8 -8
- data/lib/ddtrace/auto_instrument.rb +9 -2
- data/lib/ddtrace/transport/ext.rb +7 -1
- data/lib/ddtrace/transport/http/adapters/net.rb +3 -2
- data/lib/ddtrace/transport/http/adapters/test.rb +1 -1
- data/lib/ddtrace/transport/http/adapters/unix_socket.rb +2 -2
- data/lib/ddtrace/transport/http/api/map.rb +1 -1
- data/lib/ddtrace/transport/http/api.rb +4 -4
- data/lib/ddtrace/transport/http/builder.rb +5 -5
- data/lib/ddtrace/transport/http/client.rb +4 -3
- data/lib/ddtrace/transport/http/response.rb +35 -5
- data/lib/ddtrace/transport/http/statistics.rb +1 -1
- data/lib/ddtrace/transport/http/traces.rb +5 -5
- data/lib/ddtrace/transport/http.rb +12 -9
- data/lib/ddtrace/transport/io/client.rb +5 -3
- data/lib/ddtrace/transport/io/response.rb +1 -1
- data/lib/ddtrace/transport/io/traces.rb +3 -3
- data/lib/ddtrace/transport/io.rb +3 -3
- data/lib/ddtrace/transport/statistics.rb +2 -2
- data/lib/ddtrace/transport/trace_formatter.rb +14 -10
- data/lib/ddtrace/transport/traces.rb +8 -6
- data/lib/ddtrace/version.rb +1 -1
- data/lib/ddtrace.rb +6 -5
- metadata +160 -44
- data/.editorconfig +0 -22
- data/.gitignore +0 -70
- data/CONTRIBUTING.md +0 -81
- data/ddtrace.gemspec +0 -59
- data/docs/0.x-trace.png +0 -0
- data/docs/1.0-trace.png +0 -0
- data/docs/AutoInstrumentation.md +0 -36
- data/docs/Deprecation.md +0 -8
- data/docs/DevelopmentGuide.md +0 -259
- data/docs/GettingStarted.md +0 -2671
- data/docs/ProfilingDevelopment.md +0 -110
- data/docs/PublicApi.md +0 -14
- data/docs/UpgradeGuide.md +0 -736
- data/lib/datadog/profiling/recorder.rb +0 -117
- data/lib/datadog/profiling/transport/client.rb +0 -16
- data/lib/datadog/profiling/transport/http/api/endpoint.rb +0 -107
- data/lib/datadog/profiling/transport/http/api/instance.rb +0 -38
- data/lib/datadog/profiling/transport/http/api/spec.rb +0 -42
- data/lib/datadog/profiling/transport/http/api.rb +0 -45
- data/lib/datadog/profiling/transport/http/builder.rb +0 -30
- data/lib/datadog/profiling/transport/http/client.rb +0 -35
- data/lib/datadog/profiling/transport/http/response.rb +0 -23
- data/lib/datadog/profiling/transport/http.rb +0 -112
- data/lib/datadog/profiling/transport/io/client.rb +0 -29
- data/lib/datadog/profiling/transport/io/response.rb +0 -18
- data/lib/datadog/profiling/transport/io.rb +0 -32
- data/lib/datadog/profiling/transport/parcel.rb +0 -19
- data/lib/datadog/profiling/transport/request.rb +0 -17
- data/lib/datadog/profiling/transport/response.rb +0 -10
- data/lib/datadog/tracing/distributed/headers/b3.rb +0 -55
- data/lib/datadog/tracing/distributed/headers/b3_single.rb +0 -67
- data/lib/datadog/tracing/distributed/headers/datadog.rb +0 -52
- data/lib/datadog/tracing/distributed/parser.rb +0 -70
- data/lib/datadog/tracing/propagation/grpc.rb +0 -88
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
# typed: true
|
|
2
2
|
|
|
3
|
-
|
|
4
|
-
|
|
3
|
+
require_relative 'sampler'
|
|
4
|
+
require_relative 'rate_sampler'
|
|
5
5
|
|
|
6
6
|
module Datadog
|
|
7
7
|
module Tracing
|
|
@@ -12,7 +12,7 @@ module Datadog
|
|
|
12
12
|
attr_reader \
|
|
13
13
|
:default_key
|
|
14
14
|
|
|
15
|
-
def initialize(default_key, default_rate = 1.0, &block)
|
|
15
|
+
def initialize(default_key, default_rate = 1.0, decision: nil, &block)
|
|
16
16
|
super()
|
|
17
17
|
|
|
18
18
|
raise ArgumentError, 'No resolver given!' unless block
|
|
@@ -22,7 +22,7 @@ module Datadog
|
|
|
22
22
|
@mutex = Mutex.new
|
|
23
23
|
@samplers = {}
|
|
24
24
|
|
|
25
|
-
set_rate(default_key, default_rate)
|
|
25
|
+
set_rate(default_key, default_rate, decision)
|
|
26
26
|
end
|
|
27
27
|
|
|
28
28
|
def resolve(trace)
|
|
@@ -57,15 +57,15 @@ module Datadog
|
|
|
57
57
|
end
|
|
58
58
|
end
|
|
59
59
|
|
|
60
|
-
def update(key, rate)
|
|
60
|
+
def update(key, rate, decision: nil)
|
|
61
61
|
@mutex.synchronize do
|
|
62
|
-
set_rate(key, rate)
|
|
62
|
+
set_rate(key, rate, decision)
|
|
63
63
|
end
|
|
64
64
|
end
|
|
65
65
|
|
|
66
|
-
def update_all(rate_by_key)
|
|
66
|
+
def update_all(rate_by_key, decision: nil)
|
|
67
67
|
@mutex.synchronize do
|
|
68
|
-
rate_by_key.each { |key, rate| set_rate(key, rate) }
|
|
68
|
+
rate_by_key.each { |key, rate| set_rate(key, rate, decision) }
|
|
69
69
|
end
|
|
70
70
|
end
|
|
71
71
|
|
|
@@ -87,9 +87,8 @@ module Datadog
|
|
|
87
87
|
|
|
88
88
|
private
|
|
89
89
|
|
|
90
|
-
def set_rate(key, rate)
|
|
91
|
-
@samplers[key]
|
|
92
|
-
@samplers[key].sample_rate = rate
|
|
90
|
+
def set_rate(key, rate, decision)
|
|
91
|
+
@samplers[key] = RateSampler.new(rate, decision: decision)
|
|
93
92
|
end
|
|
94
93
|
end
|
|
95
94
|
end
|
|
@@ -1,27 +1,33 @@
|
|
|
1
1
|
# typed: true
|
|
2
2
|
|
|
3
|
-
|
|
4
|
-
|
|
3
|
+
require_relative '../../core'
|
|
4
|
+
require_relative 'rate_by_key_sampler'
|
|
5
5
|
|
|
6
6
|
module Datadog
|
|
7
7
|
module Tracing
|
|
8
8
|
module Sampling
|
|
9
|
-
# {Datadog
|
|
9
|
+
# {Datadog::Tracing::Sampling::RateByServiceSampler} samples different services at different rates
|
|
10
10
|
# @public_api
|
|
11
11
|
class RateByServiceSampler < RateByKeySampler
|
|
12
12
|
DEFAULT_KEY = 'service:,env:'.freeze
|
|
13
13
|
|
|
14
|
-
def initialize(default_rate = 1.0,
|
|
15
|
-
super(
|
|
16
|
-
|
|
14
|
+
def initialize(default_rate = 1.0, env: nil, decision: Datadog::Tracing::Sampling::Ext::Decision::DEFAULT)
|
|
15
|
+
super(
|
|
16
|
+
DEFAULT_KEY,
|
|
17
|
+
default_rate,
|
|
18
|
+
decision: decision,
|
|
19
|
+
&method(:key_for)
|
|
20
|
+
)
|
|
21
|
+
|
|
22
|
+
@env = env
|
|
17
23
|
end
|
|
18
24
|
|
|
19
|
-
def update(rate_by_service)
|
|
25
|
+
def update(rate_by_service, decision: nil)
|
|
20
26
|
# Remove any old services
|
|
21
27
|
delete_if { |key, _| key != DEFAULT_KEY && !rate_by_service.key?(key) }
|
|
22
28
|
|
|
23
29
|
# Update each service rate
|
|
24
|
-
update_all(rate_by_service)
|
|
30
|
+
update_all(rate_by_service, decision: decision)
|
|
25
31
|
|
|
26
32
|
# Emit metric for service cache size
|
|
27
33
|
Datadog.health_metrics.sampling_service_cache_length(length)
|
|
@@ -29,6 +35,24 @@ module Datadog
|
|
|
29
35
|
|
|
30
36
|
private
|
|
31
37
|
|
|
38
|
+
# DEV: Creating a string on every trace to perform a single Hash lookup is expensive.
|
|
39
|
+
#
|
|
40
|
+
# Using 2 nested hashes: 1 for env and 1 for service is the fastest option.
|
|
41
|
+
# This approach requires large API changes to `RateByKeySampler`.
|
|
42
|
+
#
|
|
43
|
+
# Reducing the interpolated string size, by using a 1 character separator,
|
|
44
|
+
# is also measurably faster than the current method. This approach does not
|
|
45
|
+
# require changes to `RateByKeySampler`.
|
|
46
|
+
#
|
|
47
|
+
# Keep in mind that these changes also require changes to `#update`.
|
|
48
|
+
#
|
|
49
|
+
# Comparison:
|
|
50
|
+
# 2 nested hashes: `service_hash.fetch(service, {}).fetch(env, default_rate)`
|
|
51
|
+
# 7730045 i/s
|
|
52
|
+
# 1 char separator: `hash.fetch("#{service}\0#{env}", default_rate)`
|
|
53
|
+
# 4302801 i/s - 1.80x slower
|
|
54
|
+
# current: `hash.fetch("service:#{service},env:#{env}", default_rate)`
|
|
55
|
+
# 2720459 i/s - 2.84x slower
|
|
32
56
|
def key_for(trace)
|
|
33
57
|
# Resolve env dynamically, if Proc is given.
|
|
34
58
|
env = @env.is_a?(Proc) ? @env.call : @env
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
# typed: true
|
|
2
2
|
|
|
3
|
-
|
|
3
|
+
require_relative '../../core/utils/time'
|
|
4
4
|
|
|
5
5
|
module Datadog
|
|
6
6
|
module Tracing
|
|
@@ -39,6 +39,9 @@ module Datadog
|
|
|
39
39
|
def initialize(rate, max_tokens = rate)
|
|
40
40
|
super()
|
|
41
41
|
|
|
42
|
+
raise ArgumentError, "rate must be a number: #{rate}" unless rate.is_a?(Numeric)
|
|
43
|
+
raise ArgumentError, "max_tokens must be a number: #{max_tokens}" unless max_tokens.is_a?(Numeric)
|
|
44
|
+
|
|
42
45
|
@rate = rate
|
|
43
46
|
@max_tokens = max_tokens
|
|
44
47
|
|
|
@@ -1,26 +1,36 @@
|
|
|
1
1
|
# typed: true
|
|
2
2
|
|
|
3
|
-
|
|
3
|
+
require_relative '../../core'
|
|
4
4
|
|
|
5
|
-
|
|
6
|
-
|
|
5
|
+
require_relative 'sampler'
|
|
6
|
+
require_relative '../utils'
|
|
7
7
|
|
|
8
8
|
module Datadog
|
|
9
9
|
module Tracing
|
|
10
10
|
module Sampling
|
|
11
|
-
# {Datadog
|
|
11
|
+
# {Datadog::Tracing::Sampling::RateSampler} is based on a sample rate.
|
|
12
12
|
# @public_api
|
|
13
13
|
class RateSampler < Sampler
|
|
14
14
|
KNUTH_FACTOR = 1111111111111111111
|
|
15
15
|
|
|
16
|
-
# Initialize a {Datadog
|
|
16
|
+
# Initialize a {Datadog::Tracing::Sampling::RateSampler}.
|
|
17
17
|
# This sampler keeps a random subset of the traces. Its main purpose is to
|
|
18
18
|
# reduce the instrumentation footprint.
|
|
19
19
|
#
|
|
20
20
|
# * +sample_rate+: the sample rate as a {Float} between 0.0 and 1.0. 0.0
|
|
21
21
|
# means that no trace will be sampled; 1.0 means that all traces will be
|
|
22
22
|
# sampled.
|
|
23
|
-
|
|
23
|
+
#
|
|
24
|
+
# DEV-2.0: Allow for `sample_rate` zero (drop all) to be allowed. This eases
|
|
25
|
+
# DEV-2.0: usage for all internal users of the {RateSampler} class: both
|
|
26
|
+
# DEV-2.0: RuleSampler and Single Span Sampling leverage the RateSampler, but want
|
|
27
|
+
# DEV-2.0: `sample_rate` zero to mean "drop all". They work around this by hard-
|
|
28
|
+
# DEV-2.0: setting the `sample_rate` to zero like so:
|
|
29
|
+
# DEV-2.0: ```
|
|
30
|
+
# DEV-2.0: sampler = RateSampler.new
|
|
31
|
+
# DEV-2.0: sampler.sample_rate = sample_rate
|
|
32
|
+
# DEV-2.0: ```
|
|
33
|
+
def initialize(sample_rate = 1.0, decision: nil)
|
|
24
34
|
super()
|
|
25
35
|
|
|
26
36
|
unless sample_rate > 0.0 && sample_rate <= 1.0
|
|
@@ -29,6 +39,8 @@ module Datadog
|
|
|
29
39
|
end
|
|
30
40
|
|
|
31
41
|
self.sample_rate = sample_rate
|
|
42
|
+
|
|
43
|
+
@decision = decision
|
|
32
44
|
end
|
|
33
45
|
|
|
34
46
|
def sample_rate(*_)
|
|
@@ -37,17 +49,22 @@ module Datadog
|
|
|
37
49
|
|
|
38
50
|
def sample_rate=(sample_rate)
|
|
39
51
|
@sample_rate = sample_rate
|
|
40
|
-
@sampling_id_threshold = sample_rate *
|
|
52
|
+
@sampling_id_threshold = sample_rate * Tracing::Utils::EXTERNAL_MAX_ID
|
|
41
53
|
end
|
|
42
54
|
|
|
43
55
|
def sample?(trace)
|
|
44
|
-
((trace.id * KNUTH_FACTOR) %
|
|
56
|
+
((trace.id * KNUTH_FACTOR) % Tracing::Utils::EXTERNAL_MAX_ID) <= @sampling_id_threshold
|
|
45
57
|
end
|
|
46
58
|
|
|
47
59
|
def sample!(trace)
|
|
48
60
|
sampled = trace.sampled = sample?(trace)
|
|
49
|
-
|
|
50
|
-
sampled
|
|
61
|
+
|
|
62
|
+
return false unless sampled
|
|
63
|
+
|
|
64
|
+
trace.sample_rate = @sample_rate
|
|
65
|
+
trace.set_tag(Tracing::Metadata::Ext::Distributed::TAG_DECISION_MAKER, @decision) if @decision
|
|
66
|
+
|
|
67
|
+
true
|
|
51
68
|
end
|
|
52
69
|
end
|
|
53
70
|
end
|
|
@@ -1,11 +1,9 @@
|
|
|
1
1
|
# typed: true
|
|
2
2
|
|
|
3
|
-
|
|
3
|
+
require_relative '../../core'
|
|
4
4
|
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
require 'datadog/tracing/sampling/matcher'
|
|
8
|
-
require 'datadog/tracing/sampling/rate_sampler'
|
|
5
|
+
require_relative 'matcher'
|
|
6
|
+
require_relative 'rate_sampler'
|
|
9
7
|
|
|
10
8
|
module Datadog
|
|
11
9
|
module Tracing
|
|
@@ -15,8 +13,6 @@ module Datadog
|
|
|
15
13
|
# apply in case of a positive match.
|
|
16
14
|
# @public_api
|
|
17
15
|
class Rule
|
|
18
|
-
extend Forwardable
|
|
19
|
-
|
|
20
16
|
attr_reader :matcher, :sampler
|
|
21
17
|
|
|
22
18
|
# @param [Matcher] matcher A matcher to verify trace conformity against
|
|
@@ -34,11 +30,21 @@ module Datadog
|
|
|
34
30
|
def match?(trace)
|
|
35
31
|
@matcher.match?(trace)
|
|
36
32
|
rescue => e
|
|
37
|
-
Datadog.logger.error(
|
|
33
|
+
Datadog.logger.error(
|
|
34
|
+
"Matcher failed. Cause: #{e.class.name} #{e.message} Source: #{Array(e.backtrace).first}"
|
|
35
|
+
)
|
|
38
36
|
nil
|
|
39
37
|
end
|
|
40
38
|
|
|
41
|
-
|
|
39
|
+
# (see Datadog::Tracing::Sampling::Sampler#sample?)
|
|
40
|
+
def sample?(trace)
|
|
41
|
+
@sampler.sample?(trace)
|
|
42
|
+
end
|
|
43
|
+
|
|
44
|
+
# (see Datadog::Tracing::Sampling::Sampler#sample_rate)
|
|
45
|
+
def sample_rate(trace)
|
|
46
|
+
@sampler.sample_rate(trace)
|
|
47
|
+
end
|
|
42
48
|
end
|
|
43
49
|
|
|
44
50
|
# A {Datadog::Tracing::Sampling::Rule} that matches a trace based on
|
|
@@ -1,12 +1,10 @@
|
|
|
1
1
|
# typed: true
|
|
2
2
|
|
|
3
|
-
|
|
3
|
+
require_relative '../../core'
|
|
4
4
|
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
require 'datadog/tracing/sampling/rate_limiter'
|
|
9
|
-
require 'datadog/tracing/sampling/rule'
|
|
5
|
+
require_relative 'ext'
|
|
6
|
+
require_relative 'rate_limiter'
|
|
7
|
+
require_relative 'rule'
|
|
10
8
|
|
|
11
9
|
module Datadog
|
|
12
10
|
module Tracing
|
|
@@ -18,8 +16,6 @@ module Datadog
|
|
|
18
16
|
# sampling strategy is applied.
|
|
19
17
|
# @public_api
|
|
20
18
|
class RuleSampler
|
|
21
|
-
extend Forwardable
|
|
22
|
-
|
|
23
19
|
attr_reader :rules, :rate_limiter, :default_sampler
|
|
24
20
|
|
|
25
21
|
# @param rules [Array<Rule>] ordered list of rules to be applied to a trace
|
|
@@ -52,7 +48,7 @@ module Datadog
|
|
|
52
48
|
nil
|
|
53
49
|
else
|
|
54
50
|
# TODO: Simplify .tags access, as `Tracer#tags` can't be arbitrarily changed anymore
|
|
55
|
-
RateByServiceSampler.new(1.0, env: -> { Tracing.send(:tracer).tags[
|
|
51
|
+
RateByServiceSampler.new(1.0, env: -> { Tracing.send(:tracer).tags['env'] })
|
|
56
52
|
end
|
|
57
53
|
end
|
|
58
54
|
|
|
@@ -80,10 +76,10 @@ module Datadog
|
|
|
80
76
|
end
|
|
81
77
|
|
|
82
78
|
# @!visibility private
|
|
83
|
-
def update(*args)
|
|
79
|
+
def update(*args, **kwargs)
|
|
84
80
|
return false unless @default_sampler.respond_to?(:update)
|
|
85
81
|
|
|
86
|
-
@default_sampler.update(*args)
|
|
82
|
+
@default_sampler.update(*args, **kwargs)
|
|
87
83
|
end
|
|
88
84
|
|
|
89
85
|
private
|
|
@@ -104,9 +100,12 @@ module Datadog
|
|
|
104
100
|
rate_limiter.allow?(1).tap do |allowed|
|
|
105
101
|
set_priority(trace, allowed)
|
|
106
102
|
set_limiter_metrics(trace, rate_limiter.effective_rate)
|
|
103
|
+
trace.set_tag(Tracing::Metadata::Ext::Distributed::TAG_DECISION_MAKER, Ext::Decision::TRACE_SAMPLING_RULE)
|
|
107
104
|
end
|
|
108
105
|
rescue StandardError => e
|
|
109
|
-
Datadog.logger.error(
|
|
106
|
+
Datadog.logger.error(
|
|
107
|
+
"Rule sampling failed. Cause: #{e.class.name} #{e.message} Source: #{Array(e.backtrace).first}"
|
|
108
|
+
)
|
|
110
109
|
yield(trace)
|
|
111
110
|
end
|
|
112
111
|
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
module Datadog
|
|
4
|
+
module Tracing
|
|
5
|
+
module Sampling
|
|
6
|
+
module Span
|
|
7
|
+
# Single Span Sampling constants.
|
|
8
|
+
module Ext
|
|
9
|
+
# Accept all spans (100% retention).
|
|
10
|
+
DEFAULT_SAMPLE_RATE = 1.0
|
|
11
|
+
# Unlimited.
|
|
12
|
+
# @see Datadog::Tracing::Sampling::TokenBucket
|
|
13
|
+
DEFAULT_MAX_PER_SECOND = -1
|
|
14
|
+
|
|
15
|
+
# Sampling decision method used to come to the sampling decision for this span
|
|
16
|
+
TAG_MECHANISM = '_dd.span_sampling.mechanism'
|
|
17
|
+
# Sampling rate applied to this span, if a rule applies
|
|
18
|
+
TAG_RULE_RATE = '_dd.span_sampling.rule_rate'
|
|
19
|
+
# Rate limit configured for this span, if a rule applies
|
|
20
|
+
TAG_MAX_PER_SECOND = '_dd.span_sampling.max_per_second'
|
|
21
|
+
end
|
|
22
|
+
end
|
|
23
|
+
end
|
|
24
|
+
end
|
|
25
|
+
end
|
|
@@ -0,0 +1,89 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
module Datadog
|
|
4
|
+
module Tracing
|
|
5
|
+
module Sampling
|
|
6
|
+
module Span
|
|
7
|
+
# Checks if a span conforms to a matching criteria.
|
|
8
|
+
class Matcher
|
|
9
|
+
attr_reader :name, :service
|
|
10
|
+
|
|
11
|
+
# Pattern that matches any string
|
|
12
|
+
MATCH_ALL_PATTERN = '*'
|
|
13
|
+
|
|
14
|
+
# Matches span name and service to their respective patterns provided.
|
|
15
|
+
#
|
|
16
|
+
# The patterns are {String}s with two special characters available:
|
|
17
|
+
# 1. `?`: matches exactly one of any character.
|
|
18
|
+
# 2. `*`: matches a substring of any size, including zero.
|
|
19
|
+
# These patterns can occur any point of the string, any number of times.
|
|
20
|
+
#
|
|
21
|
+
# Both {SpanOperation#name} and {SpanOperation#service} must match the provided patterns.
|
|
22
|
+
#
|
|
23
|
+
# The whole String has to match the provided patterns: providing a pattern that
|
|
24
|
+
# matches a portion of the provided String is not considered a match.
|
|
25
|
+
#
|
|
26
|
+
# @example web-*
|
|
27
|
+
# `'web-*'` will match any string starting with `web-`.
|
|
28
|
+
# @example cache-?
|
|
29
|
+
# `'cache-?'` will match any string starting with `database-` followed by exactly one character.
|
|
30
|
+
#
|
|
31
|
+
# @param name_pattern [String] a pattern to be matched against {SpanOperation#name}
|
|
32
|
+
# @param service_pattern [String] a pattern to be matched against {SpanOperation#service}
|
|
33
|
+
def initialize(name_pattern: MATCH_ALL_PATTERN, service_pattern: MATCH_ALL_PATTERN)
|
|
34
|
+
@name = pattern_to_regex(name_pattern)
|
|
35
|
+
@service = pattern_to_regex(service_pattern)
|
|
36
|
+
end
|
|
37
|
+
|
|
38
|
+
# {Regexp#match?} was added in Ruby 2.4, and it's measurably
|
|
39
|
+
# the least costly way to get a boolean result for a Regexp match.
|
|
40
|
+
# @see https://www.ruby-lang.org/en/news/2016/12/25/ruby-2-4-0-released/
|
|
41
|
+
if Regexp.method_defined?(:match?)
|
|
42
|
+
# Returns `true` if the span conforms to the configured patterns,
|
|
43
|
+
# `false` otherwise
|
|
44
|
+
#
|
|
45
|
+
# @param [SpanOperation] span
|
|
46
|
+
# @return [Boolean]
|
|
47
|
+
def match?(span)
|
|
48
|
+
# Matching is performed at the end of the lifecycle of a Span,
|
|
49
|
+
# thus both `name` and `service` are guaranteed to be not `nil`.
|
|
50
|
+
@name.match?(span.name) && @service.match?(span.service)
|
|
51
|
+
end
|
|
52
|
+
else
|
|
53
|
+
# DEV: Remove when support for Ruby 2.3 and older is removed.
|
|
54
|
+
def match?(span)
|
|
55
|
+
@name === span.name && @service === span.service
|
|
56
|
+
end
|
|
57
|
+
end
|
|
58
|
+
|
|
59
|
+
def ==(other)
|
|
60
|
+
return super unless other.is_a?(Matcher)
|
|
61
|
+
|
|
62
|
+
name == other.name &&
|
|
63
|
+
service == other.service
|
|
64
|
+
end
|
|
65
|
+
|
|
66
|
+
private
|
|
67
|
+
|
|
68
|
+
# @param pattern [String]
|
|
69
|
+
# @return [Regexp]
|
|
70
|
+
def pattern_to_regex(pattern)
|
|
71
|
+
# Ensure no undesired characters are treated as regex.
|
|
72
|
+
# Our valid special characters, `?` and `*`,
|
|
73
|
+
# will be escaped so...
|
|
74
|
+
pattern = Regexp.quote(pattern)
|
|
75
|
+
|
|
76
|
+
# ...we account for that here:
|
|
77
|
+
pattern.gsub!('\?', '.') # Any single character
|
|
78
|
+
pattern.gsub!('\*', '.*') # Any substring
|
|
79
|
+
|
|
80
|
+
# Patterns have to match the whole input string
|
|
81
|
+
pattern = "\\A#{pattern}\\z"
|
|
82
|
+
|
|
83
|
+
Regexp.new(pattern)
|
|
84
|
+
end
|
|
85
|
+
end
|
|
86
|
+
end
|
|
87
|
+
end
|
|
88
|
+
end
|
|
89
|
+
end
|
|
@@ -0,0 +1,82 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
require_relative 'ext'
|
|
4
|
+
|
|
5
|
+
module Datadog
|
|
6
|
+
module Tracing
|
|
7
|
+
module Sampling
|
|
8
|
+
module Span
|
|
9
|
+
# Span sampling rule that applies a sampling rate if the span
|
|
10
|
+
# matches the provided {Matcher}.
|
|
11
|
+
# Additionally, a rate limiter is also applied.
|
|
12
|
+
#
|
|
13
|
+
# If a span does not conform to the matcher, no changes are made.
|
|
14
|
+
class Rule
|
|
15
|
+
attr_reader :matcher, :sample_rate, :rate_limit
|
|
16
|
+
|
|
17
|
+
# Creates a new span sampling rule.
|
|
18
|
+
#
|
|
19
|
+
# @param [Sampling::Span::Matcher] matcher whether this rule applies to a specific span
|
|
20
|
+
# @param [Float] sample_rate span sampling ratio, between 0.0 (0%) and 1.0 (100%).
|
|
21
|
+
# @param [Numeric] rate_limit maximum number of spans sampled per second. Negative numbers mean unlimited spans.
|
|
22
|
+
def initialize(
|
|
23
|
+
matcher,
|
|
24
|
+
sample_rate: Span::Ext::DEFAULT_SAMPLE_RATE,
|
|
25
|
+
rate_limit: Span::Ext::DEFAULT_MAX_PER_SECOND
|
|
26
|
+
)
|
|
27
|
+
|
|
28
|
+
@matcher = matcher
|
|
29
|
+
@sample_rate = sample_rate
|
|
30
|
+
@rate_limit = rate_limit
|
|
31
|
+
|
|
32
|
+
@sampler = Sampling::RateSampler.new
|
|
33
|
+
# Set the sample_rate outside of the initializer to allow for
|
|
34
|
+
# zero to be a "drop all".
|
|
35
|
+
# The RateSampler initializer enforces non-zero, falling back to 100% sampling
|
|
36
|
+
# if zero is provided.
|
|
37
|
+
@sampler.sample_rate = sample_rate
|
|
38
|
+
@rate_limiter = Sampling::TokenBucket.new(rate_limit)
|
|
39
|
+
end
|
|
40
|
+
|
|
41
|
+
# This method should only be invoked for spans that are part
|
|
42
|
+
# of a trace that has been dropped by trace-level sampling.
|
|
43
|
+
# Invoking it for other spans will cause incorrect sampling
|
|
44
|
+
# metrics to be reported by the Datadog App.
|
|
45
|
+
#
|
|
46
|
+
# Returns `true` if the provided span is sampled.
|
|
47
|
+
# If the span is dropped due to sampling rate or rate limiting,
|
|
48
|
+
# it returns `false`.
|
|
49
|
+
#
|
|
50
|
+
# Returns `nil` if the span did not meet the matching criteria by the
|
|
51
|
+
# provided matcher.
|
|
52
|
+
#
|
|
53
|
+
# This method modifies the `span` if it matches the provided matcher.
|
|
54
|
+
#
|
|
55
|
+
# @param [Datadog::Tracing::SpanOperation] span_op span to be sampled
|
|
56
|
+
# @return [:kept,:rejected] should this span be sampled?
|
|
57
|
+
# @return [:not_matched] span did not satisfy the matcher, no changes are made to the span
|
|
58
|
+
def sample!(span_op)
|
|
59
|
+
return :not_matched unless @matcher.match?(span_op)
|
|
60
|
+
|
|
61
|
+
if @sampler.sample?(span_op) && @rate_limiter.allow?(1)
|
|
62
|
+
span_op.set_metric(Span::Ext::TAG_MECHANISM, Sampling::Ext::Mechanism::SPAN_SAMPLING_RATE)
|
|
63
|
+
span_op.set_metric(Span::Ext::TAG_RULE_RATE, @sample_rate)
|
|
64
|
+
span_op.set_metric(Span::Ext::TAG_MAX_PER_SECOND, @rate_limit)
|
|
65
|
+
:kept
|
|
66
|
+
else
|
|
67
|
+
:rejected
|
|
68
|
+
end
|
|
69
|
+
end
|
|
70
|
+
|
|
71
|
+
def ==(other)
|
|
72
|
+
return super unless other.is_a?(Rule)
|
|
73
|
+
|
|
74
|
+
matcher == other.matcher &&
|
|
75
|
+
sample_rate == other.sample_rate &&
|
|
76
|
+
rate_limit == other.rate_limit
|
|
77
|
+
end
|
|
78
|
+
end
|
|
79
|
+
end
|
|
80
|
+
end
|
|
81
|
+
end
|
|
82
|
+
end
|
|
@@ -0,0 +1,104 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
require 'json'
|
|
4
|
+
|
|
5
|
+
require_relative 'ext'
|
|
6
|
+
require_relative 'matcher'
|
|
7
|
+
require_relative 'rule'
|
|
8
|
+
|
|
9
|
+
module Datadog
|
|
10
|
+
module Tracing
|
|
11
|
+
module Sampling
|
|
12
|
+
module Span
|
|
13
|
+
# Converts user configuration into {Datadog::Tracing::Sampling::Span::Rule} objects,
|
|
14
|
+
# handling any parsing errors.
|
|
15
|
+
module RuleParser
|
|
16
|
+
class << self
|
|
17
|
+
# Parses the provided JSON string containing the Single Span
|
|
18
|
+
# Sampling configuration list.
|
|
19
|
+
# In case of parsing errors, `nil` is returned.
|
|
20
|
+
#
|
|
21
|
+
# @param rules [String] the JSON configuration rules to be parsed
|
|
22
|
+
# @return [Array<Datadog::Tracing::Sampling::Span::Rule>] a list of parsed rules
|
|
23
|
+
# @return [nil] if parsing failed
|
|
24
|
+
def parse_json(rules)
|
|
25
|
+
return nil unless rules
|
|
26
|
+
|
|
27
|
+
begin
|
|
28
|
+
list = JSON.parse(rules)
|
|
29
|
+
rescue => e
|
|
30
|
+
Datadog.logger.warn(
|
|
31
|
+
"Error parsing Span Sampling Rules `#{rules.inspect}`: "\
|
|
32
|
+
"#{e.class.name} #{e.message} at #{Array(e.backtrace).first}"
|
|
33
|
+
)
|
|
34
|
+
return nil
|
|
35
|
+
end
|
|
36
|
+
|
|
37
|
+
parse_list(list)
|
|
38
|
+
end
|
|
39
|
+
|
|
40
|
+
# Parses a list of Hashes containing the parsed JSON information
|
|
41
|
+
# for Single Span Sampling configuration.
|
|
42
|
+
# In case of parsing errors, `nil` is returned.
|
|
43
|
+
#
|
|
44
|
+
# @param rules [Array<String] the JSON configuration rules to be parsed
|
|
45
|
+
# @return [Array<Datadog::Tracing::Sampling::Span::Rule>] a list of parsed rules
|
|
46
|
+
# @return [nil] if parsing failed
|
|
47
|
+
def parse_list(rules)
|
|
48
|
+
unless rules.is_a?(Array)
|
|
49
|
+
Datadog.logger.warn("Span Sampling Rules are not an array: #{rules.inspect}")
|
|
50
|
+
return nil
|
|
51
|
+
end
|
|
52
|
+
|
|
53
|
+
parsed = rules.map do |hash|
|
|
54
|
+
unless hash.is_a?(Hash)
|
|
55
|
+
Datadog.logger.warn("Span Sampling Rule is not a key-value object: #{hash.inspect}")
|
|
56
|
+
return nil
|
|
57
|
+
end
|
|
58
|
+
|
|
59
|
+
begin
|
|
60
|
+
parse_rule(hash)
|
|
61
|
+
rescue => e
|
|
62
|
+
Datadog.logger.warn(
|
|
63
|
+
"Cannot parse Span Sampling Rule #{hash.inspect}: " \
|
|
64
|
+
"#{e.class.name} #{e} at #{Array(e.backtrace).first}"
|
|
65
|
+
)
|
|
66
|
+
return nil
|
|
67
|
+
end
|
|
68
|
+
end
|
|
69
|
+
|
|
70
|
+
parsed.compact!
|
|
71
|
+
parsed
|
|
72
|
+
end
|
|
73
|
+
|
|
74
|
+
private
|
|
75
|
+
|
|
76
|
+
def parse_rule(hash)
|
|
77
|
+
matcher_options = {}
|
|
78
|
+
if (name_pattern = hash['name'])
|
|
79
|
+
matcher_options[:name_pattern] = name_pattern
|
|
80
|
+
end
|
|
81
|
+
|
|
82
|
+
if (service_pattern = hash['service'])
|
|
83
|
+
matcher_options[:service_pattern] = service_pattern
|
|
84
|
+
end
|
|
85
|
+
|
|
86
|
+
matcher = Matcher.new(**matcher_options)
|
|
87
|
+
|
|
88
|
+
rule_options = {}
|
|
89
|
+
if (sample_rate = hash['sample_rate'])
|
|
90
|
+
rule_options[:sample_rate] = sample_rate
|
|
91
|
+
end
|
|
92
|
+
|
|
93
|
+
if (max_per_second = hash['max_per_second'])
|
|
94
|
+
rule_options[:rate_limit] = max_per_second
|
|
95
|
+
end
|
|
96
|
+
|
|
97
|
+
Rule.new(matcher, **rule_options)
|
|
98
|
+
end
|
|
99
|
+
end
|
|
100
|
+
end
|
|
101
|
+
end
|
|
102
|
+
end
|
|
103
|
+
end
|
|
104
|
+
end
|