ddtrace 1.0.0.beta1 → 1.1.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/.gitignore +4 -16
- data/CHANGELOG.md +156 -2
- data/LICENSE-3rdparty.csv +3 -2
- data/README.md +2 -2
- data/ddtrace.gemspec +12 -3
- data/docs/GettingStarted.md +231 -146
- data/docs/ProfilingDevelopment.md +8 -8
- data/docs/UpgradeGuide.md +384 -205
- data/ext/ddtrace_profiling_loader/ddtrace_profiling_loader.c +118 -0
- data/ext/ddtrace_profiling_loader/extconf.rb +53 -0
- data/ext/ddtrace_profiling_native_extension/NativeExtensionDesign.md +31 -5
- data/ext/ddtrace_profiling_native_extension/clock_id_from_pthread.c +0 -8
- data/ext/ddtrace_profiling_native_extension/collectors_stack.c +278 -0
- data/ext/ddtrace_profiling_native_extension/extconf.rb +79 -100
- data/ext/ddtrace_profiling_native_extension/libddprof_helpers.h +13 -0
- data/ext/ddtrace_profiling_native_extension/native_extension_helpers.rb +186 -0
- data/ext/ddtrace_profiling_native_extension/private_vm_api_access.c +579 -7
- data/ext/ddtrace_profiling_native_extension/private_vm_api_access.h +30 -0
- data/ext/ddtrace_profiling_native_extension/profiling.c +10 -1
- data/ext/ddtrace_profiling_native_extension/stack_recorder.c +139 -0
- data/ext/ddtrace_profiling_native_extension/stack_recorder.h +28 -0
- data/lib/datadog/appsec/assets/waf_rules/recommended.json +248 -318
- data/lib/datadog/appsec/assets/waf_rules/risky.json +78 -18
- data/lib/datadog/appsec/assets/waf_rules/strict.json +4 -67
- data/lib/datadog/appsec/assets.rb +2 -0
- data/lib/datadog/appsec/autoload.rb +2 -2
- data/lib/datadog/appsec/configuration/settings.rb +22 -1
- data/lib/datadog/appsec/configuration.rb +10 -0
- data/lib/datadog/appsec/contrib/auto_instrument.rb +2 -0
- data/lib/datadog/appsec/contrib/configuration/settings.rb +2 -0
- data/lib/datadog/appsec/contrib/integration.rb +2 -0
- data/lib/datadog/appsec/contrib/patcher.rb +2 -0
- data/lib/datadog/appsec/contrib/rack/configuration/settings.rb +2 -0
- data/lib/datadog/appsec/contrib/rack/ext.rb +2 -0
- data/lib/datadog/appsec/contrib/rack/gateway/watcher.rb +78 -37
- data/lib/datadog/appsec/contrib/rack/integration.rb +1 -0
- data/lib/datadog/appsec/contrib/rack/patcher.rb +0 -1
- data/lib/datadog/appsec/contrib/rack/reactive/request.rb +4 -2
- data/lib/datadog/appsec/contrib/rack/reactive/request_body.rb +64 -0
- data/lib/datadog/appsec/contrib/rack/reactive/response.rb +4 -2
- data/lib/datadog/appsec/contrib/rack/request.rb +16 -1
- data/lib/datadog/appsec/contrib/rack/request_body_middleware.rb +41 -0
- data/lib/datadog/appsec/contrib/rack/request_middleware.rb +60 -46
- data/lib/datadog/appsec/contrib/rack/response.rb +2 -0
- data/lib/datadog/appsec/contrib/rails/configuration/settings.rb +2 -0
- data/lib/datadog/appsec/contrib/rails/ext.rb +2 -0
- data/lib/datadog/appsec/contrib/rails/framework.rb +2 -0
- data/lib/datadog/appsec/contrib/rails/gateway/watcher.rb +81 -0
- data/lib/datadog/appsec/contrib/rails/patcher.rb +35 -2
- data/lib/datadog/appsec/contrib/rails/reactive/action.rb +68 -0
- data/lib/datadog/appsec/contrib/rails/request.rb +33 -0
- data/lib/datadog/appsec/contrib/rails/request_middleware.rb +2 -0
- data/lib/datadog/appsec/contrib/sinatra/configuration/settings.rb +2 -0
- data/lib/datadog/appsec/contrib/sinatra/ext.rb +2 -0
- data/lib/datadog/appsec/contrib/sinatra/framework.rb +2 -0
- data/lib/datadog/appsec/contrib/sinatra/gateway/watcher.rb +124 -0
- data/lib/datadog/appsec/contrib/sinatra/patcher.rb +69 -2
- data/lib/datadog/appsec/contrib/sinatra/reactive/routed.rb +63 -0
- data/lib/datadog/appsec/contrib/sinatra/request_middleware.rb +2 -0
- data/lib/datadog/appsec/event.rb +44 -34
- data/lib/datadog/appsec/extensions.rb +2 -4
- data/lib/datadog/appsec/instrumentation/gateway.rb +2 -0
- data/lib/datadog/appsec/processor.rb +164 -0
- data/lib/datadog/appsec/rate_limiter.rb +7 -0
- data/lib/datadog/appsec/reactive/address_hash.rb +2 -0
- data/lib/datadog/appsec/reactive/engine.rb +2 -0
- data/lib/datadog/appsec/reactive/operation.rb +2 -1
- data/lib/datadog/appsec/reactive/subscriber.rb +2 -0
- data/lib/datadog/appsec.rb +2 -0
- data/lib/datadog/ci/configuration/components.rb +1 -0
- data/lib/datadog/ci/configuration/settings.rb +9 -2
- data/lib/datadog/ci/contrib/cucumber/configuration/settings.rb +1 -0
- data/lib/datadog/ci/contrib/cucumber/ext.rb +1 -0
- data/lib/datadog/ci/contrib/cucumber/formatter.rb +2 -1
- data/lib/datadog/ci/contrib/cucumber/instrumentation.rb +1 -0
- data/lib/datadog/ci/contrib/cucumber/integration.rb +1 -0
- data/lib/datadog/ci/contrib/cucumber/patcher.rb +1 -0
- data/lib/datadog/ci/contrib/rspec/configuration/settings.rb +1 -0
- data/lib/datadog/ci/contrib/rspec/example.rb +3 -2
- data/lib/datadog/ci/contrib/rspec/ext.rb +1 -0
- data/lib/datadog/ci/contrib/rspec/integration.rb +1 -0
- data/lib/datadog/ci/contrib/rspec/patcher.rb +1 -0
- data/lib/datadog/ci/ext/app_types.rb +1 -0
- data/lib/datadog/ci/ext/environment.rb +23 -8
- data/lib/datadog/ci/ext/settings.rb +1 -0
- data/lib/datadog/ci/ext/test.rb +1 -0
- data/lib/datadog/ci/extensions.rb +1 -0
- data/lib/datadog/ci/flush.rb +1 -0
- data/lib/datadog/ci/test.rb +2 -1
- data/lib/datadog/ci.rb +3 -1
- data/lib/datadog/core/buffer/cruby.rb +1 -0
- data/lib/datadog/core/buffer/thread_safe.rb +1 -0
- data/lib/datadog/core/configuration/agent_settings_resolver.rb +109 -40
- data/lib/datadog/core/configuration/base.rb +1 -0
- data/lib/datadog/core/configuration/components.rb +23 -4
- data/lib/datadog/core/configuration/dependency_resolver.rb +1 -0
- data/lib/datadog/core/configuration/option.rb +1 -0
- data/lib/datadog/core/configuration/option_definition.rb +1 -0
- data/lib/datadog/core/configuration/option_definition_set.rb +1 -0
- data/lib/datadog/core/configuration/option_set.rb +1 -0
- data/lib/datadog/core/configuration/options.rb +1 -0
- data/lib/datadog/core/configuration/settings.rb +4 -12
- data/lib/datadog/core/configuration.rb +8 -5
- data/lib/datadog/core/diagnostics/environment_logger.rb +2 -1
- data/lib/datadog/core/diagnostics/ext.rb +1 -0
- data/lib/datadog/core/diagnostics/health.rb +2 -1
- data/lib/datadog/core/encoding.rb +1 -0
- data/lib/datadog/core/environment/cgroup.rb +4 -1
- data/lib/datadog/core/environment/class_count.rb +1 -0
- data/lib/datadog/core/environment/container.rb +3 -1
- data/lib/datadog/core/environment/ext.rb +1 -0
- data/lib/datadog/core/environment/gc.rb +1 -0
- data/lib/datadog/core/environment/identity.rb +1 -0
- data/lib/datadog/core/environment/socket.rb +1 -0
- data/lib/datadog/core/environment/thread_count.rb +1 -0
- data/lib/datadog/core/environment/variable_helpers.rb +27 -2
- data/lib/datadog/core/environment/vm_cache.rb +1 -0
- data/lib/datadog/core/error.rb +2 -1
- data/lib/datadog/core/extensions.rb +2 -1
- data/lib/datadog/core/git/ext.rb +1 -0
- data/lib/datadog/core/logger.rb +1 -0
- data/lib/datadog/core/logging/ext.rb +11 -0
- data/lib/datadog/core/metrics/client.rb +16 -5
- data/lib/datadog/core/metrics/ext.rb +1 -0
- data/lib/datadog/core/metrics/helpers.rb +2 -0
- data/lib/datadog/core/metrics/logging.rb +2 -0
- data/lib/datadog/core/metrics/metric.rb +2 -0
- data/lib/datadog/core/metrics/options.rb +2 -0
- data/lib/datadog/core/pin.rb +1 -1
- data/lib/datadog/core/runtime/metrics.rb +2 -1
- data/lib/datadog/core/utils/compression.rb +1 -0
- data/lib/datadog/core/utils/forking.rb +1 -0
- data/lib/datadog/core/utils/object_set.rb +1 -0
- data/lib/datadog/core/utils/only_once.rb +2 -1
- data/lib/datadog/core/utils/safe_dup.rb +27 -0
- data/lib/datadog/core/utils/sequence.rb +1 -0
- data/lib/datadog/core/utils/string_table.rb +1 -0
- data/lib/datadog/core/utils/time.rb +1 -0
- data/lib/datadog/core/utils.rb +1 -0
- data/lib/datadog/core/vendor/multipart-post/multipart/post/composite_read_io.rb +1 -0
- data/lib/datadog/core/vendor/multipart-post/multipart/post/multipartable.rb +1 -0
- data/lib/datadog/core/vendor/multipart-post/multipart/post/parts.rb +1 -0
- data/lib/datadog/core/vendor/multipart-post/multipart/post/version.rb +1 -0
- data/lib/datadog/core/vendor/multipart-post/multipart/post.rb +1 -0
- data/lib/datadog/core/vendor/multipart-post/multipart.rb +1 -0
- data/lib/datadog/core/vendor/multipart-post/net/http/post/multipart.rb +1 -0
- data/lib/datadog/core/worker.rb +1 -0
- data/lib/datadog/core/workers/async.rb +4 -1
- data/lib/datadog/core/workers/interval_loop.rb +1 -0
- data/lib/datadog/core/workers/polling.rb +1 -0
- data/lib/datadog/core/workers/queue.rb +1 -0
- data/lib/datadog/core/workers/runtime_metrics.rb +0 -2
- data/lib/datadog/core.rb +7 -0
- data/lib/datadog/kit/enable_core_dumps.rb +50 -0
- data/lib/datadog/kit/identity.rb +63 -0
- data/lib/datadog/kit.rb +11 -0
- data/lib/datadog/opentracer/binary_propagator.rb +1 -0
- data/lib/datadog/opentracer/carrier.rb +1 -0
- data/lib/datadog/opentracer/distributed_headers.rb +1 -0
- data/lib/datadog/opentracer/global_tracer.rb +1 -0
- data/lib/datadog/opentracer/propagator.rb +1 -0
- data/lib/datadog/opentracer/rack_propagator.rb +1 -0
- data/lib/datadog/opentracer/scope.rb +1 -0
- data/lib/datadog/opentracer/scope_manager.rb +1 -0
- data/lib/datadog/opentracer/span.rb +1 -0
- data/lib/datadog/opentracer/span_context.rb +1 -0
- data/lib/datadog/opentracer/span_context_factory.rb +1 -0
- data/lib/datadog/opentracer/text_map_propagator.rb +1 -0
- data/lib/datadog/opentracer/thread_local_scope.rb +1 -0
- data/lib/datadog/opentracer/thread_local_scope_manager.rb +1 -0
- data/lib/datadog/opentracer/tracer.rb +1 -2
- data/lib/datadog/opentracer.rb +1 -0
- data/lib/datadog/profiling/backtrace_location.rb +1 -0
- data/lib/datadog/profiling/buffer.rb +1 -0
- data/lib/datadog/profiling/collectors/code_provenance.rb +2 -1
- data/lib/datadog/profiling/collectors/old_stack.rb +298 -0
- data/lib/datadog/profiling/collectors/stack.rb +5 -286
- data/lib/datadog/profiling/encoding/profile.rb +1 -1
- data/lib/datadog/profiling/event.rb +1 -0
- data/lib/datadog/profiling/events/stack.rb +1 -0
- data/lib/datadog/profiling/exporter.rb +1 -0
- data/lib/datadog/profiling/ext/forking.rb +1 -0
- data/lib/datadog/profiling/ext.rb +4 -3
- data/lib/datadog/profiling/flush.rb +2 -1
- data/lib/datadog/profiling/load_native_extension.rb +22 -0
- data/lib/datadog/profiling/native_extension.rb +1 -0
- data/lib/datadog/profiling/pprof/builder.rb +2 -1
- data/lib/datadog/profiling/pprof/converter.rb +1 -0
- data/lib/datadog/profiling/pprof/message_set.rb +1 -0
- data/lib/datadog/profiling/pprof/payload.rb +1 -0
- data/lib/datadog/profiling/pprof/pprof_pb.rb +1 -0
- data/lib/datadog/profiling/pprof/stack_sample.rb +1 -0
- data/lib/datadog/profiling/pprof/string_table.rb +1 -0
- data/lib/datadog/profiling/pprof/template.rb +1 -0
- data/lib/datadog/profiling/preload.rb +1 -0
- data/lib/datadog/profiling/profiler.rb +1 -0
- data/lib/datadog/profiling/recorder.rb +2 -1
- data/lib/datadog/profiling/scheduler.rb +3 -2
- data/lib/datadog/profiling/stack_recorder.rb +33 -0
- data/lib/datadog/profiling/tag_builder.rb +48 -0
- data/lib/datadog/profiling/tasks/exec.rb +3 -2
- data/lib/datadog/profiling/tasks/help.rb +1 -0
- data/lib/datadog/profiling/tasks/setup.rb +7 -4
- data/lib/datadog/profiling/trace_identifiers/ddtrace.rb +2 -1
- data/lib/datadog/profiling/trace_identifiers/helper.rb +2 -1
- data/lib/datadog/profiling/transport/client.rb +1 -0
- data/lib/datadog/profiling/transport/http/api/endpoint.rb +1 -0
- data/lib/datadog/profiling/transport/http/api/instance.rb +1 -0
- data/lib/datadog/profiling/transport/http/api/spec.rb +1 -0
- data/lib/datadog/profiling/transport/http/api.rb +1 -0
- data/lib/datadog/profiling/transport/http/builder.rb +1 -0
- data/lib/datadog/profiling/transport/http/client.rb +1 -0
- data/lib/datadog/profiling/transport/http/response.rb +1 -0
- data/lib/datadog/profiling/transport/http.rb +1 -0
- data/lib/datadog/profiling/transport/io/client.rb +1 -0
- data/lib/datadog/profiling/transport/io/response.rb +1 -0
- data/lib/datadog/profiling/transport/io.rb +1 -0
- data/lib/datadog/profiling/transport/parcel.rb +1 -0
- data/lib/datadog/profiling/transport/request.rb +1 -0
- data/lib/datadog/profiling/transport/response.rb +1 -0
- data/lib/datadog/profiling.rb +30 -27
- data/lib/datadog/tracing/analytics.rb +1 -0
- data/lib/datadog/tracing/buffer.rb +10 -3
- data/lib/datadog/tracing/configuration/ext.rb +1 -0
- data/lib/datadog/tracing/context.rb +1 -0
- data/lib/datadog/tracing/context_provider.rb +18 -19
- data/lib/datadog/tracing/contrib/action_cable/configuration/settings.rb +1 -0
- data/lib/datadog/tracing/contrib/action_cable/event.rb +2 -1
- data/lib/datadog/tracing/contrib/action_cable/events/broadcast.rb +1 -0
- data/lib/datadog/tracing/contrib/action_cable/events/perform_action.rb +1 -0
- data/lib/datadog/tracing/contrib/action_cable/events/transmit.rb +1 -0
- data/lib/datadog/tracing/contrib/action_cable/events.rb +1 -0
- data/lib/datadog/tracing/contrib/action_cable/ext.rb +1 -0
- data/lib/datadog/tracing/contrib/action_cable/instrumentation.rb +1 -1
- data/lib/datadog/tracing/contrib/action_cable/integration.rb +1 -0
- data/lib/datadog/tracing/contrib/action_cable/patcher.rb +1 -0
- data/lib/datadog/tracing/contrib/action_mailer/configuration/settings.rb +1 -0
- data/lib/datadog/tracing/contrib/action_mailer/event.rb +2 -1
- data/lib/datadog/tracing/contrib/action_mailer/events/deliver.rb +1 -0
- data/lib/datadog/tracing/contrib/action_mailer/events/process.rb +1 -0
- data/lib/datadog/tracing/contrib/action_mailer/events.rb +1 -0
- data/lib/datadog/tracing/contrib/action_mailer/ext.rb +1 -0
- data/lib/datadog/tracing/contrib/action_mailer/integration.rb +1 -0
- data/lib/datadog/tracing/contrib/action_mailer/patcher.rb +1 -0
- data/lib/datadog/tracing/contrib/action_pack/action_controller/instrumentation.rb +3 -2
- data/lib/datadog/tracing/contrib/action_pack/action_controller/patcher.rb +1 -0
- data/lib/datadog/tracing/contrib/action_pack/configuration/settings.rb +1 -0
- data/lib/datadog/tracing/contrib/action_pack/ext.rb +1 -0
- data/lib/datadog/tracing/contrib/action_pack/integration.rb +1 -0
- data/lib/datadog/tracing/contrib/action_pack/patcher.rb +1 -0
- data/lib/datadog/tracing/contrib/action_pack/utils.rb +2 -1
- data/lib/datadog/tracing/contrib/action_view/configuration/settings.rb +1 -0
- data/lib/datadog/tracing/contrib/action_view/event.rb +2 -1
- data/lib/datadog/tracing/contrib/action_view/events/render_partial.rb +1 -0
- data/lib/datadog/tracing/contrib/action_view/events/render_template.rb +1 -0
- data/lib/datadog/tracing/contrib/action_view/events.rb +1 -0
- data/lib/datadog/tracing/contrib/action_view/ext.rb +1 -0
- data/lib/datadog/tracing/contrib/action_view/instrumentation/partial_renderer.rb +1 -0
- data/lib/datadog/tracing/contrib/action_view/instrumentation/template_renderer.rb +1 -0
- data/lib/datadog/tracing/contrib/action_view/integration.rb +1 -0
- data/lib/datadog/tracing/contrib/action_view/patcher.rb +1 -1
- data/lib/datadog/tracing/contrib/action_view/utils.rb +2 -1
- data/lib/datadog/tracing/contrib/active_job/configuration/settings.rb +1 -0
- data/lib/datadog/tracing/contrib/active_job/event.rb +2 -1
- data/lib/datadog/tracing/contrib/active_job/events/discard.rb +1 -0
- data/lib/datadog/tracing/contrib/active_job/events/enqueue.rb +1 -0
- data/lib/datadog/tracing/contrib/active_job/events/enqueue_at.rb +1 -0
- data/lib/datadog/tracing/contrib/active_job/events/enqueue_retry.rb +1 -0
- data/lib/datadog/tracing/contrib/active_job/events/perform.rb +1 -0
- data/lib/datadog/tracing/contrib/active_job/events/retry_stopped.rb +1 -0
- data/lib/datadog/tracing/contrib/active_job/events.rb +1 -0
- data/lib/datadog/tracing/contrib/active_job/ext.rb +1 -0
- data/lib/datadog/tracing/contrib/active_job/integration.rb +1 -0
- data/lib/datadog/tracing/contrib/active_job/log_injection.rb +1 -0
- data/lib/datadog/tracing/contrib/active_job/patcher.rb +1 -0
- data/lib/datadog/tracing/contrib/active_model_serializers/configuration/settings.rb +1 -0
- data/lib/datadog/tracing/contrib/active_model_serializers/event.rb +2 -1
- data/lib/datadog/tracing/contrib/active_model_serializers/events/render.rb +1 -0
- data/lib/datadog/tracing/contrib/active_model_serializers/events/serialize.rb +1 -0
- data/lib/datadog/tracing/contrib/active_model_serializers/events.rb +1 -0
- data/lib/datadog/tracing/contrib/active_model_serializers/ext.rb +1 -0
- data/lib/datadog/tracing/contrib/active_model_serializers/integration.rb +1 -0
- data/lib/datadog/tracing/contrib/active_model_serializers/patcher.rb +2 -1
- data/lib/datadog/tracing/contrib/active_record/configuration/makara_resolver.rb +1 -0
- data/lib/datadog/tracing/contrib/active_record/configuration/resolver.rb +3 -2
- data/lib/datadog/tracing/contrib/active_record/configuration/settings.rb +1 -0
- data/lib/datadog/tracing/contrib/active_record/event.rb +2 -1
- data/lib/datadog/tracing/contrib/active_record/events/instantiation.rb +1 -0
- data/lib/datadog/tracing/contrib/active_record/events/sql.rb +2 -1
- data/lib/datadog/tracing/contrib/active_record/events.rb +1 -0
- data/lib/datadog/tracing/contrib/active_record/ext.rb +1 -0
- data/lib/datadog/tracing/contrib/active_record/integration.rb +1 -0
- data/lib/datadog/tracing/contrib/active_record/patcher.rb +1 -0
- data/lib/datadog/tracing/contrib/active_record/utils.rb +2 -1
- data/lib/datadog/tracing/contrib/active_record/vendor/connection_specification.rb +2 -1
- data/lib/datadog/tracing/contrib/active_support/cache/instrumentation.rb +2 -1
- data/lib/datadog/tracing/contrib/active_support/cache/patcher.rb +1 -0
- data/lib/datadog/tracing/contrib/active_support/cache/redis.rb +1 -0
- data/lib/datadog/tracing/contrib/active_support/configuration/settings.rb +1 -0
- data/lib/datadog/tracing/contrib/active_support/ext.rb +1 -0
- data/lib/datadog/tracing/contrib/active_support/integration.rb +1 -0
- data/lib/datadog/tracing/contrib/active_support/notifications/event.rb +1 -0
- data/lib/datadog/tracing/contrib/active_support/notifications/subscriber.rb +1 -0
- data/lib/datadog/tracing/contrib/active_support/notifications/subscription.rb +5 -2
- data/lib/datadog/tracing/contrib/active_support/patcher.rb +1 -0
- data/lib/datadog/tracing/contrib/analytics.rb +1 -0
- data/lib/datadog/tracing/contrib/auto_instrument.rb +23 -20
- data/lib/datadog/tracing/contrib/aws/configuration/settings.rb +1 -0
- data/lib/datadog/tracing/contrib/aws/ext.rb +1 -0
- data/lib/datadog/tracing/contrib/aws/instrumentation.rb +3 -1
- data/lib/datadog/tracing/contrib/aws/integration.rb +1 -0
- data/lib/datadog/tracing/contrib/aws/parsed_context.rb +1 -0
- data/lib/datadog/tracing/contrib/aws/patcher.rb +2 -1
- data/lib/datadog/tracing/contrib/aws/services.rb +1 -0
- data/lib/datadog/tracing/contrib/concurrent_ruby/configuration/settings.rb +1 -0
- data/lib/datadog/tracing/contrib/concurrent_ruby/context_composite_executor_service.rb +12 -4
- data/lib/datadog/tracing/contrib/concurrent_ruby/ext.rb +1 -0
- data/lib/datadog/tracing/contrib/concurrent_ruby/future_patch.rb +1 -0
- data/lib/datadog/tracing/contrib/concurrent_ruby/integration.rb +1 -0
- data/lib/datadog/tracing/contrib/concurrent_ruby/patcher.rb +1 -0
- data/lib/datadog/tracing/contrib/configurable.rb +1 -0
- data/lib/datadog/tracing/contrib/configuration/resolver.rb +1 -0
- data/lib/datadog/tracing/contrib/configuration/resolvers/pattern_resolver.rb +1 -0
- data/lib/datadog/tracing/contrib/configuration/settings.rb +1 -0
- data/lib/datadog/tracing/contrib/dalli/configuration/settings.rb +1 -0
- data/lib/datadog/tracing/contrib/dalli/ext.rb +1 -0
- data/lib/datadog/tracing/contrib/dalli/instrumentation.rb +2 -1
- data/lib/datadog/tracing/contrib/dalli/integration.rb +1 -0
- data/lib/datadog/tracing/contrib/dalli/patcher.rb +1 -1
- data/lib/datadog/tracing/contrib/dalli/quantize.rb +1 -0
- data/lib/datadog/tracing/contrib/delayed_job/configuration/settings.rb +1 -0
- data/lib/datadog/tracing/contrib/delayed_job/ext.rb +1 -0
- data/lib/datadog/tracing/contrib/delayed_job/integration.rb +1 -0
- data/lib/datadog/tracing/contrib/delayed_job/patcher.rb +1 -1
- data/lib/datadog/tracing/contrib/delayed_job/plugin.rb +2 -1
- data/lib/datadog/tracing/contrib/elasticsearch/configuration/settings.rb +1 -0
- data/lib/datadog/tracing/contrib/elasticsearch/ext.rb +1 -0
- data/lib/datadog/tracing/contrib/elasticsearch/integration.rb +10 -3
- data/lib/datadog/tracing/contrib/elasticsearch/patcher.rb +40 -3
- data/lib/datadog/tracing/contrib/elasticsearch/quantize.rb +1 -0
- data/lib/datadog/tracing/contrib/ethon/configuration/settings.rb +1 -0
- data/lib/datadog/tracing/contrib/ethon/easy_patch.rb +2 -1
- data/lib/datadog/tracing/contrib/ethon/ext.rb +1 -0
- data/lib/datadog/tracing/contrib/ethon/integration.rb +1 -0
- data/lib/datadog/tracing/contrib/ethon/multi_patch.rb +2 -1
- data/lib/datadog/tracing/contrib/ethon/patcher.rb +1 -1
- data/lib/datadog/tracing/contrib/excon/configuration/settings.rb +1 -0
- data/lib/datadog/tracing/contrib/excon/ext.rb +1 -0
- data/lib/datadog/tracing/contrib/excon/integration.rb +1 -0
- data/lib/datadog/tracing/contrib/excon/middleware.rb +2 -1
- data/lib/datadog/tracing/contrib/excon/patcher.rb +1 -0
- data/lib/datadog/tracing/contrib/extensions.rb +57 -44
- data/lib/datadog/tracing/contrib/faraday/configuration/settings.rb +1 -0
- data/lib/datadog/tracing/contrib/faraday/connection.rb +1 -0
- data/lib/datadog/tracing/contrib/faraday/ext.rb +1 -0
- data/lib/datadog/tracing/contrib/faraday/integration.rb +1 -0
- data/lib/datadog/tracing/contrib/faraday/middleware.rb +2 -1
- data/lib/datadog/tracing/contrib/faraday/patcher.rb +1 -1
- data/lib/datadog/tracing/contrib/faraday/rack_builder.rb +1 -0
- data/lib/datadog/tracing/contrib/grape/configuration/settings.rb +1 -0
- data/lib/datadog/tracing/contrib/grape/endpoint.rb +4 -2
- data/lib/datadog/tracing/contrib/grape/ext.rb +1 -0
- data/lib/datadog/tracing/contrib/grape/instrumentation.rb +1 -0
- data/lib/datadog/tracing/contrib/grape/integration.rb +1 -0
- data/lib/datadog/tracing/contrib/grape/patcher.rb +1 -1
- data/lib/datadog/tracing/contrib/graphql/configuration/settings.rb +1 -0
- data/lib/datadog/tracing/contrib/graphql/ext.rb +3 -2
- data/lib/datadog/tracing/contrib/graphql/integration.rb +1 -0
- data/lib/datadog/tracing/contrib/graphql/patcher.rb +31 -4
- data/lib/datadog/tracing/contrib/grpc/configuration/settings.rb +1 -0
- data/lib/datadog/tracing/contrib/grpc/datadog_interceptor/client.rb +1 -0
- data/lib/datadog/tracing/contrib/grpc/datadog_interceptor/server.rb +1 -0
- data/lib/datadog/tracing/contrib/grpc/datadog_interceptor.rb +3 -2
- data/lib/datadog/tracing/contrib/grpc/ext.rb +1 -0
- data/lib/datadog/tracing/contrib/grpc/integration.rb +1 -0
- data/lib/datadog/tracing/contrib/grpc/intercept_with_datadog.rb +1 -0
- data/lib/datadog/tracing/contrib/grpc/patcher.rb +1 -1
- data/lib/datadog/tracing/contrib/http/circuit_breaker.rb +2 -1
- data/lib/datadog/tracing/contrib/http/configuration/settings.rb +1 -0
- data/lib/datadog/tracing/contrib/http/ext.rb +1 -0
- data/lib/datadog/tracing/contrib/http/instrumentation.rb +2 -1
- data/lib/datadog/tracing/contrib/http/integration.rb +1 -0
- data/lib/datadog/tracing/contrib/http/patcher.rb +1 -0
- data/lib/datadog/tracing/contrib/http_annotation_helper.rb +1 -0
- data/lib/datadog/tracing/contrib/httpclient/configuration/settings.rb +1 -0
- data/lib/datadog/tracing/contrib/httpclient/ext.rb +1 -0
- data/lib/datadog/tracing/contrib/httpclient/instrumentation.rb +3 -2
- data/lib/datadog/tracing/contrib/httpclient/integration.rb +1 -0
- data/lib/datadog/tracing/contrib/httpclient/patcher.rb +1 -0
- data/lib/datadog/tracing/contrib/httprb/configuration/settings.rb +1 -0
- data/lib/datadog/tracing/contrib/httprb/ext.rb +1 -0
- data/lib/datadog/tracing/contrib/httprb/instrumentation.rb +3 -2
- data/lib/datadog/tracing/contrib/httprb/integration.rb +1 -0
- data/lib/datadog/tracing/contrib/httprb/patcher.rb +1 -0
- data/lib/datadog/tracing/contrib/integration.rb +2 -1
- data/lib/datadog/tracing/contrib/kafka/configuration/settings.rb +1 -0
- data/lib/datadog/tracing/contrib/kafka/consumer_event.rb +1 -0
- data/lib/datadog/tracing/contrib/kafka/consumer_group_event.rb +1 -0
- data/lib/datadog/tracing/contrib/kafka/event.rb +2 -1
- data/lib/datadog/tracing/contrib/kafka/events/connection/request.rb +1 -0
- data/lib/datadog/tracing/contrib/kafka/events/consumer/process_batch.rb +1 -0
- data/lib/datadog/tracing/contrib/kafka/events/consumer/process_message.rb +1 -0
- data/lib/datadog/tracing/contrib/kafka/events/consumer_group/heartbeat.rb +1 -0
- data/lib/datadog/tracing/contrib/kafka/events/consumer_group/join_group.rb +1 -0
- data/lib/datadog/tracing/contrib/kafka/events/consumer_group/leave_group.rb +1 -0
- data/lib/datadog/tracing/contrib/kafka/events/consumer_group/sync_group.rb +1 -0
- data/lib/datadog/tracing/contrib/kafka/events/produce_operation/send_messages.rb +1 -0
- data/lib/datadog/tracing/contrib/kafka/events/producer/deliver_messages.rb +1 -0
- data/lib/datadog/tracing/contrib/kafka/events.rb +1 -0
- data/lib/datadog/tracing/contrib/kafka/ext.rb +1 -0
- data/lib/datadog/tracing/contrib/kafka/integration.rb +1 -0
- data/lib/datadog/tracing/contrib/kafka/patcher.rb +1 -1
- data/lib/datadog/tracing/contrib/lograge/configuration/settings.rb +1 -0
- data/lib/datadog/tracing/contrib/lograge/ext.rb +1 -0
- data/lib/datadog/tracing/contrib/lograge/instrumentation.rb +4 -2
- data/lib/datadog/tracing/contrib/lograge/integration.rb +1 -0
- data/lib/datadog/tracing/contrib/lograge/patcher.rb +1 -0
- data/lib/datadog/tracing/contrib/mongodb/configuration/settings.rb +1 -0
- data/lib/datadog/tracing/contrib/mongodb/ext.rb +1 -0
- data/lib/datadog/tracing/contrib/mongodb/instrumentation.rb +1 -0
- data/lib/datadog/tracing/contrib/mongodb/integration.rb +1 -0
- data/lib/datadog/tracing/contrib/mongodb/parsers.rb +2 -1
- data/lib/datadog/tracing/contrib/mongodb/patcher.rb +1 -0
- data/lib/datadog/tracing/contrib/mongodb/subscribers.rb +3 -2
- data/lib/datadog/tracing/contrib/mysql2/configuration/settings.rb +1 -0
- data/lib/datadog/tracing/contrib/mysql2/ext.rb +1 -0
- data/lib/datadog/tracing/contrib/mysql2/instrumentation.rb +2 -1
- data/lib/datadog/tracing/contrib/mysql2/integration.rb +1 -0
- data/lib/datadog/tracing/contrib/mysql2/patcher.rb +1 -0
- data/lib/datadog/tracing/contrib/patchable.rb +1 -0
- data/lib/datadog/tracing/contrib/patcher.rb +1 -0
- data/lib/datadog/tracing/contrib/presto/configuration/settings.rb +1 -0
- data/lib/datadog/tracing/contrib/presto/ext.rb +1 -0
- data/lib/datadog/tracing/contrib/presto/instrumentation.rb +2 -1
- data/lib/datadog/tracing/contrib/presto/integration.rb +1 -0
- data/lib/datadog/tracing/contrib/presto/patcher.rb +1 -0
- data/lib/datadog/tracing/contrib/qless/configuration/settings.rb +1 -0
- data/lib/datadog/tracing/contrib/qless/ext.rb +1 -0
- data/lib/datadog/tracing/contrib/qless/integration.rb +1 -0
- data/lib/datadog/tracing/contrib/qless/patcher.rb +2 -2
- data/lib/datadog/tracing/contrib/qless/qless_job.rb +3 -2
- data/lib/datadog/tracing/contrib/qless/tracer_cleaner.rb +2 -1
- data/lib/datadog/tracing/contrib/que/configuration/settings.rb +2 -1
- data/lib/datadog/tracing/contrib/que/ext.rb +2 -1
- data/lib/datadog/tracing/contrib/que/integration.rb +2 -1
- data/lib/datadog/tracing/contrib/que/patcher.rb +2 -2
- data/lib/datadog/tracing/contrib/que/tracer.rb +3 -2
- data/lib/datadog/tracing/contrib/racecar/configuration/settings.rb +1 -0
- data/lib/datadog/tracing/contrib/racecar/event.rb +2 -1
- data/lib/datadog/tracing/contrib/racecar/events/batch.rb +1 -0
- data/lib/datadog/tracing/contrib/racecar/events/consume.rb +1 -0
- data/lib/datadog/tracing/contrib/racecar/events/message.rb +1 -0
- data/lib/datadog/tracing/contrib/racecar/events.rb +1 -0
- data/lib/datadog/tracing/contrib/racecar/ext.rb +1 -0
- data/lib/datadog/tracing/contrib/racecar/integration.rb +1 -0
- data/lib/datadog/tracing/contrib/racecar/patcher.rb +1 -1
- data/lib/datadog/tracing/contrib/rack/configuration/settings.rb +1 -0
- data/lib/datadog/tracing/contrib/rack/ext.rb +1 -0
- data/lib/datadog/tracing/contrib/rack/integration.rb +1 -0
- data/lib/datadog/tracing/contrib/rack/middlewares.rb +2 -1
- data/lib/datadog/tracing/contrib/rack/patcher.rb +3 -2
- data/lib/datadog/tracing/contrib/rack/request_queue.rb +1 -0
- data/lib/datadog/tracing/contrib/rails/auto_instrument_railtie.rb +3 -1
- data/lib/datadog/tracing/contrib/rails/configuration/settings.rb +5 -4
- data/lib/datadog/tracing/contrib/rails/ext.rb +1 -0
- data/lib/datadog/tracing/contrib/rails/framework.rb +37 -36
- data/lib/datadog/tracing/contrib/rails/integration.rb +1 -0
- data/lib/datadog/tracing/contrib/rails/log_injection.rb +4 -16
- data/lib/datadog/tracing/contrib/rails/middlewares.rb +1 -0
- data/lib/datadog/tracing/contrib/rails/patcher.rb +8 -3
- data/lib/datadog/tracing/contrib/rails/railtie.rb +1 -0
- data/lib/datadog/tracing/contrib/rails/utils.rb +1 -0
- data/lib/datadog/tracing/contrib/rake/configuration/settings.rb +1 -0
- data/lib/datadog/tracing/contrib/rake/ext.rb +1 -0
- data/lib/datadog/tracing/contrib/rake/instrumentation.rb +6 -4
- data/lib/datadog/tracing/contrib/rake/integration.rb +1 -0
- data/lib/datadog/tracing/contrib/rake/patcher.rb +2 -2
- data/lib/datadog/tracing/contrib/redis/configuration/resolver.rb +1 -0
- data/lib/datadog/tracing/contrib/redis/configuration/settings.rb +1 -0
- data/lib/datadog/tracing/contrib/redis/ext.rb +1 -0
- data/lib/datadog/tracing/contrib/redis/instrumentation.rb +2 -1
- data/lib/datadog/tracing/contrib/redis/integration.rb +1 -0
- data/lib/datadog/tracing/contrib/redis/patcher.rb +1 -1
- data/lib/datadog/tracing/contrib/redis/quantize.rb +1 -0
- data/lib/datadog/tracing/contrib/redis/tags.rb +2 -1
- data/lib/datadog/tracing/contrib/redis/vendor/resolver.rb +1 -0
- data/lib/datadog/tracing/contrib/registry.rb +1 -0
- data/lib/datadog/tracing/contrib/resque/configuration/settings.rb +1 -0
- data/lib/datadog/tracing/contrib/resque/ext.rb +1 -0
- data/lib/datadog/tracing/contrib/resque/integration.rb +1 -0
- data/lib/datadog/tracing/contrib/resque/patcher.rb +1 -1
- data/lib/datadog/tracing/contrib/resque/resque_job.rb +3 -2
- data/lib/datadog/tracing/contrib/rest_client/configuration/settings.rb +1 -0
- data/lib/datadog/tracing/contrib/rest_client/ext.rb +1 -0
- data/lib/datadog/tracing/contrib/rest_client/integration.rb +1 -0
- data/lib/datadog/tracing/contrib/rest_client/patcher.rb +1 -1
- data/lib/datadog/tracing/contrib/rest_client/request_patch.rb +2 -1
- data/lib/datadog/tracing/contrib/semantic_logger/configuration/settings.rb +1 -0
- data/lib/datadog/tracing/contrib/semantic_logger/ext.rb +1 -0
- data/lib/datadog/tracing/contrib/semantic_logger/instrumentation.rb +4 -2
- data/lib/datadog/tracing/contrib/semantic_logger/integration.rb +1 -0
- data/lib/datadog/tracing/contrib/semantic_logger/patcher.rb +1 -0
- data/lib/datadog/tracing/contrib/sequel/configuration/settings.rb +1 -0
- data/lib/datadog/tracing/contrib/sequel/database.rb +2 -1
- data/lib/datadog/tracing/contrib/sequel/dataset.rb +2 -1
- data/lib/datadog/tracing/contrib/sequel/ext.rb +1 -0
- data/lib/datadog/tracing/contrib/sequel/integration.rb +1 -0
- data/lib/datadog/tracing/contrib/sequel/patcher.rb +1 -0
- data/lib/datadog/tracing/contrib/sequel/utils.rb +2 -1
- data/lib/datadog/tracing/contrib/shoryuken/configuration/settings.rb +1 -0
- data/lib/datadog/tracing/contrib/shoryuken/ext.rb +1 -0
- data/lib/datadog/tracing/contrib/shoryuken/integration.rb +1 -0
- data/lib/datadog/tracing/contrib/shoryuken/patcher.rb +1 -0
- data/lib/datadog/tracing/contrib/shoryuken/tracer.rb +2 -1
- data/lib/datadog/tracing/contrib/sidekiq/client_tracer.rb +2 -1
- data/lib/datadog/tracing/contrib/sidekiq/configuration/settings.rb +2 -0
- data/lib/datadog/tracing/contrib/sidekiq/ext.rb +1 -0
- data/lib/datadog/tracing/contrib/sidekiq/integration.rb +1 -0
- data/lib/datadog/tracing/contrib/sidekiq/patcher.rb +1 -0
- data/lib/datadog/tracing/contrib/sidekiq/server_internal_tracer/heartbeat.rb +1 -1
- data/lib/datadog/tracing/contrib/sidekiq/server_internal_tracer/job_fetch.rb +1 -1
- data/lib/datadog/tracing/contrib/sidekiq/server_internal_tracer/scheduled_push.rb +1 -1
- data/lib/datadog/tracing/contrib/sidekiq/server_tracer.rb +22 -2
- data/lib/datadog/tracing/contrib/sidekiq/tracing.rb +1 -0
- data/lib/datadog/tracing/contrib/sinatra/configuration/settings.rb +1 -0
- data/lib/datadog/tracing/contrib/sinatra/env.rb +1 -0
- data/lib/datadog/tracing/contrib/sinatra/ext.rb +1 -0
- data/lib/datadog/tracing/contrib/sinatra/framework.rb +14 -1
- data/lib/datadog/tracing/contrib/sinatra/headers.rb +1 -0
- data/lib/datadog/tracing/contrib/sinatra/integration.rb +1 -0
- data/lib/datadog/tracing/contrib/sinatra/patcher.rb +1 -1
- data/lib/datadog/tracing/contrib/sinatra/tracer.rb +3 -2
- data/lib/datadog/tracing/contrib/sinatra/tracer_middleware.rb +2 -1
- data/lib/datadog/tracing/contrib/sneakers/configuration/settings.rb +2 -1
- data/lib/datadog/tracing/contrib/sneakers/ext.rb +2 -1
- data/lib/datadog/tracing/contrib/sneakers/integration.rb +2 -1
- data/lib/datadog/tracing/contrib/sneakers/patcher.rb +2 -2
- data/lib/datadog/tracing/contrib/sneakers/tracer.rb +3 -2
- data/lib/datadog/tracing/contrib/status_code_matcher.rb +1 -0
- data/lib/datadog/tracing/contrib/sucker_punch/configuration/settings.rb +1 -0
- data/lib/datadog/tracing/contrib/sucker_punch/exception_handler.rb +1 -0
- data/lib/datadog/tracing/contrib/sucker_punch/ext.rb +1 -0
- data/lib/datadog/tracing/contrib/sucker_punch/instrumentation.rb +2 -1
- data/lib/datadog/tracing/contrib/sucker_punch/integration.rb +1 -0
- data/lib/datadog/tracing/contrib/sucker_punch/patcher.rb +2 -2
- data/lib/datadog/tracing/contrib/utils/database.rb +1 -0
- data/lib/datadog/tracing/contrib/utils/quantization/hash.rb +1 -0
- data/lib/datadog/tracing/contrib/utils/quantization/http.rb +1 -0
- data/lib/datadog/tracing/contrib.rb +3 -0
- data/lib/datadog/tracing/correlation.rb +12 -20
- data/lib/datadog/tracing/distributed/headers/b3.rb +1 -0
- data/lib/datadog/tracing/distributed/headers/b3_single.rb +1 -0
- data/lib/datadog/tracing/distributed/headers/datadog.rb +1 -0
- data/lib/datadog/tracing/distributed/headers/ext.rb +1 -0
- data/lib/datadog/tracing/distributed/helpers.rb +1 -0
- data/lib/datadog/tracing/distributed/parser.rb +1 -0
- data/lib/datadog/tracing/event.rb +3 -1
- data/lib/datadog/tracing/flush.rb +1 -0
- data/lib/datadog/tracing/metadata/analytics.rb +2 -0
- data/lib/datadog/tracing/metadata/errors.rb +24 -0
- data/lib/datadog/tracing/metadata/ext.rb +2 -1
- data/lib/datadog/tracing/metadata/tagging.rb +2 -10
- data/lib/datadog/tracing/metadata.rb +4 -0
- data/lib/datadog/tracing/pipeline/span_processor.rb +1 -0
- data/lib/datadog/tracing/propagation/grpc.rb +1 -0
- data/lib/datadog/tracing/propagation/http.rb +1 -0
- data/lib/datadog/tracing/runtime/metrics.rb +1 -0
- data/lib/datadog/tracing/sampling/all_sampler.rb +1 -0
- data/lib/datadog/tracing/sampling/ext.rb +1 -0
- data/lib/datadog/tracing/sampling/matcher.rb +1 -0
- data/lib/datadog/tracing/sampling/priority_sampler.rb +4 -4
- data/lib/datadog/tracing/sampling/rate_by_key_sampler.rb +1 -0
- data/lib/datadog/tracing/sampling/rate_by_service_sampler.rb +1 -0
- data/lib/datadog/tracing/sampling/rate_limiter.rb +1 -0
- data/lib/datadog/tracing/sampling/rate_sampler.rb +1 -0
- data/lib/datadog/tracing/sampling/rule.rb +12 -5
- data/lib/datadog/tracing/sampling/rule_sampler.rb +3 -4
- data/lib/datadog/tracing/sampling/sampler.rb +1 -0
- data/lib/datadog/tracing/span.rb +7 -5
- data/lib/datadog/tracing/span_operation.rb +8 -7
- data/lib/datadog/tracing/sync_writer.rb +1 -0
- data/lib/datadog/tracing/trace_digest.rb +2 -0
- data/lib/datadog/tracing/trace_operation.rb +44 -24
- data/lib/datadog/tracing/trace_segment.rb +109 -194
- data/lib/datadog/tracing/tracer.rb +3 -2
- data/lib/datadog/tracing/workers/trace_writer.rb +1 -0
- data/lib/datadog/tracing/workers.rb +1 -0
- data/lib/datadog/tracing/writer.rb +1 -0
- data/lib/datadog/tracing.rb +2 -0
- data/lib/ddtrace/auto_instrument.rb +2 -1
- data/lib/ddtrace/auto_instrument_base.rb +1 -0
- data/lib/ddtrace/profiling/preload.rb +2 -0
- data/lib/ddtrace/transport/ext.rb +1 -0
- data/lib/ddtrace/transport/http/adapters/net.rb +1 -0
- data/lib/ddtrace/transport/http/adapters/registry.rb +1 -0
- data/lib/ddtrace/transport/http/adapters/test.rb +1 -0
- data/lib/ddtrace/transport/http/adapters/unix_socket.rb +1 -0
- data/lib/ddtrace/transport/http/api/endpoint.rb +1 -0
- data/lib/ddtrace/transport/http/api/fallbacks.rb +1 -0
- data/lib/ddtrace/transport/http/api/instance.rb +1 -0
- data/lib/ddtrace/transport/http/api/map.rb +1 -0
- data/lib/ddtrace/transport/http/api/spec.rb +1 -0
- data/lib/ddtrace/transport/http/api.rb +1 -0
- data/lib/ddtrace/transport/http/builder.rb +1 -0
- data/lib/ddtrace/transport/http/client.rb +3 -1
- data/lib/ddtrace/transport/http/env.rb +1 -0
- data/lib/ddtrace/transport/http/response.rb +35 -4
- data/lib/ddtrace/transport/http/statistics.rb +1 -0
- data/lib/ddtrace/transport/http/traces.rb +1 -0
- data/lib/ddtrace/transport/http.rb +14 -3
- data/lib/ddtrace/transport/io/client.rb +4 -1
- data/lib/ddtrace/transport/io/response.rb +1 -0
- data/lib/ddtrace/transport/io/traces.rb +1 -0
- data/lib/ddtrace/transport/io.rb +1 -0
- data/lib/ddtrace/transport/parcel.rb +1 -0
- data/lib/ddtrace/transport/request.rb +1 -0
- data/lib/ddtrace/transport/response.rb +1 -0
- data/lib/ddtrace/transport/serializable_trace.rb +2 -0
- data/lib/ddtrace/transport/statistics.rb +1 -0
- data/lib/ddtrace/transport/trace_formatter.rb +24 -1
- data/lib/ddtrace/transport/traces.rb +1 -0
- data/lib/ddtrace/version.rb +13 -11
- data/lib/ddtrace.rb +3 -21
- metadata +47 -9
- data/lib/datadog/opentelemetry/extensions.rb +0 -14
- data/lib/datadog/opentelemetry/span.rb +0 -34
@@ -1,91 +1,40 @@
|
|
1
1
|
# typed: ignore
|
2
|
-
# rubocop:disable Style/StderrPuts
|
3
|
-
|
4
|
-
# Older Rubies don't have the MJIT header, used by the JIT compiler, so we need to use a different approach
|
5
|
-
CAN_USE_MJIT_HEADER = RUBY_VERSION >= '2.6'
|
6
|
-
|
7
|
-
def on_jruby?
|
8
|
-
# We don't support JRuby for profiling, and JRuby doesn't support native extensions, so let's just skip this entire
|
9
|
-
# thing so that JRuby users of dd-trace-rb aren't impacted.
|
10
|
-
RUBY_ENGINE == 'jruby'
|
11
|
-
end
|
12
|
-
|
13
|
-
def on_truffleruby?
|
14
|
-
# We don't officially support TruffleRuby for dd-trace-rb at all BUT let's not break adventurous customers that
|
15
|
-
# want to give it a try.
|
16
|
-
RUBY_ENGINE == 'truffleruby'
|
17
|
-
end
|
18
|
-
|
19
|
-
def on_windows?
|
20
|
-
# Microsoft Windows is unsupported, so let's not build the extension there.
|
21
|
-
Gem.win_platform?
|
22
|
-
end
|
23
|
-
|
24
|
-
def expected_to_use_mjit_but_mjit_is_disabled?
|
25
|
-
# On some Rubies, we require the mjit header to be present. If Ruby was installed without MJIT support, we also skip
|
26
|
-
# building the extension.
|
27
|
-
mjit_disabled = CAN_USE_MJIT_HEADER && RbConfig::CONFIG['MJIT_SUPPORT'] != 'yes'
|
28
|
-
|
29
|
-
if mjit_disabled
|
30
|
-
$stderr.puts(%(
|
31
|
-
+------------------------------------------------------------------------------+
|
32
|
-
| Your Ruby has been compiled without JIT support (--disable-jit-support). |
|
33
|
-
| The profiling native extension requires a Ruby compiled with JIT support, |
|
34
|
-
| even if the JIT is not in use by the application itself. |
|
35
|
-
| |
|
36
|
-
| WARNING: Without the profiling native extension, some profiling features |
|
37
|
-
| will not be available. |
|
38
|
-
+------------------------------------------------------------------------------+
|
39
2
|
|
40
|
-
|
41
|
-
|
42
|
-
|
43
|
-
mjit_disabled
|
44
|
-
end
|
3
|
+
# rubocop:disable Style/StderrPuts
|
4
|
+
# rubocop:disable Style/GlobalVars
|
45
5
|
|
46
|
-
|
47
|
-
# Experimental toggle to disable building the extension.
|
48
|
-
# Disabling the extension will lead to the profiler not working in future releases.
|
49
|
-
# If you needed to use this, please tell us why on <https://github.com/DataDog/dd-trace-rb/issues/new>.
|
50
|
-
ENV['DD_PROFILING_NO_EXTENSION'].to_s.downcase == 'true'
|
51
|
-
end
|
6
|
+
require_relative 'native_extension_helpers'
|
52
7
|
|
53
|
-
|
54
|
-
|
55
|
-
|
8
|
+
SKIPPED_REASON_FILE = "#{__dir__}/skipped_reason.txt".freeze
|
9
|
+
# Not a problem if the file doesn't exist or we can't delete it
|
10
|
+
File.delete(SKIPPED_REASON_FILE) rescue nil
|
56
11
|
|
57
|
-
|
58
|
-
|
59
|
-
|
60
|
-
|
61
|
-
|
12
|
+
def skip_building_extension!(reason)
|
13
|
+
$stderr.puts(Datadog::Profiling::NativeExtensionHelpers::Supported.failure_banner_for(**reason))
|
14
|
+
File.write(
|
15
|
+
SKIPPED_REASON_FILE,
|
16
|
+
Datadog::Profiling::NativeExtensionHelpers::Supported.render_skipped_reason_file(**reason),
|
17
|
+
)
|
62
18
|
|
63
|
-
def skip_building_extension!
|
64
19
|
File.write('Makefile', 'all install clean: # dummy makefile that does nothing')
|
65
20
|
exit
|
66
21
|
end
|
67
22
|
|
68
|
-
|
69
|
-
|
70
|
-
+------------------------------------------------------------------------------+
|
71
|
-
| Skipping build of profiling native extension and replacing it with a no-op |
|
72
|
-
| Makefile |
|
73
|
-
+------------------------------------------------------------------------------+
|
74
|
-
|
75
|
-
))
|
76
|
-
skip_building_extension!
|
23
|
+
unless Datadog::Profiling::NativeExtensionHelpers::Supported.supported?
|
24
|
+
skip_building_extension!(Datadog::Profiling::NativeExtensionHelpers::Supported.unsupported_reason)
|
77
25
|
end
|
78
26
|
|
79
27
|
$stderr.puts(%(
|
80
28
|
+------------------------------------------------------------------------------+
|
81
|
-
| ** Preparing to build the ddtrace native extension... **
|
29
|
+
| ** Preparing to build the ddtrace profiling native extension... ** |
|
82
30
|
| |
|
83
31
|
| If you run into any failures during this step, you can set the |
|
84
32
|
| `DD_PROFILING_NO_EXTENSION` environment variable to `true` e.g. |
|
85
33
|
| `$ DD_PROFILING_NO_EXTENSION=true bundle install` to skip this step. |
|
86
34
|
| |
|
87
|
-
|
|
88
|
-
|
|
35
|
+
| If you disable this extension, the Datadog Continuous Profiler will |
|
36
|
+
| not be available, but all other ddtrace features will work fine! |
|
37
|
+
| |
|
89
38
|
| If you needed to use this, please tell us why on |
|
90
39
|
| <https://github.com/DataDog/dd-trace-rb/issues/new> so we can fix it :\) |
|
91
40
|
| |
|
@@ -98,6 +47,22 @@ $stderr.puts(%(
|
|
98
47
|
# that may fail on an environment not properly setup for building Ruby extensions.
|
99
48
|
require 'mkmf'
|
100
49
|
|
50
|
+
# mkmf on modern Rubies actually has an append_cflags that does something similar
|
51
|
+
# (see https://github.com/ruby/ruby/pull/5760), but as usual we need a bit more boilerplate to deal with legacy Rubies
|
52
|
+
def add_compiler_flag(flag)
|
53
|
+
if try_cflags(flag)
|
54
|
+
$CFLAGS << ' ' << flag
|
55
|
+
else
|
56
|
+
$stderr.puts("WARNING: '#{flag}' not accepted by compiler, skipping it")
|
57
|
+
end
|
58
|
+
end
|
59
|
+
|
60
|
+
# Older gcc releases may not default to C99 and we need to ask for this. This is also used:
|
61
|
+
# * by upstream Ruby -- search for gnu99 in the codebase
|
62
|
+
# * by msgpack, another ddtrace dependency
|
63
|
+
# (https://github.com/msgpack/msgpack-ruby/blob/18ce08f6d612fe973843c366ac9a0b74c4e50599/ext/msgpack/extconf.rb#L8)
|
64
|
+
add_compiler_flag '-std=gnu99'
|
65
|
+
|
101
66
|
# Gets really noisy when we include the MJIT header, let's omit it
|
102
67
|
add_compiler_flag '-Wno-unused-function'
|
103
68
|
|
@@ -108,6 +73,14 @@ add_compiler_flag '-Wno-declaration-after-statement'
|
|
108
73
|
# cause a segfault later. Let's ensure that never happens.
|
109
74
|
add_compiler_flag '-Werror-implicit-function-declaration'
|
110
75
|
|
76
|
+
# The native extension is not intended to expose any symbols/functions for other native libraries to use;
|
77
|
+
# the sole exception being `Init_ddtrace_profiling_native_extension` which needs to be visible for Ruby to call it when
|
78
|
+
# it `dlopen`s the library.
|
79
|
+
#
|
80
|
+
# By setting this compiler flag, we tell it to assume that everything is private unless explicitly stated.
|
81
|
+
# For more details see https://gcc.gnu.org/wiki/Visibility
|
82
|
+
add_compiler_flag '-fvisibility=hidden'
|
83
|
+
|
111
84
|
if RUBY_PLATFORM.include?('linux')
|
112
85
|
# Supposedly, the correct way to do this is
|
113
86
|
# ```
|
@@ -119,13 +92,41 @@ if RUBY_PLATFORM.include?('linux')
|
|
119
92
|
$defs << '-DHAVE_PTHREAD_GETCPUCLOCKID'
|
120
93
|
end
|
121
94
|
|
95
|
+
# On older Rubies, we need to use a backported version of this function. See private_vm_api_access.h for details.
|
96
|
+
$defs << '-DUSE_BACKPORTED_RB_PROFILE_FRAME_METHOD_NAME' if RUBY_VERSION < '3'
|
97
|
+
|
98
|
+
# On older Rubies, we need to use rb_thread_t instead of rb_execution_context_t
|
99
|
+
$defs << '-DUSE_THREAD_INSTEAD_OF_EXECUTION_CONTEXT' if RUBY_VERSION < '2.5'
|
100
|
+
|
101
|
+
# On older Rubies...
|
102
|
+
if RUBY_VERSION < '2.4'
|
103
|
+
# ...we need to use RUBY_VM_NORMAL_ISEQ_P instead of VM_FRAME_RUBYFRAME_P
|
104
|
+
$defs << '-DUSE_ISEQ_P_INSTEAD_OF_RUBYFRAME_P'
|
105
|
+
# ...we use a legacy copy of rb_vm_frame_method_entry
|
106
|
+
$defs << '-DUSE_LEGACY_RB_VM_FRAME_METHOD_ENTRY'
|
107
|
+
end
|
108
|
+
|
109
|
+
# For REALLY OLD Rubies...
|
110
|
+
if RUBY_VERSION < '2.3'
|
111
|
+
# ...there was no rb_time_timespec_new function
|
112
|
+
$defs << '-DNO_RB_TIME_TIMESPEC_NEW'
|
113
|
+
# ...the VM changed enough that we need an alternative legacy rb_profile_frames
|
114
|
+
$defs << '-DUSE_LEGACY_RB_PROFILE_FRAMES'
|
115
|
+
end
|
116
|
+
|
117
|
+
# If we got here, libddprof is available and loaded
|
118
|
+
ENV['PKG_CONFIG_PATH'] = "#{ENV['PKG_CONFIG_PATH']}:#{Libddprof.pkgconfig_folder}"
|
119
|
+
unless pkg_config('ddprof_ffi_with_rpath')
|
120
|
+
skip_building_extension!(Datadog::Profiling::NativeExtensionHelpers::Supported::FAILED_TO_CONFIGURE_LIBDDPROF)
|
121
|
+
end
|
122
|
+
|
122
123
|
# Tag the native extension library with the Ruby version and Ruby platform.
|
123
124
|
# This makes it easier for development (avoids "oops I forgot to rebuild when I switched my Ruby") and ensures that
|
124
125
|
# the wrong library is never loaded.
|
125
126
|
# When requiring, we need to use the exact same string, including the version and the platform.
|
126
127
|
EXTENSION_NAME = "ddtrace_profiling_native_extension.#{RUBY_VERSION}_#{RUBY_PLATFORM}".freeze
|
127
128
|
|
128
|
-
if CAN_USE_MJIT_HEADER
|
129
|
+
if Datadog::Profiling::NativeExtensionHelpers::CAN_USE_MJIT_HEADER
|
129
130
|
mjit_header_file_name = "rb_mjit_min_header-#{RUBY_VERSION}.h"
|
130
131
|
|
131
132
|
# Validate that the mjit header can actually be compiled on this system. We learned via
|
@@ -137,42 +138,15 @@ if CAN_USE_MJIT_HEADER
|
|
137
138
|
original_common_headers = MakeMakefile::COMMON_HEADERS
|
138
139
|
MakeMakefile::COMMON_HEADERS = ''.freeze
|
139
140
|
unless have_macro('RUBY_MJIT_H', mjit_header_file_name)
|
140
|
-
|
141
|
-
+------------------------------------------------------------------------------+
|
142
|
-
| WARNING: Unable to compile a needed component for ddtrace native extension. |
|
143
|
-
| Your C compiler or Ruby VM just-in-time compiler seems to be broken. |
|
144
|
-
| |
|
145
|
-
| You will be NOT be able to use ddtrace profiling features, |
|
146
|
-
| but all other features will work fine! |
|
147
|
-
| |
|
148
|
-
| For help solving this issue, please contact Datadog support at |
|
149
|
-
| <https://docs.datadoghq.com/help/>. |
|
150
|
-
+------------------------------------------------------------------------------+
|
151
|
-
|
152
|
-
))
|
153
|
-
skip_building_extension!
|
141
|
+
skip_building_extension!(Datadog::Profiling::NativeExtensionHelpers::Supported::COMPILATION_BROKEN)
|
154
142
|
end
|
155
143
|
MakeMakefile::COMMON_HEADERS = original_common_headers
|
156
144
|
|
157
|
-
$defs <<
|
145
|
+
$defs << "-DRUBY_MJIT_HEADER='\"#{mjit_header_file_name}\"'"
|
158
146
|
|
159
147
|
# NOTE: This needs to come after all changes to $defs
|
160
148
|
create_header
|
161
149
|
|
162
|
-
# The MJIT header is always (afaik?) suffixed with the exact Ruby VM version,
|
163
|
-
# including patch (e.g. 2.7.2). Thus, we add to the header file a definition
|
164
|
-
# containing the exact file, so that it can be used in a #include in the C code.
|
165
|
-
header_contents =
|
166
|
-
File.read($extconf_h)
|
167
|
-
.sub('#endif',
|
168
|
-
<<-EXTCONF_H.strip
|
169
|
-
#define RUBY_MJIT_HEADER "#{mjit_header_file_name}"
|
170
|
-
|
171
|
-
#endif
|
172
|
-
EXTCONF_H
|
173
|
-
)
|
174
|
-
File.open($extconf_h, 'w') { |file| file.puts(header_contents) }
|
175
|
-
|
176
150
|
create_makefile EXTENSION_NAME
|
177
151
|
else
|
178
152
|
# On older Rubies, we use the debase-ruby_core_source gem to get access to private VM headers.
|
@@ -192,6 +166,11 @@ else
|
|
192
166
|
dir_config('ruby') # allow user to pass in non-standard core include directory
|
193
167
|
|
194
168
|
Debase::RubyCoreSource
|
195
|
-
.create_makefile_with_core(
|
169
|
+
.create_makefile_with_core(
|
170
|
+
proc { have_header('vm_core.h') && have_header('iseq.h') && thread_native_for_ruby_2_1.call },
|
171
|
+
EXTENSION_NAME,
|
172
|
+
)
|
196
173
|
end
|
174
|
+
|
175
|
+
# rubocop:enable Style/GlobalVars
|
197
176
|
# rubocop:enable Style/StderrPuts
|
@@ -0,0 +1,13 @@
|
|
1
|
+
#pragma once
|
2
|
+
|
3
|
+
#include <ddprof/ffi.h>
|
4
|
+
|
5
|
+
inline static ddprof_ffi_CharSlice char_slice_from_ruby_string(VALUE string) {
|
6
|
+
Check_Type(string, T_STRING);
|
7
|
+
ddprof_ffi_CharSlice char_slice = {.ptr = StringValuePtr(string), .len = RSTRING_LEN(string)};
|
8
|
+
return char_slice;
|
9
|
+
}
|
10
|
+
|
11
|
+
inline static VALUE ruby_string_from_vec_u8(ddprof_ffi_Vec_u8 string) {
|
12
|
+
return rb_str_new((char *) string.ptr, string.len);
|
13
|
+
}
|
@@ -0,0 +1,186 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
# typed: ignore
|
4
|
+
|
5
|
+
require 'libddprof'
|
6
|
+
|
7
|
+
module Datadog
|
8
|
+
module Profiling
|
9
|
+
module NativeExtensionHelpers
|
10
|
+
ENV_NO_EXTENSION = 'DD_PROFILING_NO_EXTENSION'
|
11
|
+
|
12
|
+
# Older Rubies don't have the MJIT header, used by the JIT compiler, so we need to use a different approach
|
13
|
+
CAN_USE_MJIT_HEADER = RUBY_VERSION >= '2.6'
|
14
|
+
|
15
|
+
# Used to check if profiler is supported, including user-visible clear messages explaining why their
|
16
|
+
# system may not be supported.
|
17
|
+
# rubocop:disable Metrics/ModuleLength
|
18
|
+
module Supported
|
19
|
+
private_class_method def self.explain_issue(*reason, suggested:)
|
20
|
+
{ reason: reason, suggested: suggested }
|
21
|
+
end
|
22
|
+
|
23
|
+
def self.supported?
|
24
|
+
unsupported_reason.nil?
|
25
|
+
end
|
26
|
+
|
27
|
+
def self.unsupported_reason
|
28
|
+
disabled_via_env? ||
|
29
|
+
on_jruby? ||
|
30
|
+
on_truffleruby? ||
|
31
|
+
on_windows? ||
|
32
|
+
on_macos? ||
|
33
|
+
on_unknown_os? ||
|
34
|
+
not_on_amd64_or_arm64? ||
|
35
|
+
expected_to_use_mjit_but_mjit_is_disabled? ||
|
36
|
+
libddprof_not_usable?
|
37
|
+
end
|
38
|
+
|
39
|
+
# This banner will show up in the logs/terminal while compiling the native extension
|
40
|
+
def self.failure_banner_for(reason:, suggested:)
|
41
|
+
prettify_lines = proc { |lines| lines.map { |line| "| #{line.ljust(76)} |" }.join("\n") }
|
42
|
+
%(
|
43
|
+
+------------------------------------------------------------------------------+
|
44
|
+
| Could not compile the Datadog Continuous Profiler because |
|
45
|
+
#{prettify_lines.call(reason)}
|
46
|
+
| |
|
47
|
+
| The Datadog Continuous Profiler will not be available, |
|
48
|
+
| but all other ddtrace features will work fine! |
|
49
|
+
| |
|
50
|
+
#{prettify_lines.call(suggested)}
|
51
|
+
+------------------------------------------------------------------------------+
|
52
|
+
)
|
53
|
+
end
|
54
|
+
|
55
|
+
# This will be saved in a file to later be presented while operating the gem
|
56
|
+
def self.render_skipped_reason_file(reason:, suggested:)
|
57
|
+
[*reason, *suggested].join(' ')
|
58
|
+
end
|
59
|
+
|
60
|
+
CONTACT_SUPPORT = [
|
61
|
+
'For help solving this issue, please contact Datadog support at',
|
62
|
+
'<https://docs.datadoghq.com/help/>.',
|
63
|
+
].freeze
|
64
|
+
|
65
|
+
REPORT_ISSUE = [
|
66
|
+
'If you needed to use this, please tell us why on',
|
67
|
+
'<https://github.com/DataDog/dd-trace-rb/issues/new> so we can fix it :)',
|
68
|
+
].freeze
|
69
|
+
|
70
|
+
GET_IN_TOUCH = [
|
71
|
+
"Get in touch with us if you're interested in profiling your app!"
|
72
|
+
].freeze
|
73
|
+
|
74
|
+
# Validation for this check is done in extconf.rb because it relies on mkmf
|
75
|
+
FAILED_TO_CONFIGURE_LIBDDPROF = explain_issue(
|
76
|
+
'there was a problem in setting up the `libddprof` dependency.',
|
77
|
+
suggested: CONTACT_SUPPORT,
|
78
|
+
)
|
79
|
+
|
80
|
+
# Validation for this check is done in extconf.rb because it relies on mkmf
|
81
|
+
COMPILATION_BROKEN = explain_issue(
|
82
|
+
'compilation of the Ruby VM just-in-time header failed.',
|
83
|
+
'Your C compiler or Ruby VM just-in-time compiler seem to be broken.',
|
84
|
+
suggested: CONTACT_SUPPORT,
|
85
|
+
)
|
86
|
+
|
87
|
+
private_class_method def self.disabled_via_env?
|
88
|
+
disabled_via_env = explain_issue(
|
89
|
+
'the `DD_PROFILING_NO_EXTENSION` environment variable is/was set to',
|
90
|
+
'`true` during installation.',
|
91
|
+
suggested: REPORT_ISSUE,
|
92
|
+
)
|
93
|
+
|
94
|
+
return unless ENV[ENV_NO_EXTENSION].to_s.strip.downcase == 'true'
|
95
|
+
|
96
|
+
disabled_via_env
|
97
|
+
end
|
98
|
+
|
99
|
+
private_class_method def self.on_jruby?
|
100
|
+
jruby_not_supported = explain_issue(
|
101
|
+
'JRuby is not supported by the Datadog Continuous Profiler.',
|
102
|
+
suggested: GET_IN_TOUCH,
|
103
|
+
)
|
104
|
+
|
105
|
+
jruby_not_supported if RUBY_ENGINE == 'jruby'
|
106
|
+
end
|
107
|
+
|
108
|
+
private_class_method def self.on_truffleruby?
|
109
|
+
truffleruby_not_supported = explain_issue(
|
110
|
+
'TruffleRuby is not supported by the ddtrace gem.',
|
111
|
+
suggested: GET_IN_TOUCH,
|
112
|
+
)
|
113
|
+
|
114
|
+
truffleruby_not_supported if RUBY_ENGINE == 'truffleruby'
|
115
|
+
end
|
116
|
+
|
117
|
+
# See https://docs.datadoghq.com/tracing/setup_overview/setup/ruby/#microsoft-windows-support for current
|
118
|
+
# state of Windows support in ddtrace.
|
119
|
+
private_class_method def self.on_windows?
|
120
|
+
windows_not_supported = explain_issue(
|
121
|
+
'Microsoft Windows is not supported by the Datadog Continuous Profiler.',
|
122
|
+
suggested: GET_IN_TOUCH,
|
123
|
+
)
|
124
|
+
|
125
|
+
windows_not_supported if Gem.win_platform?
|
126
|
+
end
|
127
|
+
|
128
|
+
private_class_method def self.on_macos?
|
129
|
+
macos_not_supported = explain_issue(
|
130
|
+
'macOS is currently not supported by the Datadog Continuous Profiler.',
|
131
|
+
suggested: GET_IN_TOUCH,
|
132
|
+
)
|
133
|
+
# For development only; not supported otherwise
|
134
|
+
macos_testing_override = ENV['DD_PROFILING_MACOS_TESTING'] == 'true'
|
135
|
+
|
136
|
+
macos_not_supported if RUBY_PLATFORM.include?('darwin') && !macos_testing_override
|
137
|
+
end
|
138
|
+
|
139
|
+
private_class_method def self.on_unknown_os?
|
140
|
+
unknown_os_not_supported = explain_issue(
|
141
|
+
'your operating system is not supported by the Datadog Continuous Profiler.',
|
142
|
+
suggested: GET_IN_TOUCH,
|
143
|
+
)
|
144
|
+
|
145
|
+
unknown_os_not_supported unless RUBY_PLATFORM.include?('darwin') || RUBY_PLATFORM.include?('linux')
|
146
|
+
end
|
147
|
+
|
148
|
+
private_class_method def self.not_on_amd64_or_arm64?
|
149
|
+
architecture_not_supported = explain_issue(
|
150
|
+
'your CPU architecture is not supported by the Datadog Continuous Profiler.',
|
151
|
+
suggested: GET_IN_TOUCH,
|
152
|
+
)
|
153
|
+
|
154
|
+
architecture_not_supported unless RUBY_PLATFORM.start_with?('x86_64', 'aarch64')
|
155
|
+
end
|
156
|
+
|
157
|
+
# On some Rubies, we require the mjit header to be present. If Ruby was installed without MJIT support, we also skip
|
158
|
+
# building the extension.
|
159
|
+
private_class_method def self.expected_to_use_mjit_but_mjit_is_disabled?
|
160
|
+
ruby_without_mjit = explain_issue(
|
161
|
+
'your Ruby has been compiled without JIT support (--disable-jit-support).',
|
162
|
+
'The profiling native extension requires a Ruby compiled with JIT support,',
|
163
|
+
'even if the JIT is not in use by the application itself.',
|
164
|
+
suggested: CONTACT_SUPPORT,
|
165
|
+
)
|
166
|
+
|
167
|
+
ruby_without_mjit if CAN_USE_MJIT_HEADER && RbConfig::CONFIG['MJIT_SUPPORT'] != 'yes'
|
168
|
+
end
|
169
|
+
|
170
|
+
private_class_method def self.libddprof_not_usable?
|
171
|
+
no_binaries_for_current_platform = explain_issue(
|
172
|
+
'the `libddprof` gem installed on your system is missing binaries for your',
|
173
|
+
'platform variant.',
|
174
|
+
"(Your platform: `#{Gem::Platform.local}`)",
|
175
|
+
'(Available binaries: ',
|
176
|
+
"`#{Libddprof.available_binaries.join('`, `')}`)",
|
177
|
+
suggested: CONTACT_SUPPORT,
|
178
|
+
)
|
179
|
+
|
180
|
+
no_binaries_for_current_platform unless Libddprof.pkgconfig_folder
|
181
|
+
end
|
182
|
+
end
|
183
|
+
# rubocop:enable Metrics/ModuleLength
|
184
|
+
end
|
185
|
+
end
|
186
|
+
end
|