From ab648286615e4d92d70fc0c5fa0349370e22a676 Mon Sep 17 00:00:00 2001 From: Chris Eager Date: Wed, 17 Apr 2024 16:56:16 -0500 Subject: [PATCH] Update custom Gauges to Micrometer MeterBinders --- .../metrics/FreeMemoryGauge.java | 14 ++++++++-- .../textsecuregcm/metrics/Gauge.java | 11 -------- .../textsecuregcm/metrics/MetricsUtil.java | 10 ++----- .../metrics/OperatingSystemMemoryGauge.java | 28 +++++++++++++------ .../OperatingSystemMemoryGaugeTest.java | 2 +- 5 files changed, 34 insertions(+), 31 deletions(-) delete mode 100644 service/src/main/java/org/whispersystems/textsecuregcm/metrics/Gauge.java diff --git a/service/src/main/java/org/whispersystems/textsecuregcm/metrics/FreeMemoryGauge.java b/service/src/main/java/org/whispersystems/textsecuregcm/metrics/FreeMemoryGauge.java index 74631ebf4..38d8f2823 100644 --- a/service/src/main/java/org/whispersystems/textsecuregcm/metrics/FreeMemoryGauge.java +++ b/service/src/main/java/org/whispersystems/textsecuregcm/metrics/FreeMemoryGauge.java @@ -5,10 +5,15 @@ package org.whispersystems.textsecuregcm.metrics; +import static org.whispersystems.textsecuregcm.metrics.MetricsUtil.name; + import com.sun.management.OperatingSystemMXBean; +import io.micrometer.core.instrument.Gauge; +import io.micrometer.core.instrument.MeterRegistry; +import io.micrometer.core.instrument.binder.MeterBinder; import java.lang.management.ManagementFactory; -public class FreeMemoryGauge implements Gauge { +public class FreeMemoryGauge implements MeterBinder { private final OperatingSystemMXBean operatingSystemMXBean; @@ -18,7 +23,10 @@ public FreeMemoryGauge() { } @Override - public double getValue() { - return operatingSystemMXBean.getFreeMemorySize(); + public void bindTo(final MeterRegistry registry) { + Gauge.builder(name(FreeMemoryGauge.class, "freeMemory"), operatingSystemMXBean, + OperatingSystemMXBean::getFreeMemorySize) + .register(registry); + } } diff --git a/service/src/main/java/org/whispersystems/textsecuregcm/metrics/Gauge.java b/service/src/main/java/org/whispersystems/textsecuregcm/metrics/Gauge.java deleted file mode 100644 index 8646e43e3..000000000 --- a/service/src/main/java/org/whispersystems/textsecuregcm/metrics/Gauge.java +++ /dev/null @@ -1,11 +0,0 @@ -/* - * Copyright 2024 Signal Messenger, LLC - * SPDX-License-Identifier: AGPL-3.0-only - */ - -package org.whispersystems.textsecuregcm.metrics; - -interface Gauge { - - double getValue(); -} diff --git a/service/src/main/java/org/whispersystems/textsecuregcm/metrics/MetricsUtil.java b/service/src/main/java/org/whispersystems/textsecuregcm/metrics/MetricsUtil.java index 6846890d5..bed77585b 100644 --- a/service/src/main/java/org/whispersystems/textsecuregcm/metrics/MetricsUtil.java +++ b/service/src/main/java/org/whispersystems/textsecuregcm/metrics/MetricsUtil.java @@ -105,10 +105,10 @@ public Meter.Id map(final Meter.Id id) { public static void registerSystemResourceMetrics(final Environment environment) { new ProcessorMetrics().bindTo(Metrics.globalRegistry); - registerGauge(name(FreeMemoryGauge.class, "freeMemory"), new FreeMemoryGauge()); + new FreeMemoryGauge().bindTo(Metrics.globalRegistry); new FileDescriptorMetrics().bindTo(Metrics.globalRegistry); - registerGauge(name(OperatingSystemMemoryGauge.class, "buffers"), new OperatingSystemMemoryGauge("Buffers")); - registerGauge(name(OperatingSystemMemoryGauge.class, "cached"), new OperatingSystemMemoryGauge("Cached")); + new OperatingSystemMemoryGauge("Buffers").bindTo(Metrics.globalRegistry); + new OperatingSystemMemoryGauge("Cached").bindTo(Metrics.globalRegistry); new JvmMemoryMetrics().bindTo(Metrics.globalRegistry); new JvmThreadMetrics().bindTo(Metrics.globalRegistry); @@ -116,8 +116,4 @@ public static void registerSystemResourceMetrics(final Environment environment) GarbageCollectionGauges.registerMetrics(); } - private static void registerGauge(final String name, final Gauge gauge) { - Metrics.gauge(name, gauge, Gauge::getValue); - } - } diff --git a/service/src/main/java/org/whispersystems/textsecuregcm/metrics/OperatingSystemMemoryGauge.java b/service/src/main/java/org/whispersystems/textsecuregcm/metrics/OperatingSystemMemoryGauge.java index 92606e6a5..3afad2180 100644 --- a/service/src/main/java/org/whispersystems/textsecuregcm/metrics/OperatingSystemMemoryGauge.java +++ b/service/src/main/java/org/whispersystems/textsecuregcm/metrics/OperatingSystemMemoryGauge.java @@ -5,16 +5,22 @@ package org.whispersystems.textsecuregcm.metrics; +import static org.whispersystems.textsecuregcm.metrics.MetricsUtil.name; + import com.google.common.annotations.VisibleForTesting; +import io.micrometer.core.instrument.Gauge; +import io.micrometer.core.instrument.MeterRegistry; +import io.micrometer.core.instrument.binder.MeterBinder; import java.io.BufferedReader; import java.io.File; import java.io.FileReader; import java.io.IOException; +import java.util.Locale; import java.util.regex.Matcher; import java.util.regex.Pattern; import java.util.stream.Stream; -public class OperatingSystemMemoryGauge implements Gauge { +public class OperatingSystemMemoryGauge implements MeterBinder { private final String metricName; @@ -26,19 +32,23 @@ public OperatingSystemMemoryGauge(final String metricName) { } @Override - public double getValue() { - try (final BufferedReader bufferedReader = new BufferedReader(new FileReader(MEMINFO_FILE))) { - return getValue(bufferedReader.lines()); - } catch (final IOException e) { - return 0L; - } + public void bindTo(MeterRegistry registry) { + final String metricName = this.metricName; + Gauge.builder(name(OperatingSystemMemoryGauge.class, metricName.toLowerCase(Locale.ROOT)), () -> { + try (final BufferedReader bufferedReader = new BufferedReader(new FileReader(MEMINFO_FILE))) { + return getValue(bufferedReader.lines(), metricName); + } catch (final IOException e) { + return 0L; + } + }) + .register(registry); } @VisibleForTesting - double getValue(final Stream lines) { + static double getValue(final Stream lines, final String metricName) { return lines.map(MEMORY_METRIC_PATTERN::matcher) .filter(Matcher::matches) - .filter(matcher -> this.metricName.equalsIgnoreCase(matcher.group(1))) + .filter(matcher -> metricName.equalsIgnoreCase(matcher.group(1))) .map(matcher -> Double.parseDouble(matcher.group(2))) .findFirst() .orElse(0d); diff --git a/service/src/test/java/org/whispersystems/textsecuregcm/metrics/OperatingSystemMemoryGaugeTest.java b/service/src/test/java/org/whispersystems/textsecuregcm/metrics/OperatingSystemMemoryGaugeTest.java index 78e62e749..2ea86cc91 100644 --- a/service/src/test/java/org/whispersystems/textsecuregcm/metrics/OperatingSystemMemoryGaugeTest.java +++ b/service/src/test/java/org/whispersystems/textsecuregcm/metrics/OperatingSystemMemoryGaugeTest.java @@ -75,7 +75,7 @@ class OperatingSystemMemoryGaugeTest { @ParameterizedTest @MethodSource void testGetValue(final String metricName, final long expectedValue) { - assertEquals(expectedValue, new OperatingSystemMemoryGauge(metricName).getValue(MEMINFO.lines())); + assertEquals(expectedValue, OperatingSystemMemoryGauge.getValue(MEMINFO.lines(), metricName)); } @SuppressWarnings("unused")