Only keep single metric for replication status Keeping one metric per project would be too expensive in term of data transfer. Change-Id: I551ddb52f9d56b23643cda265b8a92ad576d8604
diff --git a/src/main/java/com/googlesource/gerrit/plugins/multisite/consumer/SubscriberMetrics.java b/src/main/java/com/googlesource/gerrit/plugins/multisite/consumer/SubscriberMetrics.java index 474520e..1911c86 100644 --- a/src/main/java/com/googlesource/gerrit/plugins/multisite/consumer/SubscriberMetrics.java +++ b/src/main/java/com/googlesource/gerrit/plugins/multisite/consumer/SubscriberMetrics.java
@@ -14,8 +14,6 @@ package com.googlesource.gerrit.plugins.multisite.consumer; -import com.codahale.metrics.MetricFilter; -import com.codahale.metrics.MetricRegistry; import com.gerritforge.gerrit.eventbroker.EventMessage; import com.google.common.flogger.FluentLogger; import com.google.gerrit.metrics.Counter1; @@ -27,6 +25,8 @@ import com.google.inject.Singleton; import com.googlesource.gerrit.plugins.multisite.validation.ProjectVersionRefUpdate; import com.googlesource.gerrit.plugins.replication.RefReplicatedEvent; +import java.util.Collection; +import java.util.Collections; import java.util.HashMap; import java.util.Map; import java.util.Optional; @@ -37,27 +37,21 @@ private static final String SUBSCRIBER_SUCCESS_COUNTER = "subscriber_msg_consumer_counter"; private static final String SUBSCRIBER_FAILURE_COUNTER = "subscriber_msg_consumer_failure_counter"; - private static final String PROJECT_REPLICATION_LAG_MS_PREFIX = - "multi_site/subscriber/subscriber_replication_status/ms_behind_for_"; + private static final String REPLICATION_LAG_MS = + "multi_site/subscriber/subscriber_replication_status/ms_behind"; private final Counter1<String> subscriberSuccessCounter; private final Counter1<String> subscriberFailureCounter; - private MetricRegistry metricRegistry; - private MetricMaker metricMaker; public Map<String, Long> replicationStatusPerProject = new HashMap<>(); private ProjectVersionRefUpdate projectVersionRefUpdate; @Inject public SubscriberMetrics( - MetricMaker metricMaker, - MetricRegistry metricRegistry, - ProjectVersionRefUpdate projectVersionRefUpdate) { + MetricMaker metricMaker, ProjectVersionRefUpdate projectVersionRefUpdate) { this.projectVersionRefUpdate = projectVersionRefUpdate; - this.metricMaker = metricMaker; - this.metricRegistry = metricRegistry; this.subscriberSuccessCounter = metricMaker.newCounter( "multi_site/subscriber/subscriber_message_consumer_counter", @@ -73,6 +67,17 @@ .setUnit("errors"), Field.ofString( SUBSCRIBER_FAILURE_COUNTER, "Subscriber failed to consume messages count")); + metricMaker.newCallbackMetric( + REPLICATION_LAG_MS, + Long.class, + new Description("Replication lag (ms)").setGauge().setUnit(Description.Units.MILLISECONDS), + () -> { + Collection<Long> lags = replicationStatusPerProject.values(); + if (lags.isEmpty()) { + return 0L; + } + return Collections.max(lags); + }); } public void incrementSubscriberConsumedMessage() { @@ -92,10 +97,9 @@ Optional<Long> remoteVersion = projectVersionRefUpdate.getProjectRemoteVersion(projectName); Optional<Long> localVersion = projectVersionRefUpdate.getProjectLocalVersion(projectName); if (remoteVersion.isPresent() && localVersion.isPresent()) { - Long lag = remoteVersion.get() - localVersion.get(); + long lag = remoteVersion.get() - localVersion.get(); logger.atFine().log("Calculated lag for project '%s' [%d]", projectName, lag); replicationStatusPerProject.put(projectName, lag); - upsertMetricsForProject(projectName); } else { logger.atFine().log( "Didn't update metric for %s. Local [%b] or remote [%b] version is not defined", @@ -105,20 +109,4 @@ logger.atFine().log("Not a ref-replicated-event event [%s], skipping", event.type); } } - - private void upsertMetricsForProject(String projectName) { - String metricName = PROJECT_REPLICATION_LAG_MS_PREFIX + projectName; - if (metricRegistry.getGauges(MetricFilter.contains(metricName)).isEmpty()) { - metricMaker.newCallbackMetric( - metricName, - Long.class, - new Description(String.format("%s replication lag (ms)", metricName)) - .setGauge() - .setUnit(Description.Units.MILLISECONDS), - () -> replicationStatusPerProject.get(projectName)); - logger.atFine().log("Added last replication timestamp callback metric for '%s'", projectName); - } else { - logger.atFine().log("Don't add metric since it already exists for project '%s'", projectName); - } - } }
diff --git a/src/main/resources/Documentation/about.md b/src/main/resources/Documentation/about.md index c1135bb..5ac3dec 100644 --- a/src/main/resources/Documentation/about.md +++ b/src/main/resources/Documentation/about.md
@@ -93,6 +93,6 @@ `metric=plugins/multi-site/multi_site/subscriber/subscriber_message_consumer_failure_counter/subscriber_msg_consumer_poll_failure_counter, type=com.codahale.metrics.Meter` -* Subscriber replication status per project (ms behind the producer) +* Subscriber replication status (ms behind the producer) -`metric=site/multi_site/subscriber/subscriber_replication_status/ms_behind_for_<projectName>, type=com.google.gerrit.metrics.dropwizard.CallbackMetricImpl` \ No newline at end of file +`metric=site/multi_site/subscriber/subscriber_replication_status/ms_behind, type=com.google.gerrit.metrics.dropwizard.CallbackMetricImpl` \ No newline at end of file