diff --git a/java/com/google/domain/registry/env/common/backend/WEB-INF/web.xml b/java/com/google/domain/registry/env/common/backend/WEB-INF/web.xml index c6a2889b6..c03734075 100644 --- a/java/com/google/domain/registry/env/common/backend/WEB-INF/web.xml +++ b/java/com/google/domain/registry/env/common/backend/WEB-INF/web.xml @@ -13,6 +13,16 @@ 1 + + + metrics + com.google.domain.registry.monitoring.whitebox.MetricsTaskServlet + + + metrics + /_dr/task/metrics + + - - metrics - com.google.domain.registry.monitoring.whitebox.MetricsTaskServlet - - - metrics - /_dr/task/metrics - - diff --git a/java/com/google/domain/registry/monitoring/whitebox/Metrics.java b/java/com/google/domain/registry/monitoring/whitebox/Metrics.java index 6cdc6c8f1..114be6860 100644 --- a/java/com/google/domain/registry/monitoring/whitebox/Metrics.java +++ b/java/com/google/domain/registry/monitoring/whitebox/Metrics.java @@ -18,6 +18,8 @@ import static com.google.appengine.api.taskqueue.QueueFactory.getQueue; import static com.google.appengine.api.taskqueue.TaskOptions.Builder.withUrl; import static com.google.domain.registry.bigquery.BigqueryUtils.toBigqueryTimestamp; +import com.google.appengine.api.modules.ModulesService; +import com.google.appengine.api.modules.ModulesServiceFactory; import com.google.appengine.api.taskqueue.TaskOptions; import com.google.appengine.api.taskqueue.TransientFailureException; import com.google.common.base.Supplier; @@ -33,12 +35,15 @@ import java.util.UUID; import java.util.concurrent.TimeUnit; /** A collector of metric information. */ -abstract class Metrics { +public abstract class Metrics { private static final FormattingLogger logger = FormattingLogger.getLoggerForCallerClass(); public static final String QUEUE = "bigquery-streaming-metrics"; + @NonFinalForTesting + private static ModulesService modulesService = ModulesServiceFactory.getModulesService(); + @NonFinalForTesting private static Clock clock = new SystemClock(); @@ -60,7 +65,9 @@ abstract class Metrics { public void export() { try { - TaskOptions opts = withUrl("/_dr/task/metrics") + String hostname = modulesService.getVersionHostname("backend", null); + TaskOptions opts = withUrl(MetricsTaskServlet.PATH) + .header("Host", hostname) .param("insertId", idGenerator.get()) .param("startTime", toBigqueryTimestamp(startTimeMillis, TimeUnit.MILLISECONDS)) .param("endTime", toBigqueryTimestamp(clock.nowUtc().getMillis(), TimeUnit.MILLISECONDS)); diff --git a/java/com/google/domain/registry/monitoring/whitebox/MetricsTaskServlet.java b/java/com/google/domain/registry/monitoring/whitebox/MetricsTaskServlet.java index 41596784f..1ddec59d4 100644 --- a/java/com/google/domain/registry/monitoring/whitebox/MetricsTaskServlet.java +++ b/java/com/google/domain/registry/monitoring/whitebox/MetricsTaskServlet.java @@ -51,6 +51,8 @@ import javax.servlet.http.HttpServletResponse; /** Servlet for exporting metrics to BigQuery. */ public class MetricsTaskServlet extends HttpServlet { + public static final String PATH = "/_dr/task/metrics"; + private static final FormattingLogger logger = FormattingLogger.getLoggerForCallerClass(); private static final String DATASET_ID = "metrics"; private static final String PROJECT_ID = RegistryEnvironment.get().config().getProjectId(); @@ -81,7 +83,7 @@ public class MetricsTaskServlet extends HttpServlet { ImmutableMap.Builder b = new ImmutableMap.Builder<>(); @SuppressWarnings({"cast", "unchecked"}) // Return type is always a Set. - Set parameterKeys = (Set) req.getParameterMap().keySet(); + Set parameterKeys = req.getParameterMap().keySet(); for (String key : Sets.difference(parameterKeys, filter)) { b.put(key, req.getParameter(key)); diff --git a/javatests/com/google/domain/registry/flows/BUILD b/javatests/com/google/domain/registry/flows/BUILD index b4761e020..5308d8c11 100644 --- a/javatests/com/google/domain/registry/flows/BUILD +++ b/javatests/com/google/domain/registry/flows/BUILD @@ -31,6 +31,7 @@ java_library( "//java/com/google/domain/registry/flows", "//java/com/google/domain/registry/mapreduce", "//java/com/google/domain/registry/model", + "//java/com/google/domain/registry/monitoring/whitebox", "//java/com/google/domain/registry/request", "//java/com/google/domain/registry/security", "//java/com/google/domain/registry/security:servlets", diff --git a/javatests/com/google/domain/registry/flows/EppServletTestCase.java b/javatests/com/google/domain/registry/flows/EppServletTestCase.java index 971c4e874..0999724d7 100644 --- a/javatests/com/google/domain/registry/flows/EppServletTestCase.java +++ b/javatests/com/google/domain/registry/flows/EppServletTestCase.java @@ -28,12 +28,14 @@ import static org.mockito.Mockito.reset; import static org.mockito.Mockito.verify; import static org.mockito.Mockito.when; +import com.google.appengine.api.modules.ModulesService; import com.google.common.base.Optional; import com.google.common.collect.ImmutableMap; import com.google.common.collect.ImmutableSet; import com.google.domain.registry.model.ofy.Ofy; import com.google.domain.registry.model.registrar.Registrar; import com.google.domain.registry.model.tmch.ClaimsListShard.ClaimsListSingleton; +import com.google.domain.registry.monitoring.whitebox.Metrics; import com.google.domain.registry.security.XsrfProtectedServlet; import com.google.domain.registry.testing.FakeClock; import com.google.domain.registry.testing.FakeServletInputStream; @@ -74,6 +76,9 @@ public abstract class EppServletTestCase { @Mock HttpServletResponse rsp; + @Mock + ModulesService modulesService; + HttpSession session; FakeClock clock = new FakeClock(); @@ -96,6 +101,8 @@ public abstract class EppServletTestCase { public final void init() throws Exception { inject.setStaticField(Ofy.class, "clock", clock); // For transactional flows. inject.setStaticField(FlowRunner.class, "clock", clock); // For non-transactional flows. + inject.setStaticField(Metrics.class, "modulesService", modulesService); + when(modulesService.getVersionHostname("backend", null)).thenReturn("backend.hostname"); // Create RegistryData for all TLDs used in these tests. // We want to create all of these even for tests that don't use them to make sure that diff --git a/javatests/com/google/domain/registry/monitoring/whitebox/MetricsTest.java b/javatests/com/google/domain/registry/monitoring/whitebox/MetricsTest.java index 2f99050bc..3d0e827c8 100644 --- a/javatests/com/google/domain/registry/monitoring/whitebox/MetricsTest.java +++ b/javatests/com/google/domain/registry/monitoring/whitebox/MetricsTest.java @@ -27,10 +27,10 @@ import org.junit.Before; import org.junit.Rule; import org.junit.Test; import org.junit.runner.RunWith; -import org.junit.runners.JUnit4; +import org.mockito.runners.MockitoJUnitRunner; /** Unit tests for {@link Metrics}. */ -@RunWith(JUnit4.class) +@RunWith(MockitoJUnitRunner.class) public class MetricsTest { @Rule @@ -39,6 +39,7 @@ public class MetricsTest { @Rule public final AppEngineRule appEngine = AppEngineRule.builder() .withDatastore() + .withLocalModules() .withTaskQueue() .build(); @@ -60,6 +61,7 @@ public class MetricsTest { assertTasksEnqueued("bigquery-streaming-metrics", new TaskMatcher() .url("/_dr/task/metrics") + .header("Host", "1.backend.test.localhost") .param("tableId", "test") .param("startTime", "472176000.000000") .param("endTime", "472176000.001000")