Skip to content
This repository was archived by the owner on Sep 28, 2021. It is now read-only.
Merged
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -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;
Expand All @@ -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}.
Expand Down Expand Up @@ -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<MetricId, Metric> getMetrics() {
final Map<MetricId, Metric> gauges = new HashMap<>();
final MetricId metricId =
MetricId.build().tagged("what", "file-descriptor-ratio", "unit", "%");
gauges.put(metricId, (Gauge<Object>) () -> {
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;
}
Expand Down