Skip to content

Commit b00072e

Browse files
committed
Refactor MosApiMetrics to remove async ExecutorService
1 parent 10cd37f commit b00072e

3 files changed

Lines changed: 34 additions & 68 deletions

File tree

core/src/main/java/google/registry/mosapi/MosApiMetrics.java

Lines changed: 33 additions & 46 deletions
Original file line numberDiff line numberDiff line change
@@ -37,13 +37,11 @@
3737
import google.registry.mosapi.MosApiModels.TldServiceState;
3838
import google.registry.util.Clock;
3939
import jakarta.inject.Inject;
40-
import jakarta.inject.Named;
4140
import jakarta.inject.Singleton;
4241
import java.io.IOException;
4342
import java.time.Instant;
4443
import java.util.Iterator;
4544
import java.util.List;
46-
import java.util.concurrent.ExecutorService;
4745
import java.util.concurrent.atomic.AtomicBoolean;
4846
import java.util.stream.Stream;
4947

@@ -98,23 +96,16 @@ public class MosApiMetrics {
9896
private final String projectName;
9997
private final Clock clock;
10098
private final MonitoredResource monitoredResource;
101-
private final ExecutorService executor;
10299
// Flag to ensure we only create descriptors once, lazily
103100
private final AtomicBoolean isDescriptorInitialized = new AtomicBoolean(false);
104101

105102
@Inject
106103
public MosApiMetrics(
107-
Monitoring monitoringClient,
108-
@Config("projectId") String projectId,
109-
Clock clock,
110-
@Named("mosapiMetricsExecutor") ExecutorService executor) {
104+
Monitoring monitoringClient, @Config("projectId") String projectId, Clock clock) {
111105
this.monitoringClient = monitoringClient;
112106
this.projectId = projectId;
113107
this.clock = clock;
114-
this.executor = executor;
115-
116108
this.projectName = PROJECT_RESOURCE_PREFIX + projectId;
117-
118109
this.monitoredResource =
119110
new MonitoredResource()
120111
.setType(RESOURCE_TYPE_GLOBAL)
@@ -127,46 +118,42 @@ public void recordStates(ImmutableList<TldServiceState> states) {
127118
if (isDescriptorInitialized.compareAndSet(false, true)) {
128119
createCustomMetricDescriptors();
129120
}
130-
executor.execute(
131-
() -> {
132-
try {
133-
pushBatchMetrics(states);
134-
} catch (Exception e) {
135-
logger.atSevere().withCause(e).log("Async batch metric push failed.");
136-
}
137-
});
121+
122+
try {
123+
pushBatchMetrics(states);
124+
} catch (Exception e) {
125+
logger.atSevere().withCause(e).log("MosApi Batch metric push failed.");
126+
throw new RuntimeException("Batch metric push failed", e);
127+
}
138128
}
139129

140130
// Defines the custom metrics in Cloud Monitoring
141131
private void createCustomMetricDescriptors() {
142-
executor.execute(
143-
() -> {
144-
// 1. TLD Status Descriptor
145-
createMetricDescriptor(
146-
METRIC_TLD_STATUS,
147-
DISPLAY_NAME_TLD_STATUS,
148-
DESC_TLD_STATUS,
149-
"INT64",
150-
ImmutableList.of(LABEL_TLD));
151-
152-
// 2. Service Status Descriptor
153-
createMetricDescriptor(
154-
METRIC_SERVICE_STATUS,
155-
DISPLAY_NAME_SERVICE_STATUS,
156-
DESC_SERVICE_STATUS,
157-
"INT64",
158-
ImmutableList.of(LABEL_TLD, LABEL_SERVICE_TYPE));
159-
160-
// 3. Emergency Usage Descriptor
161-
createMetricDescriptor(
162-
METRIC_EMERGENCY_USAGE,
163-
DISPLAY_NAME_EMERGENCY_USAGE,
164-
DESC_EMERGENCY_USAGE,
165-
"DOUBLE",
166-
ImmutableList.of(LABEL_TLD, LABEL_SERVICE_TYPE));
167-
168-
logger.atInfo().log("Metric descriptors ensured for project %s", projectId);
169-
});
132+
// 1. TLD Status Descriptor
133+
createMetricDescriptor(
134+
METRIC_TLD_STATUS,
135+
DISPLAY_NAME_TLD_STATUS,
136+
DESC_TLD_STATUS,
137+
"INT64",
138+
ImmutableList.of(LABEL_TLD));
139+
140+
// 2. Service Status Descriptor
141+
createMetricDescriptor(
142+
METRIC_SERVICE_STATUS,
143+
DISPLAY_NAME_SERVICE_STATUS,
144+
DESC_SERVICE_STATUS,
145+
"INT64",
146+
ImmutableList.of(LABEL_TLD, LABEL_SERVICE_TYPE));
147+
148+
// 3. Emergency Usage Descriptor
149+
createMetricDescriptor(
150+
METRIC_EMERGENCY_USAGE,
151+
DISPLAY_NAME_EMERGENCY_USAGE,
152+
DESC_EMERGENCY_USAGE,
153+
"DOUBLE",
154+
ImmutableList.of(LABEL_TLD, LABEL_SERVICE_TYPE));
155+
156+
logger.atInfo().log("Metric descriptors ensured for project %s", projectId);
170157
}
171158

172159
private void createMetricDescriptor(

core/src/main/java/google/registry/mosapi/module/MosApiModule.java

Lines changed: 0 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,6 @@
1414

1515
package google.registry.mosapi.module;
1616

17-
import com.google.common.util.concurrent.ThreadFactoryBuilder;
1817
import dagger.Module;
1918
import dagger.Provides;
2019
import google.registry.config.RegistryConfig.Config;
@@ -204,21 +203,4 @@ static ExecutorService provideMosapiTldExecutor(
204203
@Config("mosapiTldThreadCount") int threadPoolSize) {
205204
return Executors.newFixedThreadPool(threadPoolSize);
206205
}
207-
208-
/**
209-
* Provides executor for metrics reporting.
210-
*
211-
* <p>We are using a single thread to ensure metric batches are sent sequentially. This acts as a
212-
* client-side rate limiter to avoid exceeding Google Cloud Monitoring API quotas (requests per
213-
* second).
214-
*
215-
* @see <a href="https://cloud.google.com/monitoring/quotas">Google Cloud Monitoring Quotas</a>
216-
*/
217-
@Provides
218-
@Singleton
219-
@Named("mosapiMetricsExecutor")
220-
static ExecutorService provideMosapiMetricsExecutor() {
221-
return Executors.newSingleThreadExecutor(
222-
new ThreadFactoryBuilder().setNameFormat("mosapi-metrics-%d").build());
223-
}
224206
}

core/src/test/java/google/registry/mosapi/MosApiMetricsTest.java

Lines changed: 1 addition & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -28,7 +28,6 @@
2828
import com.google.api.services.monitoring.v3.model.TimeSeries;
2929
import com.google.common.collect.ImmutableList;
3030
import com.google.common.collect.ImmutableMap;
31-
import com.google.common.util.concurrent.MoreExecutors;
3231
import google.registry.mosapi.MosApiModels.ServiceStatus;
3332
import google.registry.mosapi.MosApiModels.TldServiceState;
3433
import google.registry.testing.FakeClock;
@@ -72,9 +71,7 @@ void setUp() throws IOException {
7271
when(metricDescriptorsResource.create(anyString(), any(MetricDescriptor.class)))
7372
.thenReturn(createDescriptorRequest);
7473

75-
mosApiMetrics =
76-
new MosApiMetrics(
77-
monitoringClient, PROJECT_ID, clock, MoreExecutors.newDirectExecutorService());
74+
mosApiMetrics = new MosApiMetrics(monitoringClient, PROJECT_ID, clock);
7875
}
7976

8077
@Test

0 commit comments

Comments
 (0)