Module: Datadog::CI

Defined in:
lib/datadog/ci.rb,
lib/datadog/ci/span.rb,
lib/datadog/ci/test.rb,
lib/datadog/ci/worker.rb,
lib/datadog/ci/ext/git.rb,
lib/datadog/ci/version.rb,
lib/datadog/ci/ext/test.rb,
lib/datadog/ci/git/user.rb,
lib/datadog/ci/utils/git.rb,
lib/datadog/ci/test_suite.rb,
lib/datadog/ci/test_module.rb,
lib/datadog/ci/ext/settings.rb,
lib/datadog/ci/test_session.rb,
lib/datadog/ci/utils/bundle.rb,
lib/datadog/ci/ext/app_types.rb,
lib/datadog/ci/ext/telemetry.rb,
lib/datadog/ci/ext/transport.rb,
lib/datadog/ci/git/packfiles.rb,
lib/datadog/ci/git/telemetry.rb,
lib/datadog/ci/utils/parsing.rb,
lib/datadog/ci/transport/gzip.rb,
lib/datadog/ci/transport/http.rb,
lib/datadog/ci/utils/test_run.rb,
lib/datadog/ci/codeowners/rule.rb,
lib/datadog/ci/concurrent_span.rb,
lib/datadog/ci/contrib/contrib.rb,
lib/datadog/ci/ext/environment.rb,
lib/datadog/ci/utils/telemetry.rb,
lib/datadog/ci/contrib/settings.rb,
lib/datadog/ci/remote/component.rb,
lib/datadog/ci/codeowners/parser.rb,
lib/datadog/ci/contrib/rspec/ext.rb,
lib/datadog/ci/git/tree_uploader.rb,
lib/datadog/ci/codeowners/matcher.rb,
lib/datadog/ci/git/search_commits.rb,
lib/datadog/ci/transport/api/base.rb,
lib/datadog/ci/contrib/integration.rb,
lib/datadog/ci/git/upload_packfile.rb,
lib/datadog/ci/transport/telemetry.rb,
lib/datadog/ci/utils/configuration.rb,
lib/datadog/ci/contrib/cucumber/ext.rb,
lib/datadog/ci/contrib/minitest/ext.rb,
lib/datadog/ci/contrib/rspec/runner.rb,
lib/datadog/ci/contrib/selenium/ext.rb,
lib/datadog/ci/contrib/selenium/rum.rb,
lib/datadog/ci/git/local_repository.rb,
lib/datadog/ci/contrib/minitest/test.rb,
lib/datadog/ci/contrib/rspec/example.rb,
lib/datadog/ci/contrib/rspec/patcher.rb,
lib/datadog/ci/contrib/simplecov/ext.rb,
lib/datadog/ci/test_visibility/flush.rb,
lib/datadog/ci/transport/api/builder.rb,
lib/datadog/ci/configuration/settings.rb,
lib/datadog/ci/test_retries/component.rb,
lib/datadog/ci/transport/adapters/net.rb,
lib/datadog/ci/contrib/cucumber/filter.rb,
lib/datadog/ci/contrib/minitest/runner.rb,
lib/datadog/ci/contrib/selenium/driver.rb,
lib/datadog/ci/remote/library_settings.rb,
lib/datadog/ci/test_visibility/context.rb,
lib/datadog/ci/transport/api/agentless.rb,
lib/datadog/ci/transport/api/evp_proxy.rb,
lib/datadog/ci/configuration/components.rb,
lib/datadog/ci/configuration/extensions.rb,
lib/datadog/ci/contrib/cucumber/patcher.rb,
lib/datadog/ci/contrib/minitest/helpers.rb,
lib/datadog/ci/contrib/minitest/patcher.rb,
lib/datadog/ci/contrib/selenium/patcher.rb,
lib/datadog/ci/remote/slow_test_retries.rb,
lib/datadog/ci/test_retries/driver/base.rb,
lib/datadog/ci/contrib/minitest/reporter.rb,
lib/datadog/ci/contrib/minitest/runnable.rb,
lib/datadog/ci/contrib/rspec/integration.rb,
lib/datadog/ci/contrib/simplecov/patcher.rb,
lib/datadog/ci/ext/environment/extractor.rb,
lib/datadog/ci/ext/environment/providers.rb,
lib/datadog/ci/test_visibility/component.rb,
lib/datadog/ci/test_visibility/telemetry.rb,
lib/datadog/ci/test_visibility/transport.rb,
lib/datadog/ci/contrib/cucumber/formatter.rb,
lib/datadog/ci/test_retries/strategy/base.rb,
lib/datadog/ci/contrib/rspec/example_group.rb,
lib/datadog/ci/contrib/selenium/navigation.rb,
lib/datadog/ci/test_optimisation/component.rb,
lib/datadog/ci/test_optimisation/skippable.rb,
lib/datadog/ci/test_optimisation/telemetry.rb,
lib/datadog/ci/test_retries/null_component.rb,
lib/datadog/ci/test_visibility/store/local.rb,
lib/datadog/ci/contrib/cucumber/integration.rb,
lib/datadog/ci/contrib/minitest/integration.rb,
lib/datadog/ci/contrib/selenium/integration.rb,
lib/datadog/ci/test_retries/driver/no_retry.rb,
lib/datadog/ci/test_visibility/store/global.rb,
lib/datadog/ci/contrib/simplecov/integration.rb,
lib/datadog/ci/test_retries/driver/retry_new.rb,
lib/datadog/ci/ext/environment/providers/base.rb,
lib/datadog/ci/remote/library_settings_client.rb,
lib/datadog/ci/test_retries/strategy/no_retry.rb,
lib/datadog/ci/test_visibility/null_component.rb,
lib/datadog/ci/test_visibility/total_coverage.rb,
lib/datadog/ci/ext/environment/providers/azure.rb,
lib/datadog/ci/ext/environment/providers/buddy.rb,
lib/datadog/ci/test_retries/strategy/retry_new.rb,
lib/datadog/ci/contrib/cucumber/instrumentation.rb,
lib/datadog/ci/contrib/selenium/capybara_driver.rb,
lib/datadog/ci/ext/environment/providers/gitlab.rb,
lib/datadog/ci/ext/environment/providers/travis.rb,
lib/datadog/ci/test_optimisation/coverage/ddcov.rb,
lib/datadog/ci/test_optimisation/coverage/event.rb,
lib/datadog/ci/test_retries/driver/retry_failed.rb,
lib/datadog/ci/test_retries/unique_tests_client.rb,
lib/datadog/ci/test_visibility/serializers/base.rb,
lib/datadog/ci/test_visibility/serializers/span.rb,
lib/datadog/ci/contrib/rspec/knapsack_pro/runner.rb,
lib/datadog/ci/ext/environment/providers/bitrise.rb,
lib/datadog/ci/ext/environment/providers/jenkins.rb,
lib/datadog/ci/test_optimisation/coverage/writer.rb,
lib/datadog/ci/contrib/rspec/knapsack_pro/patcher.rb,
lib/datadog/ci/contrib/simplecov/result_extractor.rb,
lib/datadog/ci/ext/environment/providers/appveyor.rb,
lib/datadog/ci/ext/environment/providers/circleci.rb,
lib/datadog/ci/ext/environment/providers/teamcity.rb,
lib/datadog/ci/test_retries/strategy/retry_failed.rb,
lib/datadog/ci/transport/adapters/net_http_client.rb,
lib/datadog/ci/transport/event_platform_transport.rb,
lib/datadog/ci/ext/environment/providers/bitbucket.rb,
lib/datadog/ci/ext/environment/providers/buildkite.rb,
lib/datadog/ci/ext/environment/providers/codefresh.rb,
lib/datadog/ci/ext/environment/providers/local_git.rb,
lib/datadog/ci/test_visibility/serializers/test_v1.rb,
lib/datadog/ci/test_visibility/serializers/test_v2.rb,
lib/datadog/ci/contrib/rspec/configuration/settings.rb,
lib/datadog/ci/contrib/rspec/knapsack_pro/extension.rb,
lib/datadog/ci/test_optimisation/coverage/transport.rb,
lib/datadog/ci/test_visibility/serializers/test_suite.rb,
lib/datadog/ci/contrib/cucumber/configuration/settings.rb,
lib/datadog/ci/contrib/minitest/configuration/settings.rb,
lib/datadog/ci/contrib/selenium/configuration/settings.rb,
lib/datadog/ci/test_visibility/serializers/test_module.rb,
lib/datadog/ci/contrib/simplecov/configuration/settings.rb,
lib/datadog/ci/ext/environment/providers/github_actions.rb,
lib/datadog/ci/test_visibility/serializers/test_session.rb,
lib/datadog/ci/ext/environment/providers/aws_code_pipeline.rb,
lib/datadog/ci/ext/environment/providers/user_defined_tags.rb,
lib/datadog/ci/test_visibility/serializers/factories/test_level.rb,
lib/datadog/ci/transport/adapters/telemetry_webmock_safe_adapter.rb,
lib/datadog/ci/test_visibility/serializers/factories/test_suite_level.rb,
ext/datadog_cov/datadog_cov.c

