diff --git a/java/google/registry/module/backend/BUILD b/java/google/registry/module/backend/BUILD index 75aa46b18..52c375bfd 100644 --- a/java/google/registry/module/backend/BUILD +++ b/java/google/registry/module/backend/BUILD @@ -27,6 +27,7 @@ java_library( "//java/google/registry/keyring/kms", "//java/google/registry/mapreduce", "//java/google/registry/model", + "//java/google/registry/module", "//java/google/registry/monitoring/whitebox", "//java/google/registry/rde", "//java/google/registry/rde/imports", diff --git a/java/google/registry/module/backend/BackendServlet.java b/java/google/registry/module/backend/BackendServlet.java index 5a7f7f4fa..896840937 100644 --- a/java/google/registry/module/backend/BackendServlet.java +++ b/java/google/registry/module/backend/BackendServlet.java @@ -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 = 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); } } diff --git a/java/google/registry/module/frontend/BUILD b/java/google/registry/module/frontend/BUILD index 246b6c426..88f243784 100644 --- a/java/google/registry/module/frontend/BUILD +++ b/java/google/registry/module/frontend/BUILD @@ -14,6 +14,7 @@ java_library( "//java/google/registry/keyring", "//java/google/registry/keyring/api", "//java/google/registry/keyring/kms", + "//java/google/registry/module", "//java/google/registry/monitoring/whitebox", "//java/google/registry/request", "//java/google/registry/request:modules", diff --git a/java/google/registry/module/frontend/FrontendServlet.java b/java/google/registry/module/frontend/FrontendServlet.java index 3043392eb..2b2b72350 100644 --- a/java/google/registry/module/frontend/FrontendServlet.java +++ b/java/google/registry/module/frontend/FrontendServlet.java @@ -14,65 +14,18 @@ package google.registry.module.frontend; -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 "default" App Engine module. */ -public final class FrontendServlet extends HttpServlet { +public final class FrontendServlet extends ServletBase { private static final FrontendComponent component = DaggerFrontendComponent.create(); private static final FrontendRequestHandler requestHandler = component.requestHandler(); private static final Lazy 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 e) { - logger.atSevere().withCause(e).log("Failed to stop MetricReporter."); - } - }); - } 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 frontend request"); - DateTime startTime = clock.nowUtc(); - try { - requestHandler.handleRequest(req, rsp); - } finally { - logger.atInfo().log( - "Finished frontend request. Latency: %.3fs", - (clock.nowUtc().getMillis() - startTime.getMillis()) / 1000d); - } + public FrontendServlet() { + super(requestHandler, metricReporter); } } diff --git a/java/google/registry/module/pubapi/BUILD b/java/google/registry/module/pubapi/BUILD index be2d79e5e..40d4b233b 100644 --- a/java/google/registry/module/pubapi/BUILD +++ b/java/google/registry/module/pubapi/BUILD @@ -14,6 +14,7 @@ java_library( "//java/google/registry/keyring", "//java/google/registry/keyring/api", "//java/google/registry/keyring/kms", + "//java/google/registry/module", "//java/google/registry/monitoring/whitebox", "//java/google/registry/rdap", "//java/google/registry/request", diff --git a/java/google/registry/module/pubapi/PubApiComponent.java b/java/google/registry/module/pubapi/PubApiComponent.java index ef5ffbc65..966ad54f0 100644 --- a/java/google/registry/module/pubapi/PubApiComponent.java +++ b/java/google/registry/module/pubapi/PubApiComponent.java @@ -47,12 +47,12 @@ import javax.inject.Singleton; CredentialModule.class, CustomLogicFactoryModule.class, DummyKeyringModule.class, - PubApiRequestComponentModule.class, Jackson2Module.class, KeyModule.class, KeyringModule.class, KmsModule.class, NetHttpTransportModule.class, + PubApiRequestComponentModule.class, ServerTridProviderModule.class, StackdriverModule.class, SystemClockModule.class, diff --git a/java/google/registry/module/pubapi/PubApiServlet.java b/java/google/registry/module/pubapi/PubApiServlet.java index 47df81a93..b907f9042 100644 --- a/java/google/registry/module/pubapi/PubApiServlet.java +++ b/java/google/registry/module/pubapi/PubApiServlet.java @@ -14,65 +14,18 @@ package google.registry.module.pubapi; -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 "default" App Engine module. */ -public final class PubApiServlet extends HttpServlet { +public final class PubApiServlet extends ServletBase { private static final PubApiComponent component = DaggerPubApiComponent.create(); private static final PubApiRequestHandler requestHandler = component.requestHandler(); private static final Lazy 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 e) { - logger.atSevere().withCause(e).log("Failed to stop MetricReporter."); - } - }); - } 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 pubapi request"); - DateTime startTime = clock.nowUtc(); - try { - requestHandler.handleRequest(req, rsp); - } finally { - logger.atInfo().log( - "Finished pubapi request. Latency: %.3fs", - (clock.nowUtc().getMillis() - startTime.getMillis()) / 1000d); - } + public PubApiServlet() { + super(requestHandler, metricReporter); } } diff --git a/java/google/registry/module/tools/BUILD b/java/google/registry/module/tools/BUILD index 6b0767ba8..39d5dc545 100644 --- a/java/google/registry/module/tools/BUILD +++ b/java/google/registry/module/tools/BUILD @@ -20,6 +20,7 @@ java_library( "//java/google/registry/keyring/kms", "//java/google/registry/loadtest", "//java/google/registry/mapreduce", + "//java/google/registry/module", "//java/google/registry/monitoring/whitebox", "//java/google/registry/request", "//java/google/registry/request:modules", @@ -30,6 +31,7 @@ java_library( "@com_google_dagger", "@com_google_flogger", "@com_google_flogger_system_backend", + "@com_google_monitoring_client_metrics", "@javax_inject", "@javax_servlet_api", "@joda_time", diff --git a/java/google/registry/module/tools/ToolsComponent.java b/java/google/registry/module/tools/ToolsComponent.java index 605ddc95a..b7dc1747a 100644 --- a/java/google/registry/module/tools/ToolsComponent.java +++ b/java/google/registry/module/tools/ToolsComponent.java @@ -14,7 +14,9 @@ package google.registry.module.tools; +import com.google.monitoring.metrics.MetricReporter; import dagger.Component; +import dagger.Lazy; import google.registry.config.CredentialModule; import google.registry.config.RegistryConfig.ConfigModule; import google.registry.export.DriveModule; @@ -29,6 +31,7 @@ import google.registry.keyring.api.DummyKeyringModule; import google.registry.keyring.api.KeyModule; import google.registry.keyring.kms.KmsModule; import google.registry.module.tools.ToolsRequestComponent.ToolsRequestComponentModule; +import google.registry.monitoring.whitebox.StackdriverModule; import google.registry.request.Modules.DatastoreServiceModule; import google.registry.request.Modules.Jackson2Module; import google.registry.request.Modules.NetHttpTransportModule; @@ -62,6 +65,7 @@ import javax.inject.Singleton; KmsModule.class, NetHttpTransportModule.class, ServerTridProviderModule.class, + StackdriverModule.class, SystemClockModule.class, SystemSleeperModule.class, ToolsRequestComponentModule.class, @@ -70,4 +74,6 @@ import javax.inject.Singleton; }) interface ToolsComponent { ToolsRequestHandler requestHandler(); + + Lazy metricReporter(); } diff --git a/java/google/registry/module/tools/ToolsServlet.java b/java/google/registry/module/tools/ToolsServlet.java index 5914dcdb7..023c51164 100644 --- a/java/google/registry/module/tools/ToolsServlet.java +++ b/java/google/registry/module/tools/ToolsServlet.java @@ -14,39 +14,18 @@ package google.registry.module.tools; -import com.google.common.flogger.FluentLogger; -import google.registry.util.SystemClock; -import java.io.IOException; -import java.security.Security; -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 com.google.monitoring.metrics.MetricReporter; +import dagger.Lazy; +import google.registry.module.ServletBase; /** Servlet that should handle all requests to our "tools" App Engine module. */ -public final class ToolsServlet extends HttpServlet { +public final class ToolsServlet extends ServletBase { private static final ToolsComponent component = DaggerToolsComponent.create(); private static final ToolsRequestHandler requestHandler = component.requestHandler(); - private static final FluentLogger logger = FluentLogger.forEnclosingClass(); - private static final SystemClock clock = new SystemClock(); + private static final Lazy metricReporter = component.metricReporter(); - @Override - public void init() { - Security.addProvider(new BouncyCastleProvider()); - } - - @Override - public void service(HttpServletRequest req, HttpServletResponse rsp) throws IOException { - logger.atInfo().log("Received tools request"); - DateTime startTime = clock.nowUtc(); - try { - requestHandler.handleRequest(req, rsp); - } finally { - logger.atInfo().log( - "Finished tools request. Latency: %.3fs", - (clock.nowUtc().getMillis() - startTime.getMillis()) / 1000d); - } + public ToolsServlet() { + super(requestHandler, metricReporter); } }