-
Notifications
You must be signed in to change notification settings - Fork 44
Expose S3 Request Metrics #928
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Conversation
e1ad094 to
8ff35ad
Compare
|
Java SDK users can use a custom MetricPublisher that bridges CRT metrics to SDK's MetricCollection: public class CrtMetricPublisher implements MetricPublisher {
private final MetricPublisher delegate;
public CrtMetricPublisher(MetricPublisher delegate) {
this.delegate = delegate;
}
public void publishCrtMetrics(S3RequestMetrics crtMetrics) {
MetricCollection collection = MetricCollection.builder()
.name("S3Request")
.creationTime(Instant.now())
.putMetric(CoreMetric.API_CALL_DURATION,
Duration.ofNanos(crtMetrics.getApiCallDurationNs()))
.putMetric(CoreMetric.SERVICE_ID, crtMetrics.getServiceId())
.putMetric(CoreMetric.OPERATION_NAME, crtMetrics.getOperationName())
.putMetric(CoreMetric.RETRY_COUNT, crtMetrics.getRetryCount())
.putMetric(CoreMetric.AWS_REQUEST_ID, crtMetrics.getAwsRequestId())
.putMetric(CoreMetric.AWS_EXTENDED_REQUEST_ID, crtMetrics.getAwsExtendedRequestId())
.putMetric(CoreMetric.BACKOFF_DELAY_DURATION,
Duration.ofNanos(crtMetrics.getBackoffDelayDurationNs()))
.putMetric(CoreMetric.SERVICE_CALL_DURATION,
Duration.ofNanos(crtMetrics.getServiceCallDurationNs()))
.putMetric(CoreMetric.SIGNING_DURATION,
Duration.ofNanos(crtMetrics.getSigningDurationNs()))
.build();
delegate.publish(collection);
}
@Override
public void publish(MetricCollection metricCollection) {
delegate.publish(metricCollection);
}
@Override
public void close() {
delegate.close();
}
}UsageCrtMetricPublisher metricPublisher = new CrtMetricPublisher(
LoggingMetricPublisher.create());
S3MetaRequestResponseHandler responseHandler = new S3MetaRequestResponseHandler() {
@Override
public void onTelemetry(S3RequestMetrics metrics) {
metricPublisher.publishCrtMetrics(metrics);
}
@Override
public void onFinished(S3FinishedResponseContext context) {
// Handle completion
}
};
S3MetaRequestOptions options = new S3MetaRequestOptions()
.withMetaRequestType(MetaRequestType.GET_OBJECT)
.withHttpRequest(httpRequest)
.withResponseHandler(responseHandler);
try (S3MetaRequest request = client.makeMetaRequest(options)) {
// Request executes, metrics published via onTelemetry callback
} |
|
The following metrics are not available from CRT for java since sdk has the information:
|
| } | ||
|
|
||
| /** | ||
| * Invoked to report telemetry of partial execution of meta request. |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
What do you mean by partial execution? When is this invoked?
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
When there are multiple parallelized request created for a single meta request, each request gets its own response with metrics. Although the meta request might not have been fully executed, the request might be complete and hence customers receive the metric data for that request. This is what I meant by partial execution of meta request.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Gotcha, can we update the documentation to make it more clear?
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Fixed, thanks!
02be5a6 to
b61830a
Compare
TingDaoK
left a comment
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
All trivial comments, look good to me as long as Java SDK team align with the interface provided!
src/main/java/software/amazon/awssdk/crt/s3/S3MetaRequestResponseHandlerNativeAdapter.java
Outdated
Show resolved
Hide resolved
| ErrorType(String name) { | ||
| this.name = name; | ||
| } | ||
| } No newline at end of file |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
new line at the end of the file
src/main/resources/META-INF/native-image/software.amazon.awssdk/crt/aws-crt/jni-config.json
Outdated
Show resolved
Hide resolved
| * @return true if the error that generated the exception makes sense for a retry, and | ||
| * false otherwise. | ||
| */ | ||
| @Deprecated // use CRT.awsGetErrorType() instead |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Minor: is this deprecation intended? CRT.awsGetErrorType() doesn't exactly return if an error should be retryable or not though.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Noticed that java uses isErrorRetryable to figure out if the error needs to be pushed as an IOException or not. Since isErrorRetryable(HttpException exception) was always a temporary method to convey errors and we now provide the correct error type, we are deprecating that method.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
I see, we use it in Java https://github.com/aws/aws-sdk-java-v2/blob/master/http-clients/aws-crt-client/src/main/java/software/amazon/awssdk/http/crt/internal/CrtUtils.java#L47
I suppose we should change it to if(CRT.awsGetErrorType(httpException.getErrorCode()) == IO) in Java. Is there any non-I/O code that we should retry? I'd expect no, but wanted to double check
75a7088 to
db7af3d
Compare
| private int requestType; | ||
|
|
||
| // CRT info metrics | ||
| private String ipAddress; |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
This seems useful, can we expose the getter?
| // connection's and S3 request's addresses for this request attempt. This does not need to be exposed, | ||
| // but it might prove useful for logs. | ||
| private long connectionId; | ||
| private long requestPtr; |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
What's requestPtr?
| public static native String awsErrorName(int errorCode); | ||
|
|
||
| /** | ||
| * Given an error code, get a boolean to check if an error is transient or not |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Can we update the doc to add the definition of transient error?
Co-authored-by: Krish <>
9d66e11 to
fcc7eb8
Compare
360c1ed to
fcc7eb8
Compare
Issue #, if available:
#806
Description of changes:
Exposes S3 Request Metrics from the CRT S3 Client.
By submitting this pull request, I confirm that my contribution is made under the terms of the Apache 2.0 license.