package com.github.digital_wonderland.sling_metrics.service;
import com.codahale.metrics.jvm.FileDescriptorRatioGauge;
import com.codahale.metrics.jvm.GarbageCollectorMetricSet;
import com.codahale.metrics.jvm.MemoryUsageGaugeSet;
import com.codahale.metrics.jvm.ThreadStatesGaugeSet;
import org.apache.felix.scr.annotations.*;
import org.osgi.service.component.ComponentContext;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import static com.codahale.metrics.MetricRegistry.name;
@Component(label = "Sling Metrics :: JVM Metrics", metatype = true)
public class JvmMetrics {
private static final Logger LOG = LoggerFactory.getLogger(MetricService.class);
private static final String METRIC_NAME_PREFIX = "jvm";
private static final String GARBAGE_COLLECTION_METRIC_NAME = name(METRIC_NAME_PREFIX, "gc");
private static final String MEMORY_METRIC_NAME = name(METRIC_NAME_PREFIX, "memory");
private static final String THREAD_STATES_METRIC_NAME = name(METRIC_NAME_PREFIX, "thread-states");
private static final String FILE_DESCRIPTORS_USAGE_METRIC_NAME = name(METRIC_NAME_PREFIX, "fd", "usage");
@Property(label = "Enabled", boolValue = true, description = "Should JVM metrics get collected")
private static final String JVM_METRICS_ENABLED = "jvmMetrics.enabled";
@Reference
protected MetricService metricService;
private boolean isEnabled;
@Activate
protected void activate(final ComponentContext context) {
isEnabled = (Boolean) context.getProperties().get(JVM_METRICS_ENABLED);
if(metricService.isEnabled() && isEnabled) {
metricService.register(GARBAGE_COLLECTION_METRIC_NAME, new GarbageCollectorMetricSet());
metricService.register(MEMORY_METRIC_NAME, new MemoryUsageGaugeSet());
metricService.register(THREAD_STATES_METRIC_NAME, new ThreadStatesGaugeSet());
metricService.register(FILE_DESCRIPTORS_USAGE_METRIC_NAME, new FileDescriptorRatioGauge());
}
}
@Deactivate
protected void deactivate() {
if(metricService.isEnabled() && isEnabled) {
metricService.remove(GARBAGE_COLLECTION_METRIC_NAME);
metricService.remove(MEMORY_METRIC_NAME);
metricService.remove(THREAD_STATES_METRIC_NAME);
metricService.remove(FILE_DESCRIPTORS_USAGE_METRIC_NAME);
}
}
}