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.
 
