Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
5 changes: 5 additions & 0 deletions core/src/main/java/google/registry/rdap/RdapActionBase.java
Original file line number Diff line number Diff line change
Expand Up @@ -51,6 +51,7 @@
import jakarta.inject.Inject;
import java.net.URI;
import java.net.URISyntaxException;
import java.time.Duration;
import java.time.Instant;
import java.util.Optional;

Expand Down Expand Up @@ -131,6 +132,7 @@ abstract ReplyPayloadBase getJsonObjectForResource(

@Override
public void run() {
Instant startTime = clock.now();
metricInformationBuilder.setIncludeDeleted(includeDeletedParam.orElse(false));
metricInformationBuilder.setRole(rdapAuthorization.role());
metricInformationBuilder.setRequestMethod(requestMethod);
Expand Down Expand Up @@ -179,6 +181,9 @@ public void run() {
setError(SC_INTERNAL_SERVER_ERROR, "Internal Server Error", "An error was encountered");
logger.atSevere().withCause(e).log("Exception encountered while processing RDAP command.");
}
long processingTime = Duration.between(startTime, clock.now()).toMillis();
metricInformationBuilder.setProcessingTime(processingTime);

rdapMetrics.updateMetrics(metricInformationBuilder.build());
}

Expand Down
29 changes: 28 additions & 1 deletion core/src/main/java/google/registry/rdap/RdapMetrics.java
Original file line number Diff line number Diff line change
Expand Up @@ -14,6 +14,8 @@

package google.registry.rdap;

import static com.google.monitoring.metrics.EventMetric.DEFAULT_FITTER;

import com.google.auto.value.AutoBuilder;
import com.google.common.annotations.VisibleForTesting;
import com.google.common.collect.ImmutableSet;
Expand Down Expand Up @@ -133,6 +135,16 @@ enum WildcardType {
LABEL_DESCRIPTORS_FOR_RETRIEVAL_COUNTS,
FIBONACCI_FITTER);

@VisibleForTesting
static final EventMetric requestTime =
MetricRegistryImpl.getDefault()
.newEventMetric(
"/rdap/request_time",
"RDAP Request Time",
"milliseconds",
LABEL_DESCRIPTORS_FOR_RESPONSES,
DEFAULT_FITTER);

@Inject
public RdapMetrics() {}

Expand Down Expand Up @@ -181,6 +193,15 @@ public void updateMetrics(RdapMetricInformation rdapMetricInformation) {
getLabelStringForPrefixLength(rdapMetricInformation.prefixLength()),
rdapMetricInformation.includeDeleted() ? "YES" : "NO");
}
if (rdapMetricInformation.processingTime().isPresent()) {
requestTime.record(
rdapMetricInformation.processingTime().get(),
rdapMetricInformation.endpointType().toString(),
rdapMetricInformation.searchType().toString(),
rdapMetricInformation.wildcardType().toString(),
String.valueOf(rdapMetricInformation.statusCode()),
rdapMetricInformation.incompletenessWarningType().toString());
}
}

