Migrate writing `--explain` output to use `InstrumentationOutput` interface

PiperOrigin-RevId: 686659518
Change-Id: I4a9de1ac4880ef1c5dd01e4b5bcb1538e69029af
diff --git a/src/main/java/com/google/devtools/build/lib/buildtool/ExecutionTool.java b/src/main/java/com/google/devtools/build/lib/buildtool/ExecutionTool.java
index 9700457..0f11409 100644
--- a/src/main/java/com/google/devtools/build/lib/buildtool/ExecutionTool.java
+++ b/src/main/java/com/google/devtools/build/lib/buildtool/ExecutionTool.java
@@ -85,6 +85,8 @@
 import com.google.devtools.build.lib.runtime.BlazeModule;
 import com.google.devtools.build.lib.runtime.BlazeRuntime;
 import com.google.devtools.build.lib.runtime.CommandEnvironment;
+import com.google.devtools.build.lib.runtime.CommonCommandOptions;
+import com.google.devtools.build.lib.runtime.InstrumentationOutput;
 import com.google.devtools.build.lib.server.FailureDetails;
 import com.google.devtools.build.lib.server.FailureDetails.Execution;
 import com.google.devtools.build.lib.server.FailureDetails.Execution.Code;
@@ -722,7 +724,7 @@
   private static BuildConfigurationValue getConfiguration(
       SkyframeExecutor executor, Reporter reporter, BuildOptions options) {
     try {
-      return executor.getConfiguration(reporter, options, /*keepGoing=*/ false);
+      return executor.getConfiguration(reporter, options, /* keepGoing= */ false);
     } catch (InvalidConfigurationException e) {
       reporter.handle(
           Event.warn(
@@ -846,9 +848,21 @@
     }
     ExplanationHandler handler;
     try {
-      handler =
-          new ExplanationHandler(
-              getWorkspace().getRelative(explanationPath).getOutputStream(), allOptions);
+      InstrumentationOutput instrumentationOutput =
+          runtime
+              .getInstrumentationOutputFactory()
+              .createInstrumentationOutput(
+                  /* name= */ "explain",
+                  getWorkspace().getRelative(explanationPath),
+                  env.getOptions(),
+                  env.getOptions()
+                      .getOptions(CommonCommandOptions.class)
+                      .redirectLocalInstrumentationOutputWrites,
+                  getReporter(),
+                  /* convenienceName= */ null,
+                  /* append= */ null,
+                  /* internal= */ null);
+      handler = new ExplanationHandler(instrumentationOutput.createOutputStream(), allOptions);
     } catch (IOException e) {
       getReporter()
           .handle(
@@ -1087,9 +1101,7 @@
       if (progressReceiverStarted.compareAndSet(false, true)) {
         // TODO(leba): count test actions
         ExecutionProgressReceiver executionProgressReceiver =
-            new ExecutionProgressReceiver(
-                /*exclusiveTestsCount=*/ 0,
-                env.getEventBus());
+            new ExecutionProgressReceiver(/* exclusiveTestsCount= */ 0, env.getEventBus());
         env.getEventBus()
             .post(new ExecutionProgressReceiverAvailableEvent(executionProgressReceiver));
 
diff --git a/src/main/java/com/google/devtools/build/lib/runtime/BlazeRuntime.java b/src/main/java/com/google/devtools/build/lib/runtime/BlazeRuntime.java
index 28aac27..de577eb 100644
--- a/src/main/java/com/google/devtools/build/lib/runtime/BlazeRuntime.java
+++ b/src/main/java/com/google/devtools/build/lib/runtime/BlazeRuntime.java
@@ -1517,6 +1517,10 @@
     return repositoryRemoteExecutorFactory;
   }
 
+  public InstrumentationOutputFactory getInstrumentationOutputFactory() {
+    return instrumentationOutputFactory;
+  }
+
   /**
    * A builder for {@link BlazeRuntime} objects. The only required fields are the {@link
    * BlazeDirectories}, and the {@link com.google.devtools.build.lib.packages.RuleClassProvider}