Overview

Datadog CI visibility public API.

Defined Under Namespace

Modules: Contrib, Ext Classes: ConcurrentSpan, Span, Test, TestModule, TestSession, TestSuite

Class Method Summary collapse

Class Method Details

.active_spanDatadog::CI::Span?

The active, unfinished custom (i.e. not test/suite/module/session) span. If no span is active, or if the active span is not a custom span, returns nil.

The active span belongs to an active_test.

Usage:

# start span
Datadog::CI.trace(
  "Given I have 42 cucumbers",
  type: "step",
  tags: {}
)

# somewhere else, access the active step span
step_span = Datadog::CI.active_span
step_span.finish()

Returns:

  • (Datadog::CI::Span)

    the active span

  • (nil)

    if no span is active, or if the active span is not a custom span



361
362
363
364
# File 'lib/datadog/ci.rb', line 361

def active_span
  span = test_visibility.active_span
  span if span && !Ext::AppTypes::CI_SPAN_TYPES.include?(span.type)
end

.active_testDatadog::CI::Test?

The active, unfinished test span.

Usage:

# start a test
Datadog::CI.start_test(
  "test_add_two_numbers",
  "calculator_tests",
  service: "my-web-site-tests",
  tags: { Datadog::CI::Ext::Test::TAG_FRAMEWORK => "my-test-framework" }
)

# somewhere else, access the active test
test_span = Datadog::CI.active_test
test_span.passed!
test_span.finish

Returns:



387
388
389
# File 'lib/datadog/ci.rb', line 387

def active_test
  test_visibility.active_test
end

.active_test_moduleDatadog::CI::TestModule?

The active, unfinished test module.

Usage:

# start a test module
Datadog::CI.start_test_module(
  "my-module",
  service: "my-web-site-tests",
  tags: { Datadog::CI::Ext::Test::TAG_FRAMEWORK => "my-test-framework" }
)

# somewhere else, access the current module
test_module = Datadog::CI.active_test_module
test_module.finish

Returns:



134
135
136
# File 'lib/datadog/ci.rb', line 134

def active_test_module
  test_visibility.active_test_module
end

.active_test_sessionDatadog::CI::TestSession?

The active, unfinished test session.

Usage:

# start a test session
Datadog::CI.start_test_session(
  service: "my-web-site-tests",
  tags: { Datadog::CI::Ext::Test::TAG_FRAMEWORK => "my-test-framework" }
)

# somewhere else, access the session
test_session = Datadog::CI.active_test_session
test_session.finish

Returns:



73
74
75
# File 'lib/datadog/ci.rb', line 73

def active_test_session
  test_visibility.active_test_session
