/*
* Copyright 2017 Groupon, Inc
* Copyright 2017 The Billing Project, LLC
*
* The Billing Project 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.HashMap;
import java.util.Map;
import com.codahale.metrics.servlets.AdminServlet;
import com.google.inject.servlet.ServletModule;
/**
* A guice servlet module that registers the {@link AdminServlet} via guice and also configures all healthchecks bound
* via guice to it.
* <p>
* To use, install this module in your servlet module (or add as a separate module), and bind the health checks via a
* multi binder:
* <pre>
* <code>install(new AdminServletModule());
*
* Multibinder<HealthCheck> healthChecksBinder = Multibinder.newSetBinder(binder(), HealthCheck.class);
*
* healthChecksBinder.addBinding().to(MyCoolHealthCheck.class);
* healthChecksBinder.addBinding().to(MyOtherCoolHealthCheck.class);
* </code>
* </pre>
* The module offers the same overloaded constructors to specify the uris for the healthcheck, metrics, etc. E.g.
* <pre>
* <code>install(new AdminServletModule("/1.0/healthcheck", "/1.0/metrics", "/1.0/ping", "/1.0/threads"));
* </code>
* </pre>
* In order to use this module, you need the <code>guice-servlet</code> and <code>guice-multibindings</code>
* dependencies in addition to the normal <code>guice</code> dependency:
* <pre>
* {@code <dependency>
* <groupId>com.google.inject</groupId>
* <artifactId>guice</artifactId>
* <version>3.0</version>
* </dependency>
* <dependency>
* <groupId>com.google.inject.extensions</groupId>
* <artifactId>guice-servlet</artifactId>
* <version>3.0</version>
* </dependency>
* <dependency>
* <groupId>com.google.inject.extensions</groupId>
* <artifactId>guice-multibindings</artifactId>
* <version>3.0</version>
* </dependency>
* }
* </pre>
* <p>
* Inspired from https://github.com/palominolabs/metrics-guice-servlet
*/
public class AdminServletModule extends ServletModule {
private final String healthcheckUri;
private final String metricsUri;
private final String pingUri;
private final String threadsUri;
public AdminServletModule() {
this(AdminServlet.DEFAULT_HEALTHCHECK_URI, AdminServlet.DEFAULT_METRICS_URI,
AdminServlet.DEFAULT_PING_URI, AdminServlet.DEFAULT_THREADS_URI);
}
public AdminServletModule(final String healthcheckUri, final String metricsUri, final String pingUri, final String threadsUri) {
this.healthcheckUri = healthcheckUri;
this.metricsUri = metricsUri;
this.pingUri = pingUri;
this.threadsUri = threadsUri;
}
@Override
protected void configureServlets() {
bind(AdminServlet.class).asEagerSingleton();
final Map<String, String> initParams = new HashMap<String, String>();
initParams.put("metrics-uri", metricsUri);
initParams.put("ping-uri", pingUri);
initParams.put("threads-uri", threadsUri);
initParams.put("healthcheck-uri", healthcheckUri);
serve(healthcheckUri, metricsUri, pingUri, threadsUri).with(AdminServlet.class, initParams);
}
}