]> source.dussan.org Git - sonarqube.git/commitdiff
SONAR-10834 Send the edition to telemetry
authorSimon Brandhof <simon.brandhof@sonarsource.com>
Tue, 5 Jun 2018 20:54:58 +0000 (22:54 +0200)
committerSonarTech <sonartech@sonarsource.com>
Tue, 12 Jun 2018 18:21:03 +0000 (20:21 +0200)
server/sonar-server/src/main/java/org/sonar/server/telemetry/TelemetryData.java
server/sonar-server/src/main/java/org/sonar/server/telemetry/TelemetryDataJsonWriter.java
server/sonar-server/src/main/java/org/sonar/server/telemetry/TelemetryDataLoader.java
server/sonar-server/src/test/java/org/sonar/server/telemetry/TelemetryDaemonTest.java
server/sonar-server/src/test/resources/org/sonar/server/telemetry/telemetry-example.json

index a8790069333cf8094073b703c7196f8e3493f7e4..c39d336f43c35f302beda311040a7114c7ad5048 100644 (file)
@@ -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<String, Long> projectCountByLanguage;
   private final Map<String, Long> nclocByLanguage;
+  private final Optional<EditionProvider.Edition> 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<EditionProvider.Edition> 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<EditionProvider.Edition> edition;
 
     private Builder() {
       // enforce static factory method
@@ -147,6 +156,11 @@ public class TelemetryData {
       return this;
     }
 
+    public Builder setEdition(Optional<EditionProvider.Edition> 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);
     }
index 1b3df1148cdc2e8321e94df77b678bc432542569..e218ab44fb759efde075e6c3e2b3f2760ba34d46 100644 (file)
@@ -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());
index 601b0898092bfa7f046fdf57558e752dc8130830..635499c7ee92156233fc4877a4b7fe4787a4a228 100644 (file)
@@ -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<PluginInfo, String> getVersion = plugin -> plugin.getVersion() == null ? "undefined" : plugin.getVersion().getName();
     Map<String, String> plugins = pluginRepository.getPluginInfos().stream().collect(MoreCollectors.uniqueIndex(PluginInfo::getKey, getVersion));
     data.setPlugins(plugins);
index d9171b08155d33e4a1d73e288ce67fd927a02fcc..f13ed128e6de418da1287098db82fc474c1d8010 100644 (file)
@@ -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<PluginInfo> 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<String> jsonCaptor = ArgumentCaptor.forClass(String.class);
-    verify(client, timeout(2_000).atLeastOnce()).upload(jsonCaptor.capture());
+    ArgumentCaptor<String> 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<String> jsonCaptor = ArgumentCaptor.forClass(String.class);
-    verify(client, timeout(2_000).atLeastOnce()).upload(jsonCaptor.capture());
+    ArgumentCaptor<String> jsonCaptor = captureJson();
     assertJson(jsonCaptor.getValue()).isSimilarTo("{\n" +
       "  \"ncloc\": 20\n" +
       "}\n");
@@ -219,8 +223,7 @@ public class TelemetryDaemonTest {
     server.setVersion(version);
     underTest.start();
 
-    ArgumentCaptor<String> json = ArgumentCaptor.forClass(String.class);
-    verify(client, timeout(2_000).atLeastOnce()).upload(json.capture());
+    ArgumentCaptor<String> 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<String> captureJson() throws IOException {
+    ArgumentCaptor<String> jsonCaptor = ArgumentCaptor.forClass(String.class);
+    verify(client, timeout(2_000).atLeastOnce()).upload(jsonCaptor.capture());
+    return jsonCaptor;
+  }
 }
index 1d80c0c7ed29c94e44386d989c3bc30cb84b9b9e..5eeb14d2ff0942c35240d5ad3bdaac49e1e48fd5 100644 (file)
@@ -1,6 +1,7 @@
 {
   "id": "AU-TpxcB-iU5OvuD2FL7",
   "version": "7.5.4",
+  "edition": "developer",
   "database": {
     "name": "PostgreSQL",
     "version": "9.6.5"