diff --git a/modules/metrics/src/main/java/com/spotify/apollo/metrics/MetricsModule.java b/modules/metrics/src/main/java/com/spotify/apollo/metrics/MetricsModule.java index 40ed350ce..8cf82e7de 100644 --- a/modules/metrics/src/main/java/com/spotify/apollo/metrics/MetricsModule.java +++ b/modules/metrics/src/main/java/com/spotify/apollo/metrics/MetricsModule.java @@ -19,11 +19,14 @@ */ package com.spotify.apollo.metrics; +import com.codahale.metrics.Gauge; +import com.codahale.metrics.Metric; +import com.codahale.metrics.RatioGauge; +import com.codahale.metrics.jvm.FileDescriptorRatioGauge; import com.google.auto.service.AutoService; import com.google.inject.Provides; import com.google.inject.Singleton; import com.google.inject.multibindings.Multibinder; - import com.spotify.apollo.core.Services; import com.spotify.apollo.environment.EndpointRunnableFactoryDecorator; import com.spotify.apollo.metrics.semantic.MetricsConfig; @@ -32,20 +35,20 @@ import com.spotify.apollo.module.ApolloModule; import com.spotify.metrics.core.MetricId; import com.spotify.metrics.core.SemanticMetricRegistry; +import com.spotify.metrics.core.SemanticMetricSet; import com.spotify.metrics.ffwd.FastForwardReporter; import com.spotify.metrics.jvm.CpuGaugeSet; -import com.spotify.metrics.jvm.FileDescriptorGaugeSet; import com.spotify.metrics.jvm.GarbageCollectorMetricSet; import com.spotify.metrics.jvm.MemoryUsageGaugeSet; import com.spotify.metrics.jvm.ThreadStatesMetricSet; - -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; - import java.io.IOException; +import java.util.Collections; +import java.util.HashMap; +import java.util.Map; import java.util.concurrent.TimeUnit; - import javax.inject.Named; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; /** * Provides bindings to {@link SemanticMetricRegistry} and {@link MetricsFactory}. @@ -91,7 +94,30 @@ public SemanticMetricRegistry semanticMetricRegistry() { metricRegistry.register(MetricId.EMPTY, new GarbageCollectorMetricSet()); metricRegistry.register(MetricId.EMPTY, new ThreadStatesMetricSet()); metricRegistry.register(MetricId.EMPTY, CpuGaugeSet.create()); - metricRegistry.register(MetricId.EMPTY, new FileDescriptorGaugeSet()); + // FIXME(staffan): FileDescriptorGaugeSet is broken in Java 9 (it throws an exception). + // This is a temporary workaround to make it work, by reimplementing the FileDescriptorGaugeSet + // from semantic-metrics in a way that properly handles the exception. A more proper fix + // would be to fix this upstream (ideally in codahale metrics, possibly in semantic-metrics). + metricRegistry.register(MetricId.EMPTY, new SemanticMetricSet() { + private FileDescriptorRatioGauge fileDescriptorRatioGauge = new FileDescriptorRatioGauge(); + + @Override + public Map getMetrics() { + final Map gauges = new HashMap<>(); + final MetricId metricId = + MetricId.build().tagged("what", "file-descriptor-ratio", "unit", "%"); + gauges.put(metricId, (Gauge) () -> { + try { + return fileDescriptorRatioGauge.getValue(); + } catch (final Exception ex) { + LOG.debug("Failed to get metrics for FileDescriptorGaugeSet", ex); + // This is what the upstream FileDescriptorRatioGauge returns when an exception occurs. + return RatioGauge.Ratio.of(Double.NaN, Double.NaN); + } + }); + return Collections.unmodifiableMap(gauges); + } + }); return metricRegistry; }