/**
Expand All @@ -202,6 +223,8 @@ public void updateMetrics(RdapMetricInformation rdapMetricInformation) {
* than were actually returned in the response; absent if a search was not performed.
* @param numHostsRetrieved Number of hosts retrieved from the database; this might be more than
* were actually returned in the response; absent if a search was not performed.
* @param processingTime The processing time for the request in milliseconds; absent if not
* recorded.
*/
public record RdapMetricInformation(
EndpointType endpointType,
Expand All @@ -215,7 +238,8 @@ public record RdapMetricInformation(
int statusCode,
IncompletenessWarningType incompletenessWarningType,
Optional<Long> numDomainsRetrieved,
Optional<Long> numHostsRetrieved) {
Optional<Long> numHostsRetrieved,
Optional<Long> processingTime) {

@AutoBuilder
interface Builder {
Expand Down Expand Up @@ -243,9 +267,12 @@ interface Builder {

Builder setNumHostsRetrieved(long numHostsRetrieved);

Builder setProcessingTime(long processingTime);

RdapMetricInformation build();
}


static Builder builder() {
return new AutoBuilder_RdapMetrics_RdapMetricInformation_Builder()
.setSearchType(SearchType.NONE)
Expand Down
27 changes: 27 additions & 0 deletions core/src/test/java/google/registry/rdap/RdapActionBaseTest.java
Original file line number Diff line number Diff line change
Expand Up @@ -21,6 +21,7 @@
import static google.registry.request.Action.Method.GET;
import static google.registry.request.Action.Method.HEAD;
import static google.registry.testing.DatabaseHelper.createTld;
import static org.joda.time.Duration.millis;
import static org.mockito.Mockito.verify;

import google.registry.rdap.RdapMetrics.EndpointType;
Expand All @@ -31,6 +32,7 @@
import google.registry.rdap.RdapSearchResults.IncompletenessWarningType;
import google.registry.request.Action;
import google.registry.request.auth.Auth;
import google.registry.testing.FakeClock;
import java.util.Optional;
import org.junit.jupiter.api.BeforeEach;
import org.junit.jupiter.api.Test;
Expand Down Expand Up @@ -63,6 +65,9 @@ public ReplyPayloadBase getJsonObjectForResource(
if (pathSearchString.equals("RuntimeException")) {
throw new RuntimeException();
}
if (pathSearchString.equals("advanceClock")) {
((FakeClock) clock).advanceBy(millis(50));
}
return new ReplyPayloadBase(BoilerplateType.OTHER) {
@JsonableElement public String key = "value";
};
Expand Down Expand Up @@ -130,6 +135,7 @@ void testMetrics_onSuccess() {
.setRequestMethod(Action.Method.GET)
.setStatusCode(200)
.setIncompletenessWarningType(IncompletenessWarningType.COMPLETE)
.setProcessingTime(0L)
.build());
}

Expand All @@ -149,6 +155,7 @@ void testMetrics_onError() {
.setRequestMethod(Action.Method.GET)
.setStatusCode(400)
.setIncompletenessWarningType(IncompletenessWarningType.COMPLETE)
.setProcessingTime(0L)
.build());
}

Expand All @@ -172,4 +179,24 @@ void testFormatted() {
assertThat(payload).contains("\n");
assertThat(parseJsonObject(payload)).isEqualTo(loadJsonFile("rdapjson_toplevel.json"));
}

@Test
void testMetrics_recordsProcessingTime() {
generateActualJson("advanceClock");
verify(rdapMetrics)
.updateMetrics(
RdapMetrics.RdapMetricInformation.builder()
.setEndpointType(EndpointType.HELP)
.setSearchType(SearchType.NONE)
.setWildcardType(WildcardType.INVALID)
.setPrefixLength(0)
.setIncludeDeleted(false)
.setRegistrarSpecified(false)
.setRole(RdapAuthorization.Role.PUBLIC)
.setRequestMethod(Action.Method.GET)
.setStatusCode(200)
.setIncompletenessWarningType(IncompletenessWarningType.COMPLETE)
.setProcessingTime(50L)
.build());
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -435,6 +435,7 @@ void testMetrics() {
.setRequestMethod(Action.Method.GET)
.setStatusCode(200)
.setIncompletenessWarningType(IncompletenessWarningType.COMPLETE)
.setProcessingTime(0L)
.build());
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -235,6 +235,7 @@ void testMetrics() {
.setRequestMethod(Action.Method.GET)
.setStatusCode(200)
.setIncompletenessWarningType(IncompletenessWarningType.COMPLETE)
.setProcessingTime(0L)
.build());
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -82,6 +82,7 @@ void testHelpActionMetrics() {
.setRequestMethod(Action.Method.GET)
.setStatusCode(200)
.setIncompletenessWarningType(IncompletenessWarningType.COMPLETE)
.setProcessingTime(0L)
.build());
}
}
10 changes: 10 additions & 0 deletions core/src/test/java/google/registry/rdap/RdapMetricsTest.java
Original file line number Diff line number Diff line change
Expand Up @@ -37,6 +37,7 @@ void beforeEach() {
RdapMetrics.responses.reset();
RdapMetrics.numberOfDomainsRetrieved.reset();
RdapMetrics.numberOfHostsRetrieved.reset();
RdapMetrics.requestTime.reset();
}

private RdapMetrics.RdapMetricInformation.Builder getBuilder() {
Expand Down Expand Up @@ -274,4 +275,13 @@ void testEntitySearchByNameWithWildcard() {
assertThat(RdapMetrics.numberOfDomainsRetrieved).hasNoOtherValues();
assertThat(RdapMetrics.numberOfHostsRetrieved).hasNoOtherValues();
}

@Test
void testRecordProcessingTime() {
rdapMetrics.updateMetrics(getBuilder().setProcessingTime(100L).build());
assertThat(RdapMetrics.requestTime)
.hasDataSetForLabels(ImmutableSet.of(100L), "DOMAINS", "NONE", "INVALID", "200", "COMPLETE")
.and()
.hasNoOtherValues();
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -287,6 +287,7 @@ void testMetrics() {
.setRequestMethod(Action.Method.GET)
.setStatusCode(200)
.setIncompletenessWarningType(IncompletenessWarningType.COMPLETE)
.setProcessingTime(0L)
.build());
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -90,7 +90,8 @@ void verifyMetrics(
.setRole(metricRole)
.setRequestMethod(requestMethod)
.setStatusCode(metricStatusCode)
.setIncompletenessWarningType(incompletenessWarningType);
.setIncompletenessWarningType(incompletenessWarningType)
.setProcessingTime(0L);
numDomainsRetrieved.ifPresent(builder::setNumDomainsRetrieved);
numHostsRetrieved.ifPresent(builder::setNumHostsRetrieved);
verify(rdapMetrics).updateMetrics(builder.build());
Expand Down
Loading