end

.active_test_suite(test_suite_name) ⇒ Datadog::CI::TestSuite?

The active, unfinished test suite.

Usage:

# start a test suite
Datadog::CI.start_test_suite(
  "calculator_tests",
  service: "my-web-site-tests",
  tags: { Datadog::CI::Ext::Test::TAG_FRAMEWORK => "my-test-framework" }
)

# Somewhere else after the suite has ended
test_suite = Datadog::CI.active_test_suite("calculator_tests")
test_suite.finish

Returns:



192
193
194
# File 'lib/datadog/ci.rb', line 192

def active_test_suite(test_suite_name)
  test_visibility.active_test_suite(test_suite_name)
end

.start_test(test_name, test_suite_name, service: nil, tags: {}) ⇒ Datadog::CI::Test?

Same as trace_test but it does not accept a block. Raises an error if a test is already active.

Usage:

ci_test = Datadog::CI.start_test(
  "test_add_two_numbers",
  "calculator_tests",
  service: "my-web-site-tests",
  tags: { Datadog::CI::Ext::Test::TAG_FRAMEWORK => "my-test-framework" }
)
# ... run test here ...
ci_test.finish

Parameters:

  • test_name (String)

    Test name (example: "test_add_two_numbers").

  • test_suite_name (String)

    name of test suite this test belongs to (example: "CalculatorTest").

  • service (String) (defaults to: nil)

    the service name for this span (optional, inherited from test session if not provided)

  • tags (Hash<String,String>) (defaults to: {})

    extra tags which should be added to the test.

Returns:



278
279
280
281
282
283
284
285
# File 'lib/datadog/ci.rb', line 278

def start_test(test_name, test_suite_name, service: nil, tags: {})
  Utils::Telemetry.inc(
    Ext::Telemetry::METRIC_MANUAL_API_EVENTS,
    1,
    {Ext::Telemetry::TAG_EVENT_TYPE => Ext::Telemetry::EventType::TEST}
  )
  test_visibility.trace_test(test_name, test_suite_name, service: service, tags: tags)
end

.start_test_module(test_module_name, service: nil, tags: {}) ⇒ Datadog::CI::TestModule?

Starts a ci_test_module that represents a single test module (for most Ruby test frameworks module will correspond 1-1 to the test session).

Read Datadog documentation on test modules here.

Returns the existing test session if one is already active. There is at most a single test module per process active at any given time.

The start_test_module method is used to mark the start of the test session:

Datadog::CI.start_test_module(
  "my-module",
  service: "my-web-site-tests",
  tags: { Datadog::CI::Ext::Test::TAG_FRAMEWORK => "my-test-framework" }
)

# Somewhere else after the module has ended
Datadog::CI.active_test_module.finish

Remember that calling Datadog::CI::TestModule#finish is mandatory.

Parameters:

  • test_module_name (String)

    the name for this module

  • service (String) (defaults to: nil)

    the service name for this session (optional, inherited from test session if not provided)

  • tags (Hash<String,String>) (defaults to: {})

    extra tags which should be added to the test module (optional, some tags are inherited from test session).

Returns:



105
106
107
108
109
110
111
112
113
# File 'lib/datadog/ci.rb', line 105

def start_test_module(test_module_name, service: nil, tags: {})
  Utils::Telemetry.inc(
    Ext::Telemetry::METRIC_MANUAL_API_EVENTS,
    1,
    {Ext::Telemetry::TAG_EVENT_TYPE => Ext::Telemetry::EventType::MODULE}
  )

  test_visibility.start_test_module(test_module_name, service: service, tags: tags)
end

