diff --git a/.circleci/images/primary/Dockerfile-3.3.0 b/.circleci/images/primary/Dockerfile-3.3.0 index 0439e1d453e..50fac526234 100644 --- a/.circleci/images/primary/Dockerfile-3.3.0 +++ b/.circleci/images/primary/Dockerfile-3.3.0 @@ -1,6 +1,6 @@ # Note: See the "Publishing updates to images" note in ./README.md for how to publish new builds of this container image -FROM ruby:3.3-rc-bullseye +FROM ruby:3.3.0-bullseye # Make apt non-interactive RUN echo 'APT::Get::Assume-Yes "true";' > /etc/apt/apt.conf.d/90circleci \ diff --git a/.github/CODEOWNERS b/.github/CODEOWNERS index 90c8ecc0616..860b0641aa9 100644 --- a/.github/CODEOWNERS +++ b/.github/CODEOWNERS @@ -5,38 +5,38 @@ /docs/GettingStarted.md @DataDog/documentation # Library -lib/datadog/appsec/* @DataDog/asm-ruby -lib/datadog/appsec.rb @DataDog/asm-ruby -lib/datadog/tracing/* @DataDog/tracing-ruby -lib/datadog/tracing.rb @DataDog/tracing-ruby -lib/datadog/opentelemetry/* @DataDog/tracing-ruby -lib/datadog/opentelemetry.rb @DataDog/tracing-ruby -lib/datadog/opentracer/* @DataDog/tracing-ruby -lib/datadog/opentracer.rb @DataDog/tracing-ruby -lib-injection/* @DataDog/tracing-ruby -lib/datadog/profiling/* @DataDog/profiling-rb -lib/datadog/profiling.rb @DataDog/profiling-rb -ext/* @DataDog/profiling-rb +/lib/datadog/appsec/ @DataDog/asm-ruby +/lib/datadog/appsec.rb @DataDog/asm-ruby +/lib/datadog/tracing/ @DataDog/tracing-ruby +/lib/datadog/tracing.rb @DataDog/tracing-ruby +/lib/datadog/opentelemetry/ @DataDog/tracing-ruby +/lib/datadog/opentelemetry.rb @DataDog/tracing-ruby +/lib/datadog/opentracer/ @DataDog/tracing-ruby +/lib/datadog/opentracer.rb @DataDog/tracing-ruby +/lib-injection/ @DataDog/tracing-ruby +/lib/datadog/profiling/ @DataDog/profiling-rb +/lib/datadog/profiling.rb @DataDog/profiling-rb +/ext/ @DataDog/profiling-rb # RBS signatures -sig/datadog/appsec/* @DataDog/asm-ruby -sig/datadog/appsec.rbs @DataDog/asm-ruby -sig/datadog/tracing/* @DataDog/tracing-ruby -sig/datadog/tracing.rbs @DataDog/tracing-ruby -sig/datadog/opentelemetry/* @DataDog/tracing-ruby -sig/datadog/opentelemetry.rbs @DataDog/tracing-ruby -sig/datadog/opentracer/* @DataDog/tracing-ruby -sig/datadog/opentracer.rbs @DataDog/tracing-ruby -sig/datadog/profiling/* @DataDog/profiling-rb -sig/datadog/profiling.rbs @DataDog/profiling-rb +/sig/datadog/appsec/ @DataDog/asm-ruby +/sig/datadog/appsec.rbs @DataDog/asm-ruby +/sig/datadog/tracing/ @DataDog/tracing-ruby +/sig/datadog/tracing.rbs @DataDog/tracing-ruby +/sig/datadog/opentelemetry/ @DataDog/tracing-ruby +/sig/datadog/opentelemetry.rbs @DataDog/tracing-ruby +/sig/datadog/opentracer/ @DataDog/tracing-ruby +/sig/datadog/opentracer.rbs @DataDog/tracing-ruby +/sig/datadog/profiling/ @DataDog/profiling-rb +/sig/datadog/profiling.rbs @DataDog/profiling-rb # Specs -spec/datadog/appsec/* @DataDog/asm-ruby -spec/datadog/tracing/* @DataDog/tracing-ruby -spec/datadog/tracing_spec.rb @DataDog/tracing-ruby -spec/datadog/opentelemetry/* @DataDog/tracing-ruby -spec/datadog/opentelemetry_spec.rb @DataDog/tracing-ruby -spec/datadog/opentracer/* @DataDog/tracing-ruby -spec/datadog/opentracer.rb @DataDog/tracing-ruby -spec/datadog/profiling/* @DataDog/profiling-rb -spec/datadog/profiling_spec.rb @DataDog/profiling-rb +/spec/datadog/appsec/ @DataDog/asm-ruby +/spec/datadog/tracing/ @DataDog/tracing-ruby +/spec/datadog/tracing_spec.rb @DataDog/tracing-ruby +/spec/datadog/opentelemetry/ @DataDog/tracing-ruby +/spec/datadog/opentelemetry_spec.rb @DataDog/tracing-ruby +/spec/datadog/opentracer/ @DataDog/tracing-ruby +/spec/datadog/opentracer.rb @DataDog/tracing-ruby +/spec/datadog/profiling/ @DataDog/profiling-rb +/spec/datadog/profiling_spec.rb @DataDog/profiling-rb diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml index b0ddf448e9d..16a45a3a07c 100644 --- a/.gitlab-ci.yml +++ b/.gitlab-ci.yml @@ -85,7 +85,7 @@ promote-image: script: # This would install all dependencies - .gitlab/prepare_pkg_directory.sh - - ruby pkg/install_ddtrace_deps.rb debase-ruby_core_source libdatadog libddwaf datadog-ci msgpack ffi ddtrace + - ruby pkg/install_ddtrace_deps.rb debase-ruby_core_source libdatadog libddwaf msgpack ffi ddtrace artifacts: paths: - pkg diff --git a/Rakefile b/Rakefile index 1acc3e2a5bd..4bd0d9905f8 100644 --- a/Rakefile +++ b/Rakefile @@ -17,6 +17,12 @@ TEST_METADATA = { 'appsec:main' => { '' => '✅ 2.1 / ✅ 2.2 / ✅ 2.3 / ✅ 2.4 / ✅ 2.5 / ✅ 2.6 / ✅ 2.7 / ✅ 3.0 / ✅ 3.1 / ✅ 3.2 / ✅ 3.3 / ✅ jruby' }, + 'profiling:main' => { + '' => '✅ 2.1 / ✅ 2.2 / ✅ 2.3 / ✅ 2.4 / ✅ 2.5 / ✅ 2.6 / ✅ 2.7 / ✅ 3.0 / ✅ 3.1 / ✅ 3.2 / ✅ 3.3 / ✅ jruby' + }, + 'profiling:ractors' => { + '' => '❌ 2.1 / ❌ 2.2 / ❌ 2.3 / ❌ 2.4 / ❌ 2.5 / ❌ 2.6 / ❌ 2.7 / ✅ 3.0 / ✅ 3.1 / ✅ 3.2 / ✅ 3.3 / ✅ jruby' + }, 'contrib' => { '' => '✅ 2.1 / ✅ 2.2 / ✅ 2.3 / ✅ 2.4 / ✅ 2.5 / ✅ 2.6 / ✅ 2.7 / ✅ 3.0 / ✅ 3.1 / ✅ 3.2 / ✅ 3.3 / ✅ jruby' }, @@ -313,20 +319,16 @@ desc 'Run RSpec' namespace :spec do task all: [:main, :benchmark, :rails, :railsredis, :railsredis_activesupport, :railsactivejob, - :elasticsearch, :http, :redis, :sidekiq, :sinatra, :hanami, :hanami_autoinstrument] + :elasticsearch, :http, :redis, :sidekiq, :sinatra, :hanami, :hanami_autoinstrument, + :profiling] desc '' # "Explicitly hiding from `rake -T`" RSpec::Core::RakeTask.new(:main) do |t, args| t.pattern = 'spec/**/*_spec.rb' - t.exclude_pattern = 'spec/**/{contrib,benchmark,redis,opentracer,auto_instrument,opentelemetry}/**/*_spec.rb,'\ + t.exclude_pattern = 'spec/**/{contrib,benchmark,redis,opentracer,auto_instrument,opentelemetry,profiling}/**/*_spec.rb,'\ ' spec/**/{auto_instrument,opentelemetry}_spec.rb' t.rspec_opts = args.to_a.join(' ') end - if RUBY_ENGINE == 'ruby' && OS.linux? && Gem::Version.new(RUBY_VERSION) >= Gem::Version.new('2.3.0') - # "bundle exec rake compile" currently only works on MRI Ruby on Linux - Rake::Task[:main].enhance([:clean]) - Rake::Task[:main].enhance([:compile]) - end RSpec::Core::RakeTask.new(:benchmark) do |t, args| t.pattern = 'spec/ddtrace/benchmark/**/*_spec.rb' @@ -525,6 +527,40 @@ namespace :spec do end task appsec: [:'appsec:all'] + + namespace :profiling do + task all: [:main, :ractors] + + task :compile_native_extensions do + # "bundle exec rake compile" currently only works on MRI Ruby on Linux + if RUBY_ENGINE == 'ruby' && OS.linux? && Gem::Version.new(RUBY_VERSION) >= Gem::Version.new('2.3.0') + Rake::Task[:clean].invoke + Rake::Task[:compile].invoke + end + end + + # Datadog Profiling main specs without Ractor creation + # NOTE: Ractor creation will transition the entire Ruby VM into multi-ractor mode. This cannot be undone + # and, as such, may introduce side-effects between tests and make them flaky depending on order of + # execution. By splitting in two separate suites, the side-effect impact should be mitigated as + # the non-ractor VM will never trigger the transition into multi-ractor mode. + desc '' # "Explicitly hiding from `rake -T`" + RSpec::Core::RakeTask.new(:main) do |t, args| + t.pattern = 'spec/datadog/profiling/**/*_spec.rb,spec/datadog/profiling_spec.rb' + t.rspec_opts = [*args.to_a, '-t ~ractors'].join(' ') + end + + desc '' # "Explicitly hiding from `rake -T`" + RSpec::Core::RakeTask.new(:ractors) do |t, args| + t.pattern = 'spec/datadog/profiling/**/*_spec.rb' + t.rspec_opts = [*args.to_a, '-t ractors'].join(' ') + end + + # Make sure each profiling test suite has a dependency on compiled native extensions + Rake::Task[:all].prerequisite_tasks.each { |t| t.enhance([:compile_native_extensions]) } + end + + task profiling: [:'profiling:all'] end if defined?(RuboCop::RakeTask) diff --git a/Steepfile b/Steepfile index 5aecad65aaa..bb89d14f09d 100644 --- a/Steepfile +++ b/Steepfile @@ -122,7 +122,6 @@ target :ddtrace do ignore 'lib/datadog/core/transport/http/env.rb' ignore 'lib/datadog/core/transport/http/response.rb' ignore 'lib/datadog/core/utils.rb' - ignore 'lib/datadog/core/utils/compression.rb' ignore 'lib/datadog/core/utils/forking.rb' ignore 'lib/datadog/core/utils/hash.rb' # Refinement module ignore 'lib/datadog/core/utils/network.rb' diff --git a/benchmarks/profiler_sample_loop_v2.rb b/benchmarks/profiler_sample_loop_v2.rb index 0afc5d6cc70..bfd66c7d596 100644 --- a/benchmarks/profiler_sample_loop_v2.rb +++ b/benchmarks/profiler_sample_loop_v2.rb @@ -16,7 +16,13 @@ class ProfilerSampleLoopBenchmark PROFILER_OVERHEAD_STACK_THREAD = Thread.new { sleep } def create_profiler - @recorder = Datadog::Profiling::StackRecorder.new(cpu_time_enabled: true, alloc_samples_enabled: true) + @recorder = Datadog::Profiling::StackRecorder.new( + cpu_time_enabled: true, + alloc_samples_enabled: false, + heap_samples_enabled: false, + heap_size_enabled: false, + timeline_enabled: false, + ) @collector = Datadog::Profiling::Collectors::ThreadContext.new( recorder: @recorder, max_frames: 400, tracer: nil, endpoint_collection_enabled: false, timeline_enabled: false ) diff --git a/ddtrace.gemspec b/ddtrace.gemspec index cb673587b0d..4b6822ff9a3 100644 --- a/ddtrace.gemspec +++ b/ddtrace.gemspec @@ -68,8 +68,5 @@ Gem::Specification.new do |spec| # When updating the version here, please also update the version in `native_extension_helpers.rb` (and yes we have a test for it) spec.add_dependency 'libdatadog', '~> 5.0.0.1.0' - # used for CI visibility product until the next major version - spec.add_dependency 'datadog-ci', '~> 0.5.0' - spec.extensions = ['ext/ddtrace_profiling_native_extension/extconf.rb', 'ext/ddtrace_profiling_loader/extconf.rb'] end diff --git a/docs/Compatibility.md b/docs/Compatibility.md index 12039492185..139bd94c171 100644 --- a/docs/Compatibility.md +++ b/docs/Compatibility.md @@ -108,14 +108,6 @@ For a list of available integrations, and their configuration options, refer to | Stripe | `stripe` | `>= 5.15.0` | `>= 5.15.0` | [Link][47] | [Link](https://github.com/stripe/stripe-ruby) | | Sucker Punch | `sucker_punch` | `>= 2.0` | `>= 2.0` | [Link][48] | [Link](https://github.com/brandonhilkert/sucker_punch) | -### CI visibility integrations - -These are the available CI visibility integrations: - -| Name | Key | Versions Supported: MRI | Versions Supported: JRuby | How to configure | Gem source | -|-----------|------------|-------------------------|---------------------------|---------------------|-----------------------------------------------------| -| Cucumber | `cucumber` | `>= 3.0` | `>= 1.7.16` | [Link][49] | [Link](https://github.com/cucumber/cucumber-ruby) | -| RSpec | `rspec` | `>= 3.0.0` | `>= 3.0.0` | [Link][50] | [Link](https://github.com/rspec/rspec) | [1]: https://github.com/DataDog/dd-trace-rb [2]: https://docs.datadoghq.com/tracing/trace_collection/dd_libraries/ruby#action-cable @@ -165,6 +157,4 @@ These are the available CI visibility integrations: [46]: https://docs.datadoghq.com/tracing/trace_collection/dd_libraries/ruby#sneakers [47]: https://docs.datadoghq.com/tracing/trace_collection/dd_libraries/ruby#stripe [48]: https://docs.datadoghq.com/tracing/trace_collection/dd_libraries/ruby#sucker-punch -[49]: https://docs.datadoghq.com/tracing/trace_collection/dd_libraries/ruby#cucumber -[50]: https://docs.datadoghq.com/tracing/trace_collection/dd_libraries/ruby#rspec diff --git a/docs/GettingStarted.md b/docs/GettingStarted.md index 52ca6f52739..b7680039093 100644 --- a/docs/GettingStarted.md +++ b/docs/GettingStarted.md @@ -333,18 +333,7 @@ For a list of configuration options for the available integrations, refer to the #### CI Visibility -For Datadog CI Visibility, library instrumentation can be activated and configured by using the following `Datadog.configure` API: - -```ruby -Datadog.configure do |c| - # Activates and configures an integration - c.ci.instrument :integration_name, **options -end -``` - -`options` are keyword arguments for integration-specific configuration. - -For a list of available integrations and their supported versions, see [Ruby CI Integration Compatibility][3] +Checkout [Datadog's Ruby Library for instrumenting your test and continuous integration pipeline](https://github.com/DataDog/datadog-ci-rb) ### Action Cable @@ -602,41 +591,6 @@ Datadog::Tracing.trace('outer') do end ``` -### Cucumber - -Cucumber integration will trace all executions of scenarios and steps when using `cucumber` framework. - -To activate your integration, use the `Datadog.configure` method: - -```ruby -require 'cucumber' -require 'ddtrace' - -# Configure default Cucumber integration -Datadog.configure do |c| - c.ci.instrument :cucumber, **options -end - -# Example of how to attach tags from scenario to active span -Around do |scenario, block| - active_span = Datadog.configuration[:cucumber][:tracer].active_span - unless active_span.nil? - scenario.tags.filter { |tag| tag.include? ':' }.each do |tag| - active_span.set_tag(*tag.name.split(':', 2)) - end - end - block.call -end -``` - -`options` are the following keyword arguments: - -| Key | Description | Default | -| --- | ----------- | ------- | -| `enabled` | Defines whether Cucumber tests should be traced. Useful for temporarily disabling tracing. `true` or `false` | `true` | -| `service_name` | Service name used for `cucumber` instrumentation. | `'cucumber'` | -| `operation_name` | Operation name used for `cucumber` instrumentation. Useful if you want rename automatic trace metrics e.g. `trace.#{operation_name}.errors`. | `'cucumber.test'` | - ### Dalli Dalli integration will trace all calls to your `memcached` server: @@ -682,7 +636,7 @@ end | Key | Description | Default | | --- | ----------- | ------- | -| `error_handler` | Custom error handler invoked when a job raises an error. Provided `span` and `error` as arguments. Sets error on the span by default. Useful for ignoring transient errors. | `proc { |span, error| span.set_error(error) unless span.nil? }` | +| `on_error` | Custom error handler invoked when a job raises an error. Provided `span` and `error` as arguments. Sets error on the span by default. Useful for ignoring transient errors. | `proc { \|span, error\| span.set_error(error) unless span.nil? }` | ### Elasticsearch @@ -773,7 +727,8 @@ connection.get | `peer_service` | `DD_TRACE_EXCON_PEER_SERVICE` | Name of external service the application connects to | `nil` | | `distributed_tracing` | | Enables [distributed tracing](#distributed-tracing) | `true` | | `split_by_domain` | | Uses the request domain as the service name when set to `true`. | `false` | -| `error_handler` | | A `Proc` that accepts a `response` parameter. If it evaluates to a *truthy* value, the trace span is marked as an error. By default only sets 5XX responses as errors. | `nil` | +| `on_error` | Custom error handler invoked when a request raises an error. Provided `span` and `error` as arguments. Sets error on the span by deault. | `proc { \|span, error\| span.set_error(error) unless span.nil? }` | +| `error_status_codes` | `DD_TRACE_EXCON_ERROR_STATUS_CODES` | Range or Array of HTTP status codes that should be traced as errors.| `400...600` | **Configuring connections to use different settings** @@ -837,8 +792,8 @@ connection.get('/foo') | `peer_service` | `DD_TRACE_FARADAY_PEER_SERVICE` | Name of external service the application connects to | `nil` | | `distributed_tracing` | | Enables [distributed tracing](#distributed-tracing) | `true` | | `split_by_domain` | | Uses the request domain as the service name when set to `true`. | `false` | -| `error_handler` | | A `Proc` that accepts a `response` parameter. If it evaluates to a *truthy* value, the trace span is marked as an error. By default only sets 5XX responses as errors. | `nil` | - +| `on_error` | Custom error handler invoked when a request raises an error. Provided `span` and `error` as arguments. Sets error on the span by deault. | `proc { \|span, error\| span.set_error(error) unless span.nil? }` | +| `error_status_codes` | `DD_TRACE_FARADAY_ERROR_STATUS_CODES` | Range or Array of HTTP status codes that should be traced as errors.| `400...600` | ### Grape @@ -973,11 +928,7 @@ client.my_endpoint(DemoMessage.new(contents: 'hello!')) | `service_name` | `DD_TRACE_GRPC_SERVICE_NAME` | Name of application running the `grpc` instrumentation. May be overridden by `global_default_service_name`. [See *Additional Configuration* for more details](#additional-configuration) | `grpc` | | `peer_service` | `DD_TRACE_GRPC_PEER_SERVICE` | Name of external service the application connects to | `nil` | | `distributed_tracing` | | Enables [distributed tracing](#distributed-tracing) | `true` | -| `server_error_handler` | | Custom error handler invoked when there is a server error. A `Proc` that accepts `span` and `error` parameters. Sets error on the span by default. | `proc { \|span, error \| span.set_error(error) unless span.nil? }` | -| `client_error_handler` | | Custom error handler invoked when there is a client error. A `Proc` that accepts `span` and `error` parameters. Sets error on the span by default. | `proc { \|span, error \| span.set_error(error) unless span.nil? }` | - -Deprecation notice: -- `error_handler` will be removed. Use `server_error_handler` instead. +| `on_error` | | Custom error handler invoked when there is an error. A `Proc` that accepts `span` and `error` parameters. Sets error on the span by default. | `proc { \|span, error \| span.set_error(error) unless span.nil? }` | **Configuring clients to use different settings** @@ -1046,7 +997,7 @@ end | `peer_service` | `DD_TRACE_HTTPRB_PEER_SERVICE` | Name of external service the application connects to | `nil` | | `distributed_tracing` | | Enables [distributed tracing](#distributed-tracing) | `true` | | `split_by_domain` | | Uses the request domain as the service name when set to `true`. | `false` | -| `error_status_codes` | `DD_TRACE_HTTPCLIENT_ERROR_STATUS_CODES` | Range or Array of HTTP status codes that should be traced as errors. | `400...600` | +| `error_status_codes` | `DD_TRACE_HTTPRB_ERROR_STATUS_CODES` | Range or Array of HTTP status codes that should be traced as errors. | `400...600` | ### httpclient @@ -1112,30 +1063,6 @@ Datadog.configure do |c| end ``` -### Minitest - -The Minitest integration will trace all executions of tests when using `minitest` test framework. - -To activate your integration, use the `Datadog.configure` method: - -```ruby -require 'minitest' -require 'ddtrace' - -# Configure default Minitest integration -Datadog.configure do |c| - c.ci.instrument :minitest, **options -end -``` - -`options` are the following keyword arguments: - -| Key | Description | Default | -| --- | ----------- | ------- | -| `enabled` | Defines whether Minitest tests should be traced. Useful for temporarily disabling tracing. `true` or `false` | `true` | -| `service_name` | Service name used for `minitest` instrumentation. | `'minitest'` | -| `operation_name` | Operation name used for `minitest` instrumentation. Useful if you want rename automatic trace metrics e.g. `trace.#{operation_name}.errors`. | `'minitest.test'` | - ### MongoDB The integration traces any `Command` that is sent from the [MongoDB Ruby Driver](https://github.com/mongodb/mongo-ruby-driver) to a MongoDB cluster. By extension, Object Document Mappers (ODM) such as Mongoid are automatically instrumented if they use the official Ruby driver. To activate the integration, simply: @@ -1218,8 +1145,8 @@ client.query("SELECT * FROM users WHERE group='x'") |-----------------------|--------------------------------|-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|--------------| | `service_name` | `DD_TRACE_MYSQL2_SERVICE_NAME` | Name of application running the `mysql2` instrumentation. May be overridden by `global_default_service_name`. [See *Additional Configuration* for more details](#additional-configuration) | `mysql2` | | `peer_service` | `DD_TRACE_MYSQL2_PEER_SERVICE` | Name of external service the application connects to | `nil` | -| `comment_propagation` | `DD_DBM_PROPAGATION_MODE` | SQL comment propagation mode for database monitoring.
(example: `disabled` \| `service`\| `full`).

**Important**: *Note that enabling sql comment propagation results in potentially confidential data (service names) being stored in the databases which can then be accessed by other 3rd parties that have been granted access to the database.* | `'disabled'` | - +| `comment_propagation` | `DD_DBM_PROPAGATION_MODE` | SQL comment propagation mode for database monitoring.
(example: `disabled` \| `service`\| `full`).

**Important**: *Note that enabling SQL comment propagation results in potentially confidential data (service names) being stored in the databases which can then be accessed by other third parties that have been granted access to the database.* | `'disabled'` | +| `on_error` | | Custom error handler invoked when MySQL raises an error. Provided `span` and `error` as arguments. Sets error on the span by default. Useful for ignoring errors that are handled at the application level. | `proc { \|span, error\| span.set_error(error) unless span.nil? }` | ### Net/HTTP The Net/HTTP integration will trace any HTTP call using the standard lib Net::HTTP module. @@ -1315,7 +1242,7 @@ end | `service_name` | `DD_TRACE_PG_SERVICE_NAME` | Name of application running the `pg` instrumentation. May be overridden by `global_default_service_name`. [See *Additional Configuration* for more details](#additional-configuration) | `pg` | | `peer_service` | `DD_TRACE_PG_PEER_SERVICE` | Name of external service the application connects to | `nil` | | `comment_propagation` | `DD_DBM_PROPAGATION_MODE` | SQL comment propagation mode for database monitoring.
(example: `disabled` \| `service`\| `full`).

**Important**: *Note that enabling sql comment propagation results in potentially confidential data (service names) being stored in the databases which can then be accessed by other 3rd parties that have been granted access to the database.* | `'disabled'` | -| `error_handler` | Custom error handler invoked when a job raises an error. Provided `span` and `error` as arguments. Sets error on the span by default. Useful for ignoring errors from Postgres that are handled at the application level. | `proc { |span, error| span.set_error(error) unless span.nil? }` | +| `on_error` | Custom error handler invoked when PG raises an error. Provided `span` and `error` as arguments. Sets error on the span by default. Useful for ignoring errors from Postgres that are handled at the application level. | `proc { \|span, error\| span.set_error(error) unless span.nil? }` | ### Presto @@ -1392,7 +1319,7 @@ end | `enabled` | `DD_TRACE_QUE_ENABLED` | Defines whether Que should be traced. Useful for temporarily disabling tracing. `true` or `false` | `true` | | `tag_args` | `DD_TRACE_QUE_TAG_ARGS_ENABLED` | Enable tagging of a job's args field. `true` for on, `false` for off. | `false` | | `tag_data` | `DD_TRACE_QUE_TAG_DATA_ENABLED` | Enable tagging of a job's data field. `true` for on, `false` for off. | `false` | -| `error_handler` | | Custom error handler invoked when a job raises an error. Provided `span` and `error` as arguments. Sets error on the span by default. Useful for ignoring transient errors. | `proc { \|span, error \| span.set_error(error) unless span.nil? }` | +| `on_error` | | Custom error handler invoked when a job raises an error. Provided `span` and `error` as arguments. Sets error on the span by default. Useful for ignoring transient errors. | `proc { \|span, error \| span.set_error(error) unless span.nil? }` | ### Racecar @@ -1738,7 +1665,7 @@ end | Key | Description | Default | | --- | ----------- | ------- | -| `error_handler` | Custom error handler invoked when a job raises an error. Provided `span` and `error` as arguments. Sets error on the span by default. Useful for ignoring transient errors. | `proc { |span, error| span.set_error(error) unless span.nil? }` | +| `on_error` | Custom error handler invoked when a job raises an error. Provided `span` and `error` as arguments. Sets error on the span by default. Useful for ignoring transient errors. | `proc { \|span, error\| span.set_error(error) unless span.nil? }` | ### Rest Client @@ -1795,30 +1722,6 @@ end | --- | ----------- | ------- | | `service_name` | Service name for `roda` instrumentation. | `'nil'` | -### RSpec - -RSpec integration will trace all executions of example groups and examples when using `rspec` test framework. - -To activate your integration, use the `Datadog.configure` method: - -```ruby -require 'rspec' -require 'ddtrace' - -# Configure default RSpec integration -Datadog.configure do |c| - c.ci.instrument :rspec, **options -end -``` - -`options` are the following keyword arguments: - -| Key | Description | Default | -| --- | ----------- | ------- | -| `enabled` | Defines whether RSpec tests should be traced. Useful for temporarily disabling tracing. `true` or `false` | `true` | -| `service_name` | Service name used for `rspec` instrumentation. | `'rspec'` | -| `operation_name` | Operation name used for `rspec` instrumentation. Useful if you want rename automatic trace metrics e.g. `trace.#{operation_name}.errors`. | `'rspec.example'` | - ### Sequel The Sequel integration traces queries made to your database. @@ -1883,7 +1786,7 @@ end | Key | Description | Default | | --- | ----------- | ------- | | `tag_body` | Tag spans with the SQS message body `true` or `false` | `false` | -| `error_handler` | Custom error handler invoked when a job raises an error. Provided `span` and `error` as arguments. Sets error on the span by default. Useful for ignoring transient errors. | `proc { |span, error| span.set_error(error) unless span.nil? }` | +| `on_error` | Custom error handler invoked when a job raises an error. Provided `span` and `error` as arguments. Sets error on the span by default. Useful for ignoring transient errors. | `proc { \|span, error\| span.set_error(error) unless span.nil? }` | ### Sidekiq @@ -1905,7 +1808,7 @@ end | --- | ----------- | ------- | | `distributed_tracing` | Enabling [distributed tracing](#distributed-tracing) creates a parent-child relationship between the `sidekiq.push` span and the `sidekiq.job` span.

**Important**: *Enabling distributed_tracing for asynchronous processing can result in drastic changes in your trace graph. Such cases include long running jobs, retried jobs, and jobs scheduled in the far future. Make sure to inspect your traces after enabling this feature.* | `false` | | `tag_args` | Enable tagging of job arguments. `true` for on, `false` for off. | `false` | -| `error_handler` | Custom error handler invoked when a job raises an error. Provided `span` and `error` as arguments. Sets error on the span by default. Useful for ignoring transient errors. | `proc { \|span, error\| span.set_error(error) unless span.nil? }` | +| `on_error` | Custom error handler invoked when a job raises an error. Provided `span` and `error` as arguments. Sets error on the span by default. Useful for ignoring transient errors. | `proc { \|span, error\| span.set_error(error) unless span.nil? }` | | `quantize` | Hash containing options for quantization of job arguments. | `{}` | ### Sinatra @@ -1984,7 +1887,7 @@ end | --- | ----------- | ------- | | `enabled` | Defines whether Sneakers should be traced. Useful for temporarily disabling tracing. `true` or `false` | `true` | | `tag_body` | Enable tagging of job message. `true` for on, `false` for off. | `false` | -| `error_handler` | Custom error handler invoked when a job raises an error. Provided `span` and `error` as arguments. Sets error on the span by default. Useful for ignoring transient errors. | `proc { |span, error| span.set_error(error) unless span.nil? }` | +| `on_error` | Custom error handler invoked when a job raises an error. Provided `span` and `error` as arguments. Sets error on the span by default. Useful for ignoring transient errors. | `proc { \|span, error\| span.set_error(error) unless span.nil? }` | ### Stripe @@ -2789,4 +2692,3 @@ See [this issue](https://github.com/DataDog/dd-trace-rb/issues/3015) for a discu [header tags]: https://docs.datadoghq.com/tracing/configure_data_security/#applying-header-tags-to-root-spans [1]: https://docs.datadoghq.com/tracing/trace_collection/compatibility/ruby/ [2]: https://docs.datadoghq.com/tracing/trace_collection/compatibility/ruby#integrations -[3]: https://docs.datadoghq.com/tracing/trace_collection/compatibility/ruby#ci-visibility-integrations diff --git a/ext/ddtrace_profiling_native_extension/collectors_cpu_and_wall_time_worker.c b/ext/ddtrace_profiling_native_extension/collectors_cpu_and_wall_time_worker.c index ea56ba2a593..181cdd43b4a 100644 --- a/ext/ddtrace_profiling_native_extension/collectors_cpu_and_wall_time_worker.c +++ b/ext/ddtrace_profiling_native_extension/collectors_cpu_and_wall_time_worker.c @@ -75,15 +75,22 @@ // // --- +#ifndef NO_POSTPONED_TRIGGER + // Used to call the rb_postponed_job_trigger from Ruby 3.3+. These get initialized in + // `collectors_cpu_and_wall_time_worker_init` below and always get reused after that. + static rb_postponed_job_handle_t sample_from_postponed_job_handle; + static rb_postponed_job_handle_t after_gc_from_postponed_job_handle; +#endif + // Contains state for a single CpuAndWallTimeWorker instance struct cpu_and_wall_time_worker_state { // These are immutable after initialization bool gc_profiling_enabled; - bool allocation_counting_enabled; bool no_signals_workaround_enabled; bool dynamic_sampling_rate_enabled; - int allocation_sample_every; // Temporarily used for development/testing of allocation profiling + int allocation_sample_every; + bool allocation_profiling_enabled; VALUE self_instance; VALUE thread_context_collector_instance; VALUE idle_sampling_helper_instance; @@ -149,11 +156,11 @@ static VALUE _native_initialize( VALUE thread_context_collector_instance, VALUE gc_profiling_enabled, VALUE idle_sampling_helper_instance, - VALUE allocation_counting_enabled, VALUE no_signals_workaround_enabled, VALUE dynamic_sampling_rate_enabled, VALUE dynamic_sampling_rate_overhead_target_percentage, - VALUE allocation_sample_every + VALUE allocation_sample_every, + VALUE allocation_profiling_enabled ); static void cpu_and_wall_time_worker_typed_data_mark(void *state_ptr); static VALUE _native_sampling_loop(VALUE self, VALUE instance); @@ -212,6 +219,16 @@ __thread uint64_t allocation_count = 0; void collectors_cpu_and_wall_time_worker_init(VALUE profiling_module) { rb_global_variable(&active_sampler_instance); + #ifndef NO_POSTPONED_TRIGGER + int unused_flags = 0; + sample_from_postponed_job_handle = rb_postponed_job_preregister(unused_flags, sample_from_postponed_job, NULL); + after_gc_from_postponed_job_handle = rb_postponed_job_preregister(unused_flags, after_gc_from_postponed_job, NULL); + + if (sample_from_postponed_job_handle == POSTPONED_JOB_HANDLE_INVALID || after_gc_from_postponed_job_handle == POSTPONED_JOB_HANDLE_INVALID) { + rb_raise(rb_eRuntimeError, "Failed to register profiler postponed jobs (got POSTPONED_JOB_HANDLE_INVALID)"); + } + #endif + VALUE collectors_module = rb_define_module_under(profiling_module, "Collectors"); VALUE collectors_cpu_and_wall_time_worker_class = rb_define_class_under(collectors_module, "CpuAndWallTimeWorker", rb_cObject); // Hosts methods used for testing the native code using RSpec @@ -265,10 +282,10 @@ static VALUE _native_new(VALUE klass) { // being leaked. state->gc_profiling_enabled = false; - state->allocation_counting_enabled = false; state->no_signals_workaround_enabled = false; state->dynamic_sampling_rate_enabled = true; state->allocation_sample_every = 0; + state->allocation_profiling_enabled = false; state->thread_context_collector_instance = Qnil; state->idle_sampling_helper_instance = Qnil; state->owner_thread = Qnil; @@ -293,31 +310,31 @@ static VALUE _native_initialize( VALUE thread_context_collector_instance, VALUE gc_profiling_enabled, VALUE idle_sampling_helper_instance, - VALUE allocation_counting_enabled, VALUE no_signals_workaround_enabled, VALUE dynamic_sampling_rate_enabled, VALUE dynamic_sampling_rate_overhead_target_percentage, - VALUE allocation_sample_every + VALUE allocation_sample_every, + VALUE allocation_profiling_enabled ) { ENFORCE_BOOLEAN(gc_profiling_enabled); - ENFORCE_BOOLEAN(allocation_counting_enabled); ENFORCE_BOOLEAN(no_signals_workaround_enabled); ENFORCE_BOOLEAN(dynamic_sampling_rate_enabled); ENFORCE_TYPE(allocation_sample_every, T_FIXNUM); ENFORCE_TYPE(dynamic_sampling_rate_overhead_target_percentage, T_FLOAT); + ENFORCE_BOOLEAN(allocation_profiling_enabled); struct cpu_and_wall_time_worker_state *state; TypedData_Get_Struct(self_instance, struct cpu_and_wall_time_worker_state, &cpu_and_wall_time_worker_typed_data, state); state->gc_profiling_enabled = (gc_profiling_enabled == Qtrue); - state->allocation_counting_enabled = (allocation_counting_enabled == Qtrue); state->no_signals_workaround_enabled = (no_signals_workaround_enabled == Qtrue); state->dynamic_sampling_rate_enabled = (dynamic_sampling_rate_enabled == Qtrue); dynamic_sampling_rate_set_overhead_target_percentage(&state->dynamic_sampling_rate, NUM2DBL(dynamic_sampling_rate_overhead_target_percentage)); state->allocation_sample_every = NUM2INT(allocation_sample_every); + state->allocation_profiling_enabled = (allocation_profiling_enabled == Qtrue); - if (state->allocation_sample_every < 0) { - rb_raise(rb_eArgError, "Unexpected value for allocation_sample_every: %d. This value must be >= 0.", state->allocation_sample_every); + if (state->allocation_sample_every <= 0) { + rb_raise(rb_eArgError, "Unexpected value for allocation_sample_every: %d. This value must be > 0.", state->allocation_sample_every); } state->thread_context_collector_instance = enforce_thread_context_collector_instance(thread_context_collector_instance); @@ -476,20 +493,25 @@ static void handle_sampling_signal(DDTRACE_UNUSED int _signal, DDTRACE_UNUSED si // Note: If we ever want to get rid of rb_postponed_job_register_one, remember not to clobber Ruby exceptions, as // this function does this helpful job for us now -- https://github.com/ruby/ruby/commit/a98e343d39c4d7bf1e2190b076720f32d9f298b3. - int result = rb_postponed_job_register_one(0, sample_from_postponed_job, NULL); - - // Officially, the result of rb_postponed_job_register_one is documented as being opaque, but in practice it does not - // seem to have changed between Ruby 2.3 and 3.2, and so we track it as a debugging mechanism - switch (result) { - case 0: - state->stats.postponed_job_full++; break; - case 1: - state->stats.postponed_job_success++; break; - case 2: - state->stats.postponed_job_skipped_already_existed++; break; - default: - state->stats.postponed_job_unknown_result++; - } + #ifndef NO_POSTPONED_TRIGGER // Ruby 3.3+ + rb_postponed_job_trigger(sample_from_postponed_job_handle); + state->stats.postponed_job_success++; // Always succeeds + #else + int result = rb_postponed_job_register_one(0, sample_from_postponed_job, NULL); + + // Officially, the result of rb_postponed_job_register_one is documented as being opaque, but in practice it does not + // seem to have changed between Ruby 2.3 and 3.2, and so we track it as a debugging mechanism + switch (result) { + case 0: + state->stats.postponed_job_full++; break; + case 1: + state->stats.postponed_job_success++; break; + case 2: + state->stats.postponed_job_skipped_already_existed++; break; + default: + state->stats.postponed_job_unknown_result++; + } + #endif } // The actual sampling trigger loop always runs **without** the global vm lock. @@ -636,7 +658,7 @@ static VALUE release_gvl_and_run_sampling_trigger_loop(VALUE instance) { // because they may raise exceptions. install_sigprof_signal_handler(handle_sampling_signal, "handle_sampling_signal"); if (state->gc_profiling_enabled) rb_tracepoint_enable(state->gc_tracepoint); - if (state->allocation_counting_enabled) rb_tracepoint_enable(state->object_allocation_tracepoint); + if (state->allocation_profiling_enabled) rb_tracepoint_enable(state->object_allocation_tracepoint); rb_thread_call_without_gvl(run_sampling_trigger_loop, state, interrupt_sampling_trigger_loop, state); @@ -718,28 +740,17 @@ static void on_gc_event(VALUE tracepoint_data, DDTRACE_UNUSED void *unused) { if (event == RUBY_INTERNAL_EVENT_GC_ENTER) { thread_context_collector_on_gc_start(state->thread_context_collector_instance); } else if (event == RUBY_INTERNAL_EVENT_GC_EXIT) { - // Design: In an earlier iteration of this feature (see https://github.com/DataDog/dd-trace-rb/pull/2308) we - // actually had a single method to implement the behavior of both thread_context_collector_on_gc_finish - // and thread_context_collector_sample_after_gc (the latter is called via after_gc_from_postponed_job). - // - // Unfortunately, then we discovered the safety issue around no allocations, and thus decided to separate them -- so that - // the sampling could run outside the tight safety constraints of the garbage collection process. - // - // There is a downside: The sample is now taken very very shortly afterwards the GC finishes, and not immediately - // as the GC finishes, which means the stack captured may by affected by "skid", e.g. point slightly after where - // it should be pointing at. - // Alternatives to solve this would be to capture no stack for garbage collection (as we do for Java and .net); - // making the sampling process allocation-safe (very hard); or separate stack sampling from sample recording, - // e.g. enabling us to capture the stack in thread_context_collector_on_gc_finish and do the rest later - // (medium hard). - - thread_context_collector_on_gc_finish(state->thread_context_collector_instance); - // We use rb_postponed_job_register_one to ask Ruby to run thread_context_collector_sample_after_gc after if - // fully finishes the garbage collection, so that one is allowed to do allocations and throw exceptions as usual. - // - // Note: If we ever want to get rid of rb_postponed_job_register_one, remember not to clobber Ruby exceptions, as - // this function does this helpful job for us now -- https://github.com/ruby/ruby/commit/a98e343d39c4d7bf1e2190b076720f32d9f298b3. - rb_postponed_job_register_one(0, after_gc_from_postponed_job, NULL); + bool should_flush = thread_context_collector_on_gc_finish(state->thread_context_collector_instance); + + // We use rb_postponed_job_register_one to ask Ruby to run thread_context_collector_sample_after_gc when the + // thread collector flags it's time to flush. + if (should_flush) { + #ifndef NO_POSTPONED_TRIGGER // Ruby 3.3+ + rb_postponed_job_trigger(after_gc_from_postponed_job_handle); + #else + rb_postponed_job_register_one(0, after_gc_from_postponed_job, NULL); + #endif + } } } @@ -892,9 +903,9 @@ static void sleep_for(uint64_t time_ns) { } static VALUE _native_allocation_count(DDTRACE_UNUSED VALUE self) { - bool is_profiler_running = active_sampler_instance_state != NULL; + bool are_allocations_being_tracked = active_sampler_instance_state != NULL && active_sampler_instance_state->allocation_profiling_enabled; - return is_profiler_running ? ULL2NUM(allocation_count) : Qnil; + return are_allocations_being_tracked ? ULL2NUM(allocation_count) : Qnil; } // Implements memory-related profiling events. This function is called by Ruby via the `object_allocation_tracepoint` @@ -928,7 +939,7 @@ static void on_newobj_event(VALUE tracepoint_data, DDTRACE_UNUSED void *unused) // TODO: This is a placeholder sampling decision strategy. We plan to replace it with a better one soon (e.g. before // beta), and having something here allows us to test the rest of feature, sampling decision aside. - if (state->allocation_sample_every > 0 && ((allocation_count % state->allocation_sample_every) == 0)) { + if (allocation_count % state->allocation_sample_every == 0) { // Rescue against any exceptions that happen during sampling safely_call(rescued_sample_allocation, tracepoint_data, state->self_instance); } diff --git a/ext/ddtrace_profiling_native_extension/collectors_gc_profiling_helper.c b/ext/ddtrace_profiling_native_extension/collectors_gc_profiling_helper.c new file mode 100644 index 00000000000..e9dd6c727d9 --- /dev/null +++ b/ext/ddtrace_profiling_native_extension/collectors_gc_profiling_helper.c @@ -0,0 +1,156 @@ +#include +#include + +#include "collectors_gc_profiling_helper.h" + +// This helper is used by the Datadog::Profiling::Collectors::ThreadContext to profile garbage collection. +// It's tested through that class' interfaces. +// --- + +// Used when retrieving GC information from the VM. +// All these are symbols, but we don't need to mark them since we ask for them to be interned (and thus live forever) +static VALUE state_sym; +static VALUE marking_sym; +static VALUE sweeping_sym; +static VALUE none_sym; +static VALUE gc_by_sym; +static VALUE newobj_sym; +static VALUE malloc_sym; +static VALUE method_sym; +static VALUE capi_sym; +static VALUE stress_sym; +static VALUE major_by_sym; +static VALUE nofree_sym; +static VALUE oldgen_sym; +static VALUE shady_sym; +static VALUE force_sym; +static VALUE oldmalloc_sym; + +static ddog_CharSlice major_gc_reason_pretty(VALUE major_gc_reason); +static ddog_CharSlice gc_cause_pretty(VALUE gc_cause); +static ddog_CharSlice gc_type_pretty(VALUE major_gc_reason, VALUE gc_state); + +void gc_profiling_init(void) { + // This function lazy-interns a few constants, which may trigger allocations. Since we want to call it during GC as + // well, when allocations are not allowed, we call it once here so that the constants get defined ahead of time. + rb_gc_latest_gc_info(rb_hash_new()); + + // Used to query and look up the results of GC information + state_sym = ID2SYM(rb_intern_const("state")); + marking_sym = ID2SYM(rb_intern_const("marking")); + sweeping_sym = ID2SYM(rb_intern_const("sweeping")); + none_sym = ID2SYM(rb_intern_const("none")); + gc_by_sym = ID2SYM(rb_intern_const("gc_by")); + newobj_sym = ID2SYM(rb_intern_const("newobj")); + malloc_sym = ID2SYM(rb_intern_const("malloc")); + method_sym = ID2SYM(rb_intern_const("method")); + capi_sym = ID2SYM(rb_intern_const("capi")); + stress_sym = ID2SYM(rb_intern_const("stress")); + major_by_sym = ID2SYM(rb_intern_const("major_by")); + nofree_sym = ID2SYM(rb_intern_const("nofree")); + oldgen_sym = ID2SYM(rb_intern_const("oldgen")); + shady_sym = ID2SYM(rb_intern_const("shady")); + force_sym = ID2SYM(rb_intern_const("force")); + oldmalloc_sym = ID2SYM(rb_intern_const("oldmalloc")); + state_sym = ID2SYM(rb_intern_const("state")); + none_sym = ID2SYM(rb_intern_const("none")); +} + +bool gc_profiling_has_major_gc_finished(void) { + return rb_gc_latest_gc_info(state_sym) == none_sym && rb_gc_latest_gc_info(major_by_sym) != Qnil; +} + +uint8_t gc_profiling_set_metadata(ddog_prof_Label *labels, int labels_length) { + uint8_t max_label_count = + 1 + // thread id + 1 + // thread name + 1 + // state + 1 + // event + 1 + // gc reason + 1 + // gc cause + 1; // gc type + + if (max_label_count > labels_length) { + rb_raise(rb_eArgError, "BUG: gc_profiling_set_metadata invalid labels_length (%d) < max_label_count (%d)", labels_length, max_label_count); + } + + uint8_t label_pos = 0; + + labels[label_pos++] = (ddog_prof_Label) { + .key = DDOG_CHARSLICE_C("thread id"), + .str = DDOG_CHARSLICE_C("GC"), + .num = 0, // This shouldn't be needed but the tracer-2.7 docker image ships a buggy gcc that complains about this + }; + + labels[label_pos++] = (ddog_prof_Label) { + .key = DDOG_CHARSLICE_C("thread name"), + .str = DDOG_CHARSLICE_C("Garbage Collection"), + .num = 0, // Workaround, same as above + }; + + labels[label_pos++] = (ddog_prof_Label) { + .key = DDOG_CHARSLICE_C("state"), + .str = DDOG_CHARSLICE_C("had cpu"), + .num = 0, // Workaround, same as above + }; + + labels[label_pos++] = (ddog_prof_Label) { + .key = DDOG_CHARSLICE_C("event"), + .str = DDOG_CHARSLICE_C("gc"), + .num = 0, // Workaround, same as above + }; + + VALUE major_by = rb_gc_latest_gc_info(major_by_sym); + if (major_by != Qnil) { + labels[label_pos++] = (ddog_prof_Label) { + .key = DDOG_CHARSLICE_C("gc reason"), + .str = major_gc_reason_pretty(major_by), + }; + } + + labels[label_pos++] = (ddog_prof_Label) { + .key = DDOG_CHARSLICE_C("gc cause"), + .str = gc_cause_pretty(rb_gc_latest_gc_info(gc_by_sym)), + }; + + labels[label_pos++] = (ddog_prof_Label) { + .key = DDOG_CHARSLICE_C("gc type"), + .str = gc_type_pretty(major_by, rb_gc_latest_gc_info(state_sym)), + }; + + if (label_pos > max_label_count) { + rb_raise(rb_eRuntimeError, "BUG: gc_profiling_set_metadata unexpected label_pos (%d) > max_label_count (%d)", label_pos, max_label_count); + } + + return label_pos; +} + +static ddog_CharSlice major_gc_reason_pretty(VALUE major_gc_reason) { + if (major_gc_reason == nofree_sym ) return DDOG_CHARSLICE_C("not enough free slots (NOFREE)"); + if (major_gc_reason == oldgen_sym ) return DDOG_CHARSLICE_C("old generation full (OLDGEN)"); + if (major_gc_reason == shady_sym ) return DDOG_CHARSLICE_C("too many objects without write barriers (SHADY)"); + if (major_gc_reason == force_sym ) return DDOG_CHARSLICE_C("requested (FORCE)"); + if (major_gc_reason == oldmalloc_sym) return DDOG_CHARSLICE_C("heap bytes allocated threshold (OLDMALLOC)"); + return DDOG_CHARSLICE_C("unknown"); +} + +static ddog_CharSlice gc_cause_pretty(VALUE gc_cause) { + if (gc_cause == newobj_sym) return DDOG_CHARSLICE_C("object allocation"); + if (gc_cause == malloc_sym) return DDOG_CHARSLICE_C("malloc()"); + if (gc_cause == method_sym) return DDOG_CHARSLICE_C("GC.start()"); + if (gc_cause == capi_sym ) return DDOG_CHARSLICE_C("rb_gc()"); + if (gc_cause == stress_sym) return DDOG_CHARSLICE_C("stress"); + return DDOG_CHARSLICE_C("unknown"); +} + +static ddog_CharSlice gc_type_pretty(VALUE major_gc_reason, VALUE gc_state) { + if (major_gc_reason != Qnil) { + if (gc_state == marking_sym ) return DDOG_CHARSLICE_C("major (ongoing, marking)"); + if (gc_state == sweeping_sym) return DDOG_CHARSLICE_C("major (ongoing, sweeping)"); + return DDOG_CHARSLICE_C("major"); + } else { + // As we delay flushing events when a minor GC finishes, it's not relevant to include the observed state of the + // minor GC, as we often won't record a marking -> sweeping -> done cycle, as it happens too quickly. + return DDOG_CHARSLICE_C("minor"); + } +} diff --git a/ext/ddtrace_profiling_native_extension/collectors_gc_profiling_helper.h b/ext/ddtrace_profiling_native_extension/collectors_gc_profiling_helper.h new file mode 100644 index 00000000000..7a5096624c6 --- /dev/null +++ b/ext/ddtrace_profiling_native_extension/collectors_gc_profiling_helper.h @@ -0,0 +1,5 @@ +#pragma once + +void gc_profiling_init(void); +bool gc_profiling_has_major_gc_finished(void); +uint8_t gc_profiling_set_metadata(ddog_prof_Label *labels, int labels_length); diff --git a/ext/ddtrace_profiling_native_extension/collectors_stack.c b/ext/ddtrace_profiling_native_extension/collectors_stack.c index 7611f13e41e..7cb073928e9 100644 --- a/ext/ddtrace_profiling_native_extension/collectors_stack.c +++ b/ext/ddtrace_profiling_native_extension/collectors_stack.c @@ -11,9 +11,6 @@ // Gathers stack traces from running threads, storing them in a StackRecorder instance // This file implements the native bits of the Datadog::Profiling::Collectors::Stack class -#define MAX_FRAMES_LIMIT 10000 -#define MAX_FRAMES_LIMIT_AS_STRING "10000" - static VALUE missing_string = Qnil; // Used as scratch space during sampling @@ -36,23 +33,7 @@ static VALUE _native_sample( VALUE in_gc ); static void maybe_add_placeholder_frames_omitted(VALUE thread, sampling_buffer* buffer, char *frames_omitted_message, int frames_omitted_message_size); -static void record_placeholder_stack_in_native_code( - sampling_buffer* buffer, - VALUE recorder_instance, - sample_values values, - sample_labels labels, - sampling_buffer *record_buffer, - int extra_frames_in_record_buffer -); -static void sample_thread_internal( - VALUE thread, - sampling_buffer* buffer, - VALUE recorder_instance, - sample_values values, - sample_labels labels, - sampling_buffer *record_buffer, - int extra_frames_in_record_buffer -); +static void record_placeholder_stack_in_native_code(sampling_buffer* buffer, VALUE recorder_instance, sample_values values, sample_labels labels); void collectors_stack_init(VALUE profiling_module) { VALUE collectors_module = rb_define_module_under(profiling_module, "Collectors"); @@ -88,6 +69,7 @@ static VALUE _native_sample( .cpu_or_wall_samples = NUM2UINT(rb_hash_lookup2(metric_values_hash, rb_str_new_cstr("cpu-samples"), zero)), .wall_time_ns = NUM2UINT(rb_hash_lookup2(metric_values_hash, rb_str_new_cstr("wall-time"), zero)), .alloc_samples = NUM2UINT(rb_hash_lookup2(metric_values_hash, rb_str_new_cstr("alloc-samples"), zero)), + .timeline_wall_time_ns = NUM2UINT(rb_hash_lookup2(metric_values_hash, rb_str_new_cstr("timeline"), zero)), }; long labels_count = RARRAY_LEN(labels_array) + RARRAY_LEN(numeric_labels_array); @@ -122,62 +104,29 @@ static VALUE _native_sample( ddog_prof_Slice_Label slice_labels = {.ptr = labels, .len = labels_count}; - sample_thread( - thread, - buffer, - recorder_instance, - values, - (sample_labels) {.labels = slice_labels, .state_label = state_label}, - RTEST(in_gc) ? SAMPLE_IN_GC : SAMPLE_REGULAR - ); + if (in_gc == Qtrue) { + record_placeholder_stack( + buffer, + recorder_instance, + values, + (sample_labels) {.labels = slice_labels, .state_label = state_label}, + DDOG_CHARSLICE_C("Garbage Collection") + ); + } else { + sample_thread( + thread, + buffer, + recorder_instance, + values, + (sample_labels) {.labels = slice_labels, .state_label = state_label} + ); + } sampling_buffer_free(buffer); return Qtrue; } -void sample_thread( - VALUE thread, - sampling_buffer* buffer, - VALUE recorder_instance, - sample_values values, - sample_labels labels, - sample_type type -) { - // Samples thread into recorder - if (type == SAMPLE_REGULAR) { - sampling_buffer *record_buffer = buffer; - int extra_frames_in_record_buffer = 0; - sample_thread_internal(thread, buffer, recorder_instance, values, labels, record_buffer, extra_frames_in_record_buffer); - return; - } - - // Samples thread into recorder, including as a top frame in the stack a frame named "Garbage Collection" - if (type == SAMPLE_IN_GC) { - ddog_CharSlice function_name = DDOG_CHARSLICE_C(""); - ddog_CharSlice function_filename = DDOG_CHARSLICE_C("Garbage Collection"); - buffer->locations[0] = (ddog_prof_Location) { - .function = (ddog_prof_Function) {.name = function_name, .filename = function_filename}, - .line = 0 - }; - // To avoid changing sample_thread_internal, we just prepare a new buffer struct that uses the same underlying storage as the - // original buffer, but has capacity one less, so that we can keep the above Garbage Collection frame untouched. - sampling_buffer thread_in_gc_buffer = (struct sampling_buffer) { - .max_frames = buffer->max_frames - 1, - .stack_buffer = buffer->stack_buffer + 1, - .lines_buffer = buffer->lines_buffer + 1, - .is_ruby_frame = buffer->is_ruby_frame + 1, - .locations = buffer->locations + 1, - }; - sampling_buffer *record_buffer = buffer; // We pass in the original buffer as the record_buffer, but not as the regular buffer - int extra_frames_in_record_buffer = 1; - sample_thread_internal(thread, &thread_in_gc_buffer, recorder_instance, values, labels, record_buffer, extra_frames_in_record_buffer); - return; - } - - rb_raise(rb_eArgError, "Unexpected value for sample_type: %d", type); -} - #define CHARSLICE_EQUALS(must_be_a_literal, charslice) (strlen("" must_be_a_literal) == charslice.len && strncmp(must_be_a_literal, charslice.ptr, charslice.len) == 0) // Idea: Should we release the global vm lock (GVL) after we get the data from `rb_profile_frames`? That way other Ruby threads @@ -189,24 +138,12 @@ void sample_thread( // * Should we move this into a different thread entirely? // * If we don't move it into a different thread, does releasing the GVL on a Ruby thread mean that we're introducing // a new thread switch point where there previously was none? -// -// --- -// -// Why the weird extra record_buffer and extra_frames_in_record_buffer? -// The answer is: to support both sample_thread() and sample_thread_in_gc(). -// -// For sample_thread(), buffer == record_buffer and extra_frames_in_record_buffer == 0, so it's a no-op. -// For sample_thread_in_gc(), the buffer is a special buffer that is the same as the record_buffer, but with every -// pointer shifted forward extra_frames_in_record_buffer elements, so that the caller can actually inject those extra -// frames, and this function doesn't have to care about it. -static void sample_thread_internal( +void sample_thread( VALUE thread, sampling_buffer* buffer, VALUE recorder_instance, sample_values values, - sample_labels labels, - sampling_buffer *record_buffer, - int extra_frames_in_record_buffer + sample_labels labels ) { int captured_frames = ddtrace_rb_profile_frames( thread, @@ -218,14 +155,7 @@ static void sample_thread_internal( ); if (captured_frames == PLACEHOLDER_STACK_IN_NATIVE_CODE) { - record_placeholder_stack_in_native_code( - buffer, - recorder_instance, - values, - labels, - record_buffer, - extra_frames_in_record_buffer - ); + record_placeholder_stack_in_native_code(buffer, recorder_instance, values, labels); return; } @@ -332,7 +262,7 @@ static void sample_thread_internal( record_sample( recorder_instance, - (ddog_prof_Slice_Location) {.ptr = record_buffer->locations, .len = captured_frames + extra_frames_in_record_buffer}, + (ddog_prof_Slice_Location) {.ptr = buffer->locations, .len = captured_frames}, values, labels ); @@ -379,24 +309,35 @@ static void maybe_add_placeholder_frames_omitted(VALUE thread, sampling_buffer* // // To give customers visibility into these threads, rather than reporting an empty stack, we replace the empty stack // with one containing a placeholder frame, so that these threads are properly represented in the UX. + static void record_placeholder_stack_in_native_code( + sampling_buffer* buffer, + VALUE recorder_instance, + sample_values values, + sample_labels labels +) { + record_placeholder_stack( + buffer, + recorder_instance, + values, + labels, + DDOG_CHARSLICE_C("In native code") + ); +} + +void record_placeholder_stack( sampling_buffer* buffer, VALUE recorder_instance, sample_values values, sample_labels labels, - sampling_buffer *record_buffer, - int extra_frames_in_record_buffer + ddog_CharSlice placeholder_stack ) { - ddog_CharSlice function_name = DDOG_CHARSLICE_C(""); - ddog_CharSlice function_filename = DDOG_CHARSLICE_C("In native code"); - buffer->locations[0] = (ddog_prof_Location) { - .function = (ddog_prof_Function) {.name = function_name, .filename = function_filename}, - .line = 0 - }; + ddog_prof_Function placeholder = {.name = DDOG_CHARSLICE_C(""), .filename = placeholder_stack}; + buffer->locations[0] = (ddog_prof_Location) {.function = placeholder, .line = 0}; record_sample( recorder_instance, - (ddog_prof_Slice_Location) {.ptr = record_buffer->locations, .len = 1 + extra_frames_in_record_buffer}, + (ddog_prof_Slice_Location) {.ptr = buffer->locations, .len = 1}, values, labels ); diff --git a/ext/ddtrace_profiling_native_extension/collectors_stack.h b/ext/ddtrace_profiling_native_extension/collectors_stack.h index e4175ae35e8..816407ff8cc 100644 --- a/ext/ddtrace_profiling_native_extension/collectors_stack.h +++ b/ext/ddtrace_profiling_native_extension/collectors_stack.h @@ -4,17 +4,24 @@ #include "stack_recorder.h" -typedef struct sampling_buffer sampling_buffer; +#define MAX_FRAMES_LIMIT 10000 +#define MAX_FRAMES_LIMIT_AS_STRING "10000" -typedef enum { SAMPLE_REGULAR, SAMPLE_IN_GC } sample_type; +typedef struct sampling_buffer sampling_buffer; void sample_thread( VALUE thread, + sampling_buffer* buffer, + VALUE recorder_instance, + sample_values values, + sample_labels labels +); +void record_placeholder_stack( sampling_buffer* buffer, VALUE recorder_instance, sample_values values, sample_labels labels, - sample_type type + ddog_CharSlice placeholder_stack ); sampling_buffer *sampling_buffer_new(unsigned int max_frames); void sampling_buffer_free(sampling_buffer *buffer); diff --git a/ext/ddtrace_profiling_native_extension/collectors_thread_context.c b/ext/ddtrace_profiling_native_extension/collectors_thread_context.c index 3b1c798260c..cbfb06c3e58 100644 --- a/ext/ddtrace_profiling_native_extension/collectors_thread_context.c +++ b/ext/ddtrace_profiling_native_extension/collectors_thread_context.c @@ -3,6 +3,7 @@ #include "collectors_thread_context.h" #include "clock_id.h" #include "collectors_stack.h" +#include "collectors_gc_profiling_helper.h" #include "helpers.h" #include "libdatadog_helpers.h" #include "private_vm_api_access.h" @@ -37,24 +38,29 @@ // When `thread_context_collector_on_gc_start` gets called, the current cpu and wall-time get recorded to the thread // context: `cpu_time_at_gc_start_ns` and `wall_time_at_gc_start_ns`. // -// While these fields are set, regular samples (if any) do not account for any time that passes after these two -// timestamps. +// While `cpu_time_at_gc_start_ns` is set, regular samples (if any) do not account for cpu-time any time that passes +// after this timestamp. The idea is that this cpu-time will be blamed separately on GC, and not on the user thread. +// Wall-time accounting is not affected by this (e.g. we still record 60 seconds every 60 seconds). // -// (Regular samples can still account for the time between the previous sample and the start of GC.) +// (Regular samples can still account for the cpu-time between the previous sample and the start of GC.) // -// When `thread_context_collector_on_gc_finish` gets called, the current cpu and wall-time again get recorded to the -// thread context: `cpu_time_at_gc_finish_ns` and `wall_time_at_gc_finish_ns`. +// When `thread_context_collector_on_gc_finish` gets called, the cpu-time and wall-time spent during GC gets recorded +// into the global gc_tracking structure, and further samples are not affected. (The `cpu_time_at_previous_sample_ns` +// of the thread that did GC also gets adjusted to avoid double-accounting.) // -// Finally, when `thread_context_collector_sample_after_gc` gets called, the following happens: +// Finally, when `thread_context_collector_sample_after_gc` gets called, a sample gets recorded with a stack having +// a single placeholder `Garbage Collection` frame. This sample gets +// assigned the cpu-time and wall-time that was recorded between calls to `on_gc_start` and `on_gc_finish`, as well +// as metadata for the last GC. // -// 1. A sample gets taken, using the special `SAMPLE_IN_GC` sample type, which produces a stack with a placeholder -// `Garbage Collection` frame as the latest frame. This sample gets assigned the cpu-time and wall-time period that was -// recorded between calls to `on_gc_start` and `on_gc_finish`. -// -// 2. The thread is no longer marked as being in gc (all gc tracking fields get reset back to `INVALID_TIME`). -// -// 3. The `cpu_time_at_previous_sample_ns` and `wall_time_at_previous_sample_ns` get updated with the elapsed time in -// GC, so that all time is accounted for -- e.g. the next sample will not get "blamed" by time spent in GC. +// Note that the Ruby GC does not usually do all of the GC work in one go. Instead, it breaks it up into smaller steps +// so that the application can keep doing user work in between GC steps. +// The `on_gc_start` / `on_gc_finish` will trigger each time the VM executes these smaller steps, and on a benchmark +// that executes `Object.new` in a loop, I measured more than 50k of this steps per second (!!). +// Creating these many events for every GC step is a lot of overhead, so instead `on_gc_finish` coalesces time +// spent in GC and only flushes it at most every 10 ms/every complete GC collection. This reduces the amount of +// individual GC events we need to record. We use the latest GC metadata for this event, reflecting the last GC that +// happened in the coalesced period. // // In an earlier attempt at implementing this functionality (https://github.com/DataDog/dd-trace-rb/pull/2308), we // discovered that we needed to factor the sampling work away from `thread_context_collector_on_gc_finish` and into a @@ -68,6 +74,7 @@ #define IS_WALL_TIME true #define IS_NOT_WALL_TIME false #define MISSING_TRACER_CONTEXT_KEY 0 +#define TIME_BETWEEN_GC_EVENTS_NS MILLIS_AS_NS(10) static ID at_active_span_id; // id of :@active_span in Ruby static ID at_active_trace_id; // id of :@active_trace in Ruby @@ -114,6 +121,14 @@ struct thread_context_collector_state { // See thread_context_collector_on_gc_start for details unsigned int gc_samples_missed_due_to_missing_context; } stats; + + struct { + unsigned long accumulated_cpu_time_ns; + unsigned long accumulated_wall_time_ns; + + long wall_time_at_previous_gc_ns; // Will be INVALID_TIME unless there's accumulated time above + long wall_time_at_last_flushed_gc_event_ns; // Starts at 0 and then will always be valid + } gc_tracking; }; // Tracks per-thread state @@ -127,15 +142,10 @@ struct per_thread_context { long wall_time_at_previous_sample_ns; // Can be INVALID_TIME until initialized struct { - // Both of these fields are set by on_gc_start and kept until sample_after_gc is called. + // Both of these fields are set by on_gc_start and kept until on_gc_finish is called. // Outside of this window, they will be INVALID_TIME. long cpu_time_at_start_ns; long wall_time_at_start_ns; - - // Both of these fields are set by on_gc_finish and kept until sample_after_gc is called. - // Outside of this window, they will be INVALID_TIME. - long cpu_time_at_finish_ns; - long wall_time_at_finish_ns; } gc_tracking; }; @@ -180,7 +190,6 @@ static void trigger_sample_for_thread( VALUE stack_from_thread, struct per_thread_context *thread_context, sample_values values, - sample_type type, long current_monotonic_wall_time_ns, ddog_CharSlice *ruby_vm_type, ddog_CharSlice *class_name @@ -193,6 +202,7 @@ static VALUE _native_inspect(VALUE self, VALUE collector_instance); static VALUE per_thread_context_st_table_as_ruby_hash(struct thread_context_collector_state *state); static int per_thread_context_as_ruby_hash(st_data_t key_thread, st_data_t value_context, st_data_t result_hash); static VALUE stats_as_ruby_hash(struct thread_context_collector_state *state); +static VALUE gc_tracking_as_ruby_hash(struct thread_context_collector_state *state); static void remove_context_for_dead_threads(struct thread_context_collector_state *state); static int remove_if_dead_thread(st_data_t key_thread, st_data_t value_context, st_data_t _argument); static VALUE _native_per_thread_context(VALUE self, VALUE collector_instance); @@ -200,13 +210,14 @@ static long update_time_since_previous_sample(long *time_at_previous_sample_ns, static long cpu_time_now_ns(struct per_thread_context *thread_context); static long thread_id_for(VALUE thread); static VALUE _native_stats(VALUE self, VALUE collector_instance); +static VALUE _native_gc_tracking(VALUE self, VALUE collector_instance); static void trace_identifiers_for(struct thread_context_collector_state *state, VALUE thread, struct trace_identifiers *trace_identifiers_result); static bool should_collect_resource(VALUE root_span_type); static VALUE _native_reset_after_fork(DDTRACE_UNUSED VALUE self, VALUE collector_instance); static VALUE thread_list(struct thread_context_collector_state *state); static VALUE _native_sample_allocation(DDTRACE_UNUSED VALUE self, VALUE collector_instance, VALUE sample_weight, VALUE new_object); static VALUE _native_new_empty_thread(VALUE self); -ddog_CharSlice ruby_value_type_to_class_name(enum ruby_value_type type); +static ddog_CharSlice ruby_value_type_to_class_name(enum ruby_value_type type); void collectors_thread_context_init(VALUE profiling_module) { VALUE collectors_module = rb_define_module_under(profiling_module, "Collectors"); @@ -235,6 +246,7 @@ void collectors_thread_context_init(VALUE profiling_module) { rb_define_singleton_method(testing_module, "_native_thread_list", _native_thread_list, 0); rb_define_singleton_method(testing_module, "_native_per_thread_context", _native_per_thread_context, 1); rb_define_singleton_method(testing_module, "_native_stats", _native_stats, 1); + rb_define_singleton_method(testing_module, "_native_gc_tracking", _native_gc_tracking, 1); rb_define_singleton_method(testing_module, "_native_new_empty_thread", _native_new_empty_thread, 0); at_active_span_id = rb_intern_const("@active_span"); @@ -243,6 +255,8 @@ void collectors_thread_context_init(VALUE profiling_module) { at_resource_id = rb_intern_const("@resource"); at_root_span_id = rb_intern_const("@root_span"); at_type_id = rb_intern_const("@type"); + + gc_profiling_init(); } // This structure is used to define a Ruby object that stores a pointer to a struct thread_context_collector_state @@ -320,6 +334,8 @@ static VALUE _native_new(VALUE klass) { state->allocation_type_enabled = true; state->time_converter_state = (monotonic_to_system_epoch_state) MONOTONIC_TO_SYSTEM_EPOCH_INITIALIZER; state->main_thread = rb_thread_main(); + state->gc_tracking.wall_time_at_previous_gc_ns = INVALID_TIME; + state->gc_tracking.wall_time_at_last_flushed_gc_event_ns = 0; return TypedData_Wrap_Struct(klass, &thread_context_collector_typed_data, state); } @@ -465,7 +481,11 @@ void update_metrics_and_sample( long wall_time_elapsed_ns = update_time_since_previous_sample( &thread_context->wall_time_at_previous_sample_ns, current_monotonic_wall_time_ns, - thread_context->gc_tracking.wall_time_at_start_ns, + // We explicitly pass in `INVALID_TIME` as an argument for `gc_start_time_ns` here because we don't want wall-time + // accounting to change during GC. + // E.g. if 60 seconds pass in the real world, 60 seconds of wall-time are recorded, regardless of the thread doing + // GC or not. + INVALID_TIME, IS_WALL_TIME ); @@ -475,7 +495,6 @@ void update_metrics_and_sample( stack_from_thread, thread_context, (sample_values) {.cpu_time_ns = cpu_time_elapsed_ns, .cpu_or_wall_samples = 1, .wall_time_ns = wall_time_elapsed_ns}, - SAMPLE_REGULAR, current_monotonic_wall_time_ns, NULL, NULL @@ -484,7 +503,7 @@ void update_metrics_and_sample( // This function gets called when Ruby is about to start running the Garbage Collector on the current thread. // It updates the per_thread_context of the current thread to include the current cpu/wall times, to be used to later -// create a stack sample that blames the cpu/wall time spent from now until the end of the garbage collector work. +// create an event including the cpu/wall time spent in garbage collector work. // // Safety: This function gets called while Ruby is doing garbage collection. While Ruby is doing garbage collection, // *NO ALLOCATION* is allowed. This function, and any it calls must never trigger memory or object allocation. @@ -509,27 +528,14 @@ void thread_context_collector_on_gc_start(VALUE self_instance) { return; } - // If these fields are set, there's an existing GC sample that still needs to be written out by `sample_after_gc`. - // - // When can this happen? Because we don't have precise control over when `sample_after_gc` gets called (it will be - // called sometime after GC finishes), there is no way to guarantee that Ruby will not trigger more than one GC cycle - // before we can actually run that method. - // - // We handle this by collapsing multiple GC cycles into one. That is, if the following happens: - // `on_gc_start` (time=0) -> `on_gc_finish` (time=1) -> `on_gc_start` (time=2) -> `on_gc_finish` (time=3) -> `sample_after_gc` - // then we just use time=0 from the first on_gc_start and time=3 from the last on_gc_finish, e.g. we behave as if - // there was a single, longer GC period. - if (thread_context->gc_tracking.cpu_time_at_finish_ns != INVALID_TIME && - thread_context->gc_tracking.wall_time_at_finish_ns != INVALID_TIME) return; - - // Here we record the wall-time first and in on_gc_finish we record it second to avoid having wall-time be slightly < cpu-time + // Here we record the wall-time first and in on_gc_finish we record it second to try to avoid having wall-time be slightly < cpu-time thread_context->gc_tracking.wall_time_at_start_ns = monotonic_wall_time_now_ns(DO_NOT_RAISE_ON_FAILURE); thread_context->gc_tracking.cpu_time_at_start_ns = cpu_time_now_ns(thread_context); } // This function gets called when Ruby has finished running the Garbage Collector on the current thread. -// It updates the per_thread_context of the current thread to include the current cpu/wall times, to be used to later -// create a stack sample that blames the cpu/wall time spent from the start of garbage collector work until now. +// It records the cpu/wall-time observed during GC, which will be used to later +// create an event including the cpu/wall time spent from the start of garbage collector work until now. // // Safety: This function gets called while Ruby is doing garbage collection. While Ruby is doing garbage collection, // *NO ALLOCATION* is allowed. This function, and any it calls must never trigger memory or object allocation. @@ -537,9 +543,9 @@ void thread_context_collector_on_gc_start(VALUE self_instance) { // // Assumption 1: This function is called in a thread that is holding the Global VM Lock. Caller is responsible for enforcing this. // Assumption 2: This function is called from the main Ractor (if Ruby has support for Ractors). -void thread_context_collector_on_gc_finish(VALUE self_instance) { +bool thread_context_collector_on_gc_finish(VALUE self_instance) { struct thread_context_collector_state *state; - if (!rb_typeddata_is_kind_of(self_instance, &thread_context_collector_typed_data)) return; + if (!rb_typeddata_is_kind_of(self_instance, &thread_context_collector_typed_data)) return false; // This should never fail the the above check passes TypedData_Get_Struct(self_instance, struct thread_context_collector_state, &thread_context_collector_typed_data, state); @@ -547,29 +553,67 @@ void thread_context_collector_on_gc_finish(VALUE self_instance) { // If there was no previously-existing context for this thread, we won't allocate one (see safety). We keep a metric for // how often this happens -- see on_gc_start. - if (thread_context == NULL) return; + if (thread_context == NULL) return false; - if (thread_context->gc_tracking.cpu_time_at_start_ns == INVALID_TIME && - thread_context->gc_tracking.wall_time_at_start_ns == INVALID_TIME) { + long cpu_time_at_start_ns = thread_context->gc_tracking.cpu_time_at_start_ns; + long wall_time_at_start_ns = thread_context->gc_tracking.wall_time_at_start_ns; + + if (cpu_time_at_start_ns == INVALID_TIME && wall_time_at_start_ns == INVALID_TIME) { // If this happened, it means that on_gc_start was either never called for the thread OR it was called but no thread // context existed at the time. The former can be the result of a bug, but since we can't distinguish them, we just // do nothing. - return; + return false; + } + + // Mark thread as no longer in GC + thread_context->gc_tracking.cpu_time_at_start_ns = INVALID_TIME; + thread_context->gc_tracking.wall_time_at_start_ns = INVALID_TIME; + + // Here we record the wall-time second and in on_gc_start we record it first to try to avoid having wall-time be slightly < cpu-time + long cpu_time_at_finish_ns = cpu_time_now_ns(thread_context); + long wall_time_at_finish_ns = monotonic_wall_time_now_ns(DO_NOT_RAISE_ON_FAILURE); + + // If our end timestamp is not OK, we bail out + if (wall_time_at_finish_ns == 0) return false; + + long gc_cpu_time_elapsed_ns = cpu_time_at_finish_ns - cpu_time_at_start_ns; + long gc_wall_time_elapsed_ns = wall_time_at_finish_ns - wall_time_at_start_ns; + + // Wall-time can go backwards if the system clock gets changed (and we observed spurious jumps back on macOS as well) + // so let's ensure we don't get negative values for time deltas. + gc_cpu_time_elapsed_ns = long_max_of(gc_cpu_time_elapsed_ns, 0); + gc_wall_time_elapsed_ns = long_max_of(gc_wall_time_elapsed_ns, 0); + + if (state->gc_tracking.wall_time_at_previous_gc_ns == INVALID_TIME) { + state->gc_tracking.accumulated_cpu_time_ns = 0; + state->gc_tracking.accumulated_wall_time_ns = 0; } - // Here we record the wall-time second and in on_gc_start we record it first to avoid having wall-time be slightly < cpu-time - thread_context->gc_tracking.cpu_time_at_finish_ns = cpu_time_now_ns(thread_context); - thread_context->gc_tracking.wall_time_at_finish_ns = monotonic_wall_time_now_ns(DO_NOT_RAISE_ON_FAILURE); + state->gc_tracking.accumulated_cpu_time_ns += gc_cpu_time_elapsed_ns; + state->gc_tracking.accumulated_wall_time_ns += gc_wall_time_elapsed_ns; + state->gc_tracking.wall_time_at_previous_gc_ns = wall_time_at_finish_ns; + + // Update cpu-time accounting so it doesn't include the cpu-time spent in GC during the next sample + // We don't update the wall-time because we don't subtract the wall-time spent in GC (see call to + // `update_time_since_previous_sample` for wall-time in `update_metrics_and_sample`). + if (thread_context->cpu_time_at_previous_sample_ns != INVALID_TIME) { + thread_context->cpu_time_at_previous_sample_ns += gc_cpu_time_elapsed_ns; + } + + // Let the caller know if it should schedule a flush or not. Returning true every time would cause a lot of overhead + // on the application (see GC tracking introduction at the top of the file), so instead we try to accumulate a few + // samples first. + bool finished_major_gc = gc_profiling_has_major_gc_finished(); + bool over_flush_time_treshold = + (wall_time_at_finish_ns - state->gc_tracking.wall_time_at_last_flushed_gc_event_ns) >= TIME_BETWEEN_GC_EVENTS_NS; + + return finished_major_gc || over_flush_time_treshold; } -// This function gets called shortly after Ruby has finished running the Garbage Collector. +// This function gets called after one or more GC work steps (calls to on_gc_start/on_gc_finish). // It creates a new sample including the cpu and wall-time spent by the garbage collector work, and resets any // GC-related tracking. // -// Specifically, it will search for thread(s) which have gone through a cycle of on_gc_start/on_gc_finish -// and thus have cpu_time_at_start_ns, cpu_time_at_finish_ns, wall_time_at_start_ns, wall_time_at_finish_ns -// set on their context. -// // Assumption 1: This function is called in a thread that is holding the Global VM Lock. Caller is responsible for enforcing this. // Assumption 2: This function is allowed to raise exceptions. Caller is responsible for handling them, if needed. // Assumption 3: Unlike `on_gc_start` and `on_gc_finish`, this method is allowed to allocate memory as needed. @@ -578,70 +622,45 @@ VALUE thread_context_collector_sample_after_gc(VALUE self_instance) { struct thread_context_collector_state *state; TypedData_Get_Struct(self_instance, struct thread_context_collector_state, &thread_context_collector_typed_data, state); - VALUE threads = thread_list(state); - bool sampled_any_thread = false; - - const long thread_count = RARRAY_LEN(threads); - for (long i = 0; i < thread_count; i++) { - VALUE thread = RARRAY_AREF(threads, i); - struct per_thread_context *thread_context = get_or_create_context_for(thread, state); + if (state->gc_tracking.wall_time_at_previous_gc_ns == INVALID_TIME) { + rb_raise(rb_eRuntimeError, "BUG: Unexpected call to sample_after_gc without valid GC information available"); + } - if ( - thread_context->gc_tracking.cpu_time_at_start_ns == INVALID_TIME || - thread_context->gc_tracking.cpu_time_at_finish_ns == INVALID_TIME || - thread_context->gc_tracking.wall_time_at_start_ns == INVALID_TIME || - thread_context->gc_tracking.wall_time_at_finish_ns == INVALID_TIME - ) continue; // Ignore threads with no/incomplete garbage collection data - - sampled_any_thread = true; - - long gc_cpu_time_elapsed_ns = - thread_context->gc_tracking.cpu_time_at_finish_ns - thread_context->gc_tracking.cpu_time_at_start_ns; - long gc_wall_time_elapsed_ns = - thread_context->gc_tracking.wall_time_at_finish_ns - thread_context->gc_tracking.wall_time_at_start_ns; - - // We don't expect non-wall time to go backwards, so let's flag this as a bug - if (gc_cpu_time_elapsed_ns < 0) rb_raise(rb_eRuntimeError, "BUG: Unexpected negative gc_cpu_time_elapsed_ns between samples"); - // Wall-time can actually go backwards (e.g. when the system clock gets set) so we can't assume time going backwards - // was a bug. - // @ivoanjo: I've also observed time going backwards spuriously on macOS, see discussion on - // https://github.com/DataDog/dd-trace-rb/pull/2336. - if (gc_wall_time_elapsed_ns < 0) gc_wall_time_elapsed_ns = 0; - - if (thread_context->gc_tracking.wall_time_at_start_ns == 0 && thread_context->gc_tracking.wall_time_at_finish_ns != 0) { - // Avoid using wall-clock if we got 0 for a start (meaning there was an error) but not 0 for finish so we don't - // come up with a crazy value for the frame - rb_raise(rb_eRuntimeError, "BUG: Unexpected zero value for gc_tracking.wall_time_at_start_ns"); - } + int max_labels_needed_for_gc = 7; // Magic number gets validated inside gc_profiling_set_metadata + ddog_prof_Label labels[max_labels_needed_for_gc]; + uint8_t label_pos = gc_profiling_set_metadata(labels, max_labels_needed_for_gc); - trigger_sample_for_thread( - state, - /* thread: */ thread, - /* stack_from_thread: */ thread, - thread_context, - (sample_values) {.cpu_time_ns = gc_cpu_time_elapsed_ns, .cpu_or_wall_samples = 1, .wall_time_ns = gc_wall_time_elapsed_ns}, - SAMPLE_IN_GC, - INVALID_TIME, // For now we're not collecting timestamps for these events - NULL, - NULL - ); + ddog_prof_Slice_Label slice_labels = {.ptr = labels, .len = label_pos}; - // Mark thread as no longer in GC - thread_context->gc_tracking.cpu_time_at_start_ns = INVALID_TIME; - thread_context->gc_tracking.cpu_time_at_finish_ns = INVALID_TIME; - thread_context->gc_tracking.wall_time_at_start_ns = INVALID_TIME; - thread_context->gc_tracking.wall_time_at_finish_ns = INVALID_TIME; + // The end_timestamp_ns is treated specially by libdatadog and that's why it's not added as a ddog_prof_Label + int64_t end_timestamp_ns = 0; - // Update counters so that they won't include the time in GC during the next sample - if (thread_context->cpu_time_at_previous_sample_ns != INVALID_TIME) { - thread_context->cpu_time_at_previous_sample_ns += gc_cpu_time_elapsed_ns; - } - if (thread_context->wall_time_at_previous_sample_ns != INVALID_TIME) { - thread_context->wall_time_at_previous_sample_ns += gc_wall_time_elapsed_ns; - } + if (state->timeline_enabled) { + end_timestamp_ns = monotonic_to_system_epoch_ns(&state->time_converter_state, state->gc_tracking.wall_time_at_previous_gc_ns); } - if (sampled_any_thread) state->stats.gc_samples++; + record_placeholder_stack( + state->sampling_buffer, + state->recorder_instance, + (sample_values) { + // This event gets both a regular cpu/wall-time duration, as a normal cpu/wall-time sample would, as well as a + // timeline duration. + // This is done to enable two use-cases: + // * regular cpu/wall-time makes this event show up as a regular stack in the flamegraph + // * the timeline duration is used when the event shows up in the timeline + .cpu_time_ns = state->gc_tracking.accumulated_cpu_time_ns, + .cpu_or_wall_samples = 1, + .wall_time_ns = state->gc_tracking.accumulated_wall_time_ns, + .timeline_wall_time_ns = state->gc_tracking.accumulated_wall_time_ns, + }, + (sample_labels) {.labels = slice_labels, .state_label = NULL, .end_timestamp_ns = end_timestamp_ns}, + DDOG_CHARSLICE_C("Garbage Collection") + ); + + state->gc_tracking.wall_time_at_last_flushed_gc_event_ns = state->gc_tracking.wall_time_at_previous_gc_ns; + state->gc_tracking.wall_time_at_previous_gc_ns = INVALID_TIME; + + state->stats.gc_samples++; // Return a VALUE to make it easier to call this function from Ruby APIs that expect a return value (such as rb_rescue2) return Qnil; @@ -653,7 +672,6 @@ static void trigger_sample_for_thread( VALUE stack_from_thread, // This can be different when attributing profiler overhead using a different stack struct per_thread_context *thread_context, sample_values values, - sample_type type, long current_monotonic_wall_time_ns, // These two labels are only used for allocation profiling; @ivoanjo: may want to refactor this at some point? ddog_CharSlice *ruby_vm_type, @@ -776,8 +794,7 @@ static void trigger_sample_for_thread( state->sampling_buffer, state->recorder_instance, values, - (sample_labels) {.labels = slice_labels, .state_label = state_label, .end_timestamp_ns = end_timestamp_ns}, - type + (sample_labels) {.labels = slice_labels, .state_label = state_label, .end_timestamp_ns = end_timestamp_ns} ); } @@ -874,9 +891,7 @@ static void initialize_context(VALUE thread, struct per_thread_context *thread_c // These will only be used during a GC operation thread_context->gc_tracking.cpu_time_at_start_ns = INVALID_TIME; - thread_context->gc_tracking.cpu_time_at_finish_ns = INVALID_TIME; thread_context->gc_tracking.wall_time_at_start_ns = INVALID_TIME; - thread_context->gc_tracking.wall_time_at_finish_ns = INVALID_TIME; } static VALUE _native_inspect(DDTRACE_UNUSED VALUE _self, VALUE collector_instance) { @@ -901,6 +916,7 @@ static VALUE _native_inspect(DDTRACE_UNUSED VALUE _self, VALUE collector_instanc state->time_converter_state.delta_to_epoch_ns )); rb_str_concat(result, rb_sprintf(" main_thread=%"PRIsVALUE, state->main_thread)); + rb_str_concat(result, rb_sprintf(" gc_tracking=%"PRIsVALUE, gc_tracking_as_ruby_hash(state))); return result; } @@ -927,9 +943,7 @@ static int per_thread_context_as_ruby_hash(st_data_t key_thread, st_data_t value ID2SYM(rb_intern("wall_time_at_previous_sample_ns")), /* => */ LONG2NUM(thread_context->wall_time_at_previous_sample_ns), ID2SYM(rb_intern("gc_tracking.cpu_time_at_start_ns")), /* => */ LONG2NUM(thread_context->gc_tracking.cpu_time_at_start_ns), - ID2SYM(rb_intern("gc_tracking.cpu_time_at_finish_ns")), /* => */ LONG2NUM(thread_context->gc_tracking.cpu_time_at_finish_ns), ID2SYM(rb_intern("gc_tracking.wall_time_at_start_ns")), /* => */ LONG2NUM(thread_context->gc_tracking.wall_time_at_start_ns), - ID2SYM(rb_intern("gc_tracking.wall_time_at_finish_ns")), /* => */ LONG2NUM(thread_context->gc_tracking.wall_time_at_finish_ns) }; for (long unsigned int i = 0; i < VALUE_COUNT(arguments); i += 2) rb_hash_aset(context_as_hash, arguments[i], arguments[i+1]); @@ -947,6 +961,19 @@ static VALUE stats_as_ruby_hash(struct thread_context_collector_state *state) { return stats_as_hash; } +static VALUE gc_tracking_as_ruby_hash(struct thread_context_collector_state *state) { + // Update this when modifying state struct (gc_tracking inner struct) + VALUE result = rb_hash_new(); + VALUE arguments[] = { + ID2SYM(rb_intern("accumulated_cpu_time_ns")), /* => */ ULONG2NUM(state->gc_tracking.accumulated_cpu_time_ns), + ID2SYM(rb_intern("accumulated_wall_time_ns")), /* => */ ULONG2NUM(state->gc_tracking.accumulated_wall_time_ns), + ID2SYM(rb_intern("wall_time_at_previous_gc_ns")), /* => */ LONG2NUM(state->gc_tracking.wall_time_at_previous_gc_ns), + ID2SYM(rb_intern("wall_time_at_last_flushed_gc_event_ns")), /* => */ LONG2NUM(state->gc_tracking.wall_time_at_last_flushed_gc_event_ns), + }; + for (long unsigned int i = 0; i < VALUE_COUNT(arguments); i += 2) rb_hash_aset(result, arguments[i], arguments[i+1]); + return result; +} + static void remove_context_for_dead_threads(struct thread_context_collector_state *state) { st_foreach(state->hash_map_per_thread_context, remove_if_dead_thread, 0 /* unused */); } @@ -1049,8 +1076,6 @@ VALUE enforce_thread_context_collector_instance(VALUE object) { // This method exists only to enable testing Datadog::Profiling::Collectors::ThreadContext behavior using RSpec. // It SHOULD NOT be used for other purposes. -// -// Returns the whole contents of the per_thread_context structs being tracked. static VALUE _native_stats(DDTRACE_UNUSED VALUE _self, VALUE collector_instance) { struct thread_context_collector_state *state; TypedData_Get_Struct(collector_instance, struct thread_context_collector_state, &thread_context_collector_typed_data, state); @@ -1058,6 +1083,15 @@ static VALUE _native_stats(DDTRACE_UNUSED VALUE _self, VALUE collector_instance) return stats_as_ruby_hash(state); } +// This method exists only to enable testing Datadog::Profiling::Collectors::ThreadContext behavior using RSpec. +// It SHOULD NOT be used for other purposes. +static VALUE _native_gc_tracking(DDTRACE_UNUSED VALUE _self, VALUE collector_instance) { + struct thread_context_collector_state *state; + TypedData_Get_Struct(collector_instance, struct thread_context_collector_state, &thread_context_collector_typed_data, state); + + return gc_tracking_as_ruby_hash(state); +} + // Assumption 1: This function is called in a thread that is holding the Global VM Lock. Caller is responsible for enforcing this. static void trace_identifiers_for(struct thread_context_collector_state *state, VALUE thread, struct trace_identifiers *trace_identifiers_result) { if (state->tracer_context_key == MISSING_TRACER_CONTEXT_KEY) return; @@ -1210,13 +1244,14 @@ void thread_context_collector_sample_allocation(VALUE self_instance, unsigned in } } + track_object(state->recorder_instance, new_object, sample_weight, optional_class_name); + trigger_sample_for_thread( state, /* thread: */ current_thread, /* stack_from_thread: */ current_thread, get_or_create_context_for(current_thread, state), (sample_values) {.alloc_samples = sample_weight}, - SAMPLE_REGULAR, INVALID_TIME, // For now we're not collecting timestamps for allocation events, as per profiling team internal discussions &ruby_vm_type, optional_class_name @@ -1239,7 +1274,7 @@ static VALUE _native_new_empty_thread(DDTRACE_UNUSED VALUE self) { return rb_thread_create(new_empty_thread_inner, NULL); } -ddog_CharSlice ruby_value_type_to_class_name(enum ruby_value_type type) { +static ddog_CharSlice ruby_value_type_to_class_name(enum ruby_value_type type) { switch (type) { case(RUBY_T_OBJECT ): return DDOG_CHARSLICE_C("Object"); case(RUBY_T_CLASS ): return DDOG_CHARSLICE_C("Class"); diff --git a/ext/ddtrace_profiling_native_extension/collectors_thread_context.h b/ext/ddtrace_profiling_native_extension/collectors_thread_context.h index 88dfabe9615..6299d96b43e 100644 --- a/ext/ddtrace_profiling_native_extension/collectors_thread_context.h +++ b/ext/ddtrace_profiling_native_extension/collectors_thread_context.h @@ -1,6 +1,7 @@ #pragma once #include +#include void thread_context_collector_sample( VALUE self_instance, @@ -10,5 +11,5 @@ void thread_context_collector_sample( void thread_context_collector_sample_allocation(VALUE self_instance, unsigned int sample_weight, VALUE new_object); VALUE thread_context_collector_sample_after_gc(VALUE self_instance); void thread_context_collector_on_gc_start(VALUE self_instance); -void thread_context_collector_on_gc_finish(VALUE self_instance); +bool thread_context_collector_on_gc_finish(VALUE self_instance); VALUE enforce_thread_context_collector_instance(VALUE object); diff --git a/ext/ddtrace_profiling_native_extension/extconf.rb b/ext/ddtrace_profiling_native_extension/extconf.rb index 2151f6ddb50..f1399ba38c7 100644 --- a/ext/ddtrace_profiling_native_extension/extconf.rb +++ b/ext/ddtrace_profiling_native_extension/extconf.rb @@ -114,6 +114,11 @@ def add_compiler_flag(flag) add_compiler_flag '-Wall' add_compiler_flag '-Wextra' +if ENV['DDTRACE_DEBUG'] + CONFIG['optflags'] = '-O0' + CONFIG['debugflags'] = '-ggdb3' +end + if RUBY_PLATFORM.include?('linux') # Supposedly, the correct way to do this is # ``` @@ -125,6 +130,9 @@ def add_compiler_flag(flag) $defs << '-DHAVE_PTHREAD_GETCPUCLOCKID' end +# On older Rubies, rb_postponed_job_preregister/rb_postponed_job_trigger did not exist +$defs << '-DNO_POSTPONED_TRIGGER' if RUBY_VERSION < '3.3' + # On older Rubies, M:N threads were not available $defs << '-DNO_MN_THREADS_AVAILABLE' if RUBY_VERSION < '3.3' diff --git a/ext/ddtrace_profiling_native_extension/heap_recorder.c b/ext/ddtrace_profiling_native_extension/heap_recorder.c new file mode 100644 index 00000000000..69fbed81442 --- /dev/null +++ b/ext/ddtrace_profiling_native_extension/heap_recorder.c @@ -0,0 +1,821 @@ +#include "heap_recorder.h" +#include +#include "ruby/st.h" +#include "ruby_helpers.h" +#include +#include "collectors_stack.h" +#include "libdatadog_helpers.h" + +// A compact representation of a stacktrace frame for a heap allocation. +typedef struct { + char *name; + char *filename; + int32_t line; +} heap_frame; +static st_index_t heap_frame_hash(heap_frame*, st_index_t seed); + +// A compact representation of a stacktrace for a heap allocation. +// +// We could use a ddog_prof_Slice_Location instead but it has a lot of +// unused fields. Because we have to keep these stacks around for at +// least the lifetime of the objects allocated therein, we would be +// incurring a non-negligible memory overhead for little purpose. +typedef struct { + uint16_t frames_len; + heap_frame frames[]; +} heap_stack; +static heap_stack* heap_stack_new(ddog_prof_Slice_Location); +static void heap_stack_free(heap_stack*); +static st_index_t heap_stack_hash(heap_stack*, st_index_t); + +#if MAX_FRAMES_LIMIT > UINT16_MAX + #error Frames len type not compatible with MAX_FRAMES_LIMIT +#endif + +enum heap_record_key_type { + HEAP_STACK, + LOCATION_SLICE +}; +// This struct allows us to use two different types of stacks when +// interacting with a heap_record hash. +// +// The idea is that we'll always want to use heap_stack-keys when +// adding new entries to the hash since that's the compact stack +// representation we rely on internally. +// +// However, when querying for an existing heap record, we'd save a +// lot of allocations if we could query with the +// ddog_prof_Slice_Location we receive in our external API. +// +// To allow this interchange, we need a union and need to ensure +// that whatever shape of the union, the heap_record_key_cmp_st +// and heap_record_hash_st functions return the same results for +// equivalent stacktraces. +typedef struct { + enum heap_record_key_type type; + union { + // key never owns this if set + heap_stack *heap_stack; + // key never owns this if set + ddog_prof_Slice_Location *location_slice; + }; +} heap_record_key; +static heap_record_key* heap_record_key_new(heap_stack*); +static void heap_record_key_free(heap_record_key*); +static int heap_record_key_cmp_st(st_data_t, st_data_t); +static st_index_t heap_record_key_hash_st(st_data_t); +static const struct st_hash_type st_hash_type_heap_record_key = { + heap_record_key_cmp_st, + heap_record_key_hash_st, +}; + +// Need to implement these functions to support the location-slice based keys +static st_index_t ddog_location_hash(ddog_prof_Location, st_index_t seed); +static st_index_t ddog_location_slice_hash(ddog_prof_Slice_Location, st_index_t seed); + +// A heap record is used for deduping heap allocation stacktraces across multiple +// objects sharing the same allocation location. +typedef struct { + // How many objects are currently tracked by the heap recorder for this heap record. + uint32_t num_tracked_objects; + // stack is owned by the associated record and gets cleaned up alongside it + heap_stack *stack; +} heap_record; +static heap_record* heap_record_new(heap_stack*); +static void heap_record_free(heap_record*); + +// An object record is used for storing data about currently tracked live objects +typedef struct { + long obj_id; + heap_record *heap_record; + live_object_data object_data; +} object_record; +static object_record* object_record_new(long, heap_record*, live_object_data); +static void object_record_free(object_record*); + +struct heap_recorder { + // Config + // Whether the recorder should try to determine approximate sizes for tracked objects. + bool size_enabled; + + // Map[key: heap_record_key*, record: heap_record*] + // NOTE: We always use heap_record_key.type == HEAP_STACK for storage but support lookups + // via heap_record_key.type == LOCATION_SLICE to allow for allocation-free fast-paths. + // NOTE: This table is currently only protected by the GVL since we never interact with it + // outside the GVL. + // NOTE: This table has ownership of both its heap_record_keys and heap_records. + st_table *heap_records; + + // Map[obj_id: long, record: object_record*] + // NOTE: This table is currently only protected by the GVL since we never interact with it + // outside the GVL. + // NOTE: This table has ownership of its object_records. The keys are longs and so are + // passed as values. + st_table *object_records; + + // Map[obj_id: long, record: object_record*] + // NOTE: This is a snapshot of object_records built ahead of a iteration. Outside of an + // iteration context, this table will be NULL. During an iteration, there will be no + // mutation of the data so iteration can occur without acquiring a lock. + // NOTE: Contrary to object_records, this table has no ownership of its data. + st_table *object_records_snapshot; + + // Data for a heap recording that was started but not yet ended + object_record *partial_object_record; + + // Reusable location array, implementing a flyweight pattern for things like iteration. + ddog_prof_Location *reusable_locations; +}; +static heap_record* get_or_create_heap_record(heap_recorder*, ddog_prof_Slice_Location); +static void cleanup_heap_record_if_unused(heap_recorder*, heap_record*); +static int st_heap_record_entry_free(st_data_t, st_data_t, st_data_t); +static int st_object_record_entry_free(st_data_t, st_data_t, st_data_t); +static int st_object_record_update(st_data_t, st_data_t, st_data_t); +static int st_object_records_iterate(st_data_t, st_data_t, st_data_t); +static int st_object_records_debug(st_data_t key, st_data_t value, st_data_t extra); +static int update_object_record_entry(st_data_t*, st_data_t*, st_data_t, int); +static void commit_allocation(heap_recorder*, heap_record*, object_record*); + +// ========================== +// Heap Recorder External API +// +// WARN: All these APIs should support receiving a NULL heap_recorder, resulting in a noop. +// +// WARN: Except for ::heap_recorder_for_each_live_object, we always assume interaction with these APIs +// happens under the GVL. +// +// ========================== +heap_recorder* heap_recorder_new(void) { + heap_recorder *recorder = ruby_xcalloc(1, sizeof(heap_recorder)); + + recorder->heap_records = st_init_table(&st_hash_type_heap_record_key); + recorder->object_records = st_init_numtable(); + recorder->object_records_snapshot = NULL; + recorder->reusable_locations = ruby_xcalloc(MAX_FRAMES_LIMIT, sizeof(ddog_prof_Location)); + recorder->partial_object_record = NULL; + recorder->size_enabled = true; + + return recorder; +} + +void heap_recorder_free(heap_recorder *heap_recorder) { + if (heap_recorder == NULL) { + return; + } + + if (heap_recorder->object_records_snapshot != NULL) { + // if there's an unfinished iteration, clean it up now + // before we clean up any other state it might depend on + heap_recorder_finish_iteration(heap_recorder); + } + + // Clean-up all object records + st_foreach(heap_recorder->object_records, st_object_record_entry_free, 0); + st_free_table(heap_recorder->object_records); + + // Clean-up all heap records (this includes those only referred to by queued_samples) + st_foreach(heap_recorder->heap_records, st_heap_record_entry_free, 0); + st_free_table(heap_recorder->heap_records); + + if (heap_recorder->partial_object_record != NULL) { + // If there's a partial object record, clean it up as well + object_record_free(heap_recorder->partial_object_record); + } + + ruby_xfree(heap_recorder->reusable_locations); + + ruby_xfree(heap_recorder); +} + +void heap_recorder_set_size_enabled(heap_recorder *heap_recorder, bool size_enabled) { + heap_recorder->size_enabled = size_enabled; +} + +// WARN: Assumes this gets called before profiler is reinitialized on the fork +void heap_recorder_after_fork(heap_recorder *heap_recorder) { + if (heap_recorder == NULL) { + return; + } + + // When forking, the child process gets a copy of the entire state of the parent process, minus + // threads. + // + // This means anything the heap recorder is tracking will still be alive after the fork and + // should thus be kept. Because this heap recorder implementation does not rely on free + // tracepoints to track liveness, any frees that happen until we fully reinitialize, will + // simply be noticed on next heap_recorder_prepare_iteration. + // + // There is one small caveat though: fork only preserves one thread and in a Ruby app, that + // will be the thread holding on to the GVL. Since we support iteration on the heap recorder + // outside of the GVL, any state specific to that interaction may be incosistent after fork + // (e.g. an acquired lock for thread safety). Iteration operates on object_records_snapshot + // though and that one will be updated on next heap_recorder_prepare_iteration so we really + // only need to finish any iteration that might have been left unfinished. + if (heap_recorder->object_records_snapshot != NULL) { + heap_recorder_finish_iteration(heap_recorder); + } +} + +void start_heap_allocation_recording(heap_recorder *heap_recorder, VALUE new_obj, unsigned int weight, ddog_CharSlice *alloc_class) { + if (heap_recorder == NULL) { + return; + } + + VALUE ruby_obj_id = rb_obj_id(new_obj); + if (!FIXNUM_P(ruby_obj_id)) { + rb_raise(rb_eRuntimeError, "Detected a bignum object id. These are not supported by heap profiling."); + } + + if (heap_recorder->partial_object_record != NULL) { + rb_raise(rb_eRuntimeError, "Detected consecutive heap allocation recording starts without end."); + } + + heap_recorder->partial_object_record = object_record_new(FIX2LONG(ruby_obj_id), NULL, (live_object_data) { + .weight = weight, + .class = alloc_class != NULL ? string_from_char_slice(*alloc_class) : NULL, + .alloc_gen = rb_gc_count(), + }); +} + +void end_heap_allocation_recording(struct heap_recorder *heap_recorder, ddog_prof_Slice_Location locations) { + if (heap_recorder == NULL) { + return; + } + + object_record *partial_object_record = heap_recorder->partial_object_record; + + if (partial_object_record == NULL) { + // Recording ended without having been started? + rb_raise(rb_eRuntimeError, "Ended a heap recording that was not started"); + } + + // From now on, mark active recording as invalid so we can short-circuit at any point and + // not end up with a still active recording. partial_object_record still holds the object for this recording + heap_recorder->partial_object_record = NULL; + + heap_record *heap_record = get_or_create_heap_record(heap_recorder, locations); + + // And then commit the new allocation. + commit_allocation(heap_recorder, heap_record, partial_object_record); +} + +void heap_recorder_prepare_iteration(heap_recorder *heap_recorder) { + if (heap_recorder == NULL) { + return; + } + + if (heap_recorder->object_records_snapshot != NULL) { + // we could trivially handle this but we raise to highlight and catch unexpected usages. + rb_raise(rb_eRuntimeError, "New heap recorder iteration prepared without the previous one having been finished."); + } + + st_foreach(heap_recorder->object_records, st_object_record_update, (st_data_t) heap_recorder); + + heap_recorder->object_records_snapshot = st_copy(heap_recorder->object_records); + if (heap_recorder->object_records_snapshot == NULL) { + rb_raise(rb_eRuntimeError, "Failed to create heap snapshot."); + } +} + +void heap_recorder_finish_iteration(heap_recorder *heap_recorder) { + if (heap_recorder == NULL) { + return; + } + + if (heap_recorder->object_records_snapshot == NULL) { + // we could trivially handle this but we raise to highlight and catch unexpected usages. + rb_raise(rb_eRuntimeError, "Heap recorder iteration finished without having been prepared."); + } + + st_free_table(heap_recorder->object_records_snapshot); + heap_recorder->object_records_snapshot = NULL; +} + +// Internal data we need while performing iteration over live objects. +typedef struct { + // The callback we need to call for each object. + bool (*for_each_callback)(heap_recorder_iteration_data stack_data, void *extra_arg); + // The extra arg to pass as the second parameter to the callback. + void *for_each_callback_extra_arg; + // A reference to the heap recorder so we can access extra stuff like reusable_locations. + heap_recorder *heap_recorder; +} iteration_context; + +// WARN: Assume iterations can run without the GVL for performance reasons. Do not raise, allocate or +// do NoGVL-unsafe interactions with the Ruby runtime. Any such interactions should be done during +// heap_recorder_prepare_iteration or heap_recorder_finish_iteration. +bool heap_recorder_for_each_live_object( + heap_recorder *heap_recorder, + bool (*for_each_callback)(heap_recorder_iteration_data stack_data, void *extra_arg), + void *for_each_callback_extra_arg) { + if (heap_recorder == NULL) { + return true; + } + + if (heap_recorder->object_records_snapshot == NULL) { + return false; + } + + iteration_context context; + context.for_each_callback = for_each_callback; + context.for_each_callback_extra_arg = for_each_callback_extra_arg; + context.heap_recorder = heap_recorder; + st_foreach(heap_recorder->object_records_snapshot, st_object_records_iterate, (st_data_t) &context); + return true; +} + +void heap_recorder_testonly_assert_hash_matches(ddog_prof_Slice_Location locations) { + heap_stack *stack = heap_stack_new(locations); + heap_record_key stack_based_key = (heap_record_key) { + .type = HEAP_STACK, + .heap_stack = stack, + }; + heap_record_key location_based_key = (heap_record_key) { + .type = LOCATION_SLICE, + .location_slice = &locations, + }; + + st_index_t stack_hash = heap_record_key_hash_st((st_data_t) &stack_based_key); + st_index_t location_hash = heap_record_key_hash_st((st_data_t) &location_based_key); + + heap_stack_free(stack); + + if (stack_hash != location_hash) { + rb_raise(rb_eRuntimeError, "Heap record key hashes built from the same locations differ. stack_based_hash=%"PRI_VALUE_PREFIX"u location_based_hash=%"PRI_VALUE_PREFIX"u", stack_hash, location_hash); + } +} + +VALUE heap_recorder_testonly_debug(heap_recorder *heap_recorder) { + if (heap_recorder == NULL) { + return rb_str_new2("NULL heap_recorder"); + } + + VALUE debug_str = rb_str_new2("object records:\n"); + st_foreach(heap_recorder->object_records, st_object_records_debug, (st_data_t) debug_str); + return debug_str; +} + +// ========================== +// Heap Recorder Internal API +// ========================== +static int st_heap_record_entry_free(st_data_t key, st_data_t value, DDTRACE_UNUSED st_data_t extra_arg) { + heap_record_key *record_key = (heap_record_key*) key; + heap_record_key_free(record_key); + heap_record_free((heap_record *) value); + return ST_DELETE; +} + +static int st_object_record_entry_free(DDTRACE_UNUSED st_data_t key, st_data_t value, DDTRACE_UNUSED st_data_t extra_arg) { + object_record_free((object_record *) value); + return ST_DELETE; +} + +static int st_object_record_update(st_data_t key, st_data_t value, st_data_t extra_arg) { + long obj_id = (long) key; + object_record *record = (object_record*) value; + heap_recorder *recorder = (heap_recorder*) extra_arg; + + VALUE ref; + + if (!ruby_ref_from_id(LONG2NUM(obj_id), &ref)) { + // Id no longer associated with a valid ref. Need to delete this object record! + + // Starting with the associated heap record. There will now be one less tracked object pointing to it + heap_record *heap_record = record->heap_record; + heap_record->num_tracked_objects--; + + // One less object using this heap record, it may have become unused... + cleanup_heap_record_if_unused(recorder, heap_record); + + object_record_free(record); + return ST_DELETE; + } + + // If we got this far, entry is still valid + + if (recorder->size_enabled && !record->object_data.is_frozen) { + // if we were asked to update sizes and this object was not already seen as being frozen, + // update size again. + record->object_data.size = ruby_obj_memsize_of(ref); + // Check if it's now frozen so we skip a size update next time + record->object_data.is_frozen = RB_OBJ_FROZEN(ref); + } + + return ST_CONTINUE; +} + +// WARN: This can get called outside the GVL. NO HEAP ALLOCATIONS OR EXCEPTIONS ARE ALLOWED. +static int st_object_records_iterate(DDTRACE_UNUSED st_data_t key, st_data_t value, st_data_t extra) { + object_record *record = (object_record*) value; + const heap_stack *stack = record->heap_record->stack; + iteration_context *context = (iteration_context*) extra; + + ddog_prof_Location *locations = context->heap_recorder->reusable_locations; + + for (uint16_t i = 0; i < stack->frames_len; i++) { + const heap_frame *frame = &stack->frames[i]; + ddog_prof_Location *location = &locations[i]; + location->function.name.ptr = frame->name; + location->function.name.len = strlen(frame->name); + location->function.filename.ptr = frame->filename; + location->function.filename.len = strlen(frame->filename); + location->line = frame->line; + } + + heap_recorder_iteration_data iteration_data; + iteration_data.object_data = record->object_data; + iteration_data.locations = (ddog_prof_Slice_Location) {.ptr = locations, .len = stack->frames_len}; + + if (!context->for_each_callback(iteration_data, context->for_each_callback_extra_arg)) { + return ST_STOP; + } + + return ST_CONTINUE; +} + +static int st_object_records_debug(DDTRACE_UNUSED st_data_t key, st_data_t value, st_data_t extra) { + VALUE debug_str = (VALUE) extra; + + object_record *record = (object_record*) value; + + heap_frame top_frame = record->heap_record->stack->frames[0]; + rb_str_catf(debug_str, "obj_id=%ld weight=%d size=%zu location=%s:%d alloc_gen=%zu ", record->obj_id, record->object_data.weight, record->object_data.size, top_frame.filename, (int) top_frame.line, record->object_data.alloc_gen); + + const char *class = record->object_data.class; + if (class != NULL) { + rb_str_catf(debug_str, "class=%s ", class); + } + + VALUE ref; + if (!ruby_ref_from_id(LONG2NUM(record->obj_id), &ref)) { + rb_str_catf(debug_str, "object="); + } else { + rb_str_catf(debug_str, "object=%+"PRIsVALUE, ref); + } + + rb_str_catf(debug_str, "\n"); + + return ST_CONTINUE; +} + +// Struct holding data required for an update operation on heap_records +typedef struct { + // [in] The new object record we want to add. + // NOTE: Transfer of ownership is assumed, do not re-use it after call to ::update_object_record_entry + object_record *new_object_record; + + // [in] The heap recorder where the update is happening. + heap_recorder *heap_recorder; +} object_record_update_data; + +static int update_object_record_entry(DDTRACE_UNUSED st_data_t *key, st_data_t *value, st_data_t data, int existing) { + object_record_update_data *update_data = (object_record_update_data*) data; + if (existing) { + rb_raise(rb_eRuntimeError, "Object ids are supposed to be unique. We got 2 allocation recordings with the same id"); + } + // Always carry on with the update, we want the new record to be there at the end + (*value) = (st_data_t) update_data->new_object_record; + return ST_CONTINUE; +} + +static void commit_allocation(heap_recorder *heap_recorder, heap_record *heap_record, object_record *object_record) { + // Link the object record with the corresponding heap record. + object_record->heap_record = heap_record; + + // Update object_records + object_record_update_data update_data = (object_record_update_data) { + .heap_recorder = heap_recorder, + .new_object_record = object_record, + }; + if (!st_update(heap_recorder->object_records, object_record->obj_id, update_object_record_entry, (st_data_t) &update_data)) { + // We are sure there was no previous record for this id so let the heap record know there now is one + // extra record associated with this stack. + if (heap_record->num_tracked_objects == UINT32_MAX) { + rb_raise(rb_eRuntimeError, "Reached maximum number of tracked objects for heap record"); + } + heap_record->num_tracked_objects++; + }; +} + +// Struct holding data required for an update operation on heap_records +typedef struct { + // [in] The locations we did this update with + ddog_prof_Slice_Location locations; + // [out] Pointer that will be updated to the updated heap record to prevent having to do + // another lookup to access the updated heap record. + heap_record **record; +} heap_record_update_data; + +// This function assumes ownership of stack_data is passed on to it so it'll either transfer ownership or clean-up. +static int update_heap_record_entry_with_new_allocation(st_data_t *key, st_data_t *value, st_data_t data, int existing) { + heap_record_update_data *update_data = (heap_record_update_data*) data; + + if (!existing) { + // there was no matching heap record so lets create a new one... + // we need to initialize a heap_record_key with a new stack and use that for the key storage. We can't use the + // locations-based key we used for the update call because we don't own its lifecycle. So we create a new + // heap stack and will pass ownership of it to the heap_record. + heap_stack *stack = heap_stack_new(update_data->locations); + (*key) = (st_data_t) heap_record_key_new(stack); + (*value) = (st_data_t) heap_record_new(stack); + } + + heap_record *record = (heap_record*) (*value); + (*update_data->record) = record; + + return ST_CONTINUE; +} + +static heap_record* get_or_create_heap_record(heap_recorder *heap_recorder, ddog_prof_Slice_Location locations) { + // For performance reasons we use a stack-allocated location-slice based key. This allows us + // to do allocation-free lookups and reuse of a matching existing heap record. + // NOTE: If we end up creating a new record, we'll create a heap-allocated key we own and use that for storage + // instead of this one. + heap_record_key lookup_key = (heap_record_key) { + .type = LOCATION_SLICE, + .location_slice = &locations, + }; + + heap_record *heap_record = NULL; + heap_record_update_data update_data = (heap_record_update_data) { + .locations = locations, + .record = &heap_record, + }; + st_update(heap_recorder->heap_records, (st_data_t) &lookup_key, update_heap_record_entry_with_new_allocation, (st_data_t) &update_data); + + return heap_record; +} + +static void cleanup_heap_record_if_unused(heap_recorder *heap_recorder, heap_record *heap_record) { + if (heap_record->num_tracked_objects > 0) { + // still being used! do nothing... + return; + } + + heap_record_key heap_key = (heap_record_key) { + .type = HEAP_STACK, + .heap_stack = heap_record->stack, + }; + // We need to access the deleted key to free it since we gave ownership of the keys to the hash. + // st_delete will change this pointer to point to the removed key if one is found. + heap_record_key *deleted_key = &heap_key; + if (!st_delete(heap_recorder->heap_records, (st_data_t*) &deleted_key, NULL)) { + rb_raise(rb_eRuntimeError, "Attempted to cleanup an untracked heap_record"); + }; + heap_record_key_free(deleted_key); + heap_record_free(heap_record); +} + +// =============== +// Heap Record API +// =============== +heap_record* heap_record_new(heap_stack *stack) { + heap_record *record = ruby_xcalloc(1, sizeof(heap_record)); + record->num_tracked_objects = 0; + record->stack = stack; + return record; +} + +void heap_record_free(heap_record *record) { + heap_stack_free(record->stack); + ruby_xfree(record); +} + + +// ================= +// Object Record API +// ================= +object_record* object_record_new(long obj_id, heap_record *heap_record, live_object_data object_data) { + object_record *record = ruby_xcalloc(1, sizeof(object_record)); + record->obj_id = obj_id; + record->heap_record = heap_record; + record->object_data = object_data; + return record; +} + +void object_record_free(object_record *record) { + if (record->object_data.class != NULL) { + ruby_xfree(record->object_data.class); + } + ruby_xfree(record); +} + +// ============== +// Heap Frame API +// ============== +int heap_frame_cmp(heap_frame *f1, heap_frame *f2) { + int line_diff = (int) (f1->line - f2->line); + if (line_diff != 0) { + return line_diff; + } + int cmp = strcmp(f1->name, f2->name); + if (cmp != 0) { + return cmp; + } + return strcmp(f1->filename, f2->filename); +} + +// TODO: Research potential performance improvements around hashing stuff here +// once we have a benchmarking suite. +// Example: Each call to st_hash is calling murmur_finish and we may want +// to only finish once per structure, not per field? +// Example: There may be a more efficient hashing for line that is not the +// generic st_hash algorithm? + +// WARN: Must be kept in-sync with ::char_slice_hash +st_index_t string_hash(char *str, st_index_t seed) { + return st_hash(str, strlen(str), seed); +} + +// WARN: Must be kept in-sync with ::string_hash +st_index_t char_slice_hash(ddog_CharSlice char_slice, st_index_t seed) { + return st_hash(char_slice.ptr, char_slice.len, seed); +} + +// WARN: Must be kept in-sync with ::ddog_location_hash +st_index_t heap_frame_hash(heap_frame *frame, st_index_t seed) { + st_index_t hash = string_hash(frame->name, seed); + hash = string_hash(frame->filename, hash); + hash = st_hash(&frame->line, sizeof(frame->line), hash); + return hash; +} + +// WARN: Must be kept in-sync with ::heap_frame_hash +st_index_t ddog_location_hash(ddog_prof_Location location, st_index_t seed) { + st_index_t hash = char_slice_hash(location.function.name, seed); + hash = char_slice_hash(location.function.filename, hash); + // Convert ddog_prof line type to the same type we use for our heap_frames to + // ensure we have compatible hashes + int32_t line_as_int32 = (int32_t) location.line; + hash = st_hash(&line_as_int32, sizeof(line_as_int32), hash); + return hash; +} + +// ============== +// Heap Stack API +// ============== +heap_stack* heap_stack_new(ddog_prof_Slice_Location locations) { + uint16_t frames_len = locations.len; + if (frames_len > MAX_FRAMES_LIMIT) { + // This should not be happening anyway since MAX_FRAMES_LIMIT should be shared with + // the stacktrace construction mechanism. If it happens, lets just raise. This should + // be safe since only allocate with the GVL anyway. + rb_raise(rb_eRuntimeError, "Found stack with more than %d frames (%d)", MAX_FRAMES_LIMIT, frames_len); + } + heap_stack *stack = ruby_xcalloc(1, sizeof(heap_stack) + frames_len * sizeof(heap_frame)); + stack->frames_len = frames_len; + for (uint16_t i = 0; i < stack->frames_len; i++) { + const ddog_prof_Location *location = &locations.ptr[i]; + stack->frames[i] = (heap_frame) { + .name = string_from_char_slice(location->function.name), + .filename = string_from_char_slice(location->function.filename), + // ddog_prof_Location is a int64_t. We don't expect to have to profile files with more than + // 2M lines so this cast should be fairly safe? + .line = (int32_t) location->line, + }; + } + return stack; +} + +void heap_stack_free(heap_stack *stack) { + for (uint64_t i = 0; i < stack->frames_len; i++) { + heap_frame *frame = &stack->frames[i]; + ruby_xfree(frame->name); + ruby_xfree(frame->filename); + } + ruby_xfree(stack); +} + +// WARN: Must be kept in-sync with ::ddog_location_slice_hash +st_index_t heap_stack_hash(heap_stack *stack, st_index_t seed) { + st_index_t hash = seed; + for (uint64_t i = 0; i < stack->frames_len; i++) { + hash = heap_frame_hash(&stack->frames[i], hash); + } + return hash; +} + +// WARN: Must be kept in-sync with ::heap_stack_hash +st_index_t ddog_location_slice_hash(ddog_prof_Slice_Location locations, st_index_t seed) { + st_index_t hash = seed; + for (uint64_t i = 0; i < locations.len; i++) { + hash = ddog_location_hash(locations.ptr[i], hash); + } + return hash; +} + +// =================== +// Heap Record Key API +// =================== +heap_record_key* heap_record_key_new(heap_stack *stack) { + heap_record_key *key = ruby_xmalloc(sizeof(heap_record_key)); + key->type = HEAP_STACK; + key->heap_stack = stack; + return key; +} + +void heap_record_key_free(heap_record_key *key) { + ruby_xfree(key); +} + +static inline size_t heap_record_key_len(heap_record_key *key) { + if (key->type == HEAP_STACK) { + return key->heap_stack->frames_len; + } else { + return key->location_slice->len; + } +} + +static inline int64_t heap_record_key_entry_line(heap_record_key *key, size_t entry_i) { + if (key->type == HEAP_STACK) { + return key->heap_stack->frames[entry_i].line; + } else { + return key->location_slice->ptr[entry_i].line; + } +} + +static inline size_t heap_record_key_entry_name(heap_record_key *key, size_t entry_i, const char **name_ptr) { + if (key->type == HEAP_STACK) { + char *name = key->heap_stack->frames[entry_i].name; + (*name_ptr) = name; + return strlen(name); + } else { + ddog_CharSlice name = key->location_slice->ptr[entry_i].function.name; + (*name_ptr) = name.ptr; + return name.len; + } +} + +static inline size_t heap_record_key_entry_filename(heap_record_key *key, size_t entry_i, const char **filename_ptr) { + if (key->type == HEAP_STACK) { + char *filename = key->heap_stack->frames[entry_i].filename; + (*filename_ptr) = filename; + return strlen(filename); + } else { + ddog_CharSlice filename = key->location_slice->ptr[entry_i].function.filename; + (*filename_ptr) = filename.ptr; + return filename.len; + } +} + +int heap_record_key_cmp_st(st_data_t key1, st_data_t key2) { + heap_record_key *key_record1 = (heap_record_key*) key1; + heap_record_key *key_record2 = (heap_record_key*) key2; + + // Fast path, check if lengths differ + size_t key_record1_len = heap_record_key_len(key_record1); + size_t key_record2_len = heap_record_key_len(key_record2); + + if (key_record1_len != key_record2_len) { + return ((int) key_record1_len) - ((int) key_record2_len); + } + + // If we got this far, we have same lengths so need to check item-by-item + for (size_t i = 0; i < key_record1_len; i++) { + // Lines are faster to compare, lets do that first + size_t line1 = heap_record_key_entry_line(key_record1, i); + size_t line2 = heap_record_key_entry_line(key_record2, i); + if (line1 != line2) { + return ((int) line1) - ((int)line2); + } + + // Then come names, they are usually smaller than filenames + const char *name1, *name2; + size_t name1_len = heap_record_key_entry_name(key_record1, i, &name1); + size_t name2_len = heap_record_key_entry_name(key_record2, i, &name2); + if (name1_len != name2_len) { + return ((int) name1_len) - ((int) name2_len); + } + int name_cmp_result = strncmp(name1, name2, name1_len); + if (name_cmp_result != 0) { + return name_cmp_result; + } + + // Then come filenames + const char *filename1, *filename2; + int64_t filename1_len = heap_record_key_entry_filename(key_record1, i, &filename1); + int64_t filename2_len = heap_record_key_entry_filename(key_record2, i, &filename2); + if (filename1_len != filename2_len) { + return ((int) filename1_len) - ((int) filename2_len); + } + int filename_cmp_result = strncmp(filename1, filename2, filename1_len); + if (filename_cmp_result != 0) { + return filename_cmp_result; + } + } + + // If we survived the above for, then everything matched + return 0; +} + +// Initial seed for hash functions +#define FNV1_32A_INIT 0x811c9dc5 + +st_index_t heap_record_key_hash_st(st_data_t key) { + heap_record_key *record_key = (heap_record_key*) key; + if (record_key->type == HEAP_STACK) { + return heap_stack_hash(record_key->heap_stack, FNV1_32A_INIT); + } else { + return ddog_location_slice_hash(*record_key->location_slice, FNV1_32A_INIT); + } +} diff --git a/ext/ddtrace_profiling_native_extension/heap_recorder.h b/ext/ddtrace_profiling_native_extension/heap_recorder.h new file mode 100644 index 00000000000..1c5ae2b3890 --- /dev/null +++ b/ext/ddtrace_profiling_native_extension/heap_recorder.h @@ -0,0 +1,140 @@ +#pragma once + +#include +#include + +// A heap recorder keeps track of a collection of live heap objects. +// +// All allocations observed by this recorder for which a corresponding free was +// not yet observed are deemed as alive and can be iterated on to produce a +// live heap profile. +// +// NOTE: All public APIs of heap_recorder support receiving a NULL heap_recorder +// in which case the behaviour will be a noop. +// +// WARN: Unless otherwise stated the heap recorder APIs assume calls are done +// under the GVL. +typedef struct heap_recorder heap_recorder; + +// Extra data associated with each live object being tracked. +typedef struct live_object_data { + // The weight of this object from a sampling perspective. + // + // A notion of weight is preserved for each tracked object to allow for an approximate + // extrapolation to an unsampled view. + // + // Example: If we were sampling every 50 objects, then each sampled object + // could be seen as being representative of 50 objects. + unsigned int weight; + + // Size of this object on last flush/update. + size_t size; + + // The class of the object that we're tracking. + // NOTE: This is optional and will be set to NULL if not set. + char* class; + + // The GC allocation gen in which we saw this object being allocated. + // + // This enables us to calculate the age of this object in terms of GC executions. + size_t alloc_gen; + + // Whether this object was previously seen as being frozen. If this is the case, + // we'll skip any further size updates since frozen objects are supposed to be + // immutable. + bool is_frozen; +} live_object_data; + +// Data that is made available to iterators of heap recorder data for each live object +// tracked therein. +typedef struct { + ddog_prof_Slice_Location locations; + live_object_data object_data; +} heap_recorder_iteration_data; + +// Initialize a new heap recorder. +heap_recorder* heap_recorder_new(void); + +// Free a previously initialized heap recorder. +void heap_recorder_free(heap_recorder *heap_recorder); + +// Sets whether this heap recorder should keep track of sizes or not. +// +// If set to true, the heap recorder will attempt to determine the approximate sizes of +// tracked objects and wield them during iteration. +// If set to false, sizes returned during iteration should not be used/relied on (they +// may be 0 or the last determined size before disabling the tracking of sizes). +// +// NOTE: Default is true, i.e., it will attempt to determine approximate sizes of tracked +// objects. +void heap_recorder_set_size_enabled(heap_recorder *heap_recorder, bool size_enabled); + +// Do any cleanup needed after forking. +// WARN: Assumes this gets called before profiler is reinitialized on the fork +void heap_recorder_after_fork(heap_recorder *heap_recorder); + +// Start a heap allocation recording on the heap recorder for a new object. +// +// This heap allocation recording needs to be ended via ::end_heap_allocation_recording +// before it will become fully committed and able to be iterated on. +// +// @param new_obj +// The newly allocated Ruby object/value. +// @param weight +// The sampling weight of this object. +// +// WARN: It needs to be paired with a ::end_heap_allocation_recording call. +void start_heap_allocation_recording(heap_recorder *heap_recorder, VALUE new_obj, unsigned int weight, ddog_CharSlice *alloc_class); + +// End a previously started heap allocation recording on the heap recorder. +// +// It is at this point that an allocated object will become fully tracked and able to be iterated on. +// +// @param locations The stacktrace representing the location of the allocation. +// +// WARN: It is illegal to call this without previously having called ::start_heap_allocation_recording. +void end_heap_allocation_recording(heap_recorder *heap_recorder, ddog_prof_Slice_Location locations); + +// Update the heap recorder to reflect the latest state of the VM and prepare internal structures +// for efficient iteration. +// +// WARN: This must be called strictly before iteration. Failing to do so will result in exceptions. +void heap_recorder_prepare_iteration(heap_recorder *heap_recorder); + +// Optimize the heap recorder by cleaning up any data that might have been prepared specifically +// for the purpose of iterating over the heap recorder data. +// +// WARN: This must be called strictly after iteration to ensure proper cleanup and to keep the memory +// profile of the heap recorder low. +void heap_recorder_finish_iteration(heap_recorder *heap_recorder); + +// Iterate over each live object being tracked by the heap recorder. +// +// NOTE: Iteration can be called without holding the Ruby Global VM lock. +// WARN: This must be called strictly after heap_recorder_prepare_iteration and before +// heap_recorder_finish_iteration. +// +// @param for_each_callback +// A callback function that shall be called for each live object being tracked +// by the heap recorder. Alongside the iteration_data for each live object, +// a second argument will be forwarded with the contents of the optional +// for_each_callback_extra_arg. Iteration will continue until the callback +// returns false or we run out of objects. +// @param for_each_callback_extra_arg +// Optional (NULL if empty) extra data that should be passed to the +// callback function alongside the data for each live tracked object. +// @return true if iteration ran, false if something prevented it from running. +bool heap_recorder_for_each_live_object( + heap_recorder *heap_recorder, + bool (*for_each_callback)(heap_recorder_iteration_data data, void* extra_arg), + void *for_each_callback_extra_arg); + +// v--- TEST-ONLY APIs ---v + +// Assert internal hashing logic is valid for the provided locations and its +// corresponding internal representations in heap recorder. +void heap_recorder_testonly_assert_hash_matches(ddog_prof_Slice_Location locations); + +// Returns a Ruby string with a representation of internal data helpful to +// troubleshoot issues such as unexpected test failures. +VALUE heap_recorder_testonly_debug(heap_recorder *heap_recorder); diff --git a/ext/ddtrace_profiling_native_extension/helpers.h b/ext/ddtrace_profiling_native_extension/helpers.h index f06c96710ec..d71a513de9f 100644 --- a/ext/ddtrace_profiling_native_extension/helpers.h +++ b/ext/ddtrace_profiling_native_extension/helpers.h @@ -15,3 +15,5 @@ // don't like C and I just implemented this as a function. inline static uint64_t uint64_max_of(uint64_t a, uint64_t b) { return a > b ? a : b; } inline static uint64_t uint64_min_of(uint64_t a, uint64_t b) { return a > b ? b : a; } +inline static long long_max_of(long a, long b) { return a > b ? a : b; } +inline static long long_min_of(long a, long b) { return a > b ? b : a; } diff --git a/ext/ddtrace_profiling_native_extension/libdatadog_helpers.c b/ext/ddtrace_profiling_native_extension/libdatadog_helpers.c index 43bd02c4a07..f6f8b69b1b9 100644 --- a/ext/ddtrace_profiling_native_extension/libdatadog_helpers.c +++ b/ext/ddtrace_profiling_native_extension/libdatadog_helpers.c @@ -40,3 +40,23 @@ ddog_CharSlice ruby_value_type_to_char_slice(enum ruby_value_type type) { default: return DDOG_CHARSLICE_C("BUG: Unknown value for ruby_value_type"); } } + +size_t read_ddogerr_string_and_drop(ddog_Error *error, char *string, size_t capacity) { + if (capacity == 0 || string == NULL) { + // short-circuit, we can't write anything + ddog_Error_drop(error); + return 0; + } + + ddog_CharSlice error_msg_slice = ddog_Error_message(error); + size_t error_msg_size = error_msg_slice.len; + // Account for extra null char for proper cstring + if (error_msg_size >= capacity) { + // Error message too big, lets truncate it to capacity - 1 to allow for extra null at end + error_msg_size = capacity - 1; + } + strncpy(string, error_msg_slice.ptr, error_msg_size); + string[error_msg_size] = '\0'; + ddog_Error_drop(error); + return error_msg_size; +} diff --git a/ext/ddtrace_profiling_native_extension/libdatadog_helpers.h b/ext/ddtrace_profiling_native_extension/libdatadog_helpers.h index edd11e31954..307d4d0fb3e 100644 --- a/ext/ddtrace_profiling_native_extension/libdatadog_helpers.h +++ b/ext/ddtrace_profiling_native_extension/libdatadog_helpers.h @@ -24,8 +24,19 @@ inline static VALUE get_error_details_and_drop(ddog_Error *error) { return result; } +// Utility function to be able to extract an error cstring from a ddog_Error. +// Returns the amount of characters written to string (which are necessarily +// bounded by capacity - 1 since the string will be null-terminated). +size_t read_ddogerr_string_and_drop(ddog_Error *error, char *string, size_t capacity); + // Used for pretty printing this Ruby enum. Returns "T_UNKNOWN_OR_MISSING_RUBY_VALUE_TYPE_ENTRY" for unknown elements. // In practice, there's a few types that the profiler will probably never encounter, but I've added all entries of // ruby_value_type that Ruby uses so that we can also use this for debugging. const char *ruby_value_type_to_string(enum ruby_value_type type); ddog_CharSlice ruby_value_type_to_char_slice(enum ruby_value_type type); + +// Returns a dynamically allocated string from the provided char slice. +// WARN: The returned string must be explicitly freed with ruby_xfree. +inline static char* string_from_char_slice(ddog_CharSlice slice) { + return ruby_strndup(slice.ptr, slice.len); +} diff --git a/ext/ddtrace_profiling_native_extension/private_vm_api_access.c b/ext/ddtrace_profiling_native_extension/private_vm_api_access.c index 1da8682b884..d88301ae371 100644 --- a/ext/ddtrace_profiling_native_extension/private_vm_api_access.c +++ b/ext/ddtrace_profiling_native_extension/private_vm_api_access.c @@ -471,6 +471,11 @@ int ddtrace_rb_profile_frames(VALUE thread, int start, int limit, VALUE *buff, i // it from https://github.com/ruby/ruby/pull/7116 in a "just in case" kind of mindset. if (cfp == NULL) return 0; + // As of this writing, we don't support profiling with MN enabled, and this only happens in that mode, but as we + // probably want to experiment with it in the future, I've decided to import https://github.com/ruby/ruby/pull/9310 + // here. + if (ec == NULL) return 0; + // Fix: Skip dummy frame that shows up in main thread. // // According to a comment in `backtrace_each` (`vm_backtrace.c`), there's two dummy frames that we should ignore diff --git a/ext/ddtrace_profiling_native_extension/profiling.c b/ext/ddtrace_profiling_native_extension/profiling.c index 9dc9952b4a7..d1d39397cd2 100644 --- a/ext/ddtrace_profiling_native_extension/profiling.c +++ b/ext/ddtrace_profiling_native_extension/profiling.c @@ -41,6 +41,7 @@ void DDTRACE_EXPORT Init_ddtrace_profiling_native_extension(void) { rb_define_singleton_method(native_extension_module, "native_working?", native_working_p, 0); rb_funcall(native_extension_module, rb_intern("private_class_method"), 1, ID2SYM(rb_intern("native_working?"))); + ruby_helpers_init(); collectors_cpu_and_wall_time_worker_init(profiling_module); collectors_dynamic_sampling_rate_init(profiling_module); collectors_idle_sampling_helper_init(profiling_module); diff --git a/ext/ddtrace_profiling_native_extension/ruby_helpers.c b/ext/ddtrace_profiling_native_extension/ruby_helpers.c index b874d1f249a..fd1901068b0 100644 --- a/ext/ddtrace_profiling_native_extension/ruby_helpers.c +++ b/ext/ddtrace_profiling_native_extension/ruby_helpers.c @@ -4,6 +4,18 @@ #include "ruby_helpers.h" #include "private_vm_api_access.h" +// The following global variables are initialized at startup to save expensive lookups later. +// They are not expected to be mutated outside of init. +static VALUE module_object_space = Qnil; +static ID _id2ref_id = Qnil; + +void ruby_helpers_init(void) { + rb_global_variable(&module_object_space); + + module_object_space = rb_const_get(rb_cObject, rb_intern("ObjectSpace")); + _id2ref_id = rb_intern("_id2ref"); +} + void raise_unexpected_type( VALUE value, const char *value_name, @@ -108,3 +120,93 @@ void raise_syserr( grab_gvl_and_raise_syserr(syserr_errno, "Failure returned by '%s' at %s:%d:in `%s'", expression, file, line, function_name); } } + +char* ruby_strndup(const char *str, size_t size) { + char *dup; + + dup = xmalloc(size + 1); + memcpy(dup, str, size); + dup[size] = '\0'; + + return dup; +} + +static VALUE _id2ref(VALUE obj_id) { + // Call ::ObjectSpace._id2ref natively. It will raise if the id is no longer valid + return rb_funcall(module_object_space, _id2ref_id, 1, obj_id); +} + +static VALUE _id2ref_failure(DDTRACE_UNUSED VALUE _unused1, DDTRACE_UNUSED VALUE _unused2) { + return Qfalse; +} + +// Native wrapper to get an object ref from an id. Returns true on success and +// writes the ref to the value pointer parameter if !NULL. False if id doesn't +// reference a valid object (in which case value is not changed). +bool ruby_ref_from_id(VALUE obj_id, VALUE *value) { + // Call ::ObjectSpace._id2ref natively. It will raise if the id is no longer valid + // so we need to call it via rb_rescue2 + // TODO: Benchmark rb_rescue2 vs rb_protect here + VALUE result = rb_rescue2( + _id2ref, + obj_id, + _id2ref_failure, + Qnil, + rb_eRangeError, // rb_eRangeError is the error used to flag invalid ids + 0 // Required by API to be the last argument + ); + + if (result == Qfalse) { + return false; + } + + if (value != NULL) { + (*value) = result; + } + + return true; +} + +// Not part of public headers but is externed from Ruby +size_t rb_obj_memsize_of(VALUE obj); + +// Wrapper around rb_obj_memsize_of to avoid hitting crashing paths. +// +// The crashing paths are due to calls to rb_bug so should hopefully +// be situations that can't happen. But given that rb_obj_memsize_of +// isn't fully public (it's externed but not part of public headers) +// there is a possibility that it is just assumed that whoever calls +// it, will do proper checking for those cases. We want to be cautious +// so we'll assume that's the case and will skip over known crashing +// paths in this wrapper. +size_t ruby_obj_memsize_of(VALUE obj) { + switch (rb_type(obj)) { + case T_OBJECT: + case T_MODULE: + case T_CLASS: + case T_ICLASS: + case T_STRING: + case T_ARRAY: + case T_HASH: + case T_REGEXP: + case T_DATA: + case T_MATCH: + case T_FILE: + case T_RATIONAL: + case T_COMPLEX: + case T_IMEMO: + case T_FLOAT: + case T_SYMBOL: + case T_BIGNUM: + // case T_NODE: -> Crashes the vm in rb_obj_memsize_of + case T_STRUCT: + case T_ZOMBIE: + #ifndef NO_T_MOVED + case T_MOVED: + #endif + return rb_obj_memsize_of(obj); + default: + // Unsupported, return 0 instead of erroring like rb_obj_memsize_of likes doing + return 0; + } +} diff --git a/ext/ddtrace_profiling_native_extension/ruby_helpers.h b/ext/ddtrace_profiling_native_extension/ruby_helpers.h index 84889fb83dd..1ca01652b4a 100644 --- a/ext/ddtrace_profiling_native_extension/ruby_helpers.h +++ b/ext/ddtrace_profiling_native_extension/ruby_helpers.h @@ -5,6 +5,10 @@ #include "helpers.h" +// Initialize internal data needed by some ruby helpers. Should be called during start, before any actual +// usage of ruby helpers. +void ruby_helpers_init(void); + // Processes any pending interruptions, including exceptions to be raised. // If there's an exception to be raised, it raises it. In that case, this function does not return. static inline VALUE process_pending_interruptions(DDTRACE_UNUSED VALUE _) { @@ -87,3 +91,23 @@ NORETURN(void raise_syserr( int line, const char *function_name )); + +// Alternative to ruby_strdup that takes a size argument. +// Similar to C's strndup but slightly less smart as size is expected to +// be smaller or equal to the real size of str (minus null termination if it +// exists). +// A new string will be returned with size+1 bytes and last byte set to '\0'. +// The returned string must be freed explicitly. +// +// WARN: Cannot be used during GC or outside the GVL. +char* ruby_strndup(const char *str, size_t size); + +// Native wrapper to get an object ref from an id. Returns true on success and +// writes the ref to the value pointer parameter if !NULL. False if id doesn't +// reference a valid object (in which case value is not changed). +bool ruby_ref_from_id(size_t id, VALUE *value); + +// Native wrapper to get the approximate/estimated current size of the passed +// object. +size_t ruby_obj_memsize_of(VALUE obj); + diff --git a/ext/ddtrace_profiling_native_extension/stack_recorder.c b/ext/ddtrace_profiling_native_extension/stack_recorder.c index a192a8d61ca..e3df3d76cc8 100644 --- a/ext/ddtrace_profiling_native_extension/stack_recorder.c +++ b/ext/ddtrace_profiling_native_extension/stack_recorder.c @@ -7,6 +7,7 @@ #include "libdatadog_helpers.h" #include "ruby_helpers.h" #include "time_helpers.h" +#include "heap_recorder.h" // Used to wrap a ddog_prof_Profile in a Ruby object and expose Ruby-level serialization APIs // This file implements the native bits of the Datadog::Profiling::StackRecorder class @@ -150,18 +151,29 @@ static VALUE error_symbol = Qnil; // :error in Ruby #define WALL_TIME_VALUE_ID 2 #define ALLOC_SAMPLES_VALUE {.type_ = VALUE_STRING("alloc-samples"), .unit = VALUE_STRING("count")} #define ALLOC_SAMPLES_VALUE_ID 3 +#define HEAP_SAMPLES_VALUE {.type_ = VALUE_STRING("heap-live-samples"), .unit = VALUE_STRING("count")} +#define HEAP_SAMPLES_VALUE_ID 4 +#define HEAP_SIZE_VALUE {.type_ = VALUE_STRING("heap-live-size"), .unit = VALUE_STRING("bytes")} +#define HEAP_SIZE_VALUE_ID 5 +#define TIMELINE_VALUE {.type_ = VALUE_STRING("timeline"), .unit = VALUE_STRING("nanoseconds")} +#define TIMELINE_VALUE_ID 6 -static const ddog_prof_ValueType all_value_types[] = {CPU_TIME_VALUE, CPU_SAMPLES_VALUE, WALL_TIME_VALUE, ALLOC_SAMPLES_VALUE}; +static const ddog_prof_ValueType all_value_types[] = + {CPU_TIME_VALUE, CPU_SAMPLES_VALUE, WALL_TIME_VALUE, ALLOC_SAMPLES_VALUE, HEAP_SAMPLES_VALUE, HEAP_SIZE_VALUE, TIMELINE_VALUE}; // This array MUST be kept in sync with all_value_types above and is intended to act as a "hashmap" between VALUE_ID and the position it // occupies on the all_value_types array. // E.g. all_value_types_positions[CPU_TIME_VALUE_ID] => 0, means that CPU_TIME_VALUE was declared at position 0 of all_value_types. -static const uint8_t all_value_types_positions[] = {CPU_TIME_VALUE_ID, CPU_SAMPLES_VALUE_ID, WALL_TIME_VALUE_ID, ALLOC_SAMPLES_VALUE_ID}; +static const uint8_t all_value_types_positions[] = + {CPU_TIME_VALUE_ID, CPU_SAMPLES_VALUE_ID, WALL_TIME_VALUE_ID, ALLOC_SAMPLES_VALUE_ID, HEAP_SAMPLES_VALUE_ID, HEAP_SIZE_VALUE_ID, TIMELINE_VALUE_ID}; #define ALL_VALUE_TYPES_COUNT (sizeof(all_value_types) / sizeof(ddog_prof_ValueType)) // Contains native state for each instance struct stack_recorder_state { + // Heap recorder instance + heap_recorder *heap_recorder; + pthread_mutex_t slot_one_mutex; ddog_prof_Profile slot_one_profile; @@ -184,6 +196,7 @@ struct call_serialize_without_gvl_arguments { // Set by caller struct stack_recorder_state *state; ddog_Timespec finish_timestamp; + size_t gc_count_before_serialize; // Set by callee ddog_prof_Profile *profile; @@ -197,11 +210,19 @@ static VALUE _native_new(VALUE klass); static void initialize_slot_concurrency_control(struct stack_recorder_state *state); static void initialize_profiles(struct stack_recorder_state *state, ddog_prof_Slice_ValueType sample_types); static void stack_recorder_typed_data_free(void *data); -static VALUE _native_initialize(DDTRACE_UNUSED VALUE _self, VALUE recorder_instance, VALUE cpu_time_enabled, VALUE alloc_samples_enabled); +static VALUE _native_initialize( + DDTRACE_UNUSED VALUE _self, + VALUE recorder_instance, + VALUE cpu_time_enabled, + VALUE alloc_samples_enabled, + VALUE heap_samples_enabled, + VALUE heap_size_enabled, + VALUE timeline_enabled +); static VALUE _native_serialize(VALUE self, VALUE recorder_instance); static VALUE ruby_time_from(ddog_Timespec ddprof_time); static void *call_serialize_without_gvl(void *call_args); -static struct active_slot_pair sampler_lock_active_profile(); +static struct active_slot_pair sampler_lock_active_profile(struct stack_recorder_state *state); static void sampler_unlock_active_profile(struct active_slot_pair active_slot); static ddog_prof_Profile *serializer_flip_active_and_inactive_slots(struct stack_recorder_state *state); static VALUE _native_active_slot(DDTRACE_UNUSED VALUE _self, VALUE recorder_instance); @@ -213,6 +234,12 @@ static VALUE _native_reset_after_fork(DDTRACE_UNUSED VALUE self, VALUE recorder_ static void serializer_set_start_timestamp_for_next_profile(struct stack_recorder_state *state, ddog_Timespec start_time); static VALUE _native_record_endpoint(DDTRACE_UNUSED VALUE _self, VALUE recorder_instance, VALUE local_root_span_id, VALUE endpoint); static void reset_profile(ddog_prof_Profile *profile, ddog_Timespec *start_time /* Can be null */); +static VALUE _native_track_object(DDTRACE_UNUSED VALUE _self, VALUE recorder_instance, VALUE new_obj, VALUE weight, VALUE alloc_class); +static VALUE _native_check_heap_hashes(DDTRACE_UNUSED VALUE _self, VALUE locations); +static VALUE _native_start_fake_slow_heap_serialization(DDTRACE_UNUSED VALUE _self, VALUE recorder_instance); +static VALUE _native_end_fake_slow_heap_serialization(DDTRACE_UNUSED VALUE _self, VALUE recorder_instance); +static VALUE _native_debug_heap_recorder(DDTRACE_UNUSED VALUE _self, VALUE recorder_instance); + void stack_recorder_init(VALUE profiling_module) { VALUE stack_recorder_class = rb_define_class_under(profiling_module, "StackRecorder", rb_cObject); @@ -229,13 +256,21 @@ void stack_recorder_init(VALUE profiling_module) { // https://bugs.ruby-lang.org/issues/18007 for a discussion around this. rb_define_alloc_func(stack_recorder_class, _native_new); - rb_define_singleton_method(stack_recorder_class, "_native_initialize", _native_initialize, 3); + rb_define_singleton_method(stack_recorder_class, "_native_initialize", _native_initialize, 6); rb_define_singleton_method(stack_recorder_class, "_native_serialize", _native_serialize, 1); rb_define_singleton_method(stack_recorder_class, "_native_reset_after_fork", _native_reset_after_fork, 1); rb_define_singleton_method(testing_module, "_native_active_slot", _native_active_slot, 1); rb_define_singleton_method(testing_module, "_native_slot_one_mutex_locked?", _native_is_slot_one_mutex_locked, 1); rb_define_singleton_method(testing_module, "_native_slot_two_mutex_locked?", _native_is_slot_two_mutex_locked, 1); rb_define_singleton_method(testing_module, "_native_record_endpoint", _native_record_endpoint, 3); + rb_define_singleton_method(testing_module, "_native_track_object", _native_track_object, 4); + rb_define_singleton_method(testing_module, "_native_check_heap_hashes", _native_check_heap_hashes, 1); + rb_define_singleton_method(testing_module, "_native_start_fake_slow_heap_serialization", + _native_start_fake_slow_heap_serialization, 1); + rb_define_singleton_method(testing_module, "_native_end_fake_slow_heap_serialization", + _native_end_fake_slow_heap_serialization, 1); + rb_define_singleton_method(testing_module, "_native_debug_heap_recorder", + _native_debug_heap_recorder, 1); ok_symbol = ID2SYM(rb_intern_const("ok")); error_symbol = ID2SYM(rb_intern_const("error")); @@ -270,6 +305,12 @@ static VALUE _native_new(VALUE klass) { VALUE stack_recorder = TypedData_Wrap_Struct(klass, &stack_recorder_typed_data, state); + // NOTE: We initialize this because we want a new recorder to be operational even without initialization and our + // default is everything enabled. However, if during recording initialization it turns out we don't want + // heap samples, we will free and reset heap_recorder to NULL, effectively disabling all behaviour specific + // to heap profiling (all calls to heap_recorder_* with a NULL heap recorder are noops). + state->heap_recorder = heap_recorder_new(); + // Note: Don't raise exceptions after this point, since it'll lead to libdatadog memory leaking! initialize_profiles(state, sample_types); @@ -318,27 +359,47 @@ static void stack_recorder_typed_data_free(void *state_ptr) { pthread_mutex_destroy(&state->slot_two_mutex); ddog_prof_Profile_drop(&state->slot_two_profile); + heap_recorder_free(state->heap_recorder); + ruby_xfree(state); } -static VALUE _native_initialize(DDTRACE_UNUSED VALUE _self, VALUE recorder_instance, VALUE cpu_time_enabled, VALUE alloc_samples_enabled) { +static VALUE _native_initialize( + DDTRACE_UNUSED VALUE _self, + VALUE recorder_instance, + VALUE cpu_time_enabled, + VALUE alloc_samples_enabled, + VALUE heap_samples_enabled, + VALUE heap_size_enabled, + VALUE timeline_enabled +) { ENFORCE_BOOLEAN(cpu_time_enabled); ENFORCE_BOOLEAN(alloc_samples_enabled); + ENFORCE_BOOLEAN(heap_samples_enabled); + ENFORCE_BOOLEAN(heap_size_enabled); + ENFORCE_BOOLEAN(timeline_enabled); struct stack_recorder_state *state; TypedData_Get_Struct(recorder_instance, struct stack_recorder_state, &stack_recorder_typed_data, state); - if (cpu_time_enabled == Qtrue && alloc_samples_enabled == Qtrue) return Qtrue; // Nothing to do, this is the default + uint8_t requested_values_count = ALL_VALUE_TYPES_COUNT - + (cpu_time_enabled == Qtrue ? 0 : 1) - + (alloc_samples_enabled == Qtrue? 0 : 1) - + (heap_samples_enabled == Qtrue ? 0 : 1) - + (heap_size_enabled == Qtrue ? 0 : 1) - + (timeline_enabled == Qtrue ? 0 : 1); + + if (requested_values_count == ALL_VALUE_TYPES_COUNT) return Qtrue; // Nothing to do, this is the default // When some sample types are disabled, we need to reconfigure libdatadog to record less types, // as well as reconfigure the position_for array to push the disabled types to the end so they don't get recorded. // See record_sample for details on the use of position_for. - state->enabled_values_count = ALL_VALUE_TYPES_COUNT - (cpu_time_enabled == Qtrue ? 0 : 1) - (alloc_samples_enabled == Qtrue? 0 : 1); + state->enabled_values_count = requested_values_count; ddog_prof_ValueType enabled_value_types[ALL_VALUE_TYPES_COUNT]; uint8_t next_enabled_pos = 0; - uint8_t next_disabled_pos = state->enabled_values_count; + uint8_t next_disabled_pos = requested_values_count; // CPU_SAMPLES_VALUE is always enabled enabled_value_types[next_enabled_pos] = (ddog_prof_ValueType) CPU_SAMPLES_VALUE; @@ -362,6 +423,35 @@ static VALUE _native_initialize(DDTRACE_UNUSED VALUE _self, VALUE recorder_insta state->position_for[ALLOC_SAMPLES_VALUE_ID] = next_disabled_pos++; } + if (heap_samples_enabled == Qtrue) { + enabled_value_types[next_enabled_pos] = (ddog_prof_ValueType) HEAP_SAMPLES_VALUE; + state->position_for[HEAP_SAMPLES_VALUE_ID] = next_enabled_pos++; + } else { + state->position_for[HEAP_SAMPLES_VALUE_ID] = next_disabled_pos++; + } + + if (heap_size_enabled == Qtrue) { + enabled_value_types[next_enabled_pos] = (ddog_prof_ValueType) HEAP_SIZE_VALUE; + state->position_for[HEAP_SIZE_VALUE_ID] = next_enabled_pos++; + } else { + state->position_for[HEAP_SIZE_VALUE_ID] = next_disabled_pos++; + } + heap_recorder_set_size_enabled(state->heap_recorder, heap_size_enabled); + + if (heap_samples_enabled == Qfalse && heap_size_enabled == Qfalse) { + // Turns out heap sampling is disabled but we initialized everything in _native_new + // assuming all samples were enabled. We need to deinitialize the heap recorder. + heap_recorder_free(state->heap_recorder); + state->heap_recorder = NULL; + } + + if (timeline_enabled == Qtrue) { + enabled_value_types[next_enabled_pos] = (ddog_prof_ValueType) TIMELINE_VALUE; + state->position_for[TIMELINE_VALUE_ID] = next_enabled_pos++; + } else { + state->position_for[TIMELINE_VALUE_ID] = next_disabled_pos++; + } + ddog_prof_Profile_drop(&state->slot_one_profile); ddog_prof_Profile_drop(&state->slot_two_profile); @@ -379,9 +469,18 @@ static VALUE _native_serialize(DDTRACE_UNUSED VALUE _self, VALUE recorder_instan // Need to do this while still holding on to the Global VM Lock; see comments on method for why serializer_set_start_timestamp_for_next_profile(state, finish_timestamp); + // Prepare the iteration on heap recorder we'll be doing outside the GVL. The preparation needs to + // happen while holding on to the GVL. + heap_recorder_prepare_iteration(state->heap_recorder); + // We'll release the Global VM Lock while we're calling serialize, so that the Ruby VM can continue to work while this // is pending - struct call_serialize_without_gvl_arguments args = {.state = state, .finish_timestamp = finish_timestamp, .serialize_ran = false}; + struct call_serialize_without_gvl_arguments args = { + .state = state, + .finish_timestamp = finish_timestamp, + .gc_count_before_serialize = rb_gc_count(), + .serialize_ran = false + }; while (!args.serialize_ran) { // Give the Ruby VM an opportunity to process any pending interruptions (including raising exceptions). @@ -397,6 +496,9 @@ static VALUE _native_serialize(DDTRACE_UNUSED VALUE _self, VALUE recorder_instan rb_thread_call_without_gvl2(call_serialize_without_gvl, &args, NULL /* No interruption function needed in this case */, NULL /* Not needed */); } + // Cleanup after heap recorder iteration. This needs to happen while holding on to the GVL. + heap_recorder_finish_iteration(state->heap_recorder); + ddog_prof_Profile_SerializeResult serialized_profile = args.result; if (serialized_profile.tag == DDOG_PROF_PROFILE_SERIALIZE_RESULT_ERR) { @@ -439,6 +541,15 @@ void record_sample(VALUE recorder_instance, ddog_prof_Slice_Location locations, metric_values[position_for[CPU_SAMPLES_VALUE_ID]] = values.cpu_or_wall_samples; metric_values[position_for[WALL_TIME_VALUE_ID]] = values.wall_time_ns; metric_values[position_for[ALLOC_SAMPLES_VALUE_ID]] = values.alloc_samples; + metric_values[position_for[TIMELINE_VALUE_ID]] = values.timeline_wall_time_ns; + + if (values.alloc_samples != 0) { + // If we got an allocation sample end the heap allocation recording to commit the heap sample. + // FIXME: Heap sampling currently has to be done in 2 parts because the construction of locations is happening + // very late in the allocation-sampling path (which is shared with the cpu sampling path). This can + // be fixed with some refactoring but for now this leads to a less impactful change. + end_heap_allocation_recording(state->heap_recorder, locations); + } ddog_prof_Profile_Result result = ddog_prof_Profile_add( active_slot.profile, @@ -457,6 +568,15 @@ void record_sample(VALUE recorder_instance, ddog_prof_Slice_Location locations, } } +void track_object(VALUE recorder_instance, VALUE new_object, unsigned int sample_weight, ddog_CharSlice *alloc_class) { + struct stack_recorder_state *state; + TypedData_Get_Struct(recorder_instance, struct stack_recorder_state, &stack_recorder_typed_data, state); + // FIXME: Heap sampling currently has to be done in 2 parts because the construction of locations is happening + // very late in the allocation-sampling path (which is shared with the cpu sampling path). This can + // be fixed with some refactoring but for now this leads to a less impactful change. + start_heap_allocation_recording(state->heap_recorder, new_object, sample_weight, alloc_class); +} + void record_endpoint(VALUE recorder_instance, uint64_t local_root_span_id, ddog_CharSlice endpoint) { struct stack_recorder_state *state; TypedData_Get_Struct(recorder_instance, struct stack_recorder_state, &stack_recorder_typed_data, state); @@ -472,10 +592,103 @@ void record_endpoint(VALUE recorder_instance, uint64_t local_root_span_id, ddog_ } } +#define MAX_LEN_HEAP_ITERATION_ERROR_MSG 256 + +// Heap recorder iteration context allows us access to stack recorder state and profile being serialized +// during iteration of heap recorder live objects. +typedef struct heap_recorder_iteration_context { + struct stack_recorder_state *state; + ddog_prof_Profile *profile; + + bool error; + char error_msg[MAX_LEN_HEAP_ITERATION_ERROR_MSG]; + + size_t profile_gen; +} heap_recorder_iteration_context; + +static bool add_heap_sample_to_active_profile_without_gvl(heap_recorder_iteration_data iteration_data, void *extra_arg) { + heap_recorder_iteration_context *context = (heap_recorder_iteration_context*) extra_arg; + + live_object_data *object_data = &iteration_data.object_data; + + int64_t metric_values[ALL_VALUE_TYPES_COUNT] = {0}; + uint8_t *position_for = context->state->position_for; + + metric_values[position_for[HEAP_SAMPLES_VALUE_ID]] = object_data->weight; + metric_values[position_for[HEAP_SIZE_VALUE_ID]] = object_data->size * object_data->weight; + + ddog_prof_Label labels[2]; + size_t label_offset = 0; + + if (object_data->class != NULL) { + labels[label_offset++] = (ddog_prof_Label) { + .key = DDOG_CHARSLICE_C("allocation class"), + .str = (ddog_CharSlice) { + .ptr = object_data->class, + .len = strlen(object_data->class), + }, + .num = 0, // This shouldn't be needed but the tracer-2.7 docker image ships a buggy gcc that complains about this + }; + } + labels[label_offset++] = (ddog_prof_Label) { + .key = DDOG_CHARSLICE_C("gc gen age"), + .num = context->profile_gen - object_data->alloc_gen, + }; + + ddog_prof_Profile_Result result = ddog_prof_Profile_add( + context->profile, + (ddog_prof_Sample) { + .locations = iteration_data.locations, + .values = (ddog_Slice_I64) {.ptr = metric_values, .len = context->state->enabled_values_count}, + .labels = (ddog_prof_Slice_Label) { + .ptr = labels, + .len = label_offset, + } + }, + 0 + ); + + if (result.tag == DDOG_PROF_PROFILE_RESULT_ERR) { + read_ddogerr_string_and_drop(&result.err, context->error_msg, MAX_LEN_HEAP_ITERATION_ERROR_MSG); + context->error = true; + // By returning false we cancel the iteration + return false; + } + + // Keep on iterating to next item! + return true; +} + +static void build_heap_profile_without_gvl(struct stack_recorder_state *state, ddog_prof_Profile *profile, size_t gc_count_before_serialize) { + heap_recorder_iteration_context iteration_context = { + .state = state, + .profile = profile, + .error = false, + .error_msg = {0}, + .profile_gen = gc_count_before_serialize, + }; + bool iterated = heap_recorder_for_each_live_object(state->heap_recorder, add_heap_sample_to_active_profile_without_gvl, (void*) &iteration_context); + // We wait until we're out of the iteration to grab the gvl and raise. This is important because during + // iteration we may potentially acquire locks in the heap recorder and we could reach a deadlock if the + // same locks are acquired by the heap recorder while holding the gvl (since we'd be operating on the + // same locks but acquiring them in different order). + if (!iterated) { + grab_gvl_and_raise(rb_eRuntimeError, "Failure during heap profile building: iteration cancelled"); + } + else if (iteration_context.error) { + grab_gvl_and_raise(rb_eRuntimeError, "Failure during heap profile building: %s", iteration_context.error_msg); + } +} + static void *call_serialize_without_gvl(void *call_args) { struct call_serialize_without_gvl_arguments *args = (struct call_serialize_without_gvl_arguments *) call_args; args->profile = serializer_flip_active_and_inactive_slots(args->state); + + // Now that we have the inactive profile with all but heap samples, lets fill it with heap data + // without needing to race with the active sampler + build_heap_profile_without_gvl(args->state, args->profile, args->gc_count_before_serialize); + // Note: The profile gets reset by the serialize call args->result = ddog_prof_Profile_serialize(args->profile, &args->finish_timestamp, NULL /* duration_nanos is optional */, NULL /* start_time is optional */); args->serialize_ran = true; @@ -597,6 +810,8 @@ static VALUE _native_reset_after_fork(DDTRACE_UNUSED VALUE self, VALUE recorder_ reset_profile(&state->slot_one_profile, /* start_time: */ NULL); reset_profile(&state->slot_two_profile, /* start_time: */ NULL); + heap_recorder_after_fork(state->heap_recorder); + return Qtrue; } @@ -614,9 +829,77 @@ static VALUE _native_record_endpoint(DDTRACE_UNUSED VALUE _self, VALUE recorder_ return Qtrue; } +static VALUE _native_track_object(DDTRACE_UNUSED VALUE _self, VALUE recorder_instance, VALUE new_obj, VALUE weight, VALUE alloc_class) { + ENFORCE_TYPE(weight, T_FIXNUM); + ddog_CharSlice alloc_class_slice = char_slice_from_ruby_string(alloc_class); + track_object(recorder_instance, new_obj, NUM2UINT(weight), &alloc_class_slice); + return Qtrue; +} + +static VALUE _native_check_heap_hashes(DDTRACE_UNUSED VALUE _self, VALUE locations) { + ENFORCE_TYPE(locations, T_ARRAY); + size_t locations_len = rb_array_len(locations); + ddog_prof_Location locations_arr[locations_len]; + for (size_t i = 0; i < locations_len; i++) { + VALUE location = rb_ary_entry(locations, i); + ENFORCE_TYPE(location, T_ARRAY); + VALUE name = rb_ary_entry(location, 0); + VALUE filename = rb_ary_entry(location, 1); + VALUE line = rb_ary_entry(location, 2); + ENFORCE_TYPE(name, T_STRING); + ENFORCE_TYPE(filename, T_STRING); + ENFORCE_TYPE(line, T_FIXNUM); + locations_arr[i] = (ddog_prof_Location) { + .line = line, + .function = (ddog_prof_Function) { + .name = char_slice_from_ruby_string(name), + .filename = char_slice_from_ruby_string(filename), + } + }; + } + ddog_prof_Slice_Location ddog_locations = { + .len = locations_len, + .ptr = locations_arr, + }; + heap_recorder_testonly_assert_hash_matches(ddog_locations); + + return Qnil; +} + static void reset_profile(ddog_prof_Profile *profile, ddog_Timespec *start_time /* Can be null */) { ddog_prof_Profile_Result reset_result = ddog_prof_Profile_reset(profile, start_time); if (reset_result.tag == DDOG_PROF_PROFILE_RESULT_ERR) { rb_raise(rb_eRuntimeError, "Failed to reset profile: %"PRIsVALUE, get_error_details_and_drop(&reset_result.err)); } } + +// This method exists only to enable testing Datadog::Profiling::StackRecorder behavior using RSpec. +// It SHOULD NOT be used for other purposes. +static VALUE _native_start_fake_slow_heap_serialization(DDTRACE_UNUSED VALUE _self, VALUE recorder_instance) { + struct stack_recorder_state *state; + TypedData_Get_Struct(recorder_instance, struct stack_recorder_state, &stack_recorder_typed_data, state); + + heap_recorder_prepare_iteration(state->heap_recorder); + + return Qnil; +} + +// This method exists only to enable testing Datadog::Profiling::StackRecorder behavior using RSpec. +// It SHOULD NOT be used for other purposes. +static VALUE _native_end_fake_slow_heap_serialization(DDTRACE_UNUSED VALUE _self, VALUE recorder_instance) { + struct stack_recorder_state *state; + TypedData_Get_Struct(recorder_instance, struct stack_recorder_state, &stack_recorder_typed_data, state); + + heap_recorder_finish_iteration(state->heap_recorder); + + return Qnil; +} + +// This method exists only to enable testing Datadog::Profiling::StackRecorder behavior using RSpec. +// It SHOULD NOT be used for other purposes. +static VALUE _native_debug_heap_recorder(DDTRACE_UNUSED VALUE _self, VALUE recorder_instance) { + struct stack_recorder_state *state; + TypedData_Get_Struct(recorder_instance, struct stack_recorder_state, &stack_recorder_typed_data, state); + + return heap_recorder_testonly_debug(state->heap_recorder); +} diff --git a/ext/ddtrace_profiling_native_extension/stack_recorder.h b/ext/ddtrace_profiling_native_extension/stack_recorder.h index 2e871069019..cfb93f7a25f 100644 --- a/ext/ddtrace_profiling_native_extension/stack_recorder.h +++ b/ext/ddtrace_profiling_native_extension/stack_recorder.h @@ -1,12 +1,14 @@ #pragma once #include +#include typedef struct { int64_t cpu_time_ns; int64_t wall_time_ns; uint32_t cpu_or_wall_samples; uint32_t alloc_samples; + int64_t timeline_wall_time_ns; } sample_values; typedef struct sample_labels { @@ -21,4 +23,5 @@ typedef struct sample_labels { void record_sample(VALUE recorder_instance, ddog_prof_Slice_Location locations, sample_values values, sample_labels labels); void record_endpoint(VALUE recorder_instance, uint64_t local_root_span_id, ddog_CharSlice endpoint); +void track_object(VALUE recorder_instance, VALUE new_object, unsigned int sample_weight, ddog_CharSlice *alloc_class); VALUE enforce_recorder_instance(VALUE object); diff --git a/gemfiles/jruby_9.2_activesupport.gemfile.lock b/gemfiles/jruby_9.2_activesupport.gemfile.lock index 407b070d168..e3db9dff5ac 100644 --- a/gemfiles/jruby_9.2_activesupport.gemfile.lock +++ b/gemfiles/jruby_9.2_activesupport.gemfile.lock @@ -12,7 +12,6 @@ PATH remote: .. specs: ddtrace (1.18.0) - datadog-ci (~> 0.5.0) debase-ruby_core_source (= 3.2.3) libdatadog (~> 5.0.0.1.0) libddwaf (~> 1.14.0.0.0) @@ -65,8 +64,6 @@ GEM rexml crass (1.0.6) cri (2.15.11) - datadog-ci (0.5.0) - msgpack debase-ruby_core_source (3.2.3) diff-lcs (1.5.0) digest-crc (0.6.5) diff --git a/gemfiles/jruby_9.2_aws.gemfile.lock b/gemfiles/jruby_9.2_aws.gemfile.lock index 553cf65adac..b9f781eaafe 100644 --- a/gemfiles/jruby_9.2_aws.gemfile.lock +++ b/gemfiles/jruby_9.2_aws.gemfile.lock @@ -12,7 +12,6 @@ PATH remote: .. specs: ddtrace (1.18.0) - datadog-ci (~> 0.5.0) debase-ruby_core_source (= 3.2.3) libdatadog (~> 5.0.0.1.0) libddwaf (~> 1.14.0.0.0) @@ -1458,8 +1457,6 @@ GEM crack (0.4.5) rexml cri (2.15.11) - datadog-ci (0.5.0) - msgpack debase-ruby_core_source (3.2.3) diff-lcs (1.5.0) docile (1.4.0) diff --git a/gemfiles/jruby_9.2_contrib.gemfile.lock b/gemfiles/jruby_9.2_contrib.gemfile.lock index ff0f9b4b201..01d053c6a23 100644 --- a/gemfiles/jruby_9.2_contrib.gemfile.lock +++ b/gemfiles/jruby_9.2_contrib.gemfile.lock @@ -12,7 +12,6 @@ PATH remote: .. specs: ddtrace (1.18.0) - datadog-ci (~> 0.5.0) debase-ruby_core_source (= 3.2.3) libdatadog (~> 5.0.0.1.0) libddwaf (~> 1.14.0.0.0) @@ -44,8 +43,6 @@ GEM rexml cri (2.15.11) dalli (3.2.0) - datadog-ci (0.5.0) - msgpack debase-ruby_core_source (3.2.3) diff-lcs (1.5.0) docile (1.4.0) diff --git a/gemfiles/jruby_9.2_contrib_old.gemfile.lock b/gemfiles/jruby_9.2_contrib_old.gemfile.lock index 1bef6e59948..6abf7f8fc2f 100644 --- a/gemfiles/jruby_9.2_contrib_old.gemfile.lock +++ b/gemfiles/jruby_9.2_contrib_old.gemfile.lock @@ -12,7 +12,6 @@ PATH remote: .. specs: ddtrace (1.18.0) - datadog-ci (~> 0.5.0) debase-ruby_core_source (= 3.2.3) libdatadog (~> 5.0.0.1.0) libddwaf (~> 1.14.0.0.0) @@ -38,8 +37,6 @@ GEM rexml cri (2.15.11) dalli (2.7.11) - datadog-ci (0.5.0) - msgpack debase-ruby_core_source (3.2.3) diff-lcs (1.5.0) docile (1.4.0) diff --git a/gemfiles/jruby_9.2_core_old.gemfile.lock b/gemfiles/jruby_9.2_core_old.gemfile.lock index ab1c232f228..3a7c3348170 100644 --- a/gemfiles/jruby_9.2_core_old.gemfile.lock +++ b/gemfiles/jruby_9.2_core_old.gemfile.lock @@ -12,7 +12,6 @@ PATH remote: .. specs: ddtrace (1.18.0) - datadog-ci (~> 0.5.0) debase-ruby_core_source (= 3.2.3) libdatadog (~> 5.0.0.1.0) libddwaf (~> 1.14.0.0.0) @@ -37,8 +36,6 @@ GEM crack (0.4.5) rexml cri (2.15.11) - datadog-ci (0.5.0) - msgpack debase-ruby_core_source (3.2.3) diff-lcs (1.5.0) docile (1.4.0) diff --git a/gemfiles/jruby_9.2_elasticsearch_7.gemfile.lock b/gemfiles/jruby_9.2_elasticsearch_7.gemfile.lock index 2770bd42a6b..00e8cb1e612 100644 --- a/gemfiles/jruby_9.2_elasticsearch_7.gemfile.lock +++ b/gemfiles/jruby_9.2_elasticsearch_7.gemfile.lock @@ -12,7 +12,6 @@ PATH remote: .. specs: ddtrace (1.18.0) - datadog-ci (~> 0.5.0) debase-ruby_core_source (= 3.2.3) libdatadog (~> 5.0.0.1.0) libddwaf (~> 1.14.0.0.0) @@ -38,8 +37,6 @@ GEM crack (0.4.5) rexml cri (2.15.11) - datadog-ci (0.5.0) - msgpack debase-ruby_core_source (3.2.3) diff-lcs (1.5.0) docile (1.4.0) diff --git a/gemfiles/jruby_9.2_elasticsearch_8.gemfile.lock b/gemfiles/jruby_9.2_elasticsearch_8.gemfile.lock index 590e1488435..ea6856c97b5 100644 --- a/gemfiles/jruby_9.2_elasticsearch_8.gemfile.lock +++ b/gemfiles/jruby_9.2_elasticsearch_8.gemfile.lock @@ -12,7 +12,6 @@ PATH remote: .. specs: ddtrace (1.18.0) - datadog-ci (~> 0.5.0) debase-ruby_core_source (= 3.2.3) libdatadog (~> 5.0.0.1.0) libddwaf (~> 1.14.0.0.0) @@ -38,8 +37,6 @@ GEM crack (0.4.5) rexml cri (2.15.11) - datadog-ci (0.5.0) - msgpack debase-ruby_core_source (3.2.3) diff-lcs (1.5.0) docile (1.4.0) diff --git a/gemfiles/jruby_9.2_hanami_1.gemfile.lock b/gemfiles/jruby_9.2_hanami_1.gemfile.lock index 8ead37a037f..b6cc5a3847a 100644 --- a/gemfiles/jruby_9.2_hanami_1.gemfile.lock +++ b/gemfiles/jruby_9.2_hanami_1.gemfile.lock @@ -12,7 +12,6 @@ PATH remote: .. specs: ddtrace (1.18.0) - datadog-ci (~> 0.5.0) debase-ruby_core_source (= 3.2.3) libdatadog (~> 5.0.0.1.0) libddwaf (~> 1.14.0.0.0) @@ -37,8 +36,6 @@ GEM crack (0.4.5) rexml cri (2.15.11) - datadog-ci (0.5.0) - msgpack debase-ruby_core_source (3.2.3) diff-lcs (1.5.0) digest (3.1.1-java) diff --git a/gemfiles/jruby_9.2_http.gemfile.lock b/gemfiles/jruby_9.2_http.gemfile.lock index 46142cb3000..cdce07a172d 100644 --- a/gemfiles/jruby_9.2_http.gemfile.lock +++ b/gemfiles/jruby_9.2_http.gemfile.lock @@ -12,7 +12,6 @@ PATH remote: .. specs: ddtrace (1.18.0) - datadog-ci (~> 0.5.0) debase-ruby_core_source (= 3.2.3) libdatadog (~> 5.0.0.1.0) libddwaf (~> 1.14.0.0.0) @@ -37,8 +36,6 @@ GEM crack (0.4.5) rexml cri (2.15.11) - datadog-ci (0.5.0) - msgpack debase-ruby_core_source (3.2.3) diff-lcs (1.5.0) docile (1.4.0) diff --git a/gemfiles/jruby_9.2_opensearch_2.gemfile.lock b/gemfiles/jruby_9.2_opensearch_2.gemfile.lock index 80ed0bb56a0..5447ed1650b 100644 --- a/gemfiles/jruby_9.2_opensearch_2.gemfile.lock +++ b/gemfiles/jruby_9.2_opensearch_2.gemfile.lock @@ -12,7 +12,6 @@ PATH remote: .. specs: ddtrace (1.18.0) - datadog-ci (~> 0.5.0) debase-ruby_core_source (= 3.2.3) libdatadog (~> 5.0.0.1.0) libddwaf (~> 1.14.0.0.0) @@ -38,8 +37,6 @@ GEM crack (0.4.5) rexml cri (2.15.11) - datadog-ci (0.5.0) - msgpack debase-ruby_core_source (3.2.3) diff-lcs (1.5.0) docile (1.4.0) diff --git a/gemfiles/jruby_9.2_opensearch_3.gemfile.lock b/gemfiles/jruby_9.2_opensearch_3.gemfile.lock index e343d2602d1..1e29faa3e4d 100644 --- a/gemfiles/jruby_9.2_opensearch_3.gemfile.lock +++ b/gemfiles/jruby_9.2_opensearch_3.gemfile.lock @@ -12,7 +12,6 @@ PATH remote: .. specs: ddtrace (1.18.0) - datadog-ci (~> 0.5.0) debase-ruby_core_source (= 3.2.3) libdatadog (~> 5.0.0.1.0) libddwaf (~> 1.14.0.0.0) @@ -38,8 +37,6 @@ GEM crack (0.4.5) rexml cri (2.15.11) - datadog-ci (0.5.0) - msgpack debase-ruby_core_source (3.2.3) diff-lcs (1.5.0) docile (1.4.0) diff --git a/gemfiles/jruby_9.2_opentracing.gemfile.lock b/gemfiles/jruby_9.2_opentracing.gemfile.lock index 155e470c4ad..6481449f1a3 100644 --- a/gemfiles/jruby_9.2_opentracing.gemfile.lock +++ b/gemfiles/jruby_9.2_opentracing.gemfile.lock @@ -12,7 +12,6 @@ PATH remote: .. specs: ddtrace (1.18.0) - datadog-ci (~> 0.5.0) debase-ruby_core_source (= 3.2.3) libdatadog (~> 5.0.0.1.0) libddwaf (~> 1.14.0.0.0) @@ -38,8 +37,6 @@ GEM crack (0.4.5) rexml cri (2.15.11) - datadog-ci (0.5.0) - msgpack debase-ruby_core_source (3.2.3) diff-lcs (1.5.0) docile (1.4.0) diff --git a/gemfiles/jruby_9.2_rack_1.gemfile.lock b/gemfiles/jruby_9.2_rack_1.gemfile.lock index f895819c854..7ca1b1c8276 100644 --- a/gemfiles/jruby_9.2_rack_1.gemfile.lock +++ b/gemfiles/jruby_9.2_rack_1.gemfile.lock @@ -12,7 +12,6 @@ PATH remote: .. specs: ddtrace (1.18.0) - datadog-ci (~> 0.5.0) debase-ruby_core_source (= 3.2.3) libdatadog (~> 5.0.0.1.0) libddwaf (~> 1.14.0.0.0) @@ -37,8 +36,6 @@ GEM crack (0.4.5) rexml cri (2.15.11) - datadog-ci (0.5.0) - msgpack debase-ruby_core_source (3.2.3) diff-lcs (1.5.0) docile (1.4.0) diff --git a/gemfiles/jruby_9.2_rack_2.gemfile.lock b/gemfiles/jruby_9.2_rack_2.gemfile.lock index 83a0c3466b2..e6aee1527ba 100644 --- a/gemfiles/jruby_9.2_rack_2.gemfile.lock +++ b/gemfiles/jruby_9.2_rack_2.gemfile.lock @@ -12,7 +12,6 @@ PATH remote: .. specs: ddtrace (1.18.0) - datadog-ci (~> 0.5.0) debase-ruby_core_source (= 3.2.3) libdatadog (~> 5.0.0.1.0) libddwaf (~> 1.14.0.0.0) @@ -37,8 +36,6 @@ GEM crack (0.4.5) rexml cri (2.15.11) - datadog-ci (0.5.0) - msgpack debase-ruby_core_source (3.2.3) diff-lcs (1.5.0) docile (1.4.0) diff --git a/gemfiles/jruby_9.2_rack_3.gemfile.lock b/gemfiles/jruby_9.2_rack_3.gemfile.lock index 5cb6adf55bb..4191b29bace 100644 --- a/gemfiles/jruby_9.2_rack_3.gemfile.lock +++ b/gemfiles/jruby_9.2_rack_3.gemfile.lock @@ -12,7 +12,6 @@ PATH remote: .. specs: ddtrace (1.18.0) - datadog-ci (~> 0.5.0) debase-ruby_core_source (= 3.2.3) libdatadog (~> 5.0.0.1.0) libddwaf (~> 1.14.0.0.0) @@ -37,8 +36,6 @@ GEM crack (0.4.5) rexml cri (2.15.11) - datadog-ci (0.5.0) - msgpack debase-ruby_core_source (3.2.3) diff-lcs (1.5.0) docile (1.4.0) diff --git a/gemfiles/jruby_9.2_rails5_mysql2.gemfile.lock b/gemfiles/jruby_9.2_rails5_mysql2.gemfile.lock index f771b614253..e8ecc090f7f 100644 --- a/gemfiles/jruby_9.2_rails5_mysql2.gemfile.lock +++ b/gemfiles/jruby_9.2_rails5_mysql2.gemfile.lock @@ -12,7 +12,6 @@ PATH remote: .. specs: ddtrace (1.18.0) - datadog-ci (~> 0.5.0) debase-ruby_core_source (= 3.2.3) libdatadog (~> 5.0.0.1.0) libddwaf (~> 1.14.0.0.0) @@ -85,8 +84,6 @@ GEM rexml crass (1.0.6) cri (2.15.11) - datadog-ci (0.5.0) - msgpack debase-ruby_core_source (3.2.3) diff-lcs (1.5.0) docile (1.4.0) diff --git a/gemfiles/jruby_9.2_rails5_postgres.gemfile.lock b/gemfiles/jruby_9.2_rails5_postgres.gemfile.lock index 9ca7bdbd034..d94978db011 100644 --- a/gemfiles/jruby_9.2_rails5_postgres.gemfile.lock +++ b/gemfiles/jruby_9.2_rails5_postgres.gemfile.lock @@ -12,7 +12,6 @@ PATH remote: .. specs: ddtrace (1.18.0) - datadog-ci (~> 0.5.0) debase-ruby_core_source (= 3.2.3) libdatadog (~> 5.0.0.1.0) libddwaf (~> 1.14.0.0.0) @@ -85,8 +84,6 @@ GEM rexml crass (1.0.6) cri (2.15.11) - datadog-ci (0.5.0) - msgpack debase-ruby_core_source (3.2.3) diff-lcs (1.5.0) digest (3.1.1-java) diff --git a/gemfiles/jruby_9.2_rails5_postgres_redis.gemfile.lock b/gemfiles/jruby_9.2_rails5_postgres_redis.gemfile.lock index 199087e127a..2562465d584 100644 --- a/gemfiles/jruby_9.2_rails5_postgres_redis.gemfile.lock +++ b/gemfiles/jruby_9.2_rails5_postgres_redis.gemfile.lock @@ -12,7 +12,6 @@ PATH remote: .. specs: ddtrace (1.18.0) - datadog-ci (~> 0.5.0) debase-ruby_core_source (= 3.2.3) libdatadog (~> 5.0.0.1.0) libddwaf (~> 1.14.0.0.0) @@ -86,8 +85,6 @@ GEM rexml crass (1.0.6) cri (2.15.11) - datadog-ci (0.5.0) - msgpack debase-ruby_core_source (3.2.3) diff-lcs (1.5.0) digest (3.1.1-java) diff --git a/gemfiles/jruby_9.2_rails5_postgres_redis_activesupport.gemfile.lock b/gemfiles/jruby_9.2_rails5_postgres_redis_activesupport.gemfile.lock index 447e052f0c6..73a5dbe6032 100644 --- a/gemfiles/jruby_9.2_rails5_postgres_redis_activesupport.gemfile.lock +++ b/gemfiles/jruby_9.2_rails5_postgres_redis_activesupport.gemfile.lock @@ -12,7 +12,6 @@ PATH remote: .. specs: ddtrace (1.18.0) - datadog-ci (~> 0.5.0) debase-ruby_core_source (= 3.2.3) libdatadog (~> 5.0.0.1.0) libddwaf (~> 1.14.0.0.0) @@ -85,8 +84,6 @@ GEM rexml crass (1.0.6) cri (2.15.11) - datadog-ci (0.5.0) - msgpack debase-ruby_core_source (3.2.3) diff-lcs (1.5.0) digest (3.1.1-java) diff --git a/gemfiles/jruby_9.2_rails5_postgres_sidekiq.gemfile.lock b/gemfiles/jruby_9.2_rails5_postgres_sidekiq.gemfile.lock index 3b9c91ceacb..e59a47946f2 100644 --- a/gemfiles/jruby_9.2_rails5_postgres_sidekiq.gemfile.lock +++ b/gemfiles/jruby_9.2_rails5_postgres_sidekiq.gemfile.lock @@ -12,7 +12,6 @@ PATH remote: .. specs: ddtrace (1.18.0) - datadog-ci (~> 0.5.0) debase-ruby_core_source (= 3.2.3) libdatadog (~> 5.0.0.1.0) libddwaf (~> 1.14.0.0.0) @@ -86,8 +85,6 @@ GEM rexml crass (1.0.6) cri (2.15.11) - datadog-ci (0.5.0) - msgpack debase-ruby_core_source (3.2.3) diff-lcs (1.5.0) digest (3.1.1-java) diff --git a/gemfiles/jruby_9.2_rails5_semantic_logger.gemfile.lock b/gemfiles/jruby_9.2_rails5_semantic_logger.gemfile.lock index f55691da900..cc62ed67fe7 100644 --- a/gemfiles/jruby_9.2_rails5_semantic_logger.gemfile.lock +++ b/gemfiles/jruby_9.2_rails5_semantic_logger.gemfile.lock @@ -12,7 +12,6 @@ PATH remote: .. specs: ddtrace (1.18.0) - datadog-ci (~> 0.5.0) debase-ruby_core_source (= 3.2.3) libdatadog (~> 5.0.0.1.0) libddwaf (~> 1.14.0.0.0) @@ -85,8 +84,6 @@ GEM rexml crass (1.0.6) cri (2.15.11) - datadog-ci (0.5.0) - msgpack debase-ruby_core_source (3.2.3) diff-lcs (1.5.0) digest (3.1.1-java) diff --git a/gemfiles/jruby_9.2_rails61_mysql2.gemfile.lock b/gemfiles/jruby_9.2_rails61_mysql2.gemfile.lock index fcde761686f..d27277691b3 100644 --- a/gemfiles/jruby_9.2_rails61_mysql2.gemfile.lock +++ b/gemfiles/jruby_9.2_rails61_mysql2.gemfile.lock @@ -12,7 +12,6 @@ PATH remote: .. specs: ddtrace (1.18.0) - datadog-ci (~> 0.5.0) debase-ruby_core_source (= 3.2.3) libdatadog (~> 5.0.0.1.0) libddwaf (~> 1.14.0.0.0) @@ -102,8 +101,6 @@ GEM rexml crass (1.0.6) cri (2.15.11) - datadog-ci (0.5.0) - msgpack debase-ruby_core_source (3.2.3) diff-lcs (1.5.0) docile (1.4.0) diff --git a/gemfiles/jruby_9.2_rails61_postgres.gemfile.lock b/gemfiles/jruby_9.2_rails61_postgres.gemfile.lock index dd399e428f7..fdb7ca3cefb 100644 --- a/gemfiles/jruby_9.2_rails61_postgres.gemfile.lock +++ b/gemfiles/jruby_9.2_rails61_postgres.gemfile.lock @@ -12,7 +12,6 @@ PATH remote: .. specs: ddtrace (1.18.0) - datadog-ci (~> 0.5.0) debase-ruby_core_source (= 3.2.3) libdatadog (~> 5.0.0.1.0) libddwaf (~> 1.14.0.0.0) @@ -102,8 +101,6 @@ GEM rexml crass (1.0.6) cri (2.15.11) - datadog-ci (0.5.0) - msgpack debase-ruby_core_source (3.2.3) diff-lcs (1.5.0) digest (3.1.1-java) diff --git a/gemfiles/jruby_9.2_rails61_postgres_redis.gemfile.lock b/gemfiles/jruby_9.2_rails61_postgres_redis.gemfile.lock index bc16594967a..433e6fcaad0 100644 --- a/gemfiles/jruby_9.2_rails61_postgres_redis.gemfile.lock +++ b/gemfiles/jruby_9.2_rails61_postgres_redis.gemfile.lock @@ -12,7 +12,6 @@ PATH remote: .. specs: ddtrace (1.18.0) - datadog-ci (~> 0.5.0) debase-ruby_core_source (= 3.2.3) libdatadog (~> 5.0.0.1.0) libddwaf (~> 1.14.0.0.0) @@ -103,8 +102,6 @@ GEM rexml crass (1.0.6) cri (2.15.11) - datadog-ci (0.5.0) - msgpack debase-ruby_core_source (3.2.3) diff-lcs (1.5.0) digest (3.1.1-java) diff --git a/gemfiles/jruby_9.2_rails61_postgres_sidekiq.gemfile.lock b/gemfiles/jruby_9.2_rails61_postgres_sidekiq.gemfile.lock index 9702ca822fd..e05cff7fa2d 100644 --- a/gemfiles/jruby_9.2_rails61_postgres_sidekiq.gemfile.lock +++ b/gemfiles/jruby_9.2_rails61_postgres_sidekiq.gemfile.lock @@ -12,7 +12,6 @@ PATH remote: .. specs: ddtrace (1.18.0) - datadog-ci (~> 0.5.0) debase-ruby_core_source (= 3.2.3) libdatadog (~> 5.0.0.1.0) libddwaf (~> 1.14.0.0.0) @@ -103,8 +102,6 @@ GEM rexml crass (1.0.6) cri (2.15.11) - datadog-ci (0.5.0) - msgpack debase-ruby_core_source (3.2.3) diff-lcs (1.5.0) digest (3.1.1-java) diff --git a/gemfiles/jruby_9.2_rails61_semantic_logger.gemfile.lock b/gemfiles/jruby_9.2_rails61_semantic_logger.gemfile.lock index 52293ac7805..2776571b7ec 100644 --- a/gemfiles/jruby_9.2_rails61_semantic_logger.gemfile.lock +++ b/gemfiles/jruby_9.2_rails61_semantic_logger.gemfile.lock @@ -12,7 +12,6 @@ PATH remote: .. specs: ddtrace (1.18.0) - datadog-ci (~> 0.5.0) debase-ruby_core_source (= 3.2.3) libdatadog (~> 5.0.0.1.0) libddwaf (~> 1.14.0.0.0) @@ -102,8 +101,6 @@ GEM rexml crass (1.0.6) cri (2.15.11) - datadog-ci (0.5.0) - msgpack debase-ruby_core_source (3.2.3) diff-lcs (1.5.0) digest (3.1.1-java) diff --git a/gemfiles/jruby_9.2_rails6_mysql2.gemfile.lock b/gemfiles/jruby_9.2_rails6_mysql2.gemfile.lock index e035e467916..dd235942cd1 100644 --- a/gemfiles/jruby_9.2_rails6_mysql2.gemfile.lock +++ b/gemfiles/jruby_9.2_rails6_mysql2.gemfile.lock @@ -12,7 +12,6 @@ PATH remote: .. specs: ddtrace (1.18.0) - datadog-ci (~> 0.5.0) debase-ruby_core_source (= 3.2.3) libdatadog (~> 5.0.0.1.0) libddwaf (~> 1.14.0.0.0) @@ -98,8 +97,6 @@ GEM rexml crass (1.0.6) cri (2.15.11) - datadog-ci (0.5.0) - msgpack debase-ruby_core_source (3.2.3) diff-lcs (1.5.0) docile (1.4.0) diff --git a/gemfiles/jruby_9.2_rails6_postgres.gemfile.lock b/gemfiles/jruby_9.2_rails6_postgres.gemfile.lock index d7b5ce6c8da..1895abc92ee 100644 --- a/gemfiles/jruby_9.2_rails6_postgres.gemfile.lock +++ b/gemfiles/jruby_9.2_rails6_postgres.gemfile.lock @@ -12,7 +12,6 @@ PATH remote: .. specs: ddtrace (1.18.0) - datadog-ci (~> 0.5.0) debase-ruby_core_source (= 3.2.3) libdatadog (~> 5.0.0.1.0) libddwaf (~> 1.14.0.0.0) @@ -98,8 +97,6 @@ GEM rexml crass (1.0.6) cri (2.15.11) - datadog-ci (0.5.0) - msgpack debase-ruby_core_source (3.2.3) diff-lcs (1.5.0) digest (3.1.1-java) diff --git a/gemfiles/jruby_9.2_rails6_postgres_redis.gemfile.lock b/gemfiles/jruby_9.2_rails6_postgres_redis.gemfile.lock index 96c735e61c5..600acc9d5e8 100644 --- a/gemfiles/jruby_9.2_rails6_postgres_redis.gemfile.lock +++ b/gemfiles/jruby_9.2_rails6_postgres_redis.gemfile.lock @@ -12,7 +12,6 @@ PATH remote: .. specs: ddtrace (1.18.0) - datadog-ci (~> 0.5.0) debase-ruby_core_source (= 3.2.3) libdatadog (~> 5.0.0.1.0) libddwaf (~> 1.14.0.0.0) @@ -99,8 +98,6 @@ GEM rexml crass (1.0.6) cri (2.15.11) - datadog-ci (0.5.0) - msgpack debase-ruby_core_source (3.2.3) diff-lcs (1.5.0) digest (3.1.1-java) diff --git a/gemfiles/jruby_9.2_rails6_postgres_redis_activesupport.gemfile.lock b/gemfiles/jruby_9.2_rails6_postgres_redis_activesupport.gemfile.lock index 7879dbd0a02..c6a464eee7b 100644 --- a/gemfiles/jruby_9.2_rails6_postgres_redis_activesupport.gemfile.lock +++ b/gemfiles/jruby_9.2_rails6_postgres_redis_activesupport.gemfile.lock @@ -12,7 +12,6 @@ PATH remote: .. specs: ddtrace (1.18.0) - datadog-ci (~> 0.5.0) debase-ruby_core_source (= 3.2.3) libdatadog (~> 5.0.0.1.0) libddwaf (~> 1.14.0.0.0) @@ -98,8 +97,6 @@ GEM rexml crass (1.0.6) cri (2.15.11) - datadog-ci (0.5.0) - msgpack debase-ruby_core_source (3.2.3) diff-lcs (1.5.0) digest (3.1.1-java) diff --git a/gemfiles/jruby_9.2_rails6_postgres_sidekiq.gemfile.lock b/gemfiles/jruby_9.2_rails6_postgres_sidekiq.gemfile.lock index e9c893f5e1d..0571b670398 100644 --- a/gemfiles/jruby_9.2_rails6_postgres_sidekiq.gemfile.lock +++ b/gemfiles/jruby_9.2_rails6_postgres_sidekiq.gemfile.lock @@ -12,7 +12,6 @@ PATH remote: .. specs: ddtrace (1.18.0) - datadog-ci (~> 0.5.0) debase-ruby_core_source (= 3.2.3) libdatadog (~> 5.0.0.1.0) libddwaf (~> 1.14.0.0.0) @@ -99,8 +98,6 @@ GEM rexml crass (1.0.6) cri (2.15.11) - datadog-ci (0.5.0) - msgpack debase-ruby_core_source (3.2.3) diff-lcs (1.5.0) digest (3.1.1-java) diff --git a/gemfiles/jruby_9.2_rails6_semantic_logger.gemfile.lock b/gemfiles/jruby_9.2_rails6_semantic_logger.gemfile.lock index e9b0c701572..5c9e02881b3 100644 --- a/gemfiles/jruby_9.2_rails6_semantic_logger.gemfile.lock +++ b/gemfiles/jruby_9.2_rails6_semantic_logger.gemfile.lock @@ -12,7 +12,6 @@ PATH remote: .. specs: ddtrace (1.18.0) - datadog-ci (~> 0.5.0) debase-ruby_core_source (= 3.2.3) libdatadog (~> 5.0.0.1.0) libddwaf (~> 1.14.0.0.0) @@ -98,8 +97,6 @@ GEM rexml crass (1.0.6) cri (2.15.11) - datadog-ci (0.5.0) - msgpack debase-ruby_core_source (3.2.3) diff-lcs (1.5.0) digest (3.1.1-java) diff --git a/gemfiles/jruby_9.2_redis_3.gemfile.lock b/gemfiles/jruby_9.2_redis_3.gemfile.lock index ea55d004ce4..5ee5de9c0aa 100644 --- a/gemfiles/jruby_9.2_redis_3.gemfile.lock +++ b/gemfiles/jruby_9.2_redis_3.gemfile.lock @@ -12,7 +12,6 @@ PATH remote: .. specs: ddtrace (1.18.0) - datadog-ci (~> 0.5.0) debase-ruby_core_source (= 3.2.3) libdatadog (~> 5.0.0.1.0) libddwaf (~> 1.14.0.0.0) @@ -37,8 +36,6 @@ GEM crack (0.4.5) rexml cri (2.15.11) - datadog-ci (0.5.0) - msgpack debase-ruby_core_source (3.2.3) diff-lcs (1.5.0) docile (1.4.0) diff --git a/gemfiles/jruby_9.2_redis_4.gemfile.lock b/gemfiles/jruby_9.2_redis_4.gemfile.lock index 7b46fd4788e..9a43e7bbd14 100644 --- a/gemfiles/jruby_9.2_redis_4.gemfile.lock +++ b/gemfiles/jruby_9.2_redis_4.gemfile.lock @@ -12,7 +12,6 @@ PATH remote: .. specs: ddtrace (1.18.0) - datadog-ci (~> 0.5.0) debase-ruby_core_source (= 3.2.3) libdatadog (~> 5.0.0.1.0) libddwaf (~> 1.14.0.0.0) @@ -37,8 +36,6 @@ GEM crack (0.4.5) rexml cri (2.15.11) - datadog-ci (0.5.0) - msgpack debase-ruby_core_source (3.2.3) diff-lcs (1.5.0) docile (1.4.0) diff --git a/gemfiles/jruby_9.2_redis_5.gemfile.lock b/gemfiles/jruby_9.2_redis_5.gemfile.lock index 81d6806c7cc..648415a67a3 100644 --- a/gemfiles/jruby_9.2_redis_5.gemfile.lock +++ b/gemfiles/jruby_9.2_redis_5.gemfile.lock @@ -12,7 +12,6 @@ PATH remote: .. specs: ddtrace (1.18.0) - datadog-ci (~> 0.5.0) debase-ruby_core_source (= 3.2.3) libdatadog (~> 5.0.0.1.0) libddwaf (~> 1.14.0.0.0) @@ -38,8 +37,6 @@ GEM crack (0.4.5) rexml cri (2.15.11) - datadog-ci (0.5.0) - msgpack debase-ruby_core_source (3.2.3) diff-lcs (1.5.0) docile (1.4.0) diff --git a/gemfiles/jruby_9.2_relational_db.gemfile.lock b/gemfiles/jruby_9.2_relational_db.gemfile.lock index b1ac36f9714..6207bfee823 100644 --- a/gemfiles/jruby_9.2_relational_db.gemfile.lock +++ b/gemfiles/jruby_9.2_relational_db.gemfile.lock @@ -12,7 +12,6 @@ PATH remote: .. specs: ddtrace (1.18.0) - datadog-ci (~> 0.5.0) debase-ruby_core_source (= 3.2.3) libdatadog (~> 5.0.0.1.0) libddwaf (~> 1.14.0.0.0) @@ -60,8 +59,6 @@ GEM crack (0.4.5) rexml cri (2.15.11) - datadog-ci (0.5.0) - msgpack debase-ruby_core_source (3.2.3) delayed_job (4.1.11) activesupport (>= 3.0, < 8.0) diff --git a/gemfiles/jruby_9.2_resque2_redis3.gemfile.lock b/gemfiles/jruby_9.2_resque2_redis3.gemfile.lock index 701e784f058..0e22306d654 100644 --- a/gemfiles/jruby_9.2_resque2_redis3.gemfile.lock +++ b/gemfiles/jruby_9.2_resque2_redis3.gemfile.lock @@ -12,7 +12,6 @@ PATH remote: .. specs: ddtrace (1.18.0) - datadog-ci (~> 0.5.0) debase-ruby_core_source (= 3.2.3) libdatadog (~> 5.0.0.1.0) libddwaf (~> 1.14.0.0.0) @@ -37,8 +36,6 @@ GEM crack (0.4.5) rexml cri (2.15.11) - datadog-ci (0.5.0) - msgpack debase-ruby_core_source (3.2.3) diff-lcs (1.5.0) docile (1.4.0) diff --git a/gemfiles/jruby_9.2_resque2_redis4.gemfile.lock b/gemfiles/jruby_9.2_resque2_redis4.gemfile.lock index 9cc83eaadd5..b89da6dc878 100644 --- a/gemfiles/jruby_9.2_resque2_redis4.gemfile.lock +++ b/gemfiles/jruby_9.2_resque2_redis4.gemfile.lock @@ -12,7 +12,6 @@ PATH remote: .. specs: ddtrace (1.18.0) - datadog-ci (~> 0.5.0) debase-ruby_core_source (= 3.2.3) libdatadog (~> 5.0.0.1.0) libddwaf (~> 1.14.0.0.0) @@ -38,8 +37,6 @@ GEM crack (0.4.5) rexml cri (2.15.11) - datadog-ci (0.5.0) - msgpack debase-ruby_core_source (3.2.3) diff-lcs (1.5.0) docile (1.4.0) diff --git a/gemfiles/jruby_9.2_sinatra.gemfile.lock b/gemfiles/jruby_9.2_sinatra.gemfile.lock index dc0ed88bd60..56e1b5b0f82 100644 --- a/gemfiles/jruby_9.2_sinatra.gemfile.lock +++ b/gemfiles/jruby_9.2_sinatra.gemfile.lock @@ -12,7 +12,6 @@ PATH remote: .. specs: ddtrace (1.18.0) - datadog-ci (~> 0.5.0) debase-ruby_core_source (= 3.2.3) libdatadog (~> 5.0.0.1.0) libddwaf (~> 1.14.0.0.0) @@ -37,8 +36,6 @@ GEM crack (0.4.5) rexml cri (2.15.11) - datadog-ci (0.5.0) - msgpack debase-ruby_core_source (3.2.3) diff-lcs (1.5.0) docile (1.4.0) diff --git a/gemfiles/jruby_9.3_activesupport.gemfile.lock b/gemfiles/jruby_9.3_activesupport.gemfile.lock index 1de9fae83d1..cd456765ecb 100644 --- a/gemfiles/jruby_9.3_activesupport.gemfile.lock +++ b/gemfiles/jruby_9.3_activesupport.gemfile.lock @@ -12,7 +12,6 @@ PATH remote: .. specs: ddtrace (1.18.0) - datadog-ci (~> 0.5.0) debase-ruby_core_source (= 3.2.3) libdatadog (~> 5.0.0.1.0) libddwaf (~> 1.14.0.0.0) @@ -67,8 +66,6 @@ GEM rexml crass (1.0.6) cri (2.15.11) - datadog-ci (0.5.0) - msgpack debase-ruby_core_source (3.2.3) diff-lcs (1.5.0) digest-crc (0.6.5) diff --git a/gemfiles/jruby_9.3_aws.gemfile.lock b/gemfiles/jruby_9.3_aws.gemfile.lock index 40737bb0ed0..9fdf2581710 100644 --- a/gemfiles/jruby_9.3_aws.gemfile.lock +++ b/gemfiles/jruby_9.3_aws.gemfile.lock @@ -12,7 +12,6 @@ PATH remote: .. specs: ddtrace (1.18.0) - datadog-ci (~> 0.5.0) debase-ruby_core_source (= 3.2.3) libdatadog (~> 5.0.0.1.0) libddwaf (~> 1.14.0.0.0) @@ -1459,8 +1458,6 @@ GEM crack (0.4.5) rexml cri (2.15.11) - datadog-ci (0.5.0) - msgpack debase-ruby_core_source (3.2.3) diff-lcs (1.5.0) docile (1.4.0) diff --git a/gemfiles/jruby_9.3_contrib.gemfile.lock b/gemfiles/jruby_9.3_contrib.gemfile.lock index 3a4932a6878..ef9bc8243f2 100644 --- a/gemfiles/jruby_9.3_contrib.gemfile.lock +++ b/gemfiles/jruby_9.3_contrib.gemfile.lock @@ -12,7 +12,6 @@ PATH remote: .. specs: ddtrace (1.18.0) - datadog-ci (~> 0.5.0) debase-ruby_core_source (= 3.2.3) libdatadog (~> 5.0.0.1.0) libddwaf (~> 1.14.0.0.0) @@ -45,8 +44,6 @@ GEM rexml cri (2.15.11) dalli (3.2.3) - datadog-ci (0.5.0) - msgpack debase-ruby_core_source (3.2.3) diff-lcs (1.5.0) docile (1.4.0) diff --git a/gemfiles/jruby_9.3_contrib_old.gemfile.lock b/gemfiles/jruby_9.3_contrib_old.gemfile.lock index f6e771f5a08..0e221a5dc6b 100644 --- a/gemfiles/jruby_9.3_contrib_old.gemfile.lock +++ b/gemfiles/jruby_9.3_contrib_old.gemfile.lock @@ -12,7 +12,6 @@ PATH remote: .. specs: ddtrace (1.18.0) - datadog-ci (~> 0.5.0) debase-ruby_core_source (= 3.2.3) libdatadog (~> 5.0.0.1.0) libddwaf (~> 1.14.0.0.0) @@ -39,8 +38,6 @@ GEM rexml cri (2.15.11) dalli (2.7.11) - datadog-ci (0.5.0) - msgpack debase-ruby_core_source (3.2.3) diff-lcs (1.5.0) docile (1.4.0) diff --git a/gemfiles/jruby_9.3_core_old.gemfile.lock b/gemfiles/jruby_9.3_core_old.gemfile.lock index bc444493193..95a322bfc1e 100644 --- a/gemfiles/jruby_9.3_core_old.gemfile.lock +++ b/gemfiles/jruby_9.3_core_old.gemfile.lock @@ -12,7 +12,6 @@ PATH remote: .. specs: ddtrace (1.18.0) - datadog-ci (~> 0.5.0) debase-ruby_core_source (= 3.2.3) libdatadog (~> 5.0.0.1.0) libddwaf (~> 1.14.0.0.0) @@ -38,8 +37,6 @@ GEM crack (0.4.5) rexml cri (2.15.11) - datadog-ci (0.5.0) - msgpack debase-ruby_core_source (3.2.3) diff-lcs (1.5.0) docile (1.4.0) diff --git a/gemfiles/jruby_9.3_elasticsearch_7.gemfile.lock b/gemfiles/jruby_9.3_elasticsearch_7.gemfile.lock index a03f948227a..fb69015e11b 100644 --- a/gemfiles/jruby_9.3_elasticsearch_7.gemfile.lock +++ b/gemfiles/jruby_9.3_elasticsearch_7.gemfile.lock @@ -12,7 +12,6 @@ PATH remote: .. specs: ddtrace (1.18.0) - datadog-ci (~> 0.5.0) debase-ruby_core_source (= 3.2.3) libdatadog (~> 5.0.0.1.0) libddwaf (~> 1.14.0.0.0) @@ -39,8 +38,6 @@ GEM crack (0.4.5) rexml cri (2.15.11) - datadog-ci (0.5.0) - msgpack debase-ruby_core_source (3.2.3) diff-lcs (1.5.0) docile (1.4.0) diff --git a/gemfiles/jruby_9.3_elasticsearch_8.gemfile.lock b/gemfiles/jruby_9.3_elasticsearch_8.gemfile.lock index 817cbcfa4c2..0bc1b68ffc3 100644 --- a/gemfiles/jruby_9.3_elasticsearch_8.gemfile.lock +++ b/gemfiles/jruby_9.3_elasticsearch_8.gemfile.lock @@ -12,7 +12,6 @@ PATH remote: .. specs: ddtrace (1.18.0) - datadog-ci (~> 0.5.0) debase-ruby_core_source (= 3.2.3) libdatadog (~> 5.0.0.1.0) libddwaf (~> 1.14.0.0.0) @@ -40,8 +39,6 @@ GEM crack (0.4.5) rexml cri (2.15.11) - datadog-ci (0.5.0) - msgpack debase-ruby_core_source (3.2.3) diff-lcs (1.5.0) docile (1.4.0) diff --git a/gemfiles/jruby_9.3_hanami_1.gemfile.lock b/gemfiles/jruby_9.3_hanami_1.gemfile.lock index 90e5ea76d60..2c423cb2ea1 100644 --- a/gemfiles/jruby_9.3_hanami_1.gemfile.lock +++ b/gemfiles/jruby_9.3_hanami_1.gemfile.lock @@ -12,7 +12,6 @@ PATH remote: .. specs: ddtrace (1.18.0) - datadog-ci (~> 0.5.0) debase-ruby_core_source (= 3.2.3) libdatadog (~> 5.0.0.1.0) libddwaf (~> 1.14.0.0.0) @@ -38,8 +37,6 @@ GEM crack (0.4.5) rexml cri (2.15.11) - datadog-ci (0.5.0) - msgpack date (3.3.3-java) debase-ruby_core_source (3.2.3) diff-lcs (1.5.0) diff --git a/gemfiles/jruby_9.3_http.gemfile.lock b/gemfiles/jruby_9.3_http.gemfile.lock index 8d689ca06be..5cb4aeb9ce6 100644 --- a/gemfiles/jruby_9.3_http.gemfile.lock +++ b/gemfiles/jruby_9.3_http.gemfile.lock @@ -12,7 +12,6 @@ PATH remote: .. specs: ddtrace (1.18.0) - datadog-ci (~> 0.5.0) debase-ruby_core_source (= 3.2.3) libdatadog (~> 5.0.0.1.0) libddwaf (~> 1.14.0.0.0) @@ -38,8 +37,6 @@ GEM crack (0.4.5) rexml cri (2.15.11) - datadog-ci (0.5.0) - msgpack debase-ruby_core_source (3.2.3) diff-lcs (1.5.0) docile (1.4.0) diff --git a/gemfiles/jruby_9.3_opensearch_2.gemfile.lock b/gemfiles/jruby_9.3_opensearch_2.gemfile.lock index e787d5936d3..ca71c96efe5 100644 --- a/gemfiles/jruby_9.3_opensearch_2.gemfile.lock +++ b/gemfiles/jruby_9.3_opensearch_2.gemfile.lock @@ -12,7 +12,6 @@ PATH remote: .. specs: ddtrace (1.18.0) - datadog-ci (~> 0.5.0) debase-ruby_core_source (= 3.2.3) libdatadog (~> 5.0.0.1.0) libddwaf (~> 1.14.0.0.0) @@ -40,8 +39,6 @@ GEM crack (0.4.5) rexml cri (2.15.11) - datadog-ci (0.5.0) - msgpack debase-ruby_core_source (3.2.3) diff-lcs (1.5.0) docile (1.4.0) diff --git a/gemfiles/jruby_9.3_opensearch_3.gemfile.lock b/gemfiles/jruby_9.3_opensearch_3.gemfile.lock index bf583cd7712..9d4c4c38e82 100644 --- a/gemfiles/jruby_9.3_opensearch_3.gemfile.lock +++ b/gemfiles/jruby_9.3_opensearch_3.gemfile.lock @@ -12,7 +12,6 @@ PATH remote: .. specs: ddtrace (1.18.0) - datadog-ci (~> 0.5.0) debase-ruby_core_source (= 3.2.3) libdatadog (~> 5.0.0.1.0) libddwaf (~> 1.14.0.0.0) @@ -40,8 +39,6 @@ GEM crack (0.4.5) rexml cri (2.15.11) - datadog-ci (0.5.0) - msgpack debase-ruby_core_source (3.2.3) diff-lcs (1.5.0) docile (1.4.0) diff --git a/gemfiles/jruby_9.3_opentracing.gemfile.lock b/gemfiles/jruby_9.3_opentracing.gemfile.lock index 4a6382a7991..d55ff0fc9ad 100644 --- a/gemfiles/jruby_9.3_opentracing.gemfile.lock +++ b/gemfiles/jruby_9.3_opentracing.gemfile.lock @@ -12,7 +12,6 @@ PATH remote: .. specs: ddtrace (1.18.0) - datadog-ci (~> 0.5.0) debase-ruby_core_source (= 3.2.3) libdatadog (~> 5.0.0.1.0) libddwaf (~> 1.14.0.0.0) @@ -39,8 +38,6 @@ GEM crack (0.4.5) rexml cri (2.15.11) - datadog-ci (0.5.0) - msgpack debase-ruby_core_source (3.2.3) diff-lcs (1.5.0) docile (1.4.0) diff --git a/gemfiles/jruby_9.3_rack_1.gemfile.lock b/gemfiles/jruby_9.3_rack_1.gemfile.lock index c07efd29c63..d7f70ad31d7 100644 --- a/gemfiles/jruby_9.3_rack_1.gemfile.lock +++ b/gemfiles/jruby_9.3_rack_1.gemfile.lock @@ -12,7 +12,6 @@ PATH remote: .. specs: ddtrace (1.18.0) - datadog-ci (~> 0.5.0) debase-ruby_core_source (= 3.2.3) libdatadog (~> 5.0.0.1.0) libddwaf (~> 1.14.0.0.0) @@ -38,8 +37,6 @@ GEM crack (0.4.5) rexml cri (2.15.11) - datadog-ci (0.5.0) - msgpack debase-ruby_core_source (3.2.3) diff-lcs (1.5.0) docile (1.4.0) diff --git a/gemfiles/jruby_9.3_rack_2.gemfile.lock b/gemfiles/jruby_9.3_rack_2.gemfile.lock index feb1de651f7..db40d520db7 100644 --- a/gemfiles/jruby_9.3_rack_2.gemfile.lock +++ b/gemfiles/jruby_9.3_rack_2.gemfile.lock @@ -12,7 +12,6 @@ PATH remote: .. specs: ddtrace (1.18.0) - datadog-ci (~> 0.5.0) debase-ruby_core_source (= 3.2.3) libdatadog (~> 5.0.0.1.0) libddwaf (~> 1.14.0.0.0) @@ -38,8 +37,6 @@ GEM crack (0.4.5) rexml cri (2.15.11) - datadog-ci (0.5.0) - msgpack debase-ruby_core_source (3.2.3) diff-lcs (1.5.0) docile (1.4.0) diff --git a/gemfiles/jruby_9.3_rack_3.gemfile.lock b/gemfiles/jruby_9.3_rack_3.gemfile.lock index 16ecfae83a4..4b88973f32a 100644 --- a/gemfiles/jruby_9.3_rack_3.gemfile.lock +++ b/gemfiles/jruby_9.3_rack_3.gemfile.lock @@ -12,7 +12,6 @@ PATH remote: .. specs: ddtrace (1.18.0) - datadog-ci (~> 0.5.0) debase-ruby_core_source (= 3.2.3) libdatadog (~> 5.0.0.1.0) libddwaf (~> 1.14.0.0.0) @@ -38,8 +37,6 @@ GEM crack (0.4.5) rexml cri (2.15.11) - datadog-ci (0.5.0) - msgpack debase-ruby_core_source (3.2.3) diff-lcs (1.5.0) docile (1.4.0) diff --git a/gemfiles/jruby_9.3_rails5_mysql2.gemfile.lock b/gemfiles/jruby_9.3_rails5_mysql2.gemfile.lock index f7a898e067f..a303bfbd2c6 100644 --- a/gemfiles/jruby_9.3_rails5_mysql2.gemfile.lock +++ b/gemfiles/jruby_9.3_rails5_mysql2.gemfile.lock @@ -12,7 +12,6 @@ PATH remote: .. specs: ddtrace (1.18.0) - datadog-ci (~> 0.5.0) debase-ruby_core_source (= 3.2.3) libdatadog (~> 5.0.0.1.0) libddwaf (~> 1.14.0.0.0) @@ -86,8 +85,6 @@ GEM rexml crass (1.0.6) cri (2.15.11) - datadog-ci (0.5.0) - msgpack date (3.3.3-java) debase-ruby_core_source (3.2.3) diff-lcs (1.5.0) diff --git a/gemfiles/jruby_9.3_rails5_postgres.gemfile.lock b/gemfiles/jruby_9.3_rails5_postgres.gemfile.lock index d8cd9a9dfef..6f0d02b2487 100644 --- a/gemfiles/jruby_9.3_rails5_postgres.gemfile.lock +++ b/gemfiles/jruby_9.3_rails5_postgres.gemfile.lock @@ -12,7 +12,6 @@ PATH remote: .. specs: ddtrace (1.18.0) - datadog-ci (~> 0.5.0) debase-ruby_core_source (= 3.2.3) libdatadog (~> 5.0.0.1.0) libddwaf (~> 1.14.0.0.0) @@ -86,8 +85,6 @@ GEM rexml crass (1.0.6) cri (2.15.11) - datadog-ci (0.5.0) - msgpack date (3.3.3-java) debase-ruby_core_source (3.2.3) diff-lcs (1.5.0) diff --git a/gemfiles/jruby_9.3_rails5_postgres_redis.gemfile.lock b/gemfiles/jruby_9.3_rails5_postgres_redis.gemfile.lock index 4a5906d43ac..8b949c50630 100644 --- a/gemfiles/jruby_9.3_rails5_postgres_redis.gemfile.lock +++ b/gemfiles/jruby_9.3_rails5_postgres_redis.gemfile.lock @@ -12,7 +12,6 @@ PATH remote: .. specs: ddtrace (1.18.0) - datadog-ci (~> 0.5.0) debase-ruby_core_source (= 3.2.3) libdatadog (~> 5.0.0.1.0) libddwaf (~> 1.14.0.0.0) @@ -86,8 +85,6 @@ GEM rexml crass (1.0.6) cri (2.15.11) - datadog-ci (0.5.0) - msgpack date (3.3.3-java) debase-ruby_core_source (3.2.3) diff-lcs (1.5.0) diff --git a/gemfiles/jruby_9.3_rails5_postgres_redis_activesupport.gemfile.lock b/gemfiles/jruby_9.3_rails5_postgres_redis_activesupport.gemfile.lock index 873d1b2d114..ef3afb4f3fe 100644 --- a/gemfiles/jruby_9.3_rails5_postgres_redis_activesupport.gemfile.lock +++ b/gemfiles/jruby_9.3_rails5_postgres_redis_activesupport.gemfile.lock @@ -12,7 +12,6 @@ PATH remote: .. specs: ddtrace (1.18.0) - datadog-ci (~> 0.5.0) debase-ruby_core_source (= 3.2.3) libdatadog (~> 5.0.0.1.0) libddwaf (~> 1.14.0.0.0) @@ -86,8 +85,6 @@ GEM rexml crass (1.0.6) cri (2.15.11) - datadog-ci (0.5.0) - msgpack date (3.3.3-java) debase-ruby_core_source (3.2.3) diff-lcs (1.5.0) diff --git a/gemfiles/jruby_9.3_rails5_postgres_sidekiq.gemfile.lock b/gemfiles/jruby_9.3_rails5_postgres_sidekiq.gemfile.lock index 5a7d502e6ea..676ff84660a 100644 --- a/gemfiles/jruby_9.3_rails5_postgres_sidekiq.gemfile.lock +++ b/gemfiles/jruby_9.3_rails5_postgres_sidekiq.gemfile.lock @@ -12,7 +12,6 @@ PATH remote: .. specs: ddtrace (1.18.0) - datadog-ci (~> 0.5.0) debase-ruby_core_source (= 3.2.3) libdatadog (~> 5.0.0.1.0) libddwaf (~> 1.14.0.0.0) @@ -87,8 +86,6 @@ GEM rexml crass (1.0.6) cri (2.15.11) - datadog-ci (0.5.0) - msgpack date (3.3.3-java) debase-ruby_core_source (3.2.3) diff-lcs (1.5.0) diff --git a/gemfiles/jruby_9.3_rails5_semantic_logger.gemfile.lock b/gemfiles/jruby_9.3_rails5_semantic_logger.gemfile.lock index 84c1599d255..8d6f8821c8c 100644 --- a/gemfiles/jruby_9.3_rails5_semantic_logger.gemfile.lock +++ b/gemfiles/jruby_9.3_rails5_semantic_logger.gemfile.lock @@ -12,7 +12,6 @@ PATH remote: .. specs: ddtrace (1.18.0) - datadog-ci (~> 0.5.0) debase-ruby_core_source (= 3.2.3) libdatadog (~> 5.0.0.1.0) libddwaf (~> 1.14.0.0.0) @@ -86,8 +85,6 @@ GEM rexml crass (1.0.6) cri (2.15.11) - datadog-ci (0.5.0) - msgpack date (3.3.3-java) debase-ruby_core_source (3.2.3) diff-lcs (1.5.0) diff --git a/gemfiles/jruby_9.3_rails61_mysql2.gemfile.lock b/gemfiles/jruby_9.3_rails61_mysql2.gemfile.lock index a44e8d4a5b6..8c525196555 100644 --- a/gemfiles/jruby_9.3_rails61_mysql2.gemfile.lock +++ b/gemfiles/jruby_9.3_rails61_mysql2.gemfile.lock @@ -12,7 +12,6 @@ PATH remote: .. specs: ddtrace (1.18.0) - datadog-ci (~> 0.5.0) debase-ruby_core_source (= 3.2.3) libdatadog (~> 5.0.0.1.0) libddwaf (~> 1.14.0.0.0) @@ -103,8 +102,6 @@ GEM rexml crass (1.0.6) cri (2.15.11) - datadog-ci (0.5.0) - msgpack date (3.3.3-java) debase-ruby_core_source (3.2.3) diff-lcs (1.5.0) diff --git a/gemfiles/jruby_9.3_rails61_postgres.gemfile.lock b/gemfiles/jruby_9.3_rails61_postgres.gemfile.lock index 369c5f69d33..862dc91ad43 100644 --- a/gemfiles/jruby_9.3_rails61_postgres.gemfile.lock +++ b/gemfiles/jruby_9.3_rails61_postgres.gemfile.lock @@ -12,7 +12,6 @@ PATH remote: .. specs: ddtrace (1.18.0) - datadog-ci (~> 0.5.0) debase-ruby_core_source (= 3.2.3) libdatadog (~> 5.0.0.1.0) libddwaf (~> 1.14.0.0.0) @@ -103,8 +102,6 @@ GEM rexml crass (1.0.6) cri (2.15.11) - datadog-ci (0.5.0) - msgpack date (3.3.3-java) debase-ruby_core_source (3.2.3) diff-lcs (1.5.0) diff --git a/gemfiles/jruby_9.3_rails61_postgres_redis.gemfile.lock b/gemfiles/jruby_9.3_rails61_postgres_redis.gemfile.lock index de4e0474723..cecbb0a8940 100644 --- a/gemfiles/jruby_9.3_rails61_postgres_redis.gemfile.lock +++ b/gemfiles/jruby_9.3_rails61_postgres_redis.gemfile.lock @@ -12,7 +12,6 @@ PATH remote: .. specs: ddtrace (1.18.0) - datadog-ci (~> 0.5.0) debase-ruby_core_source (= 3.2.3) libdatadog (~> 5.0.0.1.0) libddwaf (~> 1.14.0.0.0) @@ -103,8 +102,6 @@ GEM rexml crass (1.0.6) cri (2.15.11) - datadog-ci (0.5.0) - msgpack date (3.3.3-java) debase-ruby_core_source (3.2.3) diff-lcs (1.5.0) diff --git a/gemfiles/jruby_9.3_rails61_postgres_sidekiq.gemfile.lock b/gemfiles/jruby_9.3_rails61_postgres_sidekiq.gemfile.lock index 92ce29cf574..875e4630e04 100644 --- a/gemfiles/jruby_9.3_rails61_postgres_sidekiq.gemfile.lock +++ b/gemfiles/jruby_9.3_rails61_postgres_sidekiq.gemfile.lock @@ -12,7 +12,6 @@ PATH remote: .. specs: ddtrace (1.18.0) - datadog-ci (~> 0.5.0) debase-ruby_core_source (= 3.2.3) libdatadog (~> 5.0.0.1.0) libddwaf (~> 1.14.0.0.0) @@ -104,8 +103,6 @@ GEM rexml crass (1.0.6) cri (2.15.11) - datadog-ci (0.5.0) - msgpack date (3.3.3-java) debase-ruby_core_source (3.2.3) diff-lcs (1.5.0) diff --git a/gemfiles/jruby_9.3_rails61_semantic_logger.gemfile.lock b/gemfiles/jruby_9.3_rails61_semantic_logger.gemfile.lock index 810c1c0783d..2480c82e7bd 100644 --- a/gemfiles/jruby_9.3_rails61_semantic_logger.gemfile.lock +++ b/gemfiles/jruby_9.3_rails61_semantic_logger.gemfile.lock @@ -12,7 +12,6 @@ PATH remote: .. specs: ddtrace (1.18.0) - datadog-ci (~> 0.5.0) debase-ruby_core_source (= 3.2.3) libdatadog (~> 5.0.0.1.0) libddwaf (~> 1.14.0.0.0) @@ -103,8 +102,6 @@ GEM rexml crass (1.0.6) cri (2.15.11) - datadog-ci (0.5.0) - msgpack date (3.3.3-java) debase-ruby_core_source (3.2.3) diff-lcs (1.5.0) diff --git a/gemfiles/jruby_9.3_rails6_mysql2.gemfile.lock b/gemfiles/jruby_9.3_rails6_mysql2.gemfile.lock index 7582a397cfa..2ea2b52b8eb 100644 --- a/gemfiles/jruby_9.3_rails6_mysql2.gemfile.lock +++ b/gemfiles/jruby_9.3_rails6_mysql2.gemfile.lock @@ -12,7 +12,6 @@ PATH remote: .. specs: ddtrace (1.18.0) - datadog-ci (~> 0.5.0) debase-ruby_core_source (= 3.2.3) libdatadog (~> 5.0.0.1.0) libddwaf (~> 1.14.0.0.0) @@ -99,8 +98,6 @@ GEM rexml crass (1.0.6) cri (2.15.11) - datadog-ci (0.5.0) - msgpack date (3.3.3-java) debase-ruby_core_source (3.2.3) diff-lcs (1.5.0) diff --git a/gemfiles/jruby_9.3_rails6_postgres.gemfile.lock b/gemfiles/jruby_9.3_rails6_postgres.gemfile.lock index 7bab0de6865..338b6d41c50 100644 --- a/gemfiles/jruby_9.3_rails6_postgres.gemfile.lock +++ b/gemfiles/jruby_9.3_rails6_postgres.gemfile.lock @@ -12,7 +12,6 @@ PATH remote: .. specs: ddtrace (1.18.0) - datadog-ci (~> 0.5.0) debase-ruby_core_source (= 3.2.3) libdatadog (~> 5.0.0.1.0) libddwaf (~> 1.14.0.0.0) @@ -99,8 +98,6 @@ GEM rexml crass (1.0.6) cri (2.15.11) - datadog-ci (0.5.0) - msgpack date (3.3.3-java) debase-ruby_core_source (3.2.3) diff-lcs (1.5.0) diff --git a/gemfiles/jruby_9.3_rails6_postgres_redis.gemfile.lock b/gemfiles/jruby_9.3_rails6_postgres_redis.gemfile.lock index 52c8434a58a..b7459c27a8d 100644 --- a/gemfiles/jruby_9.3_rails6_postgres_redis.gemfile.lock +++ b/gemfiles/jruby_9.3_rails6_postgres_redis.gemfile.lock @@ -12,7 +12,6 @@ PATH remote: .. specs: ddtrace (1.18.0) - datadog-ci (~> 0.5.0) debase-ruby_core_source (= 3.2.3) libdatadog (~> 5.0.0.1.0) libddwaf (~> 1.14.0.0.0) @@ -99,8 +98,6 @@ GEM rexml crass (1.0.6) cri (2.15.11) - datadog-ci (0.5.0) - msgpack date (3.3.3-java) debase-ruby_core_source (3.2.3) diff-lcs (1.5.0) diff --git a/gemfiles/jruby_9.3_rails6_postgres_redis_activesupport.gemfile.lock b/gemfiles/jruby_9.3_rails6_postgres_redis_activesupport.gemfile.lock index 4d941c8a317..4f6fdd0022a 100644 --- a/gemfiles/jruby_9.3_rails6_postgres_redis_activesupport.gemfile.lock +++ b/gemfiles/jruby_9.3_rails6_postgres_redis_activesupport.gemfile.lock @@ -12,7 +12,6 @@ PATH remote: .. specs: ddtrace (1.18.0) - datadog-ci (~> 0.5.0) debase-ruby_core_source (= 3.2.3) libdatadog (~> 5.0.0.1.0) libddwaf (~> 1.14.0.0.0) @@ -99,8 +98,6 @@ GEM rexml crass (1.0.6) cri (2.15.11) - datadog-ci (0.5.0) - msgpack date (3.3.3-java) debase-ruby_core_source (3.2.3) diff-lcs (1.5.0) diff --git a/gemfiles/jruby_9.3_rails6_postgres_sidekiq.gemfile.lock b/gemfiles/jruby_9.3_rails6_postgres_sidekiq.gemfile.lock index fba18156adc..89970c4c23b 100644 --- a/gemfiles/jruby_9.3_rails6_postgres_sidekiq.gemfile.lock +++ b/gemfiles/jruby_9.3_rails6_postgres_sidekiq.gemfile.lock @@ -12,7 +12,6 @@ PATH remote: .. specs: ddtrace (1.18.0) - datadog-ci (~> 0.5.0) debase-ruby_core_source (= 3.2.3) libdatadog (~> 5.0.0.1.0) libddwaf (~> 1.14.0.0.0) @@ -100,8 +99,6 @@ GEM rexml crass (1.0.6) cri (2.15.11) - datadog-ci (0.5.0) - msgpack date (3.3.3-java) debase-ruby_core_source (3.2.3) diff-lcs (1.5.0) diff --git a/gemfiles/jruby_9.3_rails6_semantic_logger.gemfile.lock b/gemfiles/jruby_9.3_rails6_semantic_logger.gemfile.lock index 363fd157c85..fb8a64cf7f9 100644 --- a/gemfiles/jruby_9.3_rails6_semantic_logger.gemfile.lock +++ b/gemfiles/jruby_9.3_rails6_semantic_logger.gemfile.lock @@ -12,7 +12,6 @@ PATH remote: .. specs: ddtrace (1.18.0) - datadog-ci (~> 0.5.0) debase-ruby_core_source (= 3.2.3) libdatadog (~> 5.0.0.1.0) libddwaf (~> 1.14.0.0.0) @@ -99,8 +98,6 @@ GEM rexml crass (1.0.6) cri (2.15.11) - datadog-ci (0.5.0) - msgpack date (3.3.3-java) debase-ruby_core_source (3.2.3) diff-lcs (1.5.0) diff --git a/gemfiles/jruby_9.3_redis_3.gemfile.lock b/gemfiles/jruby_9.3_redis_3.gemfile.lock index 5325d6a9e58..b0adf84ee4d 100644 --- a/gemfiles/jruby_9.3_redis_3.gemfile.lock +++ b/gemfiles/jruby_9.3_redis_3.gemfile.lock @@ -12,7 +12,6 @@ PATH remote: .. specs: ddtrace (1.18.0) - datadog-ci (~> 0.5.0) debase-ruby_core_source (= 3.2.3) libdatadog (~> 5.0.0.1.0) libddwaf (~> 1.14.0.0.0) @@ -38,8 +37,6 @@ GEM crack (0.4.5) rexml cri (2.15.11) - datadog-ci (0.5.0) - msgpack debase-ruby_core_source (3.2.3) diff-lcs (1.5.0) docile (1.4.0) diff --git a/gemfiles/jruby_9.3_redis_4.gemfile.lock b/gemfiles/jruby_9.3_redis_4.gemfile.lock index 23cb04b8296..7629b382400 100644 --- a/gemfiles/jruby_9.3_redis_4.gemfile.lock +++ b/gemfiles/jruby_9.3_redis_4.gemfile.lock @@ -12,7 +12,6 @@ PATH remote: .. specs: ddtrace (1.18.0) - datadog-ci (~> 0.5.0) debase-ruby_core_source (= 3.2.3) libdatadog (~> 5.0.0.1.0) libddwaf (~> 1.14.0.0.0) @@ -38,8 +37,6 @@ GEM crack (0.4.5) rexml cri (2.15.11) - datadog-ci (0.5.0) - msgpack debase-ruby_core_source (3.2.3) diff-lcs (1.5.0) docile (1.4.0) diff --git a/gemfiles/jruby_9.3_redis_5.gemfile.lock b/gemfiles/jruby_9.3_redis_5.gemfile.lock index c05c193f0af..061871c246f 100644 --- a/gemfiles/jruby_9.3_redis_5.gemfile.lock +++ b/gemfiles/jruby_9.3_redis_5.gemfile.lock @@ -12,7 +12,6 @@ PATH remote: .. specs: ddtrace (1.18.0) - datadog-ci (~> 0.5.0) debase-ruby_core_source (= 3.2.3) libdatadog (~> 5.0.0.1.0) libddwaf (~> 1.14.0.0.0) @@ -39,8 +38,6 @@ GEM crack (0.4.5) rexml cri (2.15.11) - datadog-ci (0.5.0) - msgpack debase-ruby_core_source (3.2.3) diff-lcs (1.5.0) docile (1.4.0) diff --git a/gemfiles/jruby_9.3_relational_db.gemfile.lock b/gemfiles/jruby_9.3_relational_db.gemfile.lock index 95d3bbea2cd..da9e1ce90c3 100644 --- a/gemfiles/jruby_9.3_relational_db.gemfile.lock +++ b/gemfiles/jruby_9.3_relational_db.gemfile.lock @@ -12,7 +12,6 @@ PATH remote: .. specs: ddtrace (1.18.0) - datadog-ci (~> 0.5.0) debase-ruby_core_source (= 3.2.3) libdatadog (~> 5.0.0.1.0) libddwaf (~> 1.14.0.0.0) @@ -57,8 +56,6 @@ GEM crack (0.4.5) rexml cri (2.15.11) - datadog-ci (0.5.0) - msgpack debase-ruby_core_source (3.2.3) delayed_job (4.1.11) activesupport (>= 3.0, < 8.0) diff --git a/gemfiles/jruby_9.3_resque2_redis3.gemfile.lock b/gemfiles/jruby_9.3_resque2_redis3.gemfile.lock index f5a55964834..aa4b61f1a2e 100644 --- a/gemfiles/jruby_9.3_resque2_redis3.gemfile.lock +++ b/gemfiles/jruby_9.3_resque2_redis3.gemfile.lock @@ -12,7 +12,6 @@ PATH remote: .. specs: ddtrace (1.18.0) - datadog-ci (~> 0.5.0) debase-ruby_core_source (= 3.2.3) libdatadog (~> 5.0.0.1.0) libddwaf (~> 1.14.0.0.0) @@ -38,8 +37,6 @@ GEM crack (0.4.5) rexml cri (2.15.11) - datadog-ci (0.5.0) - msgpack debase-ruby_core_source (3.2.3) diff-lcs (1.5.0) docile (1.4.0) diff --git a/gemfiles/jruby_9.3_resque2_redis4.gemfile.lock b/gemfiles/jruby_9.3_resque2_redis4.gemfile.lock index 97eb28d75b2..849b83a87ac 100644 --- a/gemfiles/jruby_9.3_resque2_redis4.gemfile.lock +++ b/gemfiles/jruby_9.3_resque2_redis4.gemfile.lock @@ -12,7 +12,6 @@ PATH remote: .. specs: ddtrace (1.18.0) - datadog-ci (~> 0.5.0) debase-ruby_core_source (= 3.2.3) libdatadog (~> 5.0.0.1.0) libddwaf (~> 1.14.0.0.0) @@ -38,8 +37,6 @@ GEM crack (0.4.5) rexml cri (2.15.11) - datadog-ci (0.5.0) - msgpack debase-ruby_core_source (3.2.3) diff-lcs (1.5.0) docile (1.4.0) diff --git a/gemfiles/jruby_9.3_sinatra.gemfile.lock b/gemfiles/jruby_9.3_sinatra.gemfile.lock index a96c21cd966..ce9281245c2 100644 --- a/gemfiles/jruby_9.3_sinatra.gemfile.lock +++ b/gemfiles/jruby_9.3_sinatra.gemfile.lock @@ -12,7 +12,6 @@ PATH remote: .. specs: ddtrace (1.18.0) - datadog-ci (~> 0.5.0) debase-ruby_core_source (= 3.2.3) libdatadog (~> 5.0.0.1.0) libddwaf (~> 1.14.0.0.0) @@ -38,8 +37,6 @@ GEM crack (0.4.5) rexml cri (2.15.11) - datadog-ci (0.5.0) - msgpack debase-ruby_core_source (3.2.3) diff-lcs (1.5.0) docile (1.4.0) diff --git a/gemfiles/jruby_9.4_activesupport.gemfile.lock b/gemfiles/jruby_9.4_activesupport.gemfile.lock index d3c2e803922..5dc0bb3d749 100644 --- a/gemfiles/jruby_9.4_activesupport.gemfile.lock +++ b/gemfiles/jruby_9.4_activesupport.gemfile.lock @@ -12,7 +12,6 @@ PATH remote: .. specs: ddtrace (1.18.0) - datadog-ci (~> 0.5.0) debase-ruby_core_source (= 3.2.3) libdatadog (~> 5.0.0.1.0) libddwaf (~> 1.14.0.0.0) @@ -66,8 +65,6 @@ GEM rexml crass (1.0.6) cri (2.15.11) - datadog-ci (0.5.0) - msgpack debase-ruby_core_source (3.2.3) diff-lcs (1.5.0) digest-crc (0.6.5) diff --git a/gemfiles/jruby_9.4_aws.gemfile.lock b/gemfiles/jruby_9.4_aws.gemfile.lock index 50261b05e12..687b2b1d3d0 100644 --- a/gemfiles/jruby_9.4_aws.gemfile.lock +++ b/gemfiles/jruby_9.4_aws.gemfile.lock @@ -12,7 +12,6 @@ PATH remote: .. specs: ddtrace (1.18.0) - datadog-ci (~> 0.5.0) debase-ruby_core_source (= 3.2.3) libdatadog (~> 5.0.0.1.0) libddwaf (~> 1.14.0.0.0) @@ -1459,8 +1458,6 @@ GEM crack (0.4.5) rexml cri (2.15.11) - datadog-ci (0.5.0) - msgpack debase-ruby_core_source (3.2.3) diff-lcs (1.5.0) docile (1.4.0) diff --git a/gemfiles/jruby_9.4_contrib.gemfile.lock b/gemfiles/jruby_9.4_contrib.gemfile.lock index 2a54108d5ff..e587a532798 100644 --- a/gemfiles/jruby_9.4_contrib.gemfile.lock +++ b/gemfiles/jruby_9.4_contrib.gemfile.lock @@ -12,7 +12,6 @@ PATH remote: .. specs: ddtrace (1.18.0) - datadog-ci (~> 0.5.0) debase-ruby_core_source (= 3.2.3) libdatadog (~> 5.0.0.1.0) libddwaf (~> 1.14.0.0.0) @@ -45,8 +44,6 @@ GEM rexml cri (2.15.11) dalli (3.2.3) - datadog-ci (0.5.0) - msgpack debase-ruby_core_source (3.2.3) diff-lcs (1.5.0) docile (1.4.0) diff --git a/gemfiles/jruby_9.4_contrib_old.gemfile.lock b/gemfiles/jruby_9.4_contrib_old.gemfile.lock index 18f791957fe..3be5b427cb9 100644 --- a/gemfiles/jruby_9.4_contrib_old.gemfile.lock +++ b/gemfiles/jruby_9.4_contrib_old.gemfile.lock @@ -12,7 +12,6 @@ PATH remote: .. specs: ddtrace (1.18.0) - datadog-ci (~> 0.5.0) debase-ruby_core_source (= 3.2.3) libdatadog (~> 5.0.0.1.0) libddwaf (~> 1.14.0.0.0) @@ -39,8 +38,6 @@ GEM rexml cri (2.15.11) dalli (2.7.11) - datadog-ci (0.5.0) - msgpack debase-ruby_core_source (3.2.3) diff-lcs (1.5.0) docile (1.4.0) diff --git a/gemfiles/jruby_9.4_core_old.gemfile.lock b/gemfiles/jruby_9.4_core_old.gemfile.lock index 744500418f2..7ad1605b888 100644 --- a/gemfiles/jruby_9.4_core_old.gemfile.lock +++ b/gemfiles/jruby_9.4_core_old.gemfile.lock @@ -12,7 +12,6 @@ PATH remote: .. specs: ddtrace (1.18.0) - datadog-ci (~> 0.5.0) debase-ruby_core_source (= 3.2.3) libdatadog (~> 5.0.0.1.0) libddwaf (~> 1.14.0.0.0) @@ -38,8 +37,6 @@ GEM crack (0.4.5) rexml cri (2.15.11) - datadog-ci (0.5.0) - msgpack debase-ruby_core_source (3.2.3) diff-lcs (1.5.0) docile (1.4.0) diff --git a/gemfiles/jruby_9.4_elasticsearch_7.gemfile.lock b/gemfiles/jruby_9.4_elasticsearch_7.gemfile.lock index 982d89b75db..618afd0445c 100644 --- a/gemfiles/jruby_9.4_elasticsearch_7.gemfile.lock +++ b/gemfiles/jruby_9.4_elasticsearch_7.gemfile.lock @@ -12,7 +12,6 @@ PATH remote: .. specs: ddtrace (1.18.0) - datadog-ci (~> 0.5.0) debase-ruby_core_source (= 3.2.3) libdatadog (~> 5.0.0.1.0) libddwaf (~> 1.14.0.0.0) @@ -39,8 +38,6 @@ GEM crack (0.4.5) rexml cri (2.15.11) - datadog-ci (0.5.0) - msgpack debase-ruby_core_source (3.2.3) diff-lcs (1.5.0) docile (1.4.0) diff --git a/gemfiles/jruby_9.4_elasticsearch_8.gemfile.lock b/gemfiles/jruby_9.4_elasticsearch_8.gemfile.lock index 0f68eb19e99..447ff1ff9c1 100644 --- a/gemfiles/jruby_9.4_elasticsearch_8.gemfile.lock +++ b/gemfiles/jruby_9.4_elasticsearch_8.gemfile.lock @@ -12,7 +12,6 @@ PATH remote: .. specs: ddtrace (1.18.0) - datadog-ci (~> 0.5.0) debase-ruby_core_source (= 3.2.3) libdatadog (~> 5.0.0.1.0) libddwaf (~> 1.14.0.0.0) @@ -40,8 +39,6 @@ GEM crack (0.4.5) rexml cri (2.15.11) - datadog-ci (0.5.0) - msgpack debase-ruby_core_source (3.2.3) diff-lcs (1.5.0) docile (1.4.0) diff --git a/gemfiles/jruby_9.4_http.gemfile.lock b/gemfiles/jruby_9.4_http.gemfile.lock index 8f3a696e4a4..a18d810e0d8 100644 --- a/gemfiles/jruby_9.4_http.gemfile.lock +++ b/gemfiles/jruby_9.4_http.gemfile.lock @@ -12,7 +12,6 @@ PATH remote: .. specs: ddtrace (1.18.0) - datadog-ci (~> 0.5.0) debase-ruby_core_source (= 3.2.3) libdatadog (~> 5.0.0.1.0) libddwaf (~> 1.14.0.0.0) @@ -38,8 +37,6 @@ GEM crack (0.4.5) rexml cri (2.15.11) - datadog-ci (0.5.0) - msgpack debase-ruby_core_source (3.2.3) diff-lcs (1.5.0) docile (1.4.0) diff --git a/gemfiles/jruby_9.4_opensearch_2.gemfile.lock b/gemfiles/jruby_9.4_opensearch_2.gemfile.lock index b8e229ca85d..04472bb18dc 100644 --- a/gemfiles/jruby_9.4_opensearch_2.gemfile.lock +++ b/gemfiles/jruby_9.4_opensearch_2.gemfile.lock @@ -12,7 +12,6 @@ PATH remote: .. specs: ddtrace (1.18.0) - datadog-ci (~> 0.5.0) debase-ruby_core_source (= 3.2.3) libdatadog (~> 5.0.0.1.0) libddwaf (~> 1.14.0.0.0) @@ -40,8 +39,6 @@ GEM crack (0.4.5) rexml cri (2.15.11) - datadog-ci (0.5.0) - msgpack debase-ruby_core_source (3.2.3) diff-lcs (1.5.0) docile (1.4.0) diff --git a/gemfiles/jruby_9.4_opensearch_3.gemfile.lock b/gemfiles/jruby_9.4_opensearch_3.gemfile.lock index 1a2f9508b3f..ada2351aefd 100644 --- a/gemfiles/jruby_9.4_opensearch_3.gemfile.lock +++ b/gemfiles/jruby_9.4_opensearch_3.gemfile.lock @@ -12,7 +12,6 @@ PATH remote: .. specs: ddtrace (1.18.0) - datadog-ci (~> 0.5.0) debase-ruby_core_source (= 3.2.3) libdatadog (~> 5.0.0.1.0) libddwaf (~> 1.14.0.0.0) @@ -40,8 +39,6 @@ GEM crack (0.4.5) rexml cri (2.15.11) - datadog-ci (0.5.0) - msgpack debase-ruby_core_source (3.2.3) diff-lcs (1.5.0) docile (1.4.0) diff --git a/gemfiles/jruby_9.4_opentracing.gemfile.lock b/gemfiles/jruby_9.4_opentracing.gemfile.lock index 49dbbfe46b0..18ea3bfb30e 100644 --- a/gemfiles/jruby_9.4_opentracing.gemfile.lock +++ b/gemfiles/jruby_9.4_opentracing.gemfile.lock @@ -12,7 +12,6 @@ PATH remote: .. specs: ddtrace (1.18.0) - datadog-ci (~> 0.5.0) debase-ruby_core_source (= 3.2.3) libdatadog (~> 5.0.0.1.0) libddwaf (~> 1.14.0.0.0) @@ -39,8 +38,6 @@ GEM crack (0.4.5) rexml cri (2.15.11) - datadog-ci (0.5.0) - msgpack debase-ruby_core_source (3.2.3) diff-lcs (1.5.0) docile (1.4.0) diff --git a/gemfiles/jruby_9.4_rack_1.gemfile.lock b/gemfiles/jruby_9.4_rack_1.gemfile.lock index 3e4d7854cba..051a38f308c 100644 --- a/gemfiles/jruby_9.4_rack_1.gemfile.lock +++ b/gemfiles/jruby_9.4_rack_1.gemfile.lock @@ -12,7 +12,6 @@ PATH remote: .. specs: ddtrace (1.18.0) - datadog-ci (~> 0.5.0) debase-ruby_core_source (= 3.2.3) libdatadog (~> 5.0.0.1.0) libddwaf (~> 1.14.0.0.0) @@ -38,8 +37,6 @@ GEM crack (0.4.5) rexml cri (2.15.11) - datadog-ci (0.5.0) - msgpack debase-ruby_core_source (3.2.3) diff-lcs (1.5.0) docile (1.4.0) diff --git a/gemfiles/jruby_9.4_rack_2.gemfile.lock b/gemfiles/jruby_9.4_rack_2.gemfile.lock index d1edf928fc1..ac53840e280 100644 --- a/gemfiles/jruby_9.4_rack_2.gemfile.lock +++ b/gemfiles/jruby_9.4_rack_2.gemfile.lock @@ -12,7 +12,6 @@ PATH remote: .. specs: ddtrace (1.18.0) - datadog-ci (~> 0.5.0) debase-ruby_core_source (= 3.2.3) libdatadog (~> 5.0.0.1.0) libddwaf (~> 1.14.0.0.0) @@ -38,8 +37,6 @@ GEM crack (0.4.5) rexml cri (2.15.11) - datadog-ci (0.5.0) - msgpack debase-ruby_core_source (3.2.3) diff-lcs (1.5.0) docile (1.4.0) diff --git a/gemfiles/jruby_9.4_rack_3.gemfile.lock b/gemfiles/jruby_9.4_rack_3.gemfile.lock index e0f3f0fb290..6b92169a11f 100644 --- a/gemfiles/jruby_9.4_rack_3.gemfile.lock +++ b/gemfiles/jruby_9.4_rack_3.gemfile.lock @@ -12,7 +12,6 @@ PATH remote: .. specs: ddtrace (1.18.0) - datadog-ci (~> 0.5.0) debase-ruby_core_source (= 3.2.3) libdatadog (~> 5.0.0.1.0) libddwaf (~> 1.14.0.0.0) @@ -38,8 +37,6 @@ GEM crack (0.4.5) rexml cri (2.15.11) - datadog-ci (0.5.0) - msgpack debase-ruby_core_source (3.2.3) diff-lcs (1.5.0) docile (1.4.0) diff --git a/gemfiles/jruby_9.4_rails61_mysql2.gemfile.lock b/gemfiles/jruby_9.4_rails61_mysql2.gemfile.lock index 68d6cfe7ff6..3783910ce31 100644 --- a/gemfiles/jruby_9.4_rails61_mysql2.gemfile.lock +++ b/gemfiles/jruby_9.4_rails61_mysql2.gemfile.lock @@ -12,7 +12,6 @@ PATH remote: .. specs: ddtrace (1.18.0) - datadog-ci (~> 0.5.0) debase-ruby_core_source (= 3.2.3) libdatadog (~> 5.0.0.1.0) libddwaf (~> 1.14.0.0.0) @@ -103,8 +102,6 @@ GEM rexml crass (1.0.6) cri (2.15.11) - datadog-ci (0.5.0) - msgpack date (3.3.3-java) debase-ruby_core_source (3.2.3) diff-lcs (1.5.0) diff --git a/gemfiles/jruby_9.4_rails61_postgres.gemfile.lock b/gemfiles/jruby_9.4_rails61_postgres.gemfile.lock index d382665ffbd..c0f3647abe0 100644 --- a/gemfiles/jruby_9.4_rails61_postgres.gemfile.lock +++ b/gemfiles/jruby_9.4_rails61_postgres.gemfile.lock @@ -12,7 +12,6 @@ PATH remote: .. specs: ddtrace (1.18.0) - datadog-ci (~> 0.5.0) debase-ruby_core_source (= 3.2.3) libdatadog (~> 5.0.0.1.0) libddwaf (~> 1.14.0.0.0) @@ -103,8 +102,6 @@ GEM rexml crass (1.0.6) cri (2.15.11) - datadog-ci (0.5.0) - msgpack date (3.3.3-java) debase-ruby_core_source (3.2.3) diff-lcs (1.5.0) diff --git a/gemfiles/jruby_9.4_rails61_postgres_redis.gemfile.lock b/gemfiles/jruby_9.4_rails61_postgres_redis.gemfile.lock index 842dc924232..f6951ad932e 100644 --- a/gemfiles/jruby_9.4_rails61_postgres_redis.gemfile.lock +++ b/gemfiles/jruby_9.4_rails61_postgres_redis.gemfile.lock @@ -12,7 +12,6 @@ PATH remote: .. specs: ddtrace (1.18.0) - datadog-ci (~> 0.5.0) debase-ruby_core_source (= 3.2.3) libdatadog (~> 5.0.0.1.0) libddwaf (~> 1.14.0.0.0) @@ -103,8 +102,6 @@ GEM rexml crass (1.0.6) cri (2.15.11) - datadog-ci (0.5.0) - msgpack date (3.3.3-java) debase-ruby_core_source (3.2.3) diff-lcs (1.5.0) diff --git a/gemfiles/jruby_9.4_rails61_postgres_sidekiq.gemfile.lock b/gemfiles/jruby_9.4_rails61_postgres_sidekiq.gemfile.lock index 829e84ad5ad..6776f8e881b 100644 --- a/gemfiles/jruby_9.4_rails61_postgres_sidekiq.gemfile.lock +++ b/gemfiles/jruby_9.4_rails61_postgres_sidekiq.gemfile.lock @@ -12,7 +12,6 @@ PATH remote: .. specs: ddtrace (1.18.0) - datadog-ci (~> 0.5.0) debase-ruby_core_source (= 3.2.3) libdatadog (~> 5.0.0.1.0) libddwaf (~> 1.14.0.0.0) @@ -104,8 +103,6 @@ GEM rexml crass (1.0.6) cri (2.15.11) - datadog-ci (0.5.0) - msgpack date (3.3.3-java) debase-ruby_core_source (3.2.3) diff-lcs (1.5.0) diff --git a/gemfiles/jruby_9.4_rails61_semantic_logger.gemfile.lock b/gemfiles/jruby_9.4_rails61_semantic_logger.gemfile.lock index a29576f149c..e96bf2ee376 100644 --- a/gemfiles/jruby_9.4_rails61_semantic_logger.gemfile.lock +++ b/gemfiles/jruby_9.4_rails61_semantic_logger.gemfile.lock @@ -12,7 +12,6 @@ PATH remote: .. specs: ddtrace (1.18.0) - datadog-ci (~> 0.5.0) debase-ruby_core_source (= 3.2.3) libdatadog (~> 5.0.0.1.0) libddwaf (~> 1.14.0.0.0) @@ -103,8 +102,6 @@ GEM rexml crass (1.0.6) cri (2.15.11) - datadog-ci (0.5.0) - msgpack date (3.3.3-java) debase-ruby_core_source (3.2.3) diff-lcs (1.5.0) diff --git a/gemfiles/jruby_9.4_redis_3.gemfile.lock b/gemfiles/jruby_9.4_redis_3.gemfile.lock index bfb67fea972..6c0ce49460d 100644 --- a/gemfiles/jruby_9.4_redis_3.gemfile.lock +++ b/gemfiles/jruby_9.4_redis_3.gemfile.lock @@ -12,7 +12,6 @@ PATH remote: .. specs: ddtrace (1.18.0) - datadog-ci (~> 0.5.0) debase-ruby_core_source (= 3.2.3) libdatadog (~> 5.0.0.1.0) libddwaf (~> 1.14.0.0.0) @@ -38,8 +37,6 @@ GEM crack (0.4.5) rexml cri (2.15.11) - datadog-ci (0.5.0) - msgpack debase-ruby_core_source (3.2.3) diff-lcs (1.5.0) docile (1.4.0) diff --git a/gemfiles/jruby_9.4_redis_4.gemfile.lock b/gemfiles/jruby_9.4_redis_4.gemfile.lock index add5279910a..46cbcd4d68d 100644 --- a/gemfiles/jruby_9.4_redis_4.gemfile.lock +++ b/gemfiles/jruby_9.4_redis_4.gemfile.lock @@ -12,7 +12,6 @@ PATH remote: .. specs: ddtrace (1.18.0) - datadog-ci (~> 0.5.0) debase-ruby_core_source (= 3.2.3) libdatadog (~> 5.0.0.1.0) libddwaf (~> 1.14.0.0.0) @@ -38,8 +37,6 @@ GEM crack (0.4.5) rexml cri (2.15.11) - datadog-ci (0.5.0) - msgpack debase-ruby_core_source (3.2.3) diff-lcs (1.5.0) docile (1.4.0) diff --git a/gemfiles/jruby_9.4_redis_5.gemfile.lock b/gemfiles/jruby_9.4_redis_5.gemfile.lock index d8227a85e26..eb5f44afb2f 100644 --- a/gemfiles/jruby_9.4_redis_5.gemfile.lock +++ b/gemfiles/jruby_9.4_redis_5.gemfile.lock @@ -12,7 +12,6 @@ PATH remote: .. specs: ddtrace (1.18.0) - datadog-ci (~> 0.5.0) debase-ruby_core_source (= 3.2.3) libdatadog (~> 5.0.0.1.0) libddwaf (~> 1.14.0.0.0) @@ -39,8 +38,6 @@ GEM crack (0.4.5) rexml cri (2.15.11) - datadog-ci (0.5.0) - msgpack debase-ruby_core_source (3.2.3) diff-lcs (1.5.0) docile (1.4.0) diff --git a/gemfiles/jruby_9.4_relational_db.gemfile.lock b/gemfiles/jruby_9.4_relational_db.gemfile.lock index 1e67fd449fd..57b1c537a00 100644 --- a/gemfiles/jruby_9.4_relational_db.gemfile.lock +++ b/gemfiles/jruby_9.4_relational_db.gemfile.lock @@ -12,7 +12,6 @@ PATH remote: .. specs: ddtrace (1.18.0) - datadog-ci (~> 0.5.0) debase-ruby_core_source (= 3.2.3) libdatadog (~> 5.0.0.1.0) libddwaf (~> 1.14.0.0.0) @@ -56,8 +55,6 @@ GEM crack (0.4.5) rexml cri (2.15.11) - datadog-ci (0.5.0) - msgpack debase-ruby_core_source (3.2.3) delayed_job (4.1.11) activesupport (>= 3.0, < 8.0) diff --git a/gemfiles/jruby_9.4_resque2_redis3.gemfile.lock b/gemfiles/jruby_9.4_resque2_redis3.gemfile.lock index 3878cc4e89a..92fc2d45d1d 100644 --- a/gemfiles/jruby_9.4_resque2_redis3.gemfile.lock +++ b/gemfiles/jruby_9.4_resque2_redis3.gemfile.lock @@ -12,7 +12,6 @@ PATH remote: .. specs: ddtrace (1.18.0) - datadog-ci (~> 0.5.0) debase-ruby_core_source (= 3.2.3) libdatadog (~> 5.0.0.1.0) libddwaf (~> 1.14.0.0.0) @@ -38,8 +37,6 @@ GEM crack (0.4.5) rexml cri (2.15.11) - datadog-ci (0.5.0) - msgpack debase-ruby_core_source (3.2.3) diff-lcs (1.5.0) docile (1.4.0) diff --git a/gemfiles/jruby_9.4_resque2_redis4.gemfile.lock b/gemfiles/jruby_9.4_resque2_redis4.gemfile.lock index 9755eba37ba..f304a5af5e4 100644 --- a/gemfiles/jruby_9.4_resque2_redis4.gemfile.lock +++ b/gemfiles/jruby_9.4_resque2_redis4.gemfile.lock @@ -12,7 +12,6 @@ PATH remote: .. specs: ddtrace (1.18.0) - datadog-ci (~> 0.5.0) debase-ruby_core_source (= 3.2.3) libdatadog (~> 5.0.0.1.0) libddwaf (~> 1.14.0.0.0) @@ -39,8 +38,6 @@ GEM crack (0.4.5) rexml cri (2.15.11) - datadog-ci (0.5.0) - msgpack debase-ruby_core_source (3.2.3) diff-lcs (1.5.0) docile (1.4.0) diff --git a/gemfiles/jruby_9.4_sinatra.gemfile.lock b/gemfiles/jruby_9.4_sinatra.gemfile.lock index 193e6a9a73a..76caba24478 100644 --- a/gemfiles/jruby_9.4_sinatra.gemfile.lock +++ b/gemfiles/jruby_9.4_sinatra.gemfile.lock @@ -12,7 +12,6 @@ PATH remote: .. specs: ddtrace (1.18.0) - datadog-ci (~> 0.5.0) debase-ruby_core_source (= 3.2.3) libdatadog (~> 5.0.0.1.0) libddwaf (~> 1.14.0.0.0) @@ -38,8 +37,6 @@ GEM crack (0.4.5) rexml cri (2.15.11) - datadog-ci (0.5.0) - msgpack debase-ruby_core_source (3.2.3) diff-lcs (1.5.0) docile (1.4.0) diff --git a/gemfiles/ruby_2.1_activesupport.gemfile.lock b/gemfiles/ruby_2.1_activesupport.gemfile.lock index 404f26f81bf..d0c9f49eaf2 100644 --- a/gemfiles/ruby_2.1_activesupport.gemfile.lock +++ b/gemfiles/ruby_2.1_activesupport.gemfile.lock @@ -2,7 +2,7 @@ PATH remote: .. specs: ddtrace (1.18.0) - datadog-ci (~> 0.5.0) + datadog-ci (~> 0.6.0) debase-ruby_core_source (= 3.2.3) libdatadog (~> 5.0.0.1.0) libddwaf (~> 1.14.0.0.0) @@ -36,7 +36,7 @@ GEM concurrent-ruby (1.1.9) crack (0.4.5) rexml - datadog-ci (0.5.0) + datadog-ci (0.6.0) msgpack debase-ruby_core_source (3.2.3) diff-lcs (1.5.0) diff --git a/gemfiles/ruby_2.1_aws.gemfile.lock b/gemfiles/ruby_2.1_aws.gemfile.lock index d0df1479544..4839cc969ea 100644 --- a/gemfiles/ruby_2.1_aws.gemfile.lock +++ b/gemfiles/ruby_2.1_aws.gemfile.lock @@ -2,7 +2,7 @@ PATH remote: .. specs: ddtrace (1.18.0) - datadog-ci (~> 0.5.0) + datadog-ci (~> 0.6.0) debase-ruby_core_source (= 3.2.3) libdatadog (~> 5.0.0.1.0) libddwaf (~> 1.14.0.0.0) @@ -35,7 +35,7 @@ GEM concurrent-ruby (1.1.9) crack (0.4.5) rexml - datadog-ci (0.5.0) + datadog-ci (0.6.0) msgpack debase-ruby_core_source (3.2.3) diff-lcs (1.5.0) diff --git a/gemfiles/ruby_2.1_contrib.gemfile.lock b/gemfiles/ruby_2.1_contrib.gemfile.lock index b85a441fa63..0acbc80ff6b 100644 --- a/gemfiles/ruby_2.1_contrib.gemfile.lock +++ b/gemfiles/ruby_2.1_contrib.gemfile.lock @@ -2,7 +2,7 @@ PATH remote: .. specs: ddtrace (1.18.0) - datadog-ci (~> 0.5.0) + datadog-ci (~> 0.6.0) debase-ruby_core_source (= 3.2.3) libdatadog (~> 5.0.0.1.0) libddwaf (~> 1.14.0.0.0) @@ -45,7 +45,7 @@ GEM crack (0.4.5) rexml dalli (2.7.11) - datadog-ci (0.5.0) + datadog-ci (0.6.0) msgpack debase-ruby_core_source (3.2.3) diff-lcs (1.5.0) diff --git a/gemfiles/ruby_2.1_core_old.gemfile.lock b/gemfiles/ruby_2.1_core_old.gemfile.lock index ee2ef296134..aa64c76c3db 100644 --- a/gemfiles/ruby_2.1_core_old.gemfile.lock +++ b/gemfiles/ruby_2.1_core_old.gemfile.lock @@ -2,7 +2,7 @@ PATH remote: .. specs: ddtrace (1.18.0) - datadog-ci (~> 0.5.0) + datadog-ci (~> 0.6.0) debase-ruby_core_source (= 3.2.3) libdatadog (~> 5.0.0.1.0) libddwaf (~> 1.14.0.0.0) @@ -25,7 +25,7 @@ GEM concurrent-ruby (1.1.9) crack (0.4.5) rexml - datadog-ci (0.5.0) + datadog-ci (0.6.0) msgpack debase-ruby_core_source (3.2.3) diff-lcs (1.5.0) diff --git a/gemfiles/ruby_2.1_elasticsearch_7.gemfile.lock b/gemfiles/ruby_2.1_elasticsearch_7.gemfile.lock index b8d949c9360..db1fff32598 100644 --- a/gemfiles/ruby_2.1_elasticsearch_7.gemfile.lock +++ b/gemfiles/ruby_2.1_elasticsearch_7.gemfile.lock @@ -2,7 +2,7 @@ PATH remote: .. specs: ddtrace (1.18.0) - datadog-ci (~> 0.5.0) + datadog-ci (~> 0.6.0) debase-ruby_core_source (= 3.2.3) libdatadog (~> 5.0.0.1.0) libddwaf (~> 1.14.0.0.0) @@ -26,7 +26,7 @@ GEM concurrent-ruby (1.1.9) crack (0.4.5) rexml - datadog-ci (0.5.0) + datadog-ci (0.6.0) msgpack debase-ruby_core_source (3.2.3) diff-lcs (1.5.0) diff --git a/gemfiles/ruby_2.1_http.gemfile.lock b/gemfiles/ruby_2.1_http.gemfile.lock index 3c8a7c1f15a..104c2fdfe98 100644 --- a/gemfiles/ruby_2.1_http.gemfile.lock +++ b/gemfiles/ruby_2.1_http.gemfile.lock @@ -2,7 +2,7 @@ PATH remote: .. specs: ddtrace (1.18.0) - datadog-ci (~> 0.5.0) + datadog-ci (~> 0.6.0) debase-ruby_core_source (= 3.2.3) libdatadog (~> 5.0.0.1.0) libddwaf (~> 1.14.0.0.0) @@ -25,7 +25,7 @@ GEM concurrent-ruby (1.1.9) crack (0.4.5) rexml - datadog-ci (0.5.0) + datadog-ci (0.6.0) msgpack debase-ruby_core_source (3.2.3) diff-lcs (1.5.0) diff --git a/gemfiles/ruby_2.1_opentracing.gemfile.lock b/gemfiles/ruby_2.1_opentracing.gemfile.lock index 7d39bd462df..332150ae6eb 100644 --- a/gemfiles/ruby_2.1_opentracing.gemfile.lock +++ b/gemfiles/ruby_2.1_opentracing.gemfile.lock @@ -2,7 +2,7 @@ PATH remote: .. specs: ddtrace (1.18.0) - datadog-ci (~> 0.5.0) + datadog-ci (~> 0.6.0) debase-ruby_core_source (= 3.2.3) libdatadog (~> 5.0.0.1.0) libddwaf (~> 1.14.0.0.0) @@ -26,7 +26,7 @@ GEM concurrent-ruby (1.1.9) crack (0.4.5) rexml - datadog-ci (0.5.0) + datadog-ci (0.6.0) msgpack debase-ruby_core_source (3.2.3) diff-lcs (1.5.0) diff --git a/gemfiles/ruby_2.1_rack_1.gemfile.lock b/gemfiles/ruby_2.1_rack_1.gemfile.lock index 65b964be0e0..09c5fb755a5 100644 --- a/gemfiles/ruby_2.1_rack_1.gemfile.lock +++ b/gemfiles/ruby_2.1_rack_1.gemfile.lock @@ -2,7 +2,7 @@ PATH remote: .. specs: ddtrace (1.18.0) - datadog-ci (~> 0.5.0) + datadog-ci (~> 0.6.0) debase-ruby_core_source (= 3.2.3) libdatadog (~> 5.0.0.1.0) libddwaf (~> 1.14.0.0.0) @@ -25,7 +25,7 @@ GEM concurrent-ruby (1.1.9) crack (0.4.5) rexml - datadog-ci (0.5.0) + datadog-ci (0.6.0) msgpack debase-ruby_core_source (3.2.3) diff-lcs (1.5.0) diff --git a/gemfiles/ruby_2.1_rails32_mysql2.gemfile.lock b/gemfiles/ruby_2.1_rails32_mysql2.gemfile.lock index fe353ed0151..67cfd45e5d7 100644 --- a/gemfiles/ruby_2.1_rails32_mysql2.gemfile.lock +++ b/gemfiles/ruby_2.1_rails32_mysql2.gemfile.lock @@ -2,7 +2,7 @@ PATH remote: .. specs: ddtrace (1.18.0) - datadog-ci (~> 0.5.0) + datadog-ci (~> 0.6.0) debase-ruby_core_source (= 3.2.3) libdatadog (~> 5.0.0.1.0) libddwaf (~> 1.14.0.0.0) @@ -57,7 +57,7 @@ GEM concurrent-ruby (1.1.9) crack (0.4.5) rexml - datadog-ci (0.5.0) + datadog-ci (0.6.0) msgpack debase-ruby_core_source (3.2.3) diff-lcs (1.5.0) diff --git a/gemfiles/ruby_2.1_rails32_postgres.gemfile.lock b/gemfiles/ruby_2.1_rails32_postgres.gemfile.lock index 0d6ec94e54e..6b219339bc4 100644 --- a/gemfiles/ruby_2.1_rails32_postgres.gemfile.lock +++ b/gemfiles/ruby_2.1_rails32_postgres.gemfile.lock @@ -2,7 +2,7 @@ PATH remote: .. specs: ddtrace (1.18.0) - datadog-ci (~> 0.5.0) + datadog-ci (~> 0.6.0) debase-ruby_core_source (= 3.2.3) libdatadog (~> 5.0.0.1.0) libddwaf (~> 1.14.0.0.0) @@ -53,7 +53,7 @@ GEM concurrent-ruby (1.1.9) crack (0.4.5) rexml - datadog-ci (0.5.0) + datadog-ci (0.6.0) msgpack debase-ruby_core_source (3.2.3) diff-lcs (1.5.0) diff --git a/gemfiles/ruby_2.1_rails32_postgres_redis.gemfile.lock b/gemfiles/ruby_2.1_rails32_postgres_redis.gemfile.lock index d25790aabee..7724063d26c 100644 --- a/gemfiles/ruby_2.1_rails32_postgres_redis.gemfile.lock +++ b/gemfiles/ruby_2.1_rails32_postgres_redis.gemfile.lock @@ -2,7 +2,7 @@ PATH remote: .. specs: ddtrace (1.18.0) - datadog-ci (~> 0.5.0) + datadog-ci (~> 0.6.0) debase-ruby_core_source (= 3.2.3) libdatadog (~> 5.0.0.1.0) libddwaf (~> 1.14.0.0.0) @@ -53,7 +53,7 @@ GEM concurrent-ruby (1.1.9) crack (0.4.5) rexml - datadog-ci (0.5.0) + datadog-ci (0.6.0) msgpack debase-ruby_core_source (3.2.3) diff-lcs (1.5.0) diff --git a/gemfiles/ruby_2.1_rails32_postgres_sidekiq.gemfile.lock b/gemfiles/ruby_2.1_rails32_postgres_sidekiq.gemfile.lock index f41d036616c..a5b38f60efb 100644 --- a/gemfiles/ruby_2.1_rails32_postgres_sidekiq.gemfile.lock +++ b/gemfiles/ruby_2.1_rails32_postgres_sidekiq.gemfile.lock @@ -2,7 +2,7 @@ PATH remote: .. specs: ddtrace (1.18.0) - datadog-ci (~> 0.5.0) + datadog-ci (~> 0.6.0) debase-ruby_core_source (= 3.2.3) libdatadog (~> 5.0.0.1.0) libddwaf (~> 1.14.0.0.0) @@ -54,7 +54,7 @@ GEM connection_pool (2.2.3) crack (0.4.5) rexml - datadog-ci (0.5.0) + datadog-ci (0.6.0) msgpack debase-ruby_core_source (3.2.3) diff-lcs (1.5.0) diff --git a/gemfiles/ruby_2.1_rails4_mysql2.gemfile.lock b/gemfiles/ruby_2.1_rails4_mysql2.gemfile.lock index d92a7c0180e..0bc4a49ffd8 100644 --- a/gemfiles/ruby_2.1_rails4_mysql2.gemfile.lock +++ b/gemfiles/ruby_2.1_rails4_mysql2.gemfile.lock @@ -2,7 +2,7 @@ PATH remote: .. specs: ddtrace (1.18.0) - datadog-ci (~> 0.5.0) + datadog-ci (~> 0.6.0) debase-ruby_core_source (= 3.2.3) libdatadog (~> 5.0.0.1.0) libddwaf (~> 1.14.0.0.0) @@ -61,7 +61,7 @@ GEM crack (0.4.5) rexml crass (1.0.6) - datadog-ci (0.5.0) + datadog-ci (0.6.0) msgpack debase-ruby_core_source (3.2.3) diff-lcs (1.5.0) diff --git a/gemfiles/ruby_2.1_rails4_postgres.gemfile.lock b/gemfiles/ruby_2.1_rails4_postgres.gemfile.lock index 2b1b66c890c..a40553bd5b1 100644 --- a/gemfiles/ruby_2.1_rails4_postgres.gemfile.lock +++ b/gemfiles/ruby_2.1_rails4_postgres.gemfile.lock @@ -2,7 +2,7 @@ PATH remote: .. specs: ddtrace (1.18.0) - datadog-ci (~> 0.5.0) + datadog-ci (~> 0.6.0) debase-ruby_core_source (= 3.2.3) libdatadog (~> 5.0.0.1.0) libddwaf (~> 1.14.0.0.0) @@ -61,7 +61,7 @@ GEM crack (0.4.5) rexml crass (1.0.6) - datadog-ci (0.5.0) + datadog-ci (0.6.0) msgpack debase-ruby_core_source (3.2.3) diff-lcs (1.5.0) diff --git a/gemfiles/ruby_2.1_rails4_postgres_redis.gemfile.lock b/gemfiles/ruby_2.1_rails4_postgres_redis.gemfile.lock index e340af86621..af00f959f03 100644 --- a/gemfiles/ruby_2.1_rails4_postgres_redis.gemfile.lock +++ b/gemfiles/ruby_2.1_rails4_postgres_redis.gemfile.lock @@ -2,7 +2,7 @@ PATH remote: .. specs: ddtrace (1.18.0) - datadog-ci (~> 0.5.0) + datadog-ci (~> 0.6.0) debase-ruby_core_source (= 3.2.3) libdatadog (~> 5.0.0.1.0) libddwaf (~> 1.14.0.0.0) @@ -61,7 +61,7 @@ GEM crack (0.4.5) rexml crass (1.0.6) - datadog-ci (0.5.0) + datadog-ci (0.6.0) msgpack debase-ruby_core_source (3.2.3) diff-lcs (1.5.0) diff --git a/gemfiles/ruby_2.1_rails4_semantic_logger.gemfile.lock b/gemfiles/ruby_2.1_rails4_semantic_logger.gemfile.lock index 47f4f6a462c..dfac098d518 100644 --- a/gemfiles/ruby_2.1_rails4_semantic_logger.gemfile.lock +++ b/gemfiles/ruby_2.1_rails4_semantic_logger.gemfile.lock @@ -2,7 +2,7 @@ PATH remote: .. specs: ddtrace (1.18.0) - datadog-ci (~> 0.5.0) + datadog-ci (~> 0.6.0) debase-ruby_core_source (= 3.2.3) libdatadog (~> 5.0.0.1.0) libddwaf (~> 1.14.0.0.0) @@ -61,7 +61,7 @@ GEM crack (0.4.5) rexml crass (1.0.6) - datadog-ci (0.5.0) + datadog-ci (0.6.0) msgpack debase-ruby_core_source (3.2.3) diff-lcs (1.5.0) diff --git a/gemfiles/ruby_2.1_redis_3.gemfile.lock b/gemfiles/ruby_2.1_redis_3.gemfile.lock index e7b7241a1f6..658babd68b5 100644 --- a/gemfiles/ruby_2.1_redis_3.gemfile.lock +++ b/gemfiles/ruby_2.1_redis_3.gemfile.lock @@ -2,7 +2,7 @@ PATH remote: .. specs: ddtrace (1.18.0) - datadog-ci (~> 0.5.0) + datadog-ci (~> 0.6.0) debase-ruby_core_source (= 3.2.3) libdatadog (~> 5.0.0.1.0) libddwaf (~> 1.14.0.0.0) @@ -25,7 +25,7 @@ GEM concurrent-ruby (1.1.9) crack (0.4.5) rexml - datadog-ci (0.5.0) + datadog-ci (0.6.0) msgpack debase-ruby_core_source (3.2.3) diff-lcs (1.5.0) diff --git a/gemfiles/ruby_2.1_relational_db.gemfile.lock b/gemfiles/ruby_2.1_relational_db.gemfile.lock index 0590d67eeb4..f9f96666936 100644 --- a/gemfiles/ruby_2.1_relational_db.gemfile.lock +++ b/gemfiles/ruby_2.1_relational_db.gemfile.lock @@ -2,7 +2,7 @@ PATH remote: .. specs: ddtrace (1.18.0) - datadog-ci (~> 0.5.0) + datadog-ci (~> 0.6.0) debase-ruby_core_source (= 3.2.3) libdatadog (~> 5.0.0.1.0) libddwaf (~> 1.14.0.0.0) @@ -41,7 +41,7 @@ GEM concurrent-ruby (1.1.9) crack (0.4.5) rexml - datadog-ci (0.5.0) + datadog-ci (0.6.0) msgpack debase-ruby_core_source (3.2.3) delayed_job (4.1.11) diff --git a/gemfiles/ruby_2.1_sinatra.gemfile.lock b/gemfiles/ruby_2.1_sinatra.gemfile.lock index 3596d3c9ce9..2f50187f1f8 100644 --- a/gemfiles/ruby_2.1_sinatra.gemfile.lock +++ b/gemfiles/ruby_2.1_sinatra.gemfile.lock @@ -2,7 +2,7 @@ PATH remote: .. specs: ddtrace (1.18.0) - datadog-ci (~> 0.5.0) + datadog-ci (~> 0.6.0) debase-ruby_core_source (= 3.2.3) libdatadog (~> 5.0.0.1.0) libddwaf (~> 1.14.0.0.0) @@ -25,7 +25,7 @@ GEM concurrent-ruby (1.1.9) crack (0.4.5) rexml - datadog-ci (0.5.0) + datadog-ci (0.6.0) msgpack debase-ruby_core_source (3.2.3) diff-lcs (1.5.0) diff --git a/gemfiles/ruby_2.2_activesupport.gemfile.lock b/gemfiles/ruby_2.2_activesupport.gemfile.lock index 3d8b72a916a..ae1efd5d886 100644 --- a/gemfiles/ruby_2.2_activesupport.gemfile.lock +++ b/gemfiles/ruby_2.2_activesupport.gemfile.lock @@ -2,7 +2,7 @@ PATH remote: .. specs: ddtrace (1.18.0) - datadog-ci (~> 0.5.0) + datadog-ci (~> 0.6.0) debase-ruby_core_source (= 3.2.3) libdatadog (~> 5.0.0.1.0) libddwaf (~> 1.14.0.0.0) @@ -60,7 +60,7 @@ GEM crack (0.4.5) rexml crass (1.0.6) - datadog-ci (0.5.0) + datadog-ci (0.6.0) msgpack debase-ruby_core_source (3.2.3) descendants_tracker (0.0.4) diff --git a/gemfiles/ruby_2.2_aws.gemfile.lock b/gemfiles/ruby_2.2_aws.gemfile.lock index f855cd750ea..e7d63120185 100644 --- a/gemfiles/ruby_2.2_aws.gemfile.lock +++ b/gemfiles/ruby_2.2_aws.gemfile.lock @@ -2,7 +2,7 @@ PATH remote: .. specs: ddtrace (1.18.0) - datadog-ci (~> 0.5.0) + datadog-ci (~> 0.6.0) debase-ruby_core_source (= 3.2.3) libdatadog (~> 5.0.0.1.0) libddwaf (~> 1.14.0.0.0) @@ -1147,7 +1147,7 @@ GEM concurrent-ruby (1.1.10) crack (0.4.5) rexml - datadog-ci (0.5.0) + datadog-ci (0.6.0) msgpack debase-ruby_core_source (3.2.3) diff-lcs (1.5.0) diff --git a/gemfiles/ruby_2.2_contrib.gemfile.lock b/gemfiles/ruby_2.2_contrib.gemfile.lock index 47182dcfffb..03eefc621e2 100644 --- a/gemfiles/ruby_2.2_contrib.gemfile.lock +++ b/gemfiles/ruby_2.2_contrib.gemfile.lock @@ -2,7 +2,7 @@ PATH remote: .. specs: ddtrace (1.18.0) - datadog-ci (~> 0.5.0) + datadog-ci (~> 0.6.0) debase-ruby_core_source (= 3.2.3) libdatadog (~> 5.0.0.1.0) libddwaf (~> 1.14.0.0.0) @@ -31,7 +31,7 @@ GEM crack (0.4.5) rexml dalli (2.7.11) - datadog-ci (0.5.0) + datadog-ci (0.6.0) msgpack debase-ruby_core_source (3.2.3) diff-lcs (1.5.0) diff --git a/gemfiles/ruby_2.2_core_old.gemfile.lock b/gemfiles/ruby_2.2_core_old.gemfile.lock index 7bb4c1a8e20..fd980c6cce2 100644 --- a/gemfiles/ruby_2.2_core_old.gemfile.lock +++ b/gemfiles/ruby_2.2_core_old.gemfile.lock @@ -2,7 +2,7 @@ PATH remote: .. specs: ddtrace (1.18.0) - datadog-ci (~> 0.5.0) + datadog-ci (~> 0.6.0) debase-ruby_core_source (= 3.2.3) libdatadog (~> 5.0.0.1.0) libddwaf (~> 1.14.0.0.0) @@ -25,7 +25,7 @@ GEM concurrent-ruby (1.1.10) crack (0.4.5) rexml - datadog-ci (0.5.0) + datadog-ci (0.6.0) msgpack debase-ruby_core_source (3.2.3) diff-lcs (1.5.0) diff --git a/gemfiles/ruby_2.2_elasticsearch_7.gemfile.lock b/gemfiles/ruby_2.2_elasticsearch_7.gemfile.lock index b81a44038c1..c262051ee25 100644 --- a/gemfiles/ruby_2.2_elasticsearch_7.gemfile.lock +++ b/gemfiles/ruby_2.2_elasticsearch_7.gemfile.lock @@ -2,7 +2,7 @@ PATH remote: .. specs: ddtrace (1.18.0) - datadog-ci (~> 0.5.0) + datadog-ci (~> 0.6.0) debase-ruby_core_source (= 3.2.3) libdatadog (~> 5.0.0.1.0) libddwaf (~> 1.14.0.0.0) @@ -26,7 +26,7 @@ GEM concurrent-ruby (1.1.10) crack (0.4.5) rexml - datadog-ci (0.5.0) + datadog-ci (0.6.0) msgpack debase-ruby_core_source (3.2.3) diff-lcs (1.5.0) diff --git a/gemfiles/ruby_2.2_http.gemfile.lock b/gemfiles/ruby_2.2_http.gemfile.lock index 63211e3ba26..b4f9aea9e98 100644 --- a/gemfiles/ruby_2.2_http.gemfile.lock +++ b/gemfiles/ruby_2.2_http.gemfile.lock @@ -2,7 +2,7 @@ PATH remote: .. specs: ddtrace (1.18.0) - datadog-ci (~> 0.5.0) + datadog-ci (~> 0.6.0) debase-ruby_core_source (= 3.2.3) libdatadog (~> 5.0.0.1.0) libddwaf (~> 1.14.0.0.0) @@ -25,7 +25,7 @@ GEM concurrent-ruby (1.1.10) crack (0.4.5) rexml - datadog-ci (0.5.0) + datadog-ci (0.6.0) msgpack debase-ruby_core_source (3.2.3) diff-lcs (1.5.0) diff --git a/gemfiles/ruby_2.2_opentracing.gemfile.lock b/gemfiles/ruby_2.2_opentracing.gemfile.lock index eed0fb6ebc3..7735e0f5032 100644 --- a/gemfiles/ruby_2.2_opentracing.gemfile.lock +++ b/gemfiles/ruby_2.2_opentracing.gemfile.lock @@ -2,7 +2,7 @@ PATH remote: .. specs: ddtrace (1.18.0) - datadog-ci (~> 0.5.0) + datadog-ci (~> 0.6.0) debase-ruby_core_source (= 3.2.3) libdatadog (~> 5.0.0.1.0) libddwaf (~> 1.14.0.0.0) @@ -26,7 +26,7 @@ GEM concurrent-ruby (1.1.10) crack (0.4.5) rexml - datadog-ci (0.5.0) + datadog-ci (0.6.0) msgpack debase-ruby_core_source (3.2.3) diff-lcs (1.5.0) diff --git a/gemfiles/ruby_2.2_rack_1.gemfile.lock b/gemfiles/ruby_2.2_rack_1.gemfile.lock index f24a87f21c2..613ac672495 100644 --- a/gemfiles/ruby_2.2_rack_1.gemfile.lock +++ b/gemfiles/ruby_2.2_rack_1.gemfile.lock @@ -2,7 +2,7 @@ PATH remote: .. specs: ddtrace (1.18.0) - datadog-ci (~> 0.5.0) + datadog-ci (~> 0.6.0) debase-ruby_core_source (= 3.2.3) libdatadog (~> 5.0.0.1.0) libddwaf (~> 1.14.0.0.0) @@ -25,7 +25,7 @@ GEM concurrent-ruby (1.1.10) crack (0.4.5) rexml - datadog-ci (0.5.0) + datadog-ci (0.6.0) msgpack debase-ruby_core_source (3.2.3) diff-lcs (1.5.0) diff --git a/gemfiles/ruby_2.2_rails32_mysql2.gemfile.lock b/gemfiles/ruby_2.2_rails32_mysql2.gemfile.lock index 0ba07429710..73fa5eb64eb 100644 --- a/gemfiles/ruby_2.2_rails32_mysql2.gemfile.lock +++ b/gemfiles/ruby_2.2_rails32_mysql2.gemfile.lock @@ -2,7 +2,7 @@ PATH remote: .. specs: ddtrace (1.18.0) - datadog-ci (~> 0.5.0) + datadog-ci (~> 0.6.0) debase-ruby_core_source (= 3.2.3) libdatadog (~> 5.0.0.1.0) libddwaf (~> 1.14.0.0.0) @@ -57,7 +57,7 @@ GEM concurrent-ruby (1.1.10) crack (0.4.5) rexml - datadog-ci (0.5.0) + datadog-ci (0.6.0) msgpack debase-ruby_core_source (3.2.3) diff-lcs (1.5.0) diff --git a/gemfiles/ruby_2.2_rails32_postgres.gemfile.lock b/gemfiles/ruby_2.2_rails32_postgres.gemfile.lock index ee5d04518f4..9d4654d06b8 100644 --- a/gemfiles/ruby_2.2_rails32_postgres.gemfile.lock +++ b/gemfiles/ruby_2.2_rails32_postgres.gemfile.lock @@ -2,7 +2,7 @@ PATH remote: .. specs: ddtrace (1.18.0) - datadog-ci (~> 0.5.0) + datadog-ci (~> 0.6.0) debase-ruby_core_source (= 3.2.3) libdatadog (~> 5.0.0.1.0) libddwaf (~> 1.14.0.0.0) @@ -53,7 +53,7 @@ GEM concurrent-ruby (1.1.10) crack (0.4.5) rexml - datadog-ci (0.5.0) + datadog-ci (0.6.0) msgpack debase-ruby_core_source (3.2.3) diff-lcs (1.5.0) diff --git a/gemfiles/ruby_2.2_rails32_postgres_redis.gemfile.lock b/gemfiles/ruby_2.2_rails32_postgres_redis.gemfile.lock index 771e429f7e6..37cc2e9b4db 100644 --- a/gemfiles/ruby_2.2_rails32_postgres_redis.gemfile.lock +++ b/gemfiles/ruby_2.2_rails32_postgres_redis.gemfile.lock @@ -2,7 +2,7 @@ PATH remote: .. specs: ddtrace (1.18.0) - datadog-ci (~> 0.5.0) + datadog-ci (~> 0.6.0) debase-ruby_core_source (= 3.2.3) libdatadog (~> 5.0.0.1.0) libddwaf (~> 1.14.0.0.0) @@ -53,7 +53,7 @@ GEM concurrent-ruby (1.1.10) crack (0.4.5) rexml - datadog-ci (0.5.0) + datadog-ci (0.6.0) msgpack debase-ruby_core_source (3.2.3) diff-lcs (1.5.0) diff --git a/gemfiles/ruby_2.2_rails32_postgres_sidekiq.gemfile.lock b/gemfiles/ruby_2.2_rails32_postgres_sidekiq.gemfile.lock index 47fe1f8684c..e1318036641 100644 --- a/gemfiles/ruby_2.2_rails32_postgres_sidekiq.gemfile.lock +++ b/gemfiles/ruby_2.2_rails32_postgres_sidekiq.gemfile.lock @@ -2,7 +2,7 @@ PATH remote: .. specs: ddtrace (1.18.0) - datadog-ci (~> 0.5.0) + datadog-ci (~> 0.6.0) debase-ruby_core_source (= 3.2.3) libdatadog (~> 5.0.0.1.0) libddwaf (~> 1.14.0.0.0) @@ -54,7 +54,7 @@ GEM connection_pool (2.2.3) crack (0.4.5) rexml - datadog-ci (0.5.0) + datadog-ci (0.6.0) msgpack debase-ruby_core_source (3.2.3) diff-lcs (1.5.0) diff --git a/gemfiles/ruby_2.2_rails4_mysql2.gemfile.lock b/gemfiles/ruby_2.2_rails4_mysql2.gemfile.lock index 76754ea5e44..37746c3efbf 100644 --- a/gemfiles/ruby_2.2_rails4_mysql2.gemfile.lock +++ b/gemfiles/ruby_2.2_rails4_mysql2.gemfile.lock @@ -2,7 +2,7 @@ PATH remote: .. specs: ddtrace (1.18.0) - datadog-ci (~> 0.5.0) + datadog-ci (~> 0.6.0) debase-ruby_core_source (= 3.2.3) libdatadog (~> 5.0.0.1.0) libddwaf (~> 1.14.0.0.0) @@ -61,7 +61,7 @@ GEM crack (0.4.5) rexml crass (1.0.6) - datadog-ci (0.5.0) + datadog-ci (0.6.0) msgpack debase-ruby_core_source (3.2.3) diff-lcs (1.5.0) diff --git a/gemfiles/ruby_2.2_rails4_postgres.gemfile.lock b/gemfiles/ruby_2.2_rails4_postgres.gemfile.lock index 0e40183c9fc..cab753e5932 100644 --- a/gemfiles/ruby_2.2_rails4_postgres.gemfile.lock +++ b/gemfiles/ruby_2.2_rails4_postgres.gemfile.lock @@ -2,7 +2,7 @@ PATH remote: .. specs: ddtrace (1.18.0) - datadog-ci (~> 0.5.0) + datadog-ci (~> 0.6.0) debase-ruby_core_source (= 3.2.3) libdatadog (~> 5.0.0.1.0) libddwaf (~> 1.14.0.0.0) @@ -61,7 +61,7 @@ GEM crack (0.4.5) rexml crass (1.0.6) - datadog-ci (0.5.0) + datadog-ci (0.6.0) msgpack debase-ruby_core_source (3.2.3) diff-lcs (1.5.0) diff --git a/gemfiles/ruby_2.2_rails4_postgres_redis.gemfile.lock b/gemfiles/ruby_2.2_rails4_postgres_redis.gemfile.lock index f7b7bb70e89..6d590444520 100644 --- a/gemfiles/ruby_2.2_rails4_postgres_redis.gemfile.lock +++ b/gemfiles/ruby_2.2_rails4_postgres_redis.gemfile.lock @@ -2,7 +2,7 @@ PATH remote: .. specs: ddtrace (1.18.0) - datadog-ci (~> 0.5.0) + datadog-ci (~> 0.6.0) debase-ruby_core_source (= 3.2.3) libdatadog (~> 5.0.0.1.0) libddwaf (~> 1.14.0.0.0) @@ -61,7 +61,7 @@ GEM crack (0.4.5) rexml crass (1.0.6) - datadog-ci (0.5.0) + datadog-ci (0.6.0) msgpack debase-ruby_core_source (3.2.3) diff-lcs (1.5.0) diff --git a/gemfiles/ruby_2.2_rails4_postgres_sidekiq.gemfile.lock b/gemfiles/ruby_2.2_rails4_postgres_sidekiq.gemfile.lock index e6be1f84692..c5581ee4b64 100644 --- a/gemfiles/ruby_2.2_rails4_postgres_sidekiq.gemfile.lock +++ b/gemfiles/ruby_2.2_rails4_postgres_sidekiq.gemfile.lock @@ -2,7 +2,7 @@ PATH remote: .. specs: ddtrace (1.18.0) - datadog-ci (~> 0.5.0) + datadog-ci (~> 0.6.0) debase-ruby_core_source (= 3.2.3) libdatadog (~> 5.0.0.1.0) libddwaf (~> 1.14.0.0.0) @@ -62,7 +62,7 @@ GEM crack (0.4.5) rexml crass (1.0.6) - datadog-ci (0.5.0) + datadog-ci (0.6.0) msgpack debase-ruby_core_source (3.2.3) diff-lcs (1.5.0) diff --git a/gemfiles/ruby_2.2_rails4_semantic_logger.gemfile.lock b/gemfiles/ruby_2.2_rails4_semantic_logger.gemfile.lock index 37aaa17d53c..53a3a618ab0 100644 --- a/gemfiles/ruby_2.2_rails4_semantic_logger.gemfile.lock +++ b/gemfiles/ruby_2.2_rails4_semantic_logger.gemfile.lock @@ -2,7 +2,7 @@ PATH remote: .. specs: ddtrace (1.18.0) - datadog-ci (~> 0.5.0) + datadog-ci (~> 0.6.0) debase-ruby_core_source (= 3.2.3) libdatadog (~> 5.0.0.1.0) libddwaf (~> 1.14.0.0.0) @@ -61,7 +61,7 @@ GEM crack (0.4.5) rexml crass (1.0.6) - datadog-ci (0.5.0) + datadog-ci (0.6.0) msgpack debase-ruby_core_source (3.2.3) diff-lcs (1.5.0) diff --git a/gemfiles/ruby_2.2_rails5_mysql2.gemfile.lock b/gemfiles/ruby_2.2_rails5_mysql2.gemfile.lock index ec8b91f1157..ad5ef64a887 100644 --- a/gemfiles/ruby_2.2_rails5_mysql2.gemfile.lock +++ b/gemfiles/ruby_2.2_rails5_mysql2.gemfile.lock @@ -2,7 +2,7 @@ PATH remote: .. specs: ddtrace (1.18.0) - datadog-ci (~> 0.5.0) + datadog-ci (~> 0.6.0) debase-ruby_core_source (= 3.2.3) libdatadog (~> 5.0.0.1.0) libddwaf (~> 1.14.0.0.0) @@ -68,7 +68,7 @@ GEM crack (0.4.5) rexml crass (1.0.6) - datadog-ci (0.5.0) + datadog-ci (0.6.0) msgpack debase-ruby_core_source (3.2.3) diff-lcs (1.5.0) diff --git a/gemfiles/ruby_2.2_rails5_postgres.gemfile.lock b/gemfiles/ruby_2.2_rails5_postgres.gemfile.lock index 3af12f5591d..73f4c12c6cb 100644 --- a/gemfiles/ruby_2.2_rails5_postgres.gemfile.lock +++ b/gemfiles/ruby_2.2_rails5_postgres.gemfile.lock @@ -2,7 +2,7 @@ PATH remote: .. specs: ddtrace (1.18.0) - datadog-ci (~> 0.5.0) + datadog-ci (~> 0.6.0) debase-ruby_core_source (= 3.2.3) libdatadog (~> 5.0.0.1.0) libddwaf (~> 1.14.0.0.0) @@ -68,7 +68,7 @@ GEM crack (0.4.5) rexml crass (1.0.6) - datadog-ci (0.5.0) + datadog-ci (0.6.0) msgpack debase-ruby_core_source (3.2.3) diff-lcs (1.5.0) diff --git a/gemfiles/ruby_2.2_rails5_postgres_redis.gemfile.lock b/gemfiles/ruby_2.2_rails5_postgres_redis.gemfile.lock index ad7fce7d73f..8ae30dbb015 100644 --- a/gemfiles/ruby_2.2_rails5_postgres_redis.gemfile.lock +++ b/gemfiles/ruby_2.2_rails5_postgres_redis.gemfile.lock @@ -2,7 +2,7 @@ PATH remote: .. specs: ddtrace (1.18.0) - datadog-ci (~> 0.5.0) + datadog-ci (~> 0.6.0) debase-ruby_core_source (= 3.2.3) libdatadog (~> 5.0.0.1.0) libddwaf (~> 1.14.0.0.0) @@ -68,7 +68,7 @@ GEM crack (0.4.5) rexml crass (1.0.6) - datadog-ci (0.5.0) + datadog-ci (0.6.0) msgpack debase-ruby_core_source (3.2.3) diff-lcs (1.5.0) diff --git a/gemfiles/ruby_2.2_rails5_postgres_redis_activesupport.gemfile.lock b/gemfiles/ruby_2.2_rails5_postgres_redis_activesupport.gemfile.lock index 92cb631cef9..81a2babc753 100644 --- a/gemfiles/ruby_2.2_rails5_postgres_redis_activesupport.gemfile.lock +++ b/gemfiles/ruby_2.2_rails5_postgres_redis_activesupport.gemfile.lock @@ -2,7 +2,7 @@ PATH remote: .. specs: ddtrace (1.18.0) - datadog-ci (~> 0.5.0) + datadog-ci (~> 0.6.0) debase-ruby_core_source (= 3.2.3) libdatadog (~> 5.0.0.1.0) libddwaf (~> 1.14.0.0.0) @@ -68,7 +68,7 @@ GEM crack (0.4.5) rexml crass (1.0.6) - datadog-ci (0.5.0) + datadog-ci (0.6.0) msgpack debase-ruby_core_source (3.2.3) diff-lcs (1.5.0) diff --git a/gemfiles/ruby_2.2_rails5_postgres_sidekiq.gemfile.lock b/gemfiles/ruby_2.2_rails5_postgres_sidekiq.gemfile.lock index 4e76ad7946d..eefaf54860b 100644 --- a/gemfiles/ruby_2.2_rails5_postgres_sidekiq.gemfile.lock +++ b/gemfiles/ruby_2.2_rails5_postgres_sidekiq.gemfile.lock @@ -2,7 +2,7 @@ PATH remote: .. specs: ddtrace (1.18.0) - datadog-ci (~> 0.5.0) + datadog-ci (~> 0.6.0) debase-ruby_core_source (= 3.2.3) libdatadog (~> 5.0.0.1.0) libddwaf (~> 1.14.0.0.0) @@ -69,7 +69,7 @@ GEM crack (0.4.5) rexml crass (1.0.6) - datadog-ci (0.5.0) + datadog-ci (0.6.0) msgpack debase-ruby_core_source (3.2.3) diff-lcs (1.5.0) diff --git a/gemfiles/ruby_2.2_rails5_semantic_logger.gemfile.lock b/gemfiles/ruby_2.2_rails5_semantic_logger.gemfile.lock index 2372af73e6d..097bb1293c0 100644 --- a/gemfiles/ruby_2.2_rails5_semantic_logger.gemfile.lock +++ b/gemfiles/ruby_2.2_rails5_semantic_logger.gemfile.lock @@ -2,7 +2,7 @@ PATH remote: .. specs: ddtrace (1.18.0) - datadog-ci (~> 0.5.0) + datadog-ci (~> 0.6.0) debase-ruby_core_source (= 3.2.3) libdatadog (~> 5.0.0.1.0) libddwaf (~> 1.14.0.0.0) @@ -68,7 +68,7 @@ GEM crack (0.4.5) rexml crass (1.0.6) - datadog-ci (0.5.0) + datadog-ci (0.6.0) msgpack debase-ruby_core_source (3.2.3) diff-lcs (1.5.0) diff --git a/gemfiles/ruby_2.2_redis_3.gemfile.lock b/gemfiles/ruby_2.2_redis_3.gemfile.lock index 4faa312d209..26720bd04ac 100644 --- a/gemfiles/ruby_2.2_redis_3.gemfile.lock +++ b/gemfiles/ruby_2.2_redis_3.gemfile.lock @@ -2,7 +2,7 @@ PATH remote: .. specs: ddtrace (1.18.0) - datadog-ci (~> 0.5.0) + datadog-ci (~> 0.6.0) debase-ruby_core_source (= 3.2.3) libdatadog (~> 5.0.0.1.0) libddwaf (~> 1.14.0.0.0) @@ -25,7 +25,7 @@ GEM concurrent-ruby (1.1.10) crack (0.4.5) rexml - datadog-ci (0.5.0) + datadog-ci (0.6.0) msgpack debase-ruby_core_source (3.2.3) diff-lcs (1.5.0) diff --git a/gemfiles/ruby_2.2_relational_db.gemfile.lock b/gemfiles/ruby_2.2_relational_db.gemfile.lock index 04ec5e3367c..3c35f05e507 100644 --- a/gemfiles/ruby_2.2_relational_db.gemfile.lock +++ b/gemfiles/ruby_2.2_relational_db.gemfile.lock @@ -2,7 +2,7 @@ PATH remote: .. specs: ddtrace (1.18.0) - datadog-ci (~> 0.5.0) + datadog-ci (~> 0.6.0) debase-ruby_core_source (= 3.2.3) libdatadog (~> 5.0.0.1.0) libddwaf (~> 1.14.0.0.0) @@ -37,7 +37,7 @@ GEM concurrent-ruby (1.1.10) crack (0.4.5) rexml - datadog-ci (0.5.0) + datadog-ci (0.6.0) msgpack debase-ruby_core_source (3.2.3) delayed_job (4.1.11) diff --git a/gemfiles/ruby_2.2_sinatra.gemfile.lock b/gemfiles/ruby_2.2_sinatra.gemfile.lock index e071546a7a8..eb3289dfa2a 100644 --- a/gemfiles/ruby_2.2_sinatra.gemfile.lock +++ b/gemfiles/ruby_2.2_sinatra.gemfile.lock @@ -2,7 +2,7 @@ PATH remote: .. specs: ddtrace (1.18.0) - datadog-ci (~> 0.5.0) + datadog-ci (~> 0.6.0) debase-ruby_core_source (= 3.2.3) libdatadog (~> 5.0.0.1.0) libddwaf (~> 1.14.0.0.0) @@ -25,7 +25,7 @@ GEM concurrent-ruby (1.1.10) crack (0.4.5) rexml - datadog-ci (0.5.0) + datadog-ci (0.6.0) msgpack debase-ruby_core_source (3.2.3) diff-lcs (1.5.0) diff --git a/gemfiles/ruby_2.3_activerecord_3.gemfile.lock b/gemfiles/ruby_2.3_activerecord_3.gemfile.lock index 637290c4deb..2acb3353340 100644 --- a/gemfiles/ruby_2.3_activerecord_3.gemfile.lock +++ b/gemfiles/ruby_2.3_activerecord_3.gemfile.lock @@ -2,7 +2,7 @@ PATH remote: .. specs: ddtrace (1.18.0) - datadog-ci (~> 0.5.0) + datadog-ci (~> 0.6.0) debase-ruby_core_source (= 3.2.3) libdatadog (~> 5.0.0.1.0) libddwaf (~> 1.14.0.0.0) @@ -41,7 +41,7 @@ GEM concurrent-ruby (1.2.2) crack (0.4.5) rexml - datadog-ci (0.5.0) + datadog-ci (0.6.0) msgpack debase-ruby_core_source (3.2.3) diff-lcs (1.5.0) diff --git a/gemfiles/ruby_2.3_activesupport.gemfile.lock b/gemfiles/ruby_2.3_activesupport.gemfile.lock index fe623d24851..679a8ab682e 100644 --- a/gemfiles/ruby_2.3_activesupport.gemfile.lock +++ b/gemfiles/ruby_2.3_activesupport.gemfile.lock @@ -2,7 +2,7 @@ PATH remote: .. specs: ddtrace (1.18.0) - datadog-ci (~> 0.5.0) + datadog-ci (~> 0.6.0) debase-ruby_core_source (= 3.2.3) libdatadog (~> 5.0.0.1.0) libddwaf (~> 1.14.0.0.0) @@ -60,7 +60,7 @@ GEM crack (0.4.5) rexml crass (1.0.6) - datadog-ci (0.5.0) + datadog-ci (0.6.0) msgpack debase-ruby_core_source (3.2.3) descendants_tracker (0.0.4) diff --git a/gemfiles/ruby_2.3_aws.gemfile.lock b/gemfiles/ruby_2.3_aws.gemfile.lock index ca0e6b39958..a0f784b637b 100644 --- a/gemfiles/ruby_2.3_aws.gemfile.lock +++ b/gemfiles/ruby_2.3_aws.gemfile.lock @@ -2,7 +2,7 @@ PATH remote: .. specs: ddtrace (1.18.0) - datadog-ci (~> 0.5.0) + datadog-ci (~> 0.6.0) debase-ruby_core_source (= 3.2.3) libdatadog (~> 5.0.0.1.0) libddwaf (~> 1.14.0.0.0) @@ -1446,7 +1446,7 @@ GEM concurrent-ruby (1.2.2) crack (0.4.5) rexml - datadog-ci (0.5.0) + datadog-ci (0.6.0) msgpack debase-ruby_core_source (3.2.3) diff-lcs (1.5.0) diff --git a/gemfiles/ruby_2.3_contrib.gemfile.lock b/gemfiles/ruby_2.3_contrib.gemfile.lock index 9db1f25a65b..8fea951f731 100644 --- a/gemfiles/ruby_2.3_contrib.gemfile.lock +++ b/gemfiles/ruby_2.3_contrib.gemfile.lock @@ -2,7 +2,7 @@ PATH remote: .. specs: ddtrace (1.18.0) - datadog-ci (~> 0.5.0) + datadog-ci (~> 0.6.0) debase-ruby_core_source (= 3.2.3) libdatadog (~> 5.0.0.1.0) libddwaf (~> 1.14.0.0.0) @@ -32,7 +32,7 @@ GEM crack (0.4.5) rexml dalli (2.7.11) - datadog-ci (0.5.0) + datadog-ci (0.6.0) msgpack debase-ruby_core_source (3.2.3) diff-lcs (1.5.0) diff --git a/gemfiles/ruby_2.3_contrib_old.gemfile.lock b/gemfiles/ruby_2.3_contrib_old.gemfile.lock index f919e09f695..95ca0c6b796 100644 --- a/gemfiles/ruby_2.3_contrib_old.gemfile.lock +++ b/gemfiles/ruby_2.3_contrib_old.gemfile.lock @@ -2,7 +2,7 @@ PATH remote: .. specs: ddtrace (1.18.0) - datadog-ci (~> 0.5.0) + datadog-ci (~> 0.6.0) debase-ruby_core_source (= 3.2.3) libdatadog (~> 5.0.0.1.0) libddwaf (~> 1.14.0.0.0) @@ -25,7 +25,7 @@ GEM concurrent-ruby (1.2.2) crack (0.4.5) rexml - datadog-ci (0.5.0) + datadog-ci (0.6.0) msgpack debase-ruby_core_source (3.2.3) diff-lcs (1.5.0) diff --git a/gemfiles/ruby_2.3_core_old.gemfile.lock b/gemfiles/ruby_2.3_core_old.gemfile.lock index 36c092f6b07..ffb98f15e3f 100644 --- a/gemfiles/ruby_2.3_core_old.gemfile.lock +++ b/gemfiles/ruby_2.3_core_old.gemfile.lock @@ -2,7 +2,7 @@ PATH remote: .. specs: ddtrace (1.18.0) - datadog-ci (~> 0.5.0) + datadog-ci (~> 0.6.0) debase-ruby_core_source (= 3.2.3) libdatadog (~> 5.0.0.1.0) libddwaf (~> 1.14.0.0.0) @@ -25,7 +25,7 @@ GEM concurrent-ruby (1.2.2) crack (0.4.5) rexml - datadog-ci (0.5.0) + datadog-ci (0.6.0) msgpack debase-ruby_core_source (3.2.3) diff-lcs (1.5.0) diff --git a/gemfiles/ruby_2.3_elasticsearch_7.gemfile.lock b/gemfiles/ruby_2.3_elasticsearch_7.gemfile.lock index c69dd9db475..812dbac0c41 100644 --- a/gemfiles/ruby_2.3_elasticsearch_7.gemfile.lock +++ b/gemfiles/ruby_2.3_elasticsearch_7.gemfile.lock @@ -2,7 +2,7 @@ PATH remote: .. specs: ddtrace (1.18.0) - datadog-ci (~> 0.5.0) + datadog-ci (~> 0.6.0) debase-ruby_core_source (= 3.2.3) libdatadog (~> 5.0.0.1.0) libddwaf (~> 1.14.0.0.0) @@ -26,7 +26,7 @@ GEM concurrent-ruby (1.2.2) crack (0.4.5) rexml - datadog-ci (0.5.0) + datadog-ci (0.6.0) msgpack debase-ruby_core_source (3.2.3) diff-lcs (1.5.0) diff --git a/gemfiles/ruby_2.3_hanami_1.gemfile.lock b/gemfiles/ruby_2.3_hanami_1.gemfile.lock index 1de64a6d225..c142116e155 100644 --- a/gemfiles/ruby_2.3_hanami_1.gemfile.lock +++ b/gemfiles/ruby_2.3_hanami_1.gemfile.lock @@ -2,7 +2,7 @@ PATH remote: .. specs: ddtrace (1.18.0) - datadog-ci (~> 0.5.0) + datadog-ci (~> 0.6.0) debase-ruby_core_source (= 3.2.3) libdatadog (~> 5.0.0.1.0) libddwaf (~> 1.14.0.0.0) @@ -25,7 +25,7 @@ GEM concurrent-ruby (1.2.2) crack (0.4.5) rexml - datadog-ci (0.5.0) + datadog-ci (0.6.0) msgpack debase-ruby_core_source (3.2.3) diff-lcs (1.5.0) diff --git a/gemfiles/ruby_2.3_http.gemfile.lock b/gemfiles/ruby_2.3_http.gemfile.lock index e1cc1f75cd6..4b78a86c8e3 100644 --- a/gemfiles/ruby_2.3_http.gemfile.lock +++ b/gemfiles/ruby_2.3_http.gemfile.lock @@ -2,7 +2,7 @@ PATH remote: .. specs: ddtrace (1.18.0) - datadog-ci (~> 0.5.0) + datadog-ci (~> 0.6.0) debase-ruby_core_source (= 3.2.3) libdatadog (~> 5.0.0.1.0) libddwaf (~> 1.14.0.0.0) @@ -25,7 +25,7 @@ GEM concurrent-ruby (1.2.2) crack (0.4.5) rexml - datadog-ci (0.5.0) + datadog-ci (0.6.0) msgpack debase-ruby_core_source (3.2.3) diff-lcs (1.5.0) diff --git a/gemfiles/ruby_2.3_opentracing.gemfile.lock b/gemfiles/ruby_2.3_opentracing.gemfile.lock index f25ecbd295c..c51c173af64 100644 --- a/gemfiles/ruby_2.3_opentracing.gemfile.lock +++ b/gemfiles/ruby_2.3_opentracing.gemfile.lock @@ -2,7 +2,7 @@ PATH remote: .. specs: ddtrace (1.18.0) - datadog-ci (~> 0.5.0) + datadog-ci (~> 0.6.0) debase-ruby_core_source (= 3.2.3) libdatadog (~> 5.0.0.1.0) libddwaf (~> 1.14.0.0.0) @@ -26,7 +26,7 @@ GEM concurrent-ruby (1.2.2) crack (0.4.5) rexml - datadog-ci (0.5.0) + datadog-ci (0.6.0) msgpack debase-ruby_core_source (3.2.3) diff-lcs (1.5.0) diff --git a/gemfiles/ruby_2.3_rack_1.gemfile.lock b/gemfiles/ruby_2.3_rack_1.gemfile.lock index 22f94a5b67d..8978751335b 100644 --- a/gemfiles/ruby_2.3_rack_1.gemfile.lock +++ b/gemfiles/ruby_2.3_rack_1.gemfile.lock @@ -2,7 +2,7 @@ PATH remote: .. specs: ddtrace (1.18.0) - datadog-ci (~> 0.5.0) + datadog-ci (~> 0.6.0) debase-ruby_core_source (= 3.2.3) libdatadog (~> 5.0.0.1.0) libddwaf (~> 1.14.0.0.0) @@ -25,7 +25,7 @@ GEM concurrent-ruby (1.2.2) crack (0.4.5) rexml - datadog-ci (0.5.0) + datadog-ci (0.6.0) msgpack debase-ruby_core_source (3.2.3) diff-lcs (1.5.0) diff --git a/gemfiles/ruby_2.3_rack_2.gemfile.lock b/gemfiles/ruby_2.3_rack_2.gemfile.lock index 1248059e3e4..ca9b435de68 100644 --- a/gemfiles/ruby_2.3_rack_2.gemfile.lock +++ b/gemfiles/ruby_2.3_rack_2.gemfile.lock @@ -2,7 +2,7 @@ PATH remote: .. specs: ddtrace (1.18.0) - datadog-ci (~> 0.5.0) + datadog-ci (~> 0.6.0) debase-ruby_core_source (= 3.2.3) libdatadog (~> 5.0.0.1.0) libddwaf (~> 1.14.0.0.0) @@ -25,7 +25,7 @@ GEM concurrent-ruby (1.2.2) crack (0.4.5) rexml - datadog-ci (0.5.0) + datadog-ci (0.6.0) msgpack debase-ruby_core_source (3.2.3) diff-lcs (1.5.0) diff --git a/gemfiles/ruby_2.3_rails32_mysql2.gemfile.lock b/gemfiles/ruby_2.3_rails32_mysql2.gemfile.lock index d03d941e6c2..fcafd320dbb 100644 --- a/gemfiles/ruby_2.3_rails32_mysql2.gemfile.lock +++ b/gemfiles/ruby_2.3_rails32_mysql2.gemfile.lock @@ -2,7 +2,7 @@ PATH remote: .. specs: ddtrace (1.18.0) - datadog-ci (~> 0.5.0) + datadog-ci (~> 0.6.0) debase-ruby_core_source (= 3.2.3) libdatadog (~> 5.0.0.1.0) libddwaf (~> 1.14.0.0.0) @@ -57,7 +57,7 @@ GEM concurrent-ruby (1.2.2) crack (0.4.5) rexml - datadog-ci (0.5.0) + datadog-ci (0.6.0) msgpack debase-ruby_core_source (3.2.3) diff-lcs (1.5.0) diff --git a/gemfiles/ruby_2.3_rails32_postgres.gemfile.lock b/gemfiles/ruby_2.3_rails32_postgres.gemfile.lock index fce7eee45ae..2a98fe4286f 100644 --- a/gemfiles/ruby_2.3_rails32_postgres.gemfile.lock +++ b/gemfiles/ruby_2.3_rails32_postgres.gemfile.lock @@ -2,7 +2,7 @@ PATH remote: .. specs: ddtrace (1.18.0) - datadog-ci (~> 0.5.0) + datadog-ci (~> 0.6.0) debase-ruby_core_source (= 3.2.3) libdatadog (~> 5.0.0.1.0) libddwaf (~> 1.14.0.0.0) @@ -53,7 +53,7 @@ GEM concurrent-ruby (1.2.2) crack (0.4.5) rexml - datadog-ci (0.5.0) + datadog-ci (0.6.0) msgpack debase-ruby_core_source (3.2.3) diff-lcs (1.5.0) diff --git a/gemfiles/ruby_2.3_rails32_postgres_redis.gemfile.lock b/gemfiles/ruby_2.3_rails32_postgres_redis.gemfile.lock index 1adf5da1bf7..e023175bef2 100644 --- a/gemfiles/ruby_2.3_rails32_postgres_redis.gemfile.lock +++ b/gemfiles/ruby_2.3_rails32_postgres_redis.gemfile.lock @@ -2,7 +2,7 @@ PATH remote: .. specs: ddtrace (1.18.0) - datadog-ci (~> 0.5.0) + datadog-ci (~> 0.6.0) debase-ruby_core_source (= 3.2.3) libdatadog (~> 5.0.0.1.0) libddwaf (~> 1.14.0.0.0) @@ -53,7 +53,7 @@ GEM concurrent-ruby (1.2.2) crack (0.4.5) rexml - datadog-ci (0.5.0) + datadog-ci (0.6.0) msgpack debase-ruby_core_source (3.2.3) diff-lcs (1.5.0) diff --git a/gemfiles/ruby_2.3_rails32_postgres_sidekiq.gemfile.lock b/gemfiles/ruby_2.3_rails32_postgres_sidekiq.gemfile.lock index 9715fae05e2..50eaaedea8f 100644 --- a/gemfiles/ruby_2.3_rails32_postgres_sidekiq.gemfile.lock +++ b/gemfiles/ruby_2.3_rails32_postgres_sidekiq.gemfile.lock @@ -2,7 +2,7 @@ PATH remote: .. specs: ddtrace (1.18.0) - datadog-ci (~> 0.5.0) + datadog-ci (~> 0.6.0) debase-ruby_core_source (= 3.2.3) libdatadog (~> 5.0.0.1.0) libddwaf (~> 1.14.0.0.0) @@ -54,7 +54,7 @@ GEM connection_pool (2.2.5) crack (0.4.5) rexml - datadog-ci (0.5.0) + datadog-ci (0.6.0) msgpack debase-ruby_core_source (3.2.3) diff-lcs (1.5.0) diff --git a/gemfiles/ruby_2.3_rails4_mysql2.gemfile.lock b/gemfiles/ruby_2.3_rails4_mysql2.gemfile.lock index b97ca5e09e2..2951afc2268 100644 --- a/gemfiles/ruby_2.3_rails4_mysql2.gemfile.lock +++ b/gemfiles/ruby_2.3_rails4_mysql2.gemfile.lock @@ -2,7 +2,7 @@ PATH remote: .. specs: ddtrace (1.18.0) - datadog-ci (~> 0.5.0) + datadog-ci (~> 0.6.0) debase-ruby_core_source (= 3.2.3) libdatadog (~> 5.0.0.1.0) libddwaf (~> 1.14.0.0.0) @@ -61,7 +61,7 @@ GEM crack (0.4.5) rexml crass (1.0.6) - datadog-ci (0.5.0) + datadog-ci (0.6.0) msgpack debase-ruby_core_source (3.2.3) diff-lcs (1.5.0) diff --git a/gemfiles/ruby_2.3_rails4_postgres.gemfile.lock b/gemfiles/ruby_2.3_rails4_postgres.gemfile.lock index eca2f61b1c7..ba047c40ce5 100644 --- a/gemfiles/ruby_2.3_rails4_postgres.gemfile.lock +++ b/gemfiles/ruby_2.3_rails4_postgres.gemfile.lock @@ -2,7 +2,7 @@ PATH remote: .. specs: ddtrace (1.18.0) - datadog-ci (~> 0.5.0) + datadog-ci (~> 0.6.0) debase-ruby_core_source (= 3.2.3) libdatadog (~> 5.0.0.1.0) libddwaf (~> 1.14.0.0.0) @@ -61,7 +61,7 @@ GEM crack (0.4.5) rexml crass (1.0.6) - datadog-ci (0.5.0) + datadog-ci (0.6.0) msgpack debase-ruby_core_source (3.2.3) diff-lcs (1.5.0) diff --git a/gemfiles/ruby_2.3_rails4_postgres_redis.gemfile.lock b/gemfiles/ruby_2.3_rails4_postgres_redis.gemfile.lock index e094dd3b5be..001280f2010 100644 --- a/gemfiles/ruby_2.3_rails4_postgres_redis.gemfile.lock +++ b/gemfiles/ruby_2.3_rails4_postgres_redis.gemfile.lock @@ -2,7 +2,7 @@ PATH remote: .. specs: ddtrace (1.18.0) - datadog-ci (~> 0.5.0) + datadog-ci (~> 0.6.0) debase-ruby_core_source (= 3.2.3) libdatadog (~> 5.0.0.1.0) libddwaf (~> 1.14.0.0.0) @@ -61,7 +61,7 @@ GEM crack (0.4.5) rexml crass (1.0.6) - datadog-ci (0.5.0) + datadog-ci (0.6.0) msgpack debase-ruby_core_source (3.2.3) diff-lcs (1.5.0) diff --git a/gemfiles/ruby_2.3_rails4_postgres_sidekiq.gemfile.lock b/gemfiles/ruby_2.3_rails4_postgres_sidekiq.gemfile.lock index 03fa5c2e832..6d4d86613be 100644 --- a/gemfiles/ruby_2.3_rails4_postgres_sidekiq.gemfile.lock +++ b/gemfiles/ruby_2.3_rails4_postgres_sidekiq.gemfile.lock @@ -2,7 +2,7 @@ PATH remote: .. specs: ddtrace (1.18.0) - datadog-ci (~> 0.5.0) + datadog-ci (~> 0.6.0) debase-ruby_core_source (= 3.2.3) libdatadog (~> 5.0.0.1.0) libddwaf (~> 1.14.0.0.0) @@ -62,7 +62,7 @@ GEM crack (0.4.5) rexml crass (1.0.6) - datadog-ci (0.5.0) + datadog-ci (0.6.0) msgpack debase-ruby_core_source (3.2.3) diff-lcs (1.5.0) diff --git a/gemfiles/ruby_2.3_rails4_semantic_logger.gemfile.lock b/gemfiles/ruby_2.3_rails4_semantic_logger.gemfile.lock index 38857a513f0..11040bc3503 100644 --- a/gemfiles/ruby_2.3_rails4_semantic_logger.gemfile.lock +++ b/gemfiles/ruby_2.3_rails4_semantic_logger.gemfile.lock @@ -2,7 +2,7 @@ PATH remote: .. specs: ddtrace (1.18.0) - datadog-ci (~> 0.5.0) + datadog-ci (~> 0.6.0) debase-ruby_core_source (= 3.2.3) libdatadog (~> 5.0.0.1.0) libddwaf (~> 1.14.0.0.0) @@ -61,7 +61,7 @@ GEM crack (0.4.5) rexml crass (1.0.6) - datadog-ci (0.5.0) + datadog-ci (0.6.0) msgpack debase-ruby_core_source (3.2.3) diff-lcs (1.5.0) diff --git a/gemfiles/ruby_2.3_rails5_mysql2.gemfile.lock b/gemfiles/ruby_2.3_rails5_mysql2.gemfile.lock index ea3deb3dc82..cfe63db4643 100644 --- a/gemfiles/ruby_2.3_rails5_mysql2.gemfile.lock +++ b/gemfiles/ruby_2.3_rails5_mysql2.gemfile.lock @@ -2,7 +2,7 @@ PATH remote: .. specs: ddtrace (1.18.0) - datadog-ci (~> 0.5.0) + datadog-ci (~> 0.6.0) debase-ruby_core_source (= 3.2.3) libdatadog (~> 5.0.0.1.0) libddwaf (~> 1.14.0.0.0) @@ -68,7 +68,7 @@ GEM crack (0.4.5) rexml crass (1.0.6) - datadog-ci (0.5.0) + datadog-ci (0.6.0) msgpack debase-ruby_core_source (3.2.3) diff-lcs (1.5.0) diff --git a/gemfiles/ruby_2.3_rails5_postgres.gemfile.lock b/gemfiles/ruby_2.3_rails5_postgres.gemfile.lock index d13a1123bcb..da6e2d3a2f5 100644 --- a/gemfiles/ruby_2.3_rails5_postgres.gemfile.lock +++ b/gemfiles/ruby_2.3_rails5_postgres.gemfile.lock @@ -2,7 +2,7 @@ PATH remote: .. specs: ddtrace (1.18.0) - datadog-ci (~> 0.5.0) + datadog-ci (~> 0.6.0) debase-ruby_core_source (= 3.2.3) libdatadog (~> 5.0.0.1.0) libddwaf (~> 1.14.0.0.0) @@ -68,7 +68,7 @@ GEM crack (0.4.5) rexml crass (1.0.6) - datadog-ci (0.5.0) + datadog-ci (0.6.0) msgpack debase-ruby_core_source (3.2.3) diff-lcs (1.5.0) diff --git a/gemfiles/ruby_2.3_rails5_postgres_redis.gemfile.lock b/gemfiles/ruby_2.3_rails5_postgres_redis.gemfile.lock index be9f83acb8b..98288a1cd5a 100644 --- a/gemfiles/ruby_2.3_rails5_postgres_redis.gemfile.lock +++ b/gemfiles/ruby_2.3_rails5_postgres_redis.gemfile.lock @@ -2,7 +2,7 @@ PATH remote: .. specs: ddtrace (1.18.0) - datadog-ci (~> 0.5.0) + datadog-ci (~> 0.6.0) debase-ruby_core_source (= 3.2.3) libdatadog (~> 5.0.0.1.0) libddwaf (~> 1.14.0.0.0) @@ -68,7 +68,7 @@ GEM crack (0.4.5) rexml crass (1.0.6) - datadog-ci (0.5.0) + datadog-ci (0.6.0) msgpack debase-ruby_core_source (3.2.3) diff-lcs (1.5.0) diff --git a/gemfiles/ruby_2.3_rails5_postgres_redis_activesupport.gemfile.lock b/gemfiles/ruby_2.3_rails5_postgres_redis_activesupport.gemfile.lock index 52965762be1..c60a1c2e713 100644 --- a/gemfiles/ruby_2.3_rails5_postgres_redis_activesupport.gemfile.lock +++ b/gemfiles/ruby_2.3_rails5_postgres_redis_activesupport.gemfile.lock @@ -2,7 +2,7 @@ PATH remote: .. specs: ddtrace (1.18.0) - datadog-ci (~> 0.5.0) + datadog-ci (~> 0.6.0) debase-ruby_core_source (= 3.2.3) libdatadog (~> 5.0.0.1.0) libddwaf (~> 1.14.0.0.0) @@ -68,7 +68,7 @@ GEM crack (0.4.5) rexml crass (1.0.6) - datadog-ci (0.5.0) + datadog-ci (0.6.0) msgpack debase-ruby_core_source (3.2.3) diff-lcs (1.5.0) diff --git a/gemfiles/ruby_2.3_rails5_postgres_sidekiq.gemfile.lock b/gemfiles/ruby_2.3_rails5_postgres_sidekiq.gemfile.lock index d9cdf6cafc6..93f71695552 100644 --- a/gemfiles/ruby_2.3_rails5_postgres_sidekiq.gemfile.lock +++ b/gemfiles/ruby_2.3_rails5_postgres_sidekiq.gemfile.lock @@ -2,7 +2,7 @@ PATH remote: .. specs: ddtrace (1.18.0) - datadog-ci (~> 0.5.0) + datadog-ci (~> 0.6.0) debase-ruby_core_source (= 3.2.3) libdatadog (~> 5.0.0.1.0) libddwaf (~> 1.14.0.0.0) @@ -69,7 +69,7 @@ GEM crack (0.4.5) rexml crass (1.0.6) - datadog-ci (0.5.0) + datadog-ci (0.6.0) msgpack debase-ruby_core_source (3.2.3) diff-lcs (1.5.0) diff --git a/gemfiles/ruby_2.3_rails5_semantic_logger.gemfile.lock b/gemfiles/ruby_2.3_rails5_semantic_logger.gemfile.lock index f4ce2e06966..9ff746b871d 100644 --- a/gemfiles/ruby_2.3_rails5_semantic_logger.gemfile.lock +++ b/gemfiles/ruby_2.3_rails5_semantic_logger.gemfile.lock @@ -2,7 +2,7 @@ PATH remote: .. specs: ddtrace (1.18.0) - datadog-ci (~> 0.5.0) + datadog-ci (~> 0.6.0) debase-ruby_core_source (= 3.2.3) libdatadog (~> 5.0.0.1.0) libddwaf (~> 1.14.0.0.0) @@ -68,7 +68,7 @@ GEM crack (0.4.5) rexml crass (1.0.6) - datadog-ci (0.5.0) + datadog-ci (0.6.0) msgpack debase-ruby_core_source (3.2.3) diff-lcs (1.5.0) diff --git a/gemfiles/ruby_2.3_redis_3.gemfile.lock b/gemfiles/ruby_2.3_redis_3.gemfile.lock index c115af08844..7ff271ad0ff 100644 --- a/gemfiles/ruby_2.3_redis_3.gemfile.lock +++ b/gemfiles/ruby_2.3_redis_3.gemfile.lock @@ -2,7 +2,7 @@ PATH remote: .. specs: ddtrace (1.18.0) - datadog-ci (~> 0.5.0) + datadog-ci (~> 0.6.0) debase-ruby_core_source (= 3.2.3) libdatadog (~> 5.0.0.1.0) libddwaf (~> 1.14.0.0.0) @@ -25,7 +25,7 @@ GEM concurrent-ruby (1.2.2) crack (0.4.5) rexml - datadog-ci (0.5.0) + datadog-ci (0.6.0) msgpack debase-ruby_core_source (3.2.3) diff-lcs (1.5.0) diff --git a/gemfiles/ruby_2.3_relational_db.gemfile.lock b/gemfiles/ruby_2.3_relational_db.gemfile.lock index 19666213c7c..ea7794ae59d 100644 --- a/gemfiles/ruby_2.3_relational_db.gemfile.lock +++ b/gemfiles/ruby_2.3_relational_db.gemfile.lock @@ -2,7 +2,7 @@ PATH remote: .. specs: ddtrace (1.18.0) - datadog-ci (~> 0.5.0) + datadog-ci (~> 0.6.0) debase-ruby_core_source (= 3.2.3) libdatadog (~> 5.0.0.1.0) libddwaf (~> 1.14.0.0.0) @@ -37,7 +37,7 @@ GEM concurrent-ruby (1.2.2) crack (0.4.5) rexml - datadog-ci (0.5.0) + datadog-ci (0.6.0) msgpack debase-ruby_core_source (3.2.3) delayed_job (4.1.11) diff --git a/gemfiles/ruby_2.3_resque2_redis3.gemfile.lock b/gemfiles/ruby_2.3_resque2_redis3.gemfile.lock index 643443d6791..aff46cc880c 100644 --- a/gemfiles/ruby_2.3_resque2_redis3.gemfile.lock +++ b/gemfiles/ruby_2.3_resque2_redis3.gemfile.lock @@ -2,7 +2,7 @@ PATH remote: .. specs: ddtrace (1.18.0) - datadog-ci (~> 0.5.0) + datadog-ci (~> 0.6.0) debase-ruby_core_source (= 3.2.3) libdatadog (~> 5.0.0.1.0) libddwaf (~> 1.14.0.0.0) @@ -25,7 +25,7 @@ GEM concurrent-ruby (1.2.2) crack (0.4.5) rexml - datadog-ci (0.5.0) + datadog-ci (0.6.0) msgpack debase-ruby_core_source (3.2.3) diff-lcs (1.5.0) diff --git a/gemfiles/ruby_2.3_resque2_redis4.gemfile.lock b/gemfiles/ruby_2.3_resque2_redis4.gemfile.lock index c2222473bd9..99050218bc9 100644 --- a/gemfiles/ruby_2.3_resque2_redis4.gemfile.lock +++ b/gemfiles/ruby_2.3_resque2_redis4.gemfile.lock @@ -2,7 +2,7 @@ PATH remote: .. specs: ddtrace (1.18.0) - datadog-ci (~> 0.5.0) + datadog-ci (~> 0.6.0) debase-ruby_core_source (= 3.2.3) libdatadog (~> 5.0.0.1.0) libddwaf (~> 1.14.0.0.0) @@ -25,7 +25,7 @@ GEM concurrent-ruby (1.2.2) crack (0.4.5) rexml - datadog-ci (0.5.0) + datadog-ci (0.6.0) msgpack debase-ruby_core_source (3.2.3) diff-lcs (1.5.0) diff --git a/gemfiles/ruby_2.3_sinatra.gemfile.lock b/gemfiles/ruby_2.3_sinatra.gemfile.lock index 75b4e3eaa7c..63cdd9494e9 100644 --- a/gemfiles/ruby_2.3_sinatra.gemfile.lock +++ b/gemfiles/ruby_2.3_sinatra.gemfile.lock @@ -2,7 +2,7 @@ PATH remote: .. specs: ddtrace (1.18.0) - datadog-ci (~> 0.5.0) + datadog-ci (~> 0.6.0) debase-ruby_core_source (= 3.2.3) libdatadog (~> 5.0.0.1.0) libddwaf (~> 1.14.0.0.0) @@ -25,7 +25,7 @@ GEM concurrent-ruby (1.2.2) crack (0.4.5) rexml - datadog-ci (0.5.0) + datadog-ci (0.6.0) msgpack debase-ruby_core_source (3.2.3) diff-lcs (1.5.0) diff --git a/gemfiles/ruby_2.4_activerecord_4.gemfile.lock b/gemfiles/ruby_2.4_activerecord_4.gemfile.lock index 05312e29c20..49034452962 100644 --- a/gemfiles/ruby_2.4_activerecord_4.gemfile.lock +++ b/gemfiles/ruby_2.4_activerecord_4.gemfile.lock @@ -2,7 +2,7 @@ PATH remote: .. specs: ddtrace (1.18.0) - datadog-ci (~> 0.5.0) + datadog-ci (~> 0.6.0) debase-ruby_core_source (= 3.2.3) libdatadog (~> 5.0.0.1.0) libddwaf (~> 1.14.0.0.0) @@ -40,7 +40,7 @@ GEM crack (0.4.5) rexml cri (2.15.10) - datadog-ci (0.5.0) + datadog-ci (0.6.0) msgpack debase-ruby_core_source (3.2.3) diff-lcs (1.5.0) diff --git a/gemfiles/ruby_2.4_activesupport.gemfile.lock b/gemfiles/ruby_2.4_activesupport.gemfile.lock index 1e7b49c229a..6dd535e4535 100644 --- a/gemfiles/ruby_2.4_activesupport.gemfile.lock +++ b/gemfiles/ruby_2.4_activesupport.gemfile.lock @@ -2,7 +2,7 @@ PATH remote: .. specs: ddtrace (1.18.0) - datadog-ci (~> 0.5.0) + datadog-ci (~> 0.6.0) debase-ruby_core_source (= 3.2.3) libdatadog (~> 5.0.0.1.0) libddwaf (~> 1.14.0.0.0) @@ -55,7 +55,7 @@ GEM rexml crass (1.0.6) cri (2.15.10) - datadog-ci (0.5.0) + datadog-ci (0.6.0) msgpack debase-ruby_core_source (3.2.3) diff-lcs (1.5.0) diff --git a/gemfiles/ruby_2.4_aws.gemfile.lock b/gemfiles/ruby_2.4_aws.gemfile.lock index d70a22ce690..a9e67423db5 100644 --- a/gemfiles/ruby_2.4_aws.gemfile.lock +++ b/gemfiles/ruby_2.4_aws.gemfile.lock @@ -2,7 +2,7 @@ PATH remote: .. specs: ddtrace (1.18.0) - datadog-ci (~> 0.5.0) + datadog-ci (~> 0.6.0) debase-ruby_core_source (= 3.2.3) libdatadog (~> 5.0.0.1.0) libddwaf (~> 1.14.0.0.0) @@ -1448,7 +1448,7 @@ GEM crack (0.4.5) rexml cri (2.15.10) - datadog-ci (0.5.0) + datadog-ci (0.6.0) msgpack debase-ruby_core_source (3.2.3) diff-lcs (1.5.0) diff --git a/gemfiles/ruby_2.4_contrib.gemfile.lock b/gemfiles/ruby_2.4_contrib.gemfile.lock index 119d514e6ad..4372353b1a7 100644 --- a/gemfiles/ruby_2.4_contrib.gemfile.lock +++ b/gemfiles/ruby_2.4_contrib.gemfile.lock @@ -2,7 +2,7 @@ PATH remote: .. specs: ddtrace (1.18.0) - datadog-ci (~> 0.5.0) + datadog-ci (~> 0.6.0) debase-ruby_core_source (= 3.2.3) libdatadog (~> 5.0.0.1.0) libddwaf (~> 1.14.0.0.0) @@ -34,7 +34,7 @@ GEM rexml cri (2.15.10) dalli (2.7.11) - datadog-ci (0.5.0) + datadog-ci (0.6.0) msgpack debase-ruby_core_source (3.2.3) diff-lcs (1.3) diff --git a/gemfiles/ruby_2.4_contrib_old.gemfile.lock b/gemfiles/ruby_2.4_contrib_old.gemfile.lock index 6c9c0a491c2..154496f5872 100644 --- a/gemfiles/ruby_2.4_contrib_old.gemfile.lock +++ b/gemfiles/ruby_2.4_contrib_old.gemfile.lock @@ -2,7 +2,7 @@ PATH remote: .. specs: ddtrace (1.18.0) - datadog-ci (~> 0.5.0) + datadog-ci (~> 0.6.0) debase-ruby_core_source (= 3.2.3) libdatadog (~> 5.0.0.1.0) libddwaf (~> 1.14.0.0.0) @@ -27,7 +27,7 @@ GEM crack (0.4.5) rexml cri (2.15.10) - datadog-ci (0.5.0) + datadog-ci (0.6.0) msgpack debase-ruby_core_source (3.2.3) diff-lcs (1.5.0) diff --git a/gemfiles/ruby_2.4_core_old.gemfile.lock b/gemfiles/ruby_2.4_core_old.gemfile.lock index 03be1c28077..7b2bdfbf88b 100644 --- a/gemfiles/ruby_2.4_core_old.gemfile.lock +++ b/gemfiles/ruby_2.4_core_old.gemfile.lock @@ -2,7 +2,7 @@ PATH remote: .. specs: ddtrace (1.18.0) - datadog-ci (~> 0.5.0) + datadog-ci (~> 0.6.0) debase-ruby_core_source (= 3.2.3) libdatadog (~> 5.0.0.1.0) libddwaf (~> 1.14.0.0.0) @@ -27,7 +27,7 @@ GEM crack (0.4.5) rexml cri (2.15.10) - datadog-ci (0.5.0) + datadog-ci (0.6.0) msgpack debase-ruby_core_source (3.2.3) diff-lcs (1.5.0) diff --git a/gemfiles/ruby_2.4_elasticsearch_7.gemfile.lock b/gemfiles/ruby_2.4_elasticsearch_7.gemfile.lock index 3ee0459e75f..808e575a498 100644 --- a/gemfiles/ruby_2.4_elasticsearch_7.gemfile.lock +++ b/gemfiles/ruby_2.4_elasticsearch_7.gemfile.lock @@ -2,7 +2,7 @@ PATH remote: .. specs: ddtrace (1.18.0) - datadog-ci (~> 0.5.0) + datadog-ci (~> 0.6.0) debase-ruby_core_source (= 3.2.3) libdatadog (~> 5.0.0.1.0) libddwaf (~> 1.14.0.0.0) @@ -28,7 +28,7 @@ GEM crack (0.4.5) rexml cri (2.15.10) - datadog-ci (0.5.0) + datadog-ci (0.6.0) msgpack debase-ruby_core_source (3.2.3) diff-lcs (1.5.0) diff --git a/gemfiles/ruby_2.4_hanami_1.gemfile.lock b/gemfiles/ruby_2.4_hanami_1.gemfile.lock index 7fdc89c5da4..8d6d9e0458e 100644 --- a/gemfiles/ruby_2.4_hanami_1.gemfile.lock +++ b/gemfiles/ruby_2.4_hanami_1.gemfile.lock @@ -2,7 +2,7 @@ PATH remote: .. specs: ddtrace (1.18.0) - datadog-ci (~> 0.5.0) + datadog-ci (~> 0.6.0) debase-ruby_core_source (= 3.2.3) libdatadog (~> 5.0.0.1.0) libddwaf (~> 1.14.0.0.0) @@ -27,7 +27,7 @@ GEM crack (0.4.5) rexml cri (2.15.10) - datadog-ci (0.5.0) + datadog-ci (0.6.0) msgpack debase-ruby_core_source (3.2.3) diff-lcs (1.5.0) diff --git a/gemfiles/ruby_2.4_http.gemfile.lock b/gemfiles/ruby_2.4_http.gemfile.lock index eb19a63c0ba..45b2cfe605b 100644 --- a/gemfiles/ruby_2.4_http.gemfile.lock +++ b/gemfiles/ruby_2.4_http.gemfile.lock @@ -2,7 +2,7 @@ PATH remote: .. specs: ddtrace (1.18.0) - datadog-ci (~> 0.5.0) + datadog-ci (~> 0.6.0) debase-ruby_core_source (= 3.2.3) libdatadog (~> 5.0.0.1.0) libddwaf (~> 1.14.0.0.0) @@ -27,7 +27,7 @@ GEM crack (0.4.5) rexml cri (2.15.10) - datadog-ci (0.5.0) + datadog-ci (0.6.0) msgpack debase-ruby_core_source (3.2.3) diff-lcs (1.5.0) diff --git a/gemfiles/ruby_2.4_opensearch_2.gemfile.lock b/gemfiles/ruby_2.4_opensearch_2.gemfile.lock index a0aec2451a8..43cca1d8b00 100644 --- a/gemfiles/ruby_2.4_opensearch_2.gemfile.lock +++ b/gemfiles/ruby_2.4_opensearch_2.gemfile.lock @@ -2,7 +2,7 @@ PATH remote: .. specs: ddtrace (1.18.0) - datadog-ci (~> 0.5.0) + datadog-ci (~> 0.6.0) debase-ruby_core_source (= 3.2.3) libdatadog (~> 5.0.0.1.0) libddwaf (~> 1.14.0.0.0) @@ -28,7 +28,7 @@ GEM crack (0.4.5) rexml cri (2.15.10) - datadog-ci (0.5.0) + datadog-ci (0.6.0) msgpack debase-ruby_core_source (3.2.3) diff-lcs (1.5.0) diff --git a/gemfiles/ruby_2.4_opentracing.gemfile.lock b/gemfiles/ruby_2.4_opentracing.gemfile.lock index 61dd0be8fdd..f7787e728bf 100644 --- a/gemfiles/ruby_2.4_opentracing.gemfile.lock +++ b/gemfiles/ruby_2.4_opentracing.gemfile.lock @@ -2,7 +2,7 @@ PATH remote: .. specs: ddtrace (1.18.0) - datadog-ci (~> 0.5.0) + datadog-ci (~> 0.6.0) debase-ruby_core_source (= 3.2.3) libdatadog (~> 5.0.0.1.0) libddwaf (~> 1.14.0.0.0) @@ -28,7 +28,7 @@ GEM crack (0.4.5) rexml cri (2.15.10) - datadog-ci (0.5.0) + datadog-ci (0.6.0) msgpack debase-ruby_core_source (3.2.3) diff-lcs (1.5.0) diff --git a/gemfiles/ruby_2.4_rack_1.gemfile.lock b/gemfiles/ruby_2.4_rack_1.gemfile.lock index 991dc9f368b..894b776dac5 100644 --- a/gemfiles/ruby_2.4_rack_1.gemfile.lock +++ b/gemfiles/ruby_2.4_rack_1.gemfile.lock @@ -2,7 +2,7 @@ PATH remote: .. specs: ddtrace (1.18.0) - datadog-ci (~> 0.5.0) + datadog-ci (~> 0.6.0) debase-ruby_core_source (= 3.2.3) libdatadog (~> 5.0.0.1.0) libddwaf (~> 1.14.0.0.0) @@ -27,7 +27,7 @@ GEM crack (0.4.5) rexml cri (2.15.10) - datadog-ci (0.5.0) + datadog-ci (0.6.0) msgpack debase-ruby_core_source (3.2.3) diff-lcs (1.5.0) diff --git a/gemfiles/ruby_2.4_rack_2.gemfile.lock b/gemfiles/ruby_2.4_rack_2.gemfile.lock index cfbcc2705d5..f015823adae 100644 --- a/gemfiles/ruby_2.4_rack_2.gemfile.lock +++ b/gemfiles/ruby_2.4_rack_2.gemfile.lock @@ -2,7 +2,7 @@ PATH remote: .. specs: ddtrace (1.18.0) - datadog-ci (~> 0.5.0) + datadog-ci (~> 0.6.0) debase-ruby_core_source (= 3.2.3) libdatadog (~> 5.0.0.1.0) libddwaf (~> 1.14.0.0.0) @@ -27,7 +27,7 @@ GEM crack (0.4.5) rexml cri (2.15.10) - datadog-ci (0.5.0) + datadog-ci (0.6.0) msgpack debase-ruby_core_source (3.2.3) diff-lcs (1.5.0) diff --git a/gemfiles/ruby_2.4_rack_3.gemfile.lock b/gemfiles/ruby_2.4_rack_3.gemfile.lock index eeac990a6b8..051294fd39a 100644 --- a/gemfiles/ruby_2.4_rack_3.gemfile.lock +++ b/gemfiles/ruby_2.4_rack_3.gemfile.lock @@ -2,7 +2,7 @@ PATH remote: .. specs: ddtrace (1.18.0) - datadog-ci (~> 0.5.0) + datadog-ci (~> 0.6.0) debase-ruby_core_source (= 3.2.3) libdatadog (~> 5.0.0.1.0) libddwaf (~> 1.14.0.0.0) @@ -27,7 +27,7 @@ GEM crack (0.4.5) rexml cri (2.15.10) - datadog-ci (0.5.0) + datadog-ci (0.6.0) msgpack debase-ruby_core_source (3.2.3) diff-lcs (1.5.0) diff --git a/gemfiles/ruby_2.4_rails5_mysql2.gemfile.lock b/gemfiles/ruby_2.4_rails5_mysql2.gemfile.lock index 23890d70a3e..754d7926da0 100644 --- a/gemfiles/ruby_2.4_rails5_mysql2.gemfile.lock +++ b/gemfiles/ruby_2.4_rails5_mysql2.gemfile.lock @@ -2,7 +2,7 @@ PATH remote: .. specs: ddtrace (1.18.0) - datadog-ci (~> 0.5.0) + datadog-ci (~> 0.6.0) debase-ruby_core_source (= 3.2.3) libdatadog (~> 5.0.0.1.0) libddwaf (~> 1.14.0.0.0) @@ -70,7 +70,7 @@ GEM rexml crass (1.0.6) cri (2.15.10) - datadog-ci (0.5.0) + datadog-ci (0.6.0) msgpack debase-ruby_core_source (3.2.3) diff-lcs (1.5.0) diff --git a/gemfiles/ruby_2.4_rails5_postgres.gemfile.lock b/gemfiles/ruby_2.4_rails5_postgres.gemfile.lock index f802d72002b..d590bacd8c3 100644 --- a/gemfiles/ruby_2.4_rails5_postgres.gemfile.lock +++ b/gemfiles/ruby_2.4_rails5_postgres.gemfile.lock @@ -2,7 +2,7 @@ PATH remote: .. specs: ddtrace (1.18.0) - datadog-ci (~> 0.5.0) + datadog-ci (~> 0.6.0) debase-ruby_core_source (= 3.2.3) libdatadog (~> 5.0.0.1.0) libddwaf (~> 1.14.0.0.0) @@ -70,7 +70,7 @@ GEM rexml crass (1.0.6) cri (2.15.10) - datadog-ci (0.5.0) + datadog-ci (0.6.0) msgpack debase-ruby_core_source (3.2.3) diff-lcs (1.5.0) diff --git a/gemfiles/ruby_2.4_rails5_postgres_redis.gemfile.lock b/gemfiles/ruby_2.4_rails5_postgres_redis.gemfile.lock index b0ded0ec68b..944e9ff568d 100644 --- a/gemfiles/ruby_2.4_rails5_postgres_redis.gemfile.lock +++ b/gemfiles/ruby_2.4_rails5_postgres_redis.gemfile.lock @@ -2,7 +2,7 @@ PATH remote: .. specs: ddtrace (1.18.0) - datadog-ci (~> 0.5.0) + datadog-ci (~> 0.6.0) debase-ruby_core_source (= 3.2.3) libdatadog (~> 5.0.0.1.0) libddwaf (~> 1.14.0.0.0) @@ -70,7 +70,7 @@ GEM rexml crass (1.0.6) cri (2.15.10) - datadog-ci (0.5.0) + datadog-ci (0.6.0) msgpack debase-ruby_core_source (3.2.3) diff-lcs (1.5.0) diff --git a/gemfiles/ruby_2.4_rails5_postgres_redis_activesupport.gemfile.lock b/gemfiles/ruby_2.4_rails5_postgres_redis_activesupport.gemfile.lock index ad7b929fd35..5515e31cd42 100644 --- a/gemfiles/ruby_2.4_rails5_postgres_redis_activesupport.gemfile.lock +++ b/gemfiles/ruby_2.4_rails5_postgres_redis_activesupport.gemfile.lock @@ -2,7 +2,7 @@ PATH remote: .. specs: ddtrace (1.18.0) - datadog-ci (~> 0.5.0) + datadog-ci (~> 0.6.0) debase-ruby_core_source (= 3.2.3) libdatadog (~> 5.0.0.1.0) libddwaf (~> 1.14.0.0.0) @@ -70,7 +70,7 @@ GEM rexml crass (1.0.6) cri (2.15.10) - datadog-ci (0.5.0) + datadog-ci (0.6.0) msgpack debase-ruby_core_source (3.2.3) diff-lcs (1.5.0) diff --git a/gemfiles/ruby_2.4_rails5_postgres_sidekiq.gemfile.lock b/gemfiles/ruby_2.4_rails5_postgres_sidekiq.gemfile.lock index 50f795b26f5..9353dfadc61 100644 --- a/gemfiles/ruby_2.4_rails5_postgres_sidekiq.gemfile.lock +++ b/gemfiles/ruby_2.4_rails5_postgres_sidekiq.gemfile.lock @@ -2,7 +2,7 @@ PATH remote: .. specs: ddtrace (1.18.0) - datadog-ci (~> 0.5.0) + datadog-ci (~> 0.6.0) debase-ruby_core_source (= 3.2.3) libdatadog (~> 5.0.0.1.0) libddwaf (~> 1.14.0.0.0) @@ -71,7 +71,7 @@ GEM rexml crass (1.0.6) cri (2.15.10) - datadog-ci (0.5.0) + datadog-ci (0.6.0) msgpack debase-ruby_core_source (3.2.3) diff-lcs (1.5.0) diff --git a/gemfiles/ruby_2.4_rails5_semantic_logger.gemfile.lock b/gemfiles/ruby_2.4_rails5_semantic_logger.gemfile.lock index 1065c8356d5..45c0db9f438 100644 --- a/gemfiles/ruby_2.4_rails5_semantic_logger.gemfile.lock +++ b/gemfiles/ruby_2.4_rails5_semantic_logger.gemfile.lock @@ -2,7 +2,7 @@ PATH remote: .. specs: ddtrace (1.18.0) - datadog-ci (~> 0.5.0) + datadog-ci (~> 0.6.0) debase-ruby_core_source (= 3.2.3) libdatadog (~> 5.0.0.1.0) libddwaf (~> 1.14.0.0.0) @@ -70,7 +70,7 @@ GEM rexml crass (1.0.6) cri (2.15.10) - datadog-ci (0.5.0) + datadog-ci (0.6.0) msgpack debase-ruby_core_source (3.2.3) diff-lcs (1.5.0) diff --git a/gemfiles/ruby_2.4_redis_3.gemfile.lock b/gemfiles/ruby_2.4_redis_3.gemfile.lock index efd58eb74bd..6e0c5404d7d 100644 --- a/gemfiles/ruby_2.4_redis_3.gemfile.lock +++ b/gemfiles/ruby_2.4_redis_3.gemfile.lock @@ -2,7 +2,7 @@ PATH remote: .. specs: ddtrace (1.18.0) - datadog-ci (~> 0.5.0) + datadog-ci (~> 0.6.0) debase-ruby_core_source (= 3.2.3) libdatadog (~> 5.0.0.1.0) libddwaf (~> 1.14.0.0.0) @@ -27,7 +27,7 @@ GEM crack (0.4.5) rexml cri (2.15.10) - datadog-ci (0.5.0) + datadog-ci (0.6.0) msgpack debase-ruby_core_source (3.2.3) diff-lcs (1.5.0) diff --git a/gemfiles/ruby_2.4_redis_4.gemfile.lock b/gemfiles/ruby_2.4_redis_4.gemfile.lock index ec30662fa9d..c65b5144553 100644 --- a/gemfiles/ruby_2.4_redis_4.gemfile.lock +++ b/gemfiles/ruby_2.4_redis_4.gemfile.lock @@ -2,7 +2,7 @@ PATH remote: .. specs: ddtrace (1.18.0) - datadog-ci (~> 0.5.0) + datadog-ci (~> 0.6.0) debase-ruby_core_source (= 3.2.3) libdatadog (~> 5.0.0.1.0) libddwaf (~> 1.14.0.0.0) @@ -27,7 +27,7 @@ GEM crack (0.4.5) rexml cri (2.15.10) - datadog-ci (0.5.0) + datadog-ci (0.6.0) msgpack debase-ruby_core_source (3.2.3) diff-lcs (1.5.0) diff --git a/gemfiles/ruby_2.4_relational_db.gemfile.lock b/gemfiles/ruby_2.4_relational_db.gemfile.lock index e6aea21e2b4..f21fbd43e85 100644 --- a/gemfiles/ruby_2.4_relational_db.gemfile.lock +++ b/gemfiles/ruby_2.4_relational_db.gemfile.lock @@ -2,7 +2,7 @@ PATH remote: .. specs: ddtrace (1.18.0) - datadog-ci (~> 0.5.0) + datadog-ci (~> 0.6.0) debase-ruby_core_source (= 3.2.3) libdatadog (~> 5.0.0.1.0) libddwaf (~> 1.14.0.0.0) @@ -39,7 +39,7 @@ GEM crack (0.4.5) rexml cri (2.15.10) - datadog-ci (0.5.0) + datadog-ci (0.6.0) msgpack debase-ruby_core_source (3.2.3) delayed_job (4.1.11) diff --git a/gemfiles/ruby_2.4_resque2_redis3.gemfile.lock b/gemfiles/ruby_2.4_resque2_redis3.gemfile.lock index 9ed487529b1..4de8009e5a4 100644 --- a/gemfiles/ruby_2.4_resque2_redis3.gemfile.lock +++ b/gemfiles/ruby_2.4_resque2_redis3.gemfile.lock @@ -2,7 +2,7 @@ PATH remote: .. specs: ddtrace (1.18.0) - datadog-ci (~> 0.5.0) + datadog-ci (~> 0.6.0) debase-ruby_core_source (= 3.2.3) libdatadog (~> 5.0.0.1.0) libddwaf (~> 1.14.0.0.0) @@ -27,7 +27,7 @@ GEM crack (0.4.5) rexml cri (2.15.10) - datadog-ci (0.5.0) + datadog-ci (0.6.0) msgpack debase-ruby_core_source (3.2.3) diff-lcs (1.5.0) diff --git a/gemfiles/ruby_2.4_resque2_redis4.gemfile.lock b/gemfiles/ruby_2.4_resque2_redis4.gemfile.lock index aa8e91b31c3..6e30bc9211b 100644 --- a/gemfiles/ruby_2.4_resque2_redis4.gemfile.lock +++ b/gemfiles/ruby_2.4_resque2_redis4.gemfile.lock @@ -2,7 +2,7 @@ PATH remote: .. specs: ddtrace (1.18.0) - datadog-ci (~> 0.5.0) + datadog-ci (~> 0.6.0) debase-ruby_core_source (= 3.2.3) libdatadog (~> 5.0.0.1.0) libddwaf (~> 1.14.0.0.0) @@ -27,7 +27,7 @@ GEM crack (0.4.5) rexml cri (2.15.10) - datadog-ci (0.5.0) + datadog-ci (0.6.0) msgpack debase-ruby_core_source (3.2.3) diff-lcs (1.5.0) diff --git a/gemfiles/ruby_2.4_sinatra.gemfile.lock b/gemfiles/ruby_2.4_sinatra.gemfile.lock index d526e26aa8f..d9779972b14 100644 --- a/gemfiles/ruby_2.4_sinatra.gemfile.lock +++ b/gemfiles/ruby_2.4_sinatra.gemfile.lock @@ -2,7 +2,7 @@ PATH remote: .. specs: ddtrace (1.18.0) - datadog-ci (~> 0.5.0) + datadog-ci (~> 0.6.0) debase-ruby_core_source (= 3.2.3) libdatadog (~> 5.0.0.1.0) libddwaf (~> 1.14.0.0.0) @@ -27,7 +27,7 @@ GEM crack (0.4.5) rexml cri (2.15.10) - datadog-ci (0.5.0) + datadog-ci (0.6.0) msgpack debase-ruby_core_source (3.2.3) diff-lcs (1.5.0) diff --git a/gemfiles/ruby_2.5_activesupport.gemfile.lock b/gemfiles/ruby_2.5_activesupport.gemfile.lock index e6fced0329f..2f4c7ac7282 100644 --- a/gemfiles/ruby_2.5_activesupport.gemfile.lock +++ b/gemfiles/ruby_2.5_activesupport.gemfile.lock @@ -12,7 +12,6 @@ PATH remote: .. specs: ddtrace (1.18.0) - datadog-ci (~> 0.5.0) debase-ruby_core_source (= 3.2.3) libdatadog (~> 5.0.0.1.0) libddwaf (~> 1.14.0.0.0) @@ -67,8 +66,6 @@ GEM rexml crass (1.0.6) cri (2.15.11) - datadog-ci (0.5.0) - msgpack debase-ruby_core_source (3.2.3) debug_inspector (1.1.0) diff-lcs (1.5.0) diff --git a/gemfiles/ruby_2.5_aws.gemfile.lock b/gemfiles/ruby_2.5_aws.gemfile.lock index e1e691ae0b8..7c6b6d878e7 100644 --- a/gemfiles/ruby_2.5_aws.gemfile.lock +++ b/gemfiles/ruby_2.5_aws.gemfile.lock @@ -12,7 +12,6 @@ PATH remote: .. specs: ddtrace (1.18.0) - datadog-ci (~> 0.5.0) debase-ruby_core_source (= 3.2.3) libdatadog (~> 5.0.0.1.0) libddwaf (~> 1.14.0.0.0) @@ -1460,8 +1459,6 @@ GEM crack (0.4.5) rexml cri (2.15.11) - datadog-ci (0.5.0) - msgpack debase-ruby_core_source (3.2.3) debug_inspector (1.1.0) diff-lcs (1.5.0) diff --git a/gemfiles/ruby_2.5_contrib.gemfile.lock b/gemfiles/ruby_2.5_contrib.gemfile.lock index 756ee6834c0..48be1cae8e3 100644 --- a/gemfiles/ruby_2.5_contrib.gemfile.lock +++ b/gemfiles/ruby_2.5_contrib.gemfile.lock @@ -12,7 +12,6 @@ PATH remote: .. specs: ddtrace (1.18.0) - datadog-ci (~> 0.5.0) debase-ruby_core_source (= 3.2.3) libdatadog (~> 5.0.0.1.0) libddwaf (~> 1.14.0.0.0) @@ -46,8 +45,6 @@ GEM rexml cri (2.15.11) dalli (3.2.0) - datadog-ci (0.5.0) - msgpack debase-ruby_core_source (3.2.3) debug_inspector (1.1.0) diff-lcs (1.5.0) diff --git a/gemfiles/ruby_2.5_contrib_old.gemfile.lock b/gemfiles/ruby_2.5_contrib_old.gemfile.lock index e5bb6887499..2afbe4ad51e 100644 --- a/gemfiles/ruby_2.5_contrib_old.gemfile.lock +++ b/gemfiles/ruby_2.5_contrib_old.gemfile.lock @@ -12,7 +12,6 @@ PATH remote: .. specs: ddtrace (1.18.0) - datadog-ci (~> 0.5.0) debase-ruby_core_source (= 3.2.3) libdatadog (~> 5.0.0.1.0) libddwaf (~> 1.14.0.0.0) @@ -44,8 +43,6 @@ GEM cri (2.15.11) daemons (1.4.1) dalli (2.7.11) - datadog-ci (0.5.0) - msgpack debase-ruby_core_source (3.2.3) debug_inspector (1.1.0) diff-lcs (1.5.0) diff --git a/gemfiles/ruby_2.5_core_old.gemfile.lock b/gemfiles/ruby_2.5_core_old.gemfile.lock index 26498147c67..93e42bb50db 100644 --- a/gemfiles/ruby_2.5_core_old.gemfile.lock +++ b/gemfiles/ruby_2.5_core_old.gemfile.lock @@ -12,7 +12,6 @@ PATH remote: .. specs: ddtrace (1.18.0) - datadog-ci (~> 0.5.0) debase-ruby_core_source (= 3.2.3) libdatadog (~> 5.0.0.1.0) libddwaf (~> 1.14.0.0.0) @@ -39,8 +38,6 @@ GEM crack (0.4.5) rexml cri (2.15.11) - datadog-ci (0.5.0) - msgpack debase-ruby_core_source (3.2.3) debug_inspector (1.1.0) diff-lcs (1.5.0) diff --git a/gemfiles/ruby_2.5_elasticsearch_7.gemfile.lock b/gemfiles/ruby_2.5_elasticsearch_7.gemfile.lock index 7c8f4c021cb..9ebc70ccd75 100644 --- a/gemfiles/ruby_2.5_elasticsearch_7.gemfile.lock +++ b/gemfiles/ruby_2.5_elasticsearch_7.gemfile.lock @@ -12,7 +12,6 @@ PATH remote: .. specs: ddtrace (1.18.0) - datadog-ci (~> 0.5.0) debase-ruby_core_source (= 3.2.3) libdatadog (~> 5.0.0.1.0) libddwaf (~> 1.14.0.0.0) @@ -40,8 +39,6 @@ GEM crack (0.4.5) rexml cri (2.15.11) - datadog-ci (0.5.0) - msgpack debase-ruby_core_source (3.2.3) debug_inspector (1.1.0) diff-lcs (1.5.0) diff --git a/gemfiles/ruby_2.5_elasticsearch_8.gemfile.lock b/gemfiles/ruby_2.5_elasticsearch_8.gemfile.lock index 5d3dc5514a2..69c6100fa52 100644 --- a/gemfiles/ruby_2.5_elasticsearch_8.gemfile.lock +++ b/gemfiles/ruby_2.5_elasticsearch_8.gemfile.lock @@ -12,7 +12,6 @@ PATH remote: .. specs: ddtrace (1.18.0) - datadog-ci (~> 0.5.0) debase-ruby_core_source (= 3.2.3) libdatadog (~> 5.0.0.1.0) libddwaf (~> 1.14.0.0.0) @@ -40,8 +39,6 @@ GEM crack (0.4.5) rexml cri (2.15.11) - datadog-ci (0.5.0) - msgpack debase-ruby_core_source (3.2.3) debug_inspector (1.1.0) diff-lcs (1.5.0) diff --git a/gemfiles/ruby_2.5_hanami_1.gemfile.lock b/gemfiles/ruby_2.5_hanami_1.gemfile.lock index 1384b8d8fec..a887fba3880 100644 --- a/gemfiles/ruby_2.5_hanami_1.gemfile.lock +++ b/gemfiles/ruby_2.5_hanami_1.gemfile.lock @@ -12,7 +12,6 @@ PATH remote: .. specs: ddtrace (1.18.0) - datadog-ci (~> 0.5.0) debase-ruby_core_source (= 3.2.3) libdatadog (~> 5.0.0.1.0) libddwaf (~> 1.14.0.0.0) @@ -39,8 +38,6 @@ GEM crack (0.4.5) rexml cri (2.15.11) - datadog-ci (0.5.0) - msgpack debase-ruby_core_source (3.2.3) debug_inspector (1.1.0) diff-lcs (1.5.0) diff --git a/gemfiles/ruby_2.5_http.gemfile.lock b/gemfiles/ruby_2.5_http.gemfile.lock index 02cbcac6bd9..98b127e512d 100644 --- a/gemfiles/ruby_2.5_http.gemfile.lock +++ b/gemfiles/ruby_2.5_http.gemfile.lock @@ -12,7 +12,6 @@ PATH remote: .. specs: ddtrace (1.18.0) - datadog-ci (~> 0.5.0) debase-ruby_core_source (= 3.2.3) libdatadog (~> 5.0.0.1.0) libddwaf (~> 1.14.0.0.0) @@ -39,8 +38,6 @@ GEM crack (0.4.5) rexml cri (2.15.11) - datadog-ci (0.5.0) - msgpack debase-ruby_core_source (3.2.3) debug_inspector (1.1.0) diff-lcs (1.5.0) diff --git a/gemfiles/ruby_2.5_opensearch_2.gemfile.lock b/gemfiles/ruby_2.5_opensearch_2.gemfile.lock index 3e883f229f7..e666a964ed3 100644 --- a/gemfiles/ruby_2.5_opensearch_2.gemfile.lock +++ b/gemfiles/ruby_2.5_opensearch_2.gemfile.lock @@ -12,7 +12,6 @@ PATH remote: .. specs: ddtrace (1.18.0) - datadog-ci (~> 0.5.0) debase-ruby_core_source (= 3.2.3) libdatadog (~> 5.0.0.1.0) libddwaf (~> 1.14.0.0.0) @@ -40,8 +39,6 @@ GEM crack (0.4.5) rexml cri (2.15.11) - datadog-ci (0.5.0) - msgpack debase-ruby_core_source (3.2.3) debug_inspector (1.1.0) diff-lcs (1.5.0) diff --git a/gemfiles/ruby_2.5_opensearch_3.gemfile.lock b/gemfiles/ruby_2.5_opensearch_3.gemfile.lock index adbc5c7643a..3c4d474046c 100644 --- a/gemfiles/ruby_2.5_opensearch_3.gemfile.lock +++ b/gemfiles/ruby_2.5_opensearch_3.gemfile.lock @@ -12,7 +12,6 @@ PATH remote: .. specs: ddtrace (1.18.0) - datadog-ci (~> 0.5.0) debase-ruby_core_source (= 3.2.3) libdatadog (~> 5.0.0.1.0) libddwaf (~> 1.14.0.0.0) @@ -40,8 +39,6 @@ GEM crack (0.4.5) rexml cri (2.15.11) - datadog-ci (0.5.0) - msgpack debase-ruby_core_source (3.2.3) debug_inspector (1.1.0) diff-lcs (1.5.0) diff --git a/gemfiles/ruby_2.5_opentracing.gemfile.lock b/gemfiles/ruby_2.5_opentracing.gemfile.lock index 81bbf595ba6..ddde0584665 100644 --- a/gemfiles/ruby_2.5_opentracing.gemfile.lock +++ b/gemfiles/ruby_2.5_opentracing.gemfile.lock @@ -12,7 +12,6 @@ PATH remote: .. specs: ddtrace (1.18.0) - datadog-ci (~> 0.5.0) debase-ruby_core_source (= 3.2.3) libdatadog (~> 5.0.0.1.0) libddwaf (~> 1.14.0.0.0) @@ -40,8 +39,6 @@ GEM crack (0.4.5) rexml cri (2.15.11) - datadog-ci (0.5.0) - msgpack debase-ruby_core_source (3.2.3) debug_inspector (1.1.0) diff-lcs (1.5.0) diff --git a/gemfiles/ruby_2.5_rack_1.gemfile.lock b/gemfiles/ruby_2.5_rack_1.gemfile.lock index 80700f25029..e8949a64f06 100644 --- a/gemfiles/ruby_2.5_rack_1.gemfile.lock +++ b/gemfiles/ruby_2.5_rack_1.gemfile.lock @@ -12,7 +12,6 @@ PATH remote: .. specs: ddtrace (1.18.0) - datadog-ci (~> 0.5.0) debase-ruby_core_source (= 3.2.3) libdatadog (~> 5.0.0.1.0) libddwaf (~> 1.14.0.0.0) @@ -39,8 +38,6 @@ GEM crack (0.4.5) rexml cri (2.15.11) - datadog-ci (0.5.0) - msgpack debase-ruby_core_source (3.2.3) debug_inspector (1.1.0) diff-lcs (1.5.0) diff --git a/gemfiles/ruby_2.5_rack_2.gemfile.lock b/gemfiles/ruby_2.5_rack_2.gemfile.lock index baf85dc926c..cbb0a062f4c 100644 --- a/gemfiles/ruby_2.5_rack_2.gemfile.lock +++ b/gemfiles/ruby_2.5_rack_2.gemfile.lock @@ -12,7 +12,6 @@ PATH remote: .. specs: ddtrace (1.18.0) - datadog-ci (~> 0.5.0) debase-ruby_core_source (= 3.2.3) libdatadog (~> 5.0.0.1.0) libddwaf (~> 1.14.0.0.0) @@ -39,8 +38,6 @@ GEM crack (0.4.5) rexml cri (2.15.11) - datadog-ci (0.5.0) - msgpack debase-ruby_core_source (3.2.3) debug_inspector (1.1.0) diff-lcs (1.5.0) diff --git a/gemfiles/ruby_2.5_rack_3.gemfile.lock b/gemfiles/ruby_2.5_rack_3.gemfile.lock index b5ac685a2a4..d0222d2ccca 100644 --- a/gemfiles/ruby_2.5_rack_3.gemfile.lock +++ b/gemfiles/ruby_2.5_rack_3.gemfile.lock @@ -12,7 +12,6 @@ PATH remote: .. specs: ddtrace (1.18.0) - datadog-ci (~> 0.5.0) debase-ruby_core_source (= 3.2.3) libdatadog (~> 5.0.0.1.0) libddwaf (~> 1.14.0.0.0) @@ -39,8 +38,6 @@ GEM crack (0.4.5) rexml cri (2.15.11) - datadog-ci (0.5.0) - msgpack debase-ruby_core_source (3.2.3) debug_inspector (1.1.0) diff-lcs (1.5.0) diff --git a/gemfiles/ruby_2.5_rails5_mysql2.gemfile.lock b/gemfiles/ruby_2.5_rails5_mysql2.gemfile.lock index 5176aa60ee1..c22795f68e7 100644 --- a/gemfiles/ruby_2.5_rails5_mysql2.gemfile.lock +++ b/gemfiles/ruby_2.5_rails5_mysql2.gemfile.lock @@ -12,7 +12,6 @@ PATH remote: .. specs: ddtrace (1.18.0) - datadog-ci (~> 0.5.0) debase-ruby_core_source (= 3.2.3) libdatadog (~> 5.0.0.1.0) libddwaf (~> 1.14.0.0.0) @@ -82,8 +81,6 @@ GEM rexml crass (1.0.6) cri (2.15.11) - datadog-ci (0.5.0) - msgpack debase-ruby_core_source (3.2.3) debug_inspector (1.1.0) diff-lcs (1.5.0) diff --git a/gemfiles/ruby_2.5_rails5_postgres.gemfile.lock b/gemfiles/ruby_2.5_rails5_postgres.gemfile.lock index a68bc341c49..e3553b6ecbc 100644 --- a/gemfiles/ruby_2.5_rails5_postgres.gemfile.lock +++ b/gemfiles/ruby_2.5_rails5_postgres.gemfile.lock @@ -12,7 +12,6 @@ PATH remote: .. specs: ddtrace (1.18.0) - datadog-ci (~> 0.5.0) debase-ruby_core_source (= 3.2.3) libdatadog (~> 5.0.0.1.0) libddwaf (~> 1.14.0.0.0) @@ -82,8 +81,6 @@ GEM rexml crass (1.0.6) cri (2.15.11) - datadog-ci (0.5.0) - msgpack debase-ruby_core_source (3.2.3) debug_inspector (1.1.0) diff-lcs (1.5.0) diff --git a/gemfiles/ruby_2.5_rails5_postgres_redis.gemfile.lock b/gemfiles/ruby_2.5_rails5_postgres_redis.gemfile.lock index 9241398a93a..d14b9b9fee3 100644 --- a/gemfiles/ruby_2.5_rails5_postgres_redis.gemfile.lock +++ b/gemfiles/ruby_2.5_rails5_postgres_redis.gemfile.lock @@ -12,7 +12,6 @@ PATH remote: .. specs: ddtrace (1.18.0) - datadog-ci (~> 0.5.0) debase-ruby_core_source (= 3.2.3) libdatadog (~> 5.0.0.1.0) libddwaf (~> 1.14.0.0.0) @@ -83,8 +82,6 @@ GEM rexml crass (1.0.6) cri (2.15.11) - datadog-ci (0.5.0) - msgpack debase-ruby_core_source (3.2.3) debug_inspector (1.1.0) diff-lcs (1.5.0) diff --git a/gemfiles/ruby_2.5_rails5_postgres_redis_activesupport.gemfile.lock b/gemfiles/ruby_2.5_rails5_postgres_redis_activesupport.gemfile.lock index 66fdf224636..d258e0e6d65 100644 --- a/gemfiles/ruby_2.5_rails5_postgres_redis_activesupport.gemfile.lock +++ b/gemfiles/ruby_2.5_rails5_postgres_redis_activesupport.gemfile.lock @@ -12,7 +12,6 @@ PATH remote: .. specs: ddtrace (1.18.0) - datadog-ci (~> 0.5.0) debase-ruby_core_source (= 3.2.3) libdatadog (~> 5.0.0.1.0) libddwaf (~> 1.14.0.0.0) @@ -82,8 +81,6 @@ GEM rexml crass (1.0.6) cri (2.15.11) - datadog-ci (0.5.0) - msgpack debase-ruby_core_source (3.2.3) debug_inspector (1.1.0) diff-lcs (1.5.0) diff --git a/gemfiles/ruby_2.5_rails5_postgres_sidekiq.gemfile.lock b/gemfiles/ruby_2.5_rails5_postgres_sidekiq.gemfile.lock index 58cdabc529e..8744872c6fb 100644 --- a/gemfiles/ruby_2.5_rails5_postgres_sidekiq.gemfile.lock +++ b/gemfiles/ruby_2.5_rails5_postgres_sidekiq.gemfile.lock @@ -12,7 +12,6 @@ PATH remote: .. specs: ddtrace (1.18.0) - datadog-ci (~> 0.5.0) debase-ruby_core_source (= 3.2.3) libdatadog (~> 5.0.0.1.0) libddwaf (~> 1.14.0.0.0) @@ -83,8 +82,6 @@ GEM rexml crass (1.0.6) cri (2.15.11) - datadog-ci (0.5.0) - msgpack debase-ruby_core_source (3.2.3) debug_inspector (1.1.0) diff-lcs (1.5.0) diff --git a/gemfiles/ruby_2.5_rails5_semantic_logger.gemfile.lock b/gemfiles/ruby_2.5_rails5_semantic_logger.gemfile.lock index bad84b8ea67..9d1c110d4a7 100644 --- a/gemfiles/ruby_2.5_rails5_semantic_logger.gemfile.lock +++ b/gemfiles/ruby_2.5_rails5_semantic_logger.gemfile.lock @@ -12,7 +12,6 @@ PATH remote: .. specs: ddtrace (1.18.0) - datadog-ci (~> 0.5.0) debase-ruby_core_source (= 3.2.3) libdatadog (~> 5.0.0.1.0) libddwaf (~> 1.14.0.0.0) @@ -82,8 +81,6 @@ GEM rexml crass (1.0.6) cri (2.15.11) - datadog-ci (0.5.0) - msgpack debase-ruby_core_source (3.2.3) debug_inspector (1.1.0) diff-lcs (1.5.0) diff --git a/gemfiles/ruby_2.5_rails61_mysql2.gemfile.lock b/gemfiles/ruby_2.5_rails61_mysql2.gemfile.lock index e253a535a1d..8d82b811342 100644 --- a/gemfiles/ruby_2.5_rails61_mysql2.gemfile.lock +++ b/gemfiles/ruby_2.5_rails61_mysql2.gemfile.lock @@ -12,7 +12,6 @@ PATH remote: .. specs: ddtrace (1.18.0) - datadog-ci (~> 0.5.0) debase-ruby_core_source (= 3.2.3) libdatadog (~> 5.0.0.1.0) libddwaf (~> 1.14.0.0.0) @@ -99,8 +98,6 @@ GEM rexml crass (1.0.6) cri (2.15.11) - datadog-ci (0.5.0) - msgpack debase-ruby_core_source (3.2.3) debug_inspector (1.1.0) diff-lcs (1.5.0) diff --git a/gemfiles/ruby_2.5_rails61_postgres.gemfile.lock b/gemfiles/ruby_2.5_rails61_postgres.gemfile.lock index e5a8a02881a..82918e6ebdd 100644 --- a/gemfiles/ruby_2.5_rails61_postgres.gemfile.lock +++ b/gemfiles/ruby_2.5_rails61_postgres.gemfile.lock @@ -12,7 +12,6 @@ PATH remote: .. specs: ddtrace (1.18.0) - datadog-ci (~> 0.5.0) debase-ruby_core_source (= 3.2.3) libdatadog (~> 5.0.0.1.0) libddwaf (~> 1.14.0.0.0) @@ -99,8 +98,6 @@ GEM rexml crass (1.0.6) cri (2.15.11) - datadog-ci (0.5.0) - msgpack debase-ruby_core_source (3.2.3) debug_inspector (1.1.0) diff-lcs (1.5.0) diff --git a/gemfiles/ruby_2.5_rails61_postgres_redis.gemfile.lock b/gemfiles/ruby_2.5_rails61_postgres_redis.gemfile.lock index a8ed82d6886..196a930eb21 100644 --- a/gemfiles/ruby_2.5_rails61_postgres_redis.gemfile.lock +++ b/gemfiles/ruby_2.5_rails61_postgres_redis.gemfile.lock @@ -12,7 +12,6 @@ PATH remote: .. specs: ddtrace (1.18.0) - datadog-ci (~> 0.5.0) debase-ruby_core_source (= 3.2.3) libdatadog (~> 5.0.0.1.0) libddwaf (~> 1.14.0.0.0) @@ -100,8 +99,6 @@ GEM rexml crass (1.0.6) cri (2.15.11) - datadog-ci (0.5.0) - msgpack debase-ruby_core_source (3.2.3) debug_inspector (1.1.0) diff-lcs (1.5.0) diff --git a/gemfiles/ruby_2.5_rails61_postgres_sidekiq.gemfile.lock b/gemfiles/ruby_2.5_rails61_postgres_sidekiq.gemfile.lock index c2e8a29ac06..024af928977 100644 --- a/gemfiles/ruby_2.5_rails61_postgres_sidekiq.gemfile.lock +++ b/gemfiles/ruby_2.5_rails61_postgres_sidekiq.gemfile.lock @@ -12,7 +12,6 @@ PATH remote: .. specs: ddtrace (1.18.0) - datadog-ci (~> 0.5.0) debase-ruby_core_source (= 3.2.3) libdatadog (~> 5.0.0.1.0) libddwaf (~> 1.14.0.0.0) @@ -100,8 +99,6 @@ GEM rexml crass (1.0.6) cri (2.15.11) - datadog-ci (0.5.0) - msgpack debase-ruby_core_source (3.2.3) debug_inspector (1.1.0) diff-lcs (1.5.0) diff --git a/gemfiles/ruby_2.5_rails61_semantic_logger.gemfile.lock b/gemfiles/ruby_2.5_rails61_semantic_logger.gemfile.lock index 1fb8bb1edfc..be7bcb1a30a 100644 --- a/gemfiles/ruby_2.5_rails61_semantic_logger.gemfile.lock +++ b/gemfiles/ruby_2.5_rails61_semantic_logger.gemfile.lock @@ -12,7 +12,6 @@ PATH remote: .. specs: ddtrace (1.18.0) - datadog-ci (~> 0.5.0) debase-ruby_core_source (= 3.2.3) libdatadog (~> 5.0.0.1.0) libddwaf (~> 1.14.0.0.0) @@ -99,8 +98,6 @@ GEM rexml crass (1.0.6) cri (2.15.11) - datadog-ci (0.5.0) - msgpack debase-ruby_core_source (3.2.3) debug_inspector (1.1.0) diff-lcs (1.5.0) diff --git a/gemfiles/ruby_2.5_rails6_mysql2.gemfile.lock b/gemfiles/ruby_2.5_rails6_mysql2.gemfile.lock index 699f746b429..3b661681393 100644 --- a/gemfiles/ruby_2.5_rails6_mysql2.gemfile.lock +++ b/gemfiles/ruby_2.5_rails6_mysql2.gemfile.lock @@ -12,7 +12,6 @@ PATH remote: .. specs: ddtrace (1.18.0) - datadog-ci (~> 0.5.0) debase-ruby_core_source (= 3.2.3) libdatadog (~> 5.0.0.1.0) libddwaf (~> 1.14.0.0.0) @@ -95,8 +94,6 @@ GEM rexml crass (1.0.6) cri (2.15.11) - datadog-ci (0.5.0) - msgpack debase-ruby_core_source (3.2.3) debug_inspector (1.1.0) diff-lcs (1.5.0) diff --git a/gemfiles/ruby_2.5_rails6_postgres.gemfile.lock b/gemfiles/ruby_2.5_rails6_postgres.gemfile.lock index 81a32bacdf1..fd9e9f3647e 100644 --- a/gemfiles/ruby_2.5_rails6_postgres.gemfile.lock +++ b/gemfiles/ruby_2.5_rails6_postgres.gemfile.lock @@ -12,7 +12,6 @@ PATH remote: .. specs: ddtrace (1.18.0) - datadog-ci (~> 0.5.0) debase-ruby_core_source (= 3.2.3) libdatadog (~> 5.0.0.1.0) libddwaf (~> 1.14.0.0.0) @@ -95,8 +94,6 @@ GEM rexml crass (1.0.6) cri (2.15.11) - datadog-ci (0.5.0) - msgpack debase-ruby_core_source (3.2.3) debug_inspector (1.1.0) diff-lcs (1.5.0) diff --git a/gemfiles/ruby_2.5_rails6_postgres_redis.gemfile.lock b/gemfiles/ruby_2.5_rails6_postgres_redis.gemfile.lock index 627bdd21f4c..b416430dee8 100644 --- a/gemfiles/ruby_2.5_rails6_postgres_redis.gemfile.lock +++ b/gemfiles/ruby_2.5_rails6_postgres_redis.gemfile.lock @@ -12,7 +12,6 @@ PATH remote: .. specs: ddtrace (1.18.0) - datadog-ci (~> 0.5.0) debase-ruby_core_source (= 3.2.3) libdatadog (~> 5.0.0.1.0) libddwaf (~> 1.14.0.0.0) @@ -96,8 +95,6 @@ GEM rexml crass (1.0.6) cri (2.15.11) - datadog-ci (0.5.0) - msgpack debase-ruby_core_source (3.2.3) debug_inspector (1.1.0) diff-lcs (1.5.0) diff --git a/gemfiles/ruby_2.5_rails6_postgres_redis_activesupport.gemfile.lock b/gemfiles/ruby_2.5_rails6_postgres_redis_activesupport.gemfile.lock index d6d7042f09b..513f0857ed3 100644 --- a/gemfiles/ruby_2.5_rails6_postgres_redis_activesupport.gemfile.lock +++ b/gemfiles/ruby_2.5_rails6_postgres_redis_activesupport.gemfile.lock @@ -12,7 +12,6 @@ PATH remote: .. specs: ddtrace (1.18.0) - datadog-ci (~> 0.5.0) debase-ruby_core_source (= 3.2.3) libdatadog (~> 5.0.0.1.0) libddwaf (~> 1.14.0.0.0) @@ -95,8 +94,6 @@ GEM rexml crass (1.0.6) cri (2.15.11) - datadog-ci (0.5.0) - msgpack debase-ruby_core_source (3.2.3) debug_inspector (1.1.0) diff-lcs (1.5.0) diff --git a/gemfiles/ruby_2.5_rails6_postgres_sidekiq.gemfile.lock b/gemfiles/ruby_2.5_rails6_postgres_sidekiq.gemfile.lock index d373088e1dd..6f062b96ff2 100644 --- a/gemfiles/ruby_2.5_rails6_postgres_sidekiq.gemfile.lock +++ b/gemfiles/ruby_2.5_rails6_postgres_sidekiq.gemfile.lock @@ -12,7 +12,6 @@ PATH remote: .. specs: ddtrace (1.18.0) - datadog-ci (~> 0.5.0) debase-ruby_core_source (= 3.2.3) libdatadog (~> 5.0.0.1.0) libddwaf (~> 1.14.0.0.0) @@ -96,8 +95,6 @@ GEM rexml crass (1.0.6) cri (2.15.11) - datadog-ci (0.5.0) - msgpack debase-ruby_core_source (3.2.3) debug_inspector (1.1.0) diff-lcs (1.5.0) diff --git a/gemfiles/ruby_2.5_rails6_semantic_logger.gemfile.lock b/gemfiles/ruby_2.5_rails6_semantic_logger.gemfile.lock index ef9f451905e..33df9799d70 100644 --- a/gemfiles/ruby_2.5_rails6_semantic_logger.gemfile.lock +++ b/gemfiles/ruby_2.5_rails6_semantic_logger.gemfile.lock @@ -12,7 +12,6 @@ PATH remote: .. specs: ddtrace (1.18.0) - datadog-ci (~> 0.5.0) debase-ruby_core_source (= 3.2.3) libdatadog (~> 5.0.0.1.0) libddwaf (~> 1.14.0.0.0) @@ -95,8 +94,6 @@ GEM rexml crass (1.0.6) cri (2.15.11) - datadog-ci (0.5.0) - msgpack debase-ruby_core_source (3.2.3) debug_inspector (1.1.0) diff-lcs (1.5.0) diff --git a/gemfiles/ruby_2.5_redis_3.gemfile.lock b/gemfiles/ruby_2.5_redis_3.gemfile.lock index 8a010dfe542..5cc1647da7d 100644 --- a/gemfiles/ruby_2.5_redis_3.gemfile.lock +++ b/gemfiles/ruby_2.5_redis_3.gemfile.lock @@ -12,7 +12,6 @@ PATH remote: .. specs: ddtrace (1.18.0) - datadog-ci (~> 0.5.0) debase-ruby_core_source (= 3.2.3) libdatadog (~> 5.0.0.1.0) libddwaf (~> 1.14.0.0.0) @@ -39,8 +38,6 @@ GEM crack (0.4.5) rexml cri (2.15.11) - datadog-ci (0.5.0) - msgpack debase-ruby_core_source (3.2.3) debug_inspector (1.1.0) diff-lcs (1.5.0) diff --git a/gemfiles/ruby_2.5_redis_4.gemfile.lock b/gemfiles/ruby_2.5_redis_4.gemfile.lock index 346da13f471..bc78d595c5a 100644 --- a/gemfiles/ruby_2.5_redis_4.gemfile.lock +++ b/gemfiles/ruby_2.5_redis_4.gemfile.lock @@ -12,7 +12,6 @@ PATH remote: .. specs: ddtrace (1.18.0) - datadog-ci (~> 0.5.0) debase-ruby_core_source (= 3.2.3) libdatadog (~> 5.0.0.1.0) libddwaf (~> 1.14.0.0.0) @@ -39,8 +38,6 @@ GEM crack (0.4.5) rexml cri (2.15.11) - datadog-ci (0.5.0) - msgpack debase-ruby_core_source (3.2.3) debug_inspector (1.1.0) diff-lcs (1.5.0) diff --git a/gemfiles/ruby_2.5_redis_5.gemfile.lock b/gemfiles/ruby_2.5_redis_5.gemfile.lock index ff507d2f3aa..95eeb707784 100644 --- a/gemfiles/ruby_2.5_redis_5.gemfile.lock +++ b/gemfiles/ruby_2.5_redis_5.gemfile.lock @@ -12,7 +12,6 @@ PATH remote: .. specs: ddtrace (1.18.0) - datadog-ci (~> 0.5.0) debase-ruby_core_source (= 3.2.3) libdatadog (~> 5.0.0.1.0) libddwaf (~> 1.14.0.0.0) @@ -40,8 +39,6 @@ GEM crack (0.4.5) rexml cri (2.15.11) - datadog-ci (0.5.0) - msgpack debase-ruby_core_source (3.2.3) debug_inspector (1.1.0) diff-lcs (1.5.0) diff --git a/gemfiles/ruby_2.5_relational_db.gemfile.lock b/gemfiles/ruby_2.5_relational_db.gemfile.lock index d7aa2fc8129..d8032b257be 100644 --- a/gemfiles/ruby_2.5_relational_db.gemfile.lock +++ b/gemfiles/ruby_2.5_relational_db.gemfile.lock @@ -12,7 +12,6 @@ PATH remote: .. specs: ddtrace (1.18.0) - datadog-ci (~> 0.5.0) debase-ruby_core_source (= 3.2.3) libdatadog (~> 5.0.0.1.0) libddwaf (~> 1.14.0.0.0) @@ -51,8 +50,6 @@ GEM crack (0.4.5) rexml cri (2.15.11) - datadog-ci (0.5.0) - msgpack debase-ruby_core_source (3.2.3) debug_inspector (1.1.0) delayed_job (4.1.11) diff --git a/gemfiles/ruby_2.5_resque2_redis3.gemfile.lock b/gemfiles/ruby_2.5_resque2_redis3.gemfile.lock index bfb7d3c4844..65bdf55c69f 100644 --- a/gemfiles/ruby_2.5_resque2_redis3.gemfile.lock +++ b/gemfiles/ruby_2.5_resque2_redis3.gemfile.lock @@ -12,7 +12,6 @@ PATH remote: .. specs: ddtrace (1.18.0) - datadog-ci (~> 0.5.0) debase-ruby_core_source (= 3.2.3) libdatadog (~> 5.0.0.1.0) libddwaf (~> 1.14.0.0.0) @@ -39,8 +38,6 @@ GEM crack (0.4.5) rexml cri (2.15.11) - datadog-ci (0.5.0) - msgpack debase-ruby_core_source (3.2.3) debug_inspector (1.1.0) diff-lcs (1.5.0) diff --git a/gemfiles/ruby_2.5_resque2_redis4.gemfile.lock b/gemfiles/ruby_2.5_resque2_redis4.gemfile.lock index 338fd650533..7b7e12933b0 100644 --- a/gemfiles/ruby_2.5_resque2_redis4.gemfile.lock +++ b/gemfiles/ruby_2.5_resque2_redis4.gemfile.lock @@ -12,7 +12,6 @@ PATH remote: .. specs: ddtrace (1.18.0) - datadog-ci (~> 0.5.0) debase-ruby_core_source (= 3.2.3) libdatadog (~> 5.0.0.1.0) libddwaf (~> 1.14.0.0.0) @@ -40,8 +39,6 @@ GEM crack (0.4.5) rexml cri (2.15.11) - datadog-ci (0.5.0) - msgpack debase-ruby_core_source (3.2.3) debug_inspector (1.1.0) diff-lcs (1.5.0) diff --git a/gemfiles/ruby_2.5_sinatra.gemfile.lock b/gemfiles/ruby_2.5_sinatra.gemfile.lock index d7cb9c55413..ffee70b7777 100644 --- a/gemfiles/ruby_2.5_sinatra.gemfile.lock +++ b/gemfiles/ruby_2.5_sinatra.gemfile.lock @@ -12,7 +12,6 @@ PATH remote: .. specs: ddtrace (1.18.0) - datadog-ci (~> 0.5.0) debase-ruby_core_source (= 3.2.3) libdatadog (~> 5.0.0.1.0) libddwaf (~> 1.14.0.0.0) @@ -39,8 +38,6 @@ GEM crack (0.4.5) rexml cri (2.15.11) - datadog-ci (0.5.0) - msgpack debase-ruby_core_source (3.2.3) debug_inspector (1.1.0) diff-lcs (1.5.0) diff --git a/gemfiles/ruby_2.6_activesupport.gemfile.lock b/gemfiles/ruby_2.6_activesupport.gemfile.lock index 54e555f2890..c153ba10949 100644 --- a/gemfiles/ruby_2.6_activesupport.gemfile.lock +++ b/gemfiles/ruby_2.6_activesupport.gemfile.lock @@ -12,7 +12,6 @@ PATH remote: .. specs: ddtrace (1.18.0) - datadog-ci (~> 0.5.0) debase-ruby_core_source (= 3.2.3) libdatadog (~> 5.0.0.1.0) libddwaf (~> 1.14.0.0.0) @@ -70,8 +69,6 @@ GEM rexml crass (1.0.6) cri (2.15.11) - datadog-ci (0.5.0) - msgpack debase-ruby_core_source (3.2.3) debug_inspector (1.1.0) diff-lcs (1.5.0) diff --git a/gemfiles/ruby_2.6_aws.gemfile.lock b/gemfiles/ruby_2.6_aws.gemfile.lock index dc6e817efcc..87a3d933e9f 100644 --- a/gemfiles/ruby_2.6_aws.gemfile.lock +++ b/gemfiles/ruby_2.6_aws.gemfile.lock @@ -12,7 +12,6 @@ PATH remote: .. specs: ddtrace (1.18.0) - datadog-ci (~> 0.5.0) debase-ruby_core_source (= 3.2.3) libdatadog (~> 5.0.0.1.0) libddwaf (~> 1.14.0.0.0) @@ -1462,8 +1461,6 @@ GEM crack (0.4.5) rexml cri (2.15.11) - datadog-ci (0.5.0) - msgpack debase-ruby_core_source (3.2.3) debug_inspector (1.1.0) diff-lcs (1.5.0) diff --git a/gemfiles/ruby_2.6_contrib.gemfile.lock b/gemfiles/ruby_2.6_contrib.gemfile.lock index 33f7055a34e..545782c450f 100644 --- a/gemfiles/ruby_2.6_contrib.gemfile.lock +++ b/gemfiles/ruby_2.6_contrib.gemfile.lock @@ -12,7 +12,6 @@ PATH remote: .. specs: ddtrace (1.18.0) - datadog-ci (~> 0.5.0) debase-ruby_core_source (= 3.2.3) libdatadog (~> 5.0.0.1.0) libddwaf (~> 1.14.0.0.0) @@ -48,8 +47,6 @@ GEM rexml cri (2.15.11) dalli (3.2.4) - datadog-ci (0.5.0) - msgpack debase-ruby_core_source (3.2.3) debug_inspector (1.1.0) diff-lcs (1.5.0) diff --git a/gemfiles/ruby_2.6_contrib_old.gemfile.lock b/gemfiles/ruby_2.6_contrib_old.gemfile.lock index f1efb40ec1f..5939b8c0316 100644 --- a/gemfiles/ruby_2.6_contrib_old.gemfile.lock +++ b/gemfiles/ruby_2.6_contrib_old.gemfile.lock @@ -12,7 +12,6 @@ PATH remote: .. specs: ddtrace (1.18.0) - datadog-ci (~> 0.5.0) debase-ruby_core_source (= 3.2.3) libdatadog (~> 5.0.0.1.0) libddwaf (~> 1.14.0.0.0) @@ -46,8 +45,6 @@ GEM cri (2.15.11) daemons (1.4.1) dalli (2.7.11) - datadog-ci (0.5.0) - msgpack debase-ruby_core_source (3.2.3) debug_inspector (1.1.0) diff-lcs (1.5.0) diff --git a/gemfiles/ruby_2.6_core_old.gemfile.lock b/gemfiles/ruby_2.6_core_old.gemfile.lock index 947e41fcd60..18747df881d 100644 --- a/gemfiles/ruby_2.6_core_old.gemfile.lock +++ b/gemfiles/ruby_2.6_core_old.gemfile.lock @@ -12,7 +12,6 @@ PATH remote: .. specs: ddtrace (1.18.0) - datadog-ci (~> 0.5.0) debase-ruby_core_source (= 3.2.3) libdatadog (~> 5.0.0.1.0) libddwaf (~> 1.14.0.0.0) @@ -41,8 +40,6 @@ GEM crack (0.4.5) rexml cri (2.15.11) - datadog-ci (0.5.0) - msgpack debase-ruby_core_source (3.2.3) debug_inspector (1.1.0) diff-lcs (1.5.0) diff --git a/gemfiles/ruby_2.6_elasticsearch_7.gemfile.lock b/gemfiles/ruby_2.6_elasticsearch_7.gemfile.lock index b12d4890d1f..986d46df1ba 100644 --- a/gemfiles/ruby_2.6_elasticsearch_7.gemfile.lock +++ b/gemfiles/ruby_2.6_elasticsearch_7.gemfile.lock @@ -12,7 +12,6 @@ PATH remote: .. specs: ddtrace (1.18.0) - datadog-ci (~> 0.5.0) debase-ruby_core_source (= 3.2.3) libdatadog (~> 5.0.0.1.0) libddwaf (~> 1.14.0.0.0) @@ -42,8 +41,6 @@ GEM crack (0.4.5) rexml cri (2.15.11) - datadog-ci (0.5.0) - msgpack debase-ruby_core_source (3.2.3) debug_inspector (1.1.0) diff-lcs (1.5.0) diff --git a/gemfiles/ruby_2.6_elasticsearch_8.gemfile.lock b/gemfiles/ruby_2.6_elasticsearch_8.gemfile.lock index 442c930fada..d88034f1d71 100644 --- a/gemfiles/ruby_2.6_elasticsearch_8.gemfile.lock +++ b/gemfiles/ruby_2.6_elasticsearch_8.gemfile.lock @@ -12,7 +12,6 @@ PATH remote: .. specs: ddtrace (1.18.0) - datadog-ci (~> 0.5.0) debase-ruby_core_source (= 3.2.3) libdatadog (~> 5.0.0.1.0) libddwaf (~> 1.14.0.0.0) @@ -43,8 +42,6 @@ GEM crack (0.4.5) rexml cri (2.15.11) - datadog-ci (0.5.0) - msgpack debase-ruby_core_source (3.2.3) debug_inspector (1.1.0) diff-lcs (1.5.0) diff --git a/gemfiles/ruby_2.6_hanami_1.gemfile.lock b/gemfiles/ruby_2.6_hanami_1.gemfile.lock index 1ce08aafc3a..53d911b1e9b 100644 --- a/gemfiles/ruby_2.6_hanami_1.gemfile.lock +++ b/gemfiles/ruby_2.6_hanami_1.gemfile.lock @@ -12,7 +12,6 @@ PATH remote: .. specs: ddtrace (1.18.0) - datadog-ci (~> 0.5.0) debase-ruby_core_source (= 3.2.3) libdatadog (~> 5.0.0.1.0) libddwaf (~> 1.14.0.0.0) @@ -41,8 +40,6 @@ GEM crack (0.4.5) rexml cri (2.15.11) - datadog-ci (0.5.0) - msgpack date (3.3.3) debase-ruby_core_source (3.2.3) debug_inspector (1.1.0) diff --git a/gemfiles/ruby_2.6_http.gemfile.lock b/gemfiles/ruby_2.6_http.gemfile.lock index abf53eab6eb..7cb071989df 100644 --- a/gemfiles/ruby_2.6_http.gemfile.lock +++ b/gemfiles/ruby_2.6_http.gemfile.lock @@ -12,7 +12,6 @@ PATH remote: .. specs: ddtrace (1.18.0) - datadog-ci (~> 0.5.0) debase-ruby_core_source (= 3.2.3) libdatadog (~> 5.0.0.1.0) libddwaf (~> 1.14.0.0.0) @@ -41,8 +40,6 @@ GEM crack (0.4.5) rexml cri (2.15.11) - datadog-ci (0.5.0) - msgpack debase-ruby_core_source (3.2.3) debug_inspector (1.1.0) diff-lcs (1.5.0) diff --git a/gemfiles/ruby_2.6_opensearch_2.gemfile.lock b/gemfiles/ruby_2.6_opensearch_2.gemfile.lock index 3a1e77c70c2..af1ea7ca0c8 100644 --- a/gemfiles/ruby_2.6_opensearch_2.gemfile.lock +++ b/gemfiles/ruby_2.6_opensearch_2.gemfile.lock @@ -12,7 +12,6 @@ PATH remote: .. specs: ddtrace (1.18.0) - datadog-ci (~> 0.5.0) debase-ruby_core_source (= 3.2.3) libdatadog (~> 5.0.0.1.0) libddwaf (~> 1.14.0.0.0) @@ -43,8 +42,6 @@ GEM crack (0.4.5) rexml cri (2.15.11) - datadog-ci (0.5.0) - msgpack debase-ruby_core_source (3.2.3) debug_inspector (1.1.0) diff-lcs (1.5.0) diff --git a/gemfiles/ruby_2.6_opensearch_3.gemfile.lock b/gemfiles/ruby_2.6_opensearch_3.gemfile.lock index 27b7634dc97..27e9bd4f770 100644 --- a/gemfiles/ruby_2.6_opensearch_3.gemfile.lock +++ b/gemfiles/ruby_2.6_opensearch_3.gemfile.lock @@ -12,7 +12,6 @@ PATH remote: .. specs: ddtrace (1.18.0) - datadog-ci (~> 0.5.0) debase-ruby_core_source (= 3.2.3) libdatadog (~> 5.0.0.1.0) libddwaf (~> 1.14.0.0.0) @@ -43,8 +42,6 @@ GEM crack (0.4.5) rexml cri (2.15.11) - datadog-ci (0.5.0) - msgpack debase-ruby_core_source (3.2.3) debug_inspector (1.1.0) diff-lcs (1.5.0) diff --git a/gemfiles/ruby_2.6_opentelemetry.gemfile.lock b/gemfiles/ruby_2.6_opentelemetry.gemfile.lock index 596c7d2960d..2ade69cfae4 100755 --- a/gemfiles/ruby_2.6_opentelemetry.gemfile.lock +++ b/gemfiles/ruby_2.6_opentelemetry.gemfile.lock @@ -12,7 +12,6 @@ PATH remote: .. specs: ddtrace (1.18.0) - datadog-ci (~> 0.5.0) debase-ruby_core_source (= 3.2.3) libdatadog (~> 5.0.0.1.0) libddwaf (~> 1.14.0.0.0) @@ -41,8 +40,6 @@ GEM crack (0.4.5) rexml cri (2.15.11) - datadog-ci (0.5.0) - msgpack debase-ruby_core_source (3.2.3) debug_inspector (1.1.0) diff-lcs (1.5.0) diff --git a/gemfiles/ruby_2.6_opentracing.gemfile.lock b/gemfiles/ruby_2.6_opentracing.gemfile.lock index 49735aacf6e..89fe7f3efea 100644 --- a/gemfiles/ruby_2.6_opentracing.gemfile.lock +++ b/gemfiles/ruby_2.6_opentracing.gemfile.lock @@ -12,7 +12,6 @@ PATH remote: .. specs: ddtrace (1.18.0) - datadog-ci (~> 0.5.0) debase-ruby_core_source (= 3.2.3) libdatadog (~> 5.0.0.1.0) libddwaf (~> 1.14.0.0.0) @@ -42,8 +41,6 @@ GEM crack (0.4.5) rexml cri (2.15.11) - datadog-ci (0.5.0) - msgpack debase-ruby_core_source (3.2.3) debug_inspector (1.1.0) diff-lcs (1.5.0) diff --git a/gemfiles/ruby_2.6_rack_1.gemfile.lock b/gemfiles/ruby_2.6_rack_1.gemfile.lock index c4557d4b25c..04898490db1 100644 --- a/gemfiles/ruby_2.6_rack_1.gemfile.lock +++ b/gemfiles/ruby_2.6_rack_1.gemfile.lock @@ -12,7 +12,6 @@ PATH remote: .. specs: ddtrace (1.18.0) - datadog-ci (~> 0.5.0) debase-ruby_core_source (= 3.2.3) libdatadog (~> 5.0.0.1.0) libddwaf (~> 1.14.0.0.0) @@ -41,8 +40,6 @@ GEM crack (0.4.5) rexml cri (2.15.11) - datadog-ci (0.5.0) - msgpack debase-ruby_core_source (3.2.3) debug_inspector (1.1.0) diff-lcs (1.5.0) diff --git a/gemfiles/ruby_2.6_rack_2.gemfile.lock b/gemfiles/ruby_2.6_rack_2.gemfile.lock index be84530d69d..5a3b11b35d1 100644 --- a/gemfiles/ruby_2.6_rack_2.gemfile.lock +++ b/gemfiles/ruby_2.6_rack_2.gemfile.lock @@ -12,7 +12,6 @@ PATH remote: .. specs: ddtrace (1.18.0) - datadog-ci (~> 0.5.0) debase-ruby_core_source (= 3.2.3) libdatadog (~> 5.0.0.1.0) libddwaf (~> 1.14.0.0.0) @@ -41,8 +40,6 @@ GEM crack (0.4.5) rexml cri (2.15.11) - datadog-ci (0.5.0) - msgpack debase-ruby_core_source (3.2.3) debug_inspector (1.1.0) diff-lcs (1.5.0) diff --git a/gemfiles/ruby_2.6_rack_3.gemfile.lock b/gemfiles/ruby_2.6_rack_3.gemfile.lock index efc8c947939..be22f1bf1d6 100644 --- a/gemfiles/ruby_2.6_rack_3.gemfile.lock +++ b/gemfiles/ruby_2.6_rack_3.gemfile.lock @@ -12,7 +12,6 @@ PATH remote: .. specs: ddtrace (1.18.0) - datadog-ci (~> 0.5.0) debase-ruby_core_source (= 3.2.3) libdatadog (~> 5.0.0.1.0) libddwaf (~> 1.14.0.0.0) @@ -41,8 +40,6 @@ GEM crack (0.4.5) rexml cri (2.15.11) - datadog-ci (0.5.0) - msgpack debase-ruby_core_source (3.2.3) debug_inspector (1.1.0) diff-lcs (1.5.0) diff --git a/gemfiles/ruby_2.6_rails5_mysql2.gemfile.lock b/gemfiles/ruby_2.6_rails5_mysql2.gemfile.lock index 601ee0eb381..fc871251d0a 100644 --- a/gemfiles/ruby_2.6_rails5_mysql2.gemfile.lock +++ b/gemfiles/ruby_2.6_rails5_mysql2.gemfile.lock @@ -12,7 +12,6 @@ PATH remote: .. specs: ddtrace (1.18.0) - datadog-ci (~> 0.5.0) debase-ruby_core_source (= 3.2.3) libdatadog (~> 5.0.0.1.0) libddwaf (~> 1.14.0.0.0) @@ -84,8 +83,6 @@ GEM rexml crass (1.0.6) cri (2.15.11) - datadog-ci (0.5.0) - msgpack date (3.3.3) debase-ruby_core_source (3.2.3) debug_inspector (1.1.0) diff --git a/gemfiles/ruby_2.6_rails5_postgres.gemfile.lock b/gemfiles/ruby_2.6_rails5_postgres.gemfile.lock index 7dce83fa149..26ba37ec83a 100644 --- a/gemfiles/ruby_2.6_rails5_postgres.gemfile.lock +++ b/gemfiles/ruby_2.6_rails5_postgres.gemfile.lock @@ -12,7 +12,6 @@ PATH remote: .. specs: ddtrace (1.18.0) - datadog-ci (~> 0.5.0) debase-ruby_core_source (= 3.2.3) libdatadog (~> 5.0.0.1.0) libddwaf (~> 1.14.0.0.0) @@ -84,8 +83,6 @@ GEM rexml crass (1.0.6) cri (2.15.11) - datadog-ci (0.5.0) - msgpack date (3.3.3) debase-ruby_core_source (3.2.3) debug_inspector (1.1.0) diff --git a/gemfiles/ruby_2.6_rails5_postgres_redis.gemfile.lock b/gemfiles/ruby_2.6_rails5_postgres_redis.gemfile.lock index fa43c380c8a..10022b5a4e0 100644 --- a/gemfiles/ruby_2.6_rails5_postgres_redis.gemfile.lock +++ b/gemfiles/ruby_2.6_rails5_postgres_redis.gemfile.lock @@ -12,7 +12,6 @@ PATH remote: .. specs: ddtrace (1.18.0) - datadog-ci (~> 0.5.0) debase-ruby_core_source (= 3.2.3) libdatadog (~> 5.0.0.1.0) libddwaf (~> 1.14.0.0.0) @@ -84,8 +83,6 @@ GEM rexml crass (1.0.6) cri (2.15.11) - datadog-ci (0.5.0) - msgpack date (3.3.3) debase-ruby_core_source (3.2.3) debug_inspector (1.1.0) diff --git a/gemfiles/ruby_2.6_rails5_postgres_redis_activesupport.gemfile.lock b/gemfiles/ruby_2.6_rails5_postgres_redis_activesupport.gemfile.lock index d4ab4c1c0fd..9033976d264 100644 --- a/gemfiles/ruby_2.6_rails5_postgres_redis_activesupport.gemfile.lock +++ b/gemfiles/ruby_2.6_rails5_postgres_redis_activesupport.gemfile.lock @@ -12,7 +12,6 @@ PATH remote: .. specs: ddtrace (1.18.0) - datadog-ci (~> 0.5.0) debase-ruby_core_source (= 3.2.3) libdatadog (~> 5.0.0.1.0) libddwaf (~> 1.14.0.0.0) @@ -84,8 +83,6 @@ GEM rexml crass (1.0.6) cri (2.15.11) - datadog-ci (0.5.0) - msgpack date (3.3.3) debase-ruby_core_source (3.2.3) debug_inspector (1.1.0) diff --git a/gemfiles/ruby_2.6_rails5_postgres_sidekiq.gemfile.lock b/gemfiles/ruby_2.6_rails5_postgres_sidekiq.gemfile.lock index 20ce0cb24e3..981592bf9f4 100644 --- a/gemfiles/ruby_2.6_rails5_postgres_sidekiq.gemfile.lock +++ b/gemfiles/ruby_2.6_rails5_postgres_sidekiq.gemfile.lock @@ -12,7 +12,6 @@ PATH remote: .. specs: ddtrace (1.18.0) - datadog-ci (~> 0.5.0) debase-ruby_core_source (= 3.2.3) libdatadog (~> 5.0.0.1.0) libddwaf (~> 1.14.0.0.0) @@ -85,8 +84,6 @@ GEM rexml crass (1.0.6) cri (2.15.11) - datadog-ci (0.5.0) - msgpack date (3.3.3) debase-ruby_core_source (3.2.3) debug_inspector (1.1.0) diff --git a/gemfiles/ruby_2.6_rails5_semantic_logger.gemfile.lock b/gemfiles/ruby_2.6_rails5_semantic_logger.gemfile.lock index 94a878b7c9a..72c84feacd3 100644 --- a/gemfiles/ruby_2.6_rails5_semantic_logger.gemfile.lock +++ b/gemfiles/ruby_2.6_rails5_semantic_logger.gemfile.lock @@ -12,7 +12,6 @@ PATH remote: .. specs: ddtrace (1.18.0) - datadog-ci (~> 0.5.0) debase-ruby_core_source (= 3.2.3) libdatadog (~> 5.0.0.1.0) libddwaf (~> 1.14.0.0.0) @@ -84,8 +83,6 @@ GEM rexml crass (1.0.6) cri (2.15.11) - datadog-ci (0.5.0) - msgpack date (3.3.3) debase-ruby_core_source (3.2.3) debug_inspector (1.1.0) diff --git a/gemfiles/ruby_2.6_rails61_mysql2.gemfile.lock b/gemfiles/ruby_2.6_rails61_mysql2.gemfile.lock index 9cf58bf1586..87b86cf3439 100644 --- a/gemfiles/ruby_2.6_rails61_mysql2.gemfile.lock +++ b/gemfiles/ruby_2.6_rails61_mysql2.gemfile.lock @@ -12,7 +12,6 @@ PATH remote: .. specs: ddtrace (1.18.0) - datadog-ci (~> 0.5.0) debase-ruby_core_source (= 3.2.3) libdatadog (~> 5.0.0.1.0) libddwaf (~> 1.14.0.0.0) @@ -101,8 +100,6 @@ GEM rexml crass (1.0.6) cri (2.15.11) - datadog-ci (0.5.0) - msgpack date (3.3.3) debase-ruby_core_source (3.2.3) debug_inspector (1.1.0) diff --git a/gemfiles/ruby_2.6_rails61_postgres.gemfile.lock b/gemfiles/ruby_2.6_rails61_postgres.gemfile.lock index 46fe45d7c86..5a48eff0e1c 100644 --- a/gemfiles/ruby_2.6_rails61_postgres.gemfile.lock +++ b/gemfiles/ruby_2.6_rails61_postgres.gemfile.lock @@ -12,7 +12,6 @@ PATH remote: .. specs: ddtrace (1.18.0) - datadog-ci (~> 0.5.0) debase-ruby_core_source (= 3.2.3) libdatadog (~> 5.0.0.1.0) libddwaf (~> 1.14.0.0.0) @@ -101,8 +100,6 @@ GEM rexml crass (1.0.6) cri (2.15.11) - datadog-ci (0.5.0) - msgpack date (3.3.3) debase-ruby_core_source (3.2.3) debug_inspector (1.1.0) diff --git a/gemfiles/ruby_2.6_rails61_postgres_redis.gemfile.lock b/gemfiles/ruby_2.6_rails61_postgres_redis.gemfile.lock index 71a1744235b..17ec60119ba 100644 --- a/gemfiles/ruby_2.6_rails61_postgres_redis.gemfile.lock +++ b/gemfiles/ruby_2.6_rails61_postgres_redis.gemfile.lock @@ -12,7 +12,6 @@ PATH remote: .. specs: ddtrace (1.18.0) - datadog-ci (~> 0.5.0) debase-ruby_core_source (= 3.2.3) libdatadog (~> 5.0.0.1.0) libddwaf (~> 1.14.0.0.0) @@ -101,8 +100,6 @@ GEM rexml crass (1.0.6) cri (2.15.11) - datadog-ci (0.5.0) - msgpack date (3.3.3) debase-ruby_core_source (3.2.3) debug_inspector (1.1.0) diff --git a/gemfiles/ruby_2.6_rails61_postgres_sidekiq.gemfile.lock b/gemfiles/ruby_2.6_rails61_postgres_sidekiq.gemfile.lock index cbe41d171f2..ce92a0fb8e9 100644 --- a/gemfiles/ruby_2.6_rails61_postgres_sidekiq.gemfile.lock +++ b/gemfiles/ruby_2.6_rails61_postgres_sidekiq.gemfile.lock @@ -12,7 +12,6 @@ PATH remote: .. specs: ddtrace (1.18.0) - datadog-ci (~> 0.5.0) debase-ruby_core_source (= 3.2.3) libdatadog (~> 5.0.0.1.0) libddwaf (~> 1.14.0.0.0) @@ -102,8 +101,6 @@ GEM rexml crass (1.0.6) cri (2.15.11) - datadog-ci (0.5.0) - msgpack date (3.3.3) debase-ruby_core_source (3.2.3) debug_inspector (1.1.0) diff --git a/gemfiles/ruby_2.6_rails61_semantic_logger.gemfile.lock b/gemfiles/ruby_2.6_rails61_semantic_logger.gemfile.lock index 89a04273853..08d02799f15 100644 --- a/gemfiles/ruby_2.6_rails61_semantic_logger.gemfile.lock +++ b/gemfiles/ruby_2.6_rails61_semantic_logger.gemfile.lock @@ -12,7 +12,6 @@ PATH remote: .. specs: ddtrace (1.18.0) - datadog-ci (~> 0.5.0) debase-ruby_core_source (= 3.2.3) libdatadog (~> 5.0.0.1.0) libddwaf (~> 1.14.0.0.0) @@ -101,8 +100,6 @@ GEM rexml crass (1.0.6) cri (2.15.11) - datadog-ci (0.5.0) - msgpack date (3.3.3) debase-ruby_core_source (3.2.3) debug_inspector (1.1.0) diff --git a/gemfiles/ruby_2.6_rails6_mysql2.gemfile.lock b/gemfiles/ruby_2.6_rails6_mysql2.gemfile.lock index 56a3ccecfb0..a59da6851dc 100644 --- a/gemfiles/ruby_2.6_rails6_mysql2.gemfile.lock +++ b/gemfiles/ruby_2.6_rails6_mysql2.gemfile.lock @@ -12,7 +12,6 @@ PATH remote: .. specs: ddtrace (1.18.0) - datadog-ci (~> 0.5.0) debase-ruby_core_source (= 3.2.3) libdatadog (~> 5.0.0.1.0) libddwaf (~> 1.14.0.0.0) @@ -97,8 +96,6 @@ GEM rexml crass (1.0.6) cri (2.15.11) - datadog-ci (0.5.0) - msgpack date (3.3.3) debase-ruby_core_source (3.2.3) debug_inspector (1.1.0) diff --git a/gemfiles/ruby_2.6_rails6_postgres.gemfile.lock b/gemfiles/ruby_2.6_rails6_postgres.gemfile.lock index 5c723493435..7a4913ac883 100644 --- a/gemfiles/ruby_2.6_rails6_postgres.gemfile.lock +++ b/gemfiles/ruby_2.6_rails6_postgres.gemfile.lock @@ -12,7 +12,6 @@ PATH remote: .. specs: ddtrace (1.18.0) - datadog-ci (~> 0.5.0) debase-ruby_core_source (= 3.2.3) libdatadog (~> 5.0.0.1.0) libddwaf (~> 1.14.0.0.0) @@ -97,8 +96,6 @@ GEM rexml crass (1.0.6) cri (2.15.11) - datadog-ci (0.5.0) - msgpack date (3.3.3) debase-ruby_core_source (3.2.3) debug_inspector (1.1.0) diff --git a/gemfiles/ruby_2.6_rails6_postgres_redis.gemfile.lock b/gemfiles/ruby_2.6_rails6_postgres_redis.gemfile.lock index 5d4444f5957..32d71e3e68d 100644 --- a/gemfiles/ruby_2.6_rails6_postgres_redis.gemfile.lock +++ b/gemfiles/ruby_2.6_rails6_postgres_redis.gemfile.lock @@ -12,7 +12,6 @@ PATH remote: .. specs: ddtrace (1.18.0) - datadog-ci (~> 0.5.0) debase-ruby_core_source (= 3.2.3) libdatadog (~> 5.0.0.1.0) libddwaf (~> 1.14.0.0.0) @@ -97,8 +96,6 @@ GEM rexml crass (1.0.6) cri (2.15.11) - datadog-ci (0.5.0) - msgpack date (3.3.3) debase-ruby_core_source (3.2.3) debug_inspector (1.1.0) diff --git a/gemfiles/ruby_2.6_rails6_postgres_redis_activesupport.gemfile.lock b/gemfiles/ruby_2.6_rails6_postgres_redis_activesupport.gemfile.lock index cc562c9a367..6976214b134 100644 --- a/gemfiles/ruby_2.6_rails6_postgres_redis_activesupport.gemfile.lock +++ b/gemfiles/ruby_2.6_rails6_postgres_redis_activesupport.gemfile.lock @@ -12,7 +12,6 @@ PATH remote: .. specs: ddtrace (1.18.0) - datadog-ci (~> 0.5.0) debase-ruby_core_source (= 3.2.3) libdatadog (~> 5.0.0.1.0) libddwaf (~> 1.14.0.0.0) @@ -97,8 +96,6 @@ GEM rexml crass (1.0.6) cri (2.15.11) - datadog-ci (0.5.0) - msgpack date (3.3.3) debase-ruby_core_source (3.2.3) debug_inspector (1.1.0) diff --git a/gemfiles/ruby_2.6_rails6_postgres_sidekiq.gemfile.lock b/gemfiles/ruby_2.6_rails6_postgres_sidekiq.gemfile.lock index e622499fc6b..c86310f663b 100644 --- a/gemfiles/ruby_2.6_rails6_postgres_sidekiq.gemfile.lock +++ b/gemfiles/ruby_2.6_rails6_postgres_sidekiq.gemfile.lock @@ -12,7 +12,6 @@ PATH remote: .. specs: ddtrace (1.18.0) - datadog-ci (~> 0.5.0) debase-ruby_core_source (= 3.2.3) libdatadog (~> 5.0.0.1.0) libddwaf (~> 1.14.0.0.0) @@ -98,8 +97,6 @@ GEM rexml crass (1.0.6) cri (2.15.11) - datadog-ci (0.5.0) - msgpack date (3.3.3) debase-ruby_core_source (3.2.3) debug_inspector (1.1.0) diff --git a/gemfiles/ruby_2.6_rails6_semantic_logger.gemfile.lock b/gemfiles/ruby_2.6_rails6_semantic_logger.gemfile.lock index 3bb3c9162ae..66294c50fb6 100644 --- a/gemfiles/ruby_2.6_rails6_semantic_logger.gemfile.lock +++ b/gemfiles/ruby_2.6_rails6_semantic_logger.gemfile.lock @@ -12,7 +12,6 @@ PATH remote: .. specs: ddtrace (1.18.0) - datadog-ci (~> 0.5.0) debase-ruby_core_source (= 3.2.3) libdatadog (~> 5.0.0.1.0) libddwaf (~> 1.14.0.0.0) @@ -97,8 +96,6 @@ GEM rexml crass (1.0.6) cri (2.15.11) - datadog-ci (0.5.0) - msgpack date (3.3.3) debase-ruby_core_source (3.2.3) debug_inspector (1.1.0) diff --git a/gemfiles/ruby_2.6_redis_3.gemfile.lock b/gemfiles/ruby_2.6_redis_3.gemfile.lock index cbe9f0065c5..59db3bf661a 100644 --- a/gemfiles/ruby_2.6_redis_3.gemfile.lock +++ b/gemfiles/ruby_2.6_redis_3.gemfile.lock @@ -12,7 +12,6 @@ PATH remote: .. specs: ddtrace (1.18.0) - datadog-ci (~> 0.5.0) debase-ruby_core_source (= 3.2.3) libdatadog (~> 5.0.0.1.0) libddwaf (~> 1.14.0.0.0) @@ -41,8 +40,6 @@ GEM crack (0.4.5) rexml cri (2.15.11) - datadog-ci (0.5.0) - msgpack debase-ruby_core_source (3.2.3) debug_inspector (1.1.0) diff-lcs (1.5.0) diff --git a/gemfiles/ruby_2.6_redis_4.gemfile.lock b/gemfiles/ruby_2.6_redis_4.gemfile.lock index c6b7be8681e..949c5e12b9b 100644 --- a/gemfiles/ruby_2.6_redis_4.gemfile.lock +++ b/gemfiles/ruby_2.6_redis_4.gemfile.lock @@ -12,7 +12,6 @@ PATH remote: .. specs: ddtrace (1.18.0) - datadog-ci (~> 0.5.0) debase-ruby_core_source (= 3.2.3) libdatadog (~> 5.0.0.1.0) libddwaf (~> 1.14.0.0.0) @@ -41,8 +40,6 @@ GEM crack (0.4.5) rexml cri (2.15.11) - datadog-ci (0.5.0) - msgpack debase-ruby_core_source (3.2.3) debug_inspector (1.1.0) diff-lcs (1.5.0) diff --git a/gemfiles/ruby_2.6_redis_5.gemfile.lock b/gemfiles/ruby_2.6_redis_5.gemfile.lock index 9e2b6281fb6..b5e9d83b56c 100644 --- a/gemfiles/ruby_2.6_redis_5.gemfile.lock +++ b/gemfiles/ruby_2.6_redis_5.gemfile.lock @@ -12,7 +12,6 @@ PATH remote: .. specs: ddtrace (1.18.0) - datadog-ci (~> 0.5.0) debase-ruby_core_source (= 3.2.3) libdatadog (~> 5.0.0.1.0) libddwaf (~> 1.14.0.0.0) @@ -42,8 +41,6 @@ GEM crack (0.4.5) rexml cri (2.15.11) - datadog-ci (0.5.0) - msgpack debase-ruby_core_source (3.2.3) debug_inspector (1.1.0) diff-lcs (1.5.0) diff --git a/gemfiles/ruby_2.6_relational_db.gemfile.lock b/gemfiles/ruby_2.6_relational_db.gemfile.lock index af51a7e7491..351667cece5 100644 --- a/gemfiles/ruby_2.6_relational_db.gemfile.lock +++ b/gemfiles/ruby_2.6_relational_db.gemfile.lock @@ -12,7 +12,6 @@ PATH remote: .. specs: ddtrace (1.18.0) - datadog-ci (~> 0.5.0) debase-ruby_core_source (= 3.2.3) libdatadog (~> 5.0.0.1.0) libddwaf (~> 1.14.0.0.0) @@ -52,8 +51,6 @@ GEM crack (0.4.5) rexml cri (2.15.11) - datadog-ci (0.5.0) - msgpack debase-ruby_core_source (3.2.3) debug_inspector (1.1.0) delayed_job (4.1.11) diff --git a/gemfiles/ruby_2.6_resque2_redis3.gemfile.lock b/gemfiles/ruby_2.6_resque2_redis3.gemfile.lock index 8416f58c77b..ebc01431f44 100644 --- a/gemfiles/ruby_2.6_resque2_redis3.gemfile.lock +++ b/gemfiles/ruby_2.6_resque2_redis3.gemfile.lock @@ -12,7 +12,6 @@ PATH remote: .. specs: ddtrace (1.18.0) - datadog-ci (~> 0.5.0) debase-ruby_core_source (= 3.2.3) libdatadog (~> 5.0.0.1.0) libddwaf (~> 1.14.0.0.0) @@ -41,8 +40,6 @@ GEM crack (0.4.5) rexml cri (2.15.11) - datadog-ci (0.5.0) - msgpack debase-ruby_core_source (3.2.3) debug_inspector (1.1.0) diff-lcs (1.5.0) diff --git a/gemfiles/ruby_2.6_resque2_redis4.gemfile.lock b/gemfiles/ruby_2.6_resque2_redis4.gemfile.lock index ae98a664a9b..94287d36830 100644 --- a/gemfiles/ruby_2.6_resque2_redis4.gemfile.lock +++ b/gemfiles/ruby_2.6_resque2_redis4.gemfile.lock @@ -12,7 +12,6 @@ PATH remote: .. specs: ddtrace (1.18.0) - datadog-ci (~> 0.5.0) debase-ruby_core_source (= 3.2.3) libdatadog (~> 5.0.0.1.0) libddwaf (~> 1.14.0.0.0) @@ -41,8 +40,6 @@ GEM crack (0.4.5) rexml cri (2.15.11) - datadog-ci (0.5.0) - msgpack debase-ruby_core_source (3.2.3) debug_inspector (1.1.0) diff-lcs (1.5.0) diff --git a/gemfiles/ruby_2.6_sinatra.gemfile.lock b/gemfiles/ruby_2.6_sinatra.gemfile.lock index 8491aa2be9b..1d857604467 100644 --- a/gemfiles/ruby_2.6_sinatra.gemfile.lock +++ b/gemfiles/ruby_2.6_sinatra.gemfile.lock @@ -12,7 +12,6 @@ PATH remote: .. specs: ddtrace (1.18.0) - datadog-ci (~> 0.5.0) debase-ruby_core_source (= 3.2.3) libdatadog (~> 5.0.0.1.0) libddwaf (~> 1.14.0.0.0) @@ -41,8 +40,6 @@ GEM crack (0.4.5) rexml cri (2.15.11) - datadog-ci (0.5.0) - msgpack debase-ruby_core_source (3.2.3) debug_inspector (1.1.0) diff-lcs (1.5.0) diff --git a/gemfiles/ruby_2.7_activesupport.gemfile.lock b/gemfiles/ruby_2.7_activesupport.gemfile.lock index 8a1a6fc7040..7139d03bdcf 100644 --- a/gemfiles/ruby_2.7_activesupport.gemfile.lock +++ b/gemfiles/ruby_2.7_activesupport.gemfile.lock @@ -12,7 +12,6 @@ PATH remote: .. specs: ddtrace (1.18.0) - datadog-ci (~> 0.5.0) debase-ruby_core_source (= 3.2.3) libdatadog (~> 5.0.0.1.0) libddwaf (~> 1.14.0.0.0) @@ -70,8 +69,6 @@ GEM rexml crass (1.0.6) cri (2.15.11) - datadog-ci (0.5.0) - msgpack debase-ruby_core_source (3.2.3) debug_inspector (1.1.0) diff-lcs (1.5.0) diff --git a/gemfiles/ruby_2.7_aws.gemfile.lock b/gemfiles/ruby_2.7_aws.gemfile.lock index c3911a0298e..1713d7d9de4 100644 --- a/gemfiles/ruby_2.7_aws.gemfile.lock +++ b/gemfiles/ruby_2.7_aws.gemfile.lock @@ -12,7 +12,6 @@ PATH remote: .. specs: ddtrace (1.18.0) - datadog-ci (~> 0.5.0) debase-ruby_core_source (= 3.2.3) libdatadog (~> 5.0.0.1.0) libddwaf (~> 1.14.0.0.0) @@ -1462,8 +1461,6 @@ GEM crack (0.4.5) rexml cri (2.15.11) - datadog-ci (0.5.0) - msgpack debase-ruby_core_source (3.2.3) debug_inspector (1.1.0) diff-lcs (1.5.0) diff --git a/gemfiles/ruby_2.7_contrib.gemfile.lock b/gemfiles/ruby_2.7_contrib.gemfile.lock index 21149fd548a..bfe54aa53d0 100644 --- a/gemfiles/ruby_2.7_contrib.gemfile.lock +++ b/gemfiles/ruby_2.7_contrib.gemfile.lock @@ -12,7 +12,6 @@ PATH remote: .. specs: ddtrace (1.18.0) - datadog-ci (~> 0.5.0) debase-ruby_core_source (= 3.2.3) libdatadog (~> 5.0.0.1.0) libddwaf (~> 1.14.0.0.0) @@ -48,8 +47,6 @@ GEM rexml cri (2.15.11) dalli (3.2.4) - datadog-ci (0.5.0) - msgpack debase-ruby_core_source (3.2.3) debug_inspector (1.1.0) diff-lcs (1.5.0) diff --git a/gemfiles/ruby_2.7_contrib_old.gemfile.lock b/gemfiles/ruby_2.7_contrib_old.gemfile.lock index ddcd551ec4c..05a04eb59c7 100644 --- a/gemfiles/ruby_2.7_contrib_old.gemfile.lock +++ b/gemfiles/ruby_2.7_contrib_old.gemfile.lock @@ -12,7 +12,6 @@ PATH remote: .. specs: ddtrace (1.18.0) - datadog-ci (~> 0.5.0) debase-ruby_core_source (= 3.2.3) libdatadog (~> 5.0.0.1.0) libddwaf (~> 1.14.0.0.0) @@ -46,8 +45,6 @@ GEM cri (2.15.11) daemons (1.4.1) dalli (2.7.11) - datadog-ci (0.5.0) - msgpack debase-ruby_core_source (3.2.3) debug_inspector (1.1.0) diff-lcs (1.5.0) diff --git a/gemfiles/ruby_2.7_core_old.gemfile.lock b/gemfiles/ruby_2.7_core_old.gemfile.lock index 9894eae686d..8e699309d21 100644 --- a/gemfiles/ruby_2.7_core_old.gemfile.lock +++ b/gemfiles/ruby_2.7_core_old.gemfile.lock @@ -12,7 +12,6 @@ PATH remote: .. specs: ddtrace (1.18.0) - datadog-ci (~> 0.5.0) debase-ruby_core_source (= 3.2.3) libdatadog (~> 5.0.0.1.0) libddwaf (~> 1.14.0.0.0) @@ -41,8 +40,6 @@ GEM crack (0.4.5) rexml cri (2.15.11) - datadog-ci (0.5.0) - msgpack debase-ruby_core_source (3.2.3) debug_inspector (1.1.0) diff-lcs (1.5.0) diff --git a/gemfiles/ruby_2.7_elasticsearch_7.gemfile.lock b/gemfiles/ruby_2.7_elasticsearch_7.gemfile.lock index a03b6ed9305..47f48248c30 100644 --- a/gemfiles/ruby_2.7_elasticsearch_7.gemfile.lock +++ b/gemfiles/ruby_2.7_elasticsearch_7.gemfile.lock @@ -12,7 +12,6 @@ PATH remote: .. specs: ddtrace (1.18.0) - datadog-ci (~> 0.5.0) debase-ruby_core_source (= 3.2.3) libdatadog (~> 5.0.0.1.0) libddwaf (~> 1.14.0.0.0) @@ -42,8 +41,6 @@ GEM crack (0.4.5) rexml cri (2.15.11) - datadog-ci (0.5.0) - msgpack debase-ruby_core_source (3.2.3) debug_inspector (1.1.0) diff-lcs (1.5.0) diff --git a/gemfiles/ruby_2.7_elasticsearch_8.gemfile.lock b/gemfiles/ruby_2.7_elasticsearch_8.gemfile.lock index da713470983..d667b0abf33 100644 --- a/gemfiles/ruby_2.7_elasticsearch_8.gemfile.lock +++ b/gemfiles/ruby_2.7_elasticsearch_8.gemfile.lock @@ -12,7 +12,6 @@ PATH remote: .. specs: ddtrace (1.18.0) - datadog-ci (~> 0.5.0) debase-ruby_core_source (= 3.2.3) libdatadog (~> 5.0.0.1.0) libddwaf (~> 1.14.0.0.0) @@ -43,8 +42,6 @@ GEM crack (0.4.5) rexml cri (2.15.11) - datadog-ci (0.5.0) - msgpack debase-ruby_core_source (3.2.3) debug_inspector (1.1.0) diff-lcs (1.5.0) diff --git a/gemfiles/ruby_2.7_hanami_1.gemfile.lock b/gemfiles/ruby_2.7_hanami_1.gemfile.lock index 602a44cc7f2..73bf1341119 100644 --- a/gemfiles/ruby_2.7_hanami_1.gemfile.lock +++ b/gemfiles/ruby_2.7_hanami_1.gemfile.lock @@ -12,7 +12,6 @@ PATH remote: .. specs: ddtrace (1.18.0) - datadog-ci (~> 0.5.0) debase-ruby_core_source (= 3.2.3) libdatadog (~> 5.0.0.1.0) libddwaf (~> 1.14.0.0.0) @@ -41,8 +40,6 @@ GEM crack (0.4.5) rexml cri (2.15.11) - datadog-ci (0.5.0) - msgpack date (3.3.3) debase-ruby_core_source (3.2.3) debug_inspector (1.1.0) diff --git a/gemfiles/ruby_2.7_http.gemfile.lock b/gemfiles/ruby_2.7_http.gemfile.lock index 7586587ad66..1a11db139d9 100644 --- a/gemfiles/ruby_2.7_http.gemfile.lock +++ b/gemfiles/ruby_2.7_http.gemfile.lock @@ -12,7 +12,6 @@ PATH remote: .. specs: ddtrace (1.18.0) - datadog-ci (~> 0.5.0) debase-ruby_core_source (= 3.2.3) libdatadog (~> 5.0.0.1.0) libddwaf (~> 1.14.0.0.0) @@ -41,8 +40,6 @@ GEM crack (0.4.5) rexml cri (2.15.11) - datadog-ci (0.5.0) - msgpack debase-ruby_core_source (3.2.3) debug_inspector (1.1.0) diff-lcs (1.5.0) diff --git a/gemfiles/ruby_2.7_opensearch_2.gemfile.lock b/gemfiles/ruby_2.7_opensearch_2.gemfile.lock index ff1e46ca173..848df9416fb 100644 --- a/gemfiles/ruby_2.7_opensearch_2.gemfile.lock +++ b/gemfiles/ruby_2.7_opensearch_2.gemfile.lock @@ -12,7 +12,6 @@ PATH remote: .. specs: ddtrace (1.18.0) - datadog-ci (~> 0.5.0) debase-ruby_core_source (= 3.2.3) libdatadog (~> 5.0.0.1.0) libddwaf (~> 1.14.0.0.0) @@ -43,8 +42,6 @@ GEM crack (0.4.5) rexml cri (2.15.11) - datadog-ci (0.5.0) - msgpack debase-ruby_core_source (3.2.3) debug_inspector (1.1.0) diff-lcs (1.5.0) diff --git a/gemfiles/ruby_2.7_opensearch_3.gemfile.lock b/gemfiles/ruby_2.7_opensearch_3.gemfile.lock index eb6003024fe..14f82f04084 100644 --- a/gemfiles/ruby_2.7_opensearch_3.gemfile.lock +++ b/gemfiles/ruby_2.7_opensearch_3.gemfile.lock @@ -12,7 +12,6 @@ PATH remote: .. specs: ddtrace (1.18.0) - datadog-ci (~> 0.5.0) debase-ruby_core_source (= 3.2.3) libdatadog (~> 5.0.0.1.0) libddwaf (~> 1.14.0.0.0) @@ -43,8 +42,6 @@ GEM crack (0.4.5) rexml cri (2.15.11) - datadog-ci (0.5.0) - msgpack debase-ruby_core_source (3.2.3) debug_inspector (1.1.0) diff-lcs (1.5.0) diff --git a/gemfiles/ruby_2.7_opentelemetry.gemfile.lock b/gemfiles/ruby_2.7_opentelemetry.gemfile.lock index 3f4df86b987..adc40f991ee 100755 --- a/gemfiles/ruby_2.7_opentelemetry.gemfile.lock +++ b/gemfiles/ruby_2.7_opentelemetry.gemfile.lock @@ -12,7 +12,6 @@ PATH remote: .. specs: ddtrace (1.18.0) - datadog-ci (~> 0.5.0) debase-ruby_core_source (= 3.2.3) libdatadog (~> 5.0.0.1.0) libddwaf (~> 1.14.0.0.0) @@ -41,8 +40,6 @@ GEM crack (0.4.5) rexml cri (2.15.11) - datadog-ci (0.5.0) - msgpack debase-ruby_core_source (3.2.3) debug_inspector (1.1.0) diff-lcs (1.5.0) diff --git a/gemfiles/ruby_2.7_opentracing.gemfile.lock b/gemfiles/ruby_2.7_opentracing.gemfile.lock index d5f91d4e755..015fe35bb9d 100644 --- a/gemfiles/ruby_2.7_opentracing.gemfile.lock +++ b/gemfiles/ruby_2.7_opentracing.gemfile.lock @@ -12,7 +12,6 @@ PATH remote: .. specs: ddtrace (1.18.0) - datadog-ci (~> 0.5.0) debase-ruby_core_source (= 3.2.3) libdatadog (~> 5.0.0.1.0) libddwaf (~> 1.14.0.0.0) @@ -42,8 +41,6 @@ GEM crack (0.4.5) rexml cri (2.15.11) - datadog-ci (0.5.0) - msgpack debase-ruby_core_source (3.2.3) debug_inspector (1.1.0) diff-lcs (1.5.0) diff --git a/gemfiles/ruby_2.7_rack_1.gemfile.lock b/gemfiles/ruby_2.7_rack_1.gemfile.lock index a8b4a2ebfb1..8ff7af70d0c 100644 --- a/gemfiles/ruby_2.7_rack_1.gemfile.lock +++ b/gemfiles/ruby_2.7_rack_1.gemfile.lock @@ -12,7 +12,6 @@ PATH remote: .. specs: ddtrace (1.18.0) - datadog-ci (~> 0.5.0) debase-ruby_core_source (= 3.2.3) libdatadog (~> 5.0.0.1.0) libddwaf (~> 1.14.0.0.0) @@ -41,8 +40,6 @@ GEM crack (0.4.5) rexml cri (2.15.11) - datadog-ci (0.5.0) - msgpack debase-ruby_core_source (3.2.3) debug_inspector (1.1.0) diff-lcs (1.5.0) diff --git a/gemfiles/ruby_2.7_rack_2.gemfile.lock b/gemfiles/ruby_2.7_rack_2.gemfile.lock index 7217a2f4d8c..2ddb548485e 100644 --- a/gemfiles/ruby_2.7_rack_2.gemfile.lock +++ b/gemfiles/ruby_2.7_rack_2.gemfile.lock @@ -12,7 +12,6 @@ PATH remote: .. specs: ddtrace (1.18.0) - datadog-ci (~> 0.5.0) debase-ruby_core_source (= 3.2.3) libdatadog (~> 5.0.0.1.0) libddwaf (~> 1.14.0.0.0) @@ -41,8 +40,6 @@ GEM crack (0.4.5) rexml cri (2.15.11) - datadog-ci (0.5.0) - msgpack debase-ruby_core_source (3.2.3) debug_inspector (1.1.0) diff-lcs (1.5.0) diff --git a/gemfiles/ruby_2.7_rack_3.gemfile.lock b/gemfiles/ruby_2.7_rack_3.gemfile.lock index ed444cf3da6..ebc0720876e 100644 --- a/gemfiles/ruby_2.7_rack_3.gemfile.lock +++ b/gemfiles/ruby_2.7_rack_3.gemfile.lock @@ -12,7 +12,6 @@ PATH remote: .. specs: ddtrace (1.18.0) - datadog-ci (~> 0.5.0) debase-ruby_core_source (= 3.2.3) libdatadog (~> 5.0.0.1.0) libddwaf (~> 1.14.0.0.0) @@ -41,8 +40,6 @@ GEM crack (0.4.5) rexml cri (2.15.11) - datadog-ci (0.5.0) - msgpack debase-ruby_core_source (3.2.3) debug_inspector (1.1.0) diff-lcs (1.5.0) diff --git a/gemfiles/ruby_2.7_rails5_mysql2.gemfile.lock b/gemfiles/ruby_2.7_rails5_mysql2.gemfile.lock index 66e21d547c4..7dd9dbbea8e 100644 --- a/gemfiles/ruby_2.7_rails5_mysql2.gemfile.lock +++ b/gemfiles/ruby_2.7_rails5_mysql2.gemfile.lock @@ -12,7 +12,6 @@ PATH remote: .. specs: ddtrace (1.18.0) - datadog-ci (~> 0.5.0) debase-ruby_core_source (= 3.2.3) libdatadog (~> 5.0.0.1.0) libddwaf (~> 1.14.0.0.0) @@ -84,8 +83,6 @@ GEM rexml crass (1.0.6) cri (2.15.11) - datadog-ci (0.5.0) - msgpack date (3.3.3) debase-ruby_core_source (3.2.3) debug_inspector (1.1.0) diff --git a/gemfiles/ruby_2.7_rails5_postgres.gemfile.lock b/gemfiles/ruby_2.7_rails5_postgres.gemfile.lock index b911bda51c8..54625e8e9f5 100644 --- a/gemfiles/ruby_2.7_rails5_postgres.gemfile.lock +++ b/gemfiles/ruby_2.7_rails5_postgres.gemfile.lock @@ -12,7 +12,6 @@ PATH remote: .. specs: ddtrace (1.18.0) - datadog-ci (~> 0.5.0) debase-ruby_core_source (= 3.2.3) libdatadog (~> 5.0.0.1.0) libddwaf (~> 1.14.0.0.0) @@ -84,8 +83,6 @@ GEM rexml crass (1.0.6) cri (2.15.11) - datadog-ci (0.5.0) - msgpack date (3.3.3) debase-ruby_core_source (3.2.3) debug_inspector (1.1.0) diff --git a/gemfiles/ruby_2.7_rails5_postgres_redis.gemfile.lock b/gemfiles/ruby_2.7_rails5_postgres_redis.gemfile.lock index e7234d8aa25..c16a56b71e3 100644 --- a/gemfiles/ruby_2.7_rails5_postgres_redis.gemfile.lock +++ b/gemfiles/ruby_2.7_rails5_postgres_redis.gemfile.lock @@ -12,7 +12,6 @@ PATH remote: .. specs: ddtrace (1.18.0) - datadog-ci (~> 0.5.0) debase-ruby_core_source (= 3.2.3) libdatadog (~> 5.0.0.1.0) libddwaf (~> 1.14.0.0.0) @@ -84,8 +83,6 @@ GEM rexml crass (1.0.6) cri (2.15.11) - datadog-ci (0.5.0) - msgpack date (3.3.3) debase-ruby_core_source (3.2.3) debug_inspector (1.1.0) diff --git a/gemfiles/ruby_2.7_rails5_postgres_redis_activesupport.gemfile.lock b/gemfiles/ruby_2.7_rails5_postgres_redis_activesupport.gemfile.lock index 93fa9051615..d9decbfd376 100644 --- a/gemfiles/ruby_2.7_rails5_postgres_redis_activesupport.gemfile.lock +++ b/gemfiles/ruby_2.7_rails5_postgres_redis_activesupport.gemfile.lock @@ -12,7 +12,6 @@ PATH remote: .. specs: ddtrace (1.18.0) - datadog-ci (~> 0.5.0) debase-ruby_core_source (= 3.2.3) libdatadog (~> 5.0.0.1.0) libddwaf (~> 1.14.0.0.0) @@ -84,8 +83,6 @@ GEM rexml crass (1.0.6) cri (2.15.11) - datadog-ci (0.5.0) - msgpack date (3.3.3) debase-ruby_core_source (3.2.3) debug_inspector (1.1.0) diff --git a/gemfiles/ruby_2.7_rails5_postgres_sidekiq.gemfile.lock b/gemfiles/ruby_2.7_rails5_postgres_sidekiq.gemfile.lock index 744a45a99d0..ec49817cb01 100644 --- a/gemfiles/ruby_2.7_rails5_postgres_sidekiq.gemfile.lock +++ b/gemfiles/ruby_2.7_rails5_postgres_sidekiq.gemfile.lock @@ -12,7 +12,6 @@ PATH remote: .. specs: ddtrace (1.18.0) - datadog-ci (~> 0.5.0) debase-ruby_core_source (= 3.2.3) libdatadog (~> 5.0.0.1.0) libddwaf (~> 1.14.0.0.0) @@ -85,8 +84,6 @@ GEM rexml crass (1.0.6) cri (2.15.11) - datadog-ci (0.5.0) - msgpack date (3.3.3) debase-ruby_core_source (3.2.3) debug_inspector (1.1.0) diff --git a/gemfiles/ruby_2.7_rails5_semantic_logger.gemfile.lock b/gemfiles/ruby_2.7_rails5_semantic_logger.gemfile.lock index e455718c15f..e2399b860f5 100644 --- a/gemfiles/ruby_2.7_rails5_semantic_logger.gemfile.lock +++ b/gemfiles/ruby_2.7_rails5_semantic_logger.gemfile.lock @@ -12,7 +12,6 @@ PATH remote: .. specs: ddtrace (1.18.0) - datadog-ci (~> 0.5.0) debase-ruby_core_source (= 3.2.3) libdatadog (~> 5.0.0.1.0) libddwaf (~> 1.14.0.0.0) @@ -84,8 +83,6 @@ GEM rexml crass (1.0.6) cri (2.15.11) - datadog-ci (0.5.0) - msgpack date (3.3.3) debase-ruby_core_source (3.2.3) debug_inspector (1.1.0) diff --git a/gemfiles/ruby_2.7_rails61_mysql2.gemfile.lock b/gemfiles/ruby_2.7_rails61_mysql2.gemfile.lock index 702630f9580..32b505b481d 100644 --- a/gemfiles/ruby_2.7_rails61_mysql2.gemfile.lock +++ b/gemfiles/ruby_2.7_rails61_mysql2.gemfile.lock @@ -12,7 +12,6 @@ PATH remote: .. specs: ddtrace (1.18.0) - datadog-ci (~> 0.5.0) debase-ruby_core_source (= 3.2.3) libdatadog (~> 5.0.0.1.0) libddwaf (~> 1.14.0.0.0) @@ -101,8 +100,6 @@ GEM rexml crass (1.0.6) cri (2.15.11) - datadog-ci (0.5.0) - msgpack date (3.3.3) debase-ruby_core_source (3.2.3) debug_inspector (1.1.0) diff --git a/gemfiles/ruby_2.7_rails61_postgres.gemfile.lock b/gemfiles/ruby_2.7_rails61_postgres.gemfile.lock index 7e407a9f551..8f5ec7046e4 100644 --- a/gemfiles/ruby_2.7_rails61_postgres.gemfile.lock +++ b/gemfiles/ruby_2.7_rails61_postgres.gemfile.lock @@ -12,7 +12,6 @@ PATH remote: .. specs: ddtrace (1.18.0) - datadog-ci (~> 0.5.0) debase-ruby_core_source (= 3.2.3) libdatadog (~> 5.0.0.1.0) libddwaf (~> 1.14.0.0.0) @@ -101,8 +100,6 @@ GEM rexml crass (1.0.6) cri (2.15.11) - datadog-ci (0.5.0) - msgpack date (3.3.3) debase-ruby_core_source (3.2.3) debug_inspector (1.1.0) diff --git a/gemfiles/ruby_2.7_rails61_postgres_redis.gemfile.lock b/gemfiles/ruby_2.7_rails61_postgres_redis.gemfile.lock index 489b7427d60..5dda5f77521 100644 --- a/gemfiles/ruby_2.7_rails61_postgres_redis.gemfile.lock +++ b/gemfiles/ruby_2.7_rails61_postgres_redis.gemfile.lock @@ -12,7 +12,6 @@ PATH remote: .. specs: ddtrace (1.18.0) - datadog-ci (~> 0.5.0) debase-ruby_core_source (= 3.2.3) libdatadog (~> 5.0.0.1.0) libddwaf (~> 1.14.0.0.0) @@ -101,8 +100,6 @@ GEM rexml crass (1.0.6) cri (2.15.11) - datadog-ci (0.5.0) - msgpack date (3.3.3) debase-ruby_core_source (3.2.3) debug_inspector (1.1.0) diff --git a/gemfiles/ruby_2.7_rails61_postgres_sidekiq.gemfile.lock b/gemfiles/ruby_2.7_rails61_postgres_sidekiq.gemfile.lock index c408facbc44..94fbdb42492 100644 --- a/gemfiles/ruby_2.7_rails61_postgres_sidekiq.gemfile.lock +++ b/gemfiles/ruby_2.7_rails61_postgres_sidekiq.gemfile.lock @@ -12,7 +12,6 @@ PATH remote: .. specs: ddtrace (1.18.0) - datadog-ci (~> 0.5.0) debase-ruby_core_source (= 3.2.3) libdatadog (~> 5.0.0.1.0) libddwaf (~> 1.14.0.0.0) @@ -102,8 +101,6 @@ GEM rexml crass (1.0.6) cri (2.15.11) - datadog-ci (0.5.0) - msgpack date (3.3.3) debase-ruby_core_source (3.2.3) debug_inspector (1.1.0) diff --git a/gemfiles/ruby_2.7_rails61_semantic_logger.gemfile.lock b/gemfiles/ruby_2.7_rails61_semantic_logger.gemfile.lock index 4e300116e8f..fa1275fb1ab 100644 --- a/gemfiles/ruby_2.7_rails61_semantic_logger.gemfile.lock +++ b/gemfiles/ruby_2.7_rails61_semantic_logger.gemfile.lock @@ -12,7 +12,6 @@ PATH remote: .. specs: ddtrace (1.18.0) - datadog-ci (~> 0.5.0) debase-ruby_core_source (= 3.2.3) libdatadog (~> 5.0.0.1.0) libddwaf (~> 1.14.0.0.0) @@ -101,8 +100,6 @@ GEM rexml crass (1.0.6) cri (2.15.11) - datadog-ci (0.5.0) - msgpack date (3.3.3) debase-ruby_core_source (3.2.3) debug_inspector (1.1.0) diff --git a/gemfiles/ruby_2.7_rails6_mysql2.gemfile.lock b/gemfiles/ruby_2.7_rails6_mysql2.gemfile.lock index 0ef2feaffa6..f8385eb4c72 100644 --- a/gemfiles/ruby_2.7_rails6_mysql2.gemfile.lock +++ b/gemfiles/ruby_2.7_rails6_mysql2.gemfile.lock @@ -12,7 +12,6 @@ PATH remote: .. specs: ddtrace (1.18.0) - datadog-ci (~> 0.5.0) debase-ruby_core_source (= 3.2.3) libdatadog (~> 5.0.0.1.0) libddwaf (~> 1.14.0.0.0) @@ -97,8 +96,6 @@ GEM rexml crass (1.0.6) cri (2.15.11) - datadog-ci (0.5.0) - msgpack date (3.3.3) debase-ruby_core_source (3.2.3) debug_inspector (1.1.0) diff --git a/gemfiles/ruby_2.7_rails6_postgres.gemfile.lock b/gemfiles/ruby_2.7_rails6_postgres.gemfile.lock index fd7053e5310..708ce28ef4f 100644 --- a/gemfiles/ruby_2.7_rails6_postgres.gemfile.lock +++ b/gemfiles/ruby_2.7_rails6_postgres.gemfile.lock @@ -12,7 +12,6 @@ PATH remote: .. specs: ddtrace (1.18.0) - datadog-ci (~> 0.5.0) debase-ruby_core_source (= 3.2.3) libdatadog (~> 5.0.0.1.0) libddwaf (~> 1.14.0.0.0) @@ -97,8 +96,6 @@ GEM rexml crass (1.0.6) cri (2.15.11) - datadog-ci (0.5.0) - msgpack date (3.3.3) debase-ruby_core_source (3.2.3) debug_inspector (1.1.0) diff --git a/gemfiles/ruby_2.7_rails6_postgres_redis.gemfile.lock b/gemfiles/ruby_2.7_rails6_postgres_redis.gemfile.lock index 54507dcb892..e75730ff178 100644 --- a/gemfiles/ruby_2.7_rails6_postgres_redis.gemfile.lock +++ b/gemfiles/ruby_2.7_rails6_postgres_redis.gemfile.lock @@ -12,7 +12,6 @@ PATH remote: .. specs: ddtrace (1.18.0) - datadog-ci (~> 0.5.0) debase-ruby_core_source (= 3.2.3) libdatadog (~> 5.0.0.1.0) libddwaf (~> 1.14.0.0.0) @@ -97,8 +96,6 @@ GEM rexml crass (1.0.6) cri (2.15.11) - datadog-ci (0.5.0) - msgpack date (3.3.3) debase-ruby_core_source (3.2.3) debug_inspector (1.1.0) diff --git a/gemfiles/ruby_2.7_rails6_postgres_redis_activesupport.gemfile.lock b/gemfiles/ruby_2.7_rails6_postgres_redis_activesupport.gemfile.lock index 3d148c548a9..58eb951778c 100644 --- a/gemfiles/ruby_2.7_rails6_postgres_redis_activesupport.gemfile.lock +++ b/gemfiles/ruby_2.7_rails6_postgres_redis_activesupport.gemfile.lock @@ -12,7 +12,6 @@ PATH remote: .. specs: ddtrace (1.18.0) - datadog-ci (~> 0.5.0) debase-ruby_core_source (= 3.2.3) libdatadog (~> 5.0.0.1.0) libddwaf (~> 1.14.0.0.0) @@ -97,8 +96,6 @@ GEM rexml crass (1.0.6) cri (2.15.11) - datadog-ci (0.5.0) - msgpack date (3.3.3) debase-ruby_core_source (3.2.3) debug_inspector (1.1.0) diff --git a/gemfiles/ruby_2.7_rails6_postgres_sidekiq.gemfile.lock b/gemfiles/ruby_2.7_rails6_postgres_sidekiq.gemfile.lock index 00485123f37..3229ed088c1 100644 --- a/gemfiles/ruby_2.7_rails6_postgres_sidekiq.gemfile.lock +++ b/gemfiles/ruby_2.7_rails6_postgres_sidekiq.gemfile.lock @@ -12,7 +12,6 @@ PATH remote: .. specs: ddtrace (1.18.0) - datadog-ci (~> 0.5.0) debase-ruby_core_source (= 3.2.3) libdatadog (~> 5.0.0.1.0) libddwaf (~> 1.14.0.0.0) @@ -98,8 +97,6 @@ GEM rexml crass (1.0.6) cri (2.15.11) - datadog-ci (0.5.0) - msgpack date (3.3.3) debase-ruby_core_source (3.2.3) debug_inspector (1.1.0) diff --git a/gemfiles/ruby_2.7_rails6_semantic_logger.gemfile.lock b/gemfiles/ruby_2.7_rails6_semantic_logger.gemfile.lock index 733359a33ff..7b23c13e1ac 100644 --- a/gemfiles/ruby_2.7_rails6_semantic_logger.gemfile.lock +++ b/gemfiles/ruby_2.7_rails6_semantic_logger.gemfile.lock @@ -12,7 +12,6 @@ PATH remote: .. specs: ddtrace (1.18.0) - datadog-ci (~> 0.5.0) debase-ruby_core_source (= 3.2.3) libdatadog (~> 5.0.0.1.0) libddwaf (~> 1.14.0.0.0) @@ -97,8 +96,6 @@ GEM rexml crass (1.0.6) cri (2.15.11) - datadog-ci (0.5.0) - msgpack date (3.3.3) debase-ruby_core_source (3.2.3) debug_inspector (1.1.0) diff --git a/gemfiles/ruby_2.7_redis_3.gemfile.lock b/gemfiles/ruby_2.7_redis_3.gemfile.lock index e7238b5bcc8..7493ef5359f 100644 --- a/gemfiles/ruby_2.7_redis_3.gemfile.lock +++ b/gemfiles/ruby_2.7_redis_3.gemfile.lock @@ -12,7 +12,6 @@ PATH remote: .. specs: ddtrace (1.18.0) - datadog-ci (~> 0.5.0) debase-ruby_core_source (= 3.2.3) libdatadog (~> 5.0.0.1.0) libddwaf (~> 1.14.0.0.0) @@ -41,8 +40,6 @@ GEM crack (0.4.5) rexml cri (2.15.11) - datadog-ci (0.5.0) - msgpack debase-ruby_core_source (3.2.3) debug_inspector (1.1.0) diff-lcs (1.5.0) diff --git a/gemfiles/ruby_2.7_redis_4.gemfile.lock b/gemfiles/ruby_2.7_redis_4.gemfile.lock index 29ad3634275..fcc54ea31f0 100644 --- a/gemfiles/ruby_2.7_redis_4.gemfile.lock +++ b/gemfiles/ruby_2.7_redis_4.gemfile.lock @@ -12,7 +12,6 @@ PATH remote: .. specs: ddtrace (1.18.0) - datadog-ci (~> 0.5.0) debase-ruby_core_source (= 3.2.3) libdatadog (~> 5.0.0.1.0) libddwaf (~> 1.14.0.0.0) @@ -41,8 +40,6 @@ GEM crack (0.4.5) rexml cri (2.15.11) - datadog-ci (0.5.0) - msgpack debase-ruby_core_source (3.2.3) debug_inspector (1.1.0) diff-lcs (1.5.0) diff --git a/gemfiles/ruby_2.7_redis_5.gemfile.lock b/gemfiles/ruby_2.7_redis_5.gemfile.lock index a19aab6e732..9b04fa2e6e0 100644 --- a/gemfiles/ruby_2.7_redis_5.gemfile.lock +++ b/gemfiles/ruby_2.7_redis_5.gemfile.lock @@ -12,7 +12,6 @@ PATH remote: .. specs: ddtrace (1.18.0) - datadog-ci (~> 0.5.0) debase-ruby_core_source (= 3.2.3) libdatadog (~> 5.0.0.1.0) libddwaf (~> 1.14.0.0.0) @@ -42,8 +41,6 @@ GEM crack (0.4.5) rexml cri (2.15.11) - datadog-ci (0.5.0) - msgpack debase-ruby_core_source (3.2.3) debug_inspector (1.1.0) diff-lcs (1.5.0) diff --git a/gemfiles/ruby_2.7_relational_db.gemfile.lock b/gemfiles/ruby_2.7_relational_db.gemfile.lock index fa0b1736c73..80452b22cf9 100644 --- a/gemfiles/ruby_2.7_relational_db.gemfile.lock +++ b/gemfiles/ruby_2.7_relational_db.gemfile.lock @@ -12,7 +12,6 @@ PATH remote: .. specs: ddtrace (1.18.0) - datadog-ci (~> 0.5.0) debase-ruby_core_source (= 3.2.3) libdatadog (~> 5.0.0.1.0) libddwaf (~> 1.14.0.0.0) @@ -52,8 +51,6 @@ GEM crack (0.4.5) rexml cri (2.15.11) - datadog-ci (0.5.0) - msgpack debase-ruby_core_source (3.2.3) debug_inspector (1.1.0) delayed_job (4.1.11) diff --git a/gemfiles/ruby_2.7_resque2_redis3.gemfile.lock b/gemfiles/ruby_2.7_resque2_redis3.gemfile.lock index b4184af6a2e..b33434df59e 100644 --- a/gemfiles/ruby_2.7_resque2_redis3.gemfile.lock +++ b/gemfiles/ruby_2.7_resque2_redis3.gemfile.lock @@ -12,7 +12,6 @@ PATH remote: .. specs: ddtrace (1.18.0) - datadog-ci (~> 0.5.0) debase-ruby_core_source (= 3.2.3) libdatadog (~> 5.0.0.1.0) libddwaf (~> 1.14.0.0.0) @@ -41,8 +40,6 @@ GEM crack (0.4.5) rexml cri (2.15.11) - datadog-ci (0.5.0) - msgpack debase-ruby_core_source (3.2.3) debug_inspector (1.1.0) diff-lcs (1.5.0) diff --git a/gemfiles/ruby_2.7_resque2_redis4.gemfile.lock b/gemfiles/ruby_2.7_resque2_redis4.gemfile.lock index 1fc6ecbddcd..7cda27d1256 100644 --- a/gemfiles/ruby_2.7_resque2_redis4.gemfile.lock +++ b/gemfiles/ruby_2.7_resque2_redis4.gemfile.lock @@ -12,7 +12,6 @@ PATH remote: .. specs: ddtrace (1.18.0) - datadog-ci (~> 0.5.0) debase-ruby_core_source (= 3.2.3) libdatadog (~> 5.0.0.1.0) libddwaf (~> 1.14.0.0.0) @@ -41,8 +40,6 @@ GEM crack (0.4.5) rexml cri (2.15.11) - datadog-ci (0.5.0) - msgpack debase-ruby_core_source (3.2.3) debug_inspector (1.1.0) diff-lcs (1.5.0) diff --git a/gemfiles/ruby_2.7_sinatra.gemfile.lock b/gemfiles/ruby_2.7_sinatra.gemfile.lock index a51023323a6..8a39799444a 100644 --- a/gemfiles/ruby_2.7_sinatra.gemfile.lock +++ b/gemfiles/ruby_2.7_sinatra.gemfile.lock @@ -12,7 +12,6 @@ PATH remote: .. specs: ddtrace (1.18.0) - datadog-ci (~> 0.5.0) debase-ruby_core_source (= 3.2.3) libdatadog (~> 5.0.0.1.0) libddwaf (~> 1.14.0.0.0) @@ -41,8 +40,6 @@ GEM crack (0.4.5) rexml cri (2.15.11) - datadog-ci (0.5.0) - msgpack debase-ruby_core_source (3.2.3) debug_inspector (1.1.0) diff-lcs (1.5.0) diff --git a/gemfiles/ruby_3.0_activesupport.gemfile.lock b/gemfiles/ruby_3.0_activesupport.gemfile.lock index 5b4f9e5655c..9b7a93645a3 100644 --- a/gemfiles/ruby_3.0_activesupport.gemfile.lock +++ b/gemfiles/ruby_3.0_activesupport.gemfile.lock @@ -12,7 +12,6 @@ PATH remote: .. specs: ddtrace (1.18.0) - datadog-ci (~> 0.5.0) debase-ruby_core_source (= 3.2.3) libdatadog (~> 5.0.0.1.0) libddwaf (~> 1.14.0.0.0) @@ -69,8 +68,6 @@ GEM rexml crass (1.0.6) cri (2.15.11) - datadog-ci (0.5.0) - msgpack debase-ruby_core_source (3.2.3) debug_inspector (1.1.0) diff-lcs (1.5.0) diff --git a/gemfiles/ruby_3.0_aws.gemfile.lock b/gemfiles/ruby_3.0_aws.gemfile.lock index 65bbd3956cd..1b698a9f27a 100644 --- a/gemfiles/ruby_3.0_aws.gemfile.lock +++ b/gemfiles/ruby_3.0_aws.gemfile.lock @@ -12,7 +12,6 @@ PATH remote: .. specs: ddtrace (1.18.0) - datadog-ci (~> 0.5.0) debase-ruby_core_source (= 3.2.3) libdatadog (~> 5.0.0.1.0) libddwaf (~> 1.14.0.0.0) @@ -1462,8 +1461,6 @@ GEM crack (0.4.5) rexml cri (2.15.11) - datadog-ci (0.5.0) - msgpack debase-ruby_core_source (3.2.3) debug_inspector (1.1.0) diff-lcs (1.5.0) diff --git a/gemfiles/ruby_3.0_contrib.gemfile.lock b/gemfiles/ruby_3.0_contrib.gemfile.lock index 4a59218b175..90cf62c40ca 100644 --- a/gemfiles/ruby_3.0_contrib.gemfile.lock +++ b/gemfiles/ruby_3.0_contrib.gemfile.lock @@ -12,7 +12,6 @@ PATH remote: .. specs: ddtrace (1.18.0) - datadog-ci (~> 0.5.0) debase-ruby_core_source (= 3.2.3) libdatadog (~> 5.0.0.1.0) libddwaf (~> 1.14.0.0.0) @@ -48,8 +47,6 @@ GEM rexml cri (2.15.11) dalli (3.2.4) - datadog-ci (0.5.0) - msgpack debase-ruby_core_source (3.2.3) debug_inspector (1.1.0) diff-lcs (1.5.0) diff --git a/gemfiles/ruby_3.0_contrib_old.gemfile.lock b/gemfiles/ruby_3.0_contrib_old.gemfile.lock index 7ff26065830..1e07bc9d28d 100644 --- a/gemfiles/ruby_3.0_contrib_old.gemfile.lock +++ b/gemfiles/ruby_3.0_contrib_old.gemfile.lock @@ -12,7 +12,6 @@ PATH remote: .. specs: ddtrace (1.18.0) - datadog-ci (~> 0.5.0) debase-ruby_core_source (= 3.2.3) libdatadog (~> 5.0.0.1.0) libddwaf (~> 1.14.0.0.0) @@ -46,8 +45,6 @@ GEM cri (2.15.11) daemons (1.4.1) dalli (2.7.11) - datadog-ci (0.5.0) - msgpack debase-ruby_core_source (3.2.3) debug_inspector (1.1.0) diff-lcs (1.5.0) diff --git a/gemfiles/ruby_3.0_core_old.gemfile.lock b/gemfiles/ruby_3.0_core_old.gemfile.lock index 57e7c3953a8..7fd454a4021 100644 --- a/gemfiles/ruby_3.0_core_old.gemfile.lock +++ b/gemfiles/ruby_3.0_core_old.gemfile.lock @@ -12,7 +12,6 @@ PATH remote: .. specs: ddtrace (1.18.0) - datadog-ci (~> 0.5.0) debase-ruby_core_source (= 3.2.3) libdatadog (~> 5.0.0.1.0) libddwaf (~> 1.14.0.0.0) @@ -41,8 +40,6 @@ GEM crack (0.4.5) rexml cri (2.15.11) - datadog-ci (0.5.0) - msgpack debase-ruby_core_source (3.2.3) debug_inspector (1.1.0) diff-lcs (1.5.0) diff --git a/gemfiles/ruby_3.0_elasticsearch_7.gemfile.lock b/gemfiles/ruby_3.0_elasticsearch_7.gemfile.lock index 19fd7087ad4..6140b8877e3 100644 --- a/gemfiles/ruby_3.0_elasticsearch_7.gemfile.lock +++ b/gemfiles/ruby_3.0_elasticsearch_7.gemfile.lock @@ -12,7 +12,6 @@ PATH remote: .. specs: ddtrace (1.18.0) - datadog-ci (~> 0.5.0) debase-ruby_core_source (= 3.2.3) libdatadog (~> 5.0.0.1.0) libddwaf (~> 1.14.0.0.0) @@ -42,8 +41,6 @@ GEM crack (0.4.5) rexml cri (2.15.11) - datadog-ci (0.5.0) - msgpack debase-ruby_core_source (3.2.3) debug_inspector (1.1.0) diff-lcs (1.5.0) diff --git a/gemfiles/ruby_3.0_elasticsearch_8.gemfile.lock b/gemfiles/ruby_3.0_elasticsearch_8.gemfile.lock index 4baa2d4a4eb..23875bf8a95 100644 --- a/gemfiles/ruby_3.0_elasticsearch_8.gemfile.lock +++ b/gemfiles/ruby_3.0_elasticsearch_8.gemfile.lock @@ -12,7 +12,6 @@ PATH remote: .. specs: ddtrace (1.18.0) - datadog-ci (~> 0.5.0) debase-ruby_core_source (= 3.2.3) libdatadog (~> 5.0.0.1.0) libddwaf (~> 1.14.0.0.0) @@ -43,8 +42,6 @@ GEM crack (0.4.5) rexml cri (2.15.11) - datadog-ci (0.5.0) - msgpack debase-ruby_core_source (3.2.3) debug_inspector (1.1.0) diff-lcs (1.5.0) diff --git a/gemfiles/ruby_3.0_http.gemfile.lock b/gemfiles/ruby_3.0_http.gemfile.lock index 04642c62520..891bde41a6a 100644 --- a/gemfiles/ruby_3.0_http.gemfile.lock +++ b/gemfiles/ruby_3.0_http.gemfile.lock @@ -12,7 +12,6 @@ PATH remote: .. specs: ddtrace (1.18.0) - datadog-ci (~> 0.5.0) debase-ruby_core_source (= 3.2.3) libdatadog (~> 5.0.0.1.0) libddwaf (~> 1.14.0.0.0) @@ -41,8 +40,6 @@ GEM crack (0.4.5) rexml cri (2.15.11) - datadog-ci (0.5.0) - msgpack debase-ruby_core_source (3.2.3) debug_inspector (1.1.0) diff-lcs (1.5.0) diff --git a/gemfiles/ruby_3.0_opensearch_2.gemfile.lock b/gemfiles/ruby_3.0_opensearch_2.gemfile.lock index 0ef9cf053cb..cc43595d8cf 100644 --- a/gemfiles/ruby_3.0_opensearch_2.gemfile.lock +++ b/gemfiles/ruby_3.0_opensearch_2.gemfile.lock @@ -12,7 +12,6 @@ PATH remote: .. specs: ddtrace (1.18.0) - datadog-ci (~> 0.5.0) debase-ruby_core_source (= 3.2.3) libdatadog (~> 5.0.0.1.0) libddwaf (~> 1.14.0.0.0) @@ -43,8 +42,6 @@ GEM crack (0.4.5) rexml cri (2.15.11) - datadog-ci (0.5.0) - msgpack debase-ruby_core_source (3.2.3) debug_inspector (1.1.0) diff-lcs (1.5.0) diff --git a/gemfiles/ruby_3.0_opensearch_3.gemfile.lock b/gemfiles/ruby_3.0_opensearch_3.gemfile.lock index e61447e0de5..07ba94afacc 100644 --- a/gemfiles/ruby_3.0_opensearch_3.gemfile.lock +++ b/gemfiles/ruby_3.0_opensearch_3.gemfile.lock @@ -12,7 +12,6 @@ PATH remote: .. specs: ddtrace (1.18.0) - datadog-ci (~> 0.5.0) debase-ruby_core_source (= 3.2.3) libdatadog (~> 5.0.0.1.0) libddwaf (~> 1.14.0.0.0) @@ -43,8 +42,6 @@ GEM crack (0.4.5) rexml cri (2.15.11) - datadog-ci (0.5.0) - msgpack debase-ruby_core_source (3.2.3) debug_inspector (1.1.0) diff-lcs (1.5.0) diff --git a/gemfiles/ruby_3.0_opentelemetry.gemfile.lock b/gemfiles/ruby_3.0_opentelemetry.gemfile.lock index a1bbbad7019..b9d49a6a7db 100755 --- a/gemfiles/ruby_3.0_opentelemetry.gemfile.lock +++ b/gemfiles/ruby_3.0_opentelemetry.gemfile.lock @@ -12,7 +12,6 @@ PATH remote: .. specs: ddtrace (1.18.0) - datadog-ci (~> 0.5.0) debase-ruby_core_source (= 3.2.3) libdatadog (~> 5.0.0.1.0) libddwaf (~> 1.14.0.0.0) @@ -41,8 +40,6 @@ GEM crack (0.4.5) rexml cri (2.15.11) - datadog-ci (0.5.0) - msgpack debase-ruby_core_source (3.2.3) debug_inspector (1.1.0) diff-lcs (1.5.0) diff --git a/gemfiles/ruby_3.0_opentracing.gemfile.lock b/gemfiles/ruby_3.0_opentracing.gemfile.lock index 638ac4f1238..c6612b2d65e 100644 --- a/gemfiles/ruby_3.0_opentracing.gemfile.lock +++ b/gemfiles/ruby_3.0_opentracing.gemfile.lock @@ -12,7 +12,6 @@ PATH remote: .. specs: ddtrace (1.18.0) - datadog-ci (~> 0.5.0) debase-ruby_core_source (= 3.2.3) libdatadog (~> 5.0.0.1.0) libddwaf (~> 1.14.0.0.0) @@ -42,8 +41,6 @@ GEM crack (0.4.5) rexml cri (2.15.11) - datadog-ci (0.5.0) - msgpack debase-ruby_core_source (3.2.3) debug_inspector (1.1.0) diff-lcs (1.5.0) diff --git a/gemfiles/ruby_3.0_rack_1.gemfile.lock b/gemfiles/ruby_3.0_rack_1.gemfile.lock index d3950c78691..3679d903919 100644 --- a/gemfiles/ruby_3.0_rack_1.gemfile.lock +++ b/gemfiles/ruby_3.0_rack_1.gemfile.lock @@ -12,7 +12,6 @@ PATH remote: .. specs: ddtrace (1.18.0) - datadog-ci (~> 0.5.0) debase-ruby_core_source (= 3.2.3) libdatadog (~> 5.0.0.1.0) libddwaf (~> 1.14.0.0.0) @@ -41,8 +40,6 @@ GEM crack (0.4.5) rexml cri (2.15.11) - datadog-ci (0.5.0) - msgpack debase-ruby_core_source (3.2.3) debug_inspector (1.1.0) diff-lcs (1.5.0) diff --git a/gemfiles/ruby_3.0_rack_2.gemfile.lock b/gemfiles/ruby_3.0_rack_2.gemfile.lock index e63ec6b1377..00f670f6aff 100644 --- a/gemfiles/ruby_3.0_rack_2.gemfile.lock +++ b/gemfiles/ruby_3.0_rack_2.gemfile.lock @@ -12,7 +12,6 @@ PATH remote: .. specs: ddtrace (1.18.0) - datadog-ci (~> 0.5.0) debase-ruby_core_source (= 3.2.3) libdatadog (~> 5.0.0.1.0) libddwaf (~> 1.14.0.0.0) @@ -41,8 +40,6 @@ GEM crack (0.4.5) rexml cri (2.15.11) - datadog-ci (0.5.0) - msgpack debase-ruby_core_source (3.2.3) debug_inspector (1.1.0) diff-lcs (1.5.0) diff --git a/gemfiles/ruby_3.0_rack_3.gemfile.lock b/gemfiles/ruby_3.0_rack_3.gemfile.lock index f57578ec7c7..60bfb256850 100644 --- a/gemfiles/ruby_3.0_rack_3.gemfile.lock +++ b/gemfiles/ruby_3.0_rack_3.gemfile.lock @@ -12,7 +12,6 @@ PATH remote: .. specs: ddtrace (1.18.0) - datadog-ci (~> 0.5.0) debase-ruby_core_source (= 3.2.3) libdatadog (~> 5.0.0.1.0) libddwaf (~> 1.14.0.0.0) @@ -41,8 +40,6 @@ GEM crack (0.4.5) rexml cri (2.15.11) - datadog-ci (0.5.0) - msgpack debase-ruby_core_source (3.2.3) debug_inspector (1.1.0) diff-lcs (1.5.0) diff --git a/gemfiles/ruby_3.0_rails61_mysql2.gemfile.lock b/gemfiles/ruby_3.0_rails61_mysql2.gemfile.lock index 364139af4b5..9073a913c15 100644 --- a/gemfiles/ruby_3.0_rails61_mysql2.gemfile.lock +++ b/gemfiles/ruby_3.0_rails61_mysql2.gemfile.lock @@ -12,7 +12,6 @@ PATH remote: .. specs: ddtrace (1.18.0) - datadog-ci (~> 0.5.0) debase-ruby_core_source (= 3.2.3) libdatadog (~> 5.0.0.1.0) libddwaf (~> 1.14.0.0.0) @@ -101,8 +100,6 @@ GEM rexml crass (1.0.6) cri (2.15.11) - datadog-ci (0.5.0) - msgpack date (3.3.3) debase-ruby_core_source (3.2.3) debug_inspector (1.1.0) diff --git a/gemfiles/ruby_3.0_rails61_postgres.gemfile.lock b/gemfiles/ruby_3.0_rails61_postgres.gemfile.lock index a125b6abec8..b302a9c4609 100644 --- a/gemfiles/ruby_3.0_rails61_postgres.gemfile.lock +++ b/gemfiles/ruby_3.0_rails61_postgres.gemfile.lock @@ -12,7 +12,6 @@ PATH remote: .. specs: ddtrace (1.18.0) - datadog-ci (~> 0.5.0) debase-ruby_core_source (= 3.2.3) libdatadog (~> 5.0.0.1.0) libddwaf (~> 1.14.0.0.0) @@ -101,8 +100,6 @@ GEM rexml crass (1.0.6) cri (2.15.11) - datadog-ci (0.5.0) - msgpack date (3.3.3) debase-ruby_core_source (3.2.3) debug_inspector (1.1.0) diff --git a/gemfiles/ruby_3.0_rails61_postgres_redis.gemfile.lock b/gemfiles/ruby_3.0_rails61_postgres_redis.gemfile.lock index 2b8369a87f8..2ea0ef1ca55 100644 --- a/gemfiles/ruby_3.0_rails61_postgres_redis.gemfile.lock +++ b/gemfiles/ruby_3.0_rails61_postgres_redis.gemfile.lock @@ -12,7 +12,6 @@ PATH remote: .. specs: ddtrace (1.18.0) - datadog-ci (~> 0.5.0) debase-ruby_core_source (= 3.2.3) libdatadog (~> 5.0.0.1.0) libddwaf (~> 1.14.0.0.0) @@ -101,8 +100,6 @@ GEM rexml crass (1.0.6) cri (2.15.11) - datadog-ci (0.5.0) - msgpack date (3.3.3) debase-ruby_core_source (3.2.3) debug_inspector (1.1.0) diff --git a/gemfiles/ruby_3.0_rails61_postgres_sidekiq.gemfile.lock b/gemfiles/ruby_3.0_rails61_postgres_sidekiq.gemfile.lock index e6c3c54a5c4..89bdeed2ca5 100644 --- a/gemfiles/ruby_3.0_rails61_postgres_sidekiq.gemfile.lock +++ b/gemfiles/ruby_3.0_rails61_postgres_sidekiq.gemfile.lock @@ -12,7 +12,6 @@ PATH remote: .. specs: ddtrace (1.18.0) - datadog-ci (~> 0.5.0) debase-ruby_core_source (= 3.2.3) libdatadog (~> 5.0.0.1.0) libddwaf (~> 1.14.0.0.0) @@ -102,8 +101,6 @@ GEM rexml crass (1.0.6) cri (2.15.11) - datadog-ci (0.5.0) - msgpack date (3.3.3) debase-ruby_core_source (3.2.3) debug_inspector (1.1.0) diff --git a/gemfiles/ruby_3.0_rails61_semantic_logger.gemfile.lock b/gemfiles/ruby_3.0_rails61_semantic_logger.gemfile.lock index b1145f6319a..4fd12ee4364 100644 --- a/gemfiles/ruby_3.0_rails61_semantic_logger.gemfile.lock +++ b/gemfiles/ruby_3.0_rails61_semantic_logger.gemfile.lock @@ -12,7 +12,6 @@ PATH remote: .. specs: ddtrace (1.18.0) - datadog-ci (~> 0.5.0) debase-ruby_core_source (= 3.2.3) libdatadog (~> 5.0.0.1.0) libddwaf (~> 1.14.0.0.0) @@ -101,8 +100,6 @@ GEM rexml crass (1.0.6) cri (2.15.11) - datadog-ci (0.5.0) - msgpack date (3.3.3) debase-ruby_core_source (3.2.3) debug_inspector (1.1.0) diff --git a/gemfiles/ruby_3.0_redis_3.gemfile.lock b/gemfiles/ruby_3.0_redis_3.gemfile.lock index 64b4d96dd2e..b43f82f142c 100644 --- a/gemfiles/ruby_3.0_redis_3.gemfile.lock +++ b/gemfiles/ruby_3.0_redis_3.gemfile.lock @@ -12,7 +12,6 @@ PATH remote: .. specs: ddtrace (1.18.0) - datadog-ci (~> 0.5.0) debase-ruby_core_source (= 3.2.3) libdatadog (~> 5.0.0.1.0) libddwaf (~> 1.14.0.0.0) @@ -41,8 +40,6 @@ GEM crack (0.4.5) rexml cri (2.15.11) - datadog-ci (0.5.0) - msgpack debase-ruby_core_source (3.2.3) debug_inspector (1.1.0) diff-lcs (1.5.0) diff --git a/gemfiles/ruby_3.0_redis_4.gemfile.lock b/gemfiles/ruby_3.0_redis_4.gemfile.lock index d955d9b9b16..49b667fdc2f 100644 --- a/gemfiles/ruby_3.0_redis_4.gemfile.lock +++ b/gemfiles/ruby_3.0_redis_4.gemfile.lock @@ -12,7 +12,6 @@ PATH remote: .. specs: ddtrace (1.18.0) - datadog-ci (~> 0.5.0) debase-ruby_core_source (= 3.2.3) libdatadog (~> 5.0.0.1.0) libddwaf (~> 1.14.0.0.0) @@ -41,8 +40,6 @@ GEM crack (0.4.5) rexml cri (2.15.11) - datadog-ci (0.5.0) - msgpack debase-ruby_core_source (3.2.3) debug_inspector (1.1.0) diff-lcs (1.5.0) diff --git a/gemfiles/ruby_3.0_redis_5.gemfile.lock b/gemfiles/ruby_3.0_redis_5.gemfile.lock index a455deb830f..8077a225a5d 100644 --- a/gemfiles/ruby_3.0_redis_5.gemfile.lock +++ b/gemfiles/ruby_3.0_redis_5.gemfile.lock @@ -12,7 +12,6 @@ PATH remote: .. specs: ddtrace (1.18.0) - datadog-ci (~> 0.5.0) debase-ruby_core_source (= 3.2.3) libdatadog (~> 5.0.0.1.0) libddwaf (~> 1.14.0.0.0) @@ -42,8 +41,6 @@ GEM crack (0.4.5) rexml cri (2.15.11) - datadog-ci (0.5.0) - msgpack debase-ruby_core_source (3.2.3) debug_inspector (1.1.0) diff-lcs (1.5.0) diff --git a/gemfiles/ruby_3.0_relational_db.gemfile.lock b/gemfiles/ruby_3.0_relational_db.gemfile.lock index 33c627d6ae2..2e4fc00090f 100644 --- a/gemfiles/ruby_3.0_relational_db.gemfile.lock +++ b/gemfiles/ruby_3.0_relational_db.gemfile.lock @@ -12,7 +12,6 @@ PATH remote: .. specs: ddtrace (1.18.0) - datadog-ci (~> 0.5.0) debase-ruby_core_source (= 3.2.3) libdatadog (~> 5.0.0.1.0) libddwaf (~> 1.14.0.0.0) @@ -51,8 +50,6 @@ GEM crack (0.4.5) rexml cri (2.15.11) - datadog-ci (0.5.0) - msgpack debase-ruby_core_source (3.2.3) debug_inspector (1.1.0) delayed_job (4.1.11) diff --git a/gemfiles/ruby_3.0_resque2_redis3.gemfile.lock b/gemfiles/ruby_3.0_resque2_redis3.gemfile.lock index c4c7eb9ecdb..9a6ef1a820e 100644 --- a/gemfiles/ruby_3.0_resque2_redis3.gemfile.lock +++ b/gemfiles/ruby_3.0_resque2_redis3.gemfile.lock @@ -12,7 +12,6 @@ PATH remote: .. specs: ddtrace (1.18.0) - datadog-ci (~> 0.5.0) debase-ruby_core_source (= 3.2.3) libdatadog (~> 5.0.0.1.0) libddwaf (~> 1.14.0.0.0) @@ -41,8 +40,6 @@ GEM crack (0.4.5) rexml cri (2.15.11) - datadog-ci (0.5.0) - msgpack debase-ruby_core_source (3.2.3) debug_inspector (1.1.0) diff-lcs (1.5.0) diff --git a/gemfiles/ruby_3.0_resque2_redis4.gemfile.lock b/gemfiles/ruby_3.0_resque2_redis4.gemfile.lock index 9dd1a76eb6e..db9a86ea252 100644 --- a/gemfiles/ruby_3.0_resque2_redis4.gemfile.lock +++ b/gemfiles/ruby_3.0_resque2_redis4.gemfile.lock @@ -12,7 +12,6 @@ PATH remote: .. specs: ddtrace (1.18.0) - datadog-ci (~> 0.5.0) debase-ruby_core_source (= 3.2.3) libdatadog (~> 5.0.0.1.0) libddwaf (~> 1.14.0.0.0) @@ -42,8 +41,6 @@ GEM crack (0.4.5) rexml cri (2.15.11) - datadog-ci (0.5.0) - msgpack debase-ruby_core_source (3.2.3) debug_inspector (1.1.0) diff-lcs (1.5.0) diff --git a/gemfiles/ruby_3.0_sinatra.gemfile.lock b/gemfiles/ruby_3.0_sinatra.gemfile.lock index a47692ab8f1..78123614ed1 100644 --- a/gemfiles/ruby_3.0_sinatra.gemfile.lock +++ b/gemfiles/ruby_3.0_sinatra.gemfile.lock @@ -12,7 +12,6 @@ PATH remote: .. specs: ddtrace (1.18.0) - datadog-ci (~> 0.5.0) debase-ruby_core_source (= 3.2.3) libdatadog (~> 5.0.0.1.0) libddwaf (~> 1.14.0.0.0) @@ -41,8 +40,6 @@ GEM crack (0.4.5) rexml cri (2.15.11) - datadog-ci (0.5.0) - msgpack debase-ruby_core_source (3.2.3) debug_inspector (1.1.0) diff-lcs (1.5.0) diff --git a/gemfiles/ruby_3.1_activesupport.gemfile.lock b/gemfiles/ruby_3.1_activesupport.gemfile.lock index 5b4f9e5655c..9b7a93645a3 100644 --- a/gemfiles/ruby_3.1_activesupport.gemfile.lock +++ b/gemfiles/ruby_3.1_activesupport.gemfile.lock @@ -12,7 +12,6 @@ PATH remote: .. specs: ddtrace (1.18.0) - datadog-ci (~> 0.5.0) debase-ruby_core_source (= 3.2.3) libdatadog (~> 5.0.0.1.0) libddwaf (~> 1.14.0.0.0) @@ -69,8 +68,6 @@ GEM rexml crass (1.0.6) cri (2.15.11) - datadog-ci (0.5.0) - msgpack debase-ruby_core_source (3.2.3) debug_inspector (1.1.0) diff-lcs (1.5.0) diff --git a/gemfiles/ruby_3.1_aws.gemfile.lock b/gemfiles/ruby_3.1_aws.gemfile.lock index 65bbd3956cd..1b698a9f27a 100644 --- a/gemfiles/ruby_3.1_aws.gemfile.lock +++ b/gemfiles/ruby_3.1_aws.gemfile.lock @@ -12,7 +12,6 @@ PATH remote: .. specs: ddtrace (1.18.0) - datadog-ci (~> 0.5.0) debase-ruby_core_source (= 3.2.3) libdatadog (~> 5.0.0.1.0) libddwaf (~> 1.14.0.0.0) @@ -1462,8 +1461,6 @@ GEM crack (0.4.5) rexml cri (2.15.11) - datadog-ci (0.5.0) - msgpack debase-ruby_core_source (3.2.3) debug_inspector (1.1.0) diff-lcs (1.5.0) diff --git a/gemfiles/ruby_3.1_contrib.gemfile.lock b/gemfiles/ruby_3.1_contrib.gemfile.lock index 4a59218b175..90cf62c40ca 100644 --- a/gemfiles/ruby_3.1_contrib.gemfile.lock +++ b/gemfiles/ruby_3.1_contrib.gemfile.lock @@ -12,7 +12,6 @@ PATH remote: .. specs: ddtrace (1.18.0) - datadog-ci (~> 0.5.0) debase-ruby_core_source (= 3.2.3) libdatadog (~> 5.0.0.1.0) libddwaf (~> 1.14.0.0.0) @@ -48,8 +47,6 @@ GEM rexml cri (2.15.11) dalli (3.2.4) - datadog-ci (0.5.0) - msgpack debase-ruby_core_source (3.2.3) debug_inspector (1.1.0) diff-lcs (1.5.0) diff --git a/gemfiles/ruby_3.1_contrib_old.gemfile.lock b/gemfiles/ruby_3.1_contrib_old.gemfile.lock index 7ff26065830..1e07bc9d28d 100644 --- a/gemfiles/ruby_3.1_contrib_old.gemfile.lock +++ b/gemfiles/ruby_3.1_contrib_old.gemfile.lock @@ -12,7 +12,6 @@ PATH remote: .. specs: ddtrace (1.18.0) - datadog-ci (~> 0.5.0) debase-ruby_core_source (= 3.2.3) libdatadog (~> 5.0.0.1.0) libddwaf (~> 1.14.0.0.0) @@ -46,8 +45,6 @@ GEM cri (2.15.11) daemons (1.4.1) dalli (2.7.11) - datadog-ci (0.5.0) - msgpack debase-ruby_core_source (3.2.3) debug_inspector (1.1.0) diff-lcs (1.5.0) diff --git a/gemfiles/ruby_3.1_core_old.gemfile.lock b/gemfiles/ruby_3.1_core_old.gemfile.lock index 57e7c3953a8..7fd454a4021 100644 --- a/gemfiles/ruby_3.1_core_old.gemfile.lock +++ b/gemfiles/ruby_3.1_core_old.gemfile.lock @@ -12,7 +12,6 @@ PATH remote: .. specs: ddtrace (1.18.0) - datadog-ci (~> 0.5.0) debase-ruby_core_source (= 3.2.3) libdatadog (~> 5.0.0.1.0) libddwaf (~> 1.14.0.0.0) @@ -41,8 +40,6 @@ GEM crack (0.4.5) rexml cri (2.15.11) - datadog-ci (0.5.0) - msgpack debase-ruby_core_source (3.2.3) debug_inspector (1.1.0) diff-lcs (1.5.0) diff --git a/gemfiles/ruby_3.1_elasticsearch_7.gemfile.lock b/gemfiles/ruby_3.1_elasticsearch_7.gemfile.lock index 19fd7087ad4..6140b8877e3 100644 --- a/gemfiles/ruby_3.1_elasticsearch_7.gemfile.lock +++ b/gemfiles/ruby_3.1_elasticsearch_7.gemfile.lock @@ -12,7 +12,6 @@ PATH remote: .. specs: ddtrace (1.18.0) - datadog-ci (~> 0.5.0) debase-ruby_core_source (= 3.2.3) libdatadog (~> 5.0.0.1.0) libddwaf (~> 1.14.0.0.0) @@ -42,8 +41,6 @@ GEM crack (0.4.5) rexml cri (2.15.11) - datadog-ci (0.5.0) - msgpack debase-ruby_core_source (3.2.3) debug_inspector (1.1.0) diff-lcs (1.5.0) diff --git a/gemfiles/ruby_3.1_elasticsearch_8.gemfile.lock b/gemfiles/ruby_3.1_elasticsearch_8.gemfile.lock index 4baa2d4a4eb..23875bf8a95 100644 --- a/gemfiles/ruby_3.1_elasticsearch_8.gemfile.lock +++ b/gemfiles/ruby_3.1_elasticsearch_8.gemfile.lock @@ -12,7 +12,6 @@ PATH remote: .. specs: ddtrace (1.18.0) - datadog-ci (~> 0.5.0) debase-ruby_core_source (= 3.2.3) libdatadog (~> 5.0.0.1.0) libddwaf (~> 1.14.0.0.0) @@ -43,8 +42,6 @@ GEM crack (0.4.5) rexml cri (2.15.11) - datadog-ci (0.5.0) - msgpack debase-ruby_core_source (3.2.3) debug_inspector (1.1.0) diff-lcs (1.5.0) diff --git a/gemfiles/ruby_3.1_http.gemfile.lock b/gemfiles/ruby_3.1_http.gemfile.lock index 04642c62520..891bde41a6a 100644 --- a/gemfiles/ruby_3.1_http.gemfile.lock +++ b/gemfiles/ruby_3.1_http.gemfile.lock @@ -12,7 +12,6 @@ PATH remote: .. specs: ddtrace (1.18.0) - datadog-ci (~> 0.5.0) debase-ruby_core_source (= 3.2.3) libdatadog (~> 5.0.0.1.0) libddwaf (~> 1.14.0.0.0) @@ -41,8 +40,6 @@ GEM crack (0.4.5) rexml cri (2.15.11) - datadog-ci (0.5.0) - msgpack debase-ruby_core_source (3.2.3) debug_inspector (1.1.0) diff-lcs (1.5.0) diff --git a/gemfiles/ruby_3.1_opensearch_2.gemfile.lock b/gemfiles/ruby_3.1_opensearch_2.gemfile.lock index 0ef9cf053cb..cc43595d8cf 100644 --- a/gemfiles/ruby_3.1_opensearch_2.gemfile.lock +++ b/gemfiles/ruby_3.1_opensearch_2.gemfile.lock @@ -12,7 +12,6 @@ PATH remote: .. specs: ddtrace (1.18.0) - datadog-ci (~> 0.5.0) debase-ruby_core_source (= 3.2.3) libdatadog (~> 5.0.0.1.0) libddwaf (~> 1.14.0.0.0) @@ -43,8 +42,6 @@ GEM crack (0.4.5) rexml cri (2.15.11) - datadog-ci (0.5.0) - msgpack debase-ruby_core_source (3.2.3) debug_inspector (1.1.0) diff-lcs (1.5.0) diff --git a/gemfiles/ruby_3.1_opensearch_3.gemfile.lock b/gemfiles/ruby_3.1_opensearch_3.gemfile.lock index e61447e0de5..07ba94afacc 100644 --- a/gemfiles/ruby_3.1_opensearch_3.gemfile.lock +++ b/gemfiles/ruby_3.1_opensearch_3.gemfile.lock @@ -12,7 +12,6 @@ PATH remote: .. specs: ddtrace (1.18.0) - datadog-ci (~> 0.5.0) debase-ruby_core_source (= 3.2.3) libdatadog (~> 5.0.0.1.0) libddwaf (~> 1.14.0.0.0) @@ -43,8 +42,6 @@ GEM crack (0.4.5) rexml cri (2.15.11) - datadog-ci (0.5.0) - msgpack debase-ruby_core_source (3.2.3) debug_inspector (1.1.0) diff-lcs (1.5.0) diff --git a/gemfiles/ruby_3.1_opentelemetry.gemfile.lock b/gemfiles/ruby_3.1_opentelemetry.gemfile.lock index 1805c216c38..73f9d3bde4a 100644 --- a/gemfiles/ruby_3.1_opentelemetry.gemfile.lock +++ b/gemfiles/ruby_3.1_opentelemetry.gemfile.lock @@ -12,7 +12,6 @@ PATH remote: .. specs: ddtrace (1.18.0) - datadog-ci (~> 0.5.0) debase-ruby_core_source (= 3.2.3) libdatadog (~> 5.0.0.1.0) libddwaf (~> 1.14.0.0.0) @@ -41,8 +40,6 @@ GEM crack (0.4.5) rexml cri (2.15.11) - datadog-ci (0.5.0) - msgpack debase-ruby_core_source (3.2.3) debug_inspector (1.1.0) diff-lcs (1.5.0) diff --git a/gemfiles/ruby_3.1_opentracing.gemfile.lock b/gemfiles/ruby_3.1_opentracing.gemfile.lock index 638ac4f1238..c6612b2d65e 100644 --- a/gemfiles/ruby_3.1_opentracing.gemfile.lock +++ b/gemfiles/ruby_3.1_opentracing.gemfile.lock @@ -12,7 +12,6 @@ PATH remote: .. specs: ddtrace (1.18.0) - datadog-ci (~> 0.5.0) debase-ruby_core_source (= 3.2.3) libdatadog (~> 5.0.0.1.0) libddwaf (~> 1.14.0.0.0) @@ -42,8 +41,6 @@ GEM crack (0.4.5) rexml cri (2.15.11) - datadog-ci (0.5.0) - msgpack debase-ruby_core_source (3.2.3) debug_inspector (1.1.0) diff-lcs (1.5.0) diff --git a/gemfiles/ruby_3.1_rack_1.gemfile.lock b/gemfiles/ruby_3.1_rack_1.gemfile.lock index d3950c78691..3679d903919 100644 --- a/gemfiles/ruby_3.1_rack_1.gemfile.lock +++ b/gemfiles/ruby_3.1_rack_1.gemfile.lock @@ -12,7 +12,6 @@ PATH remote: .. specs: ddtrace (1.18.0) - datadog-ci (~> 0.5.0) debase-ruby_core_source (= 3.2.3) libdatadog (~> 5.0.0.1.0) libddwaf (~> 1.14.0.0.0) @@ -41,8 +40,6 @@ GEM crack (0.4.5) rexml cri (2.15.11) - datadog-ci (0.5.0) - msgpack debase-ruby_core_source (3.2.3) debug_inspector (1.1.0) diff-lcs (1.5.0) diff --git a/gemfiles/ruby_3.1_rack_2.gemfile.lock b/gemfiles/ruby_3.1_rack_2.gemfile.lock index e63ec6b1377..00f670f6aff 100644 --- a/gemfiles/ruby_3.1_rack_2.gemfile.lock +++ b/gemfiles/ruby_3.1_rack_2.gemfile.lock @@ -12,7 +12,6 @@ PATH remote: .. specs: ddtrace (1.18.0) - datadog-ci (~> 0.5.0) debase-ruby_core_source (= 3.2.3) libdatadog (~> 5.0.0.1.0) libddwaf (~> 1.14.0.0.0) @@ -41,8 +40,6 @@ GEM crack (0.4.5) rexml cri (2.15.11) - datadog-ci (0.5.0) - msgpack debase-ruby_core_source (3.2.3) debug_inspector (1.1.0) diff-lcs (1.5.0) diff --git a/gemfiles/ruby_3.1_rack_3.gemfile.lock b/gemfiles/ruby_3.1_rack_3.gemfile.lock index f57578ec7c7..60bfb256850 100644 --- a/gemfiles/ruby_3.1_rack_3.gemfile.lock +++ b/gemfiles/ruby_3.1_rack_3.gemfile.lock @@ -12,7 +12,6 @@ PATH remote: .. specs: ddtrace (1.18.0) - datadog-ci (~> 0.5.0) debase-ruby_core_source (= 3.2.3) libdatadog (~> 5.0.0.1.0) libddwaf (~> 1.14.0.0.0) @@ -41,8 +40,6 @@ GEM crack (0.4.5) rexml cri (2.15.11) - datadog-ci (0.5.0) - msgpack debase-ruby_core_source (3.2.3) debug_inspector (1.1.0) diff-lcs (1.5.0) diff --git a/gemfiles/ruby_3.1_rails61_mysql2.gemfile.lock b/gemfiles/ruby_3.1_rails61_mysql2.gemfile.lock index 364139af4b5..9073a913c15 100644 --- a/gemfiles/ruby_3.1_rails61_mysql2.gemfile.lock +++ b/gemfiles/ruby_3.1_rails61_mysql2.gemfile.lock @@ -12,7 +12,6 @@ PATH remote: .. specs: ddtrace (1.18.0) - datadog-ci (~> 0.5.0) debase-ruby_core_source (= 3.2.3) libdatadog (~> 5.0.0.1.0) libddwaf (~> 1.14.0.0.0) @@ -101,8 +100,6 @@ GEM rexml crass (1.0.6) cri (2.15.11) - datadog-ci (0.5.0) - msgpack date (3.3.3) debase-ruby_core_source (3.2.3) debug_inspector (1.1.0) diff --git a/gemfiles/ruby_3.1_rails61_postgres.gemfile.lock b/gemfiles/ruby_3.1_rails61_postgres.gemfile.lock index a125b6abec8..b302a9c4609 100644 --- a/gemfiles/ruby_3.1_rails61_postgres.gemfile.lock +++ b/gemfiles/ruby_3.1_rails61_postgres.gemfile.lock @@ -12,7 +12,6 @@ PATH remote: .. specs: ddtrace (1.18.0) - datadog-ci (~> 0.5.0) debase-ruby_core_source (= 3.2.3) libdatadog (~> 5.0.0.1.0) libddwaf (~> 1.14.0.0.0) @@ -101,8 +100,6 @@ GEM rexml crass (1.0.6) cri (2.15.11) - datadog-ci (0.5.0) - msgpack date (3.3.3) debase-ruby_core_source (3.2.3) debug_inspector (1.1.0) diff --git a/gemfiles/ruby_3.1_rails61_postgres_redis.gemfile.lock b/gemfiles/ruby_3.1_rails61_postgres_redis.gemfile.lock index 2b8369a87f8..2ea0ef1ca55 100644 --- a/gemfiles/ruby_3.1_rails61_postgres_redis.gemfile.lock +++ b/gemfiles/ruby_3.1_rails61_postgres_redis.gemfile.lock @@ -12,7 +12,6 @@ PATH remote: .. specs: ddtrace (1.18.0) - datadog-ci (~> 0.5.0) debase-ruby_core_source (= 3.2.3) libdatadog (~> 5.0.0.1.0) libddwaf (~> 1.14.0.0.0) @@ -101,8 +100,6 @@ GEM rexml crass (1.0.6) cri (2.15.11) - datadog-ci (0.5.0) - msgpack date (3.3.3) debase-ruby_core_source (3.2.3) debug_inspector (1.1.0) diff --git a/gemfiles/ruby_3.1_rails61_postgres_sidekiq.gemfile.lock b/gemfiles/ruby_3.1_rails61_postgres_sidekiq.gemfile.lock index e6c3c54a5c4..89bdeed2ca5 100644 --- a/gemfiles/ruby_3.1_rails61_postgres_sidekiq.gemfile.lock +++ b/gemfiles/ruby_3.1_rails61_postgres_sidekiq.gemfile.lock @@ -12,7 +12,6 @@ PATH remote: .. specs: ddtrace (1.18.0) - datadog-ci (~> 0.5.0) debase-ruby_core_source (= 3.2.3) libdatadog (~> 5.0.0.1.0) libddwaf (~> 1.14.0.0.0) @@ -102,8 +101,6 @@ GEM rexml crass (1.0.6) cri (2.15.11) - datadog-ci (0.5.0) - msgpack date (3.3.3) debase-ruby_core_source (3.2.3) debug_inspector (1.1.0) diff --git a/gemfiles/ruby_3.1_rails61_semantic_logger.gemfile.lock b/gemfiles/ruby_3.1_rails61_semantic_logger.gemfile.lock index b1145f6319a..4fd12ee4364 100644 --- a/gemfiles/ruby_3.1_rails61_semantic_logger.gemfile.lock +++ b/gemfiles/ruby_3.1_rails61_semantic_logger.gemfile.lock @@ -12,7 +12,6 @@ PATH remote: .. specs: ddtrace (1.18.0) - datadog-ci (~> 0.5.0) debase-ruby_core_source (= 3.2.3) libdatadog (~> 5.0.0.1.0) libddwaf (~> 1.14.0.0.0) @@ -101,8 +100,6 @@ GEM rexml crass (1.0.6) cri (2.15.11) - datadog-ci (0.5.0) - msgpack date (3.3.3) debase-ruby_core_source (3.2.3) debug_inspector (1.1.0) diff --git a/gemfiles/ruby_3.1_redis_3.gemfile.lock b/gemfiles/ruby_3.1_redis_3.gemfile.lock index 64b4d96dd2e..b43f82f142c 100644 --- a/gemfiles/ruby_3.1_redis_3.gemfile.lock +++ b/gemfiles/ruby_3.1_redis_3.gemfile.lock @@ -12,7 +12,6 @@ PATH remote: .. specs: ddtrace (1.18.0) - datadog-ci (~> 0.5.0) debase-ruby_core_source (= 3.2.3) libdatadog (~> 5.0.0.1.0) libddwaf (~> 1.14.0.0.0) @@ -41,8 +40,6 @@ GEM crack (0.4.5) rexml cri (2.15.11) - datadog-ci (0.5.0) - msgpack debase-ruby_core_source (3.2.3) debug_inspector (1.1.0) diff-lcs (1.5.0) diff --git a/gemfiles/ruby_3.1_redis_4.gemfile.lock b/gemfiles/ruby_3.1_redis_4.gemfile.lock index d955d9b9b16..49b667fdc2f 100644 --- a/gemfiles/ruby_3.1_redis_4.gemfile.lock +++ b/gemfiles/ruby_3.1_redis_4.gemfile.lock @@ -12,7 +12,6 @@ PATH remote: .. specs: ddtrace (1.18.0) - datadog-ci (~> 0.5.0) debase-ruby_core_source (= 3.2.3) libdatadog (~> 5.0.0.1.0) libddwaf (~> 1.14.0.0.0) @@ -41,8 +40,6 @@ GEM crack (0.4.5) rexml cri (2.15.11) - datadog-ci (0.5.0) - msgpack debase-ruby_core_source (3.2.3) debug_inspector (1.1.0) diff-lcs (1.5.0) diff --git a/gemfiles/ruby_3.1_redis_5.gemfile.lock b/gemfiles/ruby_3.1_redis_5.gemfile.lock index a455deb830f..8077a225a5d 100644 --- a/gemfiles/ruby_3.1_redis_5.gemfile.lock +++ b/gemfiles/ruby_3.1_redis_5.gemfile.lock @@ -12,7 +12,6 @@ PATH remote: .. specs: ddtrace (1.18.0) - datadog-ci (~> 0.5.0) debase-ruby_core_source (= 3.2.3) libdatadog (~> 5.0.0.1.0) libddwaf (~> 1.14.0.0.0) @@ -42,8 +41,6 @@ GEM crack (0.4.5) rexml cri (2.15.11) - datadog-ci (0.5.0) - msgpack debase-ruby_core_source (3.2.3) debug_inspector (1.1.0) diff-lcs (1.5.0) diff --git a/gemfiles/ruby_3.1_relational_db.gemfile.lock b/gemfiles/ruby_3.1_relational_db.gemfile.lock index 33c627d6ae2..2e4fc00090f 100644 --- a/gemfiles/ruby_3.1_relational_db.gemfile.lock +++ b/gemfiles/ruby_3.1_relational_db.gemfile.lock @@ -12,7 +12,6 @@ PATH remote: .. specs: ddtrace (1.18.0) - datadog-ci (~> 0.5.0) debase-ruby_core_source (= 3.2.3) libdatadog (~> 5.0.0.1.0) libddwaf (~> 1.14.0.0.0) @@ -51,8 +50,6 @@ GEM crack (0.4.5) rexml cri (2.15.11) - datadog-ci (0.5.0) - msgpack debase-ruby_core_source (3.2.3) debug_inspector (1.1.0) delayed_job (4.1.11) diff --git a/gemfiles/ruby_3.1_resque2_redis3.gemfile.lock b/gemfiles/ruby_3.1_resque2_redis3.gemfile.lock index c4c7eb9ecdb..9a6ef1a820e 100644 --- a/gemfiles/ruby_3.1_resque2_redis3.gemfile.lock +++ b/gemfiles/ruby_3.1_resque2_redis3.gemfile.lock @@ -12,7 +12,6 @@ PATH remote: .. specs: ddtrace (1.18.0) - datadog-ci (~> 0.5.0) debase-ruby_core_source (= 3.2.3) libdatadog (~> 5.0.0.1.0) libddwaf (~> 1.14.0.0.0) @@ -41,8 +40,6 @@ GEM crack (0.4.5) rexml cri (2.15.11) - datadog-ci (0.5.0) - msgpack debase-ruby_core_source (3.2.3) debug_inspector (1.1.0) diff-lcs (1.5.0) diff --git a/gemfiles/ruby_3.1_resque2_redis4.gemfile.lock b/gemfiles/ruby_3.1_resque2_redis4.gemfile.lock index 9dd1a76eb6e..db9a86ea252 100644 --- a/gemfiles/ruby_3.1_resque2_redis4.gemfile.lock +++ b/gemfiles/ruby_3.1_resque2_redis4.gemfile.lock @@ -12,7 +12,6 @@ PATH remote: .. specs: ddtrace (1.18.0) - datadog-ci (~> 0.5.0) debase-ruby_core_source (= 3.2.3) libdatadog (~> 5.0.0.1.0) libddwaf (~> 1.14.0.0.0) @@ -42,8 +41,6 @@ GEM crack (0.4.5) rexml cri (2.15.11) - datadog-ci (0.5.0) - msgpack debase-ruby_core_source (3.2.3) debug_inspector (1.1.0) diff-lcs (1.5.0) diff --git a/gemfiles/ruby_3.1_sinatra.gemfile.lock b/gemfiles/ruby_3.1_sinatra.gemfile.lock index a47692ab8f1..78123614ed1 100644 --- a/gemfiles/ruby_3.1_sinatra.gemfile.lock +++ b/gemfiles/ruby_3.1_sinatra.gemfile.lock @@ -12,7 +12,6 @@ PATH remote: .. specs: ddtrace (1.18.0) - datadog-ci (~> 0.5.0) debase-ruby_core_source (= 3.2.3) libdatadog (~> 5.0.0.1.0) libddwaf (~> 1.14.0.0.0) @@ -41,8 +40,6 @@ GEM crack (0.4.5) rexml cri (2.15.11) - datadog-ci (0.5.0) - msgpack debase-ruby_core_source (3.2.3) debug_inspector (1.1.0) diff-lcs (1.5.0) diff --git a/gemfiles/ruby_3.2_activesupport.gemfile.lock b/gemfiles/ruby_3.2_activesupport.gemfile.lock index cc20771d4f2..a0633cc45d1 100644 --- a/gemfiles/ruby_3.2_activesupport.gemfile.lock +++ b/gemfiles/ruby_3.2_activesupport.gemfile.lock @@ -12,7 +12,6 @@ PATH remote: .. specs: ddtrace (1.18.0) - datadog-ci (~> 0.5.0) debase-ruby_core_source (= 3.2.3) libdatadog (~> 5.0.0.1.0) libddwaf (~> 1.14.0.0.0) @@ -68,8 +67,6 @@ GEM rexml crass (1.0.6) cri (2.15.11) - datadog-ci (0.5.0) - msgpack debase-ruby_core_source (3.2.3) debug_inspector (1.1.0) diff-lcs (1.5.0) diff --git a/gemfiles/ruby_3.2_aws.gemfile.lock b/gemfiles/ruby_3.2_aws.gemfile.lock index 83b2f91b2d9..cf7c6114517 100644 --- a/gemfiles/ruby_3.2_aws.gemfile.lock +++ b/gemfiles/ruby_3.2_aws.gemfile.lock @@ -12,7 +12,6 @@ PATH remote: .. specs: ddtrace (1.18.0) - datadog-ci (~> 0.5.0) debase-ruby_core_source (= 3.2.3) libdatadog (~> 5.0.0.1.0) libddwaf (~> 1.14.0.0.0) @@ -1461,8 +1460,6 @@ GEM crack (0.4.5) rexml cri (2.15.11) - datadog-ci (0.5.0) - msgpack debase-ruby_core_source (3.2.3) debug_inspector (1.1.0) diff-lcs (1.5.0) diff --git a/gemfiles/ruby_3.2_contrib.gemfile.lock b/gemfiles/ruby_3.2_contrib.gemfile.lock index ec7b62cca61..a685c9b951b 100644 --- a/gemfiles/ruby_3.2_contrib.gemfile.lock +++ b/gemfiles/ruby_3.2_contrib.gemfile.lock @@ -12,7 +12,6 @@ PATH remote: .. specs: ddtrace (1.18.0) - datadog-ci (~> 0.5.0) debase-ruby_core_source (= 3.2.3) libdatadog (~> 5.0.0.1.0) libddwaf (~> 1.14.0.0.0) @@ -47,8 +46,6 @@ GEM rexml cri (2.15.11) dalli (3.2.4) - datadog-ci (0.5.0) - msgpack debase-ruby_core_source (3.2.3) debug_inspector (1.1.0) diff-lcs (1.5.0) diff --git a/gemfiles/ruby_3.2_contrib_old.gemfile.lock b/gemfiles/ruby_3.2_contrib_old.gemfile.lock index 58044c9500f..a2d43a1e196 100644 --- a/gemfiles/ruby_3.2_contrib_old.gemfile.lock +++ b/gemfiles/ruby_3.2_contrib_old.gemfile.lock @@ -12,7 +12,6 @@ PATH remote: .. specs: ddtrace (1.18.0) - datadog-ci (~> 0.5.0) debase-ruby_core_source (= 3.2.3) libdatadog (~> 5.0.0.1.0) libddwaf (~> 1.14.0.0.0) @@ -45,8 +44,6 @@ GEM cri (2.15.11) daemons (1.4.1) dalli (2.7.11) - datadog-ci (0.5.0) - msgpack debase-ruby_core_source (3.2.3) debug_inspector (1.1.0) diff-lcs (1.5.0) diff --git a/gemfiles/ruby_3.2_core_old.gemfile.lock b/gemfiles/ruby_3.2_core_old.gemfile.lock index c9701fd20c6..75d6752fd9a 100644 --- a/gemfiles/ruby_3.2_core_old.gemfile.lock +++ b/gemfiles/ruby_3.2_core_old.gemfile.lock @@ -12,7 +12,6 @@ PATH remote: .. specs: ddtrace (1.18.0) - datadog-ci (~> 0.5.0) debase-ruby_core_source (= 3.2.3) libdatadog (~> 5.0.0.1.0) libddwaf (~> 1.14.0.0.0) @@ -40,8 +39,6 @@ GEM crack (0.4.5) rexml cri (2.15.11) - datadog-ci (0.5.0) - msgpack debase-ruby_core_source (3.2.3) debug_inspector (1.1.0) diff-lcs (1.5.0) diff --git a/gemfiles/ruby_3.2_elasticsearch_7.gemfile.lock b/gemfiles/ruby_3.2_elasticsearch_7.gemfile.lock index fe6c86c6da6..e23cf0dccb2 100644 --- a/gemfiles/ruby_3.2_elasticsearch_7.gemfile.lock +++ b/gemfiles/ruby_3.2_elasticsearch_7.gemfile.lock @@ -12,7 +12,6 @@ PATH remote: .. specs: ddtrace (1.18.0) - datadog-ci (~> 0.5.0) debase-ruby_core_source (= 3.2.3) libdatadog (~> 5.0.0.1.0) libddwaf (~> 1.14.0.0.0) @@ -41,8 +40,6 @@ GEM crack (0.4.5) rexml cri (2.15.11) - datadog-ci (0.5.0) - msgpack debase-ruby_core_source (3.2.3) debug_inspector (1.1.0) diff-lcs (1.5.0) diff --git a/gemfiles/ruby_3.2_elasticsearch_8.gemfile.lock b/gemfiles/ruby_3.2_elasticsearch_8.gemfile.lock index 0f2d5012868..8cf0e63f995 100644 --- a/gemfiles/ruby_3.2_elasticsearch_8.gemfile.lock +++ b/gemfiles/ruby_3.2_elasticsearch_8.gemfile.lock @@ -12,7 +12,6 @@ PATH remote: .. specs: ddtrace (1.18.0) - datadog-ci (~> 0.5.0) debase-ruby_core_source (= 3.2.3) libdatadog (~> 5.0.0.1.0) libddwaf (~> 1.14.0.0.0) @@ -42,8 +41,6 @@ GEM crack (0.4.5) rexml cri (2.15.11) - datadog-ci (0.5.0) - msgpack debase-ruby_core_source (3.2.3) debug_inspector (1.1.0) diff-lcs (1.5.0) diff --git a/gemfiles/ruby_3.2_http.gemfile.lock b/gemfiles/ruby_3.2_http.gemfile.lock index 800f6c02709..6eb4d789485 100644 --- a/gemfiles/ruby_3.2_http.gemfile.lock +++ b/gemfiles/ruby_3.2_http.gemfile.lock @@ -12,7 +12,6 @@ PATH remote: .. specs: ddtrace (1.18.0) - datadog-ci (~> 0.5.0) debase-ruby_core_source (= 3.2.3) libdatadog (~> 5.0.0.1.0) libddwaf (~> 1.14.0.0.0) @@ -40,8 +39,6 @@ GEM crack (0.4.5) rexml cri (2.15.11) - datadog-ci (0.5.0) - msgpack debase-ruby_core_source (3.2.3) debug_inspector (1.1.0) diff-lcs (1.5.0) diff --git a/gemfiles/ruby_3.2_opensearch_2.gemfile.lock b/gemfiles/ruby_3.2_opensearch_2.gemfile.lock index 26c9955e71f..2d1a8dc9299 100644 --- a/gemfiles/ruby_3.2_opensearch_2.gemfile.lock +++ b/gemfiles/ruby_3.2_opensearch_2.gemfile.lock @@ -12,7 +12,6 @@ PATH remote: .. specs: ddtrace (1.18.0) - datadog-ci (~> 0.5.0) debase-ruby_core_source (= 3.2.3) libdatadog (~> 5.0.0.1.0) libddwaf (~> 1.14.0.0.0) @@ -42,8 +41,6 @@ GEM crack (0.4.5) rexml cri (2.15.11) - datadog-ci (0.5.0) - msgpack debase-ruby_core_source (3.2.3) debug_inspector (1.1.0) diff-lcs (1.5.0) diff --git a/gemfiles/ruby_3.2_opensearch_3.gemfile.lock b/gemfiles/ruby_3.2_opensearch_3.gemfile.lock index 5048f3a182f..5da5fe6d672 100644 --- a/gemfiles/ruby_3.2_opensearch_3.gemfile.lock +++ b/gemfiles/ruby_3.2_opensearch_3.gemfile.lock @@ -12,7 +12,6 @@ PATH remote: .. specs: ddtrace (1.18.0) - datadog-ci (~> 0.5.0) debase-ruby_core_source (= 3.2.3) libdatadog (~> 5.0.0.1.0) libddwaf (~> 1.14.0.0.0) @@ -42,8 +41,6 @@ GEM crack (0.4.5) rexml cri (2.15.11) - datadog-ci (0.5.0) - msgpack debase-ruby_core_source (3.2.3) debug_inspector (1.1.0) diff-lcs (1.5.0) diff --git a/gemfiles/ruby_3.2_opentelemetry.gemfile.lock b/gemfiles/ruby_3.2_opentelemetry.gemfile.lock index 1454fa627f4..7a2aaad157d 100644 --- a/gemfiles/ruby_3.2_opentelemetry.gemfile.lock +++ b/gemfiles/ruby_3.2_opentelemetry.gemfile.lock @@ -12,7 +12,6 @@ PATH remote: .. specs: ddtrace (1.18.0) - datadog-ci (~> 0.5.0) debase-ruby_core_source (= 3.2.3) libdatadog (~> 5.0.0.1.0) libddwaf (~> 1.14.0.0.0) @@ -40,8 +39,6 @@ GEM crack (0.4.5) rexml cri (2.15.11) - datadog-ci (0.5.0) - msgpack debase-ruby_core_source (3.2.3) debug_inspector (1.1.0) diff-lcs (1.5.0) diff --git a/gemfiles/ruby_3.2_opentracing.gemfile.lock b/gemfiles/ruby_3.2_opentracing.gemfile.lock index 071f7e27421..248138bea23 100644 --- a/gemfiles/ruby_3.2_opentracing.gemfile.lock +++ b/gemfiles/ruby_3.2_opentracing.gemfile.lock @@ -12,7 +12,6 @@ PATH remote: .. specs: ddtrace (1.18.0) - datadog-ci (~> 0.5.0) debase-ruby_core_source (= 3.2.3) libdatadog (~> 5.0.0.1.0) libddwaf (~> 1.14.0.0.0) @@ -41,8 +40,6 @@ GEM crack (0.4.5) rexml cri (2.15.11) - datadog-ci (0.5.0) - msgpack debase-ruby_core_source (3.2.3) debug_inspector (1.1.0) diff-lcs (1.5.0) diff --git a/gemfiles/ruby_3.2_rack_1.gemfile.lock b/gemfiles/ruby_3.2_rack_1.gemfile.lock index 859700fd586..d35bc813721 100644 --- a/gemfiles/ruby_3.2_rack_1.gemfile.lock +++ b/gemfiles/ruby_3.2_rack_1.gemfile.lock @@ -12,7 +12,6 @@ PATH remote: .. specs: ddtrace (1.18.0) - datadog-ci (~> 0.5.0) debase-ruby_core_source (= 3.2.3) libdatadog (~> 5.0.0.1.0) libddwaf (~> 1.14.0.0.0) @@ -40,8 +39,6 @@ GEM crack (0.4.5) rexml cri (2.15.11) - datadog-ci (0.5.0) - msgpack debase-ruby_core_source (3.2.3) debug_inspector (1.1.0) diff-lcs (1.5.0) diff --git a/gemfiles/ruby_3.2_rack_2.gemfile.lock b/gemfiles/ruby_3.2_rack_2.gemfile.lock index 26449de6785..f4d5de5b995 100644 --- a/gemfiles/ruby_3.2_rack_2.gemfile.lock +++ b/gemfiles/ruby_3.2_rack_2.gemfile.lock @@ -12,7 +12,6 @@ PATH remote: .. specs: ddtrace (1.18.0) - datadog-ci (~> 0.5.0) debase-ruby_core_source (= 3.2.3) libdatadog (~> 5.0.0.1.0) libddwaf (~> 1.14.0.0.0) @@ -40,8 +39,6 @@ GEM crack (0.4.5) rexml cri (2.15.11) - datadog-ci (0.5.0) - msgpack debase-ruby_core_source (3.2.3) debug_inspector (1.1.0) diff-lcs (1.5.0) diff --git a/gemfiles/ruby_3.2_rack_3.gemfile.lock b/gemfiles/ruby_3.2_rack_3.gemfile.lock index 0ba9ba14903..9e3b4793e89 100644 --- a/gemfiles/ruby_3.2_rack_3.gemfile.lock +++ b/gemfiles/ruby_3.2_rack_3.gemfile.lock @@ -12,7 +12,6 @@ PATH remote: .. specs: ddtrace (1.18.0) - datadog-ci (~> 0.5.0) debase-ruby_core_source (= 3.2.3) libdatadog (~> 5.0.0.1.0) libddwaf (~> 1.14.0.0.0) @@ -40,8 +39,6 @@ GEM crack (0.4.5) rexml cri (2.15.11) - datadog-ci (0.5.0) - msgpack debase-ruby_core_source (3.2.3) debug_inspector (1.1.0) diff-lcs (1.5.0) diff --git a/gemfiles/ruby_3.2_rails61_mysql2.gemfile.lock b/gemfiles/ruby_3.2_rails61_mysql2.gemfile.lock index d441e2e90c7..8422c8f4384 100644 --- a/gemfiles/ruby_3.2_rails61_mysql2.gemfile.lock +++ b/gemfiles/ruby_3.2_rails61_mysql2.gemfile.lock @@ -12,7 +12,6 @@ PATH remote: .. specs: ddtrace (1.18.0) - datadog-ci (~> 0.5.0) debase-ruby_core_source (= 3.2.3) libdatadog (~> 5.0.0.1.0) libddwaf (~> 1.14.0.0.0) @@ -100,8 +99,6 @@ GEM rexml crass (1.0.6) cri (2.15.11) - datadog-ci (0.5.0) - msgpack date (3.3.3) debase-ruby_core_source (3.2.3) debug_inspector (1.1.0) diff --git a/gemfiles/ruby_3.2_rails61_postgres.gemfile.lock b/gemfiles/ruby_3.2_rails61_postgres.gemfile.lock index c2c94159d3d..6972e30c295 100644 --- a/gemfiles/ruby_3.2_rails61_postgres.gemfile.lock +++ b/gemfiles/ruby_3.2_rails61_postgres.gemfile.lock @@ -12,7 +12,6 @@ PATH remote: .. specs: ddtrace (1.18.0) - datadog-ci (~> 0.5.0) debase-ruby_core_source (= 3.2.3) libdatadog (~> 5.0.0.1.0) libddwaf (~> 1.14.0.0.0) @@ -100,8 +99,6 @@ GEM rexml crass (1.0.6) cri (2.15.11) - datadog-ci (0.5.0) - msgpack date (3.3.3) debase-ruby_core_source (3.2.3) debug_inspector (1.1.0) diff --git a/gemfiles/ruby_3.2_rails61_postgres_redis.gemfile.lock b/gemfiles/ruby_3.2_rails61_postgres_redis.gemfile.lock index ec4c5785365..401c79dd5ff 100644 --- a/gemfiles/ruby_3.2_rails61_postgres_redis.gemfile.lock +++ b/gemfiles/ruby_3.2_rails61_postgres_redis.gemfile.lock @@ -12,7 +12,6 @@ PATH remote: .. specs: ddtrace (1.18.0) - datadog-ci (~> 0.5.0) debase-ruby_core_source (= 3.2.3) libdatadog (~> 5.0.0.1.0) libddwaf (~> 1.14.0.0.0) @@ -100,8 +99,6 @@ GEM rexml crass (1.0.6) cri (2.15.11) - datadog-ci (0.5.0) - msgpack date (3.3.3) debase-ruby_core_source (3.2.3) debug_inspector (1.1.0) diff --git a/gemfiles/ruby_3.2_rails61_postgres_sidekiq.gemfile.lock b/gemfiles/ruby_3.2_rails61_postgres_sidekiq.gemfile.lock index b5647739b5f..097648cab4b 100644 --- a/gemfiles/ruby_3.2_rails61_postgres_sidekiq.gemfile.lock +++ b/gemfiles/ruby_3.2_rails61_postgres_sidekiq.gemfile.lock @@ -12,7 +12,6 @@ PATH remote: .. specs: ddtrace (1.18.0) - datadog-ci (~> 0.5.0) debase-ruby_core_source (= 3.2.3) libdatadog (~> 5.0.0.1.0) libddwaf (~> 1.14.0.0.0) @@ -101,8 +100,6 @@ GEM rexml crass (1.0.6) cri (2.15.11) - datadog-ci (0.5.0) - msgpack date (3.3.3) debase-ruby_core_source (3.2.3) debug_inspector (1.1.0) diff --git a/gemfiles/ruby_3.2_rails61_semantic_logger.gemfile.lock b/gemfiles/ruby_3.2_rails61_semantic_logger.gemfile.lock index b5d0dfae0af..bd03d202d97 100644 --- a/gemfiles/ruby_3.2_rails61_semantic_logger.gemfile.lock +++ b/gemfiles/ruby_3.2_rails61_semantic_logger.gemfile.lock @@ -12,7 +12,6 @@ PATH remote: .. specs: ddtrace (1.18.0) - datadog-ci (~> 0.5.0) debase-ruby_core_source (= 3.2.3) libdatadog (~> 5.0.0.1.0) libddwaf (~> 1.14.0.0.0) @@ -100,8 +99,6 @@ GEM rexml crass (1.0.6) cri (2.15.11) - datadog-ci (0.5.0) - msgpack date (3.3.3) debase-ruby_core_source (3.2.3) debug_inspector (1.1.0) diff --git a/gemfiles/ruby_3.2_redis_3.gemfile.lock b/gemfiles/ruby_3.2_redis_3.gemfile.lock index 45bac2f19d5..3621e3a2a6f 100644 --- a/gemfiles/ruby_3.2_redis_3.gemfile.lock +++ b/gemfiles/ruby_3.2_redis_3.gemfile.lock @@ -12,7 +12,6 @@ PATH remote: .. specs: ddtrace (1.18.0) - datadog-ci (~> 0.5.0) debase-ruby_core_source (= 3.2.3) libdatadog (~> 5.0.0.1.0) libddwaf (~> 1.14.0.0.0) @@ -40,8 +39,6 @@ GEM crack (0.4.5) rexml cri (2.15.11) - datadog-ci (0.5.0) - msgpack debase-ruby_core_source (3.2.3) debug_inspector (1.1.0) diff-lcs (1.5.0) diff --git a/gemfiles/ruby_3.2_redis_4.gemfile.lock b/gemfiles/ruby_3.2_redis_4.gemfile.lock index eb4812e8c1f..a598c5ba5d2 100644 --- a/gemfiles/ruby_3.2_redis_4.gemfile.lock +++ b/gemfiles/ruby_3.2_redis_4.gemfile.lock @@ -12,7 +12,6 @@ PATH remote: .. specs: ddtrace (1.18.0) - datadog-ci (~> 0.5.0) debase-ruby_core_source (= 3.2.3) libdatadog (~> 5.0.0.1.0) libddwaf (~> 1.14.0.0.0) @@ -40,8 +39,6 @@ GEM crack (0.4.5) rexml cri (2.15.11) - datadog-ci (0.5.0) - msgpack debase-ruby_core_source (3.2.3) debug_inspector (1.1.0) diff-lcs (1.5.0) diff --git a/gemfiles/ruby_3.2_redis_5.gemfile.lock b/gemfiles/ruby_3.2_redis_5.gemfile.lock index 9a634655bb0..a44a1c011ca 100644 --- a/gemfiles/ruby_3.2_redis_5.gemfile.lock +++ b/gemfiles/ruby_3.2_redis_5.gemfile.lock @@ -12,7 +12,6 @@ PATH remote: .. specs: ddtrace (1.18.0) - datadog-ci (~> 0.5.0) debase-ruby_core_source (= 3.2.3) libdatadog (~> 5.0.0.1.0) libddwaf (~> 1.14.0.0.0) @@ -41,8 +40,6 @@ GEM crack (0.4.5) rexml cri (2.15.11) - datadog-ci (0.5.0) - msgpack debase-ruby_core_source (3.2.3) debug_inspector (1.1.0) diff-lcs (1.5.0) diff --git a/gemfiles/ruby_3.2_relational_db.gemfile.lock b/gemfiles/ruby_3.2_relational_db.gemfile.lock index 758caf9fff0..07a07bc8edc 100644 --- a/gemfiles/ruby_3.2_relational_db.gemfile.lock +++ b/gemfiles/ruby_3.2_relational_db.gemfile.lock @@ -12,7 +12,6 @@ PATH remote: .. specs: ddtrace (1.18.0) - datadog-ci (~> 0.5.0) debase-ruby_core_source (= 3.2.3) libdatadog (~> 5.0.0.1.0) libddwaf (~> 1.14.0.0.0) @@ -50,8 +49,6 @@ GEM crack (0.4.5) rexml cri (2.15.11) - datadog-ci (0.5.0) - msgpack debase-ruby_core_source (3.2.3) debug_inspector (1.1.0) delayed_job (4.1.11) diff --git a/gemfiles/ruby_3.2_resque2_redis3.gemfile.lock b/gemfiles/ruby_3.2_resque2_redis3.gemfile.lock index b51a4e59166..f1b620beeca 100644 --- a/gemfiles/ruby_3.2_resque2_redis3.gemfile.lock +++ b/gemfiles/ruby_3.2_resque2_redis3.gemfile.lock @@ -12,7 +12,6 @@ PATH remote: .. specs: ddtrace (1.18.0) - datadog-ci (~> 0.5.0) debase-ruby_core_source (= 3.2.3) libdatadog (~> 5.0.0.1.0) libddwaf (~> 1.14.0.0.0) @@ -40,8 +39,6 @@ GEM crack (0.4.5) rexml cri (2.15.11) - datadog-ci (0.5.0) - msgpack debase-ruby_core_source (3.2.3) debug_inspector (1.1.0) diff-lcs (1.5.0) diff --git a/gemfiles/ruby_3.2_resque2_redis4.gemfile.lock b/gemfiles/ruby_3.2_resque2_redis4.gemfile.lock index cf91704df92..9131f401843 100644 --- a/gemfiles/ruby_3.2_resque2_redis4.gemfile.lock +++ b/gemfiles/ruby_3.2_resque2_redis4.gemfile.lock @@ -12,7 +12,6 @@ PATH remote: .. specs: ddtrace (1.18.0) - datadog-ci (~> 0.5.0) debase-ruby_core_source (= 3.2.3) libdatadog (~> 5.0.0.1.0) libddwaf (~> 1.14.0.0.0) @@ -41,8 +40,6 @@ GEM crack (0.4.5) rexml cri (2.15.11) - datadog-ci (0.5.0) - msgpack debase-ruby_core_source (3.2.3) debug_inspector (1.1.0) diff-lcs (1.5.0) diff --git a/gemfiles/ruby_3.2_sinatra.gemfile.lock b/gemfiles/ruby_3.2_sinatra.gemfile.lock index 3b908accbb9..8d819942282 100644 --- a/gemfiles/ruby_3.2_sinatra.gemfile.lock +++ b/gemfiles/ruby_3.2_sinatra.gemfile.lock @@ -12,7 +12,6 @@ PATH remote: .. specs: ddtrace (1.18.0) - datadog-ci (~> 0.5.0) debase-ruby_core_source (= 3.2.3) libdatadog (~> 5.0.0.1.0) libddwaf (~> 1.14.0.0.0) @@ -40,8 +39,6 @@ GEM crack (0.4.5) rexml cri (2.15.11) - datadog-ci (0.5.0) - msgpack debase-ruby_core_source (3.2.3) debug_inspector (1.1.0) diff-lcs (1.5.0) diff --git a/gemfiles/ruby_3.3_activesupport.gemfile.lock b/gemfiles/ruby_3.3_activesupport.gemfile.lock index bf7a5e3b9ae..ab3dced2a4c 100644 --- a/gemfiles/ruby_3.3_activesupport.gemfile.lock +++ b/gemfiles/ruby_3.3_activesupport.gemfile.lock @@ -12,7 +12,6 @@ PATH remote: .. specs: ddtrace (1.18.0) - datadog-ci (~> 0.5.0) debase-ruby_core_source (= 3.2.3) libdatadog (~> 5.0.0.1.0) libddwaf (~> 1.14.0.0.0) @@ -68,8 +67,6 @@ GEM rexml crass (1.0.6) cri (2.15.11) - datadog-ci (0.5.0) - msgpack debase-ruby_core_source (3.2.3) debug_inspector (1.1.0) diff-lcs (1.5.0) @@ -299,4 +296,4 @@ DEPENDENCIES yard (~> 0.9) BUNDLED WITH - 2.3.26 + 2.3.27 diff --git a/gemfiles/ruby_3.3_aws.gemfile.lock b/gemfiles/ruby_3.3_aws.gemfile.lock index 0cc4dd4b62f..d5cd1a3ce25 100644 --- a/gemfiles/ruby_3.3_aws.gemfile.lock +++ b/gemfiles/ruby_3.3_aws.gemfile.lock @@ -12,7 +12,6 @@ PATH remote: .. specs: ddtrace (1.18.0) - datadog-ci (~> 0.5.0) debase-ruby_core_source (= 3.2.3) libdatadog (~> 5.0.0.1.0) libddwaf (~> 1.14.0.0.0) @@ -1461,8 +1460,6 @@ GEM crack (0.4.5) rexml cri (2.15.11) - datadog-ci (0.5.0) - msgpack debase-ruby_core_source (3.2.3) debug_inspector (1.1.0) diff-lcs (1.5.0) @@ -1612,4 +1609,4 @@ DEPENDENCIES yard (~> 0.9) BUNDLED WITH - 2.3.26 + 2.3.27 diff --git a/gemfiles/ruby_3.3_contrib.gemfile.lock b/gemfiles/ruby_3.3_contrib.gemfile.lock index b4bc76c32a3..d30c56c4bbb 100644 --- a/gemfiles/ruby_3.3_contrib.gemfile.lock +++ b/gemfiles/ruby_3.3_contrib.gemfile.lock @@ -12,7 +12,6 @@ PATH remote: .. specs: ddtrace (1.18.0) - datadog-ci (~> 0.5.0) debase-ruby_core_source (= 3.2.3) libdatadog (~> 5.0.0.1.0) libddwaf (~> 1.14.0.0.0) @@ -47,8 +46,6 @@ GEM rexml cri (2.15.11) dalli (3.2.4) - datadog-ci (0.5.0) - msgpack debase-ruby_core_source (3.2.3) debug_inspector (1.1.0) diff-lcs (1.5.0) @@ -264,4 +261,4 @@ DEPENDENCIES yard (~> 0.9) BUNDLED WITH - 2.3.26 + 2.3.27 diff --git a/gemfiles/ruby_3.3_contrib_old.gemfile.lock b/gemfiles/ruby_3.3_contrib_old.gemfile.lock index d2476680da5..4d1c9b4d7a1 100644 --- a/gemfiles/ruby_3.3_contrib_old.gemfile.lock +++ b/gemfiles/ruby_3.3_contrib_old.gemfile.lock @@ -12,7 +12,6 @@ PATH remote: .. specs: ddtrace (1.18.0) - datadog-ci (~> 0.5.0) debase-ruby_core_source (= 3.2.3) libdatadog (~> 5.0.0.1.0) libddwaf (~> 1.14.0.0.0) @@ -45,8 +44,6 @@ GEM cri (2.15.11) daemons (1.4.1) dalli (2.7.11) - datadog-ci (0.5.0) - msgpack debase-ruby_core_source (3.2.3) debug_inspector (1.1.0) diff-lcs (1.5.0) @@ -242,4 +239,4 @@ DEPENDENCIES yard (~> 0.9) BUNDLED WITH - 2.3.26 + 2.3.27 diff --git a/gemfiles/ruby_3.3_core_old.gemfile.lock b/gemfiles/ruby_3.3_core_old.gemfile.lock index 4daee9eefaa..14d9889dd07 100644 --- a/gemfiles/ruby_3.3_core_old.gemfile.lock +++ b/gemfiles/ruby_3.3_core_old.gemfile.lock @@ -12,7 +12,6 @@ PATH remote: .. specs: ddtrace (1.18.0) - datadog-ci (~> 0.5.0) debase-ruby_core_source (= 3.2.3) libdatadog (~> 5.0.0.1.0) libddwaf (~> 1.14.0.0.0) @@ -40,8 +39,6 @@ GEM crack (0.4.5) rexml cri (2.15.11) - datadog-ci (0.5.0) - msgpack debase-ruby_core_source (3.2.3) debug_inspector (1.1.0) diff-lcs (1.5.0) @@ -182,4 +179,4 @@ DEPENDENCIES yard (~> 0.9) BUNDLED WITH - 2.3.26 + 2.3.27 diff --git a/gemfiles/ruby_3.3_elasticsearch_7.gemfile.lock b/gemfiles/ruby_3.3_elasticsearch_7.gemfile.lock index 7cf38c34d8b..48cd40b9a51 100644 --- a/gemfiles/ruby_3.3_elasticsearch_7.gemfile.lock +++ b/gemfiles/ruby_3.3_elasticsearch_7.gemfile.lock @@ -12,7 +12,6 @@ PATH remote: .. specs: ddtrace (1.18.0) - datadog-ci (~> 0.5.0) debase-ruby_core_source (= 3.2.3) libdatadog (~> 5.0.0.1.0) libddwaf (~> 1.14.0.0.0) @@ -41,8 +40,6 @@ GEM crack (0.4.5) rexml cri (2.15.11) - datadog-ci (0.5.0) - msgpack debase-ruby_core_source (3.2.3) debug_inspector (1.1.0) diff-lcs (1.5.0) @@ -221,4 +218,4 @@ DEPENDENCIES yard (~> 0.9) BUNDLED WITH - 2.3.26 + 2.3.27 diff --git a/gemfiles/ruby_3.3_elasticsearch_8.gemfile.lock b/gemfiles/ruby_3.3_elasticsearch_8.gemfile.lock index cdde68ee546..18280da77d6 100644 --- a/gemfiles/ruby_3.3_elasticsearch_8.gemfile.lock +++ b/gemfiles/ruby_3.3_elasticsearch_8.gemfile.lock @@ -12,7 +12,6 @@ PATH remote: .. specs: ddtrace (1.18.0) - datadog-ci (~> 0.5.0) debase-ruby_core_source (= 3.2.3) libdatadog (~> 5.0.0.1.0) libddwaf (~> 1.14.0.0.0) @@ -42,8 +41,6 @@ GEM crack (0.4.5) rexml cri (2.15.11) - datadog-ci (0.5.0) - msgpack debase-ruby_core_source (3.2.3) debug_inspector (1.1.0) diff-lcs (1.5.0) @@ -203,4 +200,4 @@ DEPENDENCIES yard (~> 0.9) BUNDLED WITH - 2.3.26 + 2.3.27 diff --git a/gemfiles/ruby_3.3_http.gemfile.lock b/gemfiles/ruby_3.3_http.gemfile.lock index 228f7f126a5..eb71f55602f 100644 --- a/gemfiles/ruby_3.3_http.gemfile.lock +++ b/gemfiles/ruby_3.3_http.gemfile.lock @@ -12,7 +12,6 @@ PATH remote: .. specs: ddtrace (1.18.0) - datadog-ci (~> 0.5.0) debase-ruby_core_source (= 3.2.3) libdatadog (~> 5.0.0.1.0) libddwaf (~> 1.14.0.0.0) @@ -40,8 +39,6 @@ GEM crack (0.4.5) rexml cri (2.15.11) - datadog-ci (0.5.0) - msgpack debase-ruby_core_source (3.2.3) debug_inspector (1.1.0) diff-lcs (1.5.0) @@ -233,4 +230,4 @@ DEPENDENCIES yard (~> 0.9) BUNDLED WITH - 2.3.26 + 2.3.27 diff --git a/gemfiles/ruby_3.3_opensearch_2.gemfile.lock b/gemfiles/ruby_3.3_opensearch_2.gemfile.lock index cf49795f2b3..dc91fbf9ae1 100644 --- a/gemfiles/ruby_3.3_opensearch_2.gemfile.lock +++ b/gemfiles/ruby_3.3_opensearch_2.gemfile.lock @@ -12,7 +12,6 @@ PATH remote: .. specs: ddtrace (1.18.0) - datadog-ci (~> 0.5.0) debase-ruby_core_source (= 3.2.3) libdatadog (~> 5.0.0.1.0) libddwaf (~> 1.14.0.0.0) @@ -42,8 +41,6 @@ GEM crack (0.4.5) rexml cri (2.15.11) - datadog-ci (0.5.0) - msgpack debase-ruby_core_source (3.2.3) debug_inspector (1.1.0) diff-lcs (1.5.0) @@ -203,4 +200,4 @@ DEPENDENCIES yard (~> 0.9) BUNDLED WITH - 2.3.26 + 2.3.27 diff --git a/gemfiles/ruby_3.3_opensearch_3.gemfile.lock b/gemfiles/ruby_3.3_opensearch_3.gemfile.lock index 1faffcbfc25..4c3390942d9 100644 --- a/gemfiles/ruby_3.3_opensearch_3.gemfile.lock +++ b/gemfiles/ruby_3.3_opensearch_3.gemfile.lock @@ -12,7 +12,6 @@ PATH remote: .. specs: ddtrace (1.18.0) - datadog-ci (~> 0.5.0) debase-ruby_core_source (= 3.2.3) libdatadog (~> 5.0.0.1.0) libddwaf (~> 1.14.0.0.0) @@ -42,8 +41,6 @@ GEM crack (0.4.5) rexml cri (2.15.11) - datadog-ci (0.5.0) - msgpack debase-ruby_core_source (3.2.3) debug_inspector (1.1.0) diff-lcs (1.5.0) @@ -198,4 +195,4 @@ DEPENDENCIES yard (~> 0.9) BUNDLED WITH - 2.3.26 + 2.3.27 diff --git a/gemfiles/ruby_3.3_opentelemetry.gemfile.lock b/gemfiles/ruby_3.3_opentelemetry.gemfile.lock index 83174701bc9..5cbdd4793bb 100644 --- a/gemfiles/ruby_3.3_opentelemetry.gemfile.lock +++ b/gemfiles/ruby_3.3_opentelemetry.gemfile.lock @@ -12,7 +12,6 @@ PATH remote: .. specs: ddtrace (1.18.0) - datadog-ci (~> 0.5.0) debase-ruby_core_source (= 3.2.3) libdatadog (~> 5.0.0.1.0) libddwaf (~> 1.14.0.0.0) @@ -40,8 +39,6 @@ GEM crack (0.4.5) rexml cri (2.15.11) - datadog-ci (0.5.0) - msgpack debase-ruby_core_source (3.2.3) debug_inspector (1.1.0) diff-lcs (1.5.0) @@ -195,4 +192,4 @@ DEPENDENCIES yard (~> 0.9) BUNDLED WITH - 2.3.26 + 2.3.27 diff --git a/gemfiles/ruby_3.3_opentracing.gemfile.lock b/gemfiles/ruby_3.3_opentracing.gemfile.lock index 1f06fa11b5e..b5c548f27ca 100644 --- a/gemfiles/ruby_3.3_opentracing.gemfile.lock +++ b/gemfiles/ruby_3.3_opentracing.gemfile.lock @@ -12,7 +12,6 @@ PATH remote: .. specs: ddtrace (1.18.0) - datadog-ci (~> 0.5.0) debase-ruby_core_source (= 3.2.3) libdatadog (~> 5.0.0.1.0) libddwaf (~> 1.14.0.0.0) @@ -41,8 +40,6 @@ GEM crack (0.4.5) rexml cri (2.15.11) - datadog-ci (0.5.0) - msgpack debase-ruby_core_source (3.2.3) debug_inspector (1.1.0) diff-lcs (1.5.0) @@ -188,4 +185,4 @@ DEPENDENCIES yard (~> 0.9) BUNDLED WITH - 2.3.26 + 2.3.27 diff --git a/gemfiles/ruby_3.3_rack_1.gemfile.lock b/gemfiles/ruby_3.3_rack_1.gemfile.lock index 94fd3478666..1be6c173235 100644 --- a/gemfiles/ruby_3.3_rack_1.gemfile.lock +++ b/gemfiles/ruby_3.3_rack_1.gemfile.lock @@ -12,7 +12,6 @@ PATH remote: .. specs: ddtrace (1.18.0) - datadog-ci (~> 0.5.0) debase-ruby_core_source (= 3.2.3) libdatadog (~> 5.0.0.1.0) libddwaf (~> 1.14.0.0.0) @@ -40,8 +39,6 @@ GEM crack (0.4.5) rexml cri (2.15.11) - datadog-ci (0.5.0) - msgpack debase-ruby_core_source (3.2.3) debug_inspector (1.1.0) diff-lcs (1.5.0) @@ -192,4 +189,4 @@ DEPENDENCIES yard (~> 0.9) BUNDLED WITH - 2.3.26 + 2.3.27 diff --git a/gemfiles/ruby_3.3_rack_2.gemfile.lock b/gemfiles/ruby_3.3_rack_2.gemfile.lock index 5417adf6adf..4f71a303031 100644 --- a/gemfiles/ruby_3.3_rack_2.gemfile.lock +++ b/gemfiles/ruby_3.3_rack_2.gemfile.lock @@ -12,7 +12,6 @@ PATH remote: .. specs: ddtrace (1.18.0) - datadog-ci (~> 0.5.0) debase-ruby_core_source (= 3.2.3) libdatadog (~> 5.0.0.1.0) libddwaf (~> 1.14.0.0.0) @@ -40,8 +39,6 @@ GEM crack (0.4.5) rexml cri (2.15.11) - datadog-ci (0.5.0) - msgpack debase-ruby_core_source (3.2.3) debug_inspector (1.1.0) diff-lcs (1.5.0) @@ -192,4 +189,4 @@ DEPENDENCIES yard (~> 0.9) BUNDLED WITH - 2.3.26 + 2.3.27 diff --git a/gemfiles/ruby_3.3_rack_3.gemfile.lock b/gemfiles/ruby_3.3_rack_3.gemfile.lock index 94e34447465..9ab9165bc05 100644 --- a/gemfiles/ruby_3.3_rack_3.gemfile.lock +++ b/gemfiles/ruby_3.3_rack_3.gemfile.lock @@ -12,7 +12,6 @@ PATH remote: .. specs: ddtrace (1.18.0) - datadog-ci (~> 0.5.0) debase-ruby_core_source (= 3.2.3) libdatadog (~> 5.0.0.1.0) libddwaf (~> 1.14.0.0.0) @@ -40,8 +39,6 @@ GEM crack (0.4.5) rexml cri (2.15.11) - datadog-ci (0.5.0) - msgpack debase-ruby_core_source (3.2.3) debug_inspector (1.1.0) diff-lcs (1.5.0) @@ -192,4 +189,4 @@ DEPENDENCIES yard (~> 0.9) BUNDLED WITH - 2.3.26 + 2.3.27 diff --git a/gemfiles/ruby_3.3_rails61_mysql2.gemfile.lock b/gemfiles/ruby_3.3_rails61_mysql2.gemfile.lock index 730192ca963..846f30cbdd1 100644 --- a/gemfiles/ruby_3.3_rails61_mysql2.gemfile.lock +++ b/gemfiles/ruby_3.3_rails61_mysql2.gemfile.lock @@ -12,7 +12,6 @@ PATH remote: .. specs: ddtrace (1.18.0) - datadog-ci (~> 0.5.0) debase-ruby_core_source (= 3.2.3) libdatadog (~> 5.0.0.1.0) libddwaf (~> 1.14.0.0.0) @@ -100,8 +99,6 @@ GEM rexml crass (1.0.6) cri (2.15.11) - datadog-ci (0.5.0) - msgpack date (3.3.3) debase-ruby_core_source (3.2.3) debug_inspector (1.1.0) @@ -330,4 +327,4 @@ DEPENDENCIES yard (~> 0.9) BUNDLED WITH - 2.3.26 + 2.3.27 diff --git a/gemfiles/ruby_3.3_rails61_postgres.gemfile.lock b/gemfiles/ruby_3.3_rails61_postgres.gemfile.lock index 25a6964d480..8e30f8fae5b 100644 --- a/gemfiles/ruby_3.3_rails61_postgres.gemfile.lock +++ b/gemfiles/ruby_3.3_rails61_postgres.gemfile.lock @@ -12,7 +12,6 @@ PATH remote: .. specs: ddtrace (1.18.0) - datadog-ci (~> 0.5.0) debase-ruby_core_source (= 3.2.3) libdatadog (~> 5.0.0.1.0) libddwaf (~> 1.14.0.0.0) @@ -100,8 +99,6 @@ GEM rexml crass (1.0.6) cri (2.15.11) - datadog-ci (0.5.0) - msgpack date (3.3.3) debase-ruby_core_source (3.2.3) debug_inspector (1.1.0) @@ -330,4 +327,4 @@ DEPENDENCIES yard (~> 0.9) BUNDLED WITH - 2.3.26 + 2.3.27 diff --git a/gemfiles/ruby_3.3_rails61_postgres_redis.gemfile.lock b/gemfiles/ruby_3.3_rails61_postgres_redis.gemfile.lock index d27bd42f60b..bc4e2684327 100644 --- a/gemfiles/ruby_3.3_rails61_postgres_redis.gemfile.lock +++ b/gemfiles/ruby_3.3_rails61_postgres_redis.gemfile.lock @@ -12,7 +12,6 @@ PATH remote: .. specs: ddtrace (1.18.0) - datadog-ci (~> 0.5.0) debase-ruby_core_source (= 3.2.3) libdatadog (~> 5.0.0.1.0) libddwaf (~> 1.14.0.0.0) @@ -100,8 +99,6 @@ GEM rexml crass (1.0.6) cri (2.15.11) - datadog-ci (0.5.0) - msgpack date (3.3.3) debase-ruby_core_source (3.2.3) debug_inspector (1.1.0) @@ -332,4 +329,4 @@ DEPENDENCIES yard (~> 0.9) BUNDLED WITH - 2.3.26 + 2.3.27 diff --git a/gemfiles/ruby_3.3_rails61_postgres_sidekiq.gemfile.lock b/gemfiles/ruby_3.3_rails61_postgres_sidekiq.gemfile.lock index b0c1f9618a8..d387237d611 100644 --- a/gemfiles/ruby_3.3_rails61_postgres_sidekiq.gemfile.lock +++ b/gemfiles/ruby_3.3_rails61_postgres_sidekiq.gemfile.lock @@ -12,7 +12,6 @@ PATH remote: .. specs: ddtrace (1.18.0) - datadog-ci (~> 0.5.0) debase-ruby_core_source (= 3.2.3) libdatadog (~> 5.0.0.1.0) libddwaf (~> 1.14.0.0.0) @@ -101,8 +100,6 @@ GEM rexml crass (1.0.6) cri (2.15.11) - datadog-ci (0.5.0) - msgpack date (3.3.3) debase-ruby_core_source (3.2.3) debug_inspector (1.1.0) @@ -346,4 +343,4 @@ DEPENDENCIES yard (~> 0.9) BUNDLED WITH - 2.3.26 + 2.3.27 diff --git a/gemfiles/ruby_3.3_rails61_semantic_logger.gemfile.lock b/gemfiles/ruby_3.3_rails61_semantic_logger.gemfile.lock index cc852f1906c..1d6f06b4307 100644 --- a/gemfiles/ruby_3.3_rails61_semantic_logger.gemfile.lock +++ b/gemfiles/ruby_3.3_rails61_semantic_logger.gemfile.lock @@ -12,7 +12,6 @@ PATH remote: .. specs: ddtrace (1.18.0) - datadog-ci (~> 0.5.0) debase-ruby_core_source (= 3.2.3) libdatadog (~> 5.0.0.1.0) libddwaf (~> 1.14.0.0.0) @@ -100,8 +99,6 @@ GEM rexml crass (1.0.6) cri (2.15.11) - datadog-ci (0.5.0) - msgpack date (3.3.3) debase-ruby_core_source (3.2.3) debug_inspector (1.1.0) @@ -329,4 +326,4 @@ DEPENDENCIES yard (~> 0.9) BUNDLED WITH - 2.3.26 + 2.3.27 diff --git a/gemfiles/ruby_3.3_redis_3.gemfile.lock b/gemfiles/ruby_3.3_redis_3.gemfile.lock index a06eb58863a..e2afa9d4fef 100644 --- a/gemfiles/ruby_3.3_redis_3.gemfile.lock +++ b/gemfiles/ruby_3.3_redis_3.gemfile.lock @@ -12,7 +12,6 @@ PATH remote: .. specs: ddtrace (1.18.0) - datadog-ci (~> 0.5.0) debase-ruby_core_source (= 3.2.3) libdatadog (~> 5.0.0.1.0) libddwaf (~> 1.14.0.0.0) @@ -40,8 +39,6 @@ GEM crack (0.4.5) rexml cri (2.15.11) - datadog-ci (0.5.0) - msgpack debase-ruby_core_source (3.2.3) debug_inspector (1.1.0) diff-lcs (1.5.0) @@ -184,4 +181,4 @@ DEPENDENCIES yard (~> 0.9) BUNDLED WITH - 2.3.26 + 2.3.27 diff --git a/gemfiles/ruby_3.3_redis_4.gemfile.lock b/gemfiles/ruby_3.3_redis_4.gemfile.lock index d4d94f2c44d..cbe2fe2ded0 100644 --- a/gemfiles/ruby_3.3_redis_4.gemfile.lock +++ b/gemfiles/ruby_3.3_redis_4.gemfile.lock @@ -12,7 +12,6 @@ PATH remote: .. specs: ddtrace (1.18.0) - datadog-ci (~> 0.5.0) debase-ruby_core_source (= 3.2.3) libdatadog (~> 5.0.0.1.0) libddwaf (~> 1.14.0.0.0) @@ -40,8 +39,6 @@ GEM crack (0.4.5) rexml cri (2.15.11) - datadog-ci (0.5.0) - msgpack debase-ruby_core_source (3.2.3) debug_inspector (1.1.0) diff-lcs (1.5.0) @@ -184,4 +181,4 @@ DEPENDENCIES yard (~> 0.9) BUNDLED WITH - 2.3.26 + 2.3.27 diff --git a/gemfiles/ruby_3.3_redis_5.gemfile.lock b/gemfiles/ruby_3.3_redis_5.gemfile.lock index 6d83293165a..ffb21f6d680 100644 --- a/gemfiles/ruby_3.3_redis_5.gemfile.lock +++ b/gemfiles/ruby_3.3_redis_5.gemfile.lock @@ -12,7 +12,6 @@ PATH remote: .. specs: ddtrace (1.18.0) - datadog-ci (~> 0.5.0) debase-ruby_core_source (= 3.2.3) libdatadog (~> 5.0.0.1.0) libddwaf (~> 1.14.0.0.0) @@ -41,8 +40,6 @@ GEM crack (0.4.5) rexml cri (2.15.11) - datadog-ci (0.5.0) - msgpack debase-ruby_core_source (3.2.3) debug_inspector (1.1.0) diff-lcs (1.5.0) @@ -188,4 +185,4 @@ DEPENDENCIES yard (~> 0.9) BUNDLED WITH - 2.3.26 + 2.3.27 diff --git a/gemfiles/ruby_3.3_relational_db.gemfile.lock b/gemfiles/ruby_3.3_relational_db.gemfile.lock index 43dc26214c4..91ff6c1be13 100644 --- a/gemfiles/ruby_3.3_relational_db.gemfile.lock +++ b/gemfiles/ruby_3.3_relational_db.gemfile.lock @@ -12,7 +12,6 @@ PATH remote: .. specs: ddtrace (1.18.0) - datadog-ci (~> 0.5.0) debase-ruby_core_source (= 3.2.3) libdatadog (~> 5.0.0.1.0) libddwaf (~> 1.14.0.0.0) @@ -50,8 +49,6 @@ GEM crack (0.4.5) rexml cri (2.15.11) - datadog-ci (0.5.0) - msgpack debase-ruby_core_source (3.2.3) debug_inspector (1.1.0) delayed_job (4.1.11) @@ -220,4 +217,4 @@ DEPENDENCIES yard (~> 0.9) BUNDLED WITH - 2.3.26 + 2.3.27 diff --git a/gemfiles/ruby_3.3_resque2_redis3.gemfile.lock b/gemfiles/ruby_3.3_resque2_redis3.gemfile.lock index 928ca25aa5c..b75aab39653 100644 --- a/gemfiles/ruby_3.3_resque2_redis3.gemfile.lock +++ b/gemfiles/ruby_3.3_resque2_redis3.gemfile.lock @@ -12,7 +12,6 @@ PATH remote: .. specs: ddtrace (1.18.0) - datadog-ci (~> 0.5.0) debase-ruby_core_source (= 3.2.3) libdatadog (~> 5.0.0.1.0) libddwaf (~> 1.14.0.0.0) @@ -40,8 +39,6 @@ GEM crack (0.4.5) rexml cri (2.15.11) - datadog-ci (0.5.0) - msgpack debase-ruby_core_source (3.2.3) debug_inspector (1.1.0) diff-lcs (1.5.0) @@ -206,4 +203,4 @@ DEPENDENCIES yard (~> 0.9) BUNDLED WITH - 2.3.26 + 2.3.27 diff --git a/gemfiles/ruby_3.3_resque2_redis4.gemfile.lock b/gemfiles/ruby_3.3_resque2_redis4.gemfile.lock index f3c9c13afc4..58ec5fe870b 100644 --- a/gemfiles/ruby_3.3_resque2_redis4.gemfile.lock +++ b/gemfiles/ruby_3.3_resque2_redis4.gemfile.lock @@ -12,7 +12,6 @@ PATH remote: .. specs: ddtrace (1.18.0) - datadog-ci (~> 0.5.0) debase-ruby_core_source (= 3.2.3) libdatadog (~> 5.0.0.1.0) libddwaf (~> 1.14.0.0.0) @@ -41,8 +40,6 @@ GEM crack (0.4.5) rexml cri (2.15.11) - datadog-ci (0.5.0) - msgpack debase-ruby_core_source (3.2.3) debug_inspector (1.1.0) diff-lcs (1.5.0) @@ -210,4 +207,4 @@ DEPENDENCIES yard (~> 0.9) BUNDLED WITH - 2.3.26 + 2.3.27 diff --git a/gemfiles/ruby_3.3_sinatra.gemfile.lock b/gemfiles/ruby_3.3_sinatra.gemfile.lock index e1a72e48090..6b92cc044fb 100644 --- a/gemfiles/ruby_3.3_sinatra.gemfile.lock +++ b/gemfiles/ruby_3.3_sinatra.gemfile.lock @@ -12,7 +12,6 @@ PATH remote: .. specs: ddtrace (1.18.0) - datadog-ci (~> 0.5.0) debase-ruby_core_source (= 3.2.3) libdatadog (~> 5.0.0.1.0) libddwaf (~> 1.14.0.0.0) @@ -40,8 +39,6 @@ GEM crack (0.4.5) rexml cri (2.15.11) - datadog-ci (0.5.0) - msgpack debase-ruby_core_source (3.2.3) debug_inspector (1.1.0) diff-lcs (1.5.0) @@ -201,4 +198,4 @@ DEPENDENCIES yard (~> 0.9) BUNDLED WITH - 2.3.26 + 2.3.27 diff --git a/integration/images/ruby/3.3/Dockerfile b/integration/images/ruby/3.3/Dockerfile index 686620c687c..38e69fd2130 100644 --- a/integration/images/ruby/3.3/Dockerfile +++ b/integration/images/ruby/3.3/Dockerfile @@ -1,4 +1,4 @@ -FROM ruby:3.3-rc +FROM ruby:3.3 ENV DEBIAN_FRONTEND=noninteractive diff --git a/lib-injection/host_inject.rb b/lib-injection/host_inject.rb index 7b567bfc857..2642e511312 100644 --- a/lib-injection/host_inject.rb +++ b/lib-injection/host_inject.rb @@ -64,7 +64,6 @@ def debug_log(msg) 'debase-ruby_core_source', 'libdatadog', 'libddwaf', - 'datadog-ci', 'ddtrace' ].each do |gem| _, status = Open3.capture2e({ 'DD_TRACE_SKIP_LIB_INJECTION' => 'true' }, "bundle show #{gem}") diff --git a/lib/datadog/core/configuration/settings.rb b/lib/datadog/core/configuration/settings.rb index 483c01a2a2b..8bc13981bd4 100644 --- a/lib/datadog/core/configuration/settings.rb +++ b/lib/datadog/core/configuration/settings.rb @@ -156,9 +156,7 @@ def initialize(*_) # @default `DD_ENV` environment variable, otherwise `nil` # @return [String,nil] option :env do |o| - # DEV-2.0: Remove this conversion for symbol. - o.setter { |v| v.to_s if v } - + o.type :string, nilable: true # NOTE: env also gets set as a side effect of tags. See the WORKAROUND note in #initialize for details. o.env Core::Environment::Ext::ENV_ENVIRONMENT end @@ -262,32 +260,58 @@ def initialize(*_) # Can be used to enable/disable the Datadog::Profiling.allocation_count feature. # - # This feature is safe and enabled by default on Ruby 2.x, but has a few caveats on Ruby 3.x. + # This feature is now controlled via {:experimental_allocation_enabled} + option :allocation_counting_enabled do |o| + o.after_set do + Datadog.logger.warn( + 'The profiling.advanced.allocation_counting_enabled setting has been deprecated for removal and no ' \ + 'longer does anything. Please remove it from your Datadog.configure block. ' \ + 'Allocation counting is now controlled by the `experimental_allocation_enabled` setting instead.' + ) + end + end + + # Can be used to enable/disable collection of allocation profiles. # - # Caveat 1 (severe): - # On Ruby versions 3.0 (all), 3.1.0 to 3.1.3, and 3.2.0 to 3.2.2 this is disabled by default because it - # can trigger a VM bug that causes a segmentation fault during garbage collection of Ractors - # (https://bugs.ruby-lang.org/issues/18464). We don't recommend using this feature on such Rubies. - # This bug is fixed on Ruby versions 3.1.4, 3.2.3 and 3.3.0. + # This feature is alpha and disabled by default # - # Caveat 2 (annoyance): - # On all known versions of Ruby 3.x, due to https://bugs.ruby-lang.org/issues/19112, when a ractor gets - # garbage collected, Ruby will disable all active tracepoints, which this feature internally relies on. - # Thus this feature is only usable if you're not using Ractors. + # @warn This feature is not supported/safe in all Rubies. Details in {Datadog::Profiling::Component} but + # in summary, this should be supported on Ruby 2.x, 3.1.4+, 3.2.3+ and 3.3.0+. Enabling it on + # unsupported Rubies may result in unexpected behaviour, including crashes. # - # Caveat 3 (severe): - # Ruby 3.2.0 to 3.2.2 have a bug in the newobj tracepoint (https://bugs.ruby-lang.org/issues/19482, - # https://github.com/ruby/ruby/pull/7464) so that's an extra reason why it's not safe on those Rubies. - # This bug is fixed on Ruby versions 3.2.3 and 3.3.0. + # @note Allocation profiles are not yet GA in the Datadog UI, get in touch if you want to help us test it. # - # @default `true` on Ruby 2.x and 3.1.4+, 3.2.3+ and 3.3.0+; `false` for Ruby 3.0 and unpatched Rubies. - option :allocation_counting_enabled do |o| - o.default do - RUBY_VERSION.start_with?('2.') || - (RUBY_VERSION.start_with?('3.1.') && RUBY_VERSION >= '3.1.4') || - (RUBY_VERSION.start_with?('3.2.') && RUBY_VERSION >= '3.2.3') || - RUBY_VERSION >= '3.3.' - end + # @default `DD_PROFILING_EXPERIMENTAL_ALLOCATION_ENABLED` environment variable as a boolean, otherwise `false` + option :experimental_allocation_enabled do |o| + o.type :bool + o.env 'DD_PROFILING_EXPERIMENTAL_ALLOCATION_ENABLED' + o.default false + end + + # Can be used to enable/disable the collection of heap profiles. + # + # This feature is alpha and disabled by default + # + # @warn To enable heap profiling you are required to also enable allocation profiling. + # @note Heap profiles are not yet GA in the Datadog UI, get in touch if you want to help us test it. + # + # @default `DD_PROFILING_EXPERIMENTAL_HEAP_ENABLED` environment variable as a boolean, otherwise `false` + option :experimental_heap_enabled do |o| + o.type :bool + o.env 'DD_PROFILING_EXPERIMENTAL_HEAP_ENABLED' + o.default false + end + + # Can be used to configure the allocation sampling rate: a sample will be collected every x allocations. + # + # The lower the value, the more accuracy in allocation and heap tracking but the bigger the overhead. In + # particular, a value of 1 will sample ALL allocations. + # + # @default `DD_PROFILING_EXPERIMENTAL_ALLOCATION_SAMPLE_RATE` environment variable, otherwise `50`. + option :experimental_allocation_sample_rate do |o| + o.type :int + o.env 'DD_PROFILING_EXPERIMENTAL_ALLOCATION_SAMPLE_RATE' + o.default 50 end # Can be used to disable checking which version of `libmysqlclient` is being used by the `mysql2` gem. @@ -404,8 +428,7 @@ def initialize(*_) # @default `DD_SERVICE` environment variable, otherwise the program name (e.g. `'ruby'`, `'rails'`, `'pry'`) # @return [String] option :service do |o| - # DEV-2.0: Remove this conversion for symbol. - o.setter { |v| v.to_s if v } + o.type :string, nilable: true # NOTE: service also gets set as a side effect of tags. See the WORKAROUND note in #initialize for details. o.env Core::Environment::Ext::ENV_SERVICE @@ -568,6 +591,42 @@ def initialize(*_) o.env Core::Telemetry::Ext::ENV_HEARTBEAT_INTERVAL o.default 60.0 end + + # The install id of the application. + # + # This method is used internally, by library injection. + # + # @default `DD_INSTRUMENTATION_INSTALL_ID` environment variable, otherwise `nil`. + # @return [String,nil] + # @!visibility private + option :install_id do |o| + o.type :string, nilable: true + o.env Core::Telemetry::Ext::ENV_INSTALL_ID + end + + # The install type of the application. + # + # This method is used internally, by library injection. + # + # @default `DD_INSTRUMENTATION_INSTALL_TYPE` environment variable, otherwise `nil`. + # @return [String,nil] + # @!visibility private + option :install_type do |o| + o.type :string, nilable: true + o.env Core::Telemetry::Ext::ENV_INSTALL_TYPE + end + + # The install time of the application. + # + # This method is used internally, by library injection. + # + # @default `DD_INSTRUMENTATION_INSTALL_TIME` environment variable, otherwise `nil`. + # @return [String,nil] + # @!visibility private + option :install_time do |o| + o.type :string, nilable: true + o.env Core::Telemetry::Ext::ENV_INSTALL_TIME + end end # Remote configuration diff --git a/lib/datadog/core/remote/transport/http.rb b/lib/datadog/core/remote/transport/http.rb index b347eb3d85e..fbb7f92fc59 100644 --- a/lib/datadog/core/remote/transport/http.rb +++ b/lib/datadog/core/remote/transport/http.rb @@ -135,33 +135,6 @@ def default_adapter Datadog::Core::Transport::Ext::HTTP::ADAPTER end - def default_hostname(logger: Datadog.logger) - logger.warn( - 'Deprecated for removal: Using #default_hostname for configuration is deprecated and will ' \ - 'be removed on a future ddtrace release.' - ) - - DO_NOT_USE_ENVIRONMENT_AGENT_SETTINGS.hostname - end - - def default_port(logger: Datadog.logger) - logger.warn( - 'Deprecated for removal: Using #default_hostname for configuration is deprecated and will ' \ - 'be removed on a future ddtrace release.' - ) - - DO_NOT_USE_ENVIRONMENT_AGENT_SETTINGS.port - end - - def default_url(logger: Datadog.logger) - logger.warn( - 'Deprecated for removal: Using #default_url for configuration is deprecated and will ' \ - 'be removed on a future ddtrace release.' - ) - - nil - end - # Add adapters to registry Builder::REGISTRY.set(Datadog::Core::Transport::HTTP::Adapters::Net, Datadog::Core::Transport::Ext::HTTP::ADAPTER) Builder::REGISTRY.set( diff --git a/lib/datadog/core/telemetry/collector.rb b/lib/datadog/core/telemetry/collector.rb index adfa4173539..e34f1bc51ae 100644 --- a/lib/datadog/core/telemetry/collector.rb +++ b/lib/datadog/core/telemetry/collector.rb @@ -9,6 +9,7 @@ require_relative 'v1/application' require_relative 'v1/dependency' require_relative 'v1/host' +require_relative 'v1/install_signature' require_relative 'v1/integration' require_relative 'v1/product' require_relative '../transport/ext' @@ -81,6 +82,15 @@ def host ) end + # Forms a telemetry app-started install_signature object + def install_signature + Telemetry::V1::InstallSignature.new( + install_id: Datadog.configuration.dig('telemetry', 'install_id'), + install_type: Datadog.configuration.dig('telemetry', 'install_type'), + install_time: Datadog.configuration.dig('telemetry', 'install_time'), + ) + end + # Forms a telemetry app-started integrations object def integrations Datadog.registry.map do |integration| @@ -110,7 +120,6 @@ def tracer_time private TARGET_OPTIONS = [ - 'ci.enabled', 'logger.level', 'profiling.advanced.code_provenance_enabled', 'profiling.advanced.endpoint.collection.enabled', @@ -123,7 +132,6 @@ def tracer_time 'tracing.log_injection', 'tracing.partial_flush.enabled', 'tracing.partial_flush.min_spans_threshold', - 'tracing.priority_sampling', 'tracing.report_hostname', 'tracing.sampling.default_rate', 'tracing.sampling.rate_limit' @@ -145,6 +153,7 @@ def additional_payload_variables format_configuration_value(configuration.tracing.writer_options[:flush_interval]) options['logger.instance'] = configuration.logger.instance.class.to_s options['appsec.enabled'] = configuration.dig('appsec', 'enabled') if configuration.respond_to?('appsec') + options['ci.enabled'] = configuration.dig('ci', 'enabled') if configuration.respond_to?('ci') options['tracing.opentelemetry.enabled'] = !defined?(Datadog::OpenTelemetry::LOADED).nil? options['tracing.opentracing.enabled'] = !defined?(Datadog::OpenTracer::LOADED).nil? options.compact! diff --git a/lib/datadog/core/telemetry/event.rb b/lib/datadog/core/telemetry/event.rb index f28fb8995f1..1fe6a49aefd 100644 --- a/lib/datadog/core/telemetry/event.rb +++ b/lib/datadog/core/telemetry/event.rb @@ -60,7 +60,8 @@ def app_started dependencies: dependencies, integrations: integrations, configuration: configurations, - additional_payload: additional_payload + additional_payload: additional_payload, + install_signature: install_signature ) end diff --git a/lib/datadog/core/telemetry/ext.rb b/lib/datadog/core/telemetry/ext.rb index 28716f2de7c..4ce312a5258 100644 --- a/lib/datadog/core/telemetry/ext.rb +++ b/lib/datadog/core/telemetry/ext.rb @@ -6,6 +6,9 @@ module Telemetry module Ext ENV_ENABLED = 'DD_INSTRUMENTATION_TELEMETRY_ENABLED' ENV_HEARTBEAT_INTERVAL = 'DD_TELEMETRY_HEARTBEAT_INTERVAL' + ENV_INSTALL_ID = 'DD_INSTRUMENTATION_INSTALL_ID' + ENV_INSTALL_TYPE = 'DD_INSTRUMENTATION_INSTALL_TYPE' + ENV_INSTALL_TIME = 'DD_INSTRUMENTATION_INSTALL_TIME' end end end diff --git a/lib/datadog/core/telemetry/v1/app_event.rb b/lib/datadog/core/telemetry/v1/app_event.rb index 11f57e41b35..b33e5fb08b3 100644 --- a/lib/datadog/core/telemetry/v1/app_event.rb +++ b/lib/datadog/core/telemetry/v1/app_event.rb @@ -10,18 +10,24 @@ class AppEvent :additional_payload, :configuration, :dependencies, + :install_signature, :integrations # @param additional_payload [Array] List of Additional payload to track (any key # value not mentioned and doesn't fit under a metric) # @param configuration [Array] List of Tracer related configuration data # @param dependencies [Array] List of all loaded modules requested by the app + # @param install_signature [Telemetry::V1::InstallSignature] Install signature data # @param integrations [Array] List of integrations that are available within the app # and applicable to be traced - def initialize(additional_payload: nil, configuration: nil, dependencies: nil, integrations: nil) + def initialize( + additional_payload: nil, configuration: nil, dependencies: nil, install_signature: nil, + integrations: nil + ) @additional_payload = additional_payload @configuration = configuration @dependencies = dependencies + @install_signature = install_signature @integrations = integrations end @@ -30,6 +36,7 @@ def to_h hash[:additional_payload] = map_hash(@additional_payload) if @additional_payload hash[:configuration] = map_hash(@configuration) if @configuration hash[:dependencies] = map_array(@dependencies) if @dependencies + hash[:install_signature] = @install_signature.to_h if @install_signature hash[:integrations] = map_array(@integrations) if @integrations end end diff --git a/lib/datadog/core/telemetry/v1/install_signature.rb b/lib/datadog/core/telemetry/v1/install_signature.rb new file mode 100644 index 00000000000..b5ad38db719 --- /dev/null +++ b/lib/datadog/core/telemetry/v1/install_signature.rb @@ -0,0 +1,38 @@ +# frozen_string_literal: true + +module Datadog + module Core + module Telemetry + module V1 + # Describes attributes for install signature + class InstallSignature + using Core::Utils::Hash::Refinement + + attr_reader \ + :install_id, + :install_type, + :install_time + + # @param id [String,nil] Install ID + # @param type [String,nil] Install type + # @param type [String,nil] Install time + def initialize(install_id:, install_type:, install_time:) + @install_id = install_id + @install_type = install_type + @install_time = install_time + end + + def to_h + hash = { + install_id: @install_id, + install_type: @install_type, + install_time: @install_time + } + hash.compact! + hash + end + end + end + end + end +end diff --git a/lib/datadog/core/utils/compression.rb b/lib/datadog/core/utils/compression.rb deleted file mode 100644 index fd9c4d0eb4f..00000000000 --- a/lib/datadog/core/utils/compression.rb +++ /dev/null @@ -1,36 +0,0 @@ -# frozen_string_literal: true - -require 'stringio' -require 'zlib' - -module Datadog - module Core - module Utils - # Compression/decompression utility functions. - # - # @deprecated This is no longer used by ddtrace and will be removed in 2.0. - module Compression - module_function - - # @deprecated This is no longer used by ddtrace and will be removed in 2.0. - def gzip(string, level: nil, strategy: nil) - sio = StringIO.new - sio.binmode - gz = Zlib::GzipWriter.new(sio, level, strategy) - gz.write(string) - gz.close - sio.string - end - - # @deprecated This is no longer used by ddtrace and will be removed in 2.0. - def gunzip(string, encoding = ::Encoding::ASCII_8BIT) - sio = StringIO.new(string) - gz = Zlib::GzipReader.new(sio, encoding: encoding) - gz.read - ensure - gz && gz.close - end - end - end - end -end diff --git a/lib/datadog/profiling/collectors/cpu_and_wall_time_worker.rb b/lib/datadog/profiling/collectors/cpu_and_wall_time_worker.rb index d1a06a13964..3507a53dd56 100644 --- a/lib/datadog/profiling/collectors/cpu_and_wall_time_worker.rb +++ b/lib/datadog/profiling/collectors/cpu_and_wall_time_worker.rb @@ -15,15 +15,15 @@ class CpuAndWallTimeWorker def initialize( gc_profiling_enabled:, - allocation_counting_enabled:, no_signals_workaround_enabled:, thread_context_collector:, dynamic_sampling_rate_overhead_target_percentage:, - idle_sampling_helper: IdleSamplingHelper.new, + allocation_sample_every:, + allocation_profiling_enabled:, # **NOTE**: This should only be used for testing; disabling the dynamic sampling rate will increase the # profiler overhead! dynamic_sampling_rate_enabled: true, - allocation_sample_every: 0 # Currently only for testing; Setting this to > 0 can add a lot of overhead! + idle_sampling_helper: IdleSamplingHelper.new ) unless dynamic_sampling_rate_enabled Datadog.logger.warn( @@ -31,23 +31,16 @@ def initialize( ) end - if allocation_counting_enabled && allocation_sample_every > 0 - Datadog.logger.warn( - "Enabled experimental allocation profiling: allocation_sample_every=#{allocation_sample_every}. This is " \ - 'experimental, not recommended, and will increase overhead!' - ) - end - self.class._native_initialize( self, thread_context_collector, gc_profiling_enabled, idle_sampling_helper, - allocation_counting_enabled, no_signals_workaround_enabled, dynamic_sampling_rate_enabled, dynamic_sampling_rate_overhead_target_percentage, allocation_sample_every, + allocation_profiling_enabled, ) @worker_thread = nil @failure_exception = nil diff --git a/lib/datadog/profiling/component.rb b/lib/datadog/profiling/component.rb index 5c50d602c94..3002484f052 100644 --- a/lib/datadog/profiling/component.rb +++ b/lib/datadog/profiling/component.rb @@ -7,7 +7,7 @@ module Component # Passing in a `nil` tracer is supported and will disable the following profiling features: # * Code Hotspots panel in the trace viewer, as well as scoping a profile down to a span # * Endpoint aggregation in the profiler UX, including normalization (resource per endpoint call) - def self.build_profiler_component(settings:, agent_settings:, optional_tracer:) # rubocop:disable Metrics/MethodLength + def self.build_profiler_component(settings:, agent_settings:, optional_tracer:) require_relative '../profiling/diagnostics/environment_logger' Profiling::Diagnostics::EnvironmentLogger.collect_and_log! @@ -41,32 +41,32 @@ def self.build_profiler_component(settings:, agent_settings:, optional_tracer:) no_signals_workaround_enabled = no_signals_workaround_enabled?(settings) timeline_enabled = settings.profiling.advanced.experimental_timeline_enabled + allocation_sample_every = get_allocation_sample_every(settings) + allocation_profiling_enabled = enable_allocation_profiling?(settings, allocation_sample_every) + heap_profiling_enabled = enable_heap_profiling?(settings, allocation_profiling_enabled) + overhead_target_percentage = valid_overhead_target(settings.profiling.advanced.overhead_target_percentage) upload_period_seconds = [60, settings.profiling.advanced.upload_period_seconds].max - recorder = Datadog::Profiling::StackRecorder.new( - cpu_time_enabled: RUBY_PLATFORM.include?('linux'), # Only supported on Linux currently - alloc_samples_enabled: false, # Always disabled for now -- work in progress - ) - thread_context_collector = Datadog::Profiling::Collectors::ThreadContext.new( - recorder: recorder, - max_frames: settings.profiling.advanced.max_frames, - tracer: optional_tracer, - endpoint_collection_enabled: settings.profiling.advanced.endpoint.collection.enabled, + recorder = build_recorder( + allocation_profiling_enabled: allocation_profiling_enabled, + heap_profiling_enabled: heap_profiling_enabled, timeline_enabled: timeline_enabled, ) + thread_context_collector = build_thread_context_collector(settings, recorder, optional_tracer, timeline_enabled) worker = Datadog::Profiling::Collectors::CpuAndWallTimeWorker.new( gc_profiling_enabled: enable_gc_profiling?(settings), - allocation_counting_enabled: settings.profiling.advanced.allocation_counting_enabled, no_signals_workaround_enabled: no_signals_workaround_enabled, thread_context_collector: thread_context_collector, dynamic_sampling_rate_overhead_target_percentage: overhead_target_percentage, - allocation_sample_every: 0, + allocation_sample_every: allocation_sample_every, + allocation_profiling_enabled: allocation_profiling_enabled, ) internal_metadata = { no_signals_workaround_enabled: no_signals_workaround_enabled, timeline_enabled: timeline_enabled, + allocation_sample_every: allocation_sample_every, }.freeze exporter = build_profiler_exporter(settings, recorder, internal_metadata: internal_metadata) @@ -76,6 +76,30 @@ def self.build_profiler_component(settings:, agent_settings:, optional_tracer:) Profiling::Profiler.new(worker: worker, scheduler: scheduler) end + private_class_method def self.build_recorder( + allocation_profiling_enabled:, + heap_profiling_enabled:, + timeline_enabled: + ) + Datadog::Profiling::StackRecorder.new( + cpu_time_enabled: RUBY_PLATFORM.include?('linux'), # Only supported on Linux currently + alloc_samples_enabled: allocation_profiling_enabled, + heap_samples_enabled: heap_profiling_enabled, + heap_size_enabled: heap_profiling_enabled, + timeline_enabled: timeline_enabled, + ) + end + + private_class_method def self.build_thread_context_collector(settings, recorder, optional_tracer, timeline_enabled) + Datadog::Profiling::Collectors::ThreadContext.new( + recorder: recorder, + max_frames: settings.profiling.advanced.max_frames, + tracer: optional_tracer, + endpoint_collection_enabled: settings.profiling.advanced.endpoint.collection.enabled, + timeline_enabled: timeline_enabled, + ) + end + private_class_method def self.build_profiler_exporter(settings, recorder, internal_metadata:) code_provenance_collector = (Profiling::Collectors::CodeProvenance.new if settings.profiling.advanced.code_provenance_enabled) @@ -113,6 +137,94 @@ def self.build_profiler_component(settings:, agent_settings:, optional_tracer:) end end + private_class_method def self.get_allocation_sample_every(settings) + allocation_sample_rate = settings.profiling.advanced.experimental_allocation_sample_rate + + if allocation_sample_rate <= 0 + raise ArgumentError, "Allocation sample rate must be a positive integer. Was #{allocation_sample_rate}" + end + + allocation_sample_rate + end + + private_class_method def self.enable_allocation_profiling?(settings, allocation_sample_every) + unless settings.profiling.advanced.experimental_allocation_enabled + # Allocation profiling disabled, short-circuit out + return false + end + + # Allocation sampling is safe and supported on Ruby 2.x, but has a few caveats on Ruby 3.x. + + # SEVERE - All configurations + # Ruby 3.2.0 to 3.2.2 have a bug in the newobj tracepoint (https://bugs.ruby-lang.org/issues/19482, + # https://github.com/ruby/ruby/pull/7464) that makes this crash in any configuration. This bug is + # fixed on Ruby versions 3.2.3 and 3.3.0. + if RUBY_VERSION.start_with?('3.2.') && RUBY_VERSION < '3.2.3' + Datadog.logger.warn( + 'Allocation profiling is not supported in Ruby versions 3.2.0, 3.2.1 and 3.2.2 and will be forcibly '\ + 'disabled. This is due to a VM bug that can lead to crashes (https://bugs.ruby-lang.org/issues/19482). '\ + 'Other Ruby versions do not suffer from this issue.' + ) + return false + end + + # SEVERE - Only with Ractors + # On Ruby versions 3.0 (all), 3.1.0 to 3.1.3, and 3.2.0 to 3.2.2 allocation profiling can trigger a VM bug + # that causes a segmentation fault during garbage collection of Ractors + # (https://bugs.ruby-lang.org/issues/18464). We don't recommend using this feature on such Rubies. + # This bug is fixed on Ruby versions 3.1.4, 3.2.3 and 3.3.0. + if RUBY_VERSION.start_with?('3.0.') || + (RUBY_VERSION.start_with?('3.1.') && RUBY_VERSION < '3.1.4') || + (RUBY_VERSION.start_with?('3.2.') && RUBY_VERSION < '3.2.3') + Datadog.logger.warn( + "Current Ruby version (#{RUBY_VERSION}) has a VM bug where enabling allocation profiling while using "\ + 'Ractors may cause unexpected issues, including crashes (https://bugs.ruby-lang.org/issues/18464). '\ + 'This does not happen if Ractors are not used.' + ) + # ANNOYANCE - Only with Ractors + # On all known versions of Ruby 3.x, due to https://bugs.ruby-lang.org/issues/19112, when a ractor gets + # garbage collected, Ruby will disable all active tracepoints, which this feature internally relies on. + elsif RUBY_VERSION.start_with?('3.') + Datadog.logger.warn( + 'In all known versions of Ruby 3.x, using Ractors may result in allocation profiling unexpectedly ' \ + 'stopping (https://bugs.ruby-lang.org/issues/19112). Note that this stop has no impact in your ' \ + 'application stability or performance. This does not happen if Ractors are not used.' + ) + end + + Datadog.logger.warn( + "Enabled experimental allocation profiling: allocation_sample_rate=#{allocation_sample_every}. This is " \ + 'experimental, not recommended, and will increase overhead!' + ) + + true + end + + private_class_method def self.enable_heap_profiling?(settings, allocation_profiling_enabled) + heap_profiling_enabled = settings.profiling.advanced.experimental_heap_enabled + + return false unless heap_profiling_enabled + + if RUBY_VERSION.start_with?('2.') && RUBY_VERSION < '2.7' + Datadog.logger.warn( + 'Heap profiling currently relies on features introduced in Ruby 2.7 and will be forcibly disabled. '\ + 'Please upgrade to Ruby >= 2.7 in order to use this feature.' + ) + return false + end + + unless allocation_profiling_enabled + raise ArgumentError, + 'Heap profiling requires allocation profiling to be enabled' + end + + Datadog.logger.warn( + 'Enabled experimental heap profiling. This is experimental, not recommended, and will increase overhead!' + ) + + true + end + private_class_method def self.no_signals_workaround_enabled?(settings) # rubocop:disable Metrics/MethodLength setting_value = settings.profiling.advanced.no_signals_workaround_enabled legacy_ruby_that_should_use_workaround = RUBY_VERSION.start_with?('2.3.', '2.4.', '2.5.') @@ -220,9 +332,12 @@ def self.build_profiler_component(settings:, agent_settings:, optional_tracer:) return true unless mysql2_client_class && mysql2_client_class.respond_to?(:info) - libmysqlclient_version = Gem::Version.new(mysql2_client_class.info[:version]) + info = mysql2_client_class.info + libmysqlclient_version = Gem::Version.new(info[:version]) - compatible = libmysqlclient_version >= Gem::Version.new('8.0.0') + compatible = + libmysqlclient_version >= Gem::Version.new('8.0.0') || + looks_like_mariadb?(info, libmysqlclient_version) Datadog.logger.debug( "The `mysql2` gem is using #{compatible ? 'a compatible' : 'an incompatible'} version of " \ @@ -261,6 +376,35 @@ def self.build_profiler_component(settings:, agent_settings:, optional_tracer:) 2.0 end end + + # To add just a bit more complexity to our detection code, in https://github.com/DataDog/dd-trace-rb/issues/3334 + # a user reported that our code was incorrectly flagging the mariadb variant of libmysqlclient as being + # incompatible. In fact we have no reports of the mariadb variant needing the "no signals" workaround, + # so we flag it as compatible when it's in use. + # + # A problem is that there doesn't seem to be an obvious way to query the mysql2 gem on which kind of + # libmysqlclient it's using, so we detect it by looking at the version. + # + # The info method for mysql2 with mariadb looks something like this: + # `{:id=>30308, :version=>"3.3.8", :header_version=>"11.2.2"}` + # + # * The version seems to come from https://github.com/mariadb-corporation/mariadb-connector-c and the latest + # one is 3.x. + # * The header_version is what people usually see as the "mariadb version" + # + # As a comparison, for libmysql the info looks like: + # * `{:id=>80035, :version=>"8.0.35", :header_version=>"8.0.35"}` + # + # Thus our detection is version 4 or older, because libmysqlclient 4 is almost 20 years old so it's most probably + # not that one + header_version being 10 or newer, since according to https://endoflife.date/mariadb that's a + # sane range for modern mariadb releases. + private_class_method def self.looks_like_mariadb?(info, libmysqlclient_version) + header_version = Gem::Version.new(info[:header_version]) if info[:header_version] + + !!(header_version && + libmysqlclient_version < Gem::Version.new('5.0.0') && + header_version >= Gem::Version.new('10.0.0')) + end end end end diff --git a/lib/datadog/profiling/stack_recorder.rb b/lib/datadog/profiling/stack_recorder.rb index ccbe710dafd..faa917c46d0 100644 --- a/lib/datadog/profiling/stack_recorder.rb +++ b/lib/datadog/profiling/stack_recorder.rb @@ -4,7 +4,10 @@ module Profiling # Note that `record_sample` is only accessible from native code. # Methods prefixed with _native_ are implemented in `stack_recorder.c` class StackRecorder - def initialize(cpu_time_enabled:, alloc_samples_enabled:) + def initialize( + cpu_time_enabled:, alloc_samples_enabled:, heap_samples_enabled:, heap_size_enabled:, + timeline_enabled: + ) # This mutex works in addition to the fancy C-level mutexes we have in the native side (see the docs there). # It prevents multiple Ruby threads calling serialize at the same time -- something like # `10.times { Thread.new { stack_recorder.serialize } }`. @@ -13,7 +16,14 @@ def initialize(cpu_time_enabled:, alloc_samples_enabled:) # accidentally happening. @no_concurrent_synchronize_mutex = Mutex.new - self.class._native_initialize(self, cpu_time_enabled, alloc_samples_enabled) + self.class._native_initialize( + self, + cpu_time_enabled, + alloc_samples_enabled, + heap_samples_enabled, + heap_size_enabled, + timeline_enabled, + ) end def serialize diff --git a/lib/datadog/tracing/component.rb b/lib/datadog/tracing/component.rb index 26e86b128f5..f20a525131b 100644 --- a/lib/datadog/tracing/component.rb +++ b/lib/datadog/tracing/component.rb @@ -70,63 +70,32 @@ def build_trace_flush(settings) end end - # TODO: Sampler should be a top-level component. - # It is currently part of the Tracer initialization - # process, but can take a variety of options (including - # a fully custom instance) that makes the Tracer - # initialization process complex. def build_sampler(settings) + # A custom sampler is provided if (sampler = settings.tracing.sampler) - if settings.tracing.priority_sampling == false - sampler - else - ensure_priority_sampling(sampler, settings) - end - elsif (rules = settings.tracing.sampling.rules) + return sampler + end + + # Sampling rules are provided + if (rules = settings.tracing.sampling.rules) post_sampler = Tracing::Sampling::RuleSampler.parse( rules, settings.tracing.sampling.rate_limit, settings.tracing.sampling.default_rate ) - - post_sampler ||= # Fallback RuleSampler in case `rules` parsing fails - Tracing::Sampling::RuleSampler.new( - rate_limit: settings.tracing.sampling.rate_limit, - default_sample_rate: settings.tracing.sampling.default_rate - ) - - Tracing::Sampling::PrioritySampler.new( - base_sampler: Tracing::Sampling::AllSampler.new, - post_sampler: post_sampler - ) - elsif settings.tracing.priority_sampling == false - Tracing::Sampling::RuleSampler.new( - rate_limit: settings.tracing.sampling.rate_limit, - default_sample_rate: settings.tracing.sampling.default_rate - ) - else - Tracing::Sampling::PrioritySampler.new( - base_sampler: Tracing::Sampling::AllSampler.new, - post_sampler: Tracing::Sampling::RuleSampler.new( - rate_limit: settings.tracing.sampling.rate_limit, - default_sample_rate: settings.tracing.sampling.default_rate - ) - ) end - end - def ensure_priority_sampling(sampler, settings) - if sampler.is_a?(Tracing::Sampling::PrioritySampler) - sampler - else - Tracing::Sampling::PrioritySampler.new( - base_sampler: sampler, - post_sampler: Tracing::Sampling::RuleSampler.new( - rate_limit: settings.tracing.sampling.rate_limit, - default_sample_rate: settings.tracing.sampling.default_rate - ) - ) - end + # The default sampler. + # Used if no custom sampler is provided, or if sampling rule parsing fails. + post_sampler ||= Tracing::Sampling::RuleSampler.new( + rate_limit: settings.tracing.sampling.rate_limit, + default_sample_rate: settings.tracing.sampling.default_rate + ) + + Tracing::Sampling::PrioritySampler.new( + base_sampler: Tracing::Sampling::AllSampler.new, + post_sampler: post_sampler + ) end # TODO: Writer should be a top-level component. diff --git a/lib/datadog/tracing/configuration/settings.rb b/lib/datadog/tracing/configuration/settings.rb index 558af6497ba..6fc57f7b07d 100644 --- a/lib/datadog/tracing/configuration/settings.rb +++ b/lib/datadog/tracing/configuration/settings.rb @@ -227,12 +227,6 @@ def self.extended(base) option :min_spans_threshold, default: 500, type: :int end - # Enables {https://docs.datadoghq.com/tracing/trace_retention_and_ingestion/#datadog-intelligent-retention-filter - # Datadog intelligent retention filter}. - # @default `true` - # @return [Boolean,nil] - option :priority_sampling - option :report_hostname do |o| o.env Tracing::Configuration::Ext::NET::ENV_REPORT_HOSTNAME o.default false diff --git a/lib/datadog/tracing/contrib/active_job/configuration/settings.rb b/lib/datadog/tracing/contrib/active_job/configuration/settings.rb index 4bfecb8f520..2512ed840d7 100644 --- a/lib/datadog/tracing/contrib/active_job/configuration/settings.rb +++ b/lib/datadog/tracing/contrib/active_job/configuration/settings.rb @@ -1,6 +1,5 @@ # frozen_string_literal: true -require_relative '../../../span_operation' require_relative '../ext' require_relative '../../configuration/settings' @@ -31,10 +30,6 @@ class Settings < Contrib::Configuration::Settings end option :service_name - option :error_handler do |o| - o.type :proc - o.default_proc(&Tracing::SpanOperation::Events::DEFAULT_ON_ERROR) - end end end end diff --git a/lib/datadog/tracing/contrib/delayed_job/configuration/settings.rb b/lib/datadog/tracing/contrib/delayed_job/configuration/settings.rb index af2a4a6963d..ffaf3dc23f0 100644 --- a/lib/datadog/tracing/contrib/delayed_job/configuration/settings.rb +++ b/lib/datadog/tracing/contrib/delayed_job/configuration/settings.rb @@ -1,6 +1,5 @@ # frozen_string_literal: true -require_relative '../../../span_operation' require_relative '../../configuration/settings' require_relative '../ext' @@ -32,9 +31,8 @@ class Settings < Contrib::Configuration::Settings option :service_name option :client_service_name - option :error_handler do |o| - o.type :proc - o.default_proc(&Tracing::SpanOperation::Events::DEFAULT_ON_ERROR) + option :on_error do |o| + o.type :proc, nilable: true end end end diff --git a/lib/datadog/tracing/contrib/delayed_job/plugin.rb b/lib/datadog/tracing/contrib/delayed_job/plugin.rb index 6abd83cac3d..415b768db6a 100644 --- a/lib/datadog/tracing/contrib/delayed_job/plugin.rb +++ b/lib/datadog/tracing/contrib/delayed_job/plugin.rb @@ -19,7 +19,7 @@ def self.instrument_invoke(job, &block) Ext::SPAN_JOB, service: configuration[:service_name], resource: job_name(job), - on_error: configuration[:error_handler] + on_error: configuration[:on_error] ) do |span| set_sample_rate(span) diff --git a/lib/datadog/tracing/contrib/excon/configuration/settings.rb b/lib/datadog/tracing/contrib/excon/configuration/settings.rb index 22fa378b9af..e7947a07b95 100644 --- a/lib/datadog/tracing/contrib/excon/configuration/settings.rb +++ b/lib/datadog/tracing/contrib/excon/configuration/settings.rb @@ -1,6 +1,9 @@ # frozen_string_literal: true +require_relative '../../../span_operation' require_relative '../../configuration/settings' +require_relative '../../status_range_matcher' +require_relative '../../status_range_env_parser' require_relative '../ext' module Datadog @@ -30,9 +33,22 @@ class Settings < Contrib::Configuration::Settings end option :distributed_tracing, default: true, type: :bool - option :error_handler do |o| + + option :on_error do |o| o.type :proc, nilable: true end + + option :error_status_codes do |o| + o.env Ext::ENV_ERROR_STATUS_CODES + o.default 400...600 + o.setter do |v| + Tracing::Contrib::StatusRangeMatcher.new(v) if v + end + o.env_parser do |v| + Tracing::Contrib::StatusRangeEnvParser.call(v) if v + end + end + option :split_by_domain, default: false, type: :bool option :service_name do |o| diff --git a/lib/datadog/tracing/contrib/excon/ext.rb b/lib/datadog/tracing/contrib/excon/ext.rb index 281b2c685a4..a2f7cc1fb65 100644 --- a/lib/datadog/tracing/contrib/excon/ext.rb +++ b/lib/datadog/tracing/contrib/excon/ext.rb @@ -13,6 +13,7 @@ module Ext ENV_ANALYTICS_ENABLED = 'DD_TRACE_EXCON_ANALYTICS_ENABLED' ENV_ANALYTICS_SAMPLE_RATE = 'DD_TRACE_EXCON_ANALYTICS_SAMPLE_RATE' + ENV_ERROR_STATUS_CODES = 'DD_TRACE_EXCON_ERROR_STATUS_CODES' DEFAULT_PEER_SERVICE_NAME = 'excon' SPAN_REQUEST = 'excon.request' TAG_COMPONENT = 'excon' diff --git a/lib/datadog/tracing/contrib/excon/middleware.rb b/lib/datadog/tracing/contrib/excon/middleware.rb index 5edbe14ac80..3f220071398 100644 --- a/lib/datadog/tracing/contrib/excon/middleware.rb +++ b/lib/datadog/tracing/contrib/excon/middleware.rb @@ -15,10 +15,6 @@ module Excon class Middleware < ::Excon::Middleware::Base include Contrib::HttpAnnotationHelper - DEFAULT_ERROR_HANDLER = lambda do |response| - Tracing::Metadata::Ext::HTTP::ERROR_RANGE.cover?(response[:status]) - end - def initialize(stack, options = {}) super(stack) @default_options = datadog_configuration.options_hash.merge(options) @@ -105,8 +101,12 @@ def distributed_tracing? @options[:distributed_tracing] == true && Tracing.enabled? end - def error_handler - @options[:error_handler] || DEFAULT_ERROR_HANDLER + def on_error + @options[:on_error] || Tracing::SpanOperation::Events::DEFAULT_ON_ERROR + end + + def error_status_codes + @options[:error_status_codes] end def annotate!(span, datum) @@ -156,7 +156,9 @@ def handle_response(datum) if datum.key?(:response) response = datum[:response] - span.set_error(["Error #{response[:status]}", response[:body]]) if error_handler.call(response) + if error_status_codes.include? response[:status] + span.set_error(["Error #{response[:status]}", response[:body]]) + end span.set_tag(Tracing::Metadata::Ext::HTTP::TAG_STATUS_CODE, response[:status]) span.set_tags( @@ -165,7 +167,7 @@ def handle_response(datum) ) ) end - span.set_error(datum[:error]) if datum.key?(:error) + on_error.call(span, datum[:error]) if datum.key?(:error) span.finish datum.delete(:datadog_span) end diff --git a/lib/datadog/tracing/contrib/faraday/configuration/settings.rb b/lib/datadog/tracing/contrib/faraday/configuration/settings.rb index d04fea4db89..9fdf7c833d4 100644 --- a/lib/datadog/tracing/contrib/faraday/configuration/settings.rb +++ b/lib/datadog/tracing/contrib/faraday/configuration/settings.rb @@ -1,6 +1,8 @@ # frozen_string_literal: true require_relative '../../configuration/settings' +require_relative '../../status_range_matcher' +require_relative '../../status_range_env_parser' require_relative '../ext' module Datadog @@ -34,10 +36,22 @@ class Settings < Contrib::Configuration::Settings end option :distributed_tracing, default: true, type: :bool - option :error_handler do |o| - o.type :proc - o.default_proc(&DEFAULT_ERROR_HANDLER) + + option :on_error do |o| + o.type :proc, nilable: true + end + + option :error_status_codes do |o| + o.env Ext::ENV_ERROR_STATUS_CODES + o.default 400...600 + o.setter do |v| + Tracing::Contrib::StatusRangeMatcher.new(v) if v + end + o.env_parser do |v| + Tracing::Contrib::StatusRangeEnvParser.call(v) if v + end end + option :split_by_domain, default: false, type: :bool option :service_name do |o| diff --git a/lib/datadog/tracing/contrib/faraday/ext.rb b/lib/datadog/tracing/contrib/faraday/ext.rb index 07829d89ca8..41c4b5b12af 100644 --- a/lib/datadog/tracing/contrib/faraday/ext.rb +++ b/lib/datadog/tracing/contrib/faraday/ext.rb @@ -10,6 +10,7 @@ module Ext ENV_ENABLED = 'DD_TRACE_FARADAY_ENABLED' ENV_SERVICE_NAME = 'DD_TRACE_FARADAY_SERVICE_NAME' ENV_PEER_SERVICE = 'DD_TRACE_FARADAY_PEER_SERVICE' + ENV_ERROR_STATUS_CODES = 'DD_TRACE_FARADAY_ERROR_STATUS_CODES' ENV_ANALYTICS_ENABLED = 'DD_TRACE_FARADAY_ANALYTICS_ENABLED' ENV_ANALYTICS_SAMPLE_RATE = 'DD_TRACE_FARADAY_ANALYTICS_SAMPLE_RATE' diff --git a/lib/datadog/tracing/contrib/faraday/middleware.rb b/lib/datadog/tracing/contrib/faraday/middleware.rb index fad8fe30176..d344e61df04 100644 --- a/lib/datadog/tracing/contrib/faraday/middleware.rb +++ b/lib/datadog/tracing/contrib/faraday/middleware.rb @@ -24,7 +24,7 @@ def call(env) # Do this once to reduce expensive regex calls. request_options = build_request_options!(env) - Tracing.trace(Ext::SPAN_REQUEST) do |span, trace| + Tracing.trace(Ext::SPAN_REQUEST, on_error: request_options[:on_error]) do |span, trace| annotate!(span, env, request_options) propagate!(trace, span, env) if request_options[:distributed_tracing] && Tracing.enabled? app.call(env).on_complete { |resp| handle_response(span, resp, request_options) } @@ -76,7 +76,7 @@ def annotate!(span, env, options) end def handle_response(span, env, options) - span.set_error(["Error #{env[:status]}", env[:body]]) if options.fetch(:error_handler).call(env) + span.set_error(["Error #{env[:status]}", env[:body]]) if options[:error_status_codes].include? env[:status] span.set_tag(Tracing::Metadata::Ext::HTTP::TAG_STATUS_CODE, env[:status]) diff --git a/lib/datadog/tracing/contrib/grpc/configuration/settings.rb b/lib/datadog/tracing/contrib/grpc/configuration/settings.rb index 46f893a5b76..31097e396cb 100644 --- a/lib/datadog/tracing/contrib/grpc/configuration/settings.rb +++ b/lib/datadog/tracing/contrib/grpc/configuration/settings.rb @@ -1,6 +1,5 @@ # frozen_string_literal: true -require_relative '../../../span_operation' require_relative '../../configuration/settings' require_relative '../ext' @@ -46,29 +45,8 @@ class Settings < Contrib::Configuration::Settings o.env Ext::ENV_PEER_SERVICE end - option :error_handler do |o| - o.type :proc - o.default_proc(&Tracing::SpanOperation::Events::DEFAULT_ON_ERROR) - o.after_set do |value| - if value != Tracing::SpanOperation::Events::DEFAULT_ON_ERROR - Datadog.logger.warn( - 'The gRPC `error_handler` setting has been deprecated for removal. Please replace ' \ - 'it with `server_error_handler` which is explicit about only handling errors from ' \ - 'server interceptors. Alternatively, to handle errors from client interceptors use ' \ - 'the `client_error_handler` setting instead.' - ) - end - end - end - - option :server_error_handler do |o| - o.type :proc - o.default_proc(&Tracing::SpanOperation::Events::DEFAULT_ON_ERROR) - end - - option :client_error_handler do |o| - o.type :proc - o.default_proc(&Tracing::SpanOperation::Events::DEFAULT_ON_ERROR) + option :on_error do |o| + o.type :proc, nilable: true end end end diff --git a/lib/datadog/tracing/contrib/grpc/datadog_interceptor.rb b/lib/datadog/tracing/contrib/grpc/datadog_interceptor.rb index 4c52ea9fad8..562cfb60105 100644 --- a/lib/datadog/tracing/contrib/grpc/datadog_interceptor.rb +++ b/lib/datadog/tracing/contrib/grpc/datadog_interceptor.rb @@ -58,6 +58,10 @@ def analytics_sample_rate datadog_configuration[:analytics_sample_rate] end + def on_error + Datadog.configuration_for(self, :on_error) || datadog_configuration[:on_error] + end + # Allows interceptors to define settings using methods instead of `[]` class PinAdapter OPTIONS = Configuration::Settings.instance_methods(false).freeze diff --git a/lib/datadog/tracing/contrib/grpc/datadog_interceptor/client.rb b/lib/datadog/tracing/contrib/grpc/datadog_interceptor/client.rb index 0d5bb1b3f95..b65c8592bc8 100644 --- a/lib/datadog/tracing/contrib/grpc/datadog_interceptor/client.rb +++ b/lib/datadog/tracing/contrib/grpc/datadog_interceptor/client.rb @@ -23,7 +23,7 @@ def trace(keywords) type: Tracing::Metadata::Ext::HTTP::TYPE_OUTBOUND, service: service_name, # Maintain client-side service name configuration resource: formatter.resource_name, - on_error: error_handler + on_error: on_error } Tracing.trace(Ext::SPAN_CLIENT, **options) do |span, trace| @@ -107,10 +107,6 @@ def find_host_port(call) Datadog.logger.debug { "Could not parse host:port from #{call}: #{e}" } nil end - - def error_handler - Datadog.configuration_for(self, :error_handler) || datadog_configuration[:client_error_handler] - end end end end diff --git a/lib/datadog/tracing/contrib/grpc/datadog_interceptor/server.rb b/lib/datadog/tracing/contrib/grpc/datadog_interceptor/server.rb index 78c30bc976d..0d7409afb02 100644 --- a/lib/datadog/tracing/contrib/grpc/datadog_interceptor/server.rb +++ b/lib/datadog/tracing/contrib/grpc/datadog_interceptor/server.rb @@ -24,7 +24,7 @@ def trace(keywords) type: Tracing::Metadata::Ext::HTTP::TYPE_INBOUND, service: service_name, # TODO: Remove server-side service name configuration resource: formatter.resource_name, - on_error: error_handler + on_error: on_error } metadata = keywords[:call].metadata @@ -86,19 +86,6 @@ def annotate!(span, metadata, formatter) rescue StandardError => e Datadog.logger.debug("GRPC server trace failed: #{e}") end - - def error_handler - self_handler = Datadog.configuration_for(self, :error_handler) - return self_handler if self_handler - - unless datadog_configuration.using_default?(:server_error_handler) - return datadog_configuration[:server_error_handler] - end - - # As a last resort, fallback to the deprecated error_handler - # configuration option. - datadog_configuration[:error_handler] - end end end end diff --git a/lib/datadog/tracing/contrib/http/configuration/settings.rb b/lib/datadog/tracing/contrib/http/configuration/settings.rb index 5f1ed125741..8c2753c8870 100644 --- a/lib/datadog/tracing/contrib/http/configuration/settings.rb +++ b/lib/datadog/tracing/contrib/http/configuration/settings.rb @@ -1,6 +1,8 @@ # frozen_string_literal: true require_relative '../../configuration/settings' +require_relative '../../status_range_matcher' +require_relative '../../status_range_env_parser' require_relative '../ext' module Datadog @@ -43,20 +45,11 @@ class Settings < Contrib::Configuration::Settings option :error_status_codes do |o| o.env Ext::ENV_ERROR_STATUS_CODES o.default 400...600 - o.env_parser do |value| - values = if value.include?(',') - value.split(',') - else - value.split - end - values.map! do |v| - v.gsub!(/\A[\s,]*|[\s,]*\Z/, '') - - v.empty? ? nil : v - end - - values.compact! - values + o.setter do |v| + Tracing::Contrib::StatusRangeMatcher.new(v) if v + end + o.env_parser do |v| + Tracing::Contrib::StatusRangeEnvParser.call(v) if v end end diff --git a/lib/datadog/tracing/contrib/httpclient/configuration/settings.rb b/lib/datadog/tracing/contrib/httpclient/configuration/settings.rb index a9ee53dced1..c0c051d1e3b 100644 --- a/lib/datadog/tracing/contrib/httpclient/configuration/settings.rb +++ b/lib/datadog/tracing/contrib/httpclient/configuration/settings.rb @@ -1,6 +1,8 @@ # frozen_string_literal: true require_relative '../../configuration/settings' +require_relative '../../status_range_matcher' +require_relative '../../status_range_env_parser' require_relative '../ext' module Datadog @@ -43,20 +45,11 @@ class Settings < Contrib::Configuration::Settings option :error_status_codes do |o| o.env Ext::ENV_ERROR_STATUS_CODES o.default 400...600 - o.env_parser do |value| - values = if value.include?(',') - value.split(',') - else - value.split - end - values.map! do |v| - v.gsub!(/\A[\s,]*|[\s,]*\Z/, '') - - v.empty? ? nil : v - end - - values.compact! - values + o.setter do |v| + Tracing::Contrib::StatusRangeMatcher.new(v) if v + end + o.env_parser do |v| + Tracing::Contrib::StatusRangeEnvParser.call(v) if v end end diff --git a/lib/datadog/tracing/contrib/httprb/configuration/settings.rb b/lib/datadog/tracing/contrib/httprb/configuration/settings.rb index 8207414b028..d0c764a9c29 100644 --- a/lib/datadog/tracing/contrib/httprb/configuration/settings.rb +++ b/lib/datadog/tracing/contrib/httprb/configuration/settings.rb @@ -1,6 +1,8 @@ # frozen_string_literal: true require_relative '../../configuration/settings' +require_relative '../../status_range_matcher' +require_relative '../../status_range_env_parser' require_relative '../ext' module Datadog @@ -43,20 +45,11 @@ class Settings < Contrib::Configuration::Settings option :error_status_codes do |o| o.env Ext::ENV_ERROR_STATUS_CODES o.default 400...600 - o.env_parser do |value| - values = if value.include?(',') - value.split(',') - else - value.split - end - values.map! do |v| - v.gsub!(/\A[\s,]*|[\s,]*\Z/, '') - - v.empty? ? nil : v - end - - values.compact! - values + o.setter do |v| + Tracing::Contrib::StatusRangeMatcher.new(v) if v + end + o.env_parser do |v| + Tracing::Contrib::StatusRangeEnvParser.call(v) if v end end diff --git a/lib/datadog/tracing/contrib/httprb/ext.rb b/lib/datadog/tracing/contrib/httprb/ext.rb index 39f9ba0a300..3a31045d0f4 100644 --- a/lib/datadog/tracing/contrib/httprb/ext.rb +++ b/lib/datadog/tracing/contrib/httprb/ext.rb @@ -11,8 +11,8 @@ module Ext ENV_SERVICE_NAME = 'DD_TRACE_HTTPRB_SERVICE_NAME' ENV_PEER_SERVICE = 'DD_TRACE_HTTPRB_PEER_SERVICE' ENV_ANALYTICS_ENABLED = 'DD_TRACE_HTTPRB_ANALYTICS_ENABLED' - ENV_ANALYTICS_SAMPLE_RATE = 'DD_TRACE_EHTTPRB_ANALYTICS_SAMPLE_RATE' - ENV_ERROR_STATUS_CODES = 'DD_TRACE_HTTPCLIENT_ERROR_STATUS_CODES' + ENV_ANALYTICS_SAMPLE_RATE = 'DD_TRACE_HTTPRB_ANALYTICS_SAMPLE_RATE' + ENV_ERROR_STATUS_CODES = 'DD_TRACE_HTTPRB_ERROR_STATUS_CODES' DEFAULT_PEER_SERVICE_NAME = 'httprb' SPAN_REQUEST = 'httprb.request' TAG_COMPONENT = 'httprb' diff --git a/lib/datadog/tracing/contrib/mysql2/configuration/settings.rb b/lib/datadog/tracing/contrib/mysql2/configuration/settings.rb index 2402c3c2d90..04b097b23b7 100644 --- a/lib/datadog/tracing/contrib/mysql2/configuration/settings.rb +++ b/lib/datadog/tracing/contrib/mysql2/configuration/settings.rb @@ -50,6 +50,10 @@ class Settings < Contrib::Configuration::Settings o.type :string, nilable: true o.env Ext::ENV_PEER_SERVICE end + + option :on_error do |o| + o.type :proc, nilable: true + end end end end diff --git a/lib/datadog/tracing/contrib/mysql2/instrumentation.rb b/lib/datadog/tracing/contrib/mysql2/instrumentation.rb index df92f751de8..c988f118236 100644 --- a/lib/datadog/tracing/contrib/mysql2/instrumentation.rb +++ b/lib/datadog/tracing/contrib/mysql2/instrumentation.rb @@ -21,8 +21,9 @@ def self.included(base) module InstanceMethods def query(sql, options = {}) service = Datadog.configuration_for(self, :service_name) || datadog_configuration[:service_name] + on_error = Datadog.configuration_for(self, :on_error) || datadog_configuration[:on_error] - Tracing.trace(Ext::SPAN_QUERY, service: service) do |span, trace_op| + Tracing.trace(Ext::SPAN_QUERY, service: service, on_error: on_error) do |span, trace_op| span.resource = sql span.type = Tracing::Metadata::Ext::SQL::TYPE diff --git a/lib/datadog/tracing/contrib/pg/configuration/settings.rb b/lib/datadog/tracing/contrib/pg/configuration/settings.rb index b6e16cb297f..a049e495d90 100644 --- a/lib/datadog/tracing/contrib/pg/configuration/settings.rb +++ b/lib/datadog/tracing/contrib/pg/configuration/settings.rb @@ -25,9 +25,8 @@ class Settings < Contrib::Configuration::Settings o.default false end - option :error_handler do |o| - o.type :proc - o.default_proc(&Tracing::SpanOperation::Events::DEFAULT_ON_ERROR) + option :on_error do |o| + o.type :proc, nilable: true end option :analytics_sample_rate do |o| diff --git a/lib/datadog/tracing/contrib/pg/instrumentation.rb b/lib/datadog/tracing/contrib/pg/instrumentation.rb index f075bdd9a15..ba04c9429ce 100644 --- a/lib/datadog/tracing/contrib/pg/instrumentation.rb +++ b/lib/datadog/tracing/contrib/pg/instrumentation.rb @@ -99,12 +99,12 @@ def sync_exec_prepared(statement_name, params, *args, &block) def trace(name, sql: nil, statement_name: nil, block: nil) service = Datadog.configuration_for(self, :service_name) || datadog_configuration[:service_name] - error_handler = datadog_configuration[:error_handler] + on_error = datadog_configuration[:on_error] resource = statement_name || sql Tracing.trace( name, - on_error: error_handler, + on_error: on_error, service: service, resource: resource, type: Tracing::Metadata::Ext::SQL::TYPE diff --git a/lib/datadog/tracing/contrib/que/configuration/settings.rb b/lib/datadog/tracing/contrib/que/configuration/settings.rb index e4782d7060f..99eb3c1c7a7 100644 --- a/lib/datadog/tracing/contrib/que/configuration/settings.rb +++ b/lib/datadog/tracing/contrib/que/configuration/settings.rb @@ -1,6 +1,5 @@ # frozen_string_literal: true -require_relative '../../../span_operation' require_relative '../../configuration/settings' require_relative '../ext' @@ -44,9 +43,8 @@ class Settings < Contrib::Configuration::Settings o.default false end - option :error_handler do |o| - o.type :proc - o.default_proc(&Tracing::SpanOperation::Events::DEFAULT_ON_ERROR) + option :on_error do |o| + o.type :proc, nilable: true end end end diff --git a/lib/datadog/tracing/contrib/resque/configuration/settings.rb b/lib/datadog/tracing/contrib/resque/configuration/settings.rb index 3183d1918b8..a6b54b846ce 100644 --- a/lib/datadog/tracing/contrib/resque/configuration/settings.rb +++ b/lib/datadog/tracing/contrib/resque/configuration/settings.rb @@ -1,6 +1,5 @@ # frozen_string_literal: true -require_relative '../../../span_operation' require_relative '../../configuration/settings' require_relative '../ext' @@ -31,9 +30,8 @@ class Settings < Contrib::Configuration::Settings end option :service_name - option :error_handler do |o| - o.type :proc - o.default_proc(&Tracing::SpanOperation::Events::DEFAULT_ON_ERROR) + option :on_error do |o| + o.type :proc, nilable: true end end end diff --git a/lib/datadog/tracing/contrib/resque/resque_job.rb b/lib/datadog/tracing/contrib/resque/resque_job.rb index 0cd0e1f8d06..874f1a0eecf 100644 --- a/lib/datadog/tracing/contrib/resque/resque_job.rb +++ b/lib/datadog/tracing/contrib/resque/resque_job.rb @@ -76,7 +76,7 @@ def forked? end def span_options - { service: datadog_configuration[:service_name], on_error: datadog_configuration[:error_handler] } + { service: datadog_configuration[:service_name], on_error: datadog_configuration[:on_error] } end def datadog_configuration diff --git a/lib/datadog/tracing/contrib/shoryuken/configuration/settings.rb b/lib/datadog/tracing/contrib/shoryuken/configuration/settings.rb index 7eaf5045994..35999acaf4e 100644 --- a/lib/datadog/tracing/contrib/shoryuken/configuration/settings.rb +++ b/lib/datadog/tracing/contrib/shoryuken/configuration/settings.rb @@ -1,6 +1,5 @@ # frozen_string_literal: true -require_relative '../../../span_operation' require_relative '../../configuration/settings' require_relative '../ext' @@ -31,9 +30,8 @@ class Settings < Contrib::Configuration::Settings end option :service_name - option :error_handler do |o| - o.type :proc - o.default_proc(&Tracing::SpanOperation::Events::DEFAULT_ON_ERROR) + option :on_error do |o| + o.type :proc, nilable: true end option :tag_body, default: false, type: :bool end diff --git a/lib/datadog/tracing/contrib/sidekiq/configuration/settings.rb b/lib/datadog/tracing/contrib/sidekiq/configuration/settings.rb index a244e2630d6..14778258859 100644 --- a/lib/datadog/tracing/contrib/sidekiq/configuration/settings.rb +++ b/lib/datadog/tracing/contrib/sidekiq/configuration/settings.rb @@ -1,6 +1,5 @@ # frozen_string_literal: true -require_relative '../../../span_operation' require_relative '../../configuration/settings' require_relative '../ext' @@ -38,10 +37,11 @@ class Settings < Contrib::Configuration::Settings option :service_name option :client_service_name - option :error_handler do |o| - o.type :proc - o.default_proc(&Tracing::SpanOperation::Events::DEFAULT_ON_ERROR) + + option :on_error do |o| + o.type :proc, nilable: true end + option :quantize, default: {}, type: :hash option :distributed_tracing, default: false, type: :bool end diff --git a/lib/datadog/tracing/contrib/sneakers/configuration/settings.rb b/lib/datadog/tracing/contrib/sneakers/configuration/settings.rb index c93331108ce..272801ae695 100644 --- a/lib/datadog/tracing/contrib/sneakers/configuration/settings.rb +++ b/lib/datadog/tracing/contrib/sneakers/configuration/settings.rb @@ -1,6 +1,5 @@ # frozen_string_literal: true -require_relative '../../../span_operation' require_relative '../../configuration/settings' module Datadog @@ -29,10 +28,11 @@ class Settings < Contrib::Configuration::Settings end option :service_name - option :error_handler do |o| - o.type :proc - o.default_proc(&Tracing::SpanOperation::Events::DEFAULT_ON_ERROR) + + option :on_error do |o| + o.type :proc, nilable: true end + option :tag_body, default: false, type: :bool end end diff --git a/lib/datadog/tracing/contrib/status_range_env_parser.rb b/lib/datadog/tracing/contrib/status_range_env_parser.rb new file mode 100644 index 00000000000..09734673f1e --- /dev/null +++ b/lib/datadog/tracing/contrib/status_range_env_parser.rb @@ -0,0 +1,33 @@ +# frozen_string_literal: true + +module Datadog + module Tracing + module Contrib + # Parsing status range from environment variable + class StatusRangeEnvParser + class << self + def call(value) + [].tap do |array| + value.split(',').each do |e| + next unless e + + v = e.split('-') + + case v.length + when 0 then next + when 1 then array << Integer(v.first) + when 2 then array << (Integer(v.first)..Integer(v.last)) + else + Datadog.logger.debug( + "Invalid error_status_codes configuration: Unable to parse #{value}, containing #{v}." + ) + next + end + end + end + end + end + end + end + end +end diff --git a/lib/datadog/tracing/contrib/status_range_matcher.rb b/lib/datadog/tracing/contrib/status_range_matcher.rb new file mode 100644 index 00000000000..94bafbba27d --- /dev/null +++ b/lib/datadog/tracing/contrib/status_range_matcher.rb @@ -0,0 +1,25 @@ +# frozen_string_literal: true + +module Datadog + module Tracing + module Contrib + # Useful checking whether the defined range covers status code + class StatusRangeMatcher + def initialize(ranges) + @ranges = Array(ranges) + end + + def include?(status) + @ranges.any? do |e| + case e + when Range + e.include? status + when Integer + e == status + end + end + end + end + end + end +end diff --git a/lib/datadog/tracing/diagnostics/environment_logger.rb b/lib/datadog/tracing/diagnostics/environment_logger.rb index d7d5fdf45e5..30bda2136fc 100644 --- a/lib/datadog/tracing/diagnostics/environment_logger.rb +++ b/lib/datadog/tracing/diagnostics/environment_logger.rb @@ -40,7 +40,6 @@ def collect_config! sampling_rules: sampling_rules, integrations_loaded: integrations_loaded, partial_flushing_enabled: partial_flushing_enabled, - priority_sampling_enabled: priority_sampling_enabled, **instrumented_integrations_settings } end @@ -129,11 +128,6 @@ def partial_flushing_enabled !!Datadog.configuration.tracing.partial_flush.enabled end - # @return [Boolean, nil] priority sampling enabled in configuration - def priority_sampling_enabled - !!Datadog.configuration.tracing.priority_sampling - end - private def instrumented_integrations diff --git a/lib/datadog/tracing/transport/http.rb b/lib/datadog/tracing/transport/http.rb index 67ef18aa167..55ed4872e82 100644 --- a/lib/datadog/tracing/transport/http.rb +++ b/lib/datadog/tracing/transport/http.rb @@ -84,33 +84,6 @@ def default_adapter Datadog::Core::Transport::Ext::HTTP::ADAPTER end - def default_hostname(logger: Datadog.logger) - logger.warn( - 'Deprecated for removal: Using #default_hostname for configuration is deprecated and will ' \ - 'be removed on a future ddtrace release.' - ) - - DO_NOT_USE_ENVIRONMENT_AGENT_SETTINGS.hostname - end - - def default_port(logger: Datadog.logger) - logger.warn( - 'Deprecated for removal: Using #default_hostname for configuration is deprecated and will ' \ - 'be removed on a future ddtrace release.' - ) - - DO_NOT_USE_ENVIRONMENT_AGENT_SETTINGS.port - end - - def default_url(logger: Datadog.logger) - logger.warn( - 'Deprecated for removal: Using #default_url for configuration is deprecated and will ' \ - 'be removed on a future ddtrace release.' - ) - - nil - end - # Add adapters to registry Builder::REGISTRY.set(Datadog::Core::Transport::HTTP::Adapters::Net, Datadog::Core::Transport::Ext::HTTP::ADAPTER) Builder::REGISTRY.set(Datadog::Core::Transport::HTTP::Adapters::Test, Datadog::Core::Transport::Ext::Test::ADAPTER) diff --git a/lib/ddtrace.rb b/lib/ddtrace.rb index e62109cf32f..4a7253699a6 100644 --- a/lib/ddtrace.rb +++ b/lib/ddtrace.rb @@ -7,5 +7,4 @@ # Load other products (must follow tracing) require_relative 'datadog/profiling' require_relative 'datadog/appsec' -require 'datadog/ci' require_relative 'datadog/kit' diff --git a/lib/ddtrace/transport/ext.rb b/lib/ddtrace/transport/ext.rb deleted file mode 100644 index 09fcd8f5573..00000000000 --- a/lib/ddtrace/transport/ext.rb +++ /dev/null @@ -1,47 +0,0 @@ -# frozen_string_literal: true - -require_relative '../../datadog/core/transport/ext' -# DEV(2.0): This file should be replaced by /datadog/core/transport/ext.rb. -module Datadog - module Transport - # @public_api - module Ext - # @public_api - module HTTP - ADAPTER = Datadog::Core::Transport::Ext::HTTP::ADAPTER - DEFAULT_HOST = Datadog::Core::Transport::Ext::HTTP::DEFAULT_HOST - DEFAULT_PORT = Datadog::Core::Transport::Ext::HTTP::DEFAULT_PORT - - HEADER_CONTAINER_ID = Datadog::Core::Transport::Ext::HTTP::HEADER_CONTAINER_ID - HEADER_DD_API_KEY = Datadog::Core::Transport::Ext::HTTP::HEADER_DD_API_KEY - # Tells agent that `_dd.top_level` metrics have been set by the tracer. - # The agent will not calculate top-level spans but instead trust the tracer tagging. - # - # This prevents partially flushed traces being mistakenly marked as top-level. - # - # Setting this header to any non-empty value enables this feature. - HEADER_CLIENT_COMPUTED_TOP_LEVEL = Datadog::Core::Transport::Ext::HTTP::HEADER_CLIENT_COMPUTED_TOP_LEVEL - HEADER_META_LANG = Datadog::Core::Transport::Ext::HTTP::HEADER_META_LANG - HEADER_META_LANG_VERSION = Datadog::Core::Transport::Ext::HTTP::HEADER_META_LANG_VERSION - HEADER_META_LANG_INTERPRETER = Datadog::Core::Transport::Ext::HTTP::HEADER_META_LANG_INTERPRETER - HEADER_META_TRACER_VERSION = Datadog::Core::Transport::Ext::HTTP::HEADER_META_TRACER_VERSION - - # Header that prevents the Net::HTTP integration from tracing internal trace requests. - # Set it to any value to skip tracing. - HEADER_DD_INTERNAL_UNTRACED_REQUEST = Datadog::Core::Transport::Ext::HTTP::HEADER_DD_INTERNAL_UNTRACED_REQUEST - end - - # @public_api - module Test - ADAPTER = Datadog::Core::Transport::Ext::Test::ADAPTER - end - - # @public_api - module UnixSocket - ADAPTER = Datadog::Core::Transport::Ext::UnixSocket::ADAPTER - DEFAULT_PATH = Datadog::Core::Transport::Ext::UnixSocket::DEFAULT_PATH - DEFAULT_TIMEOUT_SECONDS = Datadog::Core::Transport::Ext::UnixSocket::DEFAULT_TIMEOUT_SECONDS - end - end - end -end diff --git a/sig/datadog/core/telemetry/collector.rbs b/sig/datadog/core/telemetry/collector.rbs index a01d736d65e..03fc4fadf74 100644 --- a/sig/datadog/core/telemetry/collector.rbs +++ b/sig/datadog/core/telemetry/collector.rbs @@ -14,7 +14,7 @@ module Datadog private - TARGET_OPTIONS: ::Array["ci.enabled" | "logger.level" | "profiling.advanced.code_provenance_enabled" | "profiling.advanced.endpoint.collection.enabled" | "profiling.enabled" | "runtime_metrics.enabled" | "tracing.analytics.enabled" | "tracing.distributed_tracing.propagation_inject_style" | "tracing.distributed_tracing.propagation_extract_style" | "tracing.enabled" | "tracing.log_injection" | "tracing.partial_flush.enabled" | "tracing.partial_flush.min_spans_threshold" | "tracing.priority_sampling" | "tracing.report_hostname" | "tracing.sampling.default_rate" | "tracing.sampling.rate_limit"] + TARGET_OPTIONS: ::Array[::String] def additional_payload_variables: () -> untyped diff --git a/sig/datadog/core/telemetry/v1/install_signature.rbs b/sig/datadog/core/telemetry/v1/install_signature.rbs new file mode 100644 index 00000000000..cd07bbd4bca --- /dev/null +++ b/sig/datadog/core/telemetry/v1/install_signature.rbs @@ -0,0 +1,24 @@ +module Datadog + module Core + module Telemetry + module V1 + class InstallSignature + @install_id: untyped + + @install_type: untyped + + @install_time: untyped + + attr_reader install_id: untyped + + attr_reader install_type: untyped + + attr_reader install_time: untyped + def initialize: (install_id: untyped, install_type: untyped, install_time: untyped) -> void + + def to_h: () -> untyped + end + end + end + end +end diff --git a/sig/datadog/core/utils/compression.rbs b/sig/datadog/core/utils/compression.rbs deleted file mode 100644 index 28a68099a15..00000000000 --- a/sig/datadog/core/utils/compression.rbs +++ /dev/null @@ -1,11 +0,0 @@ -module Datadog - module Core - module Utils - module Compression - def self?.gzip: (untyped string, ?level: untyped? level, ?strategy: untyped? strategy) -> untyped - - def self?.gunzip: (untyped string, ?untyped encoding) -> untyped - end - end - end -end diff --git a/sig/datadog/profiling/collectors/cpu_and_wall_time_worker.rbs b/sig/datadog/profiling/collectors/cpu_and_wall_time_worker.rbs index f819fcdbdff..cc887d59ce8 100644 --- a/sig/datadog/profiling/collectors/cpu_and_wall_time_worker.rbs +++ b/sig/datadog/profiling/collectors/cpu_and_wall_time_worker.rbs @@ -9,13 +9,13 @@ module Datadog def initialize: ( gc_profiling_enabled: bool, - allocation_counting_enabled: bool, no_signals_workaround_enabled: bool, thread_context_collector: Datadog::Profiling::Collectors::ThreadContext, dynamic_sampling_rate_overhead_target_percentage: Float, ?idle_sampling_helper: Datadog::Profiling::Collectors::IdleSamplingHelper, ?dynamic_sampling_rate_enabled: bool, - ?allocation_sample_every: Integer, + allocation_sample_every: Integer, + allocation_profiling_enabled: bool, ) -> void def self._native_initialize: ( @@ -23,11 +23,11 @@ module Datadog ThreadContext thread_context_collector, bool gc_profiling_enabled, IdleSamplingHelper idle_sampling_helper, - bool allocation_counting_enabled, bool no_signals_workaround_enabled, bool dynamic_sampling_rate_enabled, Float dynamic_sampling_rate_overhead_target_percentage, ::Integer allocation_sample_every, + bool allocation_profiling_enabled, ) -> true def start: (?on_failure_proc: ::Proc?) -> bool? diff --git a/sig/datadog/profiling/component.rbs b/sig/datadog/profiling/component.rbs index 675143e397c..25673784cb1 100644 --- a/sig/datadog/profiling/component.rbs +++ b/sig/datadog/profiling/component.rbs @@ -7,6 +7,19 @@ module Datadog optional_tracer: Datadog::Tracing::Tracer?, ) -> Datadog::Profiling::Profiler? + def self.build_recorder: ( + allocation_profiling_enabled: bool, + heap_profiling_enabled: bool, + timeline_enabled: bool, + ) -> Datadog::Profiling::StackRecorder + + def self.build_thread_context_collector: ( + untyped settings, + Datadog::Profiling::StackRecorder recorder, + Datadog::Tracing::Tracer? optional_tracer, + bool timeline_enabled, + ) -> Datadog::Profiling::Collectors::ThreadContext + def self.build_profiler_exporter: ( untyped settings, Datadog::Profiling::StackRecorder recorder, @@ -19,6 +32,9 @@ module Datadog ) -> untyped def self.enable_gc_profiling?: (untyped settings) -> bool + def self.get_allocation_sample_every: (untyped settings) -> ::Integer + def self.enable_allocation_profiling?: (untyped settings, ::Integer allocation_sample_every) -> bool + def self.enable_heap_profiling?: (untyped settings, bool allocation_profiling_enabled) -> bool def self.no_signals_workaround_enabled?: (untyped settings) -> bool @@ -26,6 +42,7 @@ module Datadog def self.incompatible_passenger_version?: () -> bool def self.flush_interval: (untyped settings) -> ::Numeric def self.valid_overhead_target: (::Float overhead_target_percentage) -> ::Float + def self.looks_like_mariadb?: ({ header_version: ::String? }, ::Gem::Version) -> bool end end end diff --git a/sig/datadog/profiling/stack_recorder.rbs b/sig/datadog/profiling/stack_recorder.rbs index a3ff67b7e38..cc4787bad95 100644 --- a/sig/datadog/profiling/stack_recorder.rbs +++ b/sig/datadog/profiling/stack_recorder.rbs @@ -3,12 +3,21 @@ module Datadog class StackRecorder @no_concurrent_synchronize_mutex: ::Thread::Mutex - def initialize: (cpu_time_enabled: bool, alloc_samples_enabled: bool) -> void + def initialize: ( + cpu_time_enabled: bool, + alloc_samples_enabled: bool, + heap_samples_enabled: bool, + heap_size_enabled: bool, + timeline_enabled: bool, + ) -> void def self._native_initialize: ( Datadog::Profiling::StackRecorder recorder_instance, bool cpu_time_enabled, bool alloc_samples_enabled, + bool heap_samples_enabled, + bool heap_size_enabled, + bool timeline_enabled, ) -> true def serialize: () -> untyped diff --git a/sig/ddtrace/transport/ext.rbs b/sig/ddtrace/transport/ext.rbs deleted file mode 100644 index 33a8c8b4a8b..00000000000 --- a/sig/ddtrace/transport/ext.rbs +++ /dev/null @@ -1,39 +0,0 @@ -module Datadog - module Transport - module Ext - module HTTP - ADAPTER: :net_http - - DEFAULT_HOST: "127.0.0.1" - - DEFAULT_PORT: 8126 - - HEADER_CONTAINER_ID: ::String - - HEADER_DD_API_KEY: ::String - - HEADER_CLIENT_COMPUTED_TOP_LEVEL: ::String - - HEADER_META_LANG: ::String - - HEADER_META_LANG_VERSION: ::String - - HEADER_META_LANG_INTERPRETER: ::String - - HEADER_META_TRACER_VERSION: ::String - end - - module Test - ADAPTER: :test - end - - module UnixSocket - ADAPTER: :unix - - DEFAULT_PATH: "/var/run/datadog/apm.socket" - - DEFAULT_TIMEOUT_SECONDS: 1 - end - end - end -end diff --git a/spec/datadog/core/configuration/components_spec.rb b/spec/datadog/core/configuration/components_spec.rb index 3053e0e3d1f..05f1f6afb90 100644 --- a/spec/datadog/core/configuration/components_spec.rb +++ b/spec/datadog/core/configuration/components_spec.rb @@ -572,74 +572,18 @@ end end - context 'with :priority_sampling' do + context 'with :sampler' do before do allow(settings.tracing) - .to receive(:priority_sampling) - .and_return(priority_sampling) + .to receive(:sampler) + .and_return(sampler) end - context 'enabled' do - let(:priority_sampling) { true } + let(:sampler) { double('sampler') } - it_behaves_like 'new tracer' - - context 'with :sampler' do - before do - allow(settings.tracing) - .to receive(:sampler) - .and_return(sampler) - end - - context 'that is a priority sampler' do - let(:sampler) { Datadog::Tracing::Sampling::PrioritySampler.new } - - it_behaves_like 'new tracer' do - let(:options) { { sampler: sampler } } - it_behaves_like 'event publishing writer and priority sampler' - end - end - - context 'that is not a priority sampler' do - let(:sampler) { double('sampler') } - - context 'wraps sampler in a priority sampler' do - it_behaves_like 'new tracer' do - let(:options) do - { sampler: be_a(Datadog::Tracing::Sampling::PrioritySampler) & have_attributes( - pre_sampler: sampler, - priority_sampler: be_a(Datadog::Tracing::Sampling::RuleSampler) - ) } - end - - it_behaves_like 'event publishing writer and priority sampler' - end - end - end - end - end - - context 'disabled' do - let(:priority_sampling) { false } - - it_behaves_like 'new tracer' do - let(:options) { { sampler: be_a(Datadog::Tracing::Sampling::RuleSampler) } } - end - - context 'with :sampler' do - before do - allow(settings.tracing) - .to receive(:sampler) - .and_return(sampler) - end - - let(:sampler) { double('sampler') } - - it_behaves_like 'new tracer' do - let(:options) { { sampler: sampler } } - it_behaves_like 'event publishing writer and priority sampler' - end - end + it_behaves_like 'new tracer' do + let(:options) { { sampler: sampler } } + it_behaves_like 'event publishing writer and priority sampler' end end @@ -1070,18 +1014,23 @@ end context 'is enabled' do - before do - skip 'Profiling not supported.' unless Datadog::Profiling.supported? + # Using a generic double rather than instance_double since if profiling is not supported by the + # current CI runner we won't even load the Datadog::Profiling::Profiler class. + let(:profiler) { instance_double('Datadog::Profiling::Profiler') } + before do allow(settings.profiling) .to receive(:enabled) .and_return(true) - allow(profiler_setup_task).to receive(:run) + expect(Datadog::Profiling::Component).to receive(:build_profiler_component).with( + settings: settings, + agent_settings: agent_settings, + optional_tracer: anything, + ).and_return(profiler) end it do - expect(components.profiler) - .to receive(:start) + expect(profiler).to receive(:start) startup! end diff --git a/spec/datadog/core/configuration/settings_spec.rb b/spec/datadog/core/configuration/settings_spec.rb index e911bfe1a0a..ba76eafa2d7 100644 --- a/spec/datadog/core/configuration/settings_spec.rb +++ b/spec/datadog/core/configuration/settings_spec.rb @@ -227,14 +227,6 @@ it { expect(settings.env).to eq(env) } end - context 'when given a symbol' do - let(:env) { :symbol } - - before { set_env } - - it { expect(settings.env).to eq('symbol') } - end - context 'when given `nil`' do let(:env) { nil } @@ -465,39 +457,116 @@ end end - describe '#allocation_counting_enabled' do - subject(:allocation_counting_enabled) { settings.profiling.advanced.allocation_counting_enabled } - - before { stub_const('RUBY_VERSION', testing_version) } + describe '#allocation_counting_enabled=' do + it 'logs a warning informing customers this no longer does anything' do + expect(Datadog.logger).to receive(:warn).with(/no longer does anything/) - context 'on Ruby 2.x' do - let(:testing_version) { '2.3.0 ' } - it { is_expected.to be true } + settings.profiling.advanced.allocation_counting_enabled = false end + end + + describe '#experimental_allocation_enabled' do + subject(:experimental_allocation_enabled) { settings.profiling.advanced.experimental_allocation_enabled } + + context 'when DD_PROFILING_EXPERIMENTAL_ALLOCATION_ENABLED' do + around do |example| + ClimateControl.modify('DD_PROFILING_EXPERIMENTAL_ALLOCATION_ENABLED' => environment) do + example.run + end + end + + context 'is not defined' do + let(:environment) { nil } - ['3.0.0', '3.1.0', '3.1.3', '3.2.0', '3.2.2'].each do |broken_ruby| - context "on a Ruby 3 version affected by https://bugs.ruby-lang.org/issues/18464 (#{broken_ruby})" do - let(:testing_version) { broken_ruby } it { is_expected.to be false } end + + [true, false].each do |value| + context "is defined as #{value}" do + let(:environment) { value.to_s } + + it { is_expected.to be value } + end + end end + end - ['3.1.4', '3.2.3', '3.3.0'].each do |fixed_ruby| - context "on a Ruby 3 version where https://bugs.ruby-lang.org/issues/18464 is fixed (#{fixed_ruby})" do - let(:testing_version) { fixed_ruby } - it { is_expected.to be true } + describe '#experimental_allocation_enabled=' do + it 'updates the #experimental_allocation_enabled setting' do + expect { settings.profiling.advanced.experimental_allocation_enabled = true } + .to change { settings.profiling.advanced.experimental_allocation_enabled } + .from(false) + .to(true) + end + end + + describe '#experimental_heap_enabled' do + subject(:experimental_heap_enabled) { settings.profiling.advanced.experimental_heap_enabled } + + context 'when DD_PROFILING_EXPERIMENTAL_HEAP_ENABLED' do + around do |example| + ClimateControl.modify('DD_PROFILING_EXPERIMENTAL_HEAP_ENABLED' => environment) do + example.run + end + end + + context 'is not defined' do + let(:environment) { nil } + + it { is_expected.to be false } + end + + [true, false].each do |value| + context "is defined as #{value}" do + let(:environment) { value.to_s } + + it { is_expected.to be value } + end end end end - describe '#allocation_counting_enabled=' do - it 'updates the #allocation_counting_enabled setting' do - settings.profiling.advanced.allocation_counting_enabled = true + describe '#experimental_heap_enabled=' do + it 'updates the #experimental_heap_enabled setting' do + expect { settings.profiling.advanced.experimental_heap_enabled = true } + .to change { settings.profiling.advanced.experimental_heap_enabled } + .from(false) + .to(true) + end + end - expect { settings.profiling.advanced.allocation_counting_enabled = false } - .to change { settings.profiling.advanced.allocation_counting_enabled } - .from(true) - .to(false) + describe '#experimental_allocation_sample_rate' do + subject(:experimental_allocation_sample_rate) { settings.profiling.advanced.experimental_allocation_sample_rate } + + context 'when DD_PROFILING_EXPERIMENTAL_ALLOCATION_SAMPLE_RATE' do + around do |example| + ClimateControl.modify('DD_PROFILING_EXPERIMENTAL_ALLOCATION_SAMPLE_RATE' => environment) do + example.run + end + end + + context 'is not defined' do + let(:environment) { nil } + + it { is_expected.to be 50 } + end + + [100, 30.5].each do |value| + context "is defined as #{value}" do + let(:environment) { value.to_s } + + it { is_expected.to be value.to_i } + end + end + end + end + + describe '#experimental_allocation_sample_rate=' do + it 'updates the #experimental_allocation_sample_rate setting' do + expect { settings.profiling.advanced.experimental_allocation_sample_rate = 100 } + .to change { settings.profiling.advanced.experimental_allocation_sample_rate } + .from(50) + .to(100) end end @@ -839,14 +908,6 @@ it { expect(settings.service).to eq(service) } end - context 'when given a symbol' do - let(:service) { :symbol } - - before { set_service } - - it { expect(settings.service).to eq('symbol') } - end - context 'when given `nil`' do let(:service) { nil } @@ -1270,6 +1331,99 @@ .to change { settings.telemetry.heartbeat_interval_seconds }.from(1.1).to(2.2) end end + + describe '#install_id' do + subject(:install_id) { settings.telemetry.install_id } + let(:env_var_name) { 'DD_INSTRUMENTATION_INSTALL_ID' } + + context 'when DD_INSTRUMENTATION_INSTALL_ID' do + context 'is not defined' do + let(:env_var_value) { nil } + + it { is_expected.to eq nil } + end + + context 'is defined' do + let(:env_var_value) { '68e75c48-57ca-4a12-adfc-575c4b05fcbe' } + + it { is_expected.to eq '68e75c48-57ca-4a12-adfc-575c4b05fcbe' } + end + end + end + + describe '#install_id=' do + let(:env_var_name) { 'DD_INSTRUMENTATION_INSTALL_ID' } + let(:env_var_value) { '68e75c48-57ca-4a12-adfc-575c4b05fcbe' } + + it 'updates the #install_id setting' do + expect { settings.telemetry.install_id = 'abc123' } + .to change { settings.telemetry.install_id } + .from('68e75c48-57ca-4a12-adfc-575c4b05fcbe') + .to('abc123') + end + end + + describe '#install_type' do + subject(:install_id) { settings.telemetry.install_type } + let(:env_var_name) { 'DD_INSTRUMENTATION_INSTALL_TYPE' } + + context 'when DD_INSTRUMENTATION_INSTALL_TYPE' do + context 'is not defined' do + let(:env_var_value) { nil } + + it { is_expected.to eq nil } + end + + context 'is defined' do + let(:env_var_value) { 'k8s_single_step' } + + it { is_expected.to eq 'k8s_single_step' } + end + end + end + + describe '#install_type=' do + let(:env_var_name) { 'DD_INSTRUMENTATION_INSTALL_TYPE' } + let(:env_var_value) { 'k8s_single_step' } + + it 'updates the #install_type setting' do + expect { settings.telemetry.install_type = 'abc123' } + .to change { settings.telemetry.install_type } + .from('k8s_single_step') + .to('abc123') + end + end + + describe '#install_time' do + subject(:install_id) { settings.telemetry.install_time } + let(:env_var_name) { 'DD_INSTRUMENTATION_INSTALL_TIME' } + + context 'when DD_INSTRUMENTATION_INSTALL_TIME' do + context 'is not defined' do + let(:env_var_value) { nil } + + it { is_expected.to eq nil } + end + + context 'is defined' do + let(:env_var_value) { '1703188212' } + + it { is_expected.to eq '1703188212' } + end + end + end + + describe '#install_time=' do + let(:env_var_name) { 'DD_INSTRUMENTATION_INSTALL_TIME' } + let(:env_var_value) { '1703188212' } + + it 'updates the #install_time setting' do + expect { settings.telemetry.install_time = 'abc123' } + .to change { settings.telemetry.install_time } + .from('1703188212') + .to('abc123') + end + end end describe '#remote' do diff --git a/spec/datadog/core/configuration_spec.rb b/spec/datadog/core/configuration_spec.rb index 48252d7af26..c396297f798 100644 --- a/spec/datadog/core/configuration_spec.rb +++ b/spec/datadog/core/configuration_spec.rb @@ -316,30 +316,6 @@ end end - context 'when the profiler' do - context 'is not changed' do - before { skip_if_profiling_not_supported(self) } - - context 'and profiling is enabled' do - before do - allow(test_class.configuration.profiling) - .to receive(:enabled) - .and_return(true) - - allow_any_instance_of(Datadog::Profiling::Profiler) - .to receive(:start) - allow_any_instance_of(Datadog::Profiling::Tasks::Setup) - .to receive(:run) - end - - it 'starts the profiler' do - configure - expect(test_class.send(:components).profiler).to have_received(:start) - end - end - end - end - context 'when reconfigured multiple times' do context 'with runtime metrics active' do before do diff --git a/spec/datadog/core/environment/execution_spec.rb b/spec/datadog/core/environment/execution_spec.rb index 76c56be2bbb..0519aa10c68 100644 --- a/spec/datadog/core/environment/execution_spec.rb +++ b/spec/datadog/core/environment/execution_spec.rb @@ -3,6 +3,7 @@ require 'spec_helper' require 'datadog/core/environment/execution' +require 'open3' RSpec.describe Datadog::Core::Environment::Execution do around do |example| diff --git a/spec/datadog/core/telemetry/collector_spec.rb b/spec/datadog/core/telemetry/collector_spec.rb index 130bce55180..df5c488ce3c 100644 --- a/spec/datadog/core/telemetry/collector_spec.rb +++ b/spec/datadog/core/telemetry/collector_spec.rb @@ -18,6 +18,18 @@ RSpec.describe Datadog::Core::Telemetry::Collector do let(:dummy_class) { Class.new { extend(Datadog::Core::Telemetry::Collector) } } + before do + # We don't care about details of profiling initialization (which requires + # interacting with native extension) in this suite. This initialization is + # tested in other suites. Thus, mock it to nil throughout. + # NOTE: We could have used a double but that leads to messy configuration + # lifecycle as we'd need to do a full reconfiguration in an `after` block + # (which would require extra allow/expect for unrelated things). The global + # reset with `around` happens already outside of a test context where it is + # forbidden to interact with doubles (and thus we can't call shutdown! on it) + allow(Datadog::Profiling::Component).to receive(:build_profiler_component).and_return(nil) + end + describe '#application' do subject(:application) { dummy_class.application } let(:env_service) { 'default-service' } @@ -98,7 +110,6 @@ require 'datadog/appsec' before do - allow_any_instance_of(Datadog::Profiling::Profiler).to receive(:start) if PlatformHelpers.mri? Datadog.configure do |c| c.profiling.enabled = true c.appsec.enabled = true @@ -262,7 +273,6 @@ context 'when profiling is enabled' do before do stub_const('Datadog::Core::Environment::Ext::TRACER_VERSION', '4.2') - allow_any_instance_of(Datadog::Profiling::Profiler).to receive(:start) Datadog.configure do |c| c.profiling.enabled = true end @@ -286,6 +296,38 @@ it { is_expected.to include('appsec.enabled' => true) } end + context 'when ci is not loaded' do + it { is_expected.not_to include('ci.enabled') } + end + + context 'when ci is enabled' do + around do |example| + Datadog.configuration.define_singleton_method(:ci) do + OpenStruct.new(enabled: true) + end + example.run + class << Datadog.configuration + remove_method(:ci) + end + end + + it { is_expected.to include('ci.enabled' => true) } + end + + context 'when ci is not enabled' do + around do |example| + Datadog.configuration.define_singleton_method(:ci) do + OpenStruct.new(enabled: false) + end + example.run + class << Datadog.configuration + remove_method(:ci) + end + end + + it { is_expected.to include('ci.enabled' => false) } + end + context 'when OpenTelemetry is enabled' do before do stub_const('Datadog::OpenTelemetry::LOADED', true) @@ -316,6 +358,77 @@ it { is_expected.to be_a_kind_of(Datadog::Core::Telemetry::V1::Host) } end + describe '#install_signature' do + subject(:install_signature) { dummy_class.install_signature } + + it { is_expected.to be_a_kind_of(Datadog::Core::Telemetry::V1::InstallSignature) } + + describe ':install_id' do + subject(:install_id) { install_signature.install_id } + + context 'when DD_INSTRUMENTATION_INSTALL_ID not set' do + it('is nil when unset') { is_expected.to be_nil } + end + + context 'when DD_INSTRUMENTATION_INSTALL_ID set' do + let(:install_id) { '68e75c48-57ca-4a12-adfc-575c4b05fcbe' } + + before do + Datadog.configure do |c| + c.telemetry.install_id = install_id + end + end + after do + Datadog.configuration.reset! + end + + it { is_expected.to eql(install_id) } + end + end + + describe ':install_type' do + subject(:install_type) { install_signature.install_type } + + context 'when DD_INSTRUMENTATION_INSTALL_TYPE not set' do + it('is nil when unset') { is_expected.to be_nil } + end + + context 'when DD_INSTRUMENTATION_INSTALL_TYPE set' do + before do + Datadog.configure do |c| + c.telemetry.install_type = install_type + end + end + after do + Datadog.configuration.reset! + end + + it { is_expected.to eql(install_type) } + end + end + + describe ':install_time' do + subject(:install_time) { install_signature.install_time } + + context 'when DD_INSTRUMENTATION_INSTALL_TIME not set' do + it('is nil when unset') { is_expected.to be_nil } + end + + context 'when DD_INSTRUMENTATION_INSTALL_TIME set' do + before do + Datadog.configure do |c| + c.telemetry.install_time = install_time + end + end + after do + Datadog.configuration.reset! + end + + it { is_expected.to eql(install_time) } + end + end + end + describe '#integrations' do subject(:integrations) { dummy_class.integrations } diff --git a/spec/datadog/core/telemetry/v1/app_event_spec.rb b/spec/datadog/core/telemetry/v1/app_event_spec.rb index a6301bd99c7..87730f05f76 100644 --- a/spec/datadog/core/telemetry/v1/app_event_spec.rb +++ b/spec/datadog/core/telemetry/v1/app_event_spec.rb @@ -10,6 +10,7 @@ additional_payload: additional_payload, configuration: configuration, dependencies: dependencies, + install_signature: install_signature, integrations: integrations, ) end @@ -17,6 +18,13 @@ let(:additional_payload) { [{ name: 'logger.level', value: 1 }] } let(:configuration) { [{ name: 'DD_TRACE_DEBUG', value: false }] } let(:dependencies) { [Datadog::Core::Telemetry::V1::Dependency.new(name: 'pg')] } + let(:install_signature) do + Datadog::Core::Telemetry::V1::InstallSignature.new( + install_id: '123', + install_type: 'docker', + install_time: '1703188212' + ) + end let(:integrations) { [Datadog::Core::Telemetry::V1::Integration.new(name: 'pg', enabled: true)] } it do @@ -24,6 +32,7 @@ additional_payload: additional_payload, configuration: configuration, dependencies: dependencies, + install_signature: install_signature, integrations: integrations, ) end @@ -98,6 +107,24 @@ end end + context 'when :install_signature' do + context 'is nil' do + let(:install_signature) { nil } + it { is_expected.to be_a_kind_of(described_class) } + end + + context 'is InstallSignature' do + let(:integrations) do + Datadog::Core::Telemetry::V1::InstallSignature.new( + install_id: '123', + install_type: 'docker', + install_time: '1703188212' + ) + end + it { is_expected.to be_a_kind_of(described_class) } + end + end + context 'when :integrations' do context 'is nil' do let(:integrations) { nil } @@ -129,6 +156,7 @@ let(:additional_payload) { nil } let(:configuration) { nil } let(:dependencies) { nil } + let(:install_signature) { nil } let(:integrations) { nil } it do @@ -140,6 +168,7 @@ let(:additional_payload) { nil } let(:configuration) { nil } let(:dependencies) { nil } + let(:install_signature) { nil } let(:integrations) { [Datadog::Core::Telemetry::V1::Integration.new(name: 'pg', enabled: true)] } it do @@ -153,6 +182,13 @@ let(:additional_payload) { { 'tracing.enabled' => true, 'profiling.enabled' => false } } let(:configuration) { { DD_AGENT_HOST: 'localhost', DD_TRACE_SAMPLE_RATE: '1' } } let(:dependencies) { [Datadog::Core::Telemetry::V1::Dependency.new(name: 'pg')] } + let(:install_signature) do + Datadog::Core::Telemetry::V1::InstallSignature.new( + install_id: '123', + install_type: 'docker', + install_time: '1703188212' + ) + end let(:integrations) { [Datadog::Core::Telemetry::V1::Integration.new(name: 'pg', enabled: true)] } it do @@ -162,6 +198,7 @@ configuration: [{ name: 'DD_AGENT_HOST', value: 'localhost' }, { name: 'DD_TRACE_SAMPLE_RATE', value: '1' }], dependencies: [{ name: 'pg' }], + install_signature: { install_id: '123', install_type: 'docker', install_time: '1703188212' }, integrations: [{ enabled: true, name: 'pg' }] ) end diff --git a/spec/datadog/core/telemetry/v1/install_signature.spec.rb b/spec/datadog/core/telemetry/v1/install_signature.spec.rb new file mode 100644 index 00000000000..ac244b21f3a --- /dev/null +++ b/spec/datadog/core/telemetry/v1/install_signature.spec.rb @@ -0,0 +1,72 @@ +require 'spec_helper' + +require 'datadog/core/telemetry/v1/product' + +RSpec.describe Datadog::Core::Telemetry::V1::InstallSignature do + subject(:install_signature) do + described_class.new(install_id: install_id, install_type: install_type, install_time: install_time) + end + + let(:install_id) { '68e75c48-57ca-4a12-adfc-575c4b05fcbe' } + let(:install_type) { 'k8s_single_step' } + let(:install_time) { '1703188212' } + + it { is_expected.to have_attributes(install_id: install_id, install_type: install_type, install_time: install_time) } + + describe '#initialize' do + context 'when :install_id' do + context 'is nil' do + let(:install_id) { nil } + it { is_expected.to have_attributes(install_id: nil, install_type: install_type, install_time: install_time) } + it { is_expected.to be_a_kind_of(described_class) } + end + + context 'is valid' do + let(:install_id) { '68e75c48-57ca-4a12-adfc-575c4b05fcbe' } + it { is_expected.to be_a_kind_of(described_class) } + end + end + + context 'when :install_type' do + context 'is nil' do + let(:install_type) { nil } + it { is_expected.to have_attributes(install_id: install_id, install_type: nil, install_time: install_time) } + it { is_expected.to be_a_kind_of(described_class) } + end + + context 'is valid' do + let(:install_type) { 'k8s_single_step' } + it { is_expected.to be_a_kind_of(described_class) } + end + end + + context 'when :install_time' do + context 'is nil' do + let(:install_time) { nil } + it { is_expected.to have_attributes(install_id: install_id, install_type: install_type, install_time: nil) } + it { is_expected.to be_a_kind_of(described_class) } + end + + context 'is valid' do + let(:install_time) { '1703188212' } + it { is_expected.to be_a_kind_of(described_class) } + end + end + end + + describe '#to_h' do + subject(:to_h) { install_signature.to_h } + + let(:install_id) { '68e75c48-57ca-4a12-adfc-575c4b05fcbe' } + let(:install_type) { 'k8s_single_step' } + let(:install_time) { '1703188212' } + + it do + is_expected.to eq( + install_id: install_id, + install_type: install_type, + install_time: install_time + ) + end + end +end diff --git a/spec/datadog/core/utils/compression_spec.rb b/spec/datadog/core/utils/compression_spec.rb deleted file mode 100644 index fb111ddecc3..00000000000 --- a/spec/datadog/core/utils/compression_spec.rb +++ /dev/null @@ -1,29 +0,0 @@ -require 'securerandom' -require 'datadog/core/utils/compression' - -RSpec.describe Datadog::Core::Utils::Compression do - describe '::gzip' do - subject(:gzip) { described_class.gzip(unzipped) } - - let(:unzipped) { SecureRandom.uuid } - - it { is_expected.to be_a_kind_of(String) } - - context 'when result is unzipped' do - subject(:gunzip) { described_class.gunzip(gzip) } - - it { is_expected.to eq(unzipped) } - end - end - - describe '::gunzip' do - subject(:gunzip) { described_class.gunzip(zipped) } - - context 'given a zipped string' do - let(:zipped) { described_class.gzip(unzipped) } - let(:unzipped) { SecureRandom.uuid } - - it { is_expected.to eq(unzipped) } - end - end -end diff --git a/spec/datadog/profiling/collectors/cpu_and_wall_time_worker_spec.rb b/spec/datadog/profiling/collectors/cpu_and_wall_time_worker_spec.rb index 43c63adfc24..2abc7ecd837 100644 --- a/spec/datadog/profiling/collectors/cpu_and_wall_time_worker_spec.rb +++ b/spec/datadog/profiling/collectors/cpu_and_wall_time_worker_spec.rb @@ -7,20 +7,26 @@ # drops support for these Rubies globally let(:described_class) { Datadog::Profiling::Collectors::CpuAndWallTimeWorker } - let(:recorder) { build_stack_recorder } let(:endpoint_collection_enabled) { true } let(:gc_profiling_enabled) { true } - let(:allocation_counting_enabled) { true } + let(:allocation_sample_every) { 50 } + let(:allocation_profiling_enabled) { false } + let(:heap_profiling_enabled) { false } + let(:recorder) do + build_stack_recorder(heap_samples_enabled: heap_profiling_enabled, heap_size_enabled: heap_profiling_enabled) + end let(:no_signals_workaround_enabled) { false } let(:timeline_enabled) { false } let(:options) { {} } let(:worker_settings) do { gc_profiling_enabled: gc_profiling_enabled, - allocation_counting_enabled: allocation_counting_enabled, no_signals_workaround_enabled: no_signals_workaround_enabled, thread_context_collector: build_thread_context_collector(recorder), dynamic_sampling_rate_overhead_target_percentage: 2.0, + allocation_sample_every: allocation_sample_every, + allocation_profiling_enabled: allocation_profiling_enabled, + **options } end @@ -57,6 +63,8 @@ end describe '#start' do + let(:expected_worker_initialization_error) { nil } + subject(:start) do cpu_and_wall_time_worker.start wait_until_running @@ -250,28 +258,28 @@ described_class::Testing._native_trigger_sample - invoke_gc_times = 5 - - invoke_gc_times.times do + 5.times do Thread.pass GC.start + Thread.pass end cpu_and_wall_time_worker.stop all_samples = samples_from_pprof(recorder.serialize!) - current_thread_gc_samples = - samples_for_thread(all_samples, Thread.current) - .select { |it| it.locations.first.path == 'Garbage Collection' } + gc_sample = all_samples.find { |sample| sample.labels[:'gc cause'] == 'GC.start()' } - # NOTE: In some cases, Ruby may actually call two GC's back-to-back without us having the possibility to take - # a sample. I don't expect this to happen for this test (that's what the `Thread.pass` above is trying to avoid) - # but if this spec turns out to be flaky, that is probably the issue, and that would mean we'd need to relax the - # check. - expect( - current_thread_gc_samples.inject(0) { |sum, sample| sum + sample.values.fetch(:'cpu-samples') } - ).to be >= invoke_gc_times + expect(gc_sample.labels).to match a_hash_including( + :state => 'had cpu', + :'thread id' => 'GC', + :'thread name' => 'Garbage Collection', + :event => 'gc', + :'gc reason' => an_instance_of(String), + :'gc cause' => 'GC.start()', + :'gc type' => 'major', + ) + expect(gc_sample.locations.first.path).to eq 'Garbage Collection' end context 'when the background thread dies without cleaning up (after Ruby forks)' do @@ -442,25 +450,22 @@ end end - context 'when allocation sampling is enabled' do - let(:options) { { allocation_sample_every: 1 } } + context 'when allocation profiling is enabled' do + let(:allocation_profiling_enabled) { true } + let(:test_num_allocated_object) { 123 } + # Sample all allocations to get easy-to-reason about numbers that are also not flaky in CI. + let(:allocation_sample_every) { 1 } before do allow(Datadog.logger).to receive(:warn) end - it 'logs a warning message mentioning this is experimental' do - expect(Datadog.logger).to receive(:warn).with(/Enabled experimental allocation profiling/) - - start - end - it 'records allocated objects' do stub_const('CpuAndWallTimeWorkerSpec::TestStruct', Struct.new(:foo)) start - 123.times { CpuAndWallTimeWorkerSpec::TestStruct.new } + test_num_allocated_object.times { CpuAndWallTimeWorkerSpec::TestStruct.new } allocation_line = __LINE__ - 1 cpu_and_wall_time_worker.stop @@ -469,7 +474,7 @@ samples_for_thread(samples_from_pprof(recorder.serialize!), Thread.current) .find { |s| s.labels[:'allocation class'] == 'CpuAndWallTimeWorkerSpec::TestStruct' } - expect(allocation_sample.values).to include(:'alloc-samples' => 123) + expect(allocation_sample.values).to include(:'alloc-samples' => test_num_allocated_object) expect(allocation_sample.locations.first.lineno).to eq allocation_line end @@ -540,7 +545,7 @@ end context 'when allocation sampling is disabled' do - let(:options) { { allocation_sample_every: 0 } } + let(:allocation_profiling_enabled) { false } it 'does not record allocations' do stub_const('CpuAndWallTimeWorkerSpec::TestStruct', Struct.new(:foo)) @@ -555,6 +560,63 @@ end end + context 'when heap profiling is enabled' do + let(:allocation_profiling_enabled) { true } + let(:heap_profiling_enabled) { true } + let(:test_num_allocated_object) { 123 } + # Sample all allocations to get easy-to-reason about numbers that are also not flaky in CI. + let(:allocation_sample_every) { 1 } + + before do + allow(Datadog.logger).to receive(:warn) + end + + it 'records live heap objects' do + stub_const('CpuAndWallTimeWorkerSpec::TestStruct', Struct.new(:foo)) + + start + + live_objects = Array.new(test_num_allocated_object) + + test_num_allocated_object.times { |i| live_objects[i] = CpuAndWallTimeWorkerSpec::TestStruct.new } + allocation_line = __LINE__ - 1 + + cpu_and_wall_time_worker.stop + + test_struct_heap_sample = lambda { |sample| + first_frame = sample.locations.first + first_frame.lineno == allocation_line && + first_frame.path == __FILE__ && + first_frame.base_label == 'new' && + sample.labels[:'allocation class'] == 'CpuAndWallTimeWorkerSpec::TestStruct' && + (sample.values[:'heap-live-samples'] || 0) > 0 + } + + relevant_sample = samples_from_pprof(recorder.serialize!) + .find(&test_struct_heap_sample) + + expect(relevant_sample.values[:'heap-live-samples']).to eq test_num_allocated_object + # 40 is the size of a basic object and we have test_num_allocated_object of them + expect(relevant_sample.values[:'heap-live-size']).to eq test_num_allocated_object * 40 + end + end + + context 'when heap profiling is disabled' do + let(:heap_profiling_enabled) { false } + + it 'does not record heap samples' do + stub_const('CpuAndWallTimeWorkerSpec::TestStruct', Struct.new(:foo)) + + start + + 123.times { CpuAndWallTimeWorkerSpec::TestStruct.new } + + cpu_and_wall_time_worker.stop + + expect(samples_from_pprof(recorder.serialize!).select { |s| s.values.key?(:'heap-live-samples') }).to be_empty + end + end + context 'Process::Waiter crash regression tests' do # On Ruby 2.3 to 2.6, there's a crash when accessing instance variables of the `process_waiter_thread`, # see https://bugs.ruby-lang.org/issues/17807 . @@ -627,13 +689,13 @@ end end - context 'when called from a background ractor' do + context 'when called from a background ractor', :ractors => true do # Even though we're not testing it explicitly, the GC profiling hooks can sometimes be called when running these # specs. Unfortunately, there's a VM crash in that case as well -- https://bugs.ruby-lang.org/issues/18464 -- # so this must be disabled when interacting with Ractors. let(:gc_profiling_enabled) { false } # ...same thing for the tracepoint for allocation counting/profiling :( - let(:allocation_counting_enabled) { false } + let(:allocation_profiling_enabled) { false } describe 'handle_sampling_signal' do include_examples 'does not trigger a sample', @@ -815,51 +877,68 @@ cpu_and_wall_time_worker.stop end - it 'returns the number of allocations between two calls of the method' do - # To get the exact expected number of allocations, we run this once before so that Ruby can create and cache all - # it needs to - new_object = proc { Object.new } - 1.times(&new_object) + context 'when allocation profiling is enabled' do + let(:allocation_profiling_enabled) { true } - before_allocations = described_class._native_allocation_count - 100.times(&new_object) - after_allocations = described_class._native_allocation_count + it 'always returns a >= 0 value' do + expect(described_class._native_allocation_count).to be >= 0 + end - expect(after_allocations - before_allocations).to be 100 - end + it 'returns the number of allocations between two calls of the method' do + # To get the exact expected number of allocations, we run this once before so that Ruby can create and cache all + # it needs to + new_object = proc { Object.new } + 1.times(&new_object) - it 'returns different numbers of allocations for different threads' do - # To get the exact expected number of allocations, we run this once before so that Ruby can create and cache all - # it needs to - new_object = proc { Object.new } - 1.times(&new_object) + before_allocations = described_class._native_allocation_count + 100.times(&new_object) + after_allocations = described_class._native_allocation_count - t1_can_run = Queue.new - t1_has_run = Queue.new - before_t1 = nil - after_t1 = nil + expect(after_allocations - before_allocations).to be 100 + end - background_t1 = Thread.new do - before_t1 = described_class._native_allocation_count - t1_can_run.pop + it 'returns different numbers of allocations for different threads' do + # To get the exact expected number of allocations, we run this once before so that Ruby can create and cache all + # it needs to + new_object = proc { Object.new } + 1.times(&new_object) - 100.times(&new_object) - after_t1 = described_class._native_allocation_count - t1_has_run << true - end + t1_can_run = Queue.new + t1_has_run = Queue.new + before_t1 = nil + after_t1 = nil + + background_t1 = Thread.new do + before_t1 = described_class._native_allocation_count + t1_can_run.pop - before_allocations = described_class._native_allocation_count - t1_can_run << true - t1_has_run.pop - after_allocations = described_class._native_allocation_count + 100.times(&new_object) + after_t1 = described_class._native_allocation_count + t1_has_run << true + end + + before_allocations = described_class._native_allocation_count + t1_can_run << true + t1_has_run.pop + after_allocations = described_class._native_allocation_count - background_t1.join + background_t1.join - # This test checks that even though we observed 100 allocations in a background thread t1, the counters for - # the current thread were not affected by this change + # This test checks that even though we observed 100 allocations in a background thread t1, the counters for + # the current thread were not affected by this change - expect(after_t1 - before_t1).to be 100 - expect(after_allocations - before_allocations).to be < 10 + expect(after_t1 - before_t1).to be 100 + expect(after_allocations - before_allocations).to be < 10 + end + end + + context 'when allocation profiling is disabled' do + let(:allocation_profiling_enabled) { false } + it 'always returns a nil value' do + 100.times { Object.new } + + expect(described_class._native_allocation_count).to be nil + end end end end diff --git a/spec/datadog/profiling/collectors/stack_spec.rb b/spec/datadog/profiling/collectors/stack_spec.rb index aee41a3f3f5..38c851cbe0d 100644 --- a/spec/datadog/profiling/collectors/stack_spec.rb +++ b/spec/datadog/profiling/collectors/stack_spec.rb @@ -60,14 +60,8 @@ def sample(thread, recorder_instance, metric_values_hash, labels_array, max_fram context 'when marking sample as being in garbage collection' do let(:in_gc) { true } - it 'includes a placeholder frame for garbage collection' do - expect(stacks.fetch(:gathered)[0]).to have_attributes(base_label: '', path: 'Garbage Collection', lineno: 0) - end - - it 'matches the Ruby backtrace API' do - # We skip 4 frames here -- the garbage collection placeholder, as well as the 3 top stacks that differ from the - # reference stack (see the `let(:gathered_stack)` above for details) - expect(stacks.fetch(:gathered)[4..-1]).to eq reference_stack + it 'gathers a one-element stack with a "Garbage Collection" placeholder' do + expect(stacks.fetch(:gathered)).to contain_exactly(have_attributes(base_label: '', path: 'Garbage Collection', lineno: 0)) end end end @@ -491,38 +485,6 @@ def call_sleep expect(gathered_stack).to eq reference_stack end end - - context 'when marking sample as being in garbage collection' do - let(:in_gc) { true } - - it 'gathers exactly max_frames frames' do - expect(gathered_stack.size).to be max_frames - end - - it 'matches the Ruby backtrace API, up to max_frames - 2' do - garbage_collection = 1 - expect(gathered_stack[(0 + garbage_collection)...(max_frames - 1)]).to eq reference_stack[0...(max_frames - 1 - garbage_collection)] - end - - it 'includes two placeholder frames: one for garbage collection and another for including the number of skipped frames' do - garbage_collection = 1 - placeholder = 1 - omitted_frames = target_stack_depth - max_frames + placeholder + garbage_collection - - expect(omitted_frames).to be 97 - expect(gathered_stack.last).to have_attributes(base_label: '', path: '97 frames omitted', lineno: 0) - expect(gathered_stack.first).to have_attributes(base_label: '', path: 'Garbage Collection', lineno: 0) - end - - context 'when stack is exactly one item less as deep as the configured max_frames' do - let(:target_stack_depth) { 4 } - - it 'includes a placeholder frame for garbage collection and matches the Ruby backtrace API' do - garbage_collection = 1 - expect(gathered_stack[(0 + garbage_collection)..-1]).to eq reference_stack - end - end - end end context 'when sampling a dead thread' do @@ -600,11 +562,8 @@ def call_sleep context 'when marking sample as being in garbage collection' do let(:in_gc) { true } - it 'gathers a two-element stack with a placeholder for "In native code" and another for garbage collection' do - expect(gathered_stack).to contain_exactly( - have_attributes(base_label: '', path: 'Garbage Collection', lineno: 0), - have_attributes(base_label: '', path: 'In native code', lineno: 0), - ) + it 'gathers a one-element stack with a "Garbage Collection" placeholder' do + expect(stacks.fetch(:gathered)).to contain_exactly(have_attributes(base_label: '', path: 'Garbage Collection', lineno: 0)) end end end diff --git a/spec/datadog/profiling/collectors/thread_context_spec.rb b/spec/datadog/profiling/collectors/thread_context_spec.rb index 88e32c6a089..6ebfd62cea1 100644 --- a/spec/datadog/profiling/collectors/thread_context_spec.rb +++ b/spec/datadog/profiling/collectors/thread_context_spec.rb @@ -9,7 +9,7 @@ expect(Thread.list).to include(Thread.main, t1, t2, t3) end - let(:recorder) { build_stack_recorder } + let(:recorder) { build_stack_recorder(timeline_enabled: timeline_enabled) } let(:ready_queue) { Queue.new } let(:t1) do Thread.new(ready_queue) do |ready_queue| @@ -91,6 +91,10 @@ def stats described_class::Testing._native_stats(cpu_and_wall_time_collector) end + def gc_tracking + described_class::Testing._native_gc_tracking(cpu_and_wall_time_collector) + end + # This method exists only so we can look for its name in the stack trace in a few tests def inside_t1 yield @@ -183,50 +187,25 @@ def another_way_of_calling_sample(profiler_overhead_stack_thread: Thread.current expect(t1_samples.map(&:values).map { |it| it.fetch(:'cpu-samples') }.reduce(:+)).to eq 5 end - [:before, :after].each do |on_gc_finish_order| - context "when a thread is marked as being in garbage collection, #{on_gc_finish_order} on_gc_finish" do - # Until sample_after_gc gets called, the state left over by both on_gc_start and on_gc_finish "blocks" time - # from being assigned to further samples. Note this is expected to be very rare in practice, otherwise we would - # probably want to look into skipping these samples entirely. - it 'records the wall-time between a previous sample and the start of garbage collection, and no further time' do - sample - wall_time_at_first_sample = per_thread_context.fetch(Thread.current).fetch(:wall_time_at_previous_sample_ns) - - on_gc_start - on_gc_finish if on_gc_finish_order == :after - - wall_time_at_gc_start = per_thread_context.fetch(Thread.current).fetch(:'gc_tracking.wall_time_at_start_ns') - - # Even though we keep calling sample, the result only includes the time until we called on_gc_start - 5.times { another_way_of_calling_sample } - - total_wall_for_rspec_thread = - samples_for_thread(samples, Thread.current) - .select { |it| it.locations.find { |frame| frame.base_label == 'another_way_of_calling_sample' } } - .map { |it| it.values.fetch(:'wall-time') } - .reduce(:+) - - expect(total_wall_for_rspec_thread).to be(wall_time_at_gc_start - wall_time_at_first_sample) - end + context 'when a thread is marked as being in garbage collection by on_gc_start' do + # @ivoanjo: This spec exists because for cpu-time the behavior is not this one (e.g. we don't keep recording + # cpu-time), and I wanted to validate that the different behavior does not get applied to wall-time. + it 'keeps recording the wall-time after every sample' do + sample + wall_time_at_first_sample = per_thread_context.fetch(Thread.current).fetch(:wall_time_at_previous_sample_ns) - # The whole point of wall_time_at_previous_sample_ns is to track the past point in time that we use as start of - # the time range for a sample. - # BUT, we can't let it advance during GC as it should only get accounted for when GC finishes. - it 'does not advance wall_time_at_previous_sample_ns for the thread beyond gc_tracking.wall_time_at_start_ns' do - sample + on_gc_start - on_gc_start - on_gc_finish if on_gc_finish_order == :after + 5.times { sample } - wall_time_at_gc_start = per_thread_context.fetch(Thread.current).fetch(:'gc_tracking.wall_time_at_start_ns') + time_after = Datadog::Core::Utils::Time.get_time(:nanosecond) - 5.times { sample } + sample - wall_time_at_previous_sample_ns = - per_thread_context.fetch(Thread.current).fetch(:wall_time_at_previous_sample_ns) + wall_time_at_last_sample = per_thread_context.fetch(Thread.current).fetch(:wall_time_at_previous_sample_ns) - expect(wall_time_at_previous_sample_ns).to be wall_time_at_gc_start - end + expect(wall_time_at_last_sample).to be >= wall_time_at_first_sample + expect(wall_time_at_last_sample).to be >= time_after end end @@ -267,47 +246,61 @@ def another_way_of_calling_sample(profiler_overhead_stack_thread: Thread.current expect(total_cpu_for_rspec_thread).to be_between(1, rspec_thread_spent_time) end - [:before, :after].each do |on_gc_finish_order| - context "when a thread is marked as being in garbage collection, #{on_gc_finish_order} on_gc_finish" do - it 'records the cpu-time between a previous sample and the start of garbage collection, and no further time' do - sample - cpu_time_at_first_sample = per_thread_context.fetch(Thread.current).fetch(:cpu_time_at_previous_sample_ns) + context 'when a thread is marked as being in garbage collection by on_gc_start' do + it 'records the cpu-time between a previous sample and the start of garbage collection, and no further time' do + sample + cpu_time_at_first_sample = per_thread_context.fetch(Thread.current).fetch(:cpu_time_at_previous_sample_ns) - on_gc_start - on_gc_finish if on_gc_finish_order == :after + on_gc_start - cpu_time_at_gc_start = per_thread_context.fetch(Thread.current).fetch(:'gc_tracking.cpu_time_at_start_ns') + cpu_time_at_gc_start = per_thread_context.fetch(Thread.current).fetch(:'gc_tracking.cpu_time_at_start_ns') - # Even though we keep calling sample, the result only includes the time until we called on_gc_start - 5.times { another_way_of_calling_sample } + # Even though we keep calling sample, the result only includes the time until we called on_gc_start + 5.times { another_way_of_calling_sample } - total_cpu_for_rspec_thread = - samples_for_thread(samples, Thread.current) - .select { |it| it.locations.find { |frame| frame.base_label == 'another_way_of_calling_sample' } } - .map { |it| it.values.fetch(:'cpu-time') } - .reduce(:+) + total_cpu_for_rspec_thread = + samples_for_thread(samples, Thread.current) + .select { |it| it.locations.find { |frame| frame.base_label == 'another_way_of_calling_sample' } } + .map { |it| it.values.fetch(:'cpu-time') } + .reduce(:+) - expect(total_cpu_for_rspec_thread).to be(cpu_time_at_gc_start - cpu_time_at_first_sample) - end + expect(total_cpu_for_rspec_thread).to be(cpu_time_at_gc_start - cpu_time_at_first_sample) + end - # The whole point of cpu_time_at_previous_sample_ns is to track the past point in time that we use as start of - # the time range for a sample. - # BUT, we can't let it advance during GC as it should only get accounted for when GC finishes. - it 'does not advance cpu_time_at_previous_sample_ns for the thread beyond gc_tracking.cpu_time_at_start_ns' do - sample + # When a thread is marked as being in GC the cpu_time_at_previous_sample_ns is not allowed to advance until + # the GC finishes. + it 'does not advance cpu_time_at_previous_sample_ns for the thread beyond gc_tracking.cpu_time_at_start_ns' do + sample + + on_gc_start - on_gc_start - on_gc_finish if on_gc_finish_order == :after + cpu_time_at_gc_start = per_thread_context.fetch(Thread.current).fetch(:'gc_tracking.cpu_time_at_start_ns') - cpu_time_at_gc_start = per_thread_context.fetch(Thread.current).fetch(:'gc_tracking.cpu_time_at_start_ns') + 5.times { sample } - 5.times { sample } + cpu_time_at_previous_sample_ns = + per_thread_context.fetch(Thread.current).fetch(:cpu_time_at_previous_sample_ns) - cpu_time_at_previous_sample_ns = - per_thread_context.fetch(Thread.current).fetch(:cpu_time_at_previous_sample_ns) + expect(cpu_time_at_previous_sample_ns).to be cpu_time_at_gc_start + end + end - expect(cpu_time_at_previous_sample_ns).to be cpu_time_at_gc_start - end + context 'when a thread is unmarked as being in garbage collection by on_gc_finish' do + it 'lets cpu_time_at_previous_sample_ns advance again' do + sample + + on_gc_start + + cpu_time_at_gc_start = per_thread_context.fetch(Thread.current).fetch(:'gc_tracking.cpu_time_at_start_ns') + + on_gc_finish + + 5.times { sample } + + cpu_time_at_previous_sample_ns = + per_thread_context.fetch(Thread.current).fetch(:cpu_time_at_previous_sample_ns) + + expect(cpu_time_at_previous_sample_ns).to be > cpu_time_at_gc_start end end end @@ -653,26 +646,11 @@ def another_way_of_calling_sample(profiler_overhead_stack_thread: Thread.current it "records the cpu-time when garbage collection started in the caller thread's context" do on_gc_start - expect(per_thread_context.fetch(Thread.current)).to include(:'gc_tracking.cpu_time_at_start_ns' => be > 0) - end - end - end - - context 'when called again after on_gc_finish but before sample_after_gc' do - before do - on_gc_start - on_gc_finish - end + cpu_time_at_previous_sample_ns = per_thread_context.fetch(Thread.current).fetch(:cpu_time_at_previous_sample_ns) - it 'does not change the gc start times' do - start_times = proc do - cpu_time = per_thread_context.fetch(Thread.current).fetch(:'gc_tracking.cpu_time_at_start_ns') - wall_time = per_thread_context.fetch(Thread.current).fetch(:'gc_tracking.wall_time_at_start_ns') - - [cpu_time, wall_time] + expect(per_thread_context.fetch(Thread.current)) + .to include(:'gc_tracking.cpu_time_at_start_ns' => (be > cpu_time_at_previous_sample_ns)) end - - expect { on_gc_start }.to_not change(&start_times) end end end @@ -693,38 +671,54 @@ def another_way_of_calling_sample(profiler_overhead_stack_thread: Thread.current context 'when on_gc_start was not called before' do # See comment in the actual implementation on when/why this can happen - it 'does not change the gc finish times' do + it 'does not change the wall_time_at_previous_gc_ns' do on_gc_finish - expect(per_thread_context.fetch(Thread.current).fetch(:'gc_tracking.cpu_time_at_finish_ns')).to be invalid_time - expect(per_thread_context.fetch(Thread.current).fetch(:'gc_tracking.wall_time_at_finish_ns')).to be invalid_time + expect(gc_tracking.fetch(:wall_time_at_previous_gc_ns)).to be invalid_time end end context 'when on_gc_start was previously called' do before { on_gc_start } - it "records the wall-time when garbage collection finished in the caller thread's context" do + it 'records the wall-time when garbage collection finished in the gc_tracking' do wall_time_before_on_gc_finish_ns = Datadog::Core::Utils::Time.get_time(:nanosecond) on_gc_finish wall_time_after_on_gc_finish_ns = Datadog::Core::Utils::Time.get_time(:nanosecond) + expect(gc_tracking.fetch(:wall_time_at_previous_gc_ns)) + .to be_between(wall_time_before_on_gc_finish_ns, wall_time_after_on_gc_finish_ns) + end + + it 'resets the gc tracking fields back to invalid_time' do + on_gc_finish + expect(per_thread_context.fetch(Thread.current)).to include( - :'gc_tracking.wall_time_at_finish_ns' => - be_between(wall_time_before_on_gc_finish_ns, wall_time_after_on_gc_finish_ns) + :'gc_tracking.cpu_time_at_start_ns' => invalid_time, + :'gc_tracking.wall_time_at_start_ns' => invalid_time, ) end + it 'records the wall-time time spent between calls to on_gc_start and on_gc_finish' do + wall_time_at_start_ns = per_thread_context.fetch(Thread.current).fetch(:'gc_tracking.wall_time_at_start_ns') + + wall_time_before_on_gc_finish_ns = Datadog::Core::Utils::Time.get_time(:nanosecond) + on_gc_finish + + expect(gc_tracking.fetch(:accumulated_wall_time_ns)) + .to be >= (wall_time_before_on_gc_finish_ns - wall_time_at_start_ns) + end + context 'cpu-time behavior' do context 'when not on Linux' do before do skip 'The fallback behavior only applies when not on Linux' if PlatformHelpers.linux? end - it "records the cpu-time when garbage collection finished in the caller thread's context as zero" do + it 'records the accumulated_cpu_time_ns as zero' do on_gc_finish - expect(per_thread_context.fetch(Thread.current)).to include(:'gc_tracking.cpu_time_at_finish_ns' => 0) + expect(gc_tracking.fetch(:accumulated_cpu_time_ns)).to be 0 end end @@ -733,187 +727,152 @@ def another_way_of_calling_sample(profiler_overhead_stack_thread: Thread.current skip 'Test only runs on Linux' unless PlatformHelpers.linux? end - it "records the cpu-time when garbage collection finished in the caller thread's context" do + it 'records the cpu-time spent between calls to on_gc_start and on_gc_finish' do on_gc_finish - expect(per_thread_context.fetch(Thread.current)).to include(:'gc_tracking.cpu_time_at_finish_ns' => be > 0) + expect(gc_tracking.fetch(:accumulated_cpu_time_ns)).to be > 0 + end + + it 'advances the cpu_time_at_previous_sample_ns for the sampled thread by the time spent in GC' do + cpu_time_at_previous_sample_ns_before = + per_thread_context.fetch(Thread.current).fetch(:cpu_time_at_previous_sample_ns) + + on_gc_finish + + expect(per_thread_context.fetch(Thread.current)).to include( + cpu_time_at_previous_sample_ns: be > cpu_time_at_previous_sample_ns_before + ) end end end end context 'when going through multiple cycles of on_gc_start/on_gc_finish without sample_after_gc getting called' do - it 'keeps the cpu-time and wall-time at finish from the LAST on_gc_finish' do - context_tracking = [] + let(:context_tracking) { [] } + before do 5.times do on_gc_start on_gc_finish - context_tracking << per_thread_context.fetch(Thread.current) + context_tracking << gc_tracking end - - cpu_time_from_last_on_gc_finish = context_tracking.last.fetch(:'gc_tracking.cpu_time_at_finish_ns') - wall_time_from_last_on_gc_finish = context_tracking.last.fetch(:'gc_tracking.wall_time_at_finish_ns') - - expect(context_tracking.first) - .to include(:'gc_tracking.wall_time_at_finish_ns' => be < wall_time_from_last_on_gc_finish) - - # This always advances: all_but_last <= the last one - # (Needs the <= because unfortunately we may not get enough precision, otherwise it would be <) - all_but_last = context_tracking[0..-2] - expect( - all_but_last.map { |it| it.fetch(:'gc_tracking.cpu_time_at_finish_ns') } - ).to all be <= cpu_time_from_last_on_gc_finish - expect( - all_but_last.map { |it| it.fetch(:'gc_tracking.wall_time_at_finish_ns') } - ).to all be <= wall_time_from_last_on_gc_finish end - end - end - end - describe '#sample_after_gc' do - let(:gc_samples) { samples.select { |it| it.locations.first.path == 'Garbage Collection' } } + it 'accumulates the cpu-time and wall-time from the multiple GCs' do + all_accumulated_wall_time = context_tracking.map { |it| it.fetch(:accumulated_wall_time_ns) } - before { sample } + expect(all_accumulated_wall_time).to eq all_accumulated_wall_time.sort + expect(all_accumulated_wall_time.first).to be <= all_accumulated_wall_time.last - context 'when there is no thread with gc time to be sampled' do - it 'does not sample any threads' do - sample_after_gc + all_accumulated_cpu_time = context_tracking.map { |it| it.fetch(:accumulated_cpu_time_ns) } + expect(all_accumulated_cpu_time).to eq all_accumulated_cpu_time.sort - expect(gc_samples).to be_empty - end + expect(all_accumulated_cpu_time.first).to be < all_accumulated_cpu_time.last if all_accumulated_cpu_time.first > 0 + end - it 'does not increment the gc_samples stat' do - sample_after_gc + it 'updates the wall_time_at_previous_gc_ns with the latest one' do + all_wall_time_at_previous_gc_ns = context_tracking.map { |it| it.fetch(:wall_time_at_previous_gc_ns) } - expect(stats.fetch(:gc_samples)).to be 0 + expect(all_wall_time_at_previous_gc_ns.last).to be all_wall_time_at_previous_gc_ns.max + end end end + end - context 'when there is a thread with gc start time but no finish time' do - before { on_gc_start } - - it 'does not sample any threads' do - sample_after_gc - - expect(gc_samples).to be_empty - end - - it 'does not increment the gc_samples stat' do - sample_after_gc + describe '#sample_after_gc' do + before { sample } - expect(stats.fetch(:gc_samples)).to be 0 + context 'when called before on_gc_start/on_gc_finish' do + it do + expect { sample_after_gc }.to raise_error(RuntimeError, /Unexpected call to sample_after_gc/) end end - context 'when there is a thread with a recorded gc start and finish time' do - let(:gc_sample) do - expect(gc_samples.size).to be 1 - gc_samples.first - end + context 'when there is gc information to record' do + let(:gc_sample) { samples.find { |it| it.labels.fetch(:'thread name') == 'Garbage Collection' } } before do on_gc_start + @time_before = Datadog::Core::Utils::Time.as_utc_epoch_ns(Time.now) on_gc_finish + @time_after = Datadog::Core::Utils::Time.as_utc_epoch_ns(Time.now) end - it 'samples the thread with recorded gc start and finish time, marking it as being in Garbage Collection' do - sample_after_gc + context 'when called more than once in a row' do + it do + sample_after_gc + + expect { sample_after_gc }.to raise_error(RuntimeError, /Unexpected call to sample_after_gc/) + end + end - expect(object_id_from(gc_sample.labels.fetch(:'thread id'))).to eq Thread.current.object_id + it 'increments the gc_samples counter' do + expect { sample_after_gc }.to change { stats.fetch(:gc_samples) }.from(0).to(1) end - it 'samples the thread with recorded gc start and finish time, recording the times between gc start and finish' do - cpu_time_at_start_ns = per_thread_context.fetch(Thread.current).fetch(:'gc_tracking.cpu_time_at_start_ns') - cpu_time_at_finish_ns = per_thread_context.fetch(Thread.current).fetch(:'gc_tracking.cpu_time_at_finish_ns') - wall_time_at_start_ns = per_thread_context.fetch(Thread.current).fetch(:'gc_tracking.wall_time_at_start_ns') - wall_time_at_finish_ns = per_thread_context.fetch(Thread.current).fetch(:'gc_tracking.wall_time_at_finish_ns') + it 'sets the wall_time_at_last_flushed_gc_event_ns from the wall_time_at_previous_gc_ns' do + wall_time_at_previous_gc_ns = gc_tracking.fetch(:wall_time_at_previous_gc_ns) sample_after_gc - expect(gc_sample.values).to include( - :"cpu-samples" => 1, - :'cpu-time' => cpu_time_at_finish_ns - cpu_time_at_start_ns, - :"wall-time" => wall_time_at_finish_ns - wall_time_at_start_ns, - ) + expect(gc_tracking.fetch(:wall_time_at_last_flushed_gc_event_ns)).to be wall_time_at_previous_gc_ns end - it 'resets the gc tracking fields back to invalid_time' do + it 'resets the wall_time_at_previous_gc_ns to invalid_time' do sample_after_gc - expect(per_thread_context.fetch(Thread.current)).to include( - :'gc_tracking.cpu_time_at_start_ns' => invalid_time, - :'gc_tracking.cpu_time_at_finish_ns' => invalid_time, - :'gc_tracking.wall_time_at_start_ns' => invalid_time, - :'gc_tracking.wall_time_at_finish_ns' => invalid_time, - ) - end - - it 'increments the gc_samples stat' do - expect { sample_after_gc }.to change { stats.fetch(:gc_samples) }.from(0).to(1) + expect(gc_tracking.fetch(:wall_time_at_previous_gc_ns)).to be invalid_time end - it 'does not sample any other threads' do + it 'creates a Garbage Collection sample' do sample_after_gc - expect(gc_samples.size).to be 1 + expect(gc_sample.values.fetch(:'cpu-samples')).to be 1 + expect(gc_sample.labels).to match a_hash_including( + :state => 'had cpu', + :'thread id' => 'GC', + :'thread name' => 'Garbage Collection', + :event => 'gc', + :'gc cause' => an_instance_of(String), + :'gc type' => an_instance_of(String), + ) + expect(gc_sample.locations.first.path).to eq 'Garbage Collection' end - it 'advances the wall_time_at_previous_sample_ns for the sampled thread by the time spent in garbage collection' do - wall_time_at_previous_sample_ns_before = - per_thread_context.fetch(Thread.current).fetch(:wall_time_at_previous_sample_ns) + it 'creates a Garbage Collection sample using the accumulated_cpu_time_ns and accumulated_wall_time_ns' do + accumulated_cpu_time_ns = gc_tracking.fetch(:accumulated_cpu_time_ns) + accumulated_wall_time_ns = gc_tracking.fetch(:accumulated_wall_time_ns) sample_after_gc - wall_time_spent_in_gc = gc_sample.values.fetch(:'wall-time') - - expect(per_thread_context.fetch(Thread.current)).to include( - wall_time_at_previous_sample_ns: wall_time_at_previous_sample_ns_before + wall_time_spent_in_gc + expect(gc_sample.values).to match a_hash_including( + :'cpu-time' => accumulated_cpu_time_ns, + :'wall-time' => accumulated_wall_time_ns, ) end - context 'cpu-time behavior' do - context 'when not on Linux' do - before do - skip 'The fallback behavior only applies when not on Linux' if PlatformHelpers.linux? - end - - it 'keeps the cpu_time_at_previous_sample_ns as invalid_time' do - sample_after_gc - - expect(per_thread_context.fetch(Thread.current)).to include(cpu_time_at_previous_sample_ns: invalid_time) - end - end + it 'does not include the timeline timestamp' do + sample_after_gc - context 'on Linux' do - before do - skip 'Test only runs on Linux' unless PlatformHelpers.linux? - end + expect(gc_sample.labels.keys).to_not include(:end_timestamp_ns) + end - it 'advances the cpu_time_at_previous_sample_ns for the sampled thread by the time spent in garbage collection' do - cpu_time_at_previous_sample_ns_before = - per_thread_context.fetch(Thread.current).fetch(:cpu_time_at_previous_sample_ns) + context 'when timeline is enabled' do + let(:timeline_enabled) { true } - sample_after_gc + it 'creates a Garbage Collection sample using the accumulated_wall_time_ns as the timeline duration' do + accumulated_wall_time_ns = gc_tracking.fetch(:accumulated_wall_time_ns) - cpu_time_spent_in_gc = gc_sample.values.fetch(:'cpu-time') + sample_after_gc - expect(per_thread_context.fetch(Thread.current)).to include( - cpu_time_at_previous_sample_ns: cpu_time_at_previous_sample_ns_before + cpu_time_spent_in_gc - ) - end + expect(gc_sample.values.fetch(:timeline)).to be accumulated_wall_time_ns end - end - - context 'when timeline is enabled' do - let(:timeline_enabled) { true } - it 'does not include end_timestamp_ns labels in GC samples' do + it 'creates a Garbage Collection sample using the timestamp set by on_gc_finish, converted to epoch ns' do sample_after_gc - expect(gc_samples.first.labels.keys).to_not include(:end_timestamp_ns) + expect(gc_sample.labels.fetch(:end_timestamp_ns)).to be_between(@time_before, @time_after) end end end diff --git a/spec/datadog/profiling/component_spec.rb b/spec/datadog/profiling/component_spec.rb index 7d7a28d4931..4c8989b9cde 100644 --- a/spec/datadog/profiling/component_spec.rb +++ b/spec/datadog/profiling/component_spec.rb @@ -53,6 +53,8 @@ context 'when using the new CPU Profiling 2.0 profiler' do it 'initializes a ThreadContext collector' do allow(Datadog::Profiling::Collectors::CpuAndWallTimeWorker).to receive(:new) + dummy_stack_recorder = instance_double(Datadog::Profiling::StackRecorder, 'dummy_stack_recorder') + allow(Datadog::Profiling::StackRecorder).to receive(:new).and_return(dummy_stack_recorder) expect(settings.profiling.advanced).to receive(:max_frames).and_return(:max_frames_config) expect(settings.profiling.advanced) @@ -61,7 +63,7 @@ .to receive(:enabled).and_return(:endpoint_collection_enabled_config) expect(Datadog::Profiling::Collectors::ThreadContext).to receive(:new).with( - recorder: instance_of(Datadog::Profiling::StackRecorder), + recorder: dummy_stack_recorder, max_frames: :max_frames_config, tracer: tracer, endpoint_collection_enabled: :endpoint_collection_enabled_config, @@ -80,11 +82,11 @@ expect(Datadog::Profiling::Collectors::CpuAndWallTimeWorker).to receive(:new).with( gc_profiling_enabled: anything, - allocation_counting_enabled: anything, no_signals_workaround_enabled: :no_signals_result, thread_context_collector: instance_of(Datadog::Profiling::Collectors::ThreadContext), dynamic_sampling_rate_overhead_target_percentage: :overhead_target_percentage_config, - allocation_sample_every: 0, + allocation_sample_every: kind_of(Integer), + allocation_profiling_enabled: false, ) build_profiler_component @@ -124,29 +126,190 @@ end end - context 'when allocation_counting_enabled is enabled' do + context 'when allocation profiling is enabled' do before do - settings.profiling.advanced.allocation_counting_enabled = true + settings.profiling.advanced.experimental_allocation_enabled = true + stub_const('RUBY_VERSION', testing_version) end - it 'initializes a CpuAndWallTimeWorker collector with allocation_counting_enabled set to true' do + context 'on Ruby 2.x' do + let(:testing_version) { '2.3.0 ' } + + it 'initializes CpuAndWallTimeWorker and StackRecorder with allocation sampling support and warns' do + expect(Datadog::Profiling::Collectors::CpuAndWallTimeWorker).to receive(:new).with hash_including( + allocation_profiling_enabled: true, + ) + expect(Datadog::Profiling::StackRecorder).to receive(:new) + .with(hash_including(alloc_samples_enabled: true)) + .and_call_original + + expect(Datadog.logger).to receive(:warn).with(/experimental allocation profiling/) + expect(Datadog.logger).to_not receive(:warn).with(/Ractor/) + + build_profiler_component + end + end + + ['3.2.0', '3.2.1', '3.2.2'].each do |broken_ruby| + context "on a Ruby 3 version affected by https://bugs.ruby-lang.org/issues/19482 (#{broken_ruby})" do + let(:testing_version) { broken_ruby } + + it 'initializes a CpuAndWallTimeWorker and StackRecorder with allocation sampling force-disabled and warns' do + expect(Datadog::Profiling::Collectors::CpuAndWallTimeWorker).to receive(:new).with hash_including( + allocation_profiling_enabled: false, + ) + expect(Datadog::Profiling::StackRecorder).to receive(:new) + .with(hash_including(alloc_samples_enabled: false)) + .and_call_original + + expect(Datadog.logger).to receive(:warn).with(/forcibly disabled/) + expect(Datadog.logger).to_not receive(:warn).with(/Ractor/) + expect(Datadog.logger).to_not receive(:warn).with(/experimental allocation profiling/) + + build_profiler_component + end + end + end + + ['3.0.0', '3.1.0', '3.1.3'].each do |broken_ractors_ruby| + context "on a Ruby 3 version affected by https://bugs.ruby-lang.org/issues/18464 (#{broken_ractors_ruby})" do + let(:testing_version) { broken_ractors_ruby } + + it 'initializes CpuAndWallTimeWorker and StackRecorder with allocation sampling support and warns' do + expect(Datadog::Profiling::Collectors::CpuAndWallTimeWorker).to receive(:new).with hash_including( + allocation_profiling_enabled: true, + ) + expect(Datadog::Profiling::StackRecorder).to receive(:new) + .with(hash_including(alloc_samples_enabled: true)) + .and_call_original + + expect(Datadog.logger).to receive(:warn).with(/Ractors.+crashes/) + expect(Datadog.logger).to receive(:warn).with(/experimental allocation profiling/) + + build_profiler_component + end + end + end + + ['3.1.4', '3.2.3', '3.3.0'].each do |fixed_ruby| + context "on a Ruby 3 version where https://bugs.ruby-lang.org/issues/18464 is fixed (#{fixed_ruby})" do + let(:testing_version) { fixed_ruby } + it 'initializes CpuAndWallTimeWorker and StackRecorder with allocation sampling support and warns' do + expect(Datadog::Profiling::Collectors::CpuAndWallTimeWorker).to receive(:new).with hash_including( + allocation_profiling_enabled: true, + ) + expect(Datadog::Profiling::StackRecorder).to receive(:new) + .with(hash_including(alloc_samples_enabled: true)) + .and_call_original + + expect(Datadog.logger).to receive(:warn).with(/Ractors.+stopping/) + expect(Datadog.logger).to receive(:warn).with(/experimental allocation profiling/) + + build_profiler_component + end + end + end + end + + context 'when allocation profiling is disabled' do + before do + settings.profiling.advanced.experimental_allocation_enabled = false + end + + it 'initializes CpuAndWallTimeWorker and StackRecorder without allocation sampling support' do expect(Datadog::Profiling::Collectors::CpuAndWallTimeWorker).to receive(:new).with hash_including( - allocation_counting_enabled: true, + allocation_profiling_enabled: false, ) + expect(Datadog::Profiling::StackRecorder).to receive(:new) + .with(hash_including(alloc_samples_enabled: false)) + .and_call_original build_profiler_component end end - context 'when allocation_counting_enabled is disabled' do + context 'when heap profiling is enabled' do + # Universally supported ruby version for allocation profiling by default + let(:testing_version) { '2.7.2' } + before do - settings.profiling.advanced.allocation_counting_enabled = false + settings.profiling.advanced.experimental_heap_enabled = true + stub_const('RUBY_VERSION', testing_version) end - it 'initializes a CpuAndWallTimeWorker collector with allocation_counting_enabled set to false' do - expect(Datadog::Profiling::Collectors::CpuAndWallTimeWorker).to receive(:new).with hash_including( - allocation_counting_enabled: false, - ) + context 'on a Ruby older than 2.7' do + let(:testing_version) { '2.6' } + + it 'initializes StackRecorder without heap sampling support and warns' do + expect(Datadog::Profiling::StackRecorder).to receive(:new) + .with(hash_including(heap_samples_enabled: false)) + .and_call_original + + expect(Datadog.logger).to receive(:warn).with(/upgrade to Ruby >= 2.7/) + + build_profiler_component + end + end + + context 'and allocation profiling disabled' do + before do + settings.profiling.advanced.experimental_allocation_enabled = false + end + + it 'raises an ArgumentError during component initialization' do + expect { build_profiler_component }.to raise_error(ArgumentError, /requires allocation profiling/) + end + end + + context 'and allocation profiling enabled and supported' do + before do + settings.profiling.advanced.experimental_allocation_enabled = true + end + + it 'initializes StackRecorder with heap sampling support and warns' do + expect(Datadog::Profiling::StackRecorder).to receive(:new) + .with(hash_including(heap_samples_enabled: true)) + .and_call_original + + expect(Datadog.logger).to receive(:warn).with(/experimental allocation profiling/) + expect(Datadog.logger).to receive(:warn).with(/experimental heap profiling/) + + build_profiler_component + end + end + end + + context 'when heap profiling is disabled' do + before do + settings.profiling.advanced.experimental_heap_enabled = false + end + + it 'initializes StackRecorder without heap sampling support' do + expect(Datadog::Profiling::StackRecorder).to receive(:new) + .with(hash_including(heap_samples_enabled: false)) + .and_call_original + + build_profiler_component + end + end + + context 'when timeline is enabled' do + before { settings.profiling.advanced.experimental_timeline_enabled = true } + + it 'sets up the StackRecorder with timeline_enabled: true' do + expect(Datadog::Profiling::StackRecorder) + .to receive(:new).with(hash_including(timeline_enabled: true)).and_call_original + + build_profiler_component + end + end + + context 'when timeline is disabled' do + before { settings.profiling.advanced.experimental_timeline_enabled = false } + + it 'sets up the StackRecorder with timeline_enabled: false' do + expect(Datadog::Profiling::StackRecorder) + .to receive(:new).with(hash_including(timeline_enabled: false)).and_call_original build_profiler_component end @@ -168,17 +331,20 @@ build_profiler_component end - it 'sets up the Exporter internal_metadata with no_signals_workaround_enabled and timeline_enabled settings' do + it 'sets up the Exporter internal_metadata with relevant settings' do allow(Datadog::Profiling::Collectors::ThreadContext).to receive(:new) allow(Datadog::Profiling::Collectors::CpuAndWallTimeWorker).to receive(:new) + allow(Datadog::Profiling::StackRecorder).to receive(:new) expect(described_class).to receive(:no_signals_workaround_enabled?).and_return(:no_signals_result) expect(settings.profiling.advanced).to receive(:experimental_timeline_enabled).and_return(:timeline_result) + expect(settings.profiling.advanced).to receive(:experimental_allocation_sample_rate).and_return(123) expect(Datadog::Profiling::Exporter).to receive(:new).with( hash_including( internal_metadata: { no_signals_workaround_enabled: :no_signals_result, timeline_enabled: :timeline_result, + allocation_sample_every: 123, } ) ) @@ -186,13 +352,6 @@ build_profiler_component end - it 'sets up the StackRecorder with alloc_samples_enabled: false' do - expect(Datadog::Profiling::StackRecorder) - .to receive(:new).with(hash_including(alloc_samples_enabled: false)).and_call_original - - build_profiler_component - end - context 'when on Linux' do before { stub_const('RUBY_PLATFORM', 'some-linux-based-platform') } @@ -461,6 +620,23 @@ end end + # See comments on looks_like_mariadb? for details on how this matching works + context "when mysql2 gem is linked to mariadb's version of libmysqlclient" do + before do + fake_client = double('Fake Mysql2::Client') + stub_const('Mysql2::Client', fake_client) + expect(fake_client).to receive(:info).and_return({ version: '4.9.99', header_version: '10.0.0' }) + end + + it { is_expected.to be false } + + it 'does not log any warning message' do + expect(Datadog.logger).to_not receive(:warn) + + no_signals_workaround_enabled? + end + end + context 'when mysql2 gem is using a version of libmysqlclient < 8.0.0' do before do fake_client = double('Fake Mysql2::Client') diff --git a/spec/datadog/profiling/native_extension_spec.rb b/spec/datadog/profiling/native_extension_spec.rb index f2a4c6ebe63..1cf75cdd5fd 100644 --- a/spec/datadog/profiling/native_extension_spec.rb +++ b/spec/datadog/profiling/native_extension_spec.rb @@ -82,7 +82,7 @@ it { is_expected.to be true } end - context 'on a background Ractor' do + context 'on a background Ractor', :ractors => true do # @ivoanjo: When we initially added this test, our test suite kept deadlocking in CI in a later test (not on # this one). # diff --git a/spec/datadog/profiling/spec_helper.rb b/spec/datadog/profiling/spec_helper.rb index 6d15cf22170..a663055406c 100644 --- a/spec/datadog/profiling/spec_helper.rb +++ b/spec/datadog/profiling/spec_helper.rb @@ -65,15 +65,30 @@ def decode_frame_from_pprof(decoded_profile, location_id) end def object_id_from(thread_id) - Integer(thread_id.match(/\d+ \((?\d+)\)/)[:object_id]) + if thread_id != 'GC' + Integer(thread_id.match(/\d+ \((?\d+)\)/)[:object_id]) + else + -1 + end end def samples_for_thread(samples, thread) - samples.select { |sample| object_id_from(sample.labels.fetch(:'thread id')) == thread.object_id } + samples.select do |sample| + thread_id = sample.labels[:'thread id'] + thread_id && object_id_from(thread_id) == thread.object_id + end end - def build_stack_recorder - Datadog::Profiling::StackRecorder.new(cpu_time_enabled: true, alloc_samples_enabled: true) + # We disable heap_sample collection by default in tests since it requires some extra mocking/ + # setup for it to properly work. + def build_stack_recorder(heap_samples_enabled: false, heap_size_enabled: false, timeline_enabled: false) + Datadog::Profiling::StackRecorder.new( + cpu_time_enabled: true, + alloc_samples_enabled: true, + heap_samples_enabled: heap_samples_enabled, + heap_size_enabled: heap_size_enabled, + timeline_enabled: timeline_enabled, + ) end end diff --git a/spec/datadog/profiling/stack_recorder_spec.rb b/spec/datadog/profiling/stack_recorder_spec.rb index 585d41f9d44..f330c79d1a8 100644 --- a/spec/datadog/profiling/stack_recorder_spec.rb +++ b/spec/datadog/profiling/stack_recorder_spec.rb @@ -7,9 +7,20 @@ let(:numeric_labels) { [] } let(:cpu_time_enabled) { true } let(:alloc_samples_enabled) { true } + # Disabling these by default since they require some extra setup and produce separate samples. + # Enabling this is tested in a particular context below. + let(:heap_samples_enabled) { false } + let(:heap_size_enabled) { false } + let(:timeline_enabled) { true } subject(:stack_recorder) do - described_class.new(cpu_time_enabled: cpu_time_enabled, alloc_samples_enabled: alloc_samples_enabled) + described_class.new( + cpu_time_enabled: cpu_time_enabled, + alloc_samples_enabled: alloc_samples_enabled, + heap_samples_enabled: heap_samples_enabled, + heap_size_enabled: heap_size_enabled, + timeline_enabled: timeline_enabled, + ) end # NOTE: A lot of libdatadog integration behaviors are tested in the Collectors::Stack specs, since we need actual @@ -111,55 +122,87 @@ def slot_two_mutex_locked? expect(start).to be <= finish end - context 'when all profile types are enabled' do + describe 'profile types configuration' do let(:cpu_time_enabled) { true } let(:alloc_samples_enabled) { true } - - it 'returns a pprof with the configured sample types' do - expect(sample_types_from(decoded_profile)).to eq( + let(:heap_samples_enabled) { true } + let(:heap_size_enabled) { true } + let(:timeline_enabled) { true } + let(:all_profile_types) do + { 'cpu-time' => 'nanoseconds', 'cpu-samples' => 'count', 'wall-time' => 'nanoseconds', 'alloc-samples' => 'count', - ) + 'heap-live-samples' => 'count', + 'heap-live-size' => 'bytes', + 'timeline' => 'nanoseconds', + } end - end - context 'when cpu-time is disabled' do - let(:cpu_time_enabled) { false } - let(:alloc_samples_enabled) { true } + def profile_types_without(type) + all_profile_types.dup.tap { |it| it.delete(type) { raise 'Missing key' } } + end - it 'returns a pprof without the cpu-type type' do - expect(sample_types_from(decoded_profile)).to eq( - 'cpu-samples' => 'count', - 'wall-time' => 'nanoseconds', - 'alloc-samples' => 'count', - ) + context 'when all profile types are enabled' do + it 'returns a pprof with the configured sample types' do + expect(sample_types_from(decoded_profile)).to eq(all_profile_types) + end end - end - context 'when alloc-samples is disabled' do - let(:cpu_time_enabled) { true } - let(:alloc_samples_enabled) { false } + context 'when cpu-time is disabled' do + let(:cpu_time_enabled) { false } - it 'returns a pprof without the alloc-samples type' do - expect(sample_types_from(decoded_profile)).to eq( - 'cpu-time' => 'nanoseconds', - 'cpu-samples' => 'count', - 'wall-time' => 'nanoseconds', - ) + it 'returns a pprof without the cpu-type type' do + expect(sample_types_from(decoded_profile)).to eq(profile_types_without('cpu-time')) + end end - end - context 'when all optional types are disabled' do - let(:cpu_time_enabled) { false } - let(:alloc_samples_enabled) { false } + context 'when alloc-samples is disabled' do + let(:alloc_samples_enabled) { false } - it 'returns a pprof with without the optional types' do - expect(sample_types_from(decoded_profile)).to eq( - 'cpu-samples' => 'count', - 'wall-time' => 'nanoseconds', - ) + it 'returns a pprof without the alloc-samples type' do + expect(sample_types_from(decoded_profile)).to eq(profile_types_without('alloc-samples')) + end + end + + context 'when heap-live-samples is disabled' do + let(:heap_samples_enabled) { false } + + it 'returns a pprof without the heap-live-samples type' do + expect(sample_types_from(decoded_profile)).to eq(profile_types_without('heap-live-samples')) + end + end + + context 'when heap-live-size is disabled' do + let(:heap_size_enabled) { false } + + it 'returns a pprof without the heap-live-size type' do + expect(sample_types_from(decoded_profile)).to eq(profile_types_without('heap-live-size')) + end + end + + context 'when timeline is disabled' do + let(:timeline_enabled) { false } + + it 'returns a pprof without the timeline type' do + expect(sample_types_from(decoded_profile)).to eq(profile_types_without('timeline')) + end + end + + context 'when all optional types are disabled' do + let(:cpu_time_enabled) { false } + let(:alloc_samples_enabled) { false } + let(:heap_samples_enabled) { false } + let(:heap_size_enabled) { false } + let(:timeline_enabled) { false } + + it 'returns a pprof without the optional types' do + expect(sample_types_from(decoded_profile)).to eq( + 'cpu-samples' => 'count', + 'wall-time' => 'nanoseconds', + ) + end end end @@ -185,7 +228,9 @@ def sample_types_from(decoded_profile) end context 'when profile has a sample' do - let(:metric_values) { { 'cpu-time' => 123, 'cpu-samples' => 456, 'wall-time' => 789, 'alloc-samples' => 4242 } } + let(:metric_values) do + { 'cpu-time' => 123, 'cpu-samples' => 456, 'wall-time' => 789, 'alloc-samples' => 4242, 'timeline' => 1111 } + end let(:labels) { { 'label_a' => 'value_a', 'label_b' => 'value_b', 'state' => 'unknown' }.to_a } let(:samples) { samples_from_pprof(encoded_pprof) } @@ -198,7 +243,13 @@ def sample_types_from(decoded_profile) it 'encodes the sample with the metrics provided' do expect(samples.first.values) - .to eq(:'cpu-time' => 123, :'cpu-samples' => 456, :'wall-time' => 789, :'alloc-samples' => 4242) + .to eq( + :'cpu-time' => 123, + :'cpu-samples' => 456, + :'wall-time' => 789, + :'alloc-samples' => 4242, + :timeline => 1111, + ) end context 'when disabling an optional profile sample type' do @@ -206,7 +257,7 @@ def sample_types_from(decoded_profile) it 'encodes the sample with the metrics provided, ignoring the disabled ones' do expect(samples.first.values) - .to eq(:'cpu-samples' => 456, :'wall-time' => 789, :'alloc-samples' => 4242) + .to eq(:'cpu-samples' => 456, :'wall-time' => 789, :'alloc-samples' => 4242, :timeline => 1111) end end @@ -302,6 +353,185 @@ def sample_types_from(decoded_profile) end end + describe 'heap samples and sizes' do + let(:sample_rate) { 50 } + let(:metric_values) do + { 'cpu-time' => 101, 'cpu-samples' => 1, 'wall-time' => 789, 'alloc-samples' => sample_rate, 'timeline' => 42 } + end + let(:labels) { { 'label_a' => 'value_a', 'label_b' => 'value_b', 'state' => 'unknown' }.to_a } + + let(:a_string) { 'a beautiful string' } + let(:an_array) { (1..100).to_a.compact } + let(:a_hash) { { 'a' => 1, 'b' => '2', 'c' => true, 'd' => Object.new } } + + let(:samples) { samples_from_pprof(encoded_pprof) } + + def sample_allocation(obj) + # Heap sampling currently requires this 2-step process to first pass data about the allocated object... + described_class::Testing._native_track_object(stack_recorder, obj, sample_rate, obj.class.name) + Datadog::Profiling::Collectors::Stack::Testing + ._native_sample(Thread.current, stack_recorder, metric_values, labels, numeric_labels, 400, false) + end + + before do + allocations = [a_string, an_array, "a fearsome interpolated string: #{sample_rate}", (-10..-1).to_a, a_hash, + { 'z' => -1, 'y' => '-2', 'x' => false }, Object.new] + @num_allocations = 0 + allocations.each_with_index do |obj, i| + # Sample allocations with 2 distinct stacktraces + if i.even? + sample_allocation(obj) # rubocop:disable Style/IdenticalConditionalBranches + else # rubocop:disable Lint/DuplicateBranch + sample_allocation(obj) # rubocop:disable Style/IdenticalConditionalBranches + end + @num_allocations += 1 + GC.start # Force each allocation to be done in its own GC epoch for interesting GC age labels + end + + allocations.clear # The literals in the previous array are now dangling + GC.start # And this will clear them, leaving only the non-literals which are still pointed to by the lets + + # NOTE: We've witnessed CI flakiness where some no longer referenced allocations may still be seen as alive + # after the previous GC. + # This might be an instance of the issues described in https://bugs.ruby-lang.org/issues/19460 + # and https://bugs.ruby-lang.org/issues/19041. We didn't get to the bottom of the + # reason but it might be that some machine context/register ends up still pointing to + # that last entry and thus manages to get it marked in the first GC. + # To reduce the likelihood of this happening we'll: + # * Allocate some more stuff and clear again + # * Do another GC + allocations = ["another fearsome interpolated string: #{sample_rate}", (-20..-10).to_a, + { 'a' => 1, 'b' => '2', 'c' => true }, Object.new] + allocations.clear + GC.start + end + + after do |example| + # This is here to facilitate troubleshooting when this test fails. Otherwise + # it's very hard to understand what may be happening. + if example.exception + puts('Heap recorder debugging info:') + puts(described_class::Testing._native_debug_heap_recorder(stack_recorder)) + end + end + + context 'when disabled' do + let(:heap_samples_enabled) { false } + let(:heap_size_enabled) { false } + + it 'are ommitted from the profile' do + # We sample from 2 distinct locations + expect(samples.size).to eq(2) + expect(samples.select { |s| s.values.key?('heap-live-samples') }).to be_empty + expect(samples.select { |s| s.values.key?('heap-live-size') }).to be_empty + end + end + + context 'when enabled' do + let(:heap_samples_enabled) { true } + let(:heap_size_enabled) { true } + + let(:heap_samples) do + samples.select { |s| s.values[:'heap-live-samples'] > 0 } + end + + let(:non_heap_samples) do + samples.select { |s| s.values[:'heap-live-samples'] == 0 } + end + + it 'include the stack and sample counts for the objects still left alive' do + # There should be 3 different allocation class labels so we expect 3 different heap samples + expect(heap_samples.size).to eq(3) + + expect(heap_samples.map { |s| s.labels[:'allocation class'] }).to include('String', 'Array', 'Hash') + expect(heap_samples.map(&:labels)).to all(match(hash_including(:'gc gen age' => be_a(Integer).and(be >= 0)))) + end + + it 'include accurate object sizes' do + string_sample = heap_samples.find { |s| s.labels[:'allocation class'] == 'String' } + expect(string_sample.values[:'heap-live-size']).to eq(ObjectSpace.memsize_of(a_string) * sample_rate) + + array_sample = heap_samples.find { |s| s.labels[:'allocation class'] == 'Array' } + expect(array_sample.values[:'heap-live-size']).to eq(ObjectSpace.memsize_of(an_array) * sample_rate) + + hash_sample = heap_samples.find { |s| s.labels[:'allocation class'] == 'Hash' } + expect(hash_sample.values[:'heap-live-size']).to eq(ObjectSpace.memsize_of(a_hash) * sample_rate) + end + + it 'include accurate object ages' do + string_sample = heap_samples.find { |s| s.labels[:'allocation class'] == 'String' } + string_age = string_sample.labels[:'gc gen age'] + + array_sample = heap_samples.find { |s| s.labels[:'allocation class'] == 'Array' } + array_age = array_sample.labels[:'gc gen age'] + + hash_sample = heap_samples.find { |s| s.labels[:'allocation class'] == 'Hash' } + hash_age = hash_sample.labels[:'gc gen age'] + + unique_sorted_ages = [string_age, array_age, hash_age].uniq.sort + # Expect all ages to be different and to be in the reverse order of allocation + # Last to allocate => Lower age + expect(unique_sorted_ages).to match([hash_age, array_age, string_age]) + + # Validate that the age of the newest object makes sense. + # * We force a GC after each allocation and the hash sample should correspond to + # the 5th allocation in 7 (which means we expect at least 3 GC after all allocations + # are done) + # * We forced 1 extra GC at the end of our before (+1) + # * This test isn't memory intensive otherwise so lets give us an extra margin of 1 GC to account for any + # GC out of our control + expect(hash_age).to be_between(4, 5) + end + + it 'keeps on reporting accurate samples for other profile types' do + expect(non_heap_samples.size).to eq(2) + + summed_values = {} + non_heap_samples.each do |s| + s.values.each_pair do |k, v| + summed_values[k] = (summed_values[k] || 0) + v + end + end + + # We use the same metric_values in all sample calls in before. So we'd expect + # the summed values to match `@num_allocations * metric_values[profile-type]` + # for each profile-type there in. + expected_summed_values = { :'heap-live-samples' => 0, :'heap-live-size' => 0, } + metric_values.each_pair do |k, v| + expected_summed_values[k.to_sym] = v * @num_allocations + end + + expect(summed_values).to eq(expected_summed_values) + end + + it "aren't lost when they happen concurrently with a long serialization" do + described_class::Testing._native_start_fake_slow_heap_serialization(stack_recorder) + + test_num_allocated_object = 123 + live_objects = Array.new(test_num_allocated_object) + + test_num_allocated_object.times do |i| + live_objects[i] = "this is string number #{i}" + sample_allocation(live_objects[i]) + end + + allocation_line = __LINE__ - 3 + + described_class::Testing._native_end_fake_slow_heap_serialization(stack_recorder) + + heap_samples_in_test_matcher = lambda { |sample| + (sample.values[:'heap-live-samples'] || 0) > 0 && sample.locations.any? do |location| + location.lineno == allocation_line && location.path == __FILE__ + end + } + + relevant_sample = heap_samples.find(&heap_samples_in_test_matcher) + expect(relevant_sample).not_to be nil + expect(relevant_sample.values[:'heap-live-samples']).to eq test_num_allocated_object * sample_rate + end + end + end + context 'when there is a failure during serialization' do before do allow(Datadog.logger).to receive(:error) @@ -431,4 +661,69 @@ def sample_types_from(decoded_profile) expect(stack_recorder.serialize.first).to be >= now end end + + describe 'Heap_recorder' do + context 'produces the same hash code for stack-based and location-based keys' do + it 'with empty stacks' do + described_class::Testing._native_check_heap_hashes([]) + end + + it 'with single-frame stacks' do + described_class::Testing._native_check_heap_hashes( + [ + ['a name', 'a filename', 123] + ] + ) + end + + it 'with multi-frame stacks' do + described_class::Testing._native_check_heap_hashes( + [ + ['a name', 'a filename', 123], + ['another name', 'anoter filename', 456], + ] + ) + end + + it 'with empty names' do + described_class::Testing._native_check_heap_hashes( + [ + ['', 'a filename', 123], + ] + ) + end + + it 'with empty filenames' do + described_class::Testing._native_check_heap_hashes( + [ + ['a name', '', 123], + ] + ) + end + + it 'with zero lines' do + described_class::Testing._native_check_heap_hashes( + [ + ['a name', 'a filename', 0] + ] + ) + end + + it 'with negative lines' do + described_class::Testing._native_check_heap_hashes( + [ + ['a name', 'a filename', -123] + ] + ) + end + + it 'with biiiiiiig lines' do + described_class::Testing._native_check_heap_hashes( + [ + ['a name', 'a filename', 4_000_000] + ] + ) + end + end + end end diff --git a/spec/datadog/tracing/configuration/settings_spec.rb b/spec/datadog/tracing/configuration/settings_spec.rb index 647b26322be..25ee0f5fdf7 100644 --- a/spec/datadog/tracing/configuration/settings_spec.rb +++ b/spec/datadog/tracing/configuration/settings_spec.rb @@ -404,21 +404,6 @@ def propagation_inject_style end end - describe '#priority_sampling' do - subject(:priority_sampling) { settings.tracing.priority_sampling } - - it { is_expected.to be nil } - end - - describe '#priority_sampling=' do - it 'updates the #priority_sampling setting' do - expect { settings.tracing.priority_sampling = true } - .to change { settings.tracing.priority_sampling } - .from(nil) - .to(true) - end - end - describe '#report_hostname' do subject(:report_hostname) { settings.tracing.report_hostname } @@ -668,7 +653,7 @@ def propagation_inject_style end describe '#writer_options=' do - let(:options) { { priority_sampling: true } } + let(:options) { { anything: double } } it 'updates the #writer_options setting' do expect { settings.tracing.test_mode.writer_options = options } @@ -728,7 +713,7 @@ def propagation_inject_style end describe '#writer_options=' do - let(:options) { { priority_sampling: true } } + let(:options) { { anything: double } } it 'updates the #writer_options setting' do expect { settings.tracing.writer_options = options } diff --git a/spec/datadog/tracing/contrib/delayed_job/configuration/settings_spec.rb b/spec/datadog/tracing/contrib/delayed_job/configuration/settings_spec.rb new file mode 100644 index 00000000000..213479fd08d --- /dev/null +++ b/spec/datadog/tracing/contrib/delayed_job/configuration/settings_spec.rb @@ -0,0 +1,6 @@ +require 'datadog/tracing/contrib/delayed_job/configuration/settings' +require 'datadog/tracing/contrib/shared_settings_examples' + +RSpec.describe Datadog::Tracing::Contrib::DelayedJob::Configuration::Settings do + it_behaves_like 'with on_error setting' +end diff --git a/spec/datadog/tracing/contrib/delayed_job/plugin_spec.rb b/spec/datadog/tracing/contrib/delayed_job/plugin_spec.rb index 79dba5c8acb..68e74afa285 100644 --- a/spec/datadog/tracing/contrib/delayed_job/plugin_spec.rb +++ b/spec/datadog/tracing/contrib/delayed_job/plugin_spec.rb @@ -93,8 +93,8 @@ def job_data end context 'when job fails' do - let(:configuration_options) { { error_handler: error_handler } } - let(:error_handler) { proc { @error_handler_called = true } } + let(:configuration_options) { { on_error: on_error } } + let(:on_error) { proc { @error_handler_called = true } } let(:sample_job_object) do stub_const( diff --git a/spec/datadog/tracing/contrib/excon/configuration/settings_spec.rb b/spec/datadog/tracing/contrib/excon/configuration/settings_spec.rb index 05fa382f739..ba36e0526e5 100644 --- a/spec/datadog/tracing/contrib/excon/configuration/settings_spec.rb +++ b/spec/datadog/tracing/contrib/excon/configuration/settings_spec.rb @@ -1,6 +1,9 @@ require 'datadog/tracing/contrib/excon/configuration/settings' require 'datadog/tracing/contrib/service_name_settings_examples' +require 'datadog/tracing/contrib/shared_settings_examples' RSpec.describe Datadog::Tracing::Contrib::Excon::Configuration::Settings do it_behaves_like 'service name setting', 'excon' + it_behaves_like 'with on_error setting' + it_behaves_like 'with error_status_codes setting', env: 'DD_TRACE_EXCON_ERROR_STATUS_CODES' end diff --git a/spec/datadog/tracing/contrib/excon/instrumentation_spec.rb b/spec/datadog/tracing/contrib/excon/instrumentation_spec.rb index cec167501e8..9c2fca9491d 100644 --- a/spec/datadog/tracing/contrib/excon/instrumentation_spec.rb +++ b/spec/datadog/tracing/contrib/excon/instrumentation_spec.rb @@ -172,13 +172,35 @@ end context 'when the path is not found' do - subject!(:response) { connection.get(path: '/not_found') } + it do + connection.get(path: '/not_found') - it_behaves_like 'environment service name', 'DD_TRACE_EXCON_SERVICE_NAME' - it_behaves_like 'configured peer service span', 'DD_TRACE_EXCON_PEER_SERVICE' - it_behaves_like 'schema version span' + expect(request_span).to have_error + end + + context 'when given `error_status_codes`' do + let(:configuration_options) { { error_status_codes: 500...600 } } + + it do + connection.get(path: '/not_found') + + expect(request_span).not_to have_error + end + end - it { expect(request_span).to_not have_error } + context 'when configured from env' do + around do |example| + ClimateControl.modify('DD_TRACE_EXCON_ERROR_STATUS_CODES' => '500-600') do + example.run + end + end + + it do + connection.get(path: '/not_found') + + expect(span).not_to have_error + end + end end context 'when the request times out' do @@ -194,6 +216,18 @@ expect(request_span.get_tag('error.type')).to eq('Excon::Error::Timeout') end + context 'when given `on_error`' do + let(:configuration_options) { { on_error: proc { @error_handler_called = true } } } + + it do + expect { subject }.to raise_error(Excon::Error::Timeout) + expect(request_span.finished?).to eq(true) + expect(request_span).not_to have_error + + expect(@error_handler_called).to be_truthy + end + end + context 'when the request is idempotent' do subject(:response) { connection.get(path: '/timeout', idempotent: true, retry_limit: 4) } @@ -205,17 +239,6 @@ end end - context 'when there is custom error handling' do - subject!(:response) { connection.get(path: 'not_found') } - - let(:configuration_options) { super().merge(error_handler: custom_handler) } - let(:custom_handler) { ->(env) { (400...600).cover?(env[:status]) } } - - after { Datadog.configuration.tracing[:excon][:error_handler] = nil } - - it { expect(request_span).to have_error } - end - context 'when split by domain' do subject(:response) { connection.get(path: '/success') } diff --git a/spec/datadog/tracing/contrib/faraday/configuration/settings_spec.rb b/spec/datadog/tracing/contrib/faraday/configuration/settings_spec.rb index 8e7287f25e2..07a5f8a3a44 100644 --- a/spec/datadog/tracing/contrib/faraday/configuration/settings_spec.rb +++ b/spec/datadog/tracing/contrib/faraday/configuration/settings_spec.rb @@ -1,6 +1,9 @@ require 'datadog/tracing/contrib/faraday/configuration/settings' require 'datadog/tracing/contrib/service_name_settings_examples' +require 'datadog/tracing/contrib/shared_settings_examples' RSpec.describe Datadog::Tracing::Contrib::Faraday::Configuration::Settings do it_behaves_like 'service name setting', 'faraday' + it_behaves_like 'with on_error setting' + it_behaves_like 'with error_status_codes setting', env: 'DD_TRACE_FARADAY_ERROR_STATUS_CODES' end diff --git a/spec/datadog/tracing/contrib/faraday/middleware_spec.rb b/spec/datadog/tracing/contrib/faraday/middleware_spec.rb index 0c87b8e22b4..86ad6a3ae62 100644 --- a/spec/datadog/tracing/contrib/faraday/middleware_spec.rb +++ b/spec/datadog/tracing/contrib/faraday/middleware_spec.rb @@ -279,6 +279,17 @@ expect(span.get_tag('span.kind')).to eq('client') end + context 'when given `on_error`' do + let(:configuration_options) { { on_error: proc { @error_handler_called = true } } } + + it do + expect { response }.to raise_error(Faraday::ConnectionFailed) + + expect(span).not_to have_error + expect(@error_handler_called).to be_truthy + end + end + it_behaves_like 'a peer service span' do let(:peer_service_val) { 'example.com' } let(:peer_service_source) { 'peer.hostname' } @@ -294,26 +305,35 @@ end context 'when there is a client error' do - subject!(:response) { client.get('/not_found') } + it do + client.get('/not_found') - it { expect(span).to_not have_error } + expect(span).to have_error + end - it_behaves_like 'environment service name', 'DD_TRACE_FARADAY_SERVICE_NAME' - it_behaves_like 'configured peer service span', 'DD_TRACE_FARADAY_PEER_SERVICE' - it_behaves_like 'schema version span' - end + context 'when given from configuration options' do + let(:configuration_options) { { error_status_codes: 500...600 } } - context 'when there is custom error handling' do - subject!(:response) { client.get('not_found') } + it do + client.get('not_found') - let(:middleware_options) { { error_handler: custom_handler } } - let(:custom_handler) { ->(env) { (400...600).cover?(env[:status]) } } + expect(span).not_to have_error + end + end - it { expect(span).to have_error } + context 'when configured from env' do + around do |example| + ClimateControl.modify('DD_TRACE_FARADAY_ERROR_STATUS_CODES' => '500-600') do + example.run + end + end - it_behaves_like 'environment service name', 'DD_TRACE_FARADAY_SERVICE_NAME' - it_behaves_like 'configured peer service span', 'DD_TRACE_FARADAY_PEER_SERVICE' - it_behaves_like 'schema version span' + it do + client.get('not_found') + + expect(span).not_to have_error + end + end end context 'when split by domain' do diff --git a/spec/datadog/tracing/contrib/grpc/configuration/settings_spec.rb b/spec/datadog/tracing/contrib/grpc/configuration/settings_spec.rb index 170756da555..15eff9ba0d7 100644 --- a/spec/datadog/tracing/contrib/grpc/configuration/settings_spec.rb +++ b/spec/datadog/tracing/contrib/grpc/configuration/settings_spec.rb @@ -1,6 +1,8 @@ require 'datadog/tracing/contrib/grpc/configuration/settings' require 'datadog/tracing/contrib/service_name_settings_examples' +require 'datadog/tracing/contrib/shared_settings_examples' RSpec.describe Datadog::Tracing::Contrib::GRPC::Configuration::Settings do it_behaves_like 'service name setting', 'grpc' + it_behaves_like 'with on_error setting' end diff --git a/spec/datadog/tracing/contrib/grpc/datadog_interceptor/client_spec.rb b/spec/datadog/tracing/contrib/grpc/datadog_interceptor/client_spec.rb index af52cbf3267..53fffd2784f 100644 --- a/spec/datadog/tracing/contrib/grpc/datadog_interceptor/client_spec.rb +++ b/spec/datadog/tracing/contrib/grpc/datadog_interceptor/client_spec.rb @@ -168,11 +168,11 @@ end context 'with an error handler' do - subject(:server) do - Datadog::Tracing::Contrib::GRPC::DatadogInterceptor::Client.new { |c| c.error_handler = error_handler } + subject(:client) do + Datadog::Tracing::Contrib::GRPC::DatadogInterceptor::Client.new { |c| c.on_error = on_error } end - let(:error_handler) do + let(:on_error) do ->(span, error) { span.set_tag('custom.handler', "Got error #{error}, but ignored it from interceptor") } end @@ -180,9 +180,9 @@ end context 'with an error handler defined in the configuration options' do - let(:configuration_options) { { service_name: 'rspec', client_error_handler: error_handler } } + let(:configuration_options) { { on_error: on_error } } - let(:error_handler) do + let(:on_error) do ->(span, error) { span.set_tag('custom.handler', "Got error #{error}, but ignored it from configuration") } end diff --git a/spec/datadog/tracing/contrib/grpc/datadog_interceptor/server_spec.rb b/spec/datadog/tracing/contrib/grpc/datadog_interceptor/server_spec.rb index 6e5a14967c6..ab946d38558 100644 --- a/spec/datadog/tracing/contrib/grpc/datadog_interceptor/server_spec.rb +++ b/spec/datadog/tracing/contrib/grpc/datadog_interceptor/server_spec.rb @@ -94,10 +94,10 @@ context 'with an error handler' do subject(:server) do - Datadog::Tracing::Contrib::GRPC::DatadogInterceptor::Server.new { |c| c.error_handler = error_handler } + Datadog::Tracing::Contrib::GRPC::DatadogInterceptor::Server.new { |c| c.on_error = on_error } end - let(:error_handler) do + let(:on_error) do ->(span, error) { span.set_tag('custom.handler', "Got error #{error}, but ignored it from interceptor") } end @@ -105,24 +105,14 @@ end context 'with an error handler defined in the configuration_options' do - let(:configuration_options) { { service_name: 'rspec', server_error_handler: error_handler } } + let(:configuration_options) { { on_error: on_error } } - let(:error_handler) do + let(:on_error) do ->(span, error) { span.set_tag('custom.handler', "Got error #{error}, but ignored it from configuration") } end it_behaves_like 'it handles the error', 'Got error test error, but ignored it from configuration' end - - context 'with an error handler defined with the deprecated error_handler option' do - let(:configuration_options) { { service_name: 'rspec', error_handler: error_handler } } - - let(:error_handler) do - ->(span, error) { span.set_tag('custom.handler', "Got error #{error}, but ignored it from deprecated config") } - end - - it_behaves_like 'it handles the error', 'Got error test error, but ignored it from deprecated config' - end end end diff --git a/spec/datadog/tracing/contrib/grpc/support/gen/grpc-1.19.0/test_service_pb.rb b/spec/datadog/tracing/contrib/grpc/support/gen/grpc-1.19.0/test_service_pb.rb deleted file mode 100644 index ec85ab3bf56..00000000000 --- a/spec/datadog/tracing/contrib/grpc/support/gen/grpc-1.19.0/test_service_pb.rb +++ /dev/null @@ -1,13 +0,0 @@ -# Generated by the protocol buffer compiler. DO NOT EDIT! -# source: test_service.proto - -require 'google/protobuf' - -Google::Protobuf::DescriptorPool.generated_pool.build do - add_message "ruby.test.TestMessage" do - end -end - -module GRPCHelper - TestMessage = Google::Protobuf::DescriptorPool.generated_pool.lookup("ruby.test.TestMessage").msgclass -end diff --git a/spec/datadog/tracing/contrib/grpc/support/gen/grpc-1.19.0/test_service_services_pb.rb b/spec/datadog/tracing/contrib/grpc/support/gen/grpc-1.19.0/test_service_services_pb.rb deleted file mode 100644 index ac168128aa1..00000000000 --- a/spec/datadog/tracing/contrib/grpc/support/gen/grpc-1.19.0/test_service_services_pb.rb +++ /dev/null @@ -1,26 +0,0 @@ -# Generated by the protocol buffer compiler. DO NOT EDIT! -# Source: test_service.proto for package 'GRPCHelper' - -require 'grpc' -require 'test_service_pb' - -module GRPCHelper - module Testing - class Service - - include GRPC::GenericService - - self.marshal_class_method = :encode - self.unmarshal_class_method = :decode - self.service_name = 'ruby.test.Testing' - - rpc :Basic, TestMessage, TestMessage - rpc :Error, TestMessage, TestMessage - rpc :StreamFromClient, stream(TestMessage), TestMessage - rpc :StreamFromServer, TestMessage, stream(TestMessage) - rpc :StreamBothWays, stream(TestMessage), stream(TestMessage) - end - - Stub = Service.rpc_stub_class - end -end diff --git a/spec/datadog/tracing/contrib/grpc/support/grpc_helper.rb b/spec/datadog/tracing/contrib/grpc/support/grpc_helper.rb index a575b72ae49..fde3b62f236 100644 --- a/spec/datadog/tracing/contrib/grpc/support/grpc_helper.rb +++ b/spec/datadog/tracing/contrib/grpc/support/grpc_helper.rb @@ -1,11 +1,12 @@ require 'grpc' require 'spec/support/thread_helpers' -if RUBY_VERSION < '2.3' - require_relative './gen/grpc-1.19.0/test_service_services_pb' -else - require_relative './gen/test_service_services_pb' -end +# The generated files at `gen` expect that directory to +# be in the root `require` load path. +# E.g. it performs a `require 'test_service_pb'`, expecting `gen` to be in the root path. +gen_dir = File.expand_path('gen', __dir__) +$LOAD_PATH.unshift(gen_dir) +require_relative './gen/test_service_services_pb' module GRPCHelper def run_request_reply(address = available_endpoint, client = nil) diff --git a/spec/datadog/tracing/contrib/http/configuration/settings_spec.rb b/spec/datadog/tracing/contrib/http/configuration/settings_spec.rb index 150cd0428ba..8e428368185 100644 --- a/spec/datadog/tracing/contrib/http/configuration/settings_spec.rb +++ b/spec/datadog/tracing/contrib/http/configuration/settings_spec.rb @@ -1,6 +1,8 @@ require 'datadog/tracing/contrib/http/configuration/settings' require 'datadog/tracing/contrib/service_name_settings_examples' +require 'datadog/tracing/contrib/shared_settings_examples' RSpec.describe Datadog::Tracing::Contrib::HTTP::Configuration::Settings do it_behaves_like 'service name setting', 'net/http' + it_behaves_like 'with error_status_codes setting', env: 'DD_TRACE_HTTP_ERROR_STATUS_CODES' end diff --git a/spec/datadog/tracing/contrib/http/request_spec.rb b/spec/datadog/tracing/contrib/http/request_spec.rb index 1c3cc3bd28a..5a87ea430b7 100644 --- a/spec/datadog/tracing/contrib/http/request_spec.rb +++ b/spec/datadog/tracing/contrib/http/request_spec.rb @@ -43,7 +43,7 @@ subject(:response) { client.get(path) } before { stub_request(:any, "#{uri}#{path}").to_return(status: status_code, body: '{}') } - include_examples 'with error status code configuration' + include_examples 'with error status code configuration', env: 'DD_TRACE_HTTP_ERROR_STATUS_CODES' end describe '#get' do diff --git a/spec/datadog/tracing/contrib/http_examples.rb b/spec/datadog/tracing/contrib/http_examples.rb index ea469d0354b..d3bd3a40baf 100644 --- a/spec/datadog/tracing/contrib/http_examples.rb +++ b/spec/datadog/tracing/contrib/http_examples.rb @@ -1,4 +1,4 @@ -RSpec.shared_examples 'with error status code configuration' do +RSpec.shared_examples 'with error status code configuration' do |env:| before { subject } context 'with a custom range' do @@ -22,6 +22,30 @@ end end + context 'when custom range from env' do + around do |example| + ClimateControl.modify(env => '500-502') do + example.run + end + end + + context 'with a status code within the range' do + let(:status_code) { 501 } + + it 'marks the span as an error' do + expect(span).to have_error + end + end + + context 'with a status code outside of the range' do + let(:status_code) { 503 } + + it 'does not mark the span as an error' do + expect(span).to_not have_error + end + end + end + context 'with an Array object' do let(:status_code) { 500 } diff --git a/spec/datadog/tracing/contrib/httpclient/configuration/settings_spec.rb b/spec/datadog/tracing/contrib/httpclient/configuration/settings_spec.rb index 39efa6ffcf8..9d8b9521092 100644 --- a/spec/datadog/tracing/contrib/httpclient/configuration/settings_spec.rb +++ b/spec/datadog/tracing/contrib/httpclient/configuration/settings_spec.rb @@ -1,6 +1,8 @@ require 'datadog/tracing/contrib/httpclient/configuration/settings' require 'datadog/tracing/contrib/service_name_settings_examples' +require 'datadog/tracing/contrib/shared_settings_examples' RSpec.describe Datadog::Tracing::Contrib::Httpclient::Configuration::Settings do it_behaves_like 'service name setting', 'httpclient' + it_behaves_like 'with error_status_codes setting', env: 'DD_TRACE_HTTPCLIENT_ERROR_STATUS_CODES' end diff --git a/spec/datadog/tracing/contrib/httpclient/instrumentation_spec.rb b/spec/datadog/tracing/contrib/httpclient/instrumentation_spec.rb index 37b8b4a0e52..4405748fbac 100644 --- a/spec/datadog/tracing/contrib/httpclient/instrumentation_spec.rb +++ b/spec/datadog/tracing/contrib/httpclient/instrumentation_spec.rb @@ -319,7 +319,7 @@ let(:code) { status_code } before { response } - include_examples 'with error status code configuration' + include_examples 'with error status code configuration', env: 'DD_TRACE_HTTPCLIENT_ERROR_STATUS_CODES' end it_behaves_like 'instrumented request' diff --git a/spec/datadog/tracing/contrib/httprb/configuration/settings_spec.rb b/spec/datadog/tracing/contrib/httprb/configuration/settings_spec.rb index ed12cc93f4b..a2561f56a8d 100644 --- a/spec/datadog/tracing/contrib/httprb/configuration/settings_spec.rb +++ b/spec/datadog/tracing/contrib/httprb/configuration/settings_spec.rb @@ -1,6 +1,8 @@ require 'datadog/tracing/contrib/httprb/configuration/settings' require 'datadog/tracing/contrib/service_name_settings_examples' +require 'datadog/tracing/contrib/shared_settings_examples' RSpec.describe Datadog::Tracing::Contrib::Httprb::Configuration::Settings do it_behaves_like 'service name setting', 'httprb' + it_behaves_like 'with error_status_codes setting', env: 'DD_TRACE_HTTPRB_ERROR_STATUS_CODES' end diff --git a/spec/datadog/tracing/contrib/httprb/instrumentation_spec.rb b/spec/datadog/tracing/contrib/httprb/instrumentation_spec.rb index f0125e6bb6a..485c599fa53 100644 --- a/spec/datadog/tracing/contrib/httprb/instrumentation_spec.rb +++ b/spec/datadog/tracing/contrib/httprb/instrumentation_spec.rb @@ -322,7 +322,7 @@ let(:code) { status_code } before { response } - include_examples 'with error status code configuration' + include_examples 'with error status code configuration', env: 'DD_TRACE_HTTPRB_ERROR_STATUS_CODES' end it_behaves_like 'instrumented request' diff --git a/spec/datadog/tracing/contrib/mysql2/patcher_spec.rb b/spec/datadog/tracing/contrib/mysql2/patcher_spec.rb index b8ec2d9bc5d..34341a1222a 100644 --- a/spec/datadog/tracing/contrib/mysql2/patcher_spec.rb +++ b/spec/datadog/tracing/contrib/mysql2/patcher_spec.rb @@ -77,6 +77,20 @@ end it_behaves_like 'with sql comment propagation', span_op_name: 'mysql2.query' + + context 'when configured with `on_error`' do + before do + Datadog.configure_onto(client, on_error: ->(_span, _error) { false }) + end + + let(:sql_statement) { 'SELECT INVALID' } + + it 'does not mark span with error' do + expect { query }.to raise_error(Mysql2::Error) + + expect(span).not_to have_error + end + end end context 'when a successful query is made' do @@ -149,6 +163,15 @@ it_behaves_like 'configured peer service span', 'DD_TRACE_MYSQL2_PEER_SERVICE', error: Mysql2::Error do let(:configuration_options) { {} } end + + context 'when configured with `on_error`' do + let(:configuration_options) { { on_error: ->(_span, _error) { false } } } + + it 'does not mark span with error' do + expect { query }.to raise_error(Mysql2::Error) + expect(span).not_to have_error + end + end end end end diff --git a/spec/datadog/tracing/contrib/pg/configuration/settings_spec.rb b/spec/datadog/tracing/contrib/pg/configuration/settings_spec.rb index 8282d4d2bf1..743f3e708bb 100644 --- a/spec/datadog/tracing/contrib/pg/configuration/settings_spec.rb +++ b/spec/datadog/tracing/contrib/pg/configuration/settings_spec.rb @@ -1,6 +1,8 @@ require 'datadog/tracing/contrib/pg/configuration/settings' require 'datadog/tracing/contrib/service_name_settings_examples' +require 'datadog/tracing/contrib/shared_settings_examples' RSpec.describe Datadog::Tracing::Contrib::Pg::Configuration::Settings do it_behaves_like 'service name setting', 'pg' + it_behaves_like 'with on_error setting' end diff --git a/spec/datadog/tracing/contrib/pg/patcher_spec.rb b/spec/datadog/tracing/contrib/pg/patcher_spec.rb index 24f3bde30b0..727bcfec089 100644 --- a/spec/datadog/tracing/contrib/pg/patcher_spec.rb +++ b/spec/datadog/tracing/contrib/pg/patcher_spec.rb @@ -173,8 +173,7 @@ end context 'when there is custom error handling' do - let(:configuration_options) { { error_handler: error_handler } } - let(:error_handler) { ->(_span, _error) { false } } + let(:configuration_options) { { on_error: ->(_span, _error) { false } } } it 'calls the error handler' do expect { exec }.to raise_error(PG::Error) diff --git a/spec/datadog/tracing/contrib/que/configuration/settings_spec.rb b/spec/datadog/tracing/contrib/que/configuration/settings_spec.rb new file mode 100644 index 00000000000..90914411d9a --- /dev/null +++ b/spec/datadog/tracing/contrib/que/configuration/settings_spec.rb @@ -0,0 +1,6 @@ +require 'datadog/tracing/contrib/que/configuration/settings' +require 'datadog/tracing/contrib/shared_settings_examples' + +RSpec.describe Datadog::Tracing::Contrib::Que::Configuration::Settings do + it_behaves_like 'with on_error setting' +end diff --git a/spec/datadog/tracing/contrib/que/tracer_spec.rb b/spec/datadog/tracing/contrib/que/tracer_spec.rb index cd21e7692a5..90b90de2178 100644 --- a/spec/datadog/tracing/contrib/que/tracer_spec.rb +++ b/spec/datadog/tracing/contrib/que/tracer_spec.rb @@ -74,7 +74,7 @@ def run(*_args) it 'continues to capture spans gracefully under unexpected conditions' do expect { error_job_class.enqueue(**job_args) }.to raise_error(StandardError) - expect(spans).not_to be_empty + expect(span.start_time).not_to be_nil expect(span.end_time).not_to be_nil expect(span.get_tag(Datadog::Tracing::Metadata::Ext::Errors::TAG_TYPE)).to eq('StandardError') @@ -89,6 +89,19 @@ def run(*_args) end end + context 'with error handler' do + let(:configuration_options) { { on_error: proc { @error_handler = true } } } + + it 'continues to capture spans gracefully under unexpected conditions' do + expect { error_job_class.enqueue(**job_args) }.to raise_error(StandardError) + expect(span).not_to have_error + expect(@error_handler).to be_truthy + expect(span.start_time).not_to be_nil + expect(span.end_time).not_to be_nil + expect(span.get_tag('messaging.system')).to eq('que') + end + end + context 'with tag_args enabled' do let(:configuration_options) { { tag_args: true } } diff --git a/spec/datadog/tracing/contrib/resque/configuration/settings_spec.rb b/spec/datadog/tracing/contrib/resque/configuration/settings_spec.rb new file mode 100644 index 00000000000..5b889ca040b --- /dev/null +++ b/spec/datadog/tracing/contrib/resque/configuration/settings_spec.rb @@ -0,0 +1,6 @@ +require 'datadog/tracing/contrib/resque/configuration/settings' +require 'datadog/tracing/contrib/shared_settings_examples' + +RSpec.describe Datadog::Tracing::Contrib::Resque::Configuration::Settings do + it_behaves_like 'with on_error setting' +end diff --git a/spec/datadog/tracing/contrib/resque/instrumentation_spec.rb b/spec/datadog/tracing/contrib/resque/instrumentation_spec.rb index ccd5207cd3d..2f9b66d5f44 100644 --- a/spec/datadog/tracing/contrib/resque/instrumentation_spec.rb +++ b/spec/datadog/tracing/contrib/resque/instrumentation_spec.rb @@ -124,12 +124,12 @@ def perform_job(klass, *args) end context 'with custom error handler' do - let(:configuration_options) { super().merge(error_handler: error_handler) } - let(:error_handler) { proc { @error_handler_called = true } } + let(:configuration_options) { super().merge(on_error: on_error) } + let(:on_error) { proc { @error_handler = true } } it 'uses custom error handler' do perform_job(job_class) - expect(@error_handler_called).to be_truthy + expect(@error_handler).to be_truthy end end end diff --git a/spec/datadog/tracing/contrib/shared_settings_examples.rb b/spec/datadog/tracing/contrib/shared_settings_examples.rb new file mode 100644 index 00000000000..59dc6838203 --- /dev/null +++ b/spec/datadog/tracing/contrib/shared_settings_examples.rb @@ -0,0 +1,143 @@ +RSpec.shared_examples_for 'with on_error setting' do + context 'default without settings' do + subject { described_class.new } + + it { expect(subject.on_error).to be_nil } + end + + context 'when given a Proc' do + subject { described_class.new(on_error: proc {}) } + + it { expect(subject.on_error).to be_a(Proc) } + end + + context 'when given a object of wrong type' do + subject { described_class.new(on_error: 1) } + + it { expect { subject }.to raise_error(ArgumentError) } + + context 'when skip configuration validation' do + around do |example| + ClimateControl.modify('DD_EXPERIMENTAL_SKIP_CONFIGURATION_VALIDATION' => 'true') do + example.run + end + end + + it { expect { subject }.not_to raise_error } + end + end +end + +RSpec.shared_examples_for 'with error_status_codes setting' do |env:| + context 'default without settings' do + subject { described_class.new } + + it { expect(subject.error_status_codes).to include 400 } + it { expect(subject.error_status_codes).to include 499 } + it { expect(subject.error_status_codes).to include 500 } + it { expect(subject.error_status_codes).to include 599 } + it { expect(subject.error_status_codes).not_to include 600 } + end + + context 'when given error_status_codes' do + context 'when given a single value' do + subject { described_class.new(error_status_codes: 500) } + + it { expect(subject.error_status_codes).not_to include 400 } + it { expect(subject.error_status_codes).not_to include 499 } + it { expect(subject.error_status_codes).to include 500 } + it { expect(subject.error_status_codes).not_to include 599 } + it { expect(subject.error_status_codes).not_to include 600 } + end + + context 'when given an array of integers' do + subject { described_class.new(error_status_codes: [400, 500]) } + + it { expect(subject.error_status_codes).to include 400 } + it { expect(subject.error_status_codes).not_to include 499 } + it { expect(subject.error_status_codes).to include 500 } + it { expect(subject.error_status_codes).not_to include 599 } + it { expect(subject.error_status_codes).not_to include 600 } + end + + context 'when given a range' do + subject { described_class.new(error_status_codes: 500..600) } + + it { expect(subject.error_status_codes).not_to include 400 } + it { expect(subject.error_status_codes).not_to include 499 } + it { expect(subject.error_status_codes).to include 500 } + it { expect(subject.error_status_codes).to include 599 } + it { expect(subject.error_status_codes).to include 600 } + end + + context 'when given an array of integer and range' do + subject { described_class.new(error_status_codes: [400, 500..600]) } + + it { expect(subject.error_status_codes).to include 400 } + it { expect(subject.error_status_codes).not_to include 499 } + it { expect(subject.error_status_codes).to include 500 } + it { expect(subject.error_status_codes).to include 599 } + it { expect(subject.error_status_codes).to include 600 } + end + end + + context 'when configured with environment variable' do + subject { described_class.new } + + context 'when given a single value' do + around do |example| + ClimateControl.modify(env => '500') do + example.run + end + end + + it { expect(subject.error_status_codes).not_to include 400 } + it { expect(subject.error_status_codes).not_to include 499 } + it { expect(subject.error_status_codes).to include 500 } + it { expect(subject.error_status_codes).not_to include 599 } + it { expect(subject.error_status_codes).not_to include 600 } + end + + context 'when given a comma separated list' do + around do |example| + ClimateControl.modify(env => '400,500') do + example.run + end + end + + it { expect(subject.error_status_codes).to include 400 } + it { expect(subject.error_status_codes).not_to include 499 } + it { expect(subject.error_status_codes).to include 500 } + it { expect(subject.error_status_codes).not_to include 599 } + it { expect(subject.error_status_codes).not_to include 600 } + end + + context 'when given a comma separated list with space' do + around do |example| + ClimateControl.modify(env => '400,,500') do + example.run + end + end + + it { expect(subject.error_status_codes).to include 400 } + it { expect(subject.error_status_codes).not_to include 499 } + it { expect(subject.error_status_codes).to include 500 } + it { expect(subject.error_status_codes).not_to include 599 } + it { expect(subject.error_status_codes).not_to include 600 } + end + + context 'when given a comma separated list with range' do + around do |example| + ClimateControl.modify(env => '400,500-600') do + example.run + end + end + + it { expect(subject.error_status_codes).to include 400 } + it { expect(subject.error_status_codes).not_to include 499 } + it { expect(subject.error_status_codes).to include 500 } + it { expect(subject.error_status_codes).to include 599 } + it { expect(subject.error_status_codes).to include 600 } + end + end +end diff --git a/spec/datadog/tracing/contrib/shoryuken/configuration/settings_spec.rb b/spec/datadog/tracing/contrib/shoryuken/configuration/settings_spec.rb new file mode 100644 index 00000000000..abc3b55fa83 --- /dev/null +++ b/spec/datadog/tracing/contrib/shoryuken/configuration/settings_spec.rb @@ -0,0 +1,6 @@ +require 'datadog/tracing/contrib/shoryuken/configuration/settings' +require 'datadog/tracing/contrib/shared_settings_examples' + +RSpec.describe Datadog::Tracing::Contrib::Shoryuken::Configuration::Settings do + it_behaves_like 'with on_error setting' +end diff --git a/spec/datadog/tracing/contrib/shoryuken/tracer_spec.rb b/spec/datadog/tracing/contrib/shoryuken/tracer_spec.rb index 7ddeabf261e..16320e5dbd5 100644 --- a/spec/datadog/tracing/contrib/shoryuken/tracer_spec.rb +++ b/spec/datadog/tracing/contrib/shoryuken/tracer_spec.rb @@ -119,6 +119,48 @@ def perform(sqs_msg, body); end end end + describe 'when worker raises exception' do + let(:exception_worker_class) do + stub_const( + 'TestExceptionWorker', + Class.new do + include Shoryuken::Worker + shoryuken_options queue: 'default' + def perform(sqs_msg, body) + raise 'Bala Boom!' + end + end + ) + end + let(:worker) { exception_worker_class.new } + + subject(:raise_exception) do + body = 'message body' + sqs_msg = instance_double( + 'Shoryuken::Message', message_id: SecureRandom.uuid, attributes: {} + ) + shoryuken_tracer.call(worker, 'default', sqs_msg, body) do + worker.perform(sqs_msg, body) + end + end + + context 'given without an error handler' do + it do + expect { raise_exception }.to raise_error 'Bala Boom!' + expect(span).to have_error + end + end + + context 'given an error handler' do + let(:configuration_options) { { on_error: proc { @error_handler_called = true } } } + it do + expect { raise_exception }.to raise_error 'Bala Boom!' + expect(span).not_to have_error + expect(@error_handler_called).to be_truthy + end + end + end + context 'when a Shoryuken::Worker class' do include_context 'Shoryuken::Worker' diff --git a/spec/datadog/tracing/contrib/sidekiq/configuration/settings_spec.rb b/spec/datadog/tracing/contrib/sidekiq/configuration/settings_spec.rb new file mode 100644 index 00000000000..6c1b29d2817 --- /dev/null +++ b/spec/datadog/tracing/contrib/sidekiq/configuration/settings_spec.rb @@ -0,0 +1,6 @@ +require 'datadog/tracing/contrib/sidekiq/configuration/settings' +require 'datadog/tracing/contrib/shared_settings_examples' + +RSpec.describe Datadog::Tracing::Contrib::Sidekiq::Configuration::Settings do + it_behaves_like 'with on_error setting' +end diff --git a/spec/datadog/tracing/contrib/sidekiq/tracer_configure_spec.rb b/spec/datadog/tracing/contrib/sidekiq/tracer_configure_spec.rb index f099b7f7b65..999c694c512 100644 --- a/spec/datadog/tracing/contrib/sidekiq/tracer_configure_spec.rb +++ b/spec/datadog/tracing/contrib/sidekiq/tracer_configure_spec.rb @@ -7,7 +7,7 @@ subject(:perform_async) { job_class.perform_async } let(:job_class) { EmptyWorker } - let(:error_handler) { nil } + let(:on_error) { nil } context 'with custom middleware configuration' do before do @@ -15,7 +15,7 @@ chain.add( Datadog::Tracing::Contrib::Sidekiq::ServerTracer, service_name: 'my-service', - error_handler: error_handler + on_error: on_error ) end end @@ -31,7 +31,7 @@ context 'with custom error handler' do let(:job_class) { ErrorWorker } - let(:error_handler) { proc { @error_handler_called = true } } + let(:on_error) { proc { @error_handler_called = true } } before do stub_const( diff --git a/spec/datadog/tracing/contrib/sneakers/configuration/settings_spec.rb b/spec/datadog/tracing/contrib/sneakers/configuration/settings_spec.rb new file mode 100644 index 00000000000..b4fc51a51de --- /dev/null +++ b/spec/datadog/tracing/contrib/sneakers/configuration/settings_spec.rb @@ -0,0 +1,6 @@ +require 'datadog/tracing/contrib/sneakers/configuration/settings' +require 'datadog/tracing/contrib/shared_settings_examples' + +RSpec.describe Datadog::Tracing::Contrib::Sneakers::Configuration::Settings do + it_behaves_like 'with on_error setting' +end diff --git a/spec/datadog/tracing/contrib/sneakers/tracer_spec.rb b/spec/datadog/tracing/contrib/sneakers/tracer_spec.rb index 994d592cef1..bfeb7704a98 100644 --- a/spec/datadog/tracing/contrib/sneakers/tracer_spec.rb +++ b/spec/datadog/tracing/contrib/sneakers/tracer_spec.rb @@ -121,7 +121,7 @@ def work_with_params(_msg, _delivery_info, _metadata) end context 'with custom error handler' do - let(:configuration_options) { super().merge(error_handler: error_handler) } + let(:configuration_options) { super().merge(on_error: error_handler) } let(:error_handler) { proc { @error_handler_called = true } } let(:worker) { FailingMiddlewareWorker.new(queue, Concurrent::ImmediateExecutor.new) } diff --git a/spec/datadog/tracing/contrib/status_code_matcher_spec.rb b/spec/datadog/tracing/contrib/status_code_matcher_spec.rb new file mode 100644 index 00000000000..7508c0c3870 --- /dev/null +++ b/spec/datadog/tracing/contrib/status_code_matcher_spec.rb @@ -0,0 +1,40 @@ +require 'datadog/tracing/contrib/status_code_matcher' + +RSpec.describe Datadog::Tracing::Contrib::StatusCodeMatcher do + describe '#include?' do + context 'when given a string to parse' do + it do + matcher = described_class.new('400') + + expect(matcher).to include 400 + end + + it do + matcher = described_class.new('400,500') + + expect(matcher).to include 400 + expect(matcher).not_to include 499 + expect(matcher).to include 500 + expect(matcher).not_to include 599 + end + + it do + matcher = described_class.new('400-500') + + expect(matcher).to include 400 + expect(matcher).to include 499 + expect(matcher).to include 500 + expect(matcher).not_to include 599 + end + + it do + matcher = described_class.new('400-404,500') + + expect(matcher).to include 400 + expect(matcher).not_to include 499 + expect(matcher).to include 500 + expect(matcher).not_to include 599 + end + end + end +end diff --git a/spec/datadog/tracing/contrib/status_range_env_parser_spec.rb b/spec/datadog/tracing/contrib/status_range_env_parser_spec.rb new file mode 100644 index 00000000000..dea3cdd012e --- /dev/null +++ b/spec/datadog/tracing/contrib/status_range_env_parser_spec.rb @@ -0,0 +1,18 @@ +require 'datadog/tracing/contrib/status_range_env_parser' + +RSpec.describe Datadog::Tracing::Contrib::StatusRangeEnvParser do + describe '.call' do + [ + ['400', [400]], + ['400,500', [400, 500]], + ['400,,500', [400, 500]], + [',400,500', [400, 500]], + ['400,500,', [400, 500]], + ['400-404,500', [400..404, 500]], + ['400-404,500-504', [400..404, 500..504]], + ['400-404,444,500-504', [400..404, 444, 500..504]], + ].each do |input, result| + it { expect(described_class.call(input)).to eq(result) } + end + end +end diff --git a/spec/datadog/tracing/contrib/status_range_matcher_spec.rb b/spec/datadog/tracing/contrib/status_range_matcher_spec.rb new file mode 100644 index 00000000000..8208f3e5621 --- /dev/null +++ b/spec/datadog/tracing/contrib/status_range_matcher_spec.rb @@ -0,0 +1,58 @@ +require 'datadog/tracing/contrib/status_range_matcher' + +RSpec.describe Datadog::Tracing::Contrib::StatusRangeMatcher do + describe '#include?' do + it do + matcher = described_class.new(400) + + expect(matcher).to include 400 + expect(matcher).not_to include 401 + expect(matcher).not_to include 499 + expect(matcher).not_to include 500 + expect(matcher).not_to include 501 + expect(matcher).not_to include 599 + end + + it do + matcher = described_class.new(400..500) + + expect(matcher).to include 400 + expect(matcher).to include 401 + expect(matcher).to include 499 + expect(matcher).to include 500 + expect(matcher).not_to include 501 + expect(matcher).not_to include 599 + end + + it do + matcher = described_class.new([400..500]) + + expect(matcher).to include 400 + expect(matcher).to include 401 + expect(matcher).to include 499 + expect(matcher).to include 500 + expect(matcher).not_to include 501 + expect(matcher).not_to include 599 + end + + it do + matcher = described_class.new([400..401, 500]) + + expect(matcher).to include 400 + expect(matcher).to include 401 + expect(matcher).not_to include 499 + expect(matcher).to include 500 + expect(matcher).not_to include 599 + end + + it do + matcher = described_class.new([400..401, 500..600]) + + expect(matcher).to include 400 + expect(matcher).to include 401 + expect(matcher).not_to include 499 + expect(matcher).to include 500 + expect(matcher).to include 599 + end + end +end diff --git a/spec/datadog/tracing/diagnostics/environment_logger_spec.rb b/spec/datadog/tracing/diagnostics/environment_logger_spec.rb index 904eed91d47..2bdc49425c3 100644 --- a/spec/datadog/tracing/diagnostics/environment_logger_spec.rb +++ b/spec/datadog/tracing/diagnostics/environment_logger_spec.rb @@ -45,7 +45,6 @@ 'sampling_rules' => nil, 'integrations_loaded' => nil, 'partial_flushing_enabled' => false, - 'priority_sampling_enabled' => false, ) end end @@ -140,7 +139,6 @@ sampling_rules: nil, integrations_loaded: nil, partial_flushing_enabled: false, - priority_sampling_enabled: false, ) end @@ -216,12 +214,6 @@ it { is_expected.to include partial_flushing_enabled: true } end - - context 'with priority sampling enabled' do - before { expect(Datadog.configuration.tracing).to receive(:priority_sampling).and_return(true) } - - it { is_expected.to include priority_sampling_enabled: true } - end end end diff --git a/spec/datadog/tracing/integration_spec.rb b/spec/datadog/tracing/integration_spec.rb index 1822f7eb18f..fe58332e8e2 100644 --- a/spec/datadog/tracing/integration_spec.rb +++ b/spec/datadog/tracing/integration_spec.rb @@ -398,7 +398,6 @@ def agent_receives_span_step3(previous_success) # Test setup c.tracing.sampler = custom_sampler if custom_sampler - c.tracing.priority_sampling = priority_sampling if priority_sampling end WebMock.enable! @@ -412,7 +411,6 @@ def agent_receives_span_step3(previous_success) let(:stats) { tracer.writer.stats } let(:custom_sampler) { nil } - let(:priority_sampling) { false } let(:trace_sampling_rate) { nil } let(:json_rules) { JSON.dump(rules) if rules } @@ -509,12 +507,12 @@ def agent_receives_span_step3(previous_success) context 'by direct sampling' do let(:custom_sampler) { no_sampler } - let(:priority_sampling) { false } let(:no_sampler) do Class.new do def sample!(trace) trace.reject! + trace.sampled = false end end.new end @@ -790,39 +788,31 @@ def sample!(trace) end let(:custom_sampler) do - instance_double(Datadog::Tracing::Sampling::Sampler, sample?: sample, sample!: sample, sample_rate: double) + instance_double(Datadog::Tracing::Sampling::Sampler, sample?: double, sample!: double, sample_rate: double) end context 'that accepts a span' do - let(:sample) { true } - before do + expect(custom_sampler).to receive(:sample!) do |trace| + trace.sampled = true + false + end + end + + it 'flushes the span' do tracer.trace('span') {} try_wait_until { tracer.writer.stats[:traces_flushed] >= 1 } end + end - it_behaves_like 'priority sampled', 1.0 - - # DEV: the `custom_sampler` is configured as a `pre_sampler` in the PrioritySampler. - # When `custom_sampler` returns `trace.sampled? == true`, the `post_sampler` is - # still consulted. This is unlikely to be the desired behaviour when a user configures - # `c.tracing.sampler = custom_sampler`. - # In practice, the `custom_sampler` can reject traces (`trace.sampled? == false`), - # but accepting them does not actually change the default sampler's behavior. - # Changing this is a breaking change. - it_behaves_like 'sampling decision', '-0' # This is incorrect. -4 (MANUAL) is the correct value. - it_behaves_like 'sampling decision', '-4' do - before do - pending( - 'A custom sampler consults PrioritySampler#post_sampler for the final sampling decision. ' \ - 'This is incorrect, as a custom sampler should allow complete control of the sampling decision.' - ) + context 'that rejects a span' do + before do + expect(custom_sampler).to receive(:sample!) do |trace| + trace.sampled = false + false end end - end - context 'that rejects a span' do - let(:sample) { false } it 'drops trace at application side' do expect(tracer.writer).to_not receive(:write) @@ -896,7 +886,6 @@ def sample!(trace) before do Datadog.configure do |c| - c.tracing.priority_sampling = true c.tracing.writer = writer end @@ -940,7 +929,6 @@ def sample!(trace) Datadog.configure do |c| c.agent.host = hostname c.agent.port = port - c.tracing.priority_sampling = true end end diff --git a/spec/datadog/tracing/transport/http_spec.rb b/spec/datadog/tracing/transport/http_spec.rb index eb60c7c7939..1e04a927906 100644 --- a/spec/datadog/tracing/transport/http_spec.rb +++ b/spec/datadog/tracing/transport/http_spec.rb @@ -198,64 +198,4 @@ it { is_expected.to be(:net_http) } end - - describe '.default_hostname' do - subject(:default_hostname) { described_class.default_hostname(logger: logger) } - - let(:logger) { instance_double(Datadog::Core::Logger, warn: nil) } - - before do - stub_const( - 'Datadog::Tracing::Transport::HTTP::DO_NOT_USE_ENVIRONMENT_AGENT_SETTINGS', - instance_double(Datadog::Core::Configuration::AgentSettingsResolver::AgentSettings, hostname: 'example-hostname') - ) - end - - it 'returns the hostname from the DO_NOT_USE_ENVIRONMENT_AGENT_SETTINGS object' do - expect(default_hostname).to eq 'example-hostname' - end - - it 'logs a deprecation warning' do - expect(logger).to receive(:warn).with(/Deprecated/) - - default_hostname - end - end - - describe '.default_port' do - subject(:default_port) { described_class.default_port(logger: logger) } - - let(:logger) { instance_double(Datadog::Core::Logger, warn: nil) } - - before do - stub_const( - 'Datadog::Tracing::Transport::HTTP::DO_NOT_USE_ENVIRONMENT_AGENT_SETTINGS', - instance_double(Datadog::Core::Configuration::AgentSettingsResolver::AgentSettings, port: 12345) - ) - end - - it 'returns the port from the DO_NOT_USE_ENVIRONMENT_AGENT_SETTINGS object' do - expect(default_port).to eq 12345 - end - - it 'logs a deprecation warning' do - expect(logger).to receive(:warn).with(/Deprecated/) - - default_port - end - end - - describe '.default_url' do - subject(:default_url) { described_class.default_url(logger: logger) } - - let(:logger) { instance_double(Datadog::Core::Logger, warn: nil) } - - it { is_expected.to be nil } - - it 'logs a deprecation warning' do - expect(logger).to receive(:warn).with(/Deprecated/) - - default_url - end - end end diff --git a/spec/test_service_pb.rb b/spec/test_service_pb.rb deleted file mode 100644 index 35da5acf871..00000000000 --- a/spec/test_service_pb.rb +++ /dev/null @@ -1,7 +0,0 @@ -# This file is a hack for the grpc protoc autogenerated gen/test_service_services_pb.rb files to work, -# since they add the following import line: require 'test_service_pb' and they wouldn't work otherwise. -if RUBY_VERSION < '2.3' - require_relative 'datadog/tracing/contrib/grpc/support/gen/grpc-1.19.0/test_service_pb' -else - require_relative 'datadog/tracing/contrib/grpc/support/gen/test_service_pb' -end diff --git a/vendor/rbs/mysql2/0/mysql2.rbs b/vendor/rbs/mysql2/0/mysql2.rbs index 6ec51ba1181..884e53afa6d 100644 --- a/vendor/rbs/mysql2/0/mysql2.rbs +++ b/vendor/rbs/mysql2/0/mysql2.rbs @@ -1,5 +1,5 @@ module Mysql2 class Client - def self.info: () -> { version: ::String } + def self.info: () -> { version: ::String, header_version: ::String? } end end