aboutsummaryrefslogtreecommitdiffstats
path: root/server/sonar-webserver-core/src
diff options
context:
space:
mode:
authorZipeng WU <zipeng.wu@sonarsource.com>2023-06-05 15:39:42 +0200
committersonartech <sonartech@sonarsource.com>2023-06-07 20:02:43 +0000
commit6bf45ac19fcf831e7bb3cbfb7975c09f109f7647 (patch)
tree146d6ea87f175f2c8bcfc6766f48d244df2e12b6 /server/sonar-webserver-core/src
parent6cae1ea47191bd94d85bb1b6f6596ce6121eed65 (diff)
downloadsonarqube-6bf45ac19fcf831e7bb3cbfb7975c09f109f7647.tar.gz
sonarqube-6bf45ac19fcf831e7bb3cbfb7975c09f109f7647.zip
SONAR-19483 Collect daily counts of analysis and green Quality Gate in Telemetry for branches
Co-authored-by: Zipeng WU <zipeng.wu@sonarsource.com> Co-authored-by: Nolwenn Cadic <nolwenn.cadic@sonarsource.com>
Diffstat (limited to 'server/sonar-webserver-core/src')
-rw-r--r--server/sonar-webserver-core/src/main/java/org/sonar/server/telemetry/TelemetryDataLoaderImpl.java23
-rw-r--r--server/sonar-webserver-core/src/test/java/org/sonar/server/telemetry/TelemetryDataLoaderImplTest.java48
2 files changed, 59 insertions, 12 deletions
diff --git a/server/sonar-webserver-core/src/main/java/org/sonar/server/telemetry/TelemetryDataLoaderImpl.java b/server/sonar-webserver-core/src/main/java/org/sonar/server/telemetry/TelemetryDataLoaderImpl.java
index d0bac974b2c..1383e027f3a 100644
--- a/server/sonar-webserver-core/src/main/java/org/sonar/server/telemetry/TelemetryDataLoaderImpl.java
+++ b/server/sonar-webserver-core/src/main/java/org/sonar/server/telemetry/TelemetryDataLoaderImpl.java
@@ -48,7 +48,7 @@ import org.sonar.db.DbSession;
import org.sonar.db.alm.setting.ALM;
import org.sonar.db.alm.setting.ProjectAlmKeyAndProject;
import org.sonar.db.component.AnalysisPropertyValuePerProject;
-import org.sonar.db.component.BranchDto;
+import org.sonar.db.component.BranchMeasuresDto;
import org.sonar.db.component.PrBranchAnalyzedLanguageCountByProjectDto;
import org.sonar.db.component.SnapshotDto;
import org.sonar.db.measure.LiveMeasureDto;
@@ -153,8 +153,8 @@ public class TelemetryDataLoaderImpl implements TelemetryDataLoader {
getVersion));
data.setPlugins(plugins);
try (DbSession dbSession = dbClient.openSession(false)) {
- var branchDtos = dbClient.branchDao().selectAllBranches(dbSession);
- loadNewCodeDefinitions(dbSession, branchDtos);
+ var branchMeasuresDtos = dbClient.branchDao().selectBranchMeasuresWithCaycMetric(dbSession);
+ loadNewCodeDefinitions(dbSession, branchMeasuresDtos);
data.setDatabase(loadDatabaseMetadata(dbSession));
data.setNcdId(instanceNcd.hashCode());
@@ -166,7 +166,7 @@ public class TelemetryDataLoaderImpl implements TelemetryDataLoader {
resolveUnanalyzedLanguageCode(data, dbSession);
resolveProjectStatistics(data, dbSession, defaultQualityGateUuid);
resolveProjects(data, dbSession);
- resolveBranches(data, branchDtos);
+ resolveBranches(data, branchMeasuresDtos);
resolveQualityGates(data, dbSession);
resolveUsers(data, dbSession);
}
@@ -184,12 +184,14 @@ public class TelemetryDataLoaderImpl implements TelemetryDataLoader {
.build();
}
- private void resolveBranches(TelemetryData.Builder data, List<BranchDto> branchDtos) {
- var branches = branchDtos.stream()
+ private void resolveBranches(TelemetryData.Builder data, List<BranchMeasuresDto> branchMeasuresDtos) {
+ var branches = branchMeasuresDtos.stream()
.map(dto -> {
var projectNcd = ncdByProject.getOrDefault(dto.getProjectUuid(), instanceNcd);
- var ncdId = ncdByBranch.getOrDefault(dto.getUuid(), projectNcd).hashCode();
- return new TelemetryData.Branch(dto.getProjectUuid(), dto.getUuid(), ncdId);
+ var ncdId = ncdByBranch.getOrDefault(dto.getBranchUuid(), projectNcd).hashCode();
+ return new TelemetryData.Branch(
+ dto.getProjectUuid(), dto.getBranchUuid(), ncdId,
+ dto.getGreenQualityGateCount(), dto.getAnalysisCount(), dto.getExcludeFromPurge());
})
.toList();
data.setBranches(branches);
@@ -203,8 +205,9 @@ public class TelemetryDataLoaderImpl implements TelemetryDataLoader {
this.instanceNcd = NewCodeDefinition.getInstanceDefault();
}
- private void loadNewCodeDefinitions(DbSession dbSession, List<BranchDto> branchDtos) {
- var branchUuidByKey = branchDtos.stream().collect(Collectors.toMap(dto -> createBranchUniqueKey(dto.getProjectUuid(), dto.getBranchKey()), BranchDto::getUuid));
+ private void loadNewCodeDefinitions(DbSession dbSession, List<BranchMeasuresDto> branchMeasuresDtos) {
+ var branchUuidByKey = branchMeasuresDtos.stream()
+ .collect(Collectors.toMap(dto -> createBranchUniqueKey(dto.getProjectUuid(), dto.getBranchKey()), BranchMeasuresDto::getBranchUuid));
List<NewCodePeriodDto> newCodePeriodDtos = dbClient.newCodePeriodDao().selectAll(dbSession);
NewCodeDefinition ncd;
boolean hasInstance = false;
diff --git a/server/sonar-webserver-core/src/test/java/org/sonar/server/telemetry/TelemetryDataLoaderImplTest.java b/server/sonar-webserver-core/src/test/java/org/sonar/server/telemetry/TelemetryDataLoaderImplTest.java
index 84c76209d16..9be832680c6 100644
--- a/server/sonar-webserver-core/src/test/java/org/sonar/server/telemetry/TelemetryDataLoaderImplTest.java
+++ b/server/sonar-webserver-core/src/test/java/org/sonar/server/telemetry/TelemetryDataLoaderImplTest.java
@@ -24,6 +24,9 @@ import com.tngtech.java.junit.dataprovider.DataProviderRunner;
import com.tngtech.java.junit.dataprovider.UseDataProvider;
import java.sql.DatabaseMetaData;
import java.sql.SQLException;
+import java.time.LocalDateTime;
+import java.time.ZoneId;
+import java.time.ZonedDateTime;
import java.util.HashSet;
import java.util.List;
import java.util.Optional;
@@ -59,6 +62,7 @@ import org.sonar.server.property.InternalProperties;
import org.sonar.server.property.MapInternalProperties;
import org.sonar.server.qualitygate.QualityGateCaycChecker;
import org.sonar.server.qualitygate.QualityGateFinder;
+import org.sonar.server.telemetry.TelemetryData.Branch;
import org.sonar.server.telemetry.TelemetryData.NewCodeDefinition;
import org.sonar.server.telemetry.TelemetryData.ProjectStatistics;
import org.sonar.updatecenter.common.Version;
@@ -72,6 +76,7 @@ import static org.mockito.ArgumentMatchers.any;
import static org.mockito.Mockito.mock;
import static org.mockito.Mockito.spy;
import static org.mockito.Mockito.when;
+import static org.sonar.api.measures.CoreMetrics.ALERT_STATUS_KEY;
import static org.sonar.api.measures.CoreMetrics.BUGS_KEY;
import static org.sonar.api.measures.CoreMetrics.COVERAGE_KEY;
import static org.sonar.api.measures.CoreMetrics.DEVELOPMENT_COST_KEY;
@@ -251,7 +256,7 @@ public class TelemetryDataLoaderImplTest {
Optional.empty(), instanceNcdId));
assertThat(data.getBranches())
- .extracting(TelemetryData.Branch::branchUuid, TelemetryData.Branch::ncdId)
+ .extracting(Branch::branchUuid, Branch::ncdId)
.containsExactlyInAnyOrder(
tuple(branch1.uuid(), projectNcdId),
tuple(branch2.uuid(), branchNcdId),
@@ -274,6 +279,45 @@ public class TelemetryDataLoaderImplTest {
);
}
+ @Test
+ public void send_branch_measures_data() {
+ Long analysisDate = ZonedDateTime.now(ZoneId.systemDefault()).toInstant().toEpochMilli();
+
+ MetricDto qg = db.measures().insertMetric(m -> m.setKey(ALERT_STATUS_KEY));
+
+ ComponentDto project1 = db.components().insertPrivateProject().getMainBranchComponent();
+
+ ComponentDto project2 = db.components().insertPrivateProject().getMainBranchComponent();
+
+ SnapshotDto project1Analysis1 = db.components().insertSnapshot(project1, t -> t.setLast(true).setBuildDate(analysisDate));
+ SnapshotDto project1Analysis2 = db.components().insertSnapshot(project1, t -> t.setLast(true).setBuildDate(analysisDate));
+ SnapshotDto project2Analysis = db.components().insertSnapshot(project2, t -> t.setLast(true).setBuildDate(analysisDate));
+ db.measures().insertMeasure(project1, project1Analysis1, qg, pm -> pm.setData("OK"));
+ db.measures().insertMeasure(project1, project1Analysis2, qg, pm -> pm.setData("ERROR"));
+ db.measures().insertMeasure(project2, project2Analysis, qg, pm -> pm.setData("ERROR"));
+
+ var branch1 = db.components().insertProjectBranch(project1, branchDto -> branchDto.setKey("reference"));
+ var branch2 = db.components().insertProjectBranch(project1, branchDto -> branchDto.setKey("custom"));
+
+ db.newCodePeriods().insert(project1.uuid(), NewCodePeriodType.NUMBER_OF_DAYS, "30");
+ db.newCodePeriods().insert(project1.uuid(), branch2.branchUuid(), NewCodePeriodType.REFERENCE_BRANCH, "reference");
+
+ var instanceNcdId = NewCodeDefinition.getInstanceDefault().hashCode();
+ var projectNcdId = new NewCodeDefinition(NewCodePeriodType.NUMBER_OF_DAYS.name(), "30", "project").hashCode();
+ var branchNcdId = new NewCodeDefinition(NewCodePeriodType.REFERENCE_BRANCH.name(), branch1.uuid(), "branch").hashCode();
+
+ TelemetryData data = communityUnderTest.load();
+
+ assertThat(data.getBranches())
+ .extracting(Branch::branchUuid, Branch::ncdId, Branch::greenQualityGateCount, Branch::analysisCount)
+ .containsExactlyInAnyOrder(
+ tuple(branch1.uuid(), projectNcdId, 0, 0),
+ tuple(branch2.uuid(), branchNcdId, 0, 0),
+ tuple(project1.uuid(), projectNcdId, 1, 2),
+ tuple(project2.uuid(), instanceNcdId, 0, 1));
+
+ }
+
private List<UserDto> composeActiveUsers(int count) {
UserDbTester userDbTester = db.users();
Function<Integer, Consumer<UserDto>> userConfigurator = index -> user -> user.setExternalIdentityProvider("provider" + index).setLastSonarlintConnectionDate(index * 2L);
@@ -355,7 +399,7 @@ public class TelemetryDataLoaderImplTest {
.containsExactlyInAnyOrder(tuple(2L, projectNcdId));
assertThat(data.getBranches())
- .extracting(TelemetryData.Branch::branchUuid, TelemetryData.Branch::ncdId)
+ .extracting(Branch::branchUuid, Branch::ncdId)
.contains(tuple(branch.uuid(), projectNcdId));
}