Update custom Gauges to Micrometer MeterBinders

This commit is contained in:
Chris Eager 2024-04-17 16:56:16 -05:00 committed by Chris Eager
parent 10dfa18e81
commit ab64828661
5 changed files with 34 additions and 31 deletions

View File

@ -5,10 +5,15 @@
package org.whispersystems.textsecuregcm.metrics; package org.whispersystems.textsecuregcm.metrics;
import static org.whispersystems.textsecuregcm.metrics.MetricsUtil.name;
import com.sun.management.OperatingSystemMXBean; 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; import java.lang.management.ManagementFactory;
public class FreeMemoryGauge implements Gauge { public class FreeMemoryGauge implements MeterBinder {
private final OperatingSystemMXBean operatingSystemMXBean; private final OperatingSystemMXBean operatingSystemMXBean;
@ -18,7 +23,10 @@ public class FreeMemoryGauge implements Gauge {
} }
@Override @Override
public double getValue() { public void bindTo(final MeterRegistry registry) {
return operatingSystemMXBean.getFreeMemorySize(); Gauge.builder(name(FreeMemoryGauge.class, "freeMemory"), operatingSystemMXBean,
OperatingSystemMXBean::getFreeMemorySize)
.register(registry);
} }
} }

View File

@ -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();
}

View File

@ -105,10 +105,10 @@ public class MetricsUtil {
public static void registerSystemResourceMetrics(final Environment environment) { public static void registerSystemResourceMetrics(final Environment environment) {
new ProcessorMetrics().bindTo(Metrics.globalRegistry); new ProcessorMetrics().bindTo(Metrics.globalRegistry);
registerGauge(name(FreeMemoryGauge.class, "freeMemory"), new FreeMemoryGauge()); new FreeMemoryGauge().bindTo(Metrics.globalRegistry);
new FileDescriptorMetrics().bindTo(Metrics.globalRegistry); new FileDescriptorMetrics().bindTo(Metrics.globalRegistry);
registerGauge(name(OperatingSystemMemoryGauge.class, "buffers"), new OperatingSystemMemoryGauge("Buffers")); new OperatingSystemMemoryGauge("Buffers").bindTo(Metrics.globalRegistry);
registerGauge(name(OperatingSystemMemoryGauge.class, "cached"), new OperatingSystemMemoryGauge("Cached")); new OperatingSystemMemoryGauge("Cached").bindTo(Metrics.globalRegistry);
new JvmMemoryMetrics().bindTo(Metrics.globalRegistry); new JvmMemoryMetrics().bindTo(Metrics.globalRegistry);
new JvmThreadMetrics().bindTo(Metrics.globalRegistry); new JvmThreadMetrics().bindTo(Metrics.globalRegistry);
@ -116,8 +116,4 @@ public class MetricsUtil {
GarbageCollectionGauges.registerMetrics(); GarbageCollectionGauges.registerMetrics();
} }
private static void registerGauge(final String name, final Gauge gauge) {
Metrics.gauge(name, gauge, Gauge::getValue);
}
} }

View File

@ -5,16 +5,22 @@
package org.whispersystems.textsecuregcm.metrics; package org.whispersystems.textsecuregcm.metrics;
import static org.whispersystems.textsecuregcm.metrics.MetricsUtil.name;
import com.google.common.annotations.VisibleForTesting; 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.BufferedReader;
import java.io.File; import java.io.File;
import java.io.FileReader; import java.io.FileReader;
import java.io.IOException; import java.io.IOException;
import java.util.Locale;
import java.util.regex.Matcher; import java.util.regex.Matcher;
import java.util.regex.Pattern; import java.util.regex.Pattern;
import java.util.stream.Stream; import java.util.stream.Stream;
public class OperatingSystemMemoryGauge implements Gauge { public class OperatingSystemMemoryGauge implements MeterBinder {
private final String metricName; private final String metricName;
@ -26,19 +32,23 @@ public class OperatingSystemMemoryGauge implements Gauge {
} }
@Override @Override
public double getValue() { public void bindTo(MeterRegistry registry) {
try (final BufferedReader bufferedReader = new BufferedReader(new FileReader(MEMINFO_FILE))) { final String metricName = this.metricName;
return getValue(bufferedReader.lines()); Gauge.builder(name(OperatingSystemMemoryGauge.class, metricName.toLowerCase(Locale.ROOT)), () -> {
} catch (final IOException e) { try (final BufferedReader bufferedReader = new BufferedReader(new FileReader(MEMINFO_FILE))) {
return 0L; return getValue(bufferedReader.lines(), metricName);
} } catch (final IOException e) {
return 0L;
}
})
.register(registry);
} }
@VisibleForTesting @VisibleForTesting
double getValue(final Stream<String> lines) { static double getValue(final Stream<String> lines, final String metricName) {
return lines.map(MEMORY_METRIC_PATTERN::matcher) return lines.map(MEMORY_METRIC_PATTERN::matcher)
.filter(Matcher::matches) .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))) .map(matcher -> Double.parseDouble(matcher.group(2)))
.findFirst() .findFirst()
.orElse(0d); .orElse(0d);

View File

@ -75,7 +75,7 @@ class OperatingSystemMemoryGaugeTest {
@ParameterizedTest @ParameterizedTest
@MethodSource @MethodSource
void testGetValue(final String metricName, final long expectedValue) { 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") @SuppressWarnings("unused")