diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/notedb/ChangeNotes.java b/gerrit-server/src/main/java/com/google/gerrit/server/notedb/ChangeNotes.java index 7a90be59e2..8777e08272 100644 --- a/gerrit-server/src/main/java/com/google/gerrit/server/notedb/ChangeNotes.java +++ b/gerrit-server/src/main/java/com/google/gerrit/server/notedb/ChangeNotes.java @@ -18,6 +18,7 @@ import static com.google.common.base.Preconditions.checkArgument; import static com.google.common.base.Preconditions.checkNotNull; import static com.google.common.base.Preconditions.checkState; import static com.google.gerrit.reviewdb.client.RefNames.changeMetaRef; +import static com.google.gerrit.server.notedb.NoteDbTable.CHANGES; import com.google.common.annotations.VisibleForTesting; import com.google.common.base.Function; @@ -40,6 +41,7 @@ import com.google.common.util.concurrent.ListenableFuture; import com.google.common.util.concurrent.ListeningExecutorService; import com.google.gerrit.common.Nullable; import com.google.gerrit.common.data.SubmitRecord; +import com.google.gerrit.metrics.Timer1; import com.google.gerrit.reviewdb.client.Account; import com.google.gerrit.reviewdb.client.Change; import com.google.gerrit.reviewdb.client.ChangeMessage; @@ -593,10 +595,11 @@ public class ChangeNotes extends AbstractChangeNotes { private LoadHandle rebuildAndOpen(Repository repo, ObjectId oldId) throws IOException { - Change.Id cid = getChangeId(); - ReviewDb db = args.db.get(); - ChangeRebuilder rebuilder = args.rebuilder.get(); - try { + try (Timer1.Context timer = + args.metrics.autoRebuildLatency.start(CHANGES)) { + Change.Id cid = getChangeId(); + ReviewDb db = args.db.get(); + ChangeRebuilder rebuilder = args.rebuilder.get(); NoteDbUpdateManager manager = rebuilder.stage(db, cid); if (manager == null) { return super.openHandle(repo, oldId); // May be null in tests. @@ -615,6 +618,7 @@ public class ChangeNotes extends AbstractChangeNotes { // // Parse notes from the staged result so we can return something useful // to the caller instead of throwing. + args.metrics.autoRebuildFailureCount.increment(CHANGES); rebuildResult = checkNotNull(r); checkNotNull(r.newState()); checkNotNull(r.staged()); diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/notedb/NoteDbMetrics.java b/gerrit-server/src/main/java/com/google/gerrit/server/notedb/NoteDbMetrics.java index 79ebe0b7f2..24e87de33e 100644 --- a/gerrit-server/src/main/java/com/google/gerrit/server/notedb/NoteDbMetrics.java +++ b/gerrit-server/src/main/java/com/google/gerrit/server/notedb/NoteDbMetrics.java @@ -14,6 +14,7 @@ package com.google.gerrit.server.notedb; +import com.google.gerrit.metrics.Counter1; import com.google.gerrit.metrics.Description; import com.google.gerrit.metrics.Description.Units; import com.google.gerrit.metrics.Field; @@ -47,6 +48,17 @@ class NoteDbMetrics { */ final Timer1 parseLatency; + /** + * Latency due to auto-rebuilding entities when out of date. + *

+ * Excludes latency from reading ref to check whether the entity is up to + * date. + */ + final Timer1 autoRebuildLatency; + + /** Count of auto-rebuild attempts that failed. */ + final Counter1 autoRebuildFailureCount; + @Inject NoteDbMetrics(MetricMaker metrics) { Field view = Field.ofEnum(NoteDbTable.class, "table"); @@ -78,5 +90,18 @@ class NoteDbMetrics { .setCumulative() .setUnit(Units.MICROSECONDS), view); + + autoRebuildLatency = metrics.newTimer( + "notedb/auto_rebuild_latency", + new Description("NoteDb auto-rebuilding latency by table") + .setCumulative() + .setUnit(Units.MILLISECONDS), + view); + + autoRebuildFailureCount = metrics.newCounter( + "notedb/auto_rebuild_failure_count", + new Description("NoteDb auto-rebuilding attempts that failed by table") + .setCumulative(), + view); } }