ddtrace 1.10.1 → 1.11.0.beta1
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 +70 -1
- data/README.md +8 -9
- data/ext/ddtrace_profiling_native_extension/collectors_cpu_and_wall_time_worker.c +76 -11
- data/ext/ddtrace_profiling_native_extension/collectors_thread_context.c +26 -3
- data/ext/ddtrace_profiling_native_extension/private_vm_api_access.c +3 -0
- data/lib/datadog/appsec/component.rb +40 -6
- data/lib/datadog/appsec/configuration/settings.rb +20 -4
- data/lib/datadog/appsec/configuration.rb +8 -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/gateway/request.rb +4 -15
- data/lib/datadog/appsec/contrib/rack/gateway/response.rb +1 -1
- data/lib/datadog/appsec/contrib/rack/patcher.rb +2 -0
- data/lib/datadog/appsec/contrib/rack/reactive/response.rb +6 -0
- data/lib/datadog/appsec/contrib/rack/request_middleware.rb +17 -3
- data/lib/datadog/appsec/contrib/rails/configuration/settings.rb +2 -0
- data/lib/datadog/appsec/contrib/rails/framework.rb +2 -0
- data/lib/datadog/appsec/contrib/rails/gateway/request.rb +1 -1
- data/lib/datadog/appsec/contrib/rails/request.rb +2 -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/framework.rb +2 -0
- data/lib/datadog/appsec/contrib/sinatra/gateway/route_params.rb +1 -1
- data/lib/datadog/appsec/contrib/sinatra/request_middleware.rb +2 -0
- data/lib/datadog/appsec/extensions.rb +2 -0
- data/lib/datadog/appsec/instrumentation/gateway/argument.rb +2 -4
- data/lib/datadog/appsec/processor/rule_loader.rb +63 -0
- data/lib/datadog/appsec/processor/rule_merger.rb +146 -0
- data/lib/datadog/appsec/processor.rb +15 -70
- data/lib/datadog/appsec/remote.rb +121 -0
- data/lib/datadog/appsec/utils/http.rb +2 -0
- data/lib/datadog/appsec/utils.rb +2 -0
- data/lib/datadog/appsec.rb +18 -4
- data/lib/datadog/ci/configuration/components.rb +2 -0
- data/lib/datadog/ci/configuration/settings.rb +2 -0
- data/lib/datadog/ci/contrib/cucumber/configuration/settings.rb +2 -0
- data/lib/datadog/ci/contrib/cucumber/formatter.rb +2 -0
- data/lib/datadog/ci/contrib/cucumber/instrumentation.rb +2 -0
- data/lib/datadog/ci/contrib/cucumber/patcher.rb +2 -0
- data/lib/datadog/ci/contrib/rspec/configuration/settings.rb +2 -0
- data/lib/datadog/ci/contrib/rspec/patcher.rb +2 -0
- data/lib/datadog/ci/extensions.rb +2 -0
- data/lib/datadog/ci/flush.rb +2 -0
- data/lib/datadog/ci.rb +2 -0
- data/lib/datadog/core/buffer/cruby.rb +2 -0
- data/lib/datadog/core/buffer/random.rb +2 -0
- data/lib/datadog/core/buffer/thread_safe.rb +2 -0
- data/lib/datadog/core/chunker.rb +2 -0
- data/lib/datadog/core/configuration/agent_settings_resolver.rb +6 -6
- data/lib/datadog/core/configuration/components.rb +11 -14
- data/lib/datadog/core/configuration/dependency_resolver.rb +2 -0
- data/lib/datadog/core/configuration/option.rb +2 -0
- data/lib/datadog/core/configuration/option_definition.rb +2 -0
- data/lib/datadog/core/configuration/option_definition_set.rb +2 -0
- data/lib/datadog/core/configuration/option_set.rb +2 -0
- data/lib/datadog/core/configuration/settings.rb +68 -13
- data/lib/datadog/core/diagnostics/health.rb +2 -0
- data/lib/datadog/core/environment/class_count.rb +2 -0
- data/lib/datadog/core/environment/gc.rb +2 -0
- data/lib/datadog/core/environment/identity.rb +2 -0
- data/lib/datadog/core/environment/socket.rb +2 -0
- data/lib/datadog/core/environment/thread_count.rb +2 -0
- data/lib/datadog/core/environment/variable_helpers.rb +10 -2
- data/lib/datadog/core/environment/vm_cache.rb +2 -0
- data/lib/datadog/core/extensions.rb +2 -0
- data/lib/datadog/core/header_collection.rb +2 -0
- data/lib/datadog/core/metrics/helpers.rb +2 -0
- data/lib/datadog/core/metrics/metric.rb +2 -0
- data/lib/datadog/core/remote/client/capabilities.rb +57 -0
- data/lib/datadog/core/remote/client.rb +146 -0
- data/lib/datadog/core/remote/component.rb +150 -0
- data/lib/datadog/core/remote/configuration/content.rb +82 -0
- data/lib/datadog/core/remote/configuration/digest.rb +62 -0
- data/lib/datadog/core/remote/configuration/path.rb +90 -0
- data/lib/datadog/core/remote/configuration/repository.rb +278 -0
- data/lib/datadog/core/remote/configuration/target.rb +72 -0
- data/lib/datadog/core/remote/configuration.rb +18 -0
- data/lib/datadog/core/remote/dispatcher.rb +59 -0
- data/lib/datadog/core/remote/ext.rb +12 -0
- data/lib/datadog/core/remote/worker.rb +96 -0
- data/lib/datadog/core/remote.rb +24 -0
- data/lib/datadog/core/telemetry/collector.rb +8 -9
- data/lib/datadog/core/telemetry/heartbeat.rb +2 -0
- data/lib/datadog/core/telemetry/http/env.rb +2 -0
- data/lib/datadog/core/telemetry/http/transport.rb +2 -0
- data/lib/datadog/core/telemetry/v1/app_event.rb +2 -0
- data/lib/datadog/core/telemetry/v1/application.rb +7 -1
- data/lib/datadog/core/telemetry/v1/dependency.rb +7 -1
- data/lib/datadog/core/telemetry/v1/host.rb +9 -1
- data/lib/datadog/core/telemetry/v1/integration.rb +7 -1
- data/lib/datadog/core/telemetry/v1/product.rb +9 -1
- data/lib/datadog/core/telemetry/v1/telemetry_request.rb +7 -1
- data/lib/datadog/core/transport/config.rb +58 -0
- data/lib/datadog/core/transport/http/api/instance.rb +37 -0
- data/lib/datadog/core/transport/http/api/spec.rb +19 -0
- data/lib/datadog/core/transport/http/api.rb +57 -0
- data/lib/datadog/core/transport/http/builder.rb +217 -0
- data/lib/datadog/core/transport/http/client.rb +45 -0
- data/lib/datadog/core/transport/http/config.rb +268 -0
- data/lib/datadog/core/transport/http/negotiation.rb +144 -0
- data/lib/datadog/core/transport/http.rb +169 -0
- data/lib/datadog/core/transport/negotiation.rb +60 -0
- data/lib/datadog/core/utils/compression.rb +2 -0
- data/lib/datadog/core/utils/hash.rb +32 -0
- data/lib/datadog/core/utils/object_set.rb +2 -0
- data/lib/datadog/core/utils/safe_dup.rb +20 -2
- data/lib/datadog/core/utils/sequence.rb +2 -0
- data/lib/datadog/core/utils/time.rb +2 -0
- data/lib/datadog/core/worker.rb +2 -0
- data/lib/datadog/core/workers/interval_loop.rb +2 -0
- data/lib/datadog/core/workers/queue.rb +2 -0
- data/lib/datadog/core/workers/runtime_metrics.rb +2 -0
- data/lib/datadog/kit.rb +2 -0
- data/lib/datadog/opentracer/binary_propagator.rb +2 -0
- data/lib/datadog/opentracer/carrier.rb +2 -0
- data/lib/datadog/opentracer/global_tracer.rb +2 -0
- data/lib/datadog/opentracer/propagator.rb +2 -0
- data/lib/datadog/opentracer/scope.rb +2 -0
- data/lib/datadog/opentracer/scope_manager.rb +2 -0
- data/lib/datadog/opentracer/span_context.rb +2 -0
- data/lib/datadog/opentracer/span_context_factory.rb +2 -0
- data/lib/datadog/opentracer/thread_local_scope.rb +2 -0
- data/lib/datadog/opentracer.rb +2 -0
- data/lib/datadog/profiling/backtrace_location.rb +2 -0
- data/lib/datadog/profiling/buffer.rb +2 -0
- data/lib/datadog/profiling/collectors/cpu_and_wall_time_worker.rb +19 -3
- data/lib/datadog/profiling/collectors/dynamic_sampling_rate.rb +2 -0
- data/lib/datadog/profiling/collectors/idle_sampling_helper.rb +1 -1
- data/lib/datadog/profiling/collectors/stack.rb +2 -0
- data/lib/datadog/profiling/collectors/thread_context.rb +2 -2
- data/lib/datadog/profiling/component.rb +103 -29
- data/lib/datadog/profiling/event.rb +2 -0
- data/lib/datadog/profiling/events/stack.rb +2 -0
- data/lib/datadog/profiling/ext.rb +28 -26
- data/lib/datadog/profiling/flush.rb +2 -0
- data/lib/datadog/profiling/native_extension.rb +2 -0
- data/lib/datadog/profiling/pprof/message_set.rb +2 -0
- data/lib/datadog/profiling/pprof/payload.rb +2 -0
- data/lib/datadog/profiling/pprof/string_table.rb +2 -0
- data/lib/datadog/profiling/preload.rb +2 -0
- data/lib/datadog/profiling/scheduler.rb +3 -1
- data/lib/datadog/profiling/stack_recorder.rb +0 -18
- data/lib/datadog/profiling/tag_builder.rb +2 -0
- data/lib/datadog/profiling/tasks/setup.rb +0 -26
- data/lib/datadog/profiling.rb +2 -1
- data/lib/datadog/tracing/analytics.rb +2 -0
- data/lib/datadog/tracing/configuration/ext.rb +7 -0
- data/lib/datadog/tracing/configuration/settings.rb +14 -0
- data/lib/datadog/tracing/context.rb +2 -0
- data/lib/datadog/tracing/contrib/action_cable/configuration/settings.rb +2 -0
- data/lib/datadog/tracing/contrib/action_cable/event.rb +2 -0
- data/lib/datadog/tracing/contrib/action_cable/events.rb +2 -0
- data/lib/datadog/tracing/contrib/action_cable/patcher.rb +2 -0
- data/lib/datadog/tracing/contrib/action_mailer/configuration/settings.rb +2 -0
- data/lib/datadog/tracing/contrib/action_mailer/event.rb +2 -0
- data/lib/datadog/tracing/contrib/action_mailer/events.rb +2 -0
- data/lib/datadog/tracing/contrib/action_mailer/patcher.rb +2 -0
- data/lib/datadog/tracing/contrib/action_pack/action_controller/instrumentation.rb +2 -24
- data/lib/datadog/tracing/contrib/action_pack/action_controller/patcher.rb +2 -0
- data/lib/datadog/tracing/contrib/action_pack/configuration/settings.rb +14 -1
- data/lib/datadog/tracing/contrib/action_pack/patcher.rb +2 -0
- data/lib/datadog/tracing/contrib/action_view/event.rb +2 -0
- data/lib/datadog/tracing/contrib/action_view/events.rb +2 -0
- data/lib/datadog/tracing/contrib/active_job/configuration/settings.rb +2 -0
- data/lib/datadog/tracing/contrib/active_job/event.rb +2 -0
- data/lib/datadog/tracing/contrib/active_job/events.rb +2 -0
- data/lib/datadog/tracing/contrib/active_job/log_injection.rb +2 -0
- data/lib/datadog/tracing/contrib/active_job/patcher.rb +2 -0
- data/lib/datadog/tracing/contrib/active_model_serializers/configuration/settings.rb +2 -0
- data/lib/datadog/tracing/contrib/active_model_serializers/event.rb +2 -0
- data/lib/datadog/tracing/contrib/active_model_serializers/events.rb +2 -0
- data/lib/datadog/tracing/contrib/active_model_serializers/patcher.rb +2 -0
- data/lib/datadog/tracing/contrib/active_record/configuration/settings.rb +2 -0
- data/lib/datadog/tracing/contrib/active_record/event.rb +2 -0
- data/lib/datadog/tracing/contrib/active_record/events.rb +2 -0
- data/lib/datadog/tracing/contrib/active_record/patcher.rb +2 -0
- data/lib/datadog/tracing/contrib/active_support/cache/instrumentation.rb +2 -0
- data/lib/datadog/tracing/contrib/active_support/cache/patcher.rb +2 -0
- data/lib/datadog/tracing/contrib/active_support/cache/redis.rb +2 -0
- data/lib/datadog/tracing/contrib/active_support/configuration/settings.rb +2 -0
- data/lib/datadog/tracing/contrib/active_support/notifications/event.rb +2 -0
- data/lib/datadog/tracing/contrib/active_support/notifications/subscriber.rb +2 -0
- data/lib/datadog/tracing/contrib/active_support/patcher.rb +2 -0
- data/lib/datadog/tracing/contrib/analytics.rb +2 -0
- data/lib/datadog/tracing/contrib/auto_instrument.rb +2 -0
- data/lib/datadog/tracing/contrib/aws/configuration/settings.rb +9 -1
- data/lib/datadog/tracing/contrib/aws/instrumentation.rb +8 -2
- data/lib/datadog/tracing/contrib/aws/patcher.rb +2 -0
- data/lib/datadog/tracing/contrib/concurrent_ruby/configuration/settings.rb +2 -0
- data/lib/datadog/tracing/contrib/concurrent_ruby/context_composite_executor_service.rb +2 -0
- data/lib/datadog/tracing/contrib/concurrent_ruby/future_patch.rb +2 -0
- data/lib/datadog/tracing/contrib/concurrent_ruby/patcher.rb +2 -0
- data/lib/datadog/tracing/contrib/configurable.rb +2 -0
- data/lib/datadog/tracing/contrib/configuration/resolver.rb +2 -0
- data/lib/datadog/tracing/contrib/configuration/resolvers/pattern_resolver.rb +2 -0
- data/lib/datadog/tracing/contrib/dalli/configuration/settings.rb +2 -0
- data/lib/datadog/tracing/contrib/dalli/patcher.rb +2 -0
- data/lib/datadog/tracing/contrib/delayed_job/configuration/settings.rb +2 -0
- data/lib/datadog/tracing/contrib/delayed_job/patcher.rb +2 -0
- data/lib/datadog/tracing/contrib/delayed_job/plugin.rb +2 -0
- data/lib/datadog/tracing/contrib/delayed_job/server_internal_tracer/worker.rb +2 -0
- data/lib/datadog/tracing/contrib/elasticsearch/configuration/settings.rb +2 -0
- data/lib/datadog/tracing/contrib/ethon/configuration/settings.rb +2 -0
- data/lib/datadog/tracing/contrib/ethon/multi_patch.rb +2 -0
- data/lib/datadog/tracing/contrib/ethon/patcher.rb +2 -0
- data/lib/datadog/tracing/contrib/excon/configuration/settings.rb +2 -0
- data/lib/datadog/tracing/contrib/excon/patcher.rb +2 -0
- data/lib/datadog/tracing/contrib/faraday/configuration/settings.rb +2 -0
- data/lib/datadog/tracing/contrib/faraday/connection.rb +2 -0
- data/lib/datadog/tracing/contrib/faraday/rack_builder.rb +2 -0
- data/lib/datadog/tracing/contrib/grape/configuration/settings.rb +2 -0
- data/lib/datadog/tracing/contrib/grape/patcher.rb +2 -0
- data/lib/datadog/tracing/contrib/graphql/configuration/settings.rb +2 -0
- data/lib/datadog/tracing/contrib/grpc/configuration/settings.rb +2 -0
- data/lib/datadog/tracing/contrib/grpc/intercept_with_datadog.rb +2 -0
- data/lib/datadog/tracing/contrib/grpc/patcher.rb +2 -0
- data/lib/datadog/tracing/contrib/hanami/action_tracer.rb +2 -0
- data/lib/datadog/tracing/contrib/hanami/configuration/settings.rb +2 -0
- data/lib/datadog/tracing/contrib/hanami/patcher.rb +2 -0
- data/lib/datadog/tracing/contrib/hanami/plugin.rb +2 -0
- data/lib/datadog/tracing/contrib/hanami/renderer_policy_tracing.rb +2 -0
- data/lib/datadog/tracing/contrib/hanami/router_tracing.rb +2 -0
- data/lib/datadog/tracing/contrib/http/circuit_breaker.rb +2 -0
- data/lib/datadog/tracing/contrib/http/configuration/settings.rb +2 -0
- data/lib/datadog/tracing/contrib/http/integration.rb +2 -0
- data/lib/datadog/tracing/contrib/http/patcher.rb +2 -0
- data/lib/datadog/tracing/contrib/http_annotation_helper.rb +2 -0
- data/lib/datadog/tracing/contrib/httpclient/configuration/settings.rb +2 -0
- data/lib/datadog/tracing/contrib/httprb/configuration/settings.rb +2 -0
- data/lib/datadog/tracing/contrib/integration.rb +2 -0
- data/lib/datadog/tracing/contrib/kafka/configuration/settings.rb +2 -0
- data/lib/datadog/tracing/contrib/kafka/consumer_event.rb +2 -0
- data/lib/datadog/tracing/contrib/kafka/consumer_group_event.rb +2 -0
- data/lib/datadog/tracing/contrib/kafka/event.rb +2 -0
- data/lib/datadog/tracing/contrib/kafka/events.rb +2 -0
- data/lib/datadog/tracing/contrib/kafka/patcher.rb +2 -0
- data/lib/datadog/tracing/contrib/lograge/configuration/settings.rb +2 -0
- data/lib/datadog/tracing/contrib/lograge/instrumentation.rb +2 -0
- data/lib/datadog/tracing/contrib/lograge/patcher.rb +2 -0
- data/lib/datadog/tracing/contrib/mongodb/configuration/settings.rb +2 -0
- data/lib/datadog/tracing/contrib/mongodb/instrumentation.rb +2 -0
- data/lib/datadog/tracing/contrib/mongodb/patcher.rb +2 -0
- data/lib/datadog/tracing/contrib/mysql2/configuration/settings.rb +2 -0
- data/lib/datadog/tracing/contrib/mysql2/instrumentation.rb +2 -0
- data/lib/datadog/tracing/contrib/mysql2/patcher.rb +2 -0
- data/lib/datadog/tracing/contrib/patchable.rb +2 -0
- data/lib/datadog/tracing/contrib/pg/configuration/settings.rb +2 -0
- data/lib/datadog/tracing/contrib/pg/instrumentation.rb +2 -0
- data/lib/datadog/tracing/contrib/pg/patcher.rb +2 -0
- data/lib/datadog/tracing/contrib/presto/configuration/settings.rb +2 -0
- data/lib/datadog/tracing/contrib/propagation/sql_comment/mode.rb +2 -0
- data/lib/datadog/tracing/contrib/qless/configuration/settings.rb +2 -0
- data/lib/datadog/tracing/contrib/qless/patcher.rb +2 -0
- data/lib/datadog/tracing/contrib/qless/tracer_cleaner.rb +2 -0
- data/lib/datadog/tracing/contrib/racecar/configuration/settings.rb +2 -0
- data/lib/datadog/tracing/contrib/racecar/event.rb +2 -0
- data/lib/datadog/tracing/contrib/racecar/events.rb +2 -0
- data/lib/datadog/tracing/contrib/racecar/patcher.rb +2 -0
- data/lib/datadog/tracing/contrib/rails/configuration/settings.rb +9 -2
- data/lib/datadog/tracing/contrib/rails/framework.rb +2 -0
- data/lib/datadog/tracing/contrib/rails/middlewares.rb +2 -0
- data/lib/datadog/tracing/contrib/rails/utils.rb +3 -1
- data/lib/datadog/tracing/contrib/rake/configuration/settings.rb +2 -0
- data/lib/datadog/tracing/contrib/rake/patcher.rb +2 -0
- data/lib/datadog/tracing/contrib/redis/configuration/settings.rb +2 -0
- data/lib/datadog/tracing/contrib/redis/tags.rb +2 -0
- data/lib/datadog/tracing/contrib/registerable.rb +2 -0
- data/lib/datadog/tracing/contrib/registry.rb +2 -0
- data/lib/datadog/tracing/contrib/resque/configuration/settings.rb +2 -0
- data/lib/datadog/tracing/contrib/resque/patcher.rb +2 -0
- data/lib/datadog/tracing/contrib/resque/resque_job.rb +2 -0
- data/lib/datadog/tracing/contrib/rest_client/configuration/settings.rb +2 -0
- data/lib/datadog/tracing/contrib/rest_client/patcher.rb +2 -0
- data/lib/datadog/tracing/contrib/rest_client/request_patch.rb +2 -0
- data/lib/datadog/tracing/contrib/roda/configuration/settings.rb +34 -0
- data/lib/datadog/tracing/contrib/roda/ext.rb +18 -0
- data/lib/datadog/tracing/contrib/roda/instrumentation.rb +76 -0
- data/lib/datadog/tracing/contrib/roda/integration.rb +45 -0
- data/lib/datadog/tracing/contrib/roda/patcher.rb +30 -0
- data/lib/datadog/tracing/contrib/semantic_logger/configuration/settings.rb +2 -0
- data/lib/datadog/tracing/contrib/semantic_logger/instrumentation.rb +3 -0
- data/lib/datadog/tracing/contrib/semantic_logger/patcher.rb +2 -0
- data/lib/datadog/tracing/contrib/sequel/configuration/settings.rb +2 -0
- data/lib/datadog/tracing/contrib/sequel/dataset.rb +2 -0
- data/lib/datadog/tracing/contrib/sequel/patcher.rb +2 -0
- data/lib/datadog/tracing/contrib/shoryuken/configuration/settings.rb +2 -0
- data/lib/datadog/tracing/contrib/shoryuken/patcher.rb +2 -0
- data/lib/datadog/tracing/contrib/shoryuken/tracer.rb +2 -0
- data/lib/datadog/tracing/contrib/sidekiq/client_tracer.rb +12 -3
- data/lib/datadog/tracing/contrib/sidekiq/configuration/settings.rb +3 -0
- data/lib/datadog/tracing/contrib/sidekiq/distributed/propagation.rb +38 -0
- data/lib/datadog/tracing/contrib/sidekiq/patcher.rb +2 -0
- data/lib/datadog/tracing/contrib/sidekiq/server_internal_tracer/heartbeat.rb +2 -0
- data/lib/datadog/tracing/contrib/sidekiq/server_internal_tracer/job_fetch.rb +2 -0
- data/lib/datadog/tracing/contrib/sidekiq/server_internal_tracer/redis_info.rb +2 -0
- data/lib/datadog/tracing/contrib/sidekiq/server_internal_tracer/scheduled_poller.rb +2 -0
- data/lib/datadog/tracing/contrib/sidekiq/server_tracer.rb +18 -2
- data/lib/datadog/tracing/contrib/sidekiq/{tracing.rb → utils.rb} +3 -1
- data/lib/datadog/tracing/contrib/sinatra/headers.rb +2 -0
- data/lib/datadog/tracing/contrib/sinatra/patcher.rb +2 -0
- data/lib/datadog/tracing/contrib/sinatra/tracer_middleware.rb +2 -0
- data/lib/datadog/tracing/contrib/span_attribute_schema.rb +28 -0
- data/lib/datadog/tracing/contrib/sucker_punch/configuration/settings.rb +2 -0
- data/lib/datadog/tracing/contrib/sucker_punch/exception_handler.rb +2 -0
- data/lib/datadog/tracing/contrib/sucker_punch/patcher.rb +2 -0
- data/lib/datadog/tracing/contrib/utils/quantization/http.rb +2 -2
- data/lib/datadog/tracing/contrib.rb +3 -0
- data/lib/datadog/tracing/correlation.rb +10 -10
- data/lib/datadog/tracing/diagnostics/health.rb +2 -0
- data/lib/datadog/tracing/distributed/trace_context.rb +22 -15
- data/lib/datadog/tracing/flush.rb +2 -0
- data/lib/datadog/tracing/metadata/analytics.rb +2 -0
- data/lib/datadog/tracing/metadata/errors.rb +2 -0
- data/lib/datadog/tracing/metadata/ext.rb +6 -0
- data/lib/datadog/tracing/metadata.rb +2 -0
- data/lib/datadog/tracing/pipeline/span_filter.rb +2 -0
- data/lib/datadog/tracing/pipeline/span_processor.rb +2 -0
- data/lib/datadog/tracing/propagation/http.rb +2 -0
- data/lib/datadog/tracing/runtime/metrics.rb +2 -0
- data/lib/datadog/tracing/sampling/all_sampler.rb +2 -0
- data/lib/datadog/tracing/sampling/matcher.rb +2 -0
- data/lib/datadog/tracing/sampling/priority_sampler.rb +2 -0
- data/lib/datadog/tracing/sampling/span/sampler.rb +2 -0
- data/lib/datadog/tracing/sync_writer.rb +2 -0
- data/lib/datadog/tracing/trace_digest.rb +2 -0
- data/lib/datadog/tracing/utils.rb +2 -0
- data/lib/datadog/tracing.rb +2 -0
- data/lib/ddtrace/auto_instrument.rb +2 -0
- data/lib/ddtrace/auto_instrument_base.rb +2 -0
- data/lib/ddtrace/transport/http/adapters/net.rb +12 -0
- data/lib/ddtrace/transport/http/adapters/registry.rb +2 -0
- data/lib/ddtrace/transport/http/api/endpoint.rb +2 -0
- data/lib/ddtrace/transport/http/api/fallbacks.rb +2 -0
- data/lib/ddtrace/transport/http/api/instance.rb +2 -0
- data/lib/ddtrace/transport/http/api/map.rb +2 -0
- data/lib/ddtrace/transport/http/api/spec.rb +2 -0
- data/lib/ddtrace/transport/http/env.rb +2 -0
- data/lib/ddtrace/transport/http/response.rb +2 -0
- data/lib/ddtrace/transport/io/response.rb +2 -0
- data/lib/ddtrace/transport/io/traces.rb +2 -0
- data/lib/ddtrace/transport/io.rb +2 -0
- data/lib/ddtrace/transport/parcel.rb +2 -0
- data/lib/ddtrace/transport/request.rb +3 -1
- data/lib/ddtrace/transport/statistics.rb +2 -0
- data/lib/ddtrace/transport/trace_formatter.rb +2 -0
- data/lib/ddtrace/version.rb +7 -5
- data/lib/ddtrace.rb +2 -0
- metadata +38 -4
|
@@ -0,0 +1,57 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
require_relative '../../../appsec/remote'
|
|
4
|
+
|
|
5
|
+
module Datadog
|
|
6
|
+
module Core
|
|
7
|
+
module Remote
|
|
8
|
+
class Client
|
|
9
|
+
# Capbailities
|
|
10
|
+
class Capabilities
|
|
11
|
+
attr_reader :products, :capabilities, :receivers, :base64_capabilities
|
|
12
|
+
|
|
13
|
+
def initialize(settings)
|
|
14
|
+
@capabilities = []
|
|
15
|
+
@products = []
|
|
16
|
+
@receivers = []
|
|
17
|
+
|
|
18
|
+
register(settings)
|
|
19
|
+
|
|
20
|
+
@base64_capabilities = capabilities_to_base64
|
|
21
|
+
end
|
|
22
|
+
|
|
23
|
+
private
|
|
24
|
+
|
|
25
|
+
def register(settings)
|
|
26
|
+
if settings.appsec.enabled
|
|
27
|
+
register_capabilities(Datadog::AppSec::Remote.capabilities)
|
|
28
|
+
register_products(Datadog::AppSec::Remote.products)
|
|
29
|
+
register_receivers(Datadog::AppSec::Remote.receivers)
|
|
30
|
+
end
|
|
31
|
+
end
|
|
32
|
+
|
|
33
|
+
def register_capabilities(capabilities)
|
|
34
|
+
@capabilities.concat(capabilities)
|
|
35
|
+
end
|
|
36
|
+
|
|
37
|
+
def register_receivers(receivers)
|
|
38
|
+
@receivers.concat(receivers)
|
|
39
|
+
end
|
|
40
|
+
|
|
41
|
+
def register_products(products)
|
|
42
|
+
@products.concat(products)
|
|
43
|
+
end
|
|
44
|
+
|
|
45
|
+
def capabilities_to_base64
|
|
46
|
+
return '' if capabilities.empty?
|
|
47
|
+
|
|
48
|
+
cap_to_hexs = capabilities.reduce(:|).to_s(16).tap { |s| s.size.odd? && s.prepend('0') }.scan(/\h\h/)
|
|
49
|
+
binary = cap_to_hexs.each_with_object([]) { |hex, acc| acc << hex }.map { |e| e.to_i(16) }.pack('C*')
|
|
50
|
+
|
|
51
|
+
Base64.encode64(binary).chomp
|
|
52
|
+
end
|
|
53
|
+
end
|
|
54
|
+
end
|
|
55
|
+
end
|
|
56
|
+
end
|
|
57
|
+
end
|
|
@@ -0,0 +1,146 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
require 'securerandom'
|
|
4
|
+
|
|
5
|
+
require_relative 'configuration'
|
|
6
|
+
require_relative 'dispatcher'
|
|
7
|
+
|
|
8
|
+
module Datadog
|
|
9
|
+
module Core
|
|
10
|
+
module Remote
|
|
11
|
+
# Client communicates with the agent and sync remote configuration
|
|
12
|
+
class Client
|
|
13
|
+
class SyncError < StandardError; end
|
|
14
|
+
|
|
15
|
+
attr_reader :transport, :repository, :id, :dispatcher
|
|
16
|
+
|
|
17
|
+
def initialize(transport, capabilities, repository: Configuration::Repository.new)
|
|
18
|
+
@transport = transport
|
|
19
|
+
|
|
20
|
+
@repository = repository
|
|
21
|
+
@id = SecureRandom.uuid
|
|
22
|
+
@dispatcher = Dispatcher.new
|
|
23
|
+
@capabilities = capabilities
|
|
24
|
+
|
|
25
|
+
@capabilities.receivers.each do |receiver|
|
|
26
|
+
dispatcher.receivers << receiver
|
|
27
|
+
end
|
|
28
|
+
end
|
|
29
|
+
|
|
30
|
+
# rubocop:disable Metrics/AbcSize,Metrics/PerceivedComplexity
|
|
31
|
+
def sync
|
|
32
|
+
# TODO: Skip sync if no capabilities are registered
|
|
33
|
+
response = transport.send_config(payload)
|
|
34
|
+
|
|
35
|
+
if response.ok?
|
|
36
|
+
# when response is completely empty, do nothing as in: leave as is
|
|
37
|
+
if response.empty?
|
|
38
|
+
Datadog.logger.debug { 'remote: empty response => NOOP' }
|
|
39
|
+
|
|
40
|
+
return
|
|
41
|
+
end
|
|
42
|
+
|
|
43
|
+
paths = response.client_configs.map do |path|
|
|
44
|
+
Configuration::Path.parse(path)
|
|
45
|
+
end
|
|
46
|
+
|
|
47
|
+
targets = Configuration::TargetMap.parse(response.targets)
|
|
48
|
+
|
|
49
|
+
contents = Configuration::ContentList.parse(response.target_files)
|
|
50
|
+
|
|
51
|
+
# TODO: sometimes it can strangely be so that paths.empty?
|
|
52
|
+
# TODO: sometimes it can strangely be so that targets.empty?
|
|
53
|
+
|
|
54
|
+
changes = repository.transaction do |current, transaction|
|
|
55
|
+
# paths to be removed: previously applied paths minus ingress paths
|
|
56
|
+
(current.paths - paths).each { |p| transaction.delete(p) }
|
|
57
|
+
|
|
58
|
+
# go through each ingress path
|
|
59
|
+
paths.each do |path|
|
|
60
|
+
# match target with path
|
|
61
|
+
target = targets[path]
|
|
62
|
+
|
|
63
|
+
# abort entirely if matching target not found
|
|
64
|
+
raise SyncError, "no target for path '#{path}'" if target.nil?
|
|
65
|
+
|
|
66
|
+
# new paths are not in previously applied paths
|
|
67
|
+
new = !current.paths.include?(path)
|
|
68
|
+
|
|
69
|
+
# updated paths are in previously applied paths
|
|
70
|
+
# but the content hash changed
|
|
71
|
+
changed = current.paths.include?(path) && !current.contents.find_content(path, target)
|
|
72
|
+
|
|
73
|
+
# skip if unchanged
|
|
74
|
+
same = !new && !changed
|
|
75
|
+
|
|
76
|
+
next if same
|
|
77
|
+
|
|
78
|
+
# match content with path and target
|
|
79
|
+
content = contents.find_content(path, target)
|
|
80
|
+
|
|
81
|
+
# abort entirely if matching content not found
|
|
82
|
+
raise SyncError, "no valid content for target at path '#{path}'" if content.nil?
|
|
83
|
+
|
|
84
|
+
# to be added or updated << config
|
|
85
|
+
# TODO: metadata (hash, version, etc...)
|
|
86
|
+
transaction.insert(path, target, content) if new
|
|
87
|
+
transaction.update(path, target, content) if changed
|
|
88
|
+
end
|
|
89
|
+
|
|
90
|
+
# save backend opaque backend state
|
|
91
|
+
transaction.set(opaque_backend_state: targets.opaque_backend_state)
|
|
92
|
+
transaction.set(targets_version: targets.version)
|
|
93
|
+
|
|
94
|
+
# upon transaction end, new list of applied config + metadata (add, change, remove) will be saved
|
|
95
|
+
# TODO: also remove stale config (matching removed) from cache (client configs is exhaustive list of paths)
|
|
96
|
+
end
|
|
97
|
+
|
|
98
|
+
if changes.empty?
|
|
99
|
+
Datadog.logger.debug { 'remote: no changes' }
|
|
100
|
+
else
|
|
101
|
+
dispatcher.dispatch(changes, repository)
|
|
102
|
+
end
|
|
103
|
+
else
|
|
104
|
+
raise SyncError, "unexpected transport response: #{response.inspect}"
|
|
105
|
+
end
|
|
106
|
+
end
|
|
107
|
+
# rubocop:enable Metrics/AbcSize,Metrics/PerceivedComplexity
|
|
108
|
+
|
|
109
|
+
private
|
|
110
|
+
|
|
111
|
+
def payload
|
|
112
|
+
state = repository.state
|
|
113
|
+
|
|
114
|
+
{
|
|
115
|
+
client: {
|
|
116
|
+
state: {
|
|
117
|
+
root_version: state.root_version,
|
|
118
|
+
targets_version: state.targets_version,
|
|
119
|
+
config_states: state.config_states,
|
|
120
|
+
has_error: state.has_error,
|
|
121
|
+
error: state.error,
|
|
122
|
+
backend_client_state: state.opaque_backend_state,
|
|
123
|
+
},
|
|
124
|
+
id: id,
|
|
125
|
+
products: @capabilities.products,
|
|
126
|
+
is_tracer: true,
|
|
127
|
+
is_agent: false,
|
|
128
|
+
client_tracer: {
|
|
129
|
+
runtime_id: Core::Environment::Identity.id,
|
|
130
|
+
language: Core::Environment::Identity.lang,
|
|
131
|
+
tracer_version: Core::Environment::Identity.tracer_version,
|
|
132
|
+
service: Datadog.configuration.service,
|
|
133
|
+
env: Datadog.configuration.env,
|
|
134
|
+
# app_version: app_version, # TODO: I don't know what this is
|
|
135
|
+
tags: [], # TODO: add nice tags!
|
|
136
|
+
},
|
|
137
|
+
# base64 is needed otherwise the Go agent fails with an unmarshal error
|
|
138
|
+
capabilities: @capabilities.base64_capabilities
|
|
139
|
+
},
|
|
140
|
+
cached_target_files: state.cached_target_files,
|
|
141
|
+
}
|
|
142
|
+
end
|
|
143
|
+
end
|
|
144
|
+
end
|
|
145
|
+
end
|
|
146
|
+
end
|
|
@@ -0,0 +1,150 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
require_relative 'worker'
|
|
4
|
+
require_relative 'client/capabilities'
|
|
5
|
+
require_relative 'client'
|
|
6
|
+
require_relative '../transport/http'
|
|
7
|
+
require_relative '../remote'
|
|
8
|
+
|
|
9
|
+
module Datadog
|
|
10
|
+
module Core
|
|
11
|
+
module Remote
|
|
12
|
+
# Configures the HTTP transport to communicate with the agent
|
|
13
|
+
# to fetch and sync the remote configuration
|
|
14
|
+
class Component
|
|
15
|
+
BARRIER_TIMEOUT = 1.0 # second
|
|
16
|
+
|
|
17
|
+
attr_reader :client
|
|
18
|
+
|
|
19
|
+
def initialize(settings, agent_settings)
|
|
20
|
+
transport_options = {}
|
|
21
|
+
transport_options[:agent_settings] = agent_settings if agent_settings
|
|
22
|
+
|
|
23
|
+
transport_v7 = Datadog::Core::Transport::HTTP.v7(**transport_options.dup)
|
|
24
|
+
|
|
25
|
+
capabilities = Client::Capabilities.new(settings)
|
|
26
|
+
|
|
27
|
+
@barrier = Barrier.new(BARRIER_TIMEOUT)
|
|
28
|
+
|
|
29
|
+
@client = Client.new(transport_v7, capabilities)
|
|
30
|
+
@worker = Worker.new(interval: settings.remote.poll_interval_seconds) do
|
|
31
|
+
begin
|
|
32
|
+
@client.sync
|
|
33
|
+
rescue StandardError => e
|
|
34
|
+
Datadog.logger.error do
|
|
35
|
+
"remote worker error: #{e.class.name} #{e.message} location: #{Array(e.backtrace).first}"
|
|
36
|
+
end
|
|
37
|
+
|
|
38
|
+
# client state is unknown, state might be corrupted
|
|
39
|
+
@client = Client.new(transport_v7, capabilities)
|
|
40
|
+
|
|
41
|
+
# TODO: bail out if too many errors?
|
|
42
|
+
end
|
|
43
|
+
|
|
44
|
+
@barrier.lift
|
|
45
|
+
end
|
|
46
|
+
end
|
|
47
|
+
|
|
48
|
+
def barrier(kind)
|
|
49
|
+
@worker.start
|
|
50
|
+
|
|
51
|
+
case kind
|
|
52
|
+
when :once
|
|
53
|
+
@barrier.wait_once
|
|
54
|
+
end
|
|
55
|
+
end
|
|
56
|
+
|
|
57
|
+
def shutdown!
|
|
58
|
+
@worker.stop
|
|
59
|
+
end
|
|
60
|
+
|
|
61
|
+
# Barrier provides a mechanism to fence execution until a condition happens
|
|
62
|
+
class Barrier
|
|
63
|
+
def initialize(timeout = nil)
|
|
64
|
+
@once = false
|
|
65
|
+
@timeout = timeout
|
|
66
|
+
|
|
67
|
+
@mutex = Mutex.new
|
|
68
|
+
@condition = ConditionVariable.new
|
|
69
|
+
end
|
|
70
|
+
|
|
71
|
+
# Wait for first lift to happen, otherwise don't wait
|
|
72
|
+
def wait_once(timeout = nil)
|
|
73
|
+
# TTAS (Test and Test-And-Set) optimisation
|
|
74
|
+
# Since @once only ever goes from false to true, this is semantically valid
|
|
75
|
+
return if @once
|
|
76
|
+
|
|
77
|
+
begin
|
|
78
|
+
@mutex.lock
|
|
79
|
+
|
|
80
|
+
return if @once
|
|
81
|
+
|
|
82
|
+
timeout ||= @timeout
|
|
83
|
+
|
|
84
|
+
# rbs/core has a bug, timeout type is incorrectly ?Integer
|
|
85
|
+
@condition.wait(@mutex, _ = timeout)
|
|
86
|
+
ensure
|
|
87
|
+
@mutex.unlock
|
|
88
|
+
end
|
|
89
|
+
end
|
|
90
|
+
|
|
91
|
+
# Wait for next lift to happen
|
|
92
|
+
def wait_next(timeout = nil)
|
|
93
|
+
@mutex.lock
|
|
94
|
+
|
|
95
|
+
timeout ||= @timeout
|
|
96
|
+
|
|
97
|
+
# rbs/core has a bug, timeout type is incorrectly ?Integer
|
|
98
|
+
@condition.wait(@mutex, _ = timeout)
|
|
99
|
+
ensure
|
|
100
|
+
@mutex.unlock
|
|
101
|
+
end
|
|
102
|
+
|
|
103
|
+
# Release all current waiters
|
|
104
|
+
def lift
|
|
105
|
+
@mutex.lock
|
|
106
|
+
|
|
107
|
+
@once ||= true
|
|
108
|
+
|
|
109
|
+
@condition.broadcast
|
|
110
|
+
ensure
|
|
111
|
+
@mutex.unlock
|
|
112
|
+
end
|
|
113
|
+
end
|
|
114
|
+
|
|
115
|
+
class << self
|
|
116
|
+
def build(settings, agent_settings)
|
|
117
|
+
return unless settings.remote.enabled
|
|
118
|
+
|
|
119
|
+
transport_options = {}
|
|
120
|
+
transport_options[:agent_settings] = agent_settings if agent_settings
|
|
121
|
+
|
|
122
|
+
transport_root = Datadog::Core::Transport::HTTP.root(**transport_options.dup)
|
|
123
|
+
|
|
124
|
+
res = transport_root.send_info
|
|
125
|
+
if res.ok?
|
|
126
|
+
if res.endpoints.include?('/v0.7/config')
|
|
127
|
+
Datadog.logger.debug { 'agent reachable and reports remote configuration endpoint' }
|
|
128
|
+
else
|
|
129
|
+
Datadog.logger.error do
|
|
130
|
+
'agent reachable but does not report remote configuration endpoint: ' \
|
|
131
|
+
'disabling remote configuration for this process.'
|
|
132
|
+
end
|
|
133
|
+
|
|
134
|
+
return
|
|
135
|
+
end
|
|
136
|
+
else
|
|
137
|
+
Datadog.logger.error do
|
|
138
|
+
'agent unreachable: disabling remote configuration for this process.'
|
|
139
|
+
end
|
|
140
|
+
|
|
141
|
+
return
|
|
142
|
+
end
|
|
143
|
+
|
|
144
|
+
new(settings, agent_settings)
|
|
145
|
+
end
|
|
146
|
+
end
|
|
147
|
+
end
|
|
148
|
+
end
|
|
149
|
+
end
|
|
150
|
+
end
|
|
@@ -0,0 +1,82 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
require_relative 'path'
|
|
4
|
+
require_relative 'digest'
|
|
5
|
+
|
|
6
|
+
module Datadog
|
|
7
|
+
module Core
|
|
8
|
+
module Remote
|
|
9
|
+
class Configuration
|
|
10
|
+
# Content stores the information associated with a specific Configuration::Path
|
|
11
|
+
class Content
|
|
12
|
+
class << self
|
|
13
|
+
def parse(hash)
|
|
14
|
+
path = Path.parse(hash[:path])
|
|
15
|
+
data = hash[:content]
|
|
16
|
+
|
|
17
|
+
new(path: path, data: data)
|
|
18
|
+
end
|
|
19
|
+
end
|
|
20
|
+
|
|
21
|
+
attr_reader :path, :data, :hashes
|
|
22
|
+
|
|
23
|
+
def initialize(path:, data:)
|
|
24
|
+
@path = path
|
|
25
|
+
@data = data
|
|
26
|
+
@hashes = {}
|
|
27
|
+
end
|
|
28
|
+
|
|
29
|
+
def hexdigest(type)
|
|
30
|
+
@hashes[type] || compute_and_store_hash(type)
|
|
31
|
+
end
|
|
32
|
+
|
|
33
|
+
def length
|
|
34
|
+
@length ||= @data.size
|
|
35
|
+
end
|
|
36
|
+
|
|
37
|
+
private
|
|
38
|
+
|
|
39
|
+
def compute_and_store_hash(type)
|
|
40
|
+
@hashes[type] = Digest.hexdigest(type, @data)
|
|
41
|
+
end
|
|
42
|
+
|
|
43
|
+
private_class_method :new
|
|
44
|
+
end
|
|
45
|
+
|
|
46
|
+
# ContentList stores a list of Conetnt instances
|
|
47
|
+
# It provides convinient methods for finding content base on Configuration::Path and Configuration::Target
|
|
48
|
+
class ContentList < Array
|
|
49
|
+
class << self
|
|
50
|
+
def parse(array)
|
|
51
|
+
new.concat(array.map { |c| Content.parse(c) })
|
|
52
|
+
end
|
|
53
|
+
end
|
|
54
|
+
|
|
55
|
+
def find_content(path, target)
|
|
56
|
+
find { |c| c.path.eql?(path) && target.check(c) }
|
|
57
|
+
end
|
|
58
|
+
|
|
59
|
+
def [](path)
|
|
60
|
+
find { |c| c.path.eql?(path) }
|
|
61
|
+
end
|
|
62
|
+
|
|
63
|
+
def []=(path, content)
|
|
64
|
+
map! { |c| c.path.eql?(path) ? content : c }
|
|
65
|
+
end
|
|
66
|
+
|
|
67
|
+
def delete(path)
|
|
68
|
+
idx = index { |e| e.path.eql?(path) }
|
|
69
|
+
|
|
70
|
+
return if idx.nil?
|
|
71
|
+
|
|
72
|
+
delete_at(idx)
|
|
73
|
+
end
|
|
74
|
+
|
|
75
|
+
def paths
|
|
76
|
+
map(&:path).uniq
|
|
77
|
+
end
|
|
78
|
+
end
|
|
79
|
+
end
|
|
80
|
+
end
|
|
81
|
+
end
|
|
82
|
+
end
|
|
@@ -0,0 +1,62 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
require 'digest'
|
|
4
|
+
|
|
5
|
+
module Datadog
|
|
6
|
+
module Core
|
|
7
|
+
module Remote
|
|
8
|
+
class Configuration
|
|
9
|
+
# Represent a list of Configuration::Digest
|
|
10
|
+
class DigestList < Array
|
|
11
|
+
class << self
|
|
12
|
+
def parse(hash)
|
|
13
|
+
new.concat(hash.map { |type, hexdigest| Digest.new(type, hexdigest) })
|
|
14
|
+
end
|
|
15
|
+
end
|
|
16
|
+
|
|
17
|
+
def check(content)
|
|
18
|
+
map { |digest| digest.check(content) }.reduce(:&)
|
|
19
|
+
end
|
|
20
|
+
end
|
|
21
|
+
|
|
22
|
+
# Stores and validates different cryptographic hash functions
|
|
23
|
+
class Digest
|
|
24
|
+
class InvalidHashTypeError < StandardError; end
|
|
25
|
+
attr_reader :type, :hexdigest
|
|
26
|
+
|
|
27
|
+
DIGEST_CHUNK = 1024
|
|
28
|
+
|
|
29
|
+
class << self
|
|
30
|
+
def hexdigest(type, data)
|
|
31
|
+
d = case type
|
|
32
|
+
when :sha256
|
|
33
|
+
::Digest::SHA256.new
|
|
34
|
+
when :sha512
|
|
35
|
+
::Digest::SHA512.new
|
|
36
|
+
else
|
|
37
|
+
raise InvalidHashTypeError, type
|
|
38
|
+
end
|
|
39
|
+
|
|
40
|
+
while (buf = data.read(DIGEST_CHUNK))
|
|
41
|
+
d.update(buf)
|
|
42
|
+
end
|
|
43
|
+
|
|
44
|
+
d.hexdigest
|
|
45
|
+
ensure
|
|
46
|
+
data.rewind
|
|
47
|
+
end
|
|
48
|
+
end
|
|
49
|
+
|
|
50
|
+
def initialize(type, hexdigest)
|
|
51
|
+
@type = type.to_sym
|
|
52
|
+
@hexdigest = hexdigest
|
|
53
|
+
end
|
|
54
|
+
|
|
55
|
+
def check(content)
|
|
56
|
+
content.hexdigest(@type) == hexdigest
|
|
57
|
+
end
|
|
58
|
+
end
|
|
59
|
+
end
|
|
60
|
+
end
|
|
61
|
+
end
|
|
62
|
+
end
|
|
@@ -0,0 +1,90 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
module Datadog
|
|
4
|
+
module Core
|
|
5
|
+
module Remote
|
|
6
|
+
class Configuration
|
|
7
|
+
# Path stores path information
|
|
8
|
+
class Path
|
|
9
|
+
class ParseError < StandardError; end
|
|
10
|
+
|
|
11
|
+
class << self
|
|
12
|
+
RE = %r{
|
|
13
|
+
^
|
|
14
|
+
(?<source>
|
|
15
|
+
datadog/(?<org_id>\d+)
|
|
16
|
+
|
|
|
17
|
+
employee
|
|
18
|
+
)
|
|
19
|
+
/
|
|
20
|
+
(?<product>[^/]+)
|
|
21
|
+
/
|
|
22
|
+
(?<config_id>[^/]+)
|
|
23
|
+
/
|
|
24
|
+
(?<name>[^/]+)
|
|
25
|
+
$
|
|
26
|
+
}mx.freeze
|
|
27
|
+
|
|
28
|
+
def parse(path)
|
|
29
|
+
m = RE.match(path)
|
|
30
|
+
|
|
31
|
+
raise ParseError, "could not parse: #{path.inspect}" if m.nil?
|
|
32
|
+
|
|
33
|
+
org_id = m['org_id'] ? m['org_id'].to_i : nil
|
|
34
|
+
|
|
35
|
+
source = m['source']
|
|
36
|
+
raise ParseError, 'missing source value' unless source
|
|
37
|
+
|
|
38
|
+
source = source.delete("/#{org_id}") if org_id
|
|
39
|
+
|
|
40
|
+
product = m['product']
|
|
41
|
+
raise ParseError, 'missing product value' unless product
|
|
42
|
+
|
|
43
|
+
config_id = m['config_id']
|
|
44
|
+
raise ParseError, 'missing config_id value' unless config_id
|
|
45
|
+
|
|
46
|
+
name = m['name']
|
|
47
|
+
raise ParseError, 'missing name value' unless name
|
|
48
|
+
|
|
49
|
+
new(source: source, org_id: org_id, product: product, config_id: config_id, name: name)
|
|
50
|
+
end
|
|
51
|
+
end
|
|
52
|
+
|
|
53
|
+
attr_reader :source, :org_id, :product, :config_id, :name
|
|
54
|
+
|
|
55
|
+
def initialize(source:, product:, config_id:, name:, org_id: nil)
|
|
56
|
+
@source = source
|
|
57
|
+
@org_id = org_id
|
|
58
|
+
@product = product
|
|
59
|
+
@config_id = config_id
|
|
60
|
+
@name = name
|
|
61
|
+
end
|
|
62
|
+
|
|
63
|
+
private_class_method :new
|
|
64
|
+
|
|
65
|
+
def to_s
|
|
66
|
+
if org_id
|
|
67
|
+
"#{source}/#{org_id}/#{product}/#{config_id}/#{name}"
|
|
68
|
+
else
|
|
69
|
+
"#{source}/#{product}/#{config_id}/#{name}"
|
|
70
|
+
end
|
|
71
|
+
end
|
|
72
|
+
|
|
73
|
+
def ==(other)
|
|
74
|
+
return false unless other.is_a?(Path)
|
|
75
|
+
|
|
76
|
+
to_s == other.to_s
|
|
77
|
+
end
|
|
78
|
+
|
|
79
|
+
def hash
|
|
80
|
+
to_s.hash
|
|
81
|
+
end
|
|
82
|
+
|
|
83
|
+
def eql?(other)
|
|
84
|
+
hash == other.hash
|
|
85
|
+
end
|
|
86
|
+
end
|
|
87
|
+
end
|
|
88
|
+
end
|
|
89
|
+
end
|
|
90
|
+
end
|