.start_test_session(service: Utils::Configuration.fetch_service_name("test"), tags: {}, total_tests_count: 0) ⇒ Datadog::CI::TestSession?

Starts a ci_test_session that represents the whole test session run.

Read Datadog documentation on test sessions here.

Returns the existing test session if one is already active. There is at most a single test session per process.

The start_test_session method is used to mark the start of the test session:

Datadog::CI.start_test_session(
  service: "my-web-site-tests",
  tags: { Datadog::CI::Ext::Test::TAG_FRAMEWORK => "my-test-framework" },
  total_tests_count: 100
)

# Somewhere else after test run has ended
Datadog::CI.active_test_session.finish

Remember that calling Datadog::CI::TestSession#finish is mandatory.

Parameters:

  • service (String) (defaults to: Utils::Configuration.fetch_service_name("test"))

    the service name for this session (optional, defaults to DD_SERVICE or repository name)

  • tags (Hash<String,String>) (defaults to: {})

    extra tags which should be added to the test session.

  • total_tests_count (Integer) (defaults to: 0)

    the total number of tests in the test session (optional, defaults to 0) - it is used to limit the number of new tests retried within session if early flake detection is enabled

Returns:



46
47
48
49
50
51
52
53
# File 'lib/datadog/ci.rb', line 46

def start_test_session(service: Utils::Configuration.fetch_service_name("test"), tags: {}, total_tests_count: 0)
  Utils::Telemetry.inc(
    Ext::Telemetry::METRIC_MANUAL_API_EVENTS,
    1,
    {Ext::Telemetry::TAG_EVENT_TYPE => Ext::Telemetry::EventType::SESSION}
  )
  test_visibility.start_test_session(service: service, tags: tags, total_tests_count: total_tests_count)
end

.start_test_suite(test_suite_name, service: nil, tags: {}) ⇒ Datadog::CI::TestSuite?

Starts a ci_test_suite that represents a single test suite. If a test suite with given name is running, returns the existing test suite.

Read Datadog documentation on test suites here.

The start_test_suite method is used to mark the start of a test suite:

Datadog::CI.start_test_suite(
  "calculator_tests",
  service: "my-web-site-tests",
  tags: { Datadog::CI::Ext::Test::TAG_FRAMEWORK => "my-test-framework" }
)

# Somewhere else after the suite has ended
Datadog::CI.active_test_suite("calculator_tests").finish

Remember that calling Datadog::CI::TestSuite#finish is mandatory.

Parameters:

  • test_suite_name (String)

    the name of the test suite

  • service (String) (defaults to: nil)

    the service name for this test suite (optional, inherited from test session if not provided)

  • tags (Hash<String,String>) (defaults to: {})

    extra tags which should be added to the test module (optional, some tags are inherited from test session)

Returns:



163
164
165
166
167
168
169
170
171
# File 'lib/datadog/ci.rb', line 163

def start_test_suite(test_suite_name, service: nil, tags: {})
  Utils::Telemetry.inc(
    Ext::Telemetry::METRIC_MANUAL_API_EVENTS,
    1,
    {Ext::Telemetry::TAG_EVENT_TYPE => Ext::Telemetry::EventType::SUITE}
  )

  test_visibility.start_test_suite(test_suite_name, service: service, tags: tags)
end

.trace(span_name, type: "span", tags: {}) {|ci_span, ci_span| ... } ⇒ Object, ...

Trace any custom span inside a test. For example, you could trace:

  • cucumber step
  • database query
  • any custom operation you want to see in your trace view

You can use this method with a do-block like:

Datadog::CI.trace(
  "Given I have 42 cucumbers",
  type: "step",
  tags: {}
) do
  run_operation
end

The trace method can also be used without a block in this way:

ci_span = Datadog::CI.trace(
  "Given I have 42 cucumbers",
  type: "step",
  tags: {}
)
# ... run test here ...
ci_span.finish

Remember that in this case, calling Datadog::CI::Span#finish is mandatory.

