/*
* Copyright 2010-2014 Ning, Inc.
*
* Ning licenses this file to you under the Apache License, version 2.0
* (the "License"); you may not use this file except in compliance with the
* License. You may obtain a copy of the License at:
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
* WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
* License for the specific language governing permissions and limitations
* under the License.
*/
package org.killbill.commons.skeleton.modules;
import java.util.Set;
import org.killbill.commons.skeleton.metrics.TimedResourceListener;
import com.codahale.metrics.MetricRegistry;
import com.codahale.metrics.health.HealthCheck;
import com.codahale.metrics.health.HealthCheckRegistry;
import com.google.common.collect.ImmutableList;
import com.google.inject.AbstractModule;
import com.google.inject.Provides;
import com.google.inject.Singleton;
import com.google.inject.matcher.Matchers;
import com.google.inject.multibindings.Multibinder;
import com.palominolabs.metrics.guice.MetricsInstrumentationModule;
import com.sun.jersey.guice.spi.container.servlet.GuiceContainer;
public class StatsModule extends AbstractModule {
private final String healthCheckUri;
private final String metricsUri;
private final String pingUri;
private final String threadsUri;
private final Iterable<Class<? extends HealthCheck>> healthChecks;
public StatsModule() {
this(ImmutableList.<Class<? extends HealthCheck>>of());
}
public StatsModule(final Class<? extends HealthCheck> healthCheck) {
this(ImmutableList.<Class<? extends HealthCheck>>of(healthCheck));
}
public StatsModule(final Class<? extends HealthCheck>... healthChecks) {
this(ImmutableList.<Class<? extends HealthCheck>>copyOf(healthChecks));
}
public StatsModule(final Iterable<Class<? extends HealthCheck>> healthChecks) {
this("/1.0/healthcheck", "/1.0/metrics", "/1.0/ping", "/1.0/threads", healthChecks);
}
public StatsModule(final String healthCheckUri, final String metricsUri, final String pingUri, final String threadsUri,
final Iterable<Class<? extends HealthCheck>> healthChecks) {
this.healthCheckUri = healthCheckUri;
this.metricsUri = metricsUri;
this.pingUri = pingUri;
this.threadsUri = threadsUri;
this.healthChecks = healthChecks;
}
@Override
protected void configure() {
// Dropwizard metrics
final MetricRegistry metricRegistry = createMetricRegistry();
bind(MetricRegistry.class).toInstance(metricRegistry);
install(MetricsInstrumentationModule.builder().withMetricRegistry(metricRegistry).build());
// Dropwizard healthChecks
final Multibinder<HealthCheck> healthChecksBinder = Multibinder.newSetBinder(binder(), HealthCheck.class);
for (final Class<? extends HealthCheck> healthCheckClass : healthChecks) {
healthChecksBinder.addBinding().to(healthCheckClass).asEagerSingleton();
}
install(new AdminServletModule(healthCheckUri, metricsUri, pingUri, threadsUri));
// Metrics/Jersey integration
final TimedResourceListener timedResourceTypeListener =
new TimedResourceListener(getProvider(GuiceContainer.class), getProvider(MetricRegistry.class));
bindListener(Matchers.any(), timedResourceTypeListener);
}
@Provides
@Singleton
protected HealthCheckRegistry provideHealthCheckRegistry(final Set<HealthCheck> healthChecks) {
final HealthCheckRegistry healthCheckRegistry = createHealthCheckRegistry();
// It used to be done by AdminServletProvider. JavaDoc of AdminServletModule outdated?
for (final HealthCheck healthCheck : healthChecks) {
healthCheckRegistry.register(healthCheck.getClass().getName(), healthCheck);
}
return healthCheckRegistry;
}
/**
* Override to provide a custom {@link HealthCheckRegistry}
*
* @return HealthCheckRegistry instance to bind
*/
protected HealthCheckRegistry createHealthCheckRegistry() {
return new HealthCheckRegistry();
}
/**
* Override to provide a custom {@link MetricRegistry}
*
* @return MetricRegistry instance to bind
*/
protected MetricRegistry createMetricRegistry() {
return new MetricRegistry();
}
}