Move critical path computation out of runtime

... so that we can use it for posting a machine-readable form of the critical path as build metric in the build event stream.

Closes #16611.

PiperOrigin-RevId: 522304794
Change-Id: Ieb7e1dbc1a4a330341a5fd4f32eae8bc5edc5390
diff --git a/src/main/java/com/google/devtools/build/lib/BUILD b/src/main/java/com/google/devtools/build/lib/BUILD
index 91ab0ad..39c404d 100644
--- a/src/main/java/com/google/devtools/build/lib/BUILD
+++ b/src/main/java/com/google/devtools/build/lib/BUILD
@@ -349,6 +349,7 @@
         "//src/main/java/com/google/devtools/build/lib/jni",
         "//src/main/java/com/google/devtools/build/lib/metrics:event",
         "//src/main/java/com/google/devtools/build/lib/metrics:garbage-collection-metrics-util",
+        "//src/main/java/com/google/devtools/build/lib/metrics/criticalpath",
         "//src/main/java/com/google/devtools/build/lib/packages",
         "//src/main/java/com/google/devtools/build/lib/packages/semantics",
         "//src/main/java/com/google/devtools/build/lib/pkgcache",
diff --git a/src/main/java/com/google/devtools/build/lib/actions/SpawnExecutedEvent.java b/src/main/java/com/google/devtools/build/lib/actions/SpawnExecutedEvent.java
index 29ad0f0..dfb8aa0 100644
--- a/src/main/java/com/google/devtools/build/lib/actions/SpawnExecutedEvent.java
+++ b/src/main/java/com/google/devtools/build/lib/actions/SpawnExecutedEvent.java
@@ -58,9 +58,10 @@
   /**
    * This event is fired to differentiate actions with multiple spawns that are run sequentially
    * versus parallel. An example of a use case of why this would be important is if we have flaky
-   * tests. We want to tell the {@link com.google.devtools.build.lib.runtime.CriticalPathComponent}
-   * that all the failed test spawns should have their Duration metrics aggregated so the test
-   * runtime matches the runtime of the entire CriticalPathComponent.
+   * tests. We want to tell the {@link
+   * com.google.devtools.build.lib.metrics.criticalpath.CriticalPathComponent} that all the failed
+   * test spawns should have their Duration metrics aggregated so the test runtime matches the
+   * runtime of the entire CriticalPathComponent.
    */
   public static final class ChangePhase implements ExtendedEventHandler.Postable {
     private final Action action;
diff --git a/src/main/java/com/google/devtools/build/lib/runtime/AggregatedCriticalPath.java b/src/main/java/com/google/devtools/build/lib/metrics/criticalpath/AggregatedCriticalPath.java
similarity index 98%
rename from src/main/java/com/google/devtools/build/lib/runtime/AggregatedCriticalPath.java
rename to src/main/java/com/google/devtools/build/lib/metrics/criticalpath/AggregatedCriticalPath.java
index bd38d02..a976ce4 100644
--- a/src/main/java/com/google/devtools/build/lib/runtime/AggregatedCriticalPath.java
+++ b/src/main/java/com/google/devtools/build/lib/metrics/criticalpath/AggregatedCriticalPath.java
@@ -12,7 +12,7 @@
 // See the License for the specific language governing permissions and
 // limitations under the License.
 
-package com.google.devtools.build.lib.runtime;
+package com.google.devtools.build.lib.metrics.criticalpath;
 
 import com.google.common.base.Joiner;
 import com.google.common.collect.ImmutableList;
diff --git a/src/main/java/com/google/devtools/build/lib/metrics/criticalpath/BUILD b/src/main/java/com/google/devtools/build/lib/metrics/criticalpath/BUILD
new file mode 100644
index 0000000..70fc413
--- /dev/null
+++ b/src/main/java/com/google/devtools/build/lib/metrics/criticalpath/BUILD
@@ -0,0 +1,28 @@
+load("@rules_java//java:defs.bzl", "java_library")
+
+package(
+    default_applicable_licenses = ["//:license"],
+    default_visibility = ["//src:__subpackages__"],
+)
+
+filegroup(
+    name = "srcs",
+    srcs = glob(["*"]),
+    visibility = ["//src:__subpackages__"],
+)
+
+java_library(
+    name = "criticalpath",
+    srcs = glob(["*.java"]),
+    deps = [
+        "//src/main/java/com/google/devtools/build/lib/actions",
+        "//src/main/java/com/google/devtools/build/lib/actions:artifacts",
+        "//src/main/java/com/google/devtools/build/lib/clock",
+        "//src/main/java/com/google/devtools/build/lib/cmdline",
+        "//src/main/java/com/google/devtools/build/lib/concurrent",
+        "//src/main/java/com/google/devtools/build/lib/skyframe/rewinding:action_rewound_event",
+        "//third_party:flogger",
+        "//third_party:guava",
+        "//third_party:jsr305",
+    ],
+)
diff --git a/src/main/java/com/google/devtools/build/lib/runtime/CriticalPathComponent.java b/src/main/java/com/google/devtools/build/lib/metrics/criticalpath/CriticalPathComponent.java
similarity index 99%
rename from src/main/java/com/google/devtools/build/lib/runtime/CriticalPathComponent.java
rename to src/main/java/com/google/devtools/build/lib/metrics/criticalpath/CriticalPathComponent.java
index c69619f..8a6a98b 100644
--- a/src/main/java/com/google/devtools/build/lib/runtime/CriticalPathComponent.java
+++ b/src/main/java/com/google/devtools/build/lib/metrics/criticalpath/CriticalPathComponent.java
@@ -11,7 +11,8 @@
 // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 // See the License for the specific language governing permissions and
 // limitations under the License.
-package com.google.devtools.build.lib.runtime;
+
+package com.google.devtools.build.lib.metrics.criticalpath;
 
 import com.google.common.base.Preconditions;
 import com.google.devtools.build.lib.actions.Action;
diff --git a/src/main/java/com/google/devtools/build/lib/runtime/CriticalPathComputer.java b/src/main/java/com/google/devtools/build/lib/metrics/criticalpath/CriticalPathComputer.java
similarity index 99%
rename from src/main/java/com/google/devtools/build/lib/runtime/CriticalPathComputer.java
rename to src/main/java/com/google/devtools/build/lib/metrics/criticalpath/CriticalPathComputer.java
index 6479de7..f9f8464 100644
--- a/src/main/java/com/google/devtools/build/lib/runtime/CriticalPathComputer.java
+++ b/src/main/java/com/google/devtools/build/lib/metrics/criticalpath/CriticalPathComputer.java
@@ -12,7 +12,7 @@
 // See the License for the specific language governing permissions and
 // limitations under the License.
 
-package com.google.devtools.build.lib.runtime;
+package com.google.devtools.build.lib.metrics.criticalpath;
 
 import com.google.common.base.Preconditions;
 import com.google.common.collect.Comparators;
@@ -221,7 +221,7 @@
   public void discoverInputs(DiscoveredInputsEvent event) throws InterruptedException {
     CriticalPathComponent stats =
         tryAddComponent(createComponent(event.getAction(), event.getStartTimeNanos()));
-    stats.addSpawnResult(event.getMetrics(), null, "", /* wasRemote=*/ false);
+    stats.addSpawnResult(event.getMetrics(), null, "", /* wasRemote= */ false);
     stats.changePhase();
   }
 
diff --git a/src/main/java/com/google/devtools/build/lib/runtime/BuildSummaryStatsModule.java b/src/main/java/com/google/devtools/build/lib/runtime/BuildSummaryStatsModule.java
index f051d65..9a1fc76 100644
--- a/src/main/java/com/google/devtools/build/lib/runtime/BuildSummaryStatsModule.java
+++ b/src/main/java/com/google/devtools/build/lib/runtime/BuildSummaryStatsModule.java
@@ -31,6 +31,9 @@
 import com.google.devtools.build.lib.events.Reporter;
 import com.google.devtools.build.lib.exec.ExecutionOptions;
 import com.google.devtools.build.lib.exec.ExecutorBuilder;
+import com.google.devtools.build.lib.metrics.criticalpath.AggregatedCriticalPath;
+import com.google.devtools.build.lib.metrics.criticalpath.CriticalPathComponent;
+import com.google.devtools.build.lib.metrics.criticalpath.CriticalPathComputer;
 import com.google.devtools.build.lib.profiler.Profiler;
 import com.google.devtools.build.lib.profiler.ProfilerTask;
 import com.google.devtools.build.lib.profiler.SilentCloseable;
diff --git a/src/test/java/com/google/devtools/build/lib/metrics/BUILD b/src/test/java/com/google/devtools/build/lib/metrics/BUILD
index 5d3137a..64979a3 100644
--- a/src/test/java/com/google/devtools/build/lib/metrics/BUILD
+++ b/src/test/java/com/google/devtools/build/lib/metrics/BUILD
@@ -9,7 +9,9 @@
 filegroup(
     name = "srcs",
     testonly = 0,
-    srcs = glob(["*"]),
+    srcs = glob(["*"]) + [
+        "//src/main/java/com/google/devtools/build/lib/metrics/criticalpath:srcs",
+    ],
     visibility = ["//src:__subpackages__"],
 )