Skip to content

Tests failing with timeout in ScalaTest not reported to DataDog #8435

Description

@mwisnicki

Tracer Version(s)

1.46.1~8e0205904b

Java Version(s)

11.0.26

JVM Vendor

Amazon Corretto

Bug Report

My Scala + Slick + ScalaTest tests are timing out due to connection timeout and none of this is captured by DataDog.

Other tests and typical failures work fine.

I'm using github action to integrate with DD:

 - name: Configure Datadog Test Optimizationif: ${{ inputs.upload-to-datadog == 'true' }}uses: datadog/test-visibility-github-action@v2with:
languages: javaapi_key: ${{ inputs.datadog-api-key }}service: ${{ env.DD_SERVICE }}

Here's a stack reported after each failed test:

stack reported after each failed test
Reporter completed abruptly with an exception after receiving event: TestFailed(Ordinal(0, 381),redshift - Connection is not available, request timed out after 30000ms.,MapperSpec,com.evenfinancial.slick.mapper.MapperSpec,Some(com.evenfinancial.slick.mapper.MapperSpec),Redshift when Instant when Database NOW(),Database NOW(),Vector(),Vector(),Some(java.sql.SQLTransientConnectionException: redshift - Connection is not available, request timed out after 30000ms.),Some(30001),Some(IndentedText( - when Database NOW(),when Database NOW(),2)),Some(SeeStackDepthException),Some(com.evenfinancial.slick.mapper.MapperSpec),None,pool-9-thread-13-ScalaTest-running-MapperSpec,1740166061118).
java.lang.IllegalStateException: No active scope present, it is possible that end() was called multiple times
at datadog.trace.civisibility.domain.TestImpl.end(TestImpl.java:225)
at datadog.trace.civisibility.events.TestEventsHandlerImpl.onTestFinish(TestEventsHandlerImpl.java:236)
at datadog.trace.instrumentation.scalatest.DatadogReporter.onTestFailure(DatadogReporter.java:192)
at datadog.trace.instrumentation.scalatest.DatadogReporter.handle(DatadogReporter.java:64)
at org.scalatest.DispatchReporter.apply(DispatchReporter.scala:300)
at org.scalatest.tools.SuiteSortingReporter.handleTestEvents(SuiteSortingReporter.scala:161)
at org.scalatest.tools.SuiteSortingReporter.doApply(SuiteSortingReporter.scala:80)
at org.scalatest.CatchReporter.apply(CatchReporter.scala:36)
at org.scalatest.CatchReporter.apply$(CatchReporter.scala:34)
at org.scalatest.tools.SuiteSortingReporter.apply(SuiteSortingReporter.scala:26)
at org.scalatest.tools.Framework$SbtReporter.apply(Framework.scala:1165)
at org.scalatest.WrapperCatchReporter.doApply(CatchReporter.scala:70)
at org.scalatest.CatchReporter.apply(CatchReporter.scala:36)
at org.scalatest.CatchReporter.apply$(CatchReporter.scala:34)
at org.scalatest.WrapperCatchReporter.apply(CatchReporter.scala:63)
at org.scalatest.tools.TestSortingReporter.handleTestCompleted(TestSortingReporter.scala:208)
at org.scalatest.tools.TestSortingReporter.doApply(TestSortingReporter.scala:155)
at org.scalatest.CatchReporter.apply(CatchReporter.scala:36)
at org.scalatest.CatchReporter.apply$(CatchReporter.scala:34)
at org.scalatest.tools.TestSortingReporter.apply(TestSortingReporter.scala:28)
at org.scalatest.Suite$.reportTestFailed(Suite.scala:1635)
at org.scalatest.AsyncSuperEngine.$anonfun$runTestImpl$6(AsyncEngine.scala:321)
at org.scalatest.AsyncSuperEngine.$anonfun$runTestImpl$6$adapted(AsyncEngine.scala:294)
at org.scalatest.FutureAsyncOutcome.$anonfun$new$1(AsyncOutcome.scala:40)
at org.scalatest.FutureAsyncOutcome.$anonfun$new$1$adapted(AsyncOutcome.scala:39)
at scala.concurrent.impl.CallbackRunnable.run(Promise.scala:64)
at org.scalatest.concurrent.SerialExecutionContext.recRunNow(SerialExecutionContext.scala:120)
at org.scalatest.concurrent.SerialExecutionContext.runNow(SerialExecutionContext.scala:111)
at org.scalatest.AsyncSuperEngine.runTestImpl(AsyncEngine.scala:377)
at org.scalatest.wordspec.AsyncWordSpecLike.runTest(AsyncWordSpecLike.scala:1073)
at org.scalatest.wordspec.AsyncWordSpecLike.runTest$(AsyncWordSpecLike.scala:1053)
at org.scalatest.wordspec.AsyncWordSpec.runTest(AsyncWordSpec.scala:2296)
at org.scalatest.wordspec.AsyncWordSpecLike.$anonfun$runTests$1(AsyncWordSpecLike.scala:1132)
at org.scalatest.AsyncSuperEngine.$anonfun$runTestsInBranch$3(AsyncEngine.scala:435)
at org.scalatest.Status.$anonfun$thenRun$1(Status.scala:227)
at org.scalatest.Status.$anonfun$thenRun$1$adapted(Status.scala:225)
at org.scalatest.ScalaTestStatefulStatus.whenCompleted(Status.scala:648)
at org.scalatest.Status.thenRun(Status.scala:225)
at org.scalatest.Status.thenRun$(Status.scala:220)
at org.scalatest.ScalaTestStatefulStatus.thenRun(Status.scala:511)
at org.scalatest.AsyncSuperEngine.$anonfun$runTestsInBranch$1(AsyncEngine.scala:435)
at scala.collection.LinearSeqOptimized.foldLeft(LinearSeqOptimized.scala:126)
at scala.collection.LinearSeqOptimized.foldLeft$(LinearSeqOptimized.scala:122)
at scala.collection.immutable.List.foldLeft(List.scala:91)
at org.scalatest.AsyncSuperEngine.traverseSubNodes$1(AsyncEngine.scala:406)
at org.scalatest.AsyncSuperEngine.runTestsInBranch(AsyncEngine.scala:479)
at org.scalatest.AsyncSuperEngine.$anonfun$runTestsInBranch$4(AsyncEngine.scala:463)
at org.scalatest.Status.$anonfun$thenRun$1(Status.scala:227)
at org.scalatest.Status.$anonfun$thenRun$1$adapted(Status.scala:225)
at org.scalatest.ScalaTestStatefulStatus.whenCompleted(Status.scala:648)
at org.scalatest.Status.thenRun(Status.scala:225)
at org.scalatest.Status.thenRun$(Status.scala:220)
at org.scalatest.ScalaTestStatefulStatus.thenRun(Status.scala:511)
at org.scalatest.AsyncSuperEngine.$anonfun$runTestsInBranch$1(AsyncEngine.scala:463)
at scala.collection.LinearSeqOptimized.foldLeft(LinearSeqOptimized.scala:126)
at scala.collection.LinearSeqOptimized.foldLeft$(LinearSeqOptimized.scala:122)
at scala.collection.immutable.List.foldLeft(List.scala:91)
at org.scalatest.AsyncSuperEngine.traverseSubNodes$1(AsyncEngine.scala:406)
at org.scalatest.AsyncSuperEngine.runTestsInBranch(AsyncEngine.scala:479)
at org.scalatest.AsyncSuperEngine.$anonfun$runTestsInBranch$4(AsyncEngine.scala:463)
at org.scalatest.Status.$anonfun$thenRun$1(Status.scala:227)
at org.scalatest.Status.$anonfun$thenRun$1$adapted(Status.scala:225)
at org.scalatest.ScalaTestStatefulStatus.whenCompleted(Status.scala:648)
at org.scalatest.Status.thenRun(Status.scala:225)
at org.scalatest.Status.thenRun$(Status.scala:220)
at org.scalatest.ScalaTestStatefulStatus.thenRun(Status.scala:511)
at org.scalatest.AsyncSuperEngine.$anonfun$runTestsInBranch$1(AsyncEngine.scala:463)
at scala.collection.LinearSeqOptimized.foldLeft(LinearSeqOptimized.scala:126)
at scala.collection.LinearSeqOptimized.foldLeft$(LinearSeqOptimized.scala:122)
at scala.collection.immutable.List.foldLeft(List.scala:91)
at org.scalatest.AsyncSuperEngine.traverseSubNodes$1(AsyncEngine.scala:406)
at org.scalatest.AsyncSuperEngine.runTestsInBranch(AsyncEngine.scala:487)
at org.scalatest.AsyncSuperEngine.runTestsImpl(AsyncEngine.scala:555)
at org.scalatest.wordspec.AsyncWordSpecLike.runTests(AsyncWordSpecLike.scala:1132)
at org.scalatest.wordspec.AsyncWordSpecLike.runTests$(AsyncWordSpecLike.scala:1131)
at org.scalatest.wordspec.AsyncWordSpec.runTests(AsyncWordSpec.scala:2296)
at org.scalatest.Suite.run(Suite.scala:1112)
at org.scalatest.Suite.run$(Suite.scala:1094)
at org.scalatest.wordspec.AsyncWordSpec.org$scalatest$wordspec$AsyncWordSpecLike$$super$run(AsyncWordSpec.scala:2296)
at org.scalatest.wordspec.AsyncWordSpecLike.$anonfun$run$1(AsyncWordSpecLike.scala:1177)
at org.scalatest.AsyncSuperEngine.runImpl(AsyncEngine.scala:625)
at org.scalatest.wordspec.AsyncWordSpecLike.run(AsyncWordSpecLike.scala:1177)
at org.scalatest.wordspec.AsyncWordSpecLike.run$(AsyncWordSpecLike.scala:1175)
at org.scalatest.wordspec.AsyncWordSpec.run(AsyncWordSpec.scala:2296)
at org.scalatest.tools.Framework.org$scalatest$tools$Framework$$runSuite(Framework.scala:318)
at org.scalatest.tools.Framework$ScalaTestTask.execute(Framework.scala:513)
at sbt.TestRunner.runTest$1(TestFramework.scala:140)
at sbt.TestRunner.run(TestFramework.scala:155)
at sbt.TestFramework$$anon$3$$anonfun$$lessinit$greater$1.$anonfun$apply$1(TestFramework.scala:318)
at sbt.TestFramework$.sbt$TestFramework$$withContextLoader(TestFramework.scala:278)
at sbt.TestFramework$$anon$3$$anonfun$$lessinit$greater$1.apply(TestFramework.scala:318)
at sbt.TestFramework$$anon$3$$anonfun$$lessinit$greater$1.apply(TestFramework.scala:318)
at sbt.TestFunction.apply(TestFramework.scala:330)
at sbt.Tests$.processRunnable$1(Tests.scala:474)
at sbt.Tests$.$anonfun$makeSerial$1(Tests.scala:480)
at sbt.std.Transform$$anon$3.$anonfun$apply$2(Transform.scala:46)
at sbt.std.Transform$$anon$4.work(Transform.scala:68)
at sbt.Execute.$anonfun$submit$2(Execute.scala:282)
at sbt.internal.util.ErrorHandling$.wideConvert(ErrorHandling.scala:23)
at sbt.Execute.work(Execute.scala:291)
at sbt.Execute.$anonfun$submit$1(Execute.scala:282)
at sbt.ConcurrentRestrictions$$anon$4.$anonfun$submitValid$1(ConcurrentRestrictions.scala:265)
at sbt.CompletionService$$anon$2.call(CompletionService.scala:64)
at java.base/java.util.concurrent.FutureTask.run(FutureTask.java:264)
at java.base/java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:515)
at java.base/java.util.concurrent.FutureTask.run(FutureTask.java:264)
at java.base/java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1128)
at java.base/java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:628)
at java.base/java.lang.Thread.run(Thread.java:829)

