aboutsummaryrefslogtreecommitdiffhomepage
diff options
context:
space:
mode:
-rw-r--r--src/main/java/com/google/devtools/build/lib/buildeventstream/proto/build_event_stream.proto8
-rw-r--r--src/main/java/com/google/devtools/build/lib/metrics/BUILD1
-rw-r--r--src/main/java/com/google/devtools/build/lib/metrics/MetricsCollector.java29
-rw-r--r--src/main/java/com/google/devtools/build/lib/metrics/MetricsModule.java24
4 files changed, 59 insertions, 3 deletions
diff --git a/src/main/java/com/google/devtools/build/lib/buildeventstream/proto/build_event_stream.proto b/src/main/java/com/google/devtools/build/lib/buildeventstream/proto/build_event_stream.proto
index 74bdd0be26..7462b115a8 100644
--- a/src/main/java/com/google/devtools/build/lib/buildeventstream/proto/build_event_stream.proto
+++ b/src/main/java/com/google/devtools/build/lib/buildeventstream/proto/build_event_stream.proto
@@ -625,6 +625,14 @@ message BuildMetrics {
int64 actions_created = 1;
}
ActionSummary action_summary = 1;
+
+ message MemoryMetrics {
+ // Size of the JVM heap post build in bytes. This is only collected if
+ // --bep_publish_used_heap_size_post_build is set,
+ // since it forces a full GC.
+ int64 used_heap_size_post_build = 1;
+ }
+ MemoryMetrics memory_metrics = 2;
}
// Event providing additional statistics/logs after completion of the build.
diff --git a/src/main/java/com/google/devtools/build/lib/metrics/BUILD b/src/main/java/com/google/devtools/build/lib/metrics/BUILD
index 3bc0665041..67ebbae4bf 100644
--- a/src/main/java/com/google/devtools/build/lib/metrics/BUILD
+++ b/src/main/java/com/google/devtools/build/lib/metrics/BUILD
@@ -15,6 +15,7 @@ java_library(
"//src/main/java/com/google/devtools/build/lib:runtime",
"//src/main/java/com/google/devtools/build/lib/buildeventstream",
"//src/main/java/com/google/devtools/build/lib/buildeventstream/proto:build_event_stream_java_proto",
+ "//src/main/java/com/google/devtools/common/options",
"//third_party:guava",
],
)
diff --git a/src/main/java/com/google/devtools/build/lib/metrics/MetricsCollector.java b/src/main/java/com/google/devtools/build/lib/metrics/MetricsCollector.java
index a273a8beb4..180064c111 100644
--- a/src/main/java/com/google/devtools/build/lib/metrics/MetricsCollector.java
+++ b/src/main/java/com/google/devtools/build/lib/metrics/MetricsCollector.java
@@ -17,16 +17,24 @@ import com.google.common.eventbus.Subscribe;
import com.google.devtools.build.lib.analysis.AnalysisPhaseCompleteEvent;
import com.google.devtools.build.lib.buildeventstream.BuildEventStreamProtos.BuildMetrics;
import com.google.devtools.build.lib.buildeventstream.BuildEventStreamProtos.BuildMetrics.ActionSummary;
+import com.google.devtools.build.lib.buildeventstream.BuildEventStreamProtos.BuildMetrics.MemoryMetrics;
import com.google.devtools.build.lib.buildtool.buildevent.BuildCompleteEvent;
+import com.google.devtools.build.lib.metrics.MetricsModule.Options;
import com.google.devtools.build.lib.runtime.CommandEnvironment;
+import java.lang.management.ManagementFactory;
+import java.lang.management.MemoryMXBean;
class MetricsCollector {
private final CommandEnvironment env;
+ private final boolean bepPublishUsedHeapSizePostBuild;
+
private int actionsConstructed;
MetricsCollector(CommandEnvironment env) {
this.env = env;
+ this.bepPublishUsedHeapSizePostBuild =
+ env.getOptions().getOptions(Options.class).bepPublishUsedHeapSizePostBuild;
env.getEventBus().register(this);
}
@@ -45,8 +53,23 @@ class MetricsCollector {
}
private BuildMetrics createBuildMetrics() {
- return BuildMetrics.newBuilder()
- .setActionSummary(ActionSummary.newBuilder().setActionsCreated(actionsConstructed).build())
- .build();
+ BuildMetrics.Builder metrics = BuildMetrics.newBuilder();
+ metrics.setActionSummary(createActionSummary());
+ metrics.setMemoryMetrics(createMemoryMetrics());
+ return metrics.build();
+ }
+
+ private ActionSummary createActionSummary() {
+ return ActionSummary.newBuilder().setActionsCreated(actionsConstructed).build();
+ }
+
+ private MemoryMetrics createMemoryMetrics() {
+ MemoryMetrics.Builder memoryMetrics = MemoryMetrics.newBuilder();
+ if (bepPublishUsedHeapSizePostBuild) {
+ System.gc();
+ MemoryMXBean memBean = ManagementFactory.getMemoryMXBean();
+ memoryMetrics.setUsedHeapSizePostBuild(memBean.getHeapMemoryUsage().getUsed());
+ }
+ return memoryMetrics.build();
}
}
diff --git a/src/main/java/com/google/devtools/build/lib/metrics/MetricsModule.java b/src/main/java/com/google/devtools/build/lib/metrics/MetricsModule.java
index 0c8c32f5b2..ae4e86edf9 100644
--- a/src/main/java/com/google/devtools/build/lib/metrics/MetricsModule.java
+++ b/src/main/java/com/google/devtools/build/lib/metrics/MetricsModule.java
@@ -13,8 +13,14 @@
// limitations under the License.
package com.google.devtools.build.lib.metrics;
+import com.google.common.collect.ImmutableList;
import com.google.devtools.build.lib.runtime.BlazeModule;
+import com.google.devtools.build.lib.runtime.Command;
import com.google.devtools.build.lib.runtime.CommandEnvironment;
+import com.google.devtools.common.options.Option;
+import com.google.devtools.common.options.OptionDocumentationCategory;
+import com.google.devtools.common.options.OptionEffectTag;
+import com.google.devtools.common.options.OptionsBase;
/**
* A blaze module that installs metrics instrumentations and issues a {@link BuildMetricsEvent} at
@@ -22,6 +28,24 @@ import com.google.devtools.build.lib.runtime.CommandEnvironment;
*/
public class MetricsModule extends BlazeModule {
+ /** Metrics options. */
+ public static final class Options extends OptionsBase {
+ @Option(
+ name = "bep_publish_used_heap_size_post_build",
+ defaultValue = "false",
+ documentationCategory = OptionDocumentationCategory.LOGGING,
+ effectTags = {OptionEffectTag.UNKNOWN},
+ help =
+ "When set we collect and publish used_heap_size_post_build "
+ + "from build_event_stream.proto. This forces a full GC and is off by default.")
+ public boolean bepPublishUsedHeapSizePostBuild;
+ }
+
+ @Override
+ public Iterable<Class<? extends OptionsBase>> getCommandOptions(Command command) {
+ return ImmutableList.of(Options.class);
+ }
+
@Override
public void beforeCommand(CommandEnvironment env) {
MetricsCollector.installInEnv(env);