Makes dumping `starlark_memory` adopt `InstrumentationOutput`

PiperOrigin-RevId: 696656280
Change-Id: I9913d561674dd5547b13333a536167c0e4601ab0
diff --git a/src/main/java/com/google/devtools/build/lib/profiler/memory/AllocationTracker.java b/src/main/java/com/google/devtools/build/lib/profiler/memory/AllocationTracker.java
index 3611cee..b21af90 100644
--- a/src/main/java/com/google/devtools/build/lib/profiler/memory/AllocationTracker.java
+++ b/src/main/java/com/google/devtools/build/lib/profiler/memory/AllocationTracker.java
@@ -31,8 +31,8 @@
 import com.google.perftools.profiles.ProfileProto.Profile;
 import com.google.perftools.profiles.ProfileProto.Sample;
 import com.google.perftools.profiles.ProfileProto.ValueType;
-import java.io.FileOutputStream;
 import java.io.IOException;
+import java.io.OutputStream;
 import java.time.Instant;
 import java.util.HashMap;
 import java.util.Map;
@@ -281,14 +281,14 @@
   }
 
   /** Dumps all Starlark analysis time allocations to a pprof-compatible file. */
-  public void dumpStarlarkAllocations(String path) throws IOException {
+  public void dumpStarlarkAllocations(OutputStream outputStream) throws IOException {
     // Make sure we don't track our own allocations
     enabled = false;
     System.gc();
     Profile profile = buildMemoryProfile();
-    try (GZIPOutputStream outputStream = new GZIPOutputStream(new FileOutputStream(path))) {
-      profile.writeTo(outputStream);
-      outputStream.finish();
+    try (GZIPOutputStream gzipOutputStream = new GZIPOutputStream(outputStream)) {
+      profile.writeTo(gzipOutputStream);
+      gzipOutputStream.finish();
     }
     enabled = true;
   }
diff --git a/src/main/java/com/google/devtools/build/lib/runtime/commands/DumpCommand.java b/src/main/java/com/google/devtools/build/lib/runtime/commands/DumpCommand.java
index 5b1bf8d..073a4c0 100644
--- a/src/main/java/com/google/devtools/build/lib/runtime/commands/DumpCommand.java
+++ b/src/main/java/com/google/devtools/build/lib/runtime/commands/DumpCommand.java
@@ -39,6 +39,8 @@
 import com.google.devtools.build.lib.runtime.BlazeWorkspace;
 import com.google.devtools.build.lib.runtime.Command;
 import com.google.devtools.build.lib.runtime.CommandEnvironment;
+import com.google.devtools.build.lib.runtime.InstrumentationOutput;
+import com.google.devtools.build.lib.runtime.InstrumentationOutputFactory.DestinationRelativeTo;
 import com.google.devtools.build.lib.server.FailureDetails;
 import com.google.devtools.build.lib.server.FailureDetails.DumpCommand.Code;
 import com.google.devtools.build.lib.server.FailureDetails.FailureDetail;
@@ -52,6 +54,7 @@
 import com.google.devtools.build.lib.util.MemoryAccountant.Stats;
 import com.google.devtools.build.lib.util.RegexFilter;
 import com.google.devtools.build.lib.util.RegexFilter.RegexFilterConverter;
+import com.google.devtools.build.lib.vfs.PathFragment;
 import com.google.devtools.build.skyframe.InMemoryGraph;
 import com.google.devtools.build.skyframe.MemoizingEvaluator;
 import com.google.devtools.build.skyframe.NodeEntry;
@@ -384,7 +387,19 @@
 
       if (dumpOptions.starlarkMemory != null) {
         try {
-          dumpStarlarkHeap(env.getBlazeWorkspace(), dumpOptions.starlarkMemory, out);
+          InstrumentationOutput starlarkHeapOutput =
+              runtime
+                  .getInstrumentationOutputFactory()
+                  .createInstrumentationOutput(
+                      /* name= */ "starlark_heap",
+                      PathFragment.create(dumpOptions.starlarkMemory),
+                      DestinationRelativeTo.WORKSPACE_OR_HOME,
+                      env,
+                      env.getReporter(),
+                      /* append= */ null,
+                      /* internal= */ null);
+          dumpStarlarkHeap(
+              env.getBlazeWorkspace(), starlarkHeapOutput, dumpOptions.starlarkMemory, out);
         } catch (IOException e) {
           String message = "Could not dump Starlark memory";
           env.getReporter().error(null, message, e);
@@ -672,7 +687,11 @@
     return Optional.empty();
   }
 
-  private static void dumpStarlarkHeap(BlazeWorkspace workspace, String path, PrintStream out)
+  private static void dumpStarlarkHeap(
+      BlazeWorkspace workspace,
+      InstrumentationOutput starlarkHeapOutput,
+      String path,
+      PrintStream out)
       throws IOException {
     AllocationTracker allocationTracker = workspace.getAllocationTracker();
     if (allocationTracker == null) {
@@ -683,7 +702,10 @@
       return;
     }
     out.println("Dumping Starlark heap to: " + path);
-    allocationTracker.dumpStarlarkAllocations(path);
+
+    // OutputStream is expected to be closed when allocationTracker.dumpStarlarkAllocations()
+    // returns.
+    allocationTracker.dumpStarlarkAllocations(starlarkHeapOutput.createOutputStream());
   }
 
   static BlazeCommandResult createFailureResult(String message, Code detailedCode) {