Browse Source

SONAR-10834 Send the edition to telemetry

tags/7.5
Simon Brandhof 6 years ago
parent
commit
7779a568c2

+ 15
- 0
server/sonar-server/src/main/java/org/sonar/server/telemetry/TelemetryData.java View 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);
}

+ 2
- 0
server/sonar-server/src/main/java/org/sonar/server/telemetry/TelemetryDataJsonWriter.java View 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());

+ 6
- 1
server/sonar-server/src/main/java/org/sonar/server/telemetry/TelemetryDataLoader.java View 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);

+ 17
- 8
server/sonar-server/src/test/java/org/sonar/server/telemetry/TelemetryDaemonTest.java View 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;
}
}

+ 1
- 0
server/sonar-server/src/test/resources/org/sonar/server/telemetry/telemetry-example.json View File

@@ -1,6 +1,7 @@
{
"id": "AU-TpxcB-iU5OvuD2FL7",
"version": "7.5.4",
"edition": "developer",
"database": {
"name": "PostgreSQL",
"version": "9.6.5"

Loading…
Cancel
Save