Skip to content

Commit c4346d2

Browse files
committed
Mutiple metrics fixes
- Allow lists of publishers to be set. Allow setting of metric pubishers to be set on the client of request override rather than a single publisher, making using multiple MetricPublishers per client or request easier. - Remove any non-core usage of MetricUtils. - Fix metrics test in TranscribeStreamIntegrationTest. - Fix Async API call metric stage to add the duration in a separate CompletionStage.
1 parent 203af1c commit c4346d2

File tree

28 files changed

+925
-332
lines changed

28 files changed

+925
-332
lines changed

codegen/src/main/java/software/amazon/awssdk/codegen/poet/client/AsyncClientClass.java

Lines changed: 44 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,7 @@
1818
import static com.squareup.javapoet.TypeSpec.Builder;
1919
import static java.util.Collections.singletonList;
2020
import static javax.lang.model.element.Modifier.PRIVATE;
21+
import static javax.lang.model.element.Modifier.STATIC;
2122
import static software.amazon.awssdk.codegen.poet.client.ClientClassUtils.applyPaginatorUserAgentMethod;
2223
import static software.amazon.awssdk.codegen.poet.client.ClientClassUtils.applySignerOverrideMethod;
2324
import static software.amazon.awssdk.codegen.poet.client.SyncClientClass.getProtocolSpecs;
@@ -31,8 +32,8 @@
3132
import com.squareup.javapoet.TypeSpec;
3233
import java.net.URI;
3334
import java.nio.ByteBuffer;
35+
import java.util.Collections;
3436
import java.util.List;
35-
import java.util.Optional;
3637
import java.util.concurrent.Executor;
3738
import java.util.stream.Collectors;
3839
import javax.lang.model.element.Modifier;
@@ -55,14 +56,14 @@
5556
import software.amazon.awssdk.codegen.poet.StaticImport;
5657
import software.amazon.awssdk.codegen.poet.client.specs.ProtocolSpec;
5758
import software.amazon.awssdk.codegen.poet.eventstream.EventStreamUtils;
59+
import software.amazon.awssdk.core.RequestOverrideConfiguration;
5860
import software.amazon.awssdk.core.async.SdkPublisher;
5961
import software.amazon.awssdk.core.client.config.SdkAdvancedAsyncClientOption;
6062
import software.amazon.awssdk.core.client.config.SdkClientConfiguration;
6163
import software.amazon.awssdk.core.client.config.SdkClientOption;
6264
import software.amazon.awssdk.core.client.handler.AsyncClientHandler;
6365
import software.amazon.awssdk.core.endpointdiscovery.EndpointDiscoveryRefreshCache;
6466
import software.amazon.awssdk.core.endpointdiscovery.EndpointDiscoveryRequest;
65-
import software.amazon.awssdk.core.internal.util.MetricUtils;
6667
import software.amazon.awssdk.core.metrics.CoreMetric;
6768
import software.amazon.awssdk.metrics.MetricCollector;
6869
import software.amazon.awssdk.metrics.MetricPublisher;
@@ -71,7 +72,7 @@
7172
import software.amazon.awssdk.utils.FunctionalUtils;
7273

