package restx.monitor;
import com.codahale.metrics.MetricRegistry;
import com.codahale.metrics.health.HealthCheckRegistry;
import com.codahale.metrics.jvm.ThreadDump;
import com.google.common.collect.ImmutableMap;
import restx.admin.AdminModule;
import restx.annotations.GET;
import restx.annotations.RestxResource;
import restx.factory.Component;
import restx.metrics.codahale.CodahaleMetricRegistry;
import restx.metrics.codahale.health.CodahaleHealthCheckRegistry;
import restx.security.RolesAllowed;
import java.io.ByteArrayOutputStream;
import java.lang.management.ManagementFactory;
import java.util.Map;
/**
* Date: 17/11/13
* Time: 01:03
*/
@RestxResource(group = "restx-admin") @Component
public class MetricsResource {
private final MetricRegistry metrics;
private final HealthCheckRegistry healthChecks;
private final ThreadDump threadDump;
public MetricsResource(restx.common.metrics.api.MetricRegistry metricRegistry, restx.common.metrics.api.health.HealthCheckRegistry healthCheckRegistry) {
if (!(metricRegistry instanceof CodahaleMetricRegistry)){
throw new IllegalStateException("restx-monitor-admin expects that module restx-monitor-codahale is loaded");
}
CodahaleMetricRegistry codahaleMetricRegistry = (CodahaleMetricRegistry) metricRegistry;
CodahaleHealthCheckRegistry codahaleHealthCheckRegistry = (CodahaleHealthCheckRegistry) healthCheckRegistry;
this.metrics = codahaleMetricRegistry.getCodahaleMetricRegistry();
this.healthChecks = codahaleHealthCheckRegistry.getCodahaleHealthCheckRegistry();
threadDump = new ThreadDump(ManagementFactory.getThreadMXBean());
}
@RolesAllowed(AdminModule.RESTX_ADMIN_ROLE)
@GET("/@/metrics")
public Map metrics() {
return ImmutableMap.of(
"gauges", metrics.getGauges(),
"timers", metrics.getTimers(),
"meters", metrics.getMeters(),
"counters", metrics.getCounters(),
"histograms", metrics.getHistograms()
);
}
@RolesAllowed(AdminModule.RESTX_ADMIN_ROLE)
@GET("/@/health-checks")
public Map healthChecks() {
return healthChecks.runHealthChecks();
}
@RolesAllowed(AdminModule.RESTX_ADMIN_ROLE)
@GET("/@/thread-dump")
public String threadDump() {
ByteArrayOutputStream out = new ByteArrayOutputStream();
threadDump.dump(out);
return new String(out.toByteArray());
}
}