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")