From 083c31cb0eb18dce4f2a46d52b3606a92128230b Mon Sep 17 00:00:00 2001 From: Ivan Topolnjak Date: Tue, 30 Jan 2018 15:29:33 +0100 Subject: turn all Kamon threads into daemon threads, except for reporters, fixes #502 --- .../src/test/scala/kamon/KamonLifecycleSpec.scala | 67 ++++++++++++++++++++++ 1 file changed, 67 insertions(+) create mode 100644 kamon-core-tests/src/test/scala/kamon/KamonLifecycleSpec.scala (limited to 'kamon-core-tests') diff --git a/kamon-core-tests/src/test/scala/kamon/KamonLifecycleSpec.scala b/kamon-core-tests/src/test/scala/kamon/KamonLifecycleSpec.scala new file mode 100644 index 00000000..b5d0425b --- /dev/null +++ b/kamon-core-tests/src/test/scala/kamon/KamonLifecycleSpec.scala @@ -0,0 +1,67 @@ +package kamon + +import java.io.File +import java.util.concurrent.TimeUnit + +import com.typesafe.config.Config +import kamon.metric.PeriodSnapshot +import kamon.trace.Span +import org.scalatest.{Matchers, WordSpec} +import org.scalatest.concurrent.Eventually +import org.scalatest.time.SpanSugar._ + +class KamonLifecycleSpec extends WordSpec with Matchers with Eventually{ + + "the Kamon lifecycle" should { + "keep the JVM running if reporters are running" in { + val process = Runtime.getRuntime.exec(createProcessCommand("kamon.KamonWithRunningReporter")) + Thread.sleep(5000) + process.isAlive shouldBe true + process.destroyForcibly().waitFor(5, TimeUnit.SECONDS) + } + + "let the JVM stop after all reporters are stopped" in { + val process = Runtime.getRuntime.exec(createProcessCommand("kamon.KamonWithTemporaryReporter")) + Thread.sleep(2000) + process.isAlive shouldBe true + + eventually(timeout(7 seconds)) { + process.isAlive shouldBe false + process.exitValue() shouldBe 0 + } + } + } + + + def createProcessCommand(mainClass: String): String = { + System.getProperty("java.home") + File.separator + "bin" + File.separator + "java" + + " -cp " + System.getProperty("java.class.path") + " " + mainClass + } +} + +class DummyMetricReporter extends MetricReporter { + override def start(): Unit = {} + override def stop(): Unit = {} + override def reconfigure(config: Config): Unit = {} + override def reportPeriodSnapshot(snapshot: PeriodSnapshot): Unit = {} +} + +class DummySpanReporter extends SpanReporter { + override def start(): Unit = {} + override def stop(): Unit = {} + override def reconfigure(config: Config): Unit = {} + override def reportSpans(spans: Seq[Span.FinishedSpan]): Unit = {} +} + +object KamonWithRunningReporter extends App { + Kamon.addReporter(new DummyMetricReporter()) + Kamon.addReporter(new DummySpanReporter()) +} + +object KamonWithTemporaryReporter extends App { + Kamon.addReporter(new DummyMetricReporter()) + Kamon.addReporter(new DummySpanReporter()) + + Thread.sleep(5000) + Kamon.stopAllReporters() +} -- cgit v1.2.3