Measure time taken to process a manifest

Measure time taken to parse the manifest, read all gitlinks and commit
to the superproject.

This gives us an idea on how long is it taking now and helps to track
regressions/improvements if we tweak with RepoCommand or the repo
opener.

Change-Id: Ia78acf37612ce5df0da28d6e6065544d196a3d17
diff --git a/java/com/googlesource/gerrit/plugins/supermanifest/SuperManifestRefUpdatedListener.java b/java/com/googlesource/gerrit/plugins/supermanifest/SuperManifestRefUpdatedListener.java
index a15b402..89f8dc2 100644
--- a/java/com/googlesource/gerrit/plugins/supermanifest/SuperManifestRefUpdatedListener.java
+++ b/java/com/googlesource/gerrit/plugins/supermanifest/SuperManifestRefUpdatedListener.java
@@ -34,6 +34,7 @@
 import com.google.gerrit.metrics.Description;
 import com.google.gerrit.metrics.Field;
 import com.google.gerrit.metrics.MetricMaker;
+import com.google.gerrit.metrics.Timer1;
 import com.google.gerrit.server.GerritPersonIdent;
 import com.google.gerrit.server.IdentifiedUser;
 import com.google.gerrit.server.config.AllProjectsName;
@@ -100,6 +101,7 @@
   private final PermissionBackend permissionBackend;
   private final PluginMapContext<DownloadScheme> downloadScheme;
   private final Counter1<String> manifestUpdateResultCounter;
+  private final Timer1<ConfigEntry.ToolType> superprojectCommitTimer;
 
   // Mutable.
   private Set<ConfigEntry> config;
@@ -146,6 +148,19 @@
                             .addPluginMetadata(PluginMetadata.create("update_result", fieldValue)))
                 .description("result of a manifest update")
                 .build());
+    this.superprojectCommitTimer =
+        metrics.newTimer(
+            "supermanifest/superproject_commit_latency",
+            new Description("Time taken to parse the manifest and commit to the superproject"),
+            Field.ofEnum(
+                    ConfigEntry.ToolType.class,
+                    "tool",
+                    (metadataBuilder, fieldValue) ->
+                        metadataBuilder
+                            .pluginName("supermanifest")
+                            .addPluginMetadata(PluginMetadata.create("tool", fieldValue)))
+                .description("Tool handling the manifest (repo or jiri)")
+                .build());
   }
 
   @FormatMethod
@@ -378,7 +393,8 @@
 
     String status = "NOT_ATTEMPTED";
     try (GerritRemoteReader reader =
-        new GerritRemoteReader(repoManagerFactory.create(c), canonicalWebUrl.toString())) {
+            new GerritRemoteReader(repoManagerFactory.create(c), canonicalWebUrl.toString());
+        Timer1.Context<ConfigEntry.ToolType> ignored = superprojectCommitTimer.start(c.toolType)) {
       subModuleUpdater.update(reader, c, refName);
       status = "OK";
     } catch (ConcurrentRefUpdateException e) {