From d0c8d6591fba4186c6ec869520ba1f018c54f38e Mon Sep 17 00:00:00 2001 From: Eric Haag Date: Fri, 30 Dec 2022 16:33:44 -0600 Subject: [PATCH 1/7] Print serialization factor of first build in experiment summary --- .../api/client/GradleEnterpriseApiClient.java | 9 +++++---- .../cli/FetchBuildValidationDataCommand.java | 4 +++- .../main/java/com/gradle/enterprise/cli/Fields.java | 11 +++++++++++ .../gradle/enterprise/model/BuildValidationData.java | 10 +++++++++- .../gradle/01-validate-incremental-building.sh | 2 ++ components/scripts/lib/build-scan-parse.sh | 9 +++++++-- components/scripts/lib/info.sh | 10 ++++++++++ 7 files changed, 47 insertions(+), 8 deletions(-) diff --git a/components/fetch-build-scan-data-cmdline-tool/src/main/java/com/gradle/enterprise/api/client/GradleEnterpriseApiClient.java b/components/fetch-build-scan-data-cmdline-tool/src/main/java/com/gradle/enterprise/api/client/GradleEnterpriseApiClient.java index 4aed4471..15c4b390 100644 --- a/components/fetch-build-scan-data-cmdline-tool/src/main/java/com/gradle/enterprise/api/client/GradleEnterpriseApiClient.java +++ b/components/fetch-build-scan-data-cmdline-tool/src/main/java/com/gradle/enterprise/api/client/GradleEnterpriseApiClient.java @@ -18,6 +18,7 @@ import okhttp3.tls.HandshakeCertificates; import org.jetbrains.annotations.NotNull; +import java.math.BigDecimal; import java.net.MalformedURLException; import java.net.URL; import java.time.Duration; @@ -116,8 +117,8 @@ public BuildValidationData fetchBuildValidationData(String buildScanId) { buildOutcomeFrom(attributes), remoteBuildCacheUrlFrom(buildCachePerformance), summarizeTaskExecutions(buildCachePerformance), - toDuration(buildCachePerformance.getEffectiveTaskExecutionTime()) - ); + toDuration(buildCachePerformance.getEffectiveTaskExecutionTime()), + BigDecimal.valueOf(buildCachePerformance.getSerializationFactor())); } if (build.getBuildToolType().equalsIgnoreCase("maven")) { MavenAttributes attributes = apiClient.getMavenAttributes(buildScanId, null); @@ -134,8 +135,8 @@ public BuildValidationData fetchBuildValidationData(String buildScanId) { buildOutcomeFrom(attributes), remoteBuildCacheUrlFrom(buildCachePerformance), summarizeTaskExecutions(buildCachePerformance), - toDuration(buildCachePerformance.getEffectiveProjectExecutionTime()) - ); + toDuration(buildCachePerformance.getEffectiveProjectExecutionTime()), + BigDecimal.valueOf(buildCachePerformance.getSerializationFactor())); } throw new UnknownBuildAgentException(baseUrl, buildScanId, build.getBuildToolType()); } catch (ApiException e) { diff --git a/components/fetch-build-scan-data-cmdline-tool/src/main/java/com/gradle/enterprise/cli/FetchBuildValidationDataCommand.java b/components/fetch-build-scan-data-cmdline-tool/src/main/java/com/gradle/enterprise/cli/FetchBuildValidationDataCommand.java index f1818dde..2ca3e4df 100644 --- a/components/fetch-build-scan-data-cmdline-tool/src/main/java/com/gradle/enterprise/cli/FetchBuildValidationDataCommand.java +++ b/components/fetch-build-scan-data-cmdline-tool/src/main/java/com/gradle/enterprise/cli/FetchBuildValidationDataCommand.java @@ -11,6 +11,7 @@ import picocli.CommandLine.Parameters; import java.io.IOException; +import java.math.BigDecimal; import java.net.MalformedURLException; import java.net.URL; import java.nio.file.Path; @@ -107,7 +108,8 @@ private BuildValidationData fetchBuildScanData(int index, URL buildScanUrl, Cust "", null, Collections.emptyMap(), - Duration.ZERO); + Duration.ZERO, + BigDecimal.ZERO); } } diff --git a/components/fetch-build-scan-data-cmdline-tool/src/main/java/com/gradle/enterprise/cli/Fields.java b/components/fetch-build-scan-data-cmdline-tool/src/main/java/com/gradle/enterprise/cli/Fields.java index 3f8ce5f3..4498cbe5 100644 --- a/components/fetch-build-scan-data-cmdline-tool/src/main/java/com/gradle/enterprise/cli/Fields.java +++ b/components/fetch-build-scan-data-cmdline-tool/src/main/java/com/gradle/enterprise/cli/Fields.java @@ -3,6 +3,8 @@ import com.gradle.enterprise.model.BuildValidationData; import com.gradle.enterprise.model.TaskExecutionSummary; +import java.math.BigDecimal; +import java.math.RoundingMode; import java.time.Duration; import java.util.Arrays; import java.util.Locale; @@ -31,6 +33,7 @@ public enum Fields { EXECUTED_NOT_CACHEABLE("Executed not cacheable", d -> totalTasks(d, "executed_not_cacheable")), EXECUTED_NOT_CACHEABLE_DURATION("Executed not cacheable duration", d -> totalDuration(d, "executed_not_cacheable")), EFFECTIVE_TASK_EXECUTION_DURATION("Effective task execution duration", d -> String.valueOf(d.getEffectiveTaskExecutionDuration().toMillis())), + SERIALIZATION_FACTOR("Serialization factor", d -> formatSerializationFactor(d.getSerializationFactor())), ; public final String label; @@ -91,4 +94,12 @@ private static String formatDuration(Duration duration) { return s.toString().trim(); } + + // todo get feedback on RoundingMode https://gradle.slack.com/archives/C012L0276KF/p1672437793010059 + private static String formatSerializationFactor(BigDecimal serializationFactor) { + if (serializationFactor == null || serializationFactor.compareTo(BigDecimal.ZERO) == 0) { + return ""; + } + return String.valueOf(serializationFactor.setScale(1, RoundingMode.HALF_UP)); + } } diff --git a/components/fetch-build-scan-data-cmdline-tool/src/main/java/com/gradle/enterprise/model/BuildValidationData.java b/components/fetch-build-scan-data-cmdline-tool/src/main/java/com/gradle/enterprise/model/BuildValidationData.java index ebcd51a9..7c5e3cf3 100644 --- a/components/fetch-build-scan-data-cmdline-tool/src/main/java/com/gradle/enterprise/model/BuildValidationData.java +++ b/components/fetch-build-scan-data-cmdline-tool/src/main/java/com/gradle/enterprise/model/BuildValidationData.java @@ -1,5 +1,6 @@ package com.gradle.enterprise.model; +import java.math.BigDecimal; import java.net.MalformedURLException; import java.net.URL; import java.time.Duration; @@ -22,6 +23,7 @@ public class BuildValidationData { private final URL remoteBuildCacheUrl; private final Map tasksByAvoidanceOutcome; private final Duration effectiveTaskExecutionDuration; + private final BigDecimal serializationFactor; public BuildValidationData( String rootProjectName, @@ -34,7 +36,8 @@ public BuildValidationData( String buildOutcome, URL remoteBuildCacheUrl, Map tasksByAvoidanceOutcome, - Duration effectiveTaskExecutionDuration) { + Duration effectiveTaskExecutionDuration, + BigDecimal serializationFactor) { this.rootProjectName = rootProjectName; this.buildScanId = buildScanId; this.gradleEnterpriseServerUrl = gradleEnterpriseServerUrl; @@ -46,6 +49,7 @@ public BuildValidationData( this.remoteBuildCacheUrl = remoteBuildCacheUrl; this.tasksByAvoidanceOutcome = tasksByAvoidanceOutcome; this.effectiveTaskExecutionDuration = effectiveTaskExecutionDuration; + this.serializationFactor = serializationFactor; } public String getRootProjectName() { @@ -142,4 +146,8 @@ public Map getTasksByAvoidanceOutcome() { public Duration getEffectiveTaskExecutionDuration() { return effectiveTaskExecutionDuration; } + + public BigDecimal getSerializationFactor() { + return serializationFactor; + } } diff --git a/components/scripts/gradle/01-validate-incremental-building.sh b/components/scripts/gradle/01-validate-incremental-building.sh index a0938574..14dd436a 100755 --- a/components/scripts/gradle/01-validate-incremental-building.sh +++ b/components/scripts/gradle/01-validate-incremental-building.sh @@ -171,6 +171,8 @@ print_performance_characteristics() { print_performance_characteristics_header print_realized_build_time_savings + + print_serialization_factor } print_quick_links() { diff --git a/components/scripts/lib/build-scan-parse.sh b/components/scripts/lib/build-scan-parse.sh index 10b63cd2..887fbcee 100644 --- a/components/scripts/lib/build-scan-parse.sh +++ b/components/scripts/lib/build-scan-parse.sh @@ -27,6 +27,7 @@ executed_not_cacheable_duration=() # Build duration metrics effective_task_execution_duration=() +serialization_factors=() parse_build_scan_csv() { # This isn't the most robust way to read a CSV, @@ -45,7 +46,7 @@ parse_build_scan_csv() { idx=0 # shellcheck disable=SC2034 # not all scripts use all of the fetched data - while IFS=, read -r field_1 field_2 field_3 field_4 field_5 field_6 field_7 field_8 field_9 field_10 field_11 field_12 field_13 field_14 field_15 field_16 field_17 field_18 field_19 field_20; do + while IFS=, read -r field_1 field_2 field_3 field_4 field_5 field_6 field_7 field_8 field_9 field_10 field_11 field_12 field_13 field_14 field_15 field_16 field_17 field_18 field_19 field_20 field_21; do if [[ "$header_row_read" == "false" ]]; then header_row_read=true continue; @@ -76,11 +77,15 @@ parse_build_scan_csv() { executed_not_cacheable_num_tasks[idx]="${field_18}" executed_not_cacheable_duration[idx]="${field_19}" - # Conditional because build-scan-support-tool does not yet support this field + # Conditional because build-scan-support-tool does not yet support these fields if [[ -n "$field_20" ]]; then effective_task_execution_duration[idx]="${field_20}" fi + if [[ -n "$field_21" ]]; then + serialization_factors[idx]="${field_21}" + fi + ((idx++)) done <<< "${build_scan_csv}" } diff --git a/components/scripts/lib/info.sh b/components/scripts/lib/info.sh index ac067afa..ac8eb9f4 100644 --- a/components/scripts/lib/info.sh +++ b/components/scripts/lib/info.sh @@ -142,6 +142,8 @@ print_performance_characteristics() { print_build_caching_leverage_metrics + print_serialization_factor + print_executed_cacheable_tasks_warning } @@ -204,6 +206,14 @@ print_build_caching_leverage_metrics() { summary_row "Executed non-cacheable ${BUILD_TOOL_TASK}s:" "${value}" } +print_serialization_factor() { + # Do not print serialization factor at all if these values do not exist + # This can happen since build-scan-support-tool does not yet support these fields + if [[ -n "${serialization_factors[0]}" ]]; then + summary_row "Serialization factor:" "${serialization_factors[0]}" + fi +} + print_executed_cacheable_tasks_warning() { if (( executed_cacheable_num_tasks[1] > 0)); then print_bl From 0291120f664920f34313cf8fddc80e391dc732d0 Mon Sep 17 00:00:00 2001 From: Eric Haag Date: Tue, 3 Jan 2023 13:31:24 -0600 Subject: [PATCH 2/7] Adjust rounding --- .../main/java/com/gradle/enterprise/cli/Fields.java | 10 ++++------ components/scripts/lib/info.sh | 12 +++++++++--- 2 files changed, 13 insertions(+), 9 deletions(-) diff --git a/components/fetch-build-scan-data-cmdline-tool/src/main/java/com/gradle/enterprise/cli/Fields.java b/components/fetch-build-scan-data-cmdline-tool/src/main/java/com/gradle/enterprise/cli/Fields.java index 4498cbe5..54f8b1de 100644 --- a/components/fetch-build-scan-data-cmdline-tool/src/main/java/com/gradle/enterprise/cli/Fields.java +++ b/components/fetch-build-scan-data-cmdline-tool/src/main/java/com/gradle/enterprise/cli/Fields.java @@ -4,7 +4,6 @@ import com.gradle.enterprise.model.TaskExecutionSummary; import java.math.BigDecimal; -import java.math.RoundingMode; import java.time.Duration; import java.util.Arrays; import java.util.Locale; @@ -33,7 +32,7 @@ public enum Fields { EXECUTED_NOT_CACHEABLE("Executed not cacheable", d -> totalTasks(d, "executed_not_cacheable")), EXECUTED_NOT_CACHEABLE_DURATION("Executed not cacheable duration", d -> totalDuration(d, "executed_not_cacheable")), EFFECTIVE_TASK_EXECUTION_DURATION("Effective task execution duration", d -> String.valueOf(d.getEffectiveTaskExecutionDuration().toMillis())), - SERIALIZATION_FACTOR("Serialization factor", d -> formatSerializationFactor(d.getSerializationFactor())), + SERIALIZATION_FACTOR("Serialization factor", d -> formatBigDecimal(d.getSerializationFactor())), ; public final String label; @@ -95,11 +94,10 @@ private static String formatDuration(Duration duration) { return s.toString().trim(); } - // todo get feedback on RoundingMode https://gradle.slack.com/archives/C012L0276KF/p1672437793010059 - private static String formatSerializationFactor(BigDecimal serializationFactor) { - if (serializationFactor == null || serializationFactor.compareTo(BigDecimal.ZERO) == 0) { + private static String formatBigDecimal(BigDecimal serializationFactor) { + if (serializationFactor.compareTo(BigDecimal.ZERO) == 0) { return ""; } - return String.valueOf(serializationFactor.setScale(1, RoundingMode.HALF_UP)); + return serializationFactor.toPlainString(); } } diff --git a/components/scripts/lib/info.sh b/components/scripts/lib/info.sh index ac8eb9f4..21e59ba0 100644 --- a/components/scripts/lib/info.sh +++ b/components/scripts/lib/info.sh @@ -207,10 +207,10 @@ print_build_caching_leverage_metrics() { } print_serialization_factor() { - # Do not print serialization factor at all if these values do not exist - # This can happen since build-scan-support-tool does not yet support these fields + # Do not print serialization factor at all if this value does not exist + # This can happen since build-scan-support-tool does not yet support this field if [[ -n "${serialization_factors[0]}" ]]; then - summary_row "Serialization factor:" "${serialization_factors[0]}" + summary_row "Serialization factor:" "$(to_two_decimal_places "${serialization_factors[0]}")" fi } @@ -289,3 +289,9 @@ format_duration() { printf "%d.%03ds" "${seconds}" "${millis}" } + +# Rounds the argument to two decimal places +# See: https://unix.stackexchange.com/a/167059 +to_two_decimal_places() { + echo "$1" | LC_ALL=C xargs printf "%.2f" +} From 52544a8cb1b5bdb7068d9169fa3ac8228be73ed1 Mon Sep 17 00:00:00 2001 From: Eric Haag Date: Tue, 3 Jan 2023 13:33:33 -0600 Subject: [PATCH 3/7] Fix formatting --- .../enterprise/api/client/GradleEnterpriseApiClient.java | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/components/fetch-build-scan-data-cmdline-tool/src/main/java/com/gradle/enterprise/api/client/GradleEnterpriseApiClient.java b/components/fetch-build-scan-data-cmdline-tool/src/main/java/com/gradle/enterprise/api/client/GradleEnterpriseApiClient.java index 15c4b390..3d41783e 100644 --- a/components/fetch-build-scan-data-cmdline-tool/src/main/java/com/gradle/enterprise/api/client/GradleEnterpriseApiClient.java +++ b/components/fetch-build-scan-data-cmdline-tool/src/main/java/com/gradle/enterprise/api/client/GradleEnterpriseApiClient.java @@ -118,7 +118,8 @@ public BuildValidationData fetchBuildValidationData(String buildScanId) { remoteBuildCacheUrlFrom(buildCachePerformance), summarizeTaskExecutions(buildCachePerformance), toDuration(buildCachePerformance.getEffectiveTaskExecutionTime()), - BigDecimal.valueOf(buildCachePerformance.getSerializationFactor())); + BigDecimal.valueOf(buildCachePerformance.getSerializationFactor()) + ); } if (build.getBuildToolType().equalsIgnoreCase("maven")) { MavenAttributes attributes = apiClient.getMavenAttributes(buildScanId, null); @@ -136,7 +137,8 @@ public BuildValidationData fetchBuildValidationData(String buildScanId) { remoteBuildCacheUrlFrom(buildCachePerformance), summarizeTaskExecutions(buildCachePerformance), toDuration(buildCachePerformance.getEffectiveProjectExecutionTime()), - BigDecimal.valueOf(buildCachePerformance.getSerializationFactor())); + BigDecimal.valueOf(buildCachePerformance.getSerializationFactor()) + ); } throw new UnknownBuildAgentException(baseUrl, buildScanId, build.getBuildToolType()); } catch (ApiException e) { From bbc8fe8cf491cf83a6ba74cd187acc1a706a3c08 Mon Sep 17 00:00:00 2001 From: Eric Haag Date: Tue, 3 Jan 2023 13:36:43 -0600 Subject: [PATCH 4/7] Update release notes --- release/changes.md | 1 + 1 file changed, 1 insertion(+) diff --git a/release/changes.md b/release/changes.md index cb3b71f7..fd2dd6bc 100644 --- a/release/changes.md +++ b/release/changes.md @@ -1,2 +1,3 @@ - [NEW] Include realized build time savings in all experiment summaries +- [NEW] Include serialization factor in all experiment summaries - [NEW] Support `-x` command line option for Gradle experiment 1 From e31a63d5dd8fc16f6b4969c4334f6404b9e0f0c1 Mon Sep 17 00:00:00 2001 From: Eric Haag Date: Tue, 3 Jan 2023 15:49:38 -0600 Subject: [PATCH 5/7] Change variable name --- .../src/main/java/com/gradle/enterprise/cli/Fields.java | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/components/fetch-build-scan-data-cmdline-tool/src/main/java/com/gradle/enterprise/cli/Fields.java b/components/fetch-build-scan-data-cmdline-tool/src/main/java/com/gradle/enterprise/cli/Fields.java index 54f8b1de..6aad492c 100644 --- a/components/fetch-build-scan-data-cmdline-tool/src/main/java/com/gradle/enterprise/cli/Fields.java +++ b/components/fetch-build-scan-data-cmdline-tool/src/main/java/com/gradle/enterprise/cli/Fields.java @@ -94,10 +94,10 @@ private static String formatDuration(Duration duration) { return s.toString().trim(); } - private static String formatBigDecimal(BigDecimal serializationFactor) { - if (serializationFactor.compareTo(BigDecimal.ZERO) == 0) { + private static String formatBigDecimal(BigDecimal value) { + if (value.compareTo(BigDecimal.ZERO) == 0) { return ""; } - return serializationFactor.toPlainString(); + return value.toPlainString(); } } From 3d6660ab32fa9eed731f9fd54a85ede70529dc72 Mon Sep 17 00:00:00 2001 From: Eric Haag Date: Tue, 7 Mar 2023 16:08:13 -0500 Subject: [PATCH 6/7] Add x at the end of serialization factor output --- components/scripts/lib/info.sh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/components/scripts/lib/info.sh b/components/scripts/lib/info.sh index 6b16eb9c..bc6e909f 100644 --- a/components/scripts/lib/info.sh +++ b/components/scripts/lib/info.sh @@ -210,7 +210,7 @@ print_serialization_factor() { # Do not print serialization factor at all if this value does not exist # This can happen since build-scan-support-tool does not yet support this field if [[ -n "${serialization_factors[0]}" ]]; then - summary_row "Serialization factor:" "$(to_two_decimal_places "${serialization_factors[0]}")" + summary_row "Serialization factor:" "$(to_two_decimal_places "${serialization_factors[0]}")x" fi } From 50cf6132c1eaeedc334b4957315e301a1aa508f3 Mon Sep 17 00:00:00 2001 From: Eric Haag Date: Tue, 7 Mar 2023 16:13:11 -0500 Subject: [PATCH 7/7] Remove xargs in rounding function --- components/scripts/lib/info.sh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/components/scripts/lib/info.sh b/components/scripts/lib/info.sh index bc6e909f..f461d6a2 100644 --- a/components/scripts/lib/info.sh +++ b/components/scripts/lib/info.sh @@ -293,5 +293,5 @@ format_duration() { # Rounds the argument to two decimal places # See: https://unix.stackexchange.com/a/167059 to_two_decimal_places() { - echo "$1" | LC_ALL=C xargs printf "%.2f" + LC_ALL=C printf "%.2f" "$1" }