Skip to content

Commit

Permalink
Merge pull request #2932 from bravehager/bravehager/minitest
Browse files Browse the repository at this point in the history
marcotc authored Jul 5, 2023

Unverified

The committer email address is not verified.
2 parents e04c477 + 9311ef9 commit fc78216
Showing 17 changed files with 718 additions and 1 deletion.
8 changes: 8 additions & 0 deletions Appraisals
Original file line number Diff line number Diff line change
@@ -151,6 +151,7 @@ if ruby_version?('2.1')
gem 'httpclient'
gem 'makara', '< 0.5.0' # >= 0.5.0 contain Ruby 2.3+ syntax
gem 'mongo', '< 2.5'
gem 'minitest', '>= 5.0.0'
gem 'mysql2', '0.3.21'
gem 'pg', '>= 0.18.4', '< 1.0'
gem 'rack', '1.4.7'
@@ -338,6 +339,7 @@ elsif ruby_version?('2.2')
gem 'lograge', '~> 0.11'
gem 'makara', '< 0.5.0' # >= 0.5.0 contain Ruby 2.3+ syntax
gem 'mongo', '>= 2.8.0'
gem 'minitest', '>= 5.0.0'
gem 'mysql2', '< 0.5'
gem 'pg', '>= 0.18.4'
gem 'presto-client', '>= 0.5.14'
@@ -539,6 +541,7 @@ elsif ruby_version?('2.3')
gem 'lograge', '~> 0.11'
gem 'makara'
gem 'mongo', '>= 2.8.0', '< 2.15.0' # TODO: FIX TEST BREAKAGES ON >= 2.15 https://github.com/DataDog/dd-trace-rb/issues/1596
gem 'minitest', '>= 5.0.0'
gem 'mysql2', '< 0.5'
gem 'pg', '>= 0.18.4'
gem 'racecar', '>= 0.3.5'
@@ -674,6 +677,7 @@ elsif ruby_version?('2.4')
gem 'lograge', '~> 0.11'
gem 'makara'
gem 'mongo', '>= 2.8.0', '< 2.15.0' # TODO: FIX TEST BREAKAGES ON >= 2.15 https://github.com/DataDog/dd-trace-rb/issues/1596
gem 'minitest', '>= 5.0.0'
gem 'mysql2', '< 0.5'
gem 'pg', '>= 0.18.4'
gem 'racecar', '>= 0.3.5'
@@ -940,6 +944,7 @@ elsif ruby_version?('2.5')
gem 'lograge', '~> 0.11'
gem 'i18n', '1.8.7', platform: :jruby # Removal pending: https://github.com/ruby-i18n/i18n/issues/555#issuecomment-772112169
gem 'makara'
gem 'minitest', '>= 5.0.0'
gem 'mongo', '>= 2.8.0', '< 2.15.0' # TODO: FIX TEST BREAKAGES ON >= 2.15 https://github.com/DataDog/dd-trace-rb/issues/1596
gem 'mysql2', '< 1', platform: :ruby
gem 'activerecord-jdbcmysql-adapter', '>= 60.2', platform: :jruby
@@ -1190,6 +1195,7 @@ elsif ruby_version?('2.6')
gem 'httpclient'
gem 'lograge', '~> 0.11'
gem 'makara'
gem 'minitest', '>= 5.0.0'
gem 'mongo', '>= 2.8.0', '< 2.15.0' # TODO: FIX TEST BREAKAGES ON >= 2.15 https://github.com/DataDog/dd-trace-rb/issues/1596
gem 'mysql2', '< 1', platform: :ruby
gem 'activerecord-jdbcmysql-adapter', platform: :jruby
@@ -1426,6 +1432,7 @@ elsif ruby_version?('2.7')
gem 'httpclient'
gem 'lograge', '~> 0.11'
gem 'makara'
gem 'minitest', '>= 5.0.0'
gem 'mongo', '>= 2.8.0', '< 2.15.0' # TODO: FIX TEST BREAKAGES ON >= 2.15 https://github.com/DataDog/dd-trace-rb/issues/1596
gem 'mysql2', '< 1', platform: :ruby
gem 'pg', '>= 0.18.4', platform: :ruby
@@ -1561,6 +1568,7 @@ elsif ruby_version?('3.0') || ruby_version?('3.1') || ruby_version?('3.2') || ru
gem 'httpclient'
gem 'lograge'
gem 'makara', '>= 0.6.0.pre' # Ruby 3 requires >= 0.6.0, which is currently in pre-release: https://rubygems.org/gems/makara/versions
gem 'minitest', '>= 5.0.0'
gem 'mongo', '>= 2.8.0', '< 2.15.0' # TODO: FIX TEST BREAKAGES ON >= 2.15 https://github.com/DataDog/dd-trace-rb/issues/1596
gem 'mysql2', '>= 0.5.3', platform: :ruby
gem 'activerecord-jdbcmysql-adapter', platform: :jruby
3 changes: 2 additions & 1 deletion Rakefile
Original file line number Diff line number Diff line change
@@ -184,7 +184,8 @@ namespace :spec do
# Datadog CI integrations
[
:cucumber,
:rspec
:rspec,
:minitest
].each do |contrib|
RSpec::Core::RakeTask.new(contrib) do |t, args|
t.pattern = "spec/datadog/ci/contrib/#{contrib}/**/*_spec.rb"
25 changes: 25 additions & 0 deletions docs/GettingStarted.md
Original file line number Diff line number Diff line change
@@ -60,6 +60,7 @@ To contribute, check out the [contribution guidelines][contribution docs] and [d
- [httpclient](#httpclient)
- [httpx](#httpx)
- [Kafka](#kafka)
- [Minitest](#minitest)
- [MongoDB](#mongodb)
- [MySQL2](#mysql2)
- [Net/HTTP](#nethttp)
@@ -1285,6 +1286,30 @@ 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:
1 change: 1 addition & 0 deletions lib/datadog/ci.rb
Original file line number Diff line number Diff line change
@@ -14,6 +14,7 @@ module CI
# Integrations
require_relative 'ci/contrib/cucumber/integration'
require_relative 'ci/contrib/rspec/integration'
require_relative 'ci/contrib/minitest/integration'

# Extensions
require_relative 'ci/extensions'
33 changes: 33 additions & 0 deletions lib/datadog/ci/contrib/minitest/configuration/settings.rb
Original file line number Diff line number Diff line change
@@ -0,0 +1,33 @@
# frozen_string_literal: true

require_relative '../../../../tracing/contrib/configuration/settings'
require_relative '../ext'

module Datadog
module CI
module Contrib
module Minitest
module Configuration
# Custom settings for the Minitest integration
# TODO: mark as `@public_api` when GA
class Settings < Datadog::Tracing::Contrib::Configuration::Settings
option :enabled do |o|
o.default { env_to_bool(Ext::ENV_ENABLED, true) }
o.lazy
end

option :service_name do |o|
o.default { Datadog.configuration.service_without_fallback || Ext::SERVICE_NAME }
o.lazy
end

option :operation_name do |o|
o.default { ENV.key?(Ext::ENV_OPERATION_NAME) ? ENV[Ext::ENV_OPERATION_NAME] : Ext::OPERATION_NAME }
o.lazy
end
end
end
end
end
end
end
21 changes: 21 additions & 0 deletions lib/datadog/ci/contrib/minitest/ext.rb
Original file line number Diff line number Diff line change
@@ -0,0 +1,21 @@
# frozen_string_literal: true

module Datadog
module CI
module Contrib
module Minitest
# Minitest integration constants
# TODO: mark as `@public_api` when GA, to protect from resource and tag name changes.
module Ext
APP = 'minitest'
ENV_ENABLED = 'DD_TRACE_MINITEST_ENABLED'
ENV_OPERATION_NAME = 'DD_TRACE_MINITEST_OPERATION_NAME'
FRAMEWORK = 'minitest'
OPERATION_NAME = 'minitest.test'
SERVICE_NAME = 'minitest'
TEST_TYPE = 'test'
end
end
end
end
end
49 changes: 49 additions & 0 deletions lib/datadog/ci/contrib/minitest/integration.rb
Original file line number Diff line number Diff line change
@@ -0,0 +1,49 @@
# frozen_string_literal: true

require_relative '../../../tracing/contrib/integration'

require_relative 'configuration/settings'
require_relative 'patcher'

module Datadog
module CI
module Contrib
module Minitest
# Description of Minitest integration
class Integration
include Datadog::Tracing::Contrib::Integration

MINIMUM_VERSION = Gem::Version.new('5.0.0')

register_as :minitest, auto_patch: true

def self.version
Gem.loaded_specs['minitest'] \
&& Gem.loaded_specs['minitest'].version
end

def self.loaded?
!defined?(::Minitest).nil?
end

def self.compatible?
super && version >= MINIMUM_VERSION
end

# test environments should not auto instrument test libraries
def auto_instrument?
false
end

def new_configuration
Configuration::Settings.new
end

def patcher
Patcher
end
end
end
end
end
end
27 changes: 27 additions & 0 deletions lib/datadog/ci/contrib/minitest/patcher.rb
Original file line number Diff line number Diff line change
@@ -0,0 +1,27 @@
# frozen_string_literal: true

require_relative '../../../tracing/contrib/patcher'
require_relative 'test_helper'

module Datadog
module CI
module Contrib
module Minitest
# Patcher enables patching of 'minitest' module.
module Patcher
include Datadog::Tracing::Contrib::Patcher

module_function

def target_version
Integration.version
end

def patch
::Minitest::Test.include(TestHelper)
end
end
end
end
end
end
68 changes: 68 additions & 0 deletions lib/datadog/ci/contrib/minitest/test_helper.rb
Original file line number Diff line number Diff line change
@@ -0,0 +1,68 @@
# frozen_string_literal: true

require_relative 'ext'

module Datadog
module CI
module Contrib
module Minitest
# Instrument Minitest::Test
module TestHelper
def before_setup
super
return unless configuration[:enabled]

test_name = "#{class_name}##{name}"

path, = method(name).source_location
test_suite = Pathname.new(path).relative_path_from(Pathname.pwd).to_s

span = CI::Test.trace(
configuration[:operation_name],
{
span_options: {
resource: test_name,
service: configuration[:service_name],
},
framework: Ext::FRAMEWORK,
framework_version: CI::Contrib::Minitest::Integration.version.to_s,
test_name: test_name,
test_suite: test_suite,
test_type: Ext::TEST_TYPE,
},
)

Thread.current[:_datadog_test_span] = span
end

def after_teardown
span = Thread.current[:_datadog_test_span]
return super unless span

Thread.current[:_datadog_test_span] = nil

case result_code
when '.'
CI::Test.passed!(span)
when 'E', 'F'
CI::Test.failed!(span, failure)
when 'S'
CI::Test.skipped!(span)
span.set_tag(CI::Ext::Test::TAG_SKIP_REASON, failure.message)
end

span.finish

super
end

private

def configuration
::Datadog.configuration.ci[:minitest]
end
end
end
end
end
end
12 changes: 12 additions & 0 deletions sig/datadog/ci/contrib/minitest/configuration/settings.rbs
Original file line number Diff line number Diff line change
@@ -0,0 +1,12 @@
module Datadog
module CI
module Contrib
module Minitest
module Configuration
class Settings < Datadog::Tracing::Contrib::Configuration::Settings
end
end
end
end
end
end
23 changes: 23 additions & 0 deletions sig/datadog/ci/contrib/minitest/ext.rbs
Original file line number Diff line number Diff line change
@@ -0,0 +1,23 @@
module Datadog
module CI
module Contrib
module Minitest
module Ext
APP: "minitest"

ENV_ENABLED: "DD_TRACE_MINITEST_ENABLED"

ENV_OPERATION_NAME: "DD_TRACE_MINITEST_OPERATION_NAME"

FRAMEWORK: "minitest"

OPERATION_NAME: "minitest.test"

SERVICE_NAME: "minitest"

TEST_TYPE: "test"
end
end
end
end
end
24 changes: 24 additions & 0 deletions sig/datadog/ci/contrib/minitest/integration.rbs
Original file line number Diff line number Diff line change
@@ -0,0 +1,24 @@
module Datadog
module CI
module Contrib
module Minitest
class Integration
include Datadog::Tracing::Contrib::Integration

MINIMUM_VERSION: untyped

def self.version: () -> untyped

def self.loaded?: () -> untyped

def self.compatible?: () -> untyped
def auto_instrument?: () -> false

def new_configuration: () -> untyped

def patcher: () -> untyped
end
end
end
end
end
Loading

0 comments on commit fc78216

Please sign in to comment.