diff --git a/configuration/src/main/kotlin/com/malinskiy/marathon/config/AnalyticsConfiguration.kt b/configuration/src/main/kotlin/com/malinskiy/marathon/config/AnalyticsConfiguration.kt index fa10baa2e..82df2c6fa 100644 --- a/configuration/src/main/kotlin/com/malinskiy/marathon/config/AnalyticsConfiguration.kt +++ b/configuration/src/main/kotlin/com/malinskiy/marathon/config/AnalyticsConfiguration.kt @@ -24,6 +24,7 @@ sealed class AnalyticsConfiguration { val dbName: String, val retentionPolicyConfiguration: RetentionPolicyConfiguration, val defaults: Defaults = Defaults(), + val readOnly: Boolean = false, ) : AnalyticsConfiguration() { data class RetentionPolicyConfiguration( val name: String, @@ -52,6 +53,7 @@ sealed class AnalyticsConfiguration { val bucket: String, val retentionPolicyConfiguration: RetentionPolicyConfiguration = RetentionPolicyConfiguration.default, val defaults: Defaults = Defaults(), + val readOnly: Boolean = false, ) : AnalyticsConfiguration() { data class RetentionPolicyConfiguration( val everySeconds: Int, @@ -74,5 +76,6 @@ sealed class AnalyticsConfiguration { val port: Int?, val prefix: String?, val defaults: Defaults = Defaults(), + val readOnly: Boolean = false, ) : AnalyticsConfiguration() } diff --git a/core/src/integrationTest/kotlin/com/malinskiy/marathon/analytics/metrics/remote/graphite/GraphiteMetricsProviderIntegrationTest.kt b/core/src/integrationTest/kotlin/com/malinskiy/marathon/analytics/metrics/remote/graphite/GraphiteMetricsProviderIntegrationTest.kt index a79668c5a..01ebbca1b 100644 --- a/core/src/integrationTest/kotlin/com/malinskiy/marathon/analytics/metrics/remote/graphite/GraphiteMetricsProviderIntegrationTest.kt +++ b/core/src/integrationTest/kotlin/com/malinskiy/marathon/analytics/metrics/remote/graphite/GraphiteMetricsProviderIntegrationTest.kt @@ -28,7 +28,7 @@ class GraphiteMetricsProviderIntegrationTest : BaseMetricsProviderIntegrationTes @JvmStatic fun `start container and prepare data`() { container.start() - val tracker = GraphiteTracker(BasicGraphiteClient(host, container.getMappedPort(port), prefix)) + val tracker = GraphiteTracker(BasicGraphiteClient(host, container.getMappedPort(port), prefix), readOnly = false) getTestEvents().forEach { tracker.track(it) } // Graphite needs a couple of seconds to process the data. There's no way to wait for it in a more intelligent manner. Thread.sleep(5_000) diff --git a/core/src/integrationTest/kotlin/com/malinskiy/marathon/analytics/metrics/remote/influx/InfluxDbProviderIntegrationTest.kt b/core/src/integrationTest/kotlin/com/malinskiy/marathon/analytics/metrics/remote/influx/InfluxDbProviderIntegrationTest.kt index 993823fb9..1b501ce12 100644 --- a/core/src/integrationTest/kotlin/com/malinskiy/marathon/analytics/metrics/remote/influx/InfluxDbProviderIntegrationTest.kt +++ b/core/src/integrationTest/kotlin/com/malinskiy/marathon/analytics/metrics/remote/influx/InfluxDbProviderIntegrationTest.kt @@ -52,7 +52,7 @@ class InfluxDbProviderIntegrationTest { val secondDbInstance = provider.createDb() - val tracker = InfluxDbTracker(secondDbInstance, database, rpName) + val tracker = InfluxDbTracker(secondDbInstance, database, rpName, readOnly = false) getTestEvents().forEach { tracker.track(it) } secondDbInstance.close() diff --git a/core/src/integrationTest/kotlin/com/malinskiy/marathon/analytics/metrics/remote/influx/InfluxMetricsProviderIntegrationTest.kt b/core/src/integrationTest/kotlin/com/malinskiy/marathon/analytics/metrics/remote/influx/InfluxMetricsProviderIntegrationTest.kt index d82302187..f6927e03b 100644 --- a/core/src/integrationTest/kotlin/com/malinskiy/marathon/analytics/metrics/remote/influx/InfluxMetricsProviderIntegrationTest.kt +++ b/core/src/integrationTest/kotlin/com/malinskiy/marathon/analytics/metrics/remote/influx/InfluxMetricsProviderIntegrationTest.kt @@ -35,7 +35,7 @@ class InfluxMetricsProviderIntegrationTest : BaseMetricsProviderIntegrationTest( @JvmStatic fun `start influx and insert test data`() { container.start() - val tracker = InfluxDbTracker(influxDb, dbName, rpName) + val tracker = InfluxDbTracker(influxDb, dbName, rpName, readOnly = false) getTestEvents().forEach { tracker.track(it) } influxDb.flush() } diff --git a/core/src/integrationTest/kotlin/com/malinskiy/marathon/analytics/metrics/remote/influx2/Influx2MetricsProviderIntegrationTest.kt b/core/src/integrationTest/kotlin/com/malinskiy/marathon/analytics/metrics/remote/influx2/Influx2MetricsProviderIntegrationTest.kt index 525aef65e..8f6098549 100644 --- a/core/src/integrationTest/kotlin/com/malinskiy/marathon/analytics/metrics/remote/influx2/Influx2MetricsProviderIntegrationTest.kt +++ b/core/src/integrationTest/kotlin/com/malinskiy/marathon/analytics/metrics/remote/influx2/Influx2MetricsProviderIntegrationTest.kt @@ -41,7 +41,7 @@ class Influx2MetricsProviderIntegrationTest : BaseMetricsProviderIntegrationTest @JvmStatic fun `start influx and insert test data`() { container.start() - val tracker = InfluxDb2Tracker(influxDb) + val tracker = InfluxDb2Tracker(influxDb, readOnly = false) getTestEvents().forEach { tracker.track(it) } } diff --git a/core/src/integrationTest/kotlin/com/malinskiy/marathon/analytics/metrics/remote/influx2/InfluxDb2ProviderIntegrationTest.kt b/core/src/integrationTest/kotlin/com/malinskiy/marathon/analytics/metrics/remote/influx2/InfluxDb2ProviderIntegrationTest.kt index 3b292b7eb..97887d048 100644 --- a/core/src/integrationTest/kotlin/com/malinskiy/marathon/analytics/metrics/remote/influx2/InfluxDb2ProviderIntegrationTest.kt +++ b/core/src/integrationTest/kotlin/com/malinskiy/marathon/analytics/metrics/remote/influx2/InfluxDb2ProviderIntegrationTest.kt @@ -56,7 +56,7 @@ class InfluxDb2ProviderIntegrationTest { firstDbInstance.close() val secondDbInstance = provider.createDb() - val tracker = InfluxDb2Tracker(secondDbInstance) + val tracker = InfluxDb2Tracker(secondDbInstance, readOnly = false) val test1 = com.malinskiy.marathon.test.Test("pkg", "clazz", "method", emptyList()) val test2 = com.malinskiy.marathon.test.Test("pkg", "clazz", "method2", emptyList()) getTestEvents(test = test1).forEach { tracker.track(it) } diff --git a/core/src/main/kotlin/com/malinskiy/marathon/analytics/TrackerFactory.kt b/core/src/main/kotlin/com/malinskiy/marathon/analytics/TrackerFactory.kt index 274147ab6..6dbdf4faa 100644 --- a/core/src/main/kotlin/com/malinskiy/marathon/analytics/TrackerFactory.kt +++ b/core/src/main/kotlin/com/malinskiy/marathon/analytics/TrackerFactory.kt @@ -70,7 +70,7 @@ internal class TrackerFactory( log.warn(e) { "Failed to reach InfluxDB at ${config.url}" } null } - return db?.let { InfluxDbTracker(it, config.dbName, config.retentionPolicyConfiguration.name) } + return db?.let { InfluxDbTracker(it, config.dbName, config.retentionPolicyConfiguration.name, config.readOnly) } } private fun createInfluxDb2Tracker(config: InfluxDb2Configuration): InfluxDb2Tracker? { @@ -80,11 +80,11 @@ internal class TrackerFactory( log.warn(e) { "Failed to reach InfluxDB at ${config.url}" } null } - return db?.let { InfluxDb2Tracker(it) } + return db?.let { InfluxDb2Tracker(it, config.readOnly) } } private fun createGraphiteTracker(config: GraphiteConfiguration): GraphiteTracker { - return GraphiteTracker(BasicGraphiteClient(config.host, config.port ?: 2003, config.prefix)) + return GraphiteTracker(BasicGraphiteClient(config.host, config.port ?: 2003, config.prefix), config.readOnly) } private fun createExecutionReportGenerator(): ExecutionReportGenerator { diff --git a/core/src/main/kotlin/com/malinskiy/marathon/analytics/external/graphite/GraphiteTracker.kt b/core/src/main/kotlin/com/malinskiy/marathon/analytics/external/graphite/GraphiteTracker.kt index bd5751459..2f3360137 100644 --- a/core/src/main/kotlin/com/malinskiy/marathon/analytics/external/graphite/GraphiteTracker.kt +++ b/core/src/main/kotlin/com/malinskiy/marathon/analytics/external/graphite/GraphiteTracker.kt @@ -8,10 +8,13 @@ import com.malinskiy.marathon.test.Test import com.malinskiy.marathon.test.toSafeTestName class GraphiteTracker( - private val graphite: GraphiteClient + private val graphite: GraphiteClient, + private val readOnly: Boolean, ) : TrackerInternalAdapter() { override fun trackTest(event: TestEvent) { + if (readOnly) return + if (event.testResult.status in arrayOf(TestStatus.FAILURE, TestStatus.PASSED)) { val testResult = event.testResult val device = event.device diff --git a/core/src/main/kotlin/com/malinskiy/marathon/analytics/external/influx/InfluxDbTracker.kt b/core/src/main/kotlin/com/malinskiy/marathon/analytics/external/influx/InfluxDbTracker.kt index 7223d7883..b28f074af 100644 --- a/core/src/main/kotlin/com/malinskiy/marathon/analytics/external/influx/InfluxDbTracker.kt +++ b/core/src/main/kotlin/com/malinskiy/marathon/analytics/external/influx/InfluxDbTracker.kt @@ -11,10 +11,13 @@ import java.util.concurrent.TimeUnit class InfluxDbTracker( private val influxDb: InfluxDB, private val dbName: String, - private val rpName: String + private val rpName: String, + private val readOnly: Boolean, ) : TrackerInternalAdapter() { override fun trackTest(event: TestEvent) { + if (readOnly) return + //Report only success and failure if (event.testResult.status in arrayOf(TestStatus.FAILURE, TestStatus.PASSED)) { diff --git a/core/src/main/kotlin/com/malinskiy/marathon/analytics/external/influx2/InfluxDb2Tracker.kt b/core/src/main/kotlin/com/malinskiy/marathon/analytics/external/influx2/InfluxDb2Tracker.kt index 9b4323117..cf7cf3ef3 100644 --- a/core/src/main/kotlin/com/malinskiy/marathon/analytics/external/influx2/InfluxDb2Tracker.kt +++ b/core/src/main/kotlin/com/malinskiy/marathon/analytics/external/influx2/InfluxDb2Tracker.kt @@ -11,12 +11,15 @@ import com.malinskiy.marathon.log.MarathonLogging import com.malinskiy.marathon.test.toSafeTestName class InfluxDb2Tracker( - private val client: InfluxDBClient + private val client: InfluxDBClient, + private val readOnly: Boolean, ) : TrackerInternalAdapter() { private val writeApi by lazy { client.writeApiBlocking } private val logger = MarathonLogging.logger {} override fun trackTest(event: TestEvent) { + if (readOnly) return + val testResult = event.testResult val device = event.device try { diff --git a/docs/runner/configuration/analytics.md b/docs/runner/configuration/analytics.md index 247409714..f44826705 100644 --- a/docs/runner/configuration/analytics.md +++ b/docs/runner/configuration/analytics.md @@ -41,6 +41,7 @@ analyticsConfiguration: defaults: successRate: 0.1 duration: "PT300S" + readOnly: false ``` @@ -57,6 +58,7 @@ marathon { organization = "starlabs" bucket = "marathon" defaults = Defaults(0.0, Duration.ofMinutes(5)) + readOnly = false } } } @@ -97,6 +99,7 @@ analyticsConfiguration: defaults: successRate: 0.1 duration: "PT300S" + readOnly: false ``` @@ -111,6 +114,7 @@ marathon { password = "root" dbName = "marathon" defaults = Defaults(0.0, Duration.ofMinutes(5)) + readOnly = false } } } @@ -128,6 +132,7 @@ marathon { password = "root" dbName = "marathon" defaults = Defaults(0.0, Duration.ofMinutes(5)) + readOnly = false } } } @@ -156,6 +161,7 @@ analyticsConfiguration: defaults: successRate: 0.1 duration: "PT300S" + readOnly: false ``` @@ -169,6 +175,7 @@ marathon { port = "8080" prefix = "prf" defaults = Defaults(0.0, Duration.ofMinutes(5)) + readOnly = false } } } @@ -185,6 +192,7 @@ marathon { port = "8080" prefix = "prf" defaults = Defaults(0.0, Duration.ofMinutes(5)) + readOnly = false } } } diff --git a/marathon-gradle-plugin/src/main/kotlin/com/malinskiy/marathon/gradle/configuration/AnalyticsConfig.kt b/marathon-gradle-plugin/src/main/kotlin/com/malinskiy/marathon/gradle/configuration/AnalyticsConfig.kt index b288818e7..d4a14b1bd 100644 --- a/marathon-gradle-plugin/src/main/kotlin/com/malinskiy/marathon/gradle/configuration/AnalyticsConfig.kt +++ b/marathon-gradle-plugin/src/main/kotlin/com/malinskiy/marathon/gradle/configuration/AnalyticsConfig.kt @@ -37,6 +37,7 @@ class InfluxConfig { var dbName: String = "" var retentionPolicy: RetentionPolicy? = null var defaults: Defaults = Defaults() + var readOnly: Boolean = false } class Influx2Config { @@ -46,6 +47,7 @@ class Influx2Config { var bucket: String = "" var retentionPolicy: Influx2RetentionPolicy? = null var defaults: Defaults = Defaults() + var readOnly: Boolean = false } class Influx2RetentionPolicy { @@ -66,6 +68,7 @@ class GraphiteConfig { var port: String? = null var prefix: String? = null var defaults: Defaults = Defaults() + var readOnly: Boolean = false } fun AnalyticsConfig.toAnalyticsConfiguration(): AnalyticsConfiguration { @@ -80,7 +83,8 @@ fun AnalyticsConfig.toAnalyticsConfiguration(): AnalyticsConfiguration { bucket = influx2.bucket, retentionPolicyConfiguration = influx2.retentionPolicy?.toRetentionPolicy() ?: AnalyticsConfiguration.InfluxDb2Configuration.RetentionPolicyConfiguration.default, - defaults = influx2.defaults + defaults = influx2.defaults, + readOnly = influx2.readOnly ) influx != null -> AnalyticsConfiguration.InfluxDbConfiguration( dbName = influx.dbName, @@ -89,13 +93,15 @@ fun AnalyticsConfig.toAnalyticsConfiguration(): AnalyticsConfiguration { url = influx.url, retentionPolicyConfiguration = influx.retentionPolicy?.toRetentionPolicy() ?: AnalyticsConfiguration.InfluxDbConfiguration.RetentionPolicyConfiguration.default, - defaults = influx.defaults + defaults = influx.defaults, + readOnly = influx.readOnly ) graphite != null -> AnalyticsConfiguration.GraphiteConfiguration( host = graphite.host, port = graphite.port?.toIntOrNull(), prefix = graphite.prefix, - defaults = graphite.defaults + defaults = graphite.defaults, + readOnly = graphite.readOnly ) else -> AnalyticsConfiguration.DisabledAnalytics }