Simplify metric publisher lifecycles

This commit is contained in:
Jon Chambers 2024-09-26 11:41:25 -04:00 committed by Jon Chambers
parent 48e8d1c12f
commit 78b40397f9
1 changed files with 2 additions and 24 deletions

View File

@ -27,7 +27,7 @@ import java.util.stream.Collectors;
* *
* @see <a href="https://docs.aws.amazon.com/sdk-for-java/latest/developer-guide/metrics-list.html">Service client metrics</a> * @see <a href="https://docs.aws.amazon.com/sdk-for-java/latest/developer-guide/metrics-list.html">Service client metrics</a>
*/ */
public class MicrometerAwsSdkMetricPublisher implements MetricPublisher, Managed { public class MicrometerAwsSdkMetricPublisher implements MetricPublisher {
private final ExecutorService recordMetricsExecutorService; private final ExecutorService recordMetricsExecutorService;
@ -90,9 +90,7 @@ public class MicrometerAwsSdkMetricPublisher implements MetricPublisher, Managed
/** /**
* Constructs a new metric publisher that uses the given executor service to record metrics and tags metrics with the * Constructs a new metric publisher that uses the given executor service to record metrics and tags metrics with the
* given client name. Note that the given executor service will be shut down when this publisher is shut down via the * given client name.
* {@link #close()} or {@link #stop()} methods, and as such the executor service should be used only for this
* publisher.
* *
* @param recordMetricsExecutorService the executor service via which to record metrics * @param recordMetricsExecutorService the executor service via which to record metrics
* @param awsClientName the name of AWS service client to which this publisher is attached * @param awsClientName the name of AWS service client to which this publisher is attached
@ -108,7 +106,6 @@ public class MicrometerAwsSdkMetricPublisher implements MetricPublisher, Managed
@Override @Override
public void publish(final MetricCollection metricCollection) { public void publish(final MetricCollection metricCollection) {
if (METRIC_COLLECTION_TYPE_API_CALL.equals(metricCollection.name())) { if (METRIC_COLLECTION_TYPE_API_CALL.equals(metricCollection.name())) {
try { try {
recordMetricsExecutorService.submit(() -> recordApiCallMetrics(metricCollection)); recordMetricsExecutorService.submit(() -> recordApiCallMetrics(metricCollection));
@ -165,7 +162,6 @@ public class MicrometerAwsSdkMetricPublisher implements MetricPublisher, Managed
} }
private void recordAttemptMetrics(final MetricCollection apiCallAttemptMetricCollection, final Tags callTags) { private void recordAttemptMetrics(final MetricCollection apiCallAttemptMetricCollection, final Tags callTags) {
if (!apiCallAttemptMetricCollection.name().equals(METRIC_COLLECTION_TYPE_API_CALL_ATTEMPT)) { if (!apiCallAttemptMetricCollection.name().equals(METRIC_COLLECTION_TYPE_API_CALL_ATTEMPT)) {
throw new IllegalArgumentException("Unexpected API call attempt metric collection name: " + apiCallAttemptMetricCollection.name()); throw new IllegalArgumentException("Unexpected API call attempt metric collection name: " + apiCallAttemptMetricCollection.name());
} }
@ -213,23 +209,5 @@ public class MicrometerAwsSdkMetricPublisher implements MetricPublisher, Managed
@Override @Override
public void close() { public void close() {
// As the upstream documentation for MetricPublisher#close() says:
//
// > Important: Implementations must block the calling thread until all pending metrics are published and any
// > resources acquired have been freed.
recordMetricsExecutorService.shutdown();
try {
if (!recordMetricsExecutorService.awaitTermination(1, TimeUnit.MINUTES)) {
logger.warn("Metric-recording executor service for {} did not shut down cleanly", awsClientName);
}
} catch (final InterruptedException e) {
throw new RuntimeException(e);
}
}
@Override
public void stop() throws Exception {
close();
} }
} }