From 7779a568c28941546b410bc1fb4951f4390cb3d5 Mon Sep 17 00:00:00 2001 From: Simon Brandhof Date: Tue, 5 Jun 2018 22:54:58 +0200 Subject: [PATCH] SONAR-10834 Send the edition to telemetry --- .../sonar/server/telemetry/TelemetryData.java | 15 +++++++++++ .../telemetry/TelemetryDataJsonWriter.java | 2 ++ .../server/telemetry/TelemetryDataLoader.java | 7 +++++- .../server/telemetry/TelemetryDaemonTest.java | 25 +++++++++++++------ .../server/telemetry/telemetry-example.json | 1 + 5 files changed, 41 insertions(+), 9 deletions(-) diff --git a/server/sonar-server/src/main/java/org/sonar/server/telemetry/TelemetryData.java b/server/sonar-server/src/main/java/org/sonar/server/telemetry/TelemetryData.java index a8790069333..c39d336f43c 100644 --- a/server/sonar-server/src/main/java/org/sonar/server/telemetry/TelemetryData.java +++ b/server/sonar-server/src/main/java/org/sonar/server/telemetry/TelemetryData.java @@ -20,6 +20,8 @@ package org.sonar.server.telemetry; import java.util.Map; +import java.util.Optional; +import org.sonar.core.platform.EditionProvider; import org.sonar.server.measure.index.ProjectMeasuresStatistics; import static java.util.Objects.requireNonNull; @@ -35,6 +37,7 @@ public class TelemetryData { private final Database database; private final Map projectCountByLanguage; private final Map nclocByLanguage; + private final Optional edition; private TelemetryData(Builder builder) { serverId = builder.serverId; @@ -47,6 +50,7 @@ public class TelemetryData { database = builder.database; projectCountByLanguage = builder.projectMeasuresStatistics.getProjectCountByLanguage(); nclocByLanguage = builder.projectMeasuresStatistics.getNclocByLanguage(); + edition = builder.edition; } public String getServerId() { @@ -89,6 +93,10 @@ public class TelemetryData { return nclocByLanguage; } + public Optional getEdition() { + return edition; + } + static Builder builder() { return new Builder(); } @@ -102,6 +110,7 @@ public class TelemetryData { private ProjectMeasuresStatistics projectMeasuresStatistics; private Long ncloc; private Boolean usingBranches; + private Optional edition; private Builder() { // enforce static factory method @@ -147,6 +156,11 @@ public class TelemetryData { return this; } + public Builder setEdition(Optional edition) { + this.edition = edition; + return this; + } + TelemetryData build() { requireNonNull(serverId); requireNonNull(version); @@ -155,6 +169,7 @@ public class TelemetryData { requireNonNull(ncloc); requireNonNull(database); requireNonNull(usingBranches); + requireNonNull(edition); return new TelemetryData(this); } diff --git a/server/sonar-server/src/main/java/org/sonar/server/telemetry/TelemetryDataJsonWriter.java b/server/sonar-server/src/main/java/org/sonar/server/telemetry/TelemetryDataJsonWriter.java index 1b3df1148cd..e218ab44fb7 100644 --- a/server/sonar-server/src/main/java/org/sonar/server/telemetry/TelemetryDataJsonWriter.java +++ b/server/sonar-server/src/main/java/org/sonar/server/telemetry/TelemetryDataJsonWriter.java @@ -19,6 +19,7 @@ */ package org.sonar.server.telemetry; +import java.util.Locale; import org.sonar.api.utils.text.JsonWriter; import static org.sonar.api.measures.CoreMetrics.NCLOC_KEY; @@ -32,6 +33,7 @@ public class TelemetryDataJsonWriter { json.beginObject(); json.prop("id", statistics.getServerId()); json.prop("version", statistics.getVersion()); + statistics.getEdition().ifPresent(e -> json.prop("edition", e.name().toLowerCase(Locale.ENGLISH))); json.name("database"); json.beginObject(); json.prop("name", statistics.getDatabase().getName()); diff --git a/server/sonar-server/src/main/java/org/sonar/server/telemetry/TelemetryDataLoader.java b/server/sonar-server/src/main/java/org/sonar/server/telemetry/TelemetryDataLoader.java index 601b0898092..635499c7ee9 100644 --- a/server/sonar-server/src/main/java/org/sonar/server/telemetry/TelemetryDataLoader.java +++ b/server/sonar-server/src/main/java/org/sonar/server/telemetry/TelemetryDataLoader.java @@ -26,6 +26,7 @@ import java.util.function.Function; import org.sonar.api.ce.ComputeEngineSide; import org.sonar.api.platform.Server; import org.sonar.api.server.ServerSide; +import org.sonar.core.platform.PlatformEditionProvider; import org.sonar.core.platform.PluginInfo; import org.sonar.core.platform.PluginRepository; import org.sonar.core.util.stream.MoreCollectors; @@ -46,13 +47,16 @@ public class TelemetryDataLoader { private final PluginRepository pluginRepository; private final UserIndex userIndex; private final ProjectMeasuresIndex projectMeasuresIndex; + private final PlatformEditionProvider editionProvider; - public TelemetryDataLoader(Server server, DbClient dbClient, PluginRepository pluginRepository, UserIndex userIndex, ProjectMeasuresIndex projectMeasuresIndex) { + public TelemetryDataLoader(Server server, DbClient dbClient, PluginRepository pluginRepository, UserIndex userIndex, ProjectMeasuresIndex projectMeasuresIndex, + PlatformEditionProvider editionProvider) { this.server = server; this.dbClient = dbClient; this.pluginRepository = pluginRepository; this.userIndex = userIndex; this.projectMeasuresIndex = projectMeasuresIndex; + this.editionProvider = editionProvider; } public TelemetryData load() { @@ -60,6 +64,7 @@ public class TelemetryDataLoader { data.setServerId(server.getId()); data.setVersion(server.getVersion()); + data.setEdition(editionProvider.get()); Function getVersion = plugin -> plugin.getVersion() == null ? "undefined" : plugin.getVersion().getName(); Map plugins = pluginRepository.getPluginInfos().stream().collect(MoreCollectors.uniqueIndex(PluginInfo::getKey, getVersion)); data.setPlugins(plugins); diff --git a/server/sonar-server/src/test/java/org/sonar/server/telemetry/TelemetryDaemonTest.java b/server/sonar-server/src/test/java/org/sonar/server/telemetry/TelemetryDaemonTest.java index d9171b08155..f13ed128e6d 100644 --- a/server/sonar-server/src/test/java/org/sonar/server/telemetry/TelemetryDaemonTest.java +++ b/server/sonar-server/src/test/java/org/sonar/server/telemetry/TelemetryDaemonTest.java @@ -23,6 +23,7 @@ import java.io.IOException; import java.sql.DatabaseMetaData; import java.sql.SQLException; import java.util.List; +import java.util.Optional; import java.util.stream.IntStream; import org.junit.After; import org.junit.Rule; @@ -33,6 +34,8 @@ import org.sonar.api.config.internal.MapSettings; import org.sonar.api.utils.internal.TestSystem2; import org.sonar.api.utils.log.LogTester; import org.sonar.api.utils.log.LoggerLevel; +import org.sonar.core.platform.EditionProvider; +import org.sonar.core.platform.PlatformEditionProvider; import org.sonar.core.platform.PluginInfo; import org.sonar.core.platform.PluginRepository; import org.sonar.db.DbSession; @@ -96,9 +99,11 @@ public class TelemetryDaemonTest { private MapSettings settings = new MapSettings(); private ProjectMeasuresIndexer projectMeasuresIndexer = new ProjectMeasuresIndexer(db.getDbClient(), es.client()); private UserIndexer userIndexer = new UserIndexer(db.getDbClient(), es.client()); + private PlatformEditionProvider editionProvider = mock(PlatformEditionProvider.class); - private TelemetryDaemon underTest = new TelemetryDaemon(new TelemetryDataLoader(server, db.getDbClient(), pluginRepository, new UserIndex(es.client(), system2), - new ProjectMeasuresIndex(es.client(), null, system2)), client, settings.asConfig(), internalProperties, system2); + private final TelemetryDataLoader dataLoader = new TelemetryDataLoader(server, db.getDbClient(), pluginRepository, new UserIndex(es.client(), system2), + new ProjectMeasuresIndex(es.client(), null, system2), editionProvider); + private TelemetryDaemon underTest = new TelemetryDaemon(dataLoader, client, settings.asConfig(), internalProperties, system2); @After public void tearDown() { @@ -113,6 +118,7 @@ public class TelemetryDaemonTest { server.setVersion("7.5.4"); List plugins = asList(newPlugin("java", "4.12.0.11033"), newPlugin("scmgit", "1.2"), new PluginInfo("other")); when(pluginRepository.getPluginInfos()).thenReturn(plugins); + when(editionProvider.get()).thenReturn(Optional.of(EditionProvider.Edition.DEVELOPER)); IntStream.range(0, 3).forEach(i -> db.users().insertUser()); db.users().insertUser(u -> u.setActive(false)); @@ -139,8 +145,7 @@ public class TelemetryDaemonTest { underTest.start(); - ArgumentCaptor jsonCaptor = ArgumentCaptor.forClass(String.class); - verify(client, timeout(2_000).atLeastOnce()).upload(jsonCaptor.capture()); + ArgumentCaptor jsonCaptor = captureJson(); String json = jsonCaptor.getValue(); assertJson(json).ignoreFields("database").isSimilarTo(getClass().getResource("telemetry-example.json")); assertJson(getClass().getResource("telemetry-example.json")).ignoreFields("database").isSimilarTo(json); @@ -178,8 +183,7 @@ public class TelemetryDaemonTest { underTest.start(); - ArgumentCaptor jsonCaptor = ArgumentCaptor.forClass(String.class); - verify(client, timeout(2_000).atLeastOnce()).upload(jsonCaptor.capture()); + ArgumentCaptor jsonCaptor = captureJson(); assertJson(jsonCaptor.getValue()).isSimilarTo("{\n" + " \"ncloc\": 20\n" + "}\n"); @@ -219,8 +223,7 @@ public class TelemetryDaemonTest { server.setVersion(version); underTest.start(); - ArgumentCaptor json = ArgumentCaptor.forClass(String.class); - verify(client, timeout(2_000).atLeastOnce()).upload(json.capture()); + ArgumentCaptor json = captureJson(); assertThat(json.getValue()).contains(id, version); } @@ -276,4 +279,10 @@ public class TelemetryDaemonTest { settings.setProperty(SONAR_TELEMETRY_URL.getKey(), SONAR_TELEMETRY_URL.getDefaultValue()); settings.setProperty(SONAR_TELEMETRY_FREQUENCY_IN_SECONDS.getKey(), SONAR_TELEMETRY_FREQUENCY_IN_SECONDS.getDefaultValue()); } + + private ArgumentCaptor captureJson() throws IOException { + ArgumentCaptor jsonCaptor = ArgumentCaptor.forClass(String.class); + verify(client, timeout(2_000).atLeastOnce()).upload(jsonCaptor.capture()); + return jsonCaptor; + } } diff --git a/server/sonar-server/src/test/resources/org/sonar/server/telemetry/telemetry-example.json b/server/sonar-server/src/test/resources/org/sonar/server/telemetry/telemetry-example.json index 1d80c0c7ed2..5eeb14d2ff0 100644 --- a/server/sonar-server/src/test/resources/org/sonar/server/telemetry/telemetry-example.json +++ b/server/sonar-server/src/test/resources/org/sonar/server/telemetry/telemetry-example.json @@ -1,6 +1,7 @@ { "id": "AU-TpxcB-iU5OvuD2FL7", "version": "7.5.4", + "edition": "developer", "database": { "name": "PostgreSQL", "version": "9.6.5" -- 2.39.5