7374
public final class AsyncClientClass extends AsyncClientInterface {
74-
private static final String PUBLISHER_NAME = "metricPublisher";
75+
private static final String PUBLISHER_NAME = "metricPublishers";
7576
private static final String METRIC_COLLECTOR_NAME = "apiCallMetricCollector";
7677
private final IntermediateModel model;
7778
private final PoetExtensions poetExtensions;
@@ -108,7 +109,8 @@ public TypeSpec poetSpec() {
108109
.addMethods(operations())
109110
.addMethod(closeMethod())
110111
.addMethods(protocolSpec.additionalMethods())
111-
.addMethod(protocolSpec.initProtocolFactory(model));
112+
.addMethod(protocolSpec.initProtocolFactory(model))
113+
.addMethod(resolveMetricPublishersMethod());
112114

113115
// Kinesis doesn't support CBOR for STS yet so need another protocol factory for JSON
114116
if (model.getMetadata().isCborProtocol()) {
@@ -240,13 +242,12 @@ protected MethodSpec.Builder operationBody(MethodSpec.Builder builder, Operation
240242
"() -> $N.exceptionOccurred(t))", paramName);
241243
}
242244

243-
builder.addStatement("$T<$T> $N = $T.resolvePublisher(clientConfiguration, $N.overrideConfiguration().orElse(null))",
244-
Optional.class,
245+
builder.addStatement("$T<$T> $N = resolveMetricPublishers(clientConfiguration, $N.overrideConfiguration().orElse(null))",
246+
List.class,
245247
MetricPublisher.class,
246248
PUBLISHER_NAME,
247-
MetricUtils.class,
248249
opModel.getInput().getVariableName())
249-
.addStatement("$N.ifPresent(p -> p.publish($N.collect()))", PUBLISHER_NAME, "apiCallMetricCollector")
250+
.addStatement("$N.forEach(p -> p.publish($N.collect()))", PUBLISHER_NAME, "apiCallMetricCollector")
250251
.addStatement("return $T.failedFuture(t)", CompletableFutureUtils.class)
251252
.endControlFlow();
252253

@@ -326,4 +327,39 @@ private MethodSpec utilitiesMethod() {
326327
String.join(",", config.getCreateMethodParams()))
327328
.build();
328329
}
330+
331+
private MethodSpec resolveMetricPublishersMethod() {
332+
String clientConfigName = "clientConfiguration";
333+
String requestOverrideConfigName = "requestOverrideConfiguration";
334+
335+
MethodSpec.Builder methodBuilder = MethodSpec.methodBuilder("resolveMetricPublishers")
336+
.addModifiers(PRIVATE, STATIC)
337+
.returns(ParameterizedTypeName.get(List.class, MetricPublisher.class))
338+
.addParameter(SdkClientConfiguration.class, clientConfigName)
339+
.addParameter(RequestOverrideConfiguration.class, requestOverrideConfigName);
340+
341+
String publishersName = "publishers";
342+
343+
methodBuilder.addStatement("$T $N = null", ParameterizedTypeName.get(List.class, MetricPublisher.class), publishersName);
344+
345+
methodBuilder.beginControlFlow("if ($N != null)", requestOverrideConfigName)
346+
.addStatement("$N = $N.metricPublishers()", publishersName, requestOverrideConfigName)
347+
.endControlFlow();
348+
349+
methodBuilder.beginControlFlow("if ($1N == null || $1N.isEmpty())", publishersName)
350+
.addStatement("$N = $N.option($T.$N)",
351+
publishersName,
352+
clientConfigName,
353+
SdkClientOption.class,
354+
"METRIC_PUBLISHERS")
355+
.endControlFlow();
356+
357+
methodBuilder.beginControlFlow("if ($1N == null)", publishersName)
358+
.addStatement("$N = $T.emptyList()", publishersName, Collections.class)
359+
.endControlFlow();
360+
361+
methodBuilder.addStatement("return $N", publishersName);
362+
363+
return methodBuilder.build();
364+
}
329365
}

codegen/src/main/java/software/amazon/awssdk/codegen/poet/client/SyncClientClass.java

Lines changed: 46 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -17,18 +17,20 @@
1717

1818
import static javax.lang.model.element.Modifier.FINAL;
1919
import static javax.lang.model.element.Modifier.PRIVATE;
20+
import static javax.lang.model.element.Modifier.STATIC;
2021
import static software.amazon.awssdk.codegen.poet.client.ClientClassUtils.applyPaginatorUserAgentMethod;
2122
import static software.amazon.awssdk.codegen.poet.client.ClientClassUtils.applySignerOverrideMethod;
2223

2324
import com.squareup.javapoet.ClassName;
2425
import com.squareup.javapoet.FieldSpec;
2526
import com.squareup.javapoet.MethodSpec;
27+
import com.squareup.javapoet.ParameterizedTypeName;
2628
import com.squareup.javapoet.TypeSpec;
2729
import com.squareup.javapoet.TypeSpec.Builder;
2830
import java.net.URI;
2931
import java.util.ArrayList;
32+
import java.util.Collections;
3033
import java.util.List;
31-
import java.util.Optional;
3234
import java.util.stream.Collectors;
3335
import javax.lang.model.element.Modifier;
3436
import software.amazon.awssdk.annotations.SdkInternalApi;
@@ -48,12 +50,12 @@
4850
import software.amazon.awssdk.codegen.poet.client.specs.QueryProtocolSpec;
4951
import software.amazon.awssdk.codegen.poet.client.specs.XmlProtocolSpec;
5052
import software.amazon.awssdk.codegen.utils.PaginatorUtils;
53+
import software.amazon.awssdk.core.RequestOverrideConfiguration;
5154
import software.amazon.awssdk.core.client.config.SdkClientConfiguration;
5255
import software.amazon.awssdk.core.client.config.SdkClientOption;
5356
import software.amazon.awssdk.core.client.handler.SyncClientHandler;
5457
import software.amazon.awssdk.core.endpointdiscovery.EndpointDiscoveryRefreshCache;
5558
import software.amazon.awssdk.core.endpointdiscovery.EndpointDiscoveryRequest;
56-
import software.amazon.awssdk.core.internal.util.MetricUtils;
5759
import software.amazon.awssdk.core.metrics.CoreMetric;
5860
import software.amazon.awssdk.metrics.MetricCollector;
5961
import software.amazon.awssdk.metrics.MetricPublisher;
@@ -89,7 +91,8 @@ public TypeSpec poetSpec() {
8991
.addMethod(constructor())
9092
.addMethod(nameMethod())
9193
.addMethods(protocolSpec.additionalMethods())
92-
.addMethods(operations());
94+
.addMethods(operations())
95+
.addMethod(resolveMetricPublishersMethod());
9396

9497
protocolSpec.createErrorResponseHandler().ifPresent(classBuilder::addMethod);
9598

@@ -196,7 +199,7 @@ private List<MethodSpec> operationMethodSpecs(OperationModel opModel) {
196199
method.addStatement("$1T $2N = $1T.create($3S)",
197200
MetricCollector.class, metricCollectorName, "ApiCall");
198201

199-
String publisherName = "metricPublisher";
202+
String publishersName = "metricPublishers";
200203

201204
method.beginControlFlow("try")
202205
.addStatement("$N.reportMetric($T.$L, $S)", metricCollectorName, CoreMetric.class, "SERVICE_ID",
@@ -206,13 +209,12 @@ private List<MethodSpec> operationMethodSpecs(OperationModel opModel) {
206209
.addCode(protocolSpec.executionHandler(opModel))
207210
.endControlFlow()
208211
.beginControlFlow("finally")
209-
.addStatement("$T<$T> $N = $T.resolvePublisher(clientConfiguration, $N)",
210-
Optional.class,
212+
.addStatement("$T<$T> $N = resolveMetricPublishers(clientConfiguration, $N.overrideConfiguration().orElse(null))",
213+
List.class,
211214
MetricPublisher.class,
212-
publisherName,
213-
MetricUtils.class,
215+
publishersName,
214216
opModel.getInput().getVariableName())
215-
.addStatement("$N.ifPresent(p -> p.publish($N.collect()))", publisherName, metricCollectorName)
217+
.addStatement("$N.forEach(p -> p.publish($N.collect()))", publishersName, metricCollectorName)
216218
.endControlFlow();
217219

218220
methods.add(method.build());
@@ -286,4 +288,39 @@ static ProtocolSpec getProtocolSpecs(PoetExtensions poetExtensions, Intermediate
286288
throw new RuntimeException("Unknown protocol: " + protocol.name());
287289
}
288290
}
291+
292+
private MethodSpec resolveMetricPublishersMethod() {
293+
String clientConfigName = "clientConfiguration";
294+
String requestOverrideConfigName = "requestOverrideConfiguration";
295+
296+
MethodSpec.Builder methodBuilder = MethodSpec.methodBuilder("resolveMetricPublishers")
297+
.addModifiers(PRIVATE, STATIC)
298+
.returns(ParameterizedTypeName.get(List.class, MetricPublisher.class))
299+
.addParameter(SdkClientConfiguration.class, clientConfigName)
300+
.addParameter(RequestOverrideConfiguration.class, requestOverrideConfigName);
301+
302+
String publishersName = "publishers";
303+
304+
methodBuilder.addStatement("$T $N = null", ParameterizedTypeName.get(List.class, MetricPublisher.class), publishersName);
305+
306+
methodBuilder.beginControlFlow("if ($N != null)", requestOverrideConfigName)
307+
.addStatement("$N = $N.metricPublishers()", publishersName, requestOverrideConfigName)
308+
.endControlFlow();
309+
310+
methodBuilder.beginControlFlow("if ($1N == null || $1N.isEmpty())", publishersName)
311+
.addStatement("$N = $N.option($T.$N)",
312+
publishersName,
313+
clientConfigName,
314+
SdkClientOption.class,
315+
"METRIC_PUBLISHERS")
316+
.endControlFlow();
317+
318+
methodBuilder.beginControlFlow("if ($1N == null)", publishersName)
319+
.addStatement("$N = $T.emptyList()", publishersName, Collections.class)
320+
.endControlFlow();
321+
322+
methodBuilder.addStatement("return $N", publishersName);
323+
324+
return methodBuilder.build();
325+
}
289326
}

codegen/src/main/java/software/amazon/awssdk/codegen/poet/client/specs/ProtocolSpec.java

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -186,8 +186,8 @@ default String publishMetricsWhenComplete() {
186186
}
187187

188188
default String publishMetrics() {
189-
return "Optional<MetricPublisher> metricPublisher = MetricUtils.resolvePublisher(clientConfiguration, "
189+
return "List<MetricPublisher> metricPublishers = resolveMetricPublishers(clientConfiguration, "
190190
+ "requestOverrideConfig);\n"
191-
+ "metricPublisher.ifPresent(p -> p.publish(apiCallMetricCollector.collect()));";
191+
+ "metricPublishers.forEach(p -> p.publish(apiCallMetricCollector.collect()));";
192192
}
193193
}

0 commit comments

Comments
 (0)