Add metric to count submit rule errors

Signed-off-by: Edwin Kempin <ekempin@google.com>
Change-Id: I0746546c87f4ef55887c238e0c86f6eb8b72117e
diff --git a/java/com/google/gerrit/plugins/codeowners/backend/CodeOwnerSubmitRule.java b/java/com/google/gerrit/plugins/codeowners/backend/CodeOwnerSubmitRule.java
index 780e352..c35d1b0 100644
--- a/java/com/google/gerrit/plugins/codeowners/backend/CodeOwnerSubmitRule.java
+++ b/java/com/google/gerrit/plugins/codeowners/backend/CodeOwnerSubmitRule.java
@@ -100,6 +100,7 @@
               changeData.currentPatchSet().id().get(), changeData.change().getId().get()));
       return Optional.of(notReady());
     } catch (Throwable t) {
+      String cause = t.getClass().getSimpleName();
       String errorMessage = "Failed to evaluate code owner statuses";
       if (changeData != null) {
         errorMessage +=
@@ -112,6 +113,7 @@
       Optional<InvalidCodeOwnerConfigException> invalidCodeOwnerConfigException =
           CodeOwners.getInvalidCodeOwnerConfigCause(t);
       if (invalidPathException.isPresent()) {
+        cause = "invalid_path";
         errorMessage += String.format(" (cause: %s)", invalidPathException.get().getMessage());
       } else if (invalidCodeOwnerConfigException.isPresent()) {
         codeOwnerMetrics.countInvalidCodeOwnerConfigFiles.increment(
@@ -119,6 +121,7 @@
             invalidCodeOwnerConfigException.get().getRef(),
             invalidCodeOwnerConfigException.get().getCodeOwnerConfigFilePath());
 
+        cause = "invalid_code_owner_config_file";
         errorMessage +=
             String.format(" (cause: %s)", invalidCodeOwnerConfigException.get().getMessage());
 
@@ -133,6 +136,7 @@
       }
       errorMessage += ".";
       logger.atSevere().withCause(t).log(errorMessage);
+      codeOwnerMetrics.countCodeOwnerSubmitRuleErrors.increment(cause);
       return Optional.of(ruleError(errorMessage));
     }
   }
diff --git a/java/com/google/gerrit/plugins/codeowners/metrics/CodeOwnerMetrics.java b/java/com/google/gerrit/plugins/codeowners/metrics/CodeOwnerMetrics.java
index 8660d5c..cf847df 100644
--- a/java/com/google/gerrit/plugins/codeowners/metrics/CodeOwnerMetrics.java
+++ b/java/com/google/gerrit/plugins/codeowners/metrics/CodeOwnerMetrics.java
@@ -15,6 +15,7 @@
 package com.google.gerrit.plugins.codeowners.metrics;
 
 import com.google.gerrit.metrics.Counter0;
+import com.google.gerrit.metrics.Counter1;
 import com.google.gerrit.metrics.Counter3;
 import com.google.gerrit.metrics.Description;
 import com.google.gerrit.metrics.Description.Units;
@@ -57,6 +58,7 @@
   // counter metrics
   public final Counter0 countCodeOwnerConfigReads;
   public final Counter0 countCodeOwnerConfigCacheReads;
+  public final Counter1<String> countCodeOwnerSubmitRuleErrors;
   public final Counter0 countCodeOwnerSubmitRuleRuns;
   public final Counter3<String, String, String> countInvalidCodeOwnerConfigFiles;
 
@@ -152,6 +154,13 @@
         createCounter(
             "count_code_owner_config_cache_reads",
             "Total number of code owner config reads from cache");
+    this.countCodeOwnerSubmitRuleErrors =
+        createCounter1(
+            "count_code_owner_submit_rule_errors",
+            "Total number of code owner submit rule errors",
+            Field.ofString("cause", Metadata.Builder::cause)
+                .description("The cause of the submit rule error.")
+                .build());
     this.countCodeOwnerSubmitRuleRuns =
         createCounter(
             "count_code_owner_submit_rule_runs", "Total number of code owner submit rule runs");
@@ -195,6 +204,10 @@
     return metricMaker.newCounter(name, new Description(description).setRate());
   }
 
+  private <F1> Counter1<F1> createCounter1(String name, String description, Field<F1> field1) {
+    return metricMaker.newCounter(name, new Description(description).setRate(), field1);
+  }
+
   private <F1, F2, F3> Counter3<F1, F2, F3> createCounter3(
       String name, String description, Field<F1> field1, Field<F2> field2, Field<F3> field3) {
     return metricMaker.newCounter(
diff --git a/resources/Documentation/metrics.md b/resources/Documentation/metrics.md
index 7459fb3..5cff902 100644
--- a/resources/Documentation/metrics.md
+++ b/resources/Documentation/metrics.md
@@ -57,6 +57,10 @@
   Total number of code owner config reads from backend.
 * `count_code_owner_config_cache_reads`:
   Total number of code owner config reads from cache.
+* `count_code_owner_submit_rule_errors`:
+  Total number of code owner submit rule errors.
+    * `cause`:
+      The cause of the submit rule error.
 * `count_code_owner_submit_rule_runs`:
   Total number of code owner submit rule runs.
 * `count_invalid_code_owner_config_files`: