Reduce duplicate code in the servlets

Currently, all 4 servlets (backend, frontend, pubapi, tools) have duplicates of
the same exact code.

That's an anti-pattern!

Created a ServletBase they can all extend which has the duplicate code.

As a bonus, the tools servlet now runs the metric reporter, meaning tool
related metrics will now be reported!

-------------
Created by MOE: https://github.com/google/moe
MOE_MIGRATED_REVID=219792176
This commit is contained in:
guyben 2018-11-02 06:59:50 -07:00 committed by Michael Muller
parent 545b68ad9a
commit 3f6585fccc
10 changed files with 31 additions and 183 deletions

View file

@ -14,66 +14,18 @@
package google.registry.module.backend;
import com.google.appengine.api.LifecycleManager;
import com.google.common.flogger.FluentLogger;
import com.google.monitoring.metrics.MetricReporter;
import dagger.Lazy;
import google.registry.util.SystemClock;
import java.io.IOException;
import java.security.Security;
import java.util.concurrent.TimeUnit;
import java.util.concurrent.TimeoutException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.bouncycastle.jce.provider.BouncyCastleProvider;
import org.joda.time.DateTime;
import google.registry.module.ServletBase;
/** Servlet that should handle all requests to our "backend" App Engine module. */
public final class BackendServlet extends HttpServlet {
public final class BackendServlet extends ServletBase {
private static final BackendComponent component = DaggerBackendComponent.create();
private static final BackendRequestHandler requestHandler = component.requestHandler();
private static final Lazy<MetricReporter> metricReporter = component.metricReporter();
private static final FluentLogger logger = FluentLogger.forEnclosingClass();
private static final SystemClock clock = new SystemClock();
@Override
public void init() {
Security.addProvider(new BouncyCastleProvider());
// If metric reporter failed to instantiate for any reason (bad keyring, bad json credential,
// etc), we log the error but keep the main thread running. Also the shutdown hook will only be
// registered if metric reporter starts up correctly.
try {
metricReporter.get().startAsync().awaitRunning(10, TimeUnit.SECONDS);
logger.atInfo().log("Started up MetricReporter");
LifecycleManager.getInstance()
.setShutdownHook(
() -> {
try {
metricReporter.get().stopAsync().awaitTerminated(10, TimeUnit.SECONDS);
logger.atInfo().log("Shut down MetricReporter");
} catch (TimeoutException timeoutException) {
logger.atSevere().withCause(timeoutException).log(
"Failed to stop MetricReporter: %s", timeoutException);
}
});
} catch (Exception e) {
logger.atSevere().withCause(e).log("Failed to initialize MetricReporter.");
}
}
@Override
public void service(HttpServletRequest req, HttpServletResponse rsp) throws IOException {
logger.atInfo().log("Received backend request");
DateTime startTime = clock.nowUtc();
try {
requestHandler.handleRequest(req, rsp);
} finally {
logger.atInfo().log(
"Finished backend request. Latency: %.3fs",
(clock.nowUtc().getMillis() - startTime.getMillis()) / 1000d);
}
public BackendServlet() {
super(requestHandler, metricReporter);
}
}