From a53b25b607483ca6722662e5918ac49bcf91aa77 Mon Sep 17 00:00:00 2001 From: Johnny Sohn Date: Fri, 3 Jan 2025 15:41:15 -0800 Subject: [PATCH] Add metrics to track count, size of deleted logfiles --- logback-core/pom.xml | 5 ++++ .../ch/qos/logback/core/LogbackMetrics.java | 29 +++++++++++++++++++ .../rolling/helper/ArchiveRemoverReason.java | 6 ++++ .../helper/TimeBasedArchiveRemover.java | 11 +++++++ logback-core/src/main/java/module-info.java | 2 ++ 5 files changed, 53 insertions(+) create mode 100644 logback-core/src/main/java/ch/qos/logback/core/LogbackMetrics.java create mode 100644 logback-core/src/main/java/ch/qos/logback/core/rolling/helper/ArchiveRemoverReason.java diff --git a/logback-core/pom.xml b/logback-core/pom.xml index d175fc6079..35ae1c6162 100755 --- a/logback-core/pom.xml +++ b/logback-core/pom.xml @@ -60,6 +60,11 @@ true + + com.yammer.metrics + metrics-core + 1.0-hubspot-SNAPSHOT + org.mockito diff --git a/logback-core/src/main/java/ch/qos/logback/core/LogbackMetrics.java b/logback-core/src/main/java/ch/qos/logback/core/LogbackMetrics.java new file mode 100644 index 0000000000..3a785809f4 --- /dev/null +++ b/logback-core/src/main/java/ch/qos/logback/core/LogbackMetrics.java @@ -0,0 +1,29 @@ +package ch.qos.logback.core; + +import ch.qos.logback.core.rolling.helper.ArchiveRemoverReason; +import ch.qos.logback.core.rolling.helper.FileNamePattern; +import com.google.common.collect.ImmutableMap; +import com.yammer.metrics.Metrics; +import com.yammer.metrics.core.Counter; +import com.yammer.metrics.core.Histogram; +import com.yammer.metrics.core.MetricName; + +public class LogbackMetrics { + public static Counter getDeletedLogFilesCounter(ArchiveRemoverReason reason, FileNamePattern fileNamePattern) { + return Metrics.newCounter( + new MetricName( + LogbackMetrics.class, + "log-files-deleted", + ImmutableMap.of("reason", reason.name(), "fileNamePattern", fileNamePattern.getPattern()) + ) + ); + } + public static Histogram getDeletedLogFileSizeHistogram(ArchiveRemoverReason reason, FileNamePattern fileNamePattern) { + return Metrics.newHistogram( + new MetricName( + LogbackMetrics.class, + "deleted-log-file-size", + ImmutableMap.of("reason", reason.name(), "fileNamePattern", fileNamePattern.getPattern()) + )); + } +} diff --git a/logback-core/src/main/java/ch/qos/logback/core/rolling/helper/ArchiveRemoverReason.java b/logback-core/src/main/java/ch/qos/logback/core/rolling/helper/ArchiveRemoverReason.java new file mode 100644 index 0000000000..8003a2c924 --- /dev/null +++ b/logback-core/src/main/java/ch/qos/logback/core/rolling/helper/ArchiveRemoverReason.java @@ -0,0 +1,6 @@ +package ch.qos.logback.core.rolling.helper; + +public enum ArchiveRemoverReason { + MAX_HISTORY, // Exceeded max age for an archived file + TOTAL_SIZE_CAP, // Exceeded total size of all archived files +} diff --git a/logback-core/src/main/java/ch/qos/logback/core/rolling/helper/TimeBasedArchiveRemover.java b/logback-core/src/main/java/ch/qos/logback/core/rolling/helper/TimeBasedArchiveRemover.java index 357e333790..a288034541 100644 --- a/logback-core/src/main/java/ch/qos/logback/core/rolling/helper/TimeBasedArchiveRemover.java +++ b/logback-core/src/main/java/ch/qos/logback/core/rolling/helper/TimeBasedArchiveRemover.java @@ -12,6 +12,8 @@ package ch.qos.logback.core.rolling.helper; import static ch.qos.logback.core.CoreConstants.UNBOUNDED_TOTAL_SIZE_CAP; +import static ch.qos.logback.core.rolling.helper.ArchiveRemoverReason.MAX_HISTORY; +import static ch.qos.logback.core.rolling.helper.ArchiveRemoverReason.TOTAL_SIZE_CAP; import java.io.File; import java.time.Instant; @@ -19,6 +21,7 @@ import java.util.concurrent.Future; import ch.qos.logback.core.CoreConstants; +import ch.qos.logback.core.LogbackMetrics; import ch.qos.logback.core.pattern.Converter; import ch.qos.logback.core.pattern.LiteralConverter; import ch.qos.logback.core.spi.ContextAwareBase; @@ -114,6 +117,9 @@ private boolean checkAndDeleteFile(File f) { addWarn("Cannot delete non existent file"); return false; } + + LogbackMetrics.getDeletedLogFilesCounter(MAX_HISTORY, fileNamePattern).inc(); + LogbackMetrics.getDeletedLogFileSizeHistogram(MAX_HISTORY, fileNamePattern).update(f.length()); boolean result = f.delete(); if (!result) { @@ -136,6 +142,11 @@ void capTotalSize(Instant now) { // assume that deletion attempt will succeed. totalRemoved += size; + LogbackMetrics.getDeletedLogFilesCounter(TOTAL_SIZE_CAP, + fileNamePattern).inc(); + LogbackMetrics.getDeletedLogFileSizeHistogram(TOTAL_SIZE_CAP, + fileNamePattern).update(f.length()); + checkAndDeleteFile(f); } totalSize += size; diff --git a/logback-core/src/main/java/module-info.java b/logback-core/src/main/java/module-info.java index 3ebdacaa80..13babd1f86 100644 --- a/logback-core/src/main/java/module-info.java +++ b/logback-core/src/main/java/module-info.java @@ -17,6 +17,8 @@ // optionally require jansi requires static org.fusesource.jansi; + requires com.google.common; + requires metrics.core; exports ch.qos.logback.core; exports ch.qos.logback.core.boolex;