package com.zendesk.maxwell.metrics;
import com.codahale.metrics.MetricRegistry;
import com.codahale.metrics.health.HealthCheckRegistry;
import com.codahale.metrics.servlets.HealthCheckServlet;
import com.codahale.metrics.servlets.MetricsServlet;
import com.codahale.metrics.servlets.PingServlet;
import com.zendesk.maxwell.MaxwellContext;
import com.zendesk.maxwell.util.StoppableTask;
import org.eclipse.jetty.server.Server;
import org.eclipse.jetty.servlet.ServletContextHandler;
import org.eclipse.jetty.servlet.ServletHolder;
import java.util.concurrent.TimeoutException;
public class MaxwellHTTPServer {
public MaxwellHTTPServer(int port, MetricRegistry metricRegistry, HealthCheckRegistry healthCheckRegistry, MaxwellContext context) {
MaxwellHTTPServerWorker maxwellHTTPServerWorker = new MaxwellHTTPServerWorker(port, metricRegistry, healthCheckRegistry);
Thread thread = new Thread(maxwellHTTPServerWorker);
context.addTask(maxwellHTTPServerWorker);
thread.setUncaughtExceptionHandler(new Thread.UncaughtExceptionHandler() {
public void uncaughtException(Thread t, Throwable e) {
e.printStackTrace();
System.exit(1);
}
});
thread.setDaemon(true);
thread.start();
}
}
class MaxwellHTTPServerWorker implements StoppableTask, Runnable {
private int port;
private MetricRegistry metricRegistry;
private HealthCheckRegistry healthCheckRegistry;
private Server server;
public MaxwellHTTPServerWorker(int port, MetricRegistry metricRegistry, HealthCheckRegistry healthCheckRegistry) {
this.port = port;
this.metricRegistry = metricRegistry;
this.healthCheckRegistry = healthCheckRegistry;
}
public void startServer() throws Exception {
this.server = new Server(this.port);
ServletContextHandler handler = new ServletContextHandler(this.server, "/");
// TODO: there is a way to wire these up automagically via the AdminServlet, but it escapes me right now
handler.addServlet(new ServletHolder(new MetricsServlet(this.metricRegistry)), "/metrics");
handler.addServlet(new ServletHolder(new HealthCheckServlet(this.healthCheckRegistry)), "/healthcheck");
handler.addServlet(new ServletHolder(new PingServlet()), "/ping");
this.server.start();
this.server.join();
}
@Override
public void run() {
try {
startServer();
} catch (Exception e) {
throw new RuntimeException(e);
}
}
@Override
public void requestStop() {
try {
this.server.stop();
} catch (Exception e) {
e.printStackTrace();
}
}
@Override
public void awaitStop(Long timeout) throws TimeoutException {
}
}