Parameters:

  • span_name (String)

    the resource this span refers, or test if it's missing

  • type (String) (defaults to: "span")

    custom, user-defined span type (for example "step" or "query").

  • tags (Hash<String,String>) (defaults to: {})

    extra tags which should be added to the span.

Yields:

  • Optional block where newly created Span captures the execution.

Yield Parameters:

  • ci_span (Datadog::CI::Span)

    the newly created and active [Datadog::CI::Span]

  • ci_span (nil)

    if CI visibility is disabled

Returns:

  • (Object)

    If a block is provided, returns the result of the block execution.

  • (Datadog::CI::Span)

    If no block is provided, returns the active, unfinished Span.

  • (nil)

    if CI visibility is disabled

Raises:

  • (ReservedTypeError)

    if provided type is reserved for Datadog CI visibility



327
328
329
330
331
332
333
334
335
336
337
# File 'lib/datadog/ci.rb', line 327

def trace(span_name, type: "span", tags: {}, &block)
  if Ext::AppTypes::CI_SPAN_TYPES.include?(type)
    raise(
      ReservedTypeError,
      "Span type #{type} is reserved for Datadog CI visibility. " \
        "Reserved types are: #{Ext::AppTypes::CI_SPAN_TYPES}"
    )
  end

  test_visibility.trace(span_name, type: type, tags: tags, &block)
end

.trace_test(test_name, test_suite_name, service: nil, tags: {}) {|ci_test, if| ... } ⇒ Object, ...

Return a ci_test that will trace a test called test_name. Raises an error if a test is already active. If there is an active test session, the new test will be connected to the session. The test will inherit service name and tags from the running test session if not provided in parameters.

You could trace your test using a do-block like:

Datadog::CI.trace_test(
  "test_add_two_numbers",
  "calculator_tests",
  service: "my-web-site-tests",
  tags: { Datadog::CI::Ext::Test::TAG_FRAMEWORK => "my-test-framework" }
) do |ci_test|
  result = run_test

  if result.ok?
    ci_test.passed!
  else
    ci_test.failed!(exception: result.exception)
  end
end

The trace_test method can also be used without a block in this way:

ci_test = Datadog::CI.trace_test(
  "test_add_two_numbers",
  "calculator_tests",
  service: "my-web-site-tests",
  tags: { Datadog::CI::Ext::Test::TAG_FRAMEWORK => "my-test-framework" }
)
# ... run test here ...
ci_test.finish

Remember that in this case, calling Datadog::CI::Test#finish is mandatory.

Parameters:

  • test_name (String)

    Test name (example: "test_add_two_numbers").

  • test_suite_name (String)

    name of test suite this test belongs to (example: "CalculatorTest").

  • service (String) (defaults to: nil)

    the service name for this test (optional, inherited from test session if not provided)

  • tags (Hash<String,String>) (defaults to: {})

    extra tags which should be added to the test.

Yields:

  • Optional block where newly created Test captures the execution.

Yield Parameters:

  • ci_test (Datadog::CI::Test)

    the newly created and active [Datadog::CI::Test]

  • if (nil)

    CI mode is disabled

Returns:

  • (Object)

    If a block is provided, returns the result of the block execution.

  • (Datadog::CI::Test)

    If no block is provided, returns the active, unfinished Test.

  • (nil)

    if no block is provided and CI mode is disabled.



246
247
248
249
250
251
252
253
254
# File 'lib/datadog/ci.rb', line 246

def trace_test(test_name, test_suite_name, service: nil, tags: {}, &block)
  Utils::Telemetry.inc(
    Ext::Telemetry::METRIC_MANUAL_API_EVENTS,
    1,
    {Ext::Telemetry::TAG_EVENT_TYPE => Ext::Telemetry::EventType::TEST}
  )

  test_visibility.trace_test(test_name, test_suite_name, service: service, tags: tags, &block)
end