Introduce E2E apply object REST-API metrics The E2E replication through the apply object REST-API needs to be calculated from the client originating the call where the initial ref-update happens. Introduce a new end_2_end metric to track this latency. Change-Id: Ib6b585e076ffcea55b53e603ad1c7e5f5b7b69fc
diff --git a/src/main/java/com/googlesource/gerrit/plugins/replication/pull/ApplyObjectMetrics.java b/src/main/java/com/googlesource/gerrit/plugins/replication/pull/ApplyObjectMetrics.java index 78b6ddb..78745bb 100644 --- a/src/main/java/com/googlesource/gerrit/plugins/replication/pull/ApplyObjectMetrics.java +++ b/src/main/java/com/googlesource/gerrit/plugins/replication/pull/ApplyObjectMetrics.java
@@ -26,25 +26,33 @@ @Singleton public class ApplyObjectMetrics { private final Timer1<String> executionTime; + private final Timer1<String> end2EndTime; @Inject ApplyObjectMetrics(@PluginName String pluginName, MetricMaker metricMaker) { - Field<String> SOURCE_FIELD = + Field<String> field = Field.ofString( - "source", + "pull_replication", (metadataBuilder, fieldValue) -> metadataBuilder .pluginName(pluginName) - .addPluginMetadata(PluginMetadata.create("source", fieldValue))) + .addPluginMetadata(PluginMetadata.create("pull_replication", fieldValue))) .build(); - executionTime = metricMaker.newTimer( "apply_object_latency", new Description("Time spent applying object from remote source.") .setCumulative() .setUnit(Description.Units.MILLISECONDS), - SOURCE_FIELD); + field); + + end2EndTime = + metricMaker.newTimer( + "apply_object_end_2_end_latency", + new Description("Time spent for e2e replication with the apply object REST API") + .setCumulative() + .setUnit(Description.Units.MILLISECONDS), + field); } /** @@ -56,4 +64,14 @@ public Timer1.Context<String> start(String name) { return executionTime.start(name); } + + /** + * Start the replication latency timer from a source. + * + * @param name the source name. + * @return the timer context. + */ + public Timer1.Context<String> startEnd2End(String name) { + return end2EndTime.start(name); + } }
diff --git a/src/main/java/com/googlesource/gerrit/plugins/replication/pull/ReplicationQueue.java b/src/main/java/com/googlesource/gerrit/plugins/replication/pull/ReplicationQueue.java index 0ce125d..6393c08 100644 --- a/src/main/java/com/googlesource/gerrit/plugins/replication/pull/ReplicationQueue.java +++ b/src/main/java/com/googlesource/gerrit/plugins/replication/pull/ReplicationQueue.java
@@ -15,7 +15,6 @@ package com.googlesource.gerrit.plugins.replication.pull; import com.google.auto.value.AutoValue; -import com.google.common.base.Stopwatch; import com.google.common.collect.Queues; import com.google.gerrit.entities.Project; import com.google.gerrit.entities.Project.NameKey; @@ -24,6 +23,7 @@ import com.google.gerrit.extensions.events.LifecycleListener; import com.google.gerrit.extensions.events.ProjectDeletedListener; import com.google.gerrit.extensions.registration.DynamicItem; +import com.google.gerrit.metrics.Timer1.Context; import com.google.gerrit.server.events.EventDispatcher; import com.google.gerrit.server.git.WorkQueue; import com.google.inject.Inject; @@ -76,6 +76,7 @@ private Integer fetchCallsTimeout; private ExcludedRefsFilter refsFilter; private RevisionReader revisionReader; + private final ApplyObjectMetrics applyObjectMetrics; @Inject ReplicationQueue( @@ -85,7 +86,8 @@ ReplicationStateListeners sl, FetchApiClient.Factory fetchClientFactory, ExcludedRefsFilter refsFilter, - RevisionReader revReader) { + RevisionReader revReader, + ApplyObjectMetrics applyObjectMetrics) { workQueue = wq; dispatcher = dis; sources = rd; @@ -94,6 +96,7 @@ this.fetchClientFactory = fetchClientFactory; this.refsFilter = refsFilter; this.revisionReader = revReader; + this.applyObjectMetrics = applyObjectMetrics; } @Override @@ -287,7 +290,7 @@ project, refName, revision); - Stopwatch apiTimer = Stopwatch.createStarted(); + Context<String> apiTimer = applyObjectMetrics.startEnd2End(source.getRemoteConfigName()); HttpResult result = fetchClient.callSendObject(project, refName, isDelete, revision, uri); repLog.info( "Pull replication REST API apply object to {} COMPLETED for {}:{} - {}, HTTP Result:" @@ -297,7 +300,7 @@ refName, revision, result, - apiTimer.elapsed(TimeUnit.MILLISECONDS)); + apiTimer.stop() / 1000000.0); if (isProjectMissing(result, project) && source.isCreateMissingRepositories()) { result = initProject(project, uri, fetchClient, result);
diff --git a/src/test/java/com/googlesource/gerrit/plugins/replication/pull/ReplicationQueueTest.java b/src/test/java/com/googlesource/gerrit/plugins/replication/pull/ReplicationQueueTest.java index 4e831bc..08d7e5a 100644 --- a/src/test/java/com/googlesource/gerrit/plugins/replication/pull/ReplicationQueueTest.java +++ b/src/test/java/com/googlesource/gerrit/plugins/replication/pull/ReplicationQueueTest.java
@@ -35,6 +35,7 @@ import com.google.gerrit.extensions.events.GitReferenceUpdatedListener.Event; import com.google.gerrit.extensions.events.ProjectDeletedListener; import com.google.gerrit.extensions.registration.DynamicItem; +import com.google.gerrit.metrics.DisabledMetricMaker; import com.google.gerrit.server.config.SitePaths; import com.google.gerrit.server.events.EventDispatcher; import com.google.gerrit.server.git.WorkQueue; @@ -79,6 +80,7 @@ @Mock RevisionReader revReader; @Mock RevisionData revisionData; @Mock HttpResult httpResult; + ApplyObjectMetrics applyObjectMetrics; @Captor ArgumentCaptor<String> stringCaptor; @Captor ArgumentCaptor<Project.NameKey> projectNameKeyCaptor; @@ -110,8 +112,11 @@ when(httpResult.isSuccessful()).thenReturn(true); when(httpResult.isProjectMissing(any())).thenReturn(false); + applyObjectMetrics = new ApplyObjectMetrics("pull-replication", new DisabledMetricMaker()); + objectUnderTest = - new ReplicationQueue(wq, rd, dis, sl, fetchClientFactory, refsFilter, revReader); + new ReplicationQueue( + wq, rd, dis, sl, fetchClientFactory, refsFilter, revReader, applyObjectMetrics); } @Test @@ -242,7 +247,8 @@ refsFilter = new ExcludedRefsFilter(replicationConfig); objectUnderTest = - new ReplicationQueue(wq, rd, dis, sl, fetchClientFactory, refsFilter, revReader); + new ReplicationQueue( + wq, rd, dis, sl, fetchClientFactory, refsFilter, revReader, applyObjectMetrics); Event event = new TestEvent("refs/multi-site/version"); objectUnderTest.onGitReferenceUpdated(event);