mirror of
https://github.com/google/nomulus.git
synced 2025-05-16 09:27:16 +02:00
Add metrics to PublishDnsUpdatesAction
------------- Created by MOE: https://github.com/google/moe MOE_MIGRATED_REVID=131190862
This commit is contained in:
parent
8f0f701ff7
commit
1c5b4e16c6
6 changed files with 132 additions and 0 deletions
|
@ -38,6 +38,7 @@ java_library(
|
||||||
"//java/google/registry/config",
|
"//java/google/registry/config",
|
||||||
"//java/google/registry/dns/writer",
|
"//java/google/registry/dns/writer",
|
||||||
"//java/google/registry/model",
|
"//java/google/registry/model",
|
||||||
|
"//java/google/registry/monitoring/metrics",
|
||||||
"//java/google/registry/request",
|
"//java/google/registry/request",
|
||||||
"//java/google/registry/util",
|
"//java/google/registry/util",
|
||||||
],
|
],
|
||||||
|
|
68
java/google/registry/dns/DnsMetrics.java
Normal file
68
java/google/registry/dns/DnsMetrics.java
Normal file
|
@ -0,0 +1,68 @@
|
||||||
|
// Copyright 2016 The Domain Registry Authors. All Rights Reserved.
|
||||||
|
//
|
||||||
|
// Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
|
// you may not use this file except in compliance with the License.
|
||||||
|
// You may obtain a copy of the License at
|
||||||
|
//
|
||||||
|
// http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
//
|
||||||
|
// Unless required by applicable law or agreed to in writing, software
|
||||||
|
// distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
|
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
|
// See the License for the specific language governing permissions and
|
||||||
|
// limitations under the License.
|
||||||
|
|
||||||
|
package google.registry.dns;
|
||||||
|
|
||||||
|
import com.google.common.collect.ImmutableSet;
|
||||||
|
import google.registry.monitoring.metrics.IncrementableMetric;
|
||||||
|
import google.registry.monitoring.metrics.LabelDescriptor;
|
||||||
|
import google.registry.monitoring.metrics.MetricRegistryImpl;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* DNS instrumentation.
|
||||||
|
*/
|
||||||
|
public class DnsMetrics {
|
||||||
|
|
||||||
|
private static final ImmutableSet<LabelDescriptor> LABEL_DESCRIPTORS =
|
||||||
|
ImmutableSet.of(
|
||||||
|
LabelDescriptor.create("tld", "TLD"),
|
||||||
|
LabelDescriptor.create(
|
||||||
|
"status", "Whether the publish request was accepted or rejected."));
|
||||||
|
private static final IncrementableMetric publishDomainRequests =
|
||||||
|
MetricRegistryImpl.getDefault()
|
||||||
|
.newIncrementableMetric(
|
||||||
|
"/dns/publish_domain_requests",
|
||||||
|
"count of publishDomain requests",
|
||||||
|
"count",
|
||||||
|
LABEL_DESCRIPTORS);
|
||||||
|
private static final IncrementableMetric publishHostRequests =
|
||||||
|
MetricRegistryImpl.getDefault()
|
||||||
|
.newIncrementableMetric(
|
||||||
|
"/dns/publish_host_requests",
|
||||||
|
"count of publishHost requests",
|
||||||
|
"count",
|
||||||
|
LABEL_DESCRIPTORS);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Increment a monotonic counter that tracks calls to {@link
|
||||||
|
* google.registry.dns.writer.DnsWriter#publishDomain(String)}, per TLD.
|
||||||
|
*/
|
||||||
|
public void incrementPublishDomainRequests(String tld, Status status) {
|
||||||
|
publishDomainRequests.increment(tld, status.name());
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Increment a monotonic counter that tracks calls to {@link
|
||||||
|
* google.registry.dns.writer.DnsWriter#publishHost(String)}, per TLD.
|
||||||
|
*/
|
||||||
|
public void incrementPublishHostRequests(String tld, Status status) {
|
||||||
|
publishHostRequests.increment(tld, status.name());
|
||||||
|
}
|
||||||
|
|
||||||
|
/** Enum to encode the disposition of a publish request. */
|
||||||
|
public enum Status {
|
||||||
|
ACCEPTED,
|
||||||
|
REJECTED
|
||||||
|
}
|
||||||
|
}
|
|
@ -20,6 +20,7 @@ import static google.registry.util.CollectionUtils.nullToEmpty;
|
||||||
|
|
||||||
import com.google.common.net.InternetDomainName;
|
import com.google.common.net.InternetDomainName;
|
||||||
import google.registry.config.ConfigModule.Config;
|
import google.registry.config.ConfigModule.Config;
|
||||||
|
import google.registry.dns.DnsMetrics.Status;
|
||||||
import google.registry.dns.writer.DnsWriter;
|
import google.registry.dns.writer.DnsWriter;
|
||||||
import google.registry.request.Action;
|
import google.registry.request.Action;
|
||||||
import google.registry.request.HttpException.ServiceUnavailableException;
|
import google.registry.request.HttpException.ServiceUnavailableException;
|
||||||
|
@ -44,6 +45,7 @@ public final class PublishDnsUpdatesAction implements Runnable, Callable<Void> {
|
||||||
|
|
||||||
@Inject DnsQueue dnsQueue;
|
@Inject DnsQueue dnsQueue;
|
||||||
@Inject DnsWriterProxy dnsWriterProxy;
|
@Inject DnsWriterProxy dnsWriterProxy;
|
||||||
|
@Inject DnsMetrics dnsMetrics;
|
||||||
@Inject @Config("dnsWriteLockTimeout") Duration timeout;
|
@Inject @Config("dnsWriteLockTimeout") Duration timeout;
|
||||||
@Inject @Parameter(RequestParameters.PARAM_TLD) String tld;
|
@Inject @Parameter(RequestParameters.PARAM_TLD) String tld;
|
||||||
@Inject @Parameter(DOMAINS_PARAM) Set<String> domains;
|
@Inject @Parameter(DOMAINS_PARAM) Set<String> domains;
|
||||||
|
@ -76,16 +78,20 @@ public final class PublishDnsUpdatesAction implements Runnable, Callable<Void> {
|
||||||
for (String domain : nullToEmpty(domains)) {
|
for (String domain : nullToEmpty(domains)) {
|
||||||
if (!DomainNameUtils.isUnder(
|
if (!DomainNameUtils.isUnder(
|
||||||
InternetDomainName.from(domain), InternetDomainName.from(tld))) {
|
InternetDomainName.from(domain), InternetDomainName.from(tld))) {
|
||||||
|
dnsMetrics.incrementPublishDomainRequests(tld, Status.REJECTED);
|
||||||
logger.severefmt("%s: skipping domain %s not under tld", tld, domain);
|
logger.severefmt("%s: skipping domain %s not under tld", tld, domain);
|
||||||
} else {
|
} else {
|
||||||
|
dnsMetrics.incrementPublishDomainRequests(tld, Status.ACCEPTED);
|
||||||
writer.publishDomain(domain);
|
writer.publishDomain(domain);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
for (String host : nullToEmpty(hosts)) {
|
for (String host : nullToEmpty(hosts)) {
|
||||||
if (!DomainNameUtils.isUnder(
|
if (!DomainNameUtils.isUnder(
|
||||||
InternetDomainName.from(host), InternetDomainName.from(tld))) {
|
InternetDomainName.from(host), InternetDomainName.from(tld))) {
|
||||||
|
dnsMetrics.incrementPublishHostRequests(tld, Status.REJECTED);
|
||||||
logger.severefmt("%s: skipping host %s not under tld", tld, host);
|
logger.severefmt("%s: skipping host %s not under tld", tld, host);
|
||||||
} else {
|
} else {
|
||||||
|
dnsMetrics.incrementPublishHostRequests(tld, Status.ACCEPTED);
|
||||||
writer.publishHost(host);
|
writer.publishHost(host);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -47,6 +47,7 @@ import javax.inject.Singleton;
|
||||||
@Component(
|
@Component(
|
||||||
modules = {
|
modules = {
|
||||||
AppIdentityCredentialModule.class,
|
AppIdentityCredentialModule.class,
|
||||||
|
BackendMetricsModule.class,
|
||||||
BigqueryModule.class,
|
BigqueryModule.class,
|
||||||
ConfigModule.class,
|
ConfigModule.class,
|
||||||
DatastoreServiceModule.class,
|
DatastoreServiceModule.class,
|
||||||
|
|
|
@ -0,0 +1,34 @@
|
||||||
|
// Copyright 2016 The Domain Registry Authors. All Rights Reserved.
|
||||||
|
//
|
||||||
|
// Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
|
// you may not use this file except in compliance with the License.
|
||||||
|
// You may obtain a copy of the License at
|
||||||
|
//
|
||||||
|
// http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
//
|
||||||
|
// Unless required by applicable law or agreed to in writing, software
|
||||||
|
// distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
|
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
|
// See the License for the specific language governing permissions and
|
||||||
|
// limitations under the License.
|
||||||
|
|
||||||
|
package google.registry.module.backend;
|
||||||
|
|
||||||
|
import dagger.Module;
|
||||||
|
import dagger.Provides;
|
||||||
|
import google.registry.dns.DnsMetrics;
|
||||||
|
import javax.inject.Singleton;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Dagger module for injecting metrics. All metrics should have {@link Singleton} scope to avoid
|
||||||
|
* being recreated per-request, as the metrics generally track cumulative values.
|
||||||
|
*/
|
||||||
|
@Module
|
||||||
|
public class BackendMetricsModule {
|
||||||
|
|
||||||
|
@Provides
|
||||||
|
@Singleton
|
||||||
|
static DnsMetrics provideDnsMetrics() {
|
||||||
|
return new DnsMetrics();
|
||||||
|
}
|
||||||
|
}
|
|
@ -19,11 +19,13 @@ import static google.registry.testing.DatastoreHelper.persistActiveDomain;
|
||||||
import static google.registry.testing.DatastoreHelper.persistActiveSubordinateHost;
|
import static google.registry.testing.DatastoreHelper.persistActiveSubordinateHost;
|
||||||
import static google.registry.testing.DatastoreHelper.persistResource;
|
import static google.registry.testing.DatastoreHelper.persistResource;
|
||||||
import static org.mockito.Mockito.mock;
|
import static org.mockito.Mockito.mock;
|
||||||
|
import static org.mockito.Mockito.times;
|
||||||
import static org.mockito.Mockito.verify;
|
import static org.mockito.Mockito.verify;
|
||||||
import static org.mockito.Mockito.verifyNoMoreInteractions;
|
import static org.mockito.Mockito.verifyNoMoreInteractions;
|
||||||
|
|
||||||
import com.google.common.collect.ImmutableMap;
|
import com.google.common.collect.ImmutableMap;
|
||||||
import com.google.common.collect.ImmutableSet;
|
import com.google.common.collect.ImmutableSet;
|
||||||
|
import google.registry.dns.DnsMetrics.Status;
|
||||||
import google.registry.dns.writer.DnsWriter;
|
import google.registry.dns.writer.DnsWriter;
|
||||||
import google.registry.model.domain.DomainResource;
|
import google.registry.model.domain.DomainResource;
|
||||||
import google.registry.model.ofy.Ofy;
|
import google.registry.model.ofy.Ofy;
|
||||||
|
@ -54,6 +56,7 @@ public class PublishDnsUpdatesActionTest {
|
||||||
|
|
||||||
private final FakeClock clock = new FakeClock(DateTime.parse("1971-01-01TZ"));
|
private final FakeClock clock = new FakeClock(DateTime.parse("1971-01-01TZ"));
|
||||||
private final DnsWriter dnsWriter = mock(DnsWriter.class);
|
private final DnsWriter dnsWriter = mock(DnsWriter.class);
|
||||||
|
private final DnsMetrics dnsMetrics = mock(DnsMetrics.class);
|
||||||
private PublishDnsUpdatesAction action;
|
private PublishDnsUpdatesAction action;
|
||||||
|
|
||||||
@Before
|
@Before
|
||||||
|
@ -76,6 +79,7 @@ public class PublishDnsUpdatesActionTest {
|
||||||
action.hosts = ImmutableSet.<String>of();
|
action.hosts = ImmutableSet.<String>of();
|
||||||
action.domains = ImmutableSet.<String>of();
|
action.domains = ImmutableSet.<String>of();
|
||||||
action.dnsWriterProxy = new DnsWriterProxy(ImmutableMap.of("mock", dnsWriter));
|
action.dnsWriterProxy = new DnsWriterProxy(ImmutableMap.of("mock", dnsWriter));
|
||||||
|
action.dnsMetrics = dnsMetrics;
|
||||||
return action;
|
return action;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -84,9 +88,13 @@ public class PublishDnsUpdatesActionTest {
|
||||||
action = createAction("xn--q9jyb4c");
|
action = createAction("xn--q9jyb4c");
|
||||||
action.hosts = ImmutableSet.of("ns1.example.xn--q9jyb4c");
|
action.hosts = ImmutableSet.of("ns1.example.xn--q9jyb4c");
|
||||||
action.run();
|
action.run();
|
||||||
|
|
||||||
verify(dnsWriter).publishHost("ns1.example.xn--q9jyb4c");
|
verify(dnsWriter).publishHost("ns1.example.xn--q9jyb4c");
|
||||||
verify(dnsWriter).close();
|
verify(dnsWriter).close();
|
||||||
verifyNoMoreInteractions(dnsWriter);
|
verifyNoMoreInteractions(dnsWriter);
|
||||||
|
|
||||||
|
verify(dnsMetrics).incrementPublishHostRequests("xn--q9jyb4c", Status.ACCEPTED);
|
||||||
|
verifyNoMoreInteractions(dnsMetrics);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
|
@ -94,9 +102,13 @@ public class PublishDnsUpdatesActionTest {
|
||||||
action = createAction("xn--q9jyb4c");
|
action = createAction("xn--q9jyb4c");
|
||||||
action.domains = ImmutableSet.of("example.xn--q9jyb4c");
|
action.domains = ImmutableSet.of("example.xn--q9jyb4c");
|
||||||
action.run();
|
action.run();
|
||||||
|
|
||||||
verify(dnsWriter).publishDomain("example.xn--q9jyb4c");
|
verify(dnsWriter).publishDomain("example.xn--q9jyb4c");
|
||||||
verify(dnsWriter).close();
|
verify(dnsWriter).close();
|
||||||
verifyNoMoreInteractions(dnsWriter);
|
verifyNoMoreInteractions(dnsWriter);
|
||||||
|
|
||||||
|
verify(dnsMetrics).incrementPublishDomainRequests("xn--q9jyb4c", Status.ACCEPTED);
|
||||||
|
verifyNoMoreInteractions(dnsMetrics);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
|
@ -106,6 +118,7 @@ public class PublishDnsUpdatesActionTest {
|
||||||
action.hosts = ImmutableSet.of(
|
action.hosts = ImmutableSet.of(
|
||||||
"ns1.example.xn--q9jyb4c", "ns2.example.xn--q9jyb4c", "ns1.example2.xn--q9jyb4c");
|
"ns1.example.xn--q9jyb4c", "ns2.example.xn--q9jyb4c", "ns1.example2.xn--q9jyb4c");
|
||||||
action.run();
|
action.run();
|
||||||
|
|
||||||
verify(dnsWriter).publishDomain("example.xn--q9jyb4c");
|
verify(dnsWriter).publishDomain("example.xn--q9jyb4c");
|
||||||
verify(dnsWriter).publishDomain("example2.xn--q9jyb4c");
|
verify(dnsWriter).publishDomain("example2.xn--q9jyb4c");
|
||||||
verify(dnsWriter).publishHost("ns1.example.xn--q9jyb4c");
|
verify(dnsWriter).publishHost("ns1.example.xn--q9jyb4c");
|
||||||
|
@ -113,6 +126,10 @@ public class PublishDnsUpdatesActionTest {
|
||||||
verify(dnsWriter).publishHost("ns1.example2.xn--q9jyb4c");
|
verify(dnsWriter).publishHost("ns1.example2.xn--q9jyb4c");
|
||||||
verify(dnsWriter).close();
|
verify(dnsWriter).close();
|
||||||
verifyNoMoreInteractions(dnsWriter);
|
verifyNoMoreInteractions(dnsWriter);
|
||||||
|
|
||||||
|
verify(dnsMetrics, times(2)).incrementPublishDomainRequests("xn--q9jyb4c", Status.ACCEPTED);
|
||||||
|
verify(dnsMetrics, times(3)).incrementPublishHostRequests("xn--q9jyb4c", Status.ACCEPTED);
|
||||||
|
verifyNoMoreInteractions(dnsMetrics);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
|
@ -121,7 +138,12 @@ public class PublishDnsUpdatesActionTest {
|
||||||
action.domains = ImmutableSet.of("example.com", "example2.com");
|
action.domains = ImmutableSet.of("example.com", "example2.com");
|
||||||
action.hosts = ImmutableSet.of("ns1.example.com", "ns2.example.com", "ns1.example2.com");
|
action.hosts = ImmutableSet.of("ns1.example.com", "ns2.example.com", "ns1.example2.com");
|
||||||
action.run();
|
action.run();
|
||||||
|
|
||||||
verify(dnsWriter).close();
|
verify(dnsWriter).close();
|
||||||
verifyNoMoreInteractions(dnsWriter);
|
verifyNoMoreInteractions(dnsWriter);
|
||||||
|
|
||||||
|
verify(dnsMetrics, times(2)).incrementPublishDomainRequests("xn--q9jyb4c", Status.REJECTED);
|
||||||
|
verify(dnsMetrics, times(3)).incrementPublishHostRequests("xn--q9jyb4c", Status.REJECTED);
|
||||||
|
verifyNoMoreInteractions(dnsMetrics);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue