@@ -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); | |||
} |
@@ -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()); |
@@ -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); |
@@ -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; | |||
} | |||
} |
@@ -1,6 +1,7 @@ | |||
{ | |||
"id": "AU-TpxcB-iU5OvuD2FL7", | |||
"version": "7.5.4", | |||
"edition": "developer", | |||
"database": { | |||
"name": "PostgreSQL", | |||
"version": "9.6.5" |