Expected Behavior

All test failures are uploaded

Reproduction Code

WIP. Trying to minimize the problem.

Details
importcom.github.tminglei.slickpg.ExPostgresProfileimportcom.typesafe.config.ConfigFactoryimportorg.scalatest.matchers.must.Matchers._importorg.scalatest.wordspec.AsyncWordSpecimportslick.basic.DatabaseConfigimportscala.concurrent.FutureclassMapperSpecextendsAsyncWordSpec {
importExPostgresProfile.api._classTests(dbConfig: DatabaseConfig[ExPostgresProfile]) {
defrunDb[R](dbio: DBIO[R]):Future[R] = dbConfig.db.run(dbio)
"UUID" in {
runDb(sql"SELECT 1".as[Int].head).map(_ mustEqual 1)
}
}
"Redshift" when (buildRedshift() match {
caseSome(dbConfig) =>newTests(dbConfig):Unitcase _ =>"no connection" ignore fail
})
defbuildRedshift() = sys.env.get("REDSHIFT_TEST_PASSWORD") map { _ =>DatabaseConfig.forConfig[ExPostgresProfile](
"redshiftConfig",
ConfigFactory
.parseString(""" |redshiftConfig { | profile = "com.github.tminglei.slickpg.ExPostgresProfile$" | db { | url = "jdbc:redshift://REPLACE_WITH_VALID/foo" | user = ${REDSHIFT_TEST_USER} | password = ${REDSHIFT_TEST_PASSWORD} | driver = com.amazon.redshift.jdbc.Driver | numThreads = 10 | maxConnections = 10 | keepAliveConnection = false | poolName = "redshift" | } |} |""".stripMargin)
.resolveWith(ConfigFactory.systemEnvironment()),
)
}
}

Metadata

Metadata

Type

No type

Projects

No projects

Milestone

Relationships

None yet

Development

No branches or pull requests

Issue actions