mirror of
https://github.com/google/nomulus.git
synced 2025-05-13 07:57:13 +02:00
Optimize activity report SQL
We only log FLOW-LOG-SIGNATURE-METADATA from one place- FlowRunner. As a result, we can swap the generalized regex for a prefix-only regex, saving a <strong>lot</strong> of processing for our epp query (which is the most expensive of the bunch). I've also changed the test dates from 2017-05 to 2017-06, allowing us to copy-paste the test data into Bigquery to verify their function. The reason for 2017-06 in particular is because June was the first month that populated all the metadata necessary to generate these reports. ------------- Created by MOE: https://github.com/google/moe MOE_MIGRATED_REVID=165391715
This commit is contained in:
parent
9e7c996081
commit
38abe9fa48
10 changed files with 33 additions and 29 deletions
|
@ -103,6 +103,10 @@ public final class ActivityReportingQueryBuilder {
|
||||||
.put("PROJECT_ID", projectId)
|
.put("PROJECT_ID", projectId)
|
||||||
.put("ICANN_REPORTING_DATA_SET", ICANN_REPORTING_DATA_SET)
|
.put("ICANN_REPORTING_DATA_SET", ICANN_REPORTING_DATA_SET)
|
||||||
.put("MONTHLY_LOGS_TABLE", getTableName(MONTHLY_LOGS))
|
.put("MONTHLY_LOGS_TABLE", getTableName(MONTHLY_LOGS))
|
||||||
|
// All metadata logs for reporting come from google.registry.flows.FlowReporter.
|
||||||
|
.put(
|
||||||
|
"METADATA_LOG_PREFIX",
|
||||||
|
"google.registry.flows.FlowReporter recordToLogs: FLOW-LOG-SIGNATURE-METADATA")
|
||||||
.build();
|
.build();
|
||||||
queriesBuilder.put(getTableName(EPP_METRICS), eppQuery);
|
queriesBuilder.put(getTableName(EPP_METRICS), eppQuery);
|
||||||
|
|
||||||
|
|
|
@ -43,7 +43,7 @@ FROM (
|
||||||
JOIN
|
JOIN
|
||||||
UNNEST(logs.logMessage) AS logMessage
|
UNNEST(logs.logMessage) AS logMessage
|
||||||
WHERE
|
WHERE
|
||||||
logMessage LIKE "%FLOW-LOG-SIGNATURE-METADATA%")) AS regexes
|
STARTS_WITH(logMessage, "%METADATA_LOG_PREFIX%"))) AS regexes
|
||||||
JOIN
|
JOIN
|
||||||
-- Unnest the JSON-parsed tlds.
|
-- Unnest the JSON-parsed tlds.
|
||||||
UNNEST(regexes.tlds) AS tld
|
UNNEST(regexes.tlds) AS tld
|
||||||
|
|
|
@ -29,7 +29,7 @@ public class ActivityReportingQueryBuilderTest {
|
||||||
|
|
||||||
private ActivityReportingQueryBuilder getQueryBuilder() {
|
private ActivityReportingQueryBuilder getQueryBuilder() {
|
||||||
ActivityReportingQueryBuilder queryBuilder = new ActivityReportingQueryBuilder();
|
ActivityReportingQueryBuilder queryBuilder = new ActivityReportingQueryBuilder();
|
||||||
queryBuilder.yearMonth = "2017-05";
|
queryBuilder.yearMonth = "2017-06";
|
||||||
queryBuilder.projectId = "domain-registry-alpha";
|
queryBuilder.projectId = "domain-registry-alpha";
|
||||||
return queryBuilder;
|
return queryBuilder;
|
||||||
}
|
}
|
||||||
|
@ -40,7 +40,7 @@ public class ActivityReportingQueryBuilderTest {
|
||||||
assertThat(queryBuilder.getActivityReportQuery())
|
assertThat(queryBuilder.getActivityReportQuery())
|
||||||
.isEqualTo(
|
.isEqualTo(
|
||||||
"#standardSQL\nSELECT * FROM "
|
"#standardSQL\nSELECT * FROM "
|
||||||
+ "`domain-registry-alpha.icann_reporting.activity_report_aggregation_201705`");
|
+ "`domain-registry-alpha.icann_reporting.activity_report_aggregation_201706`");
|
||||||
}
|
}
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
|
@ -59,7 +59,7 @@ public class ActivityReportingQueryBuilderTest {
|
||||||
for (String queryName : queryNames) {
|
for (String queryName : queryNames) {
|
||||||
String testFilename = String.format("%s_test.sql", queryName);
|
String testFilename = String.format("%s_test.sql", queryName);
|
||||||
testQueryBuilder.put(
|
testQueryBuilder.put(
|
||||||
String.format("%s_201705", queryName), ReportingTestData.getString(testFilename));
|
String.format("%s_201706", queryName), ReportingTestData.getString(testFilename));
|
||||||
}
|
}
|
||||||
ImmutableMap<String, String> expectedQueries = testQueryBuilder.build();
|
ImmutableMap<String, String> expectedQueries = testQueryBuilder.build();
|
||||||
ImmutableMap<String, String> actualQueries = queryBuilder.getViewQueryMap();
|
ImmutableMap<String, String> actualQueries = queryBuilder.getViewQueryMap();
|
||||||
|
|
|
@ -82,9 +82,9 @@ public class IcannHttpReporterTest {
|
||||||
@Test
|
@Test
|
||||||
public void testSuccess() throws Exception {
|
public void testSuccess() throws Exception {
|
||||||
IcannHttpReporter reporter = createReporter();
|
IcannHttpReporter reporter = createReporter();
|
||||||
reporter.send(FAKE_PAYLOAD, "test", "2016-06", ReportType.TRANSACTIONS);
|
reporter.send(FAKE_PAYLOAD, "test", "2017-06", ReportType.TRANSACTIONS);
|
||||||
|
|
||||||
assertThat(mockRequest.getUrl()).isEqualTo("https://fake-transactions.url/test/2016-06");
|
assertThat(mockRequest.getUrl()).isEqualTo("https://fake-transactions.url/test/2017-06");
|
||||||
Map<String, List<String>> headers = mockRequest.getHeaders();
|
Map<String, List<String>> headers = mockRequest.getHeaders();
|
||||||
String userPass = "test_ry:fakePass";
|
String userPass = "test_ry:fakePass";
|
||||||
String expectedAuth =
|
String expectedAuth =
|
||||||
|
@ -98,7 +98,7 @@ public class IcannHttpReporterTest {
|
||||||
IcannHttpReporter reporter = createReporter();
|
IcannHttpReporter reporter = createReporter();
|
||||||
reporter.httpTransport = createMockTransport(IIRDEA_BAD_XML);
|
reporter.httpTransport = createMockTransport(IIRDEA_BAD_XML);
|
||||||
try {
|
try {
|
||||||
reporter.send(FAKE_PAYLOAD, "test", "2016-06", ReportType.TRANSACTIONS);
|
reporter.send(FAKE_PAYLOAD, "test", "2017-06", ReportType.TRANSACTIONS);
|
||||||
assertWithMessage("Expected InternalServerErrorException to be thrown").fail();
|
assertWithMessage("Expected InternalServerErrorException to be thrown").fail();
|
||||||
} catch (InternalServerErrorException expected) {
|
} catch (InternalServerErrorException expected) {
|
||||||
assertThat(expected).hasMessageThat().isEqualTo("The structure of the report is invalid.");
|
assertThat(expected).hasMessageThat().isEqualTo("The structure of the report is invalid.");
|
||||||
|
|
|
@ -64,9 +64,9 @@ public class IcannReportingStagingActionTest {
|
||||||
IcannReportingStagingAction action = new IcannReportingStagingAction();
|
IcannReportingStagingAction action = new IcannReportingStagingAction();
|
||||||
queryBuilder = new ActivityReportingQueryBuilder();
|
queryBuilder = new ActivityReportingQueryBuilder();
|
||||||
queryBuilder.projectId = "test-project";
|
queryBuilder.projectId = "test-project";
|
||||||
queryBuilder.yearMonth = "2017-05";
|
queryBuilder.yearMonth = "2017-06";
|
||||||
action.reportingBucket = "test-bucket";
|
action.reportingBucket = "test-bucket";
|
||||||
action.yearMonth = "2017-05";
|
action.yearMonth = "2017-06";
|
||||||
action.subdir = Optional.absent();
|
action.subdir = Optional.absent();
|
||||||
action.queryBuilder = queryBuilder;
|
action.queryBuilder = queryBuilder;
|
||||||
action.bigquery = bigquery;
|
action.bigquery = bigquery;
|
||||||
|
@ -103,12 +103,12 @@ public class IcannReportingStagingActionTest {
|
||||||
byte[] generatedFile1 =
|
byte[] generatedFile1 =
|
||||||
readGcsFile(
|
readGcsFile(
|
||||||
gcsService,
|
gcsService,
|
||||||
new GcsFilename("test-bucket/icann/monthly/2017-05", "fooTld-activity-201705.csv"));
|
new GcsFilename("test-bucket/icann/monthly/2017-06", "fooTld-activity-201706.csv"));
|
||||||
assertThat(new String(generatedFile1, UTF_8)).isEqualTo(expectedReport1);
|
assertThat(new String(generatedFile1, UTF_8)).isEqualTo(expectedReport1);
|
||||||
byte[] generatedFile2 =
|
byte[] generatedFile2 =
|
||||||
readGcsFile(
|
readGcsFile(
|
||||||
gcsService,
|
gcsService,
|
||||||
new GcsFilename("test-bucket/icann/monthly/2017-05", "barTld-activity-201705.csv"));
|
new GcsFilename("test-bucket/icann/monthly/2017-06", "barTld-activity-201706.csv"));
|
||||||
assertThat(new String(generatedFile2, UTF_8)).isEqualTo(expectedReport2);
|
assertThat(new String(generatedFile2, UTF_8)).isEqualTo(expectedReport2);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -55,14 +55,14 @@ public class IcannReportingUploadActionTest {
|
||||||
private final FakeResponse response = new FakeResponse();
|
private final FakeResponse response = new FakeResponse();
|
||||||
private final GcsService gcsService = GcsServiceFactory.createGcsService();
|
private final GcsService gcsService = GcsServiceFactory.createGcsService();
|
||||||
private final GcsFilename reportFile =
|
private final GcsFilename reportFile =
|
||||||
new GcsFilename("basin/icann/monthly/2017-05", "test-transactions-201705.csv");
|
new GcsFilename("basin/icann/monthly/2017-06", "test-transactions-201706.csv");
|
||||||
|
|
||||||
private IcannReportingUploadAction createAction() {
|
private IcannReportingUploadAction createAction() {
|
||||||
IcannReportingUploadAction action = new IcannReportingUploadAction();
|
IcannReportingUploadAction action = new IcannReportingUploadAction();
|
||||||
action.icannReporter = mockReporter;
|
action.icannReporter = mockReporter;
|
||||||
action.gcsUtils = new GcsUtils(gcsService, 1024);
|
action.gcsUtils = new GcsUtils(gcsService, 1024);
|
||||||
action.retrier = new Retrier(new FakeSleeper(new FakeClock()), 3);
|
action.retrier = new Retrier(new FakeSleeper(new FakeClock()), 3);
|
||||||
action.yearMonth = "2017-05";
|
action.yearMonth = "2017-06";
|
||||||
action.reportType = TRANSACTIONS;
|
action.reportType = TRANSACTIONS;
|
||||||
action.subdir = Optional.absent();
|
action.subdir = Optional.absent();
|
||||||
action.tld = "test";
|
action.tld = "test";
|
||||||
|
@ -81,7 +81,7 @@ public class IcannReportingUploadActionTest {
|
||||||
public void testSuccess() throws Exception {
|
public void testSuccess() throws Exception {
|
||||||
IcannReportingUploadAction action = createAction();
|
IcannReportingUploadAction action = createAction();
|
||||||
action.run();
|
action.run();
|
||||||
verify(mockReporter).send(FAKE_PAYLOAD, "test", "2017-05", TRANSACTIONS);
|
verify(mockReporter).send(FAKE_PAYLOAD, "test", "2017-06", TRANSACTIONS);
|
||||||
verifyNoMoreInteractions(mockReporter);
|
verifyNoMoreInteractions(mockReporter);
|
||||||
assertThat(((FakeResponse) action.response).getPayload())
|
assertThat(((FakeResponse) action.response).getPayload())
|
||||||
.isEqualTo("OK, sending: test,csv\n13,37");
|
.isEqualTo("OK, sending: test,csv\n13,37");
|
||||||
|
@ -93,9 +93,9 @@ public class IcannReportingUploadActionTest {
|
||||||
doThrow(new IOException("Expected exception."))
|
doThrow(new IOException("Expected exception."))
|
||||||
.doNothing()
|
.doNothing()
|
||||||
.when(mockReporter)
|
.when(mockReporter)
|
||||||
.send(FAKE_PAYLOAD, "test", "2017-05", TRANSACTIONS);
|
.send(FAKE_PAYLOAD, "test", "2017-06", TRANSACTIONS);
|
||||||
action.run();
|
action.run();
|
||||||
verify(mockReporter, times(2)).send(FAKE_PAYLOAD, "test", "2017-05", TRANSACTIONS);
|
verify(mockReporter, times(2)).send(FAKE_PAYLOAD, "test", "2017-06", TRANSACTIONS);
|
||||||
verifyNoMoreInteractions(mockReporter);
|
verifyNoMoreInteractions(mockReporter);
|
||||||
assertThat(((FakeResponse) action.response).getPayload())
|
assertThat(((FakeResponse) action.response).getPayload())
|
||||||
.isEqualTo("OK, sending: test,csv\n13,37");
|
.isEqualTo("OK, sending: test,csv\n13,37");
|
||||||
|
@ -162,8 +162,8 @@ public class IcannReportingUploadActionTest {
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
public void testSuccess_CreateFilename() throws Exception{
|
public void testSuccess_CreateFilename() throws Exception{
|
||||||
assertThat(IcannReportingUploadAction.createFilename("test", "2017-05", ACTIVITY))
|
assertThat(IcannReportingUploadAction.createFilename("test", "2017-06", ACTIVITY))
|
||||||
.isEqualTo("test-activity-201705.csv");
|
.isEqualTo("test-activity-201706.csv");
|
||||||
assertThat(IcannReportingUploadAction.createFilename("foo", "1234-56", TRANSACTIONS))
|
assertThat(IcannReportingUploadAction.createFilename("foo", "1234-56", TRANSACTIONS))
|
||||||
.isEqualTo("foo-transactions-123456.csv");
|
.isEqualTo("foo-transactions-123456.csv");
|
||||||
}
|
}
|
||||||
|
@ -172,11 +172,11 @@ public class IcannReportingUploadActionTest {
|
||||||
public void testSuccess_CreateBucketname() throws Exception{
|
public void testSuccess_CreateBucketname() throws Exception{
|
||||||
assertThat(
|
assertThat(
|
||||||
IcannReportingUploadAction
|
IcannReportingUploadAction
|
||||||
.createReportingBucketName("gs://my-reporting", Optional.<String>absent(), "2017-05"))
|
.createReportingBucketName("gs://my-reporting", Optional.<String>absent(), "2017-06"))
|
||||||
.isEqualTo("gs://my-reporting/icann/monthly/2017-05");
|
.isEqualTo("gs://my-reporting/icann/monthly/2017-06");
|
||||||
assertThat(
|
assertThat(
|
||||||
IcannReportingUploadAction
|
IcannReportingUploadAction
|
||||||
.createReportingBucketName("gs://my-reporting", Optional.of("manual"), "2017-05"))
|
.createReportingBucketName("gs://my-reporting", Optional.of("manual"), "2017-06"))
|
||||||
.isEqualTo("gs://my-reporting/manual");
|
.isEqualTo("gs://my-reporting/manual");
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -82,16 +82,16 @@ CROSS JOIN(
|
||||||
SELECT STRING(NULL) AS tld, STRING(NULL) AS metricName, 0 as count
|
SELECT STRING(NULL) AS tld, STRING(NULL) AS metricName, 0 as count
|
||||||
UNION ALL
|
UNION ALL
|
||||||
SELECT * FROM
|
SELECT * FROM
|
||||||
`domain-registry-alpha.icann_reporting.registrar_operating_status_201705`
|
`domain-registry-alpha.icann_reporting.registrar_operating_status_201706`
|
||||||
UNION ALL
|
UNION ALL
|
||||||
SELECT * FROM
|
SELECT * FROM
|
||||||
`domain-registry-alpha.icann_reporting.dns_counts_201705`
|
`domain-registry-alpha.icann_reporting.dns_counts_201706`
|
||||||
UNION ALL
|
UNION ALL
|
||||||
SELECT * FROM
|
SELECT * FROM
|
||||||
`domain-registry-alpha.icann_reporting.epp_metrics_201705`
|
`domain-registry-alpha.icann_reporting.epp_metrics_201706`
|
||||||
UNION ALL
|
UNION ALL
|
||||||
SELECT * FROM
|
SELECT * FROM
|
||||||
`domain-registry-alpha.icann_reporting.whois_counts_201705`
|
`domain-registry-alpha.icann_reporting.whois_counts_201706`
|
||||||
-- END INTERMEDIARY DATA SOURCES --
|
-- END INTERMEDIARY DATA SOURCES --
|
||||||
)) AS TldMetrics
|
)) AS TldMetrics
|
||||||
WHERE RealTlds.tld = TldMetrics.tld OR TldMetrics.tld IS NULL
|
WHERE RealTlds.tld = TldMetrics.tld OR TldMetrics.tld IS NULL
|
||||||
|
|
|
@ -39,11 +39,11 @@ FROM (
|
||||||
-- Extract the logged JSON payload.
|
-- Extract the logged JSON payload.
|
||||||
REGEXP_EXTRACT(logMessage, r'FLOW-LOG-SIGNATURE-METADATA: (.*)\n?$')
|
REGEXP_EXTRACT(logMessage, r'FLOW-LOG-SIGNATURE-METADATA: (.*)\n?$')
|
||||||
AS json
|
AS json
|
||||||
FROM `domain-registry-alpha.icann_reporting.monthly_logs_201705` AS logs
|
FROM `domain-registry-alpha.icann_reporting.monthly_logs_201706` AS logs
|
||||||
JOIN
|
JOIN
|
||||||
UNNEST(logs.logMessage) AS logMessage
|
UNNEST(logs.logMessage) AS logMessage
|
||||||
WHERE
|
WHERE
|
||||||
logMessage LIKE "%FLOW-LOG-SIGNATURE-METADATA%")) AS regexes
|
STARTS_WITH(logMessage, "google.registry.flows.FlowReporter recordToLogs: FLOW-LOG-SIGNATURE-METADATA"))) AS regexes
|
||||||
JOIN
|
JOIN
|
||||||
-- Unnest the JSON-parsed tlds.
|
-- Unnest the JSON-parsed tlds.
|
||||||
UNNEST(regexes.tlds) AS tld
|
UNNEST(regexes.tlds) AS tld
|
||||||
|
|
|
@ -27,4 +27,4 @@ SELECT
|
||||||
FROM
|
FROM
|
||||||
`domain-registry-alpha.appengine_logs.appengine_googleapis_com_request_log_*`
|
`domain-registry-alpha.appengine_logs.appengine_googleapis_com_request_log_*`
|
||||||
WHERE
|
WHERE
|
||||||
_TABLE_SUFFIX BETWEEN '20170501' AND '20170601'
|
_TABLE_SUFFIX BETWEEN '20170601' AND '20170701'
|
||||||
|
|
|
@ -26,7 +26,7 @@ SELECT
|
||||||
END AS metricName,
|
END AS metricName,
|
||||||
COUNT(requestPath) AS count
|
COUNT(requestPath) AS count
|
||||||
FROM
|
FROM
|
||||||
`domain-registry-alpha.icann_reporting.monthly_logs_201705`
|
`domain-registry-alpha.icann_reporting.monthly_logs_201706`
|
||||||
GROUP BY
|
GROUP BY
|
||||||
metricName
|
metricName
|
||||||
HAVING
|
HAVING
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue