diff --git a/include/aws/s3/s3_client.h b/include/aws/s3/s3_client.h index 8b137aa2e..9a8eb019e 100644 --- a/include/aws/s3/s3_client.h +++ b/include/aws/s3/s3_client.h @@ -1376,6 +1376,72 @@ int aws_s3_request_metrics_get_receive_end_timestamp_ns( const struct aws_s3_request_metrics *metrics, uint64_t *out_receive_end_time); +/* Get the time stamp when the signing for the request started. Timestamps are from + * `aws_high_res_clock_get_ticks` AWS_ERROR_S3_METRIC_DATA_NOT_AVAILABLE will be raised if data not available. */ +AWS_S3_API +int aws_s3_request_metrics_get_sign_start_timestamp_ns( + const struct aws_s3_request_metrics *metrics, + uint64_t *out_signing_start_time); + +/* Get the time stamp when the signing for the request ended. Timestamps are from + * `aws_high_res_clock_get_ticks` AWS_ERROR_S3_METRIC_DATA_NOT_AVAILABLE will be raised if data not available. */ +AWS_S3_API +int aws_s3_request_metrics_get_sign_end_timestamp_ns( + const struct aws_s3_request_metrics *metrics, + uint64_t *out_signing_end_time); + +/* The time duration for the request singing (sign_end_timestamp_ns - + * sign_start_timestamp_ns). + * AWS_ERROR_S3_METRIC_DATA_NOT_AVAILABLE will be raised if data not available. */ +AWS_S3_API +int aws_s3_request_metrics_get_signing_duration_ns( + const struct aws_s3_request_metrics *metrics, + uint64_t *out_signing_duration); + +/* Get the time stamp when the memory acquisition for the request started. Timestamps are from + * `aws_high_res_clock_get_ticks` AWS_ERROR_S3_METRIC_DATA_NOT_AVAILABLE will be raised if data not available. */ +AWS_S3_API +int aws_s3_request_metrics_get_mem_acquire_start_timestamp_ns( + const struct aws_s3_request_metrics *metrics, + uint64_t *out_mem_acquire_start_time); + +/* Get the time stamp when the memory acquisition for the request ended. Timestamps are from + * `aws_high_res_clock_get_ticks` AWS_ERROR_S3_METRIC_DATA_NOT_AVAILABLE will be raised if data not available. */ +AWS_S3_API +int aws_s3_request_metrics_get_mem_acquire_end_timestamp_ns( + const struct aws_s3_request_metrics *metrics, + uint64_t *out_mem_acquire_end_time); + +/* The time duration for the request memory acquisition (mem_acquire_end_timestamp_ns - + * mem_acquire_start_timestamp_ns). + * AWS_ERROR_S3_METRIC_DATA_NOT_AVAILABLE will be raised if data not available. */ +AWS_S3_API +int aws_s3_request_metrics_get_mem_acquire_duration_ns( + const struct aws_s3_request_metrics *metrics, + uint64_t *out_mem_acquire_duration); + +/* Get the time stamp when the delivery of the request response started. Timestamps are from + * `aws_high_res_clock_get_ticks` AWS_ERROR_S3_METRIC_DATA_NOT_AVAILABLE will be raised if data not available. */ +AWS_S3_API +int aws_s3_request_metrics_get_delivery_start_timestamp_ns( + const struct aws_s3_request_metrics *metrics, + uint64_t *out_delivery_start_time); + +/* Get the time stamp when the delivery of the request response ended. Timestamps are from + * `aws_high_res_clock_get_ticks` AWS_ERROR_S3_METRIC_DATA_NOT_AVAILABLE will be raised if data not available. */ +AWS_S3_API +int aws_s3_request_metrics_get_delivery_end_timestamp_ns( + const struct aws_s3_request_metrics *metrics, + uint64_t *out_delivery_end_time); + +/* The time duration for the request delivery(delivery_end_timestamp_ns - + * delivery_start_timestamp_ns). + * AWS_ERROR_S3_METRIC_DATA_NOT_AVAILABLE will be raised if data not available. */ +AWS_S3_API +int aws_s3_request_metrics_get_delivery_duration_ns( + const struct aws_s3_request_metrics *metrics, + uint64_t *out_delivery_duration); + /* The time duration for the request from start receiving to finish receiving (receive_end_timestamp_ns - * receive_start_timestamp_ns). * AWS_ERROR_S3_METRIC_DATA_NOT_AVAILABLE will be raised if data not available. */ diff --git a/source/s3_request.c b/source/s3_request.c index f9f4e16d7..53f59ecf8 100644 --- a/source/s3_request.c +++ b/source/s3_request.c @@ -325,6 +325,114 @@ int aws_s3_request_metrics_get_receiving_duration_ns( return AWS_OP_SUCCESS; } +int aws_s3_request_metrics_get_sign_start_timestamp_ns( + const struct aws_s3_request_metrics *metrics, + uint64_t *out_signing_start_time) { + AWS_PRECONDITION(metrics); + AWS_PRECONDITION(out_signing_start_time); + if (metrics->time_metrics.sign_start_timestamp_ns < 0) { + return aws_raise_error(AWS_ERROR_S3_METRIC_DATA_NOT_AVAILABLE); + } + *out_signing_start_time = metrics->time_metrics.sign_start_timestamp_ns; + return AWS_OP_SUCCESS; +} + +int aws_s3_request_metrics_get_sign_end_timestamp_ns( + const struct aws_s3_request_metrics *metrics, + uint64_t *out_signing_end_time) { + AWS_PRECONDITION(metrics); + AWS_PRECONDITION(out_signing_end_time); + if (metrics->time_metrics.sign_end_timestamp_ns < 0) { + return aws_raise_error(AWS_ERROR_S3_METRIC_DATA_NOT_AVAILABLE); + } + *out_signing_end_time = metrics->time_metrics.sign_end_timestamp_ns; + return AWS_OP_SUCCESS; +} + +int aws_s3_request_metrics_get_signing_duration_ns( + const struct aws_s3_request_metrics *metrics, + uint64_t *out_signing_duration) { + AWS_PRECONDITION(metrics); + AWS_PRECONDITION(out_signing_duration); + if (metrics->time_metrics.signing_duration_ns < 0) { + return aws_raise_error(AWS_ERROR_S3_METRIC_DATA_NOT_AVAILABLE); + } + *out_signing_duration = metrics->time_metrics.signing_duration_ns; + return AWS_OP_SUCCESS; +} + +int aws_s3_request_metrics_get_mem_acquire_start_timestamp_ns( + const struct aws_s3_request_metrics *metrics, + uint64_t *out_mem_acquire_start_time) { + AWS_PRECONDITION(metrics); + AWS_PRECONDITION(out_mem_acquire_start_time); + if (metrics->time_metrics.mem_acquire_start_timestamp_ns < 0) { + return aws_raise_error(AWS_ERROR_S3_METRIC_DATA_NOT_AVAILABLE); + } + *out_mem_acquire_start_time = metrics->time_metrics.mem_acquire_start_timestamp_ns; + return AWS_OP_SUCCESS; +} + +int aws_s3_request_metrics_get_mem_acquire_end_timestamp_ns( + const struct aws_s3_request_metrics *metrics, + uint64_t *out_mem_acquire_end_time) { + AWS_PRECONDITION(metrics); + AWS_PRECONDITION(out_mem_acquire_end_time); + if (metrics->time_metrics.mem_acquire_end_timestamp_ns < 0) { + return aws_raise_error(AWS_ERROR_S3_METRIC_DATA_NOT_AVAILABLE); + } + *out_mem_acquire_end_time = metrics->time_metrics.mem_acquire_end_timestamp_ns; + return AWS_OP_SUCCESS; +} + +int aws_s3_request_metrics_get_mem_acquire_duration_ns( + const struct aws_s3_request_metrics *metrics, + uint64_t *out_mem_acquire_duration) { + AWS_PRECONDITION(metrics); + AWS_PRECONDITION(out_mem_acquire_duration); + if (metrics->time_metrics.mem_acquire_duration_ns < 0) { + return aws_raise_error(AWS_ERROR_S3_METRIC_DATA_NOT_AVAILABLE); + } + *out_mem_acquire_duration = metrics->time_metrics.mem_acquire_duration_ns; + return AWS_OP_SUCCESS; +} + +int aws_s3_request_metrics_get_delivery_start_timestamp_ns( + const struct aws_s3_request_metrics *metrics, + uint64_t *out_delivery_start_time) { + AWS_PRECONDITION(metrics); + AWS_PRECONDITION(out_delivery_start_time); + if (metrics->time_metrics.deliver_start_timestamp_ns < 0) { + return aws_raise_error(AWS_ERROR_S3_METRIC_DATA_NOT_AVAILABLE); + } + *out_delivery_start_time = metrics->time_metrics.deliver_start_timestamp_ns; + return AWS_OP_SUCCESS; +} + +int aws_s3_request_metrics_get_delivery_end_timestamp_ns( + const struct aws_s3_request_metrics *metrics, + uint64_t *out_delivery_end_time) { + AWS_PRECONDITION(metrics); + AWS_PRECONDITION(out_delivery_end_time); + if (metrics->time_metrics.deliver_end_timestamp_ns < 0) { + return aws_raise_error(AWS_ERROR_S3_METRIC_DATA_NOT_AVAILABLE); + } + *out_delivery_end_time = metrics->time_metrics.deliver_end_timestamp_ns; + return AWS_OP_SUCCESS; +} + +int aws_s3_request_metrics_get_delivery_duration_ns( + const struct aws_s3_request_metrics *metrics, + uint64_t *out_delivery_duration) { + AWS_PRECONDITION(metrics); + AWS_PRECONDITION(out_delivery_duration); + if (metrics->time_metrics.deliver_duration_ns < 0) { + return aws_raise_error(AWS_ERROR_S3_METRIC_DATA_NOT_AVAILABLE); + } + *out_delivery_duration = metrics->time_metrics.deliver_duration_ns; + return AWS_OP_SUCCESS; +} + int aws_s3_request_metrics_get_response_status_code( const struct aws_s3_request_metrics *metrics, int *response_status) {