You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@sling.apache.org by cs...@apache.org on 2025/07/30 11:47:16 UTC
(sling-org-apache-sling-distribution-journal) branch SLING-12872 created (now bce5bd8)
This is an automated email from the ASF dual-hosted git repository.
cschneider pushed a change to branch SLING-12872
in repository https://gitbox.apache.org/repos/asf/sling-org-apache-sling-distribution-journal.git
at bce5bd8 SLING-12872 - Add metric for distribution readiness check
This branch includes the following new commits:
new bce5bd8 SLING-12872 - Add metric for distribution readiness check
The 1 revisions listed above as "new" are entirely new to this
repository and will be described in separate emails. The revisions
listed as "add" were already present in the repository and have only
been added to this reference.
(sling-org-apache-sling-distribution-journal) 01/01: SLING-12872 - Add metric for distribution readiness check
Posted by cs...@apache.org.
This is an automated email from the ASF dual-hosted git repository.
cschneider pushed a commit to branch SLING-12872
in repository https://gitbox.apache.org/repos/asf/sling-org-apache-sling-distribution-journal.git
commit bce5bd8a3fa9311ac4aba311ba18b7c3f89b9b15
Author: Christian Schneider <cs...@adobe.com>
AuthorDate: Wed Jul 30 12:32:18 2025 +0200
SLING-12872 - Add metric for distribution readiness check
---
.../journal/bookkeeper/SubscriberMetrics.java | 17 +++++++++++++++++
.../distribution/journal/impl/subscriber/IdleCheck.java | 1 +
.../journal/impl/subscriber/SubscriberReady.java | 13 ++++++-------
3 files changed, 24 insertions(+), 7 deletions(-)
diff --git a/src/main/java/org/apache/sling/distribution/journal/bookkeeper/SubscriberMetrics.java b/src/main/java/org/apache/sling/distribution/journal/bookkeeper/SubscriberMetrics.java
index 3b2cf37..fb6f464 100644
--- a/src/main/java/org/apache/sling/distribution/journal/bookkeeper/SubscriberMetrics.java
+++ b/src/main/java/org/apache/sling/distribution/journal/bookkeeper/SubscriberMetrics.java
@@ -20,8 +20,12 @@ package org.apache.sling.distribution.journal.bookkeeper;
import static org.apache.sling.distribution.journal.metrics.TaggedMetrics.getMetricName;
+import java.time.Duration;
+import java.time.temporal.ChronoUnit;
+import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
+import java.util.concurrent.TimeUnit;
import java.util.concurrent.atomic.AtomicReference;
import java.util.function.Supplier;
@@ -30,6 +34,7 @@ import org.apache.sling.commons.metrics.Histogram;
import org.apache.sling.commons.metrics.Meter;
import org.apache.sling.commons.metrics.MetricsService;
import org.apache.sling.commons.metrics.Timer;
+import org.apache.sling.distribution.journal.impl.subscriber.IdleCheck;
import org.apache.sling.distribution.journal.messages.PackageStatusMessage.Status;
import org.apache.sling.distribution.journal.metrics.Tag;
@@ -51,6 +56,9 @@ public class SubscriberMetrics {
// Is the queue editable (true, false)
private static final String TAG_EDITABLE = "editable";
+ // See IdleCheck.ReadyReason
+ private static final String TAG_READY_REASON = "ready_reason";
+
public static final String SUB_COMPONENT = "distribution.journal.subscriber.";
private static final String PACKAGE_STATUS_COUNT = SUB_COMPONENT + "package_status_count";
@@ -97,6 +105,8 @@ public class SubscriberMetrics {
private static final String FV_MESSAGE_COUNT = SUB_COMPONENT + "fv_message_count";
private static final String FV_ERROR_COUNT = SUB_COMPONENT + "fv_error_count";
+ private static final String READINESS_DURATION = SUB_COMPONENT + "readiness_duration";
+
private final MetricsService metricsService;
private final Tag tagSubName;
private final Tag tagPubName;
@@ -240,6 +250,13 @@ public class SubscriberMetrics {
public Timer getInvalidationProcessDuration() {
return metricsService.timer(getMetricName(INVALIDATION_PROCESS_DURATION, tags));
}
+
+ public void readinessDuration(IdleCheck.ReadyReason readyReason, Duration duration) {
+ List<Tag>_tags = new ArrayList<>(tags);
+ tags.add(Tag.of(TAG_READY_REASON, readyReason.name()));
+ Timer timer = metricsService.timer(getMetricName(READINESS_DURATION, _tags));
+ timer.update(duration.get(ChronoUnit.MILLIS), TimeUnit.MILLISECONDS);
+ }
public Counter getInvalidationProcessSuccess() {
return metricsService.counter(getMetricName(INVALIDATION_PROCESS_SUCCESS_COUNT, tags));
diff --git a/src/main/java/org/apache/sling/distribution/journal/impl/subscriber/IdleCheck.java b/src/main/java/org/apache/sling/distribution/journal/impl/subscriber/IdleCheck.java
index 4a8b894..a749345 100644
--- a/src/main/java/org/apache/sling/distribution/journal/impl/subscriber/IdleCheck.java
+++ b/src/main/java/org/apache/sling/distribution/journal/impl/subscriber/IdleCheck.java
@@ -21,6 +21,7 @@ package org.apache.sling.distribution.journal.impl.subscriber;
import java.io.Closeable;
public interface IdleCheck extends Closeable {
+ enum ReadyReason { IDLE, MAX_RETRIES, LATENCY, FORCE};
/**
* Called when processing of a message starts
diff --git a/src/main/java/org/apache/sling/distribution/journal/impl/subscriber/SubscriberReady.java b/src/main/java/org/apache/sling/distribution/journal/impl/subscriber/SubscriberReady.java
index 144c216..d09d84f 100644
--- a/src/main/java/org/apache/sling/distribution/journal/impl/subscriber/SubscriberReady.java
+++ b/src/main/java/org/apache/sling/distribution/journal/impl/subscriber/SubscriberReady.java
@@ -19,7 +19,6 @@
package org.apache.sling.distribution.journal.impl.subscriber;
import static java.util.concurrent.TimeUnit.MILLISECONDS;
-import static java.util.concurrent.TimeUnit.MINUTES;
import java.util.concurrent.Executors;
import java.util.concurrent.ScheduledExecutorService;
@@ -87,10 +86,10 @@ public class SubscriberReady implements IdleCheck {
cancelSchedule();
long latency = timeProvider.get() - messageCreateTime;
if (latency < acceptableAgeDiffMs) {
- ready(String.format("Package message latency %d s < %d s acceptable limit", MILLISECONDS.toSeconds(latency), MILLISECONDS.toSeconds(acceptableAgeDiffMs)));
+ ready(ReadyReason.LATENCY, String.format("Package message latency %d s < %d s acceptable limit", MILLISECONDS.toSeconds(latency), MILLISECONDS.toSeconds(acceptableAgeDiffMs)));
}
if (retries > MAX_RETRIES) {
- ready(String.format("Retries %d > %d", retries, MAX_RETRIES));
+ ready(ReadyReason.MAX_RETRIES, String.format("Retries %d > %d", retries, MAX_RETRIES));
}
}
@@ -108,7 +107,7 @@ public class SubscriberReady implements IdleCheck {
}
private void forceIdle() {
- ready(String.format("Forcing ready after %d s", MILLISECONDS.toSeconds(forceIdleMillies)));
+ ready(ReadyReason.FORCE, String.format("Forcing ready after %d s", MILLISECONDS.toSeconds(forceIdleMillies)));
cancelSchedule();
}
@@ -119,13 +118,13 @@ public class SubscriberReady implements IdleCheck {
}
private void idleReady() {
- ready(String.format("%s ready after being idle for > %d s", subAgentName, MILLISECONDS.toSeconds(idleMillis)));
+ ready(ReadyReason.IDLE, String.format("%s ready after being idle for > %d s", subAgentName, MILLISECONDS.toSeconds(idleMillis)));
}
- private void ready(String reason) {
+ private void ready(IdleCheck.ReadyReason reason, String reasonSt) {
long readyTime = timeProvider.get();
long timeToIdle = MILLISECONDS.toSeconds(readyTime - startTime);
- log.info("Subscriber becoming ready after timeToIdle={} s. Reason='{}'", timeToIdle, reason);
+ log.info("Subscriber becoming ready after timeToIdle={} s. Reason={}, Details='{}'.", timeToIdle, reason, reasonSt);
isReady.set(true);
cancelSchedule();
forceShedule.cancel(false);