Merge changes I946a69e4,I45103f0e

* changes:
  Add metric to record latency for resolving code owner references
  Document resolve_path_code_owners metric
diff --git a/java/com/google/gerrit/plugins/codeowners/backend/CodeOwnerResolver.java b/java/com/google/gerrit/plugins/codeowners/backend/CodeOwnerResolver.java
index e7e18e5..a1f1c34 100644
--- a/java/com/google/gerrit/plugins/codeowners/backend/CodeOwnerResolver.java
+++ b/java/com/google/gerrit/plugins/codeowners/backend/CodeOwnerResolver.java
@@ -225,42 +225,45 @@
     requireNonNull(codeOwnerReferences, "codeOwnerReferences");
     requireNonNull(unresolvedImports, "unresolvedImports");
     requireNonNull(pathCodeOwnersMessages, "pathCodeOwnersMessages");
-    AtomicBoolean ownedByAllUsers = new AtomicBoolean(false);
-    AtomicBoolean hasUnresolvedCodeOwners = new AtomicBoolean(false);
-    List<String> messages = new ArrayList<>(pathCodeOwnersMessages);
-    unresolvedImports.forEach(
-        unresolvedImport -> messages.add(unresolvedImportFormatter.format(unresolvedImport)));
-    ImmutableSet<CodeOwner> codeOwners =
-        codeOwnerReferences.stream()
-            .filter(
-                codeOwnerReference -> {
-                  if (ALL_USERS_WILDCARD.equals(codeOwnerReference.email())) {
-                    ownedByAllUsers.set(true);
-                    return false;
-                  }
-                  return true;
-                })
-            .map(this::resolveWithMessages)
-            .filter(
-                resolveResult -> {
-                  messages.addAll(resolveResult.messages());
-                  if (!resolveResult.isPresent()) {
-                    hasUnresolvedCodeOwners.set(true);
-                    return false;
-                  }
-                  return true;
-                })
-            .map(OptionalResultWithMessages::get)
-            .collect(toImmutableSet());
-    CodeOwnerResolverResult codeOwnerResolverResult =
-        CodeOwnerResolverResult.create(
-            codeOwners,
-            ownedByAllUsers.get(),
-            hasUnresolvedCodeOwners.get(),
-            !unresolvedImports.isEmpty(),
-            messages);
-    logger.atFine().log("resolve result = %s", codeOwnerResolverResult);
-    return codeOwnerResolverResult;
+
+    try (Timer0.Context ctx = codeOwnerMetrics.resolveCodeOwnerReferences.start()) {
+      AtomicBoolean ownedByAllUsers = new AtomicBoolean(false);
+      AtomicBoolean hasUnresolvedCodeOwners = new AtomicBoolean(false);
+      List<String> messages = new ArrayList<>(pathCodeOwnersMessages);
+      unresolvedImports.forEach(
+          unresolvedImport -> messages.add(unresolvedImportFormatter.format(unresolvedImport)));
+      ImmutableSet<CodeOwner> codeOwners =
+          codeOwnerReferences.stream()
+              .filter(
+                  codeOwnerReference -> {
+                    if (ALL_USERS_WILDCARD.equals(codeOwnerReference.email())) {
+                      ownedByAllUsers.set(true);
+                      return false;
+                    }
+                    return true;
+                  })
+              .map(this::resolveWithMessages)
+              .filter(
+                  resolveResult -> {
+                    messages.addAll(resolveResult.messages());
+                    if (!resolveResult.isPresent()) {
+                      hasUnresolvedCodeOwners.set(true);
+                      return false;
+                    }
+                    return true;
+                  })
+              .map(OptionalResultWithMessages::get)
+              .collect(toImmutableSet());
+      CodeOwnerResolverResult codeOwnerResolverResult =
+          CodeOwnerResolverResult.create(
+              codeOwners,
+              ownedByAllUsers.get(),
+              hasUnresolvedCodeOwners.get(),
+              !unresolvedImports.isEmpty(),
+              messages);
+      logger.atFine().log("resolve result = %s", codeOwnerResolverResult);
+      return codeOwnerResolverResult;
+    }
   }
 
   /**
diff --git a/java/com/google/gerrit/plugins/codeowners/metrics/CodeOwnerMetrics.java b/java/com/google/gerrit/plugins/codeowners/metrics/CodeOwnerMetrics.java
index cf847df..4e952be 100644
--- a/java/com/google/gerrit/plugins/codeowners/metrics/CodeOwnerMetrics.java
+++ b/java/com/google/gerrit/plugins/codeowners/metrics/CodeOwnerMetrics.java
@@ -45,6 +45,7 @@
   public final Timer0 resolveCodeOwnerConfig;
   public final Timer0 resolveCodeOwnerConfigImport;
   public final Timer0 resolveCodeOwnerConfigImports;
+  public final Timer0 resolveCodeOwnerReferences;
   public final Timer0 resolvePathCodeOwners;
   public final Timer0 runCodeOwnerSubmitRule;
 
@@ -117,6 +118,9 @@
         createLatencyTimer(
             "resolve_code_owner_config_imports",
             "Latency for resolving all imports of a code owner config file");
+    this.resolveCodeOwnerReferences =
+        createLatencyTimer(
+            "resolve_code_owner_references", "Latency for resolving the code owner references");
     this.resolvePathCodeOwners =
         createLatencyTimer(
             "resolve_path_code_owners", "Latency for resolving the code owners of a path");
diff --git a/resources/Documentation/metrics.md b/resources/Documentation/metrics.md
index 0fc2673..00659f7 100644
--- a/resources/Documentation/metrics.md
+++ b/resources/Documentation/metrics.md
@@ -37,6 +37,10 @@
   Latency for resolving an import of a code owner config file.
 * `resolve_code_owner_config_imports`:
   Latency for resolving all imports of a code owner config file.
+* `resolve_code_owner_references`:
+  Latency for resolving the code owner references.
+* `resolve_path_code_owners`:
+  Latency for resolving the code owners of a path.
 * `run_code_owner_submit_rule`:
   Latency for running the code owner submit rule.