Skip to content

Commit 6d357b4

Browse files
author
Krish
committed
addressing review comments
1 parent b7e85fe commit 6d357b4

File tree

6 files changed

+61
-59
lines changed

6 files changed

+61
-59
lines changed

include/aws/s3/private/s3_request.h

Lines changed: 15 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -34,19 +34,19 @@ struct aws_s3_request_metrics {
3434
/* The time stamp when the request was first initiated by the client, including the very first attempt.
3535
* This timestamp is set once at the beginning and never updated during retries. Timestamps are from
3636
* `aws_high_res_clock_get_ticks`. This will always be available. */
37-
int64_t request_start_timestamp_ns;
37+
int64_t s3_request_first_attempt_start_timestamp_ns;
3838

3939
/* The time stamp when the request completely finished (success or final failure), including all retry
4040
* attempts. This is set when the request reaches its final state - either successful completion or
4141
* exhaustion of all retry attempts. Timestamps are from `aws_high_res_clock_get_ticks`. This will
4242
* be available with the last attempt. */
43-
int64_t request_end_timestamp_ns;
43+
int64_t s3_request_last_attempt_end_timestamp_ns;
4444

4545
/* The total time duration for the complete request lifecycle from initial start to final completion,
4646
* including all retry attempts, backoff delays, and connection establishment time
47-
* (request_end_timestamp_ns - request_start_timestamp_ns). This represents the end-to-end user
47+
* (s3_request_last_attempt_end_timestamp_ns - s3_request_first_attempt_start_timestamp_ns). This represents the end-to-end user
4848
* experience time. This will be available with the last attempt. */
49-
int64_t request_duration_ns;
49+
int64_t s3_request_total_duration_ns;
5050

5151
/* The time stamp when the request started by S3 client, which is prepared time by the client. Timestamps
5252
* are from `aws_high_res_clock_get_ticks`. This will always be available. */
@@ -164,8 +164,6 @@ struct aws_s3_request_metrics {
164164
int error_code;
165165
/* Retry attempt. */
166166
uint32_t retry_attempt;
167-
/* The part number if it is a multipart request */
168-
uint32_t part_number;
169167
} crt_info_metrics;
170168

171169
struct aws_ref_count ref_count;
@@ -177,6 +175,17 @@ struct aws_s3_request {
177175
/* Linked list node used for queuing. */
178176
struct aws_linked_list_node node;
179177

178+
/* Timestamp when retry attempt started. Overwritten on each retry and copied to new attempt's setup data.
179+
* -1 means data not available. Timestamp from `aws_high_res_clock_get_ticks` */
180+
int64_t retry_start_timestamp_ns;
181+
/* Timestamp when retry attempt ended. Overwritten on each retry and copied to new attempt's setup data.
182+
* -1 means data not available. Timestamp from `aws_high_res_clock_get_ticks` */
183+
int64_t retry_end_timestamp_ns;
184+
/* Time duration for retry attempt (retry_end_timestamp_ns - retry_start_timestamp_ns).
185+
* Overwritten on each retry and copied to new attempt's setup data.
186+
* When retry_end_timestamp_ns is -1, means data not available. */
187+
int64_t retry_duration_ns;
188+
180189
/* Linked list node used for tracking the request is active from HTTP level. */
181190
struct aws_linked_list_node cancellable_http_streams_list_node;
182191

include/aws/s3/s3_client.h

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1606,21 +1606,21 @@ uint32_t aws_s3_request_metrics_get_retry_attempt(const struct aws_s3_request_me
16061606

16071607
/* Get the request start timestamp from aws_s3_request_metrics. Always available. */
16081608
AWS_S3_API
1609-
void aws_s3_request_metrics_get_request_start_timestamp_ns(
1609+
void aws_s3_request_metrics_get_s3_request_first_attempt_start_timestamp_ns(
16101610
const struct aws_s3_request_metrics *metrics,
1611-
uint64_t *out_request_start_time);
1611+
uint64_t *out_s3_request_first_attempt_start_time);
16121612

16131613
/* Get the request end timestamp. AWS_ERROR_S3_METRIC_DATA_NOT_AVAILABLE will be raised if data not
16141614
* available. */
16151615
AWS_S3_API
1616-
int aws_s3_request_metrics_get_request_end_timestamp_ns(
1616+
int aws_s3_request_metrics_get_s3_request_last_attempt_end_timestamp_ns(
16171617
const struct aws_s3_request_metrics *metrics,
1618-
uint64_t *out_request_end_time);
1618+
uint64_t *out_s3_request_last_attempt_end_time);
16191619

16201620
/* Get the request duration. AWS_ERROR_S3_METRIC_DATA_NOT_AVAILABLE will be raised if data not
16211621
* available. */
16221622
AWS_S3_API
1623-
int aws_s3_request_metrics_get_request_duration_ns(
1623+
int aws_s3_request_metrics_get_s3_request_total_duration_ns(
16241624
const struct aws_s3_request_metrics *metrics,
16251625
uint64_t *out_request_duration);
16261626

source/s3_client.c

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2463,7 +2463,7 @@ void aws_s3_client_notify_connection_finished(
24632463

24642464
/* Ask the retry strategy to schedule a retry of the request. */
24652465
aws_high_res_clock_get_ticks(
2466-
(uint64_t *)&request->send_data.metrics->time_metrics.retry_delay_start_timestamp_ns);
2466+
(uint64_t *)&request->retry_start_timestamp_ns);
24672467
if (aws_retry_strategy_schedule_retry(
24682468
connection->retry_token, error_type, s_s3_client_retry_ready, connection)) {
24692469

@@ -2485,6 +2485,9 @@ void aws_s3_client_notify_connection_finished(
24852485

24862486
reset_connection:
24872487

2488+
aws_high_res_clock_get_ticks((uint64_t *)&request->send_data.metrics->time_metrics.s3_request_last_attempt_end_timestamp_ns);
2489+
request->send_data.metrics->time_metrics.s3_request_total_duration_ns = request->send_data.metrics->time_metrics.s3_request_last_attempt_end_timestamp_ns - request->send_data.metrics->time_metrics.s3_request_first_attempt_start_timestamp_ns;
2490+
24882491
if (connection->retry_token != NULL) {
24892492
/* If we have a retry token and successfully finished, record that success. */
24902493
if (finish_code == AWS_S3_CONNECTION_FINISH_CODE_SUCCESS) {
@@ -2553,6 +2556,9 @@ static void s_s3_client_retry_ready(struct aws_retry_token *token, int error_cod
25532556
struct aws_s3_request *request = connection->request;
25542557
AWS_PRECONDITION(request);
25552558

2559+
aws_high_res_clock_get_ticks((uint64_t *)&request->retry_end_timestamp_ns);
2560+
request->retry_duration_ns = request->retry_end_timestamp_ns - request->retry_start_timestamp_ns;
2561+
25562562
struct aws_s3_meta_request *meta_request = request->meta_request;
25572563
AWS_PRECONDITION(meta_request);
25582564

source/s3_meta_request.c

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1518,6 +1518,12 @@ static void s_s3_meta_request_stream_metrics(
15181518
s3_metrics->time_metrics.send_end_timestamp_ns = http_metrics->send_end_timestamp_ns;
15191519
s3_metrics->time_metrics.sending_duration_ns = http_metrics->sending_duration_ns;
15201520
s3_metrics->time_metrics.receive_start_timestamp_ns = http_metrics->receive_start_timestamp_ns;
1521+
1522+
if (s3_metrics->time_metrics.receive_start_timestamp_ns != -1) {
1523+
s3_metrics->time_metrics.service_call_duration_ns =
1524+
s3_metrics->time_metrics.receive_start_timestamp_ns - s3_metrics->time_metrics.conn_acquire_start_timestamp_ns;
1525+
}
1526+
15211527
s3_metrics->time_metrics.receive_end_timestamp_ns = http_metrics->receive_end_timestamp_ns;
15221528
s3_metrics->time_metrics.receiving_duration_ns = http_metrics->receiving_duration_ns;
15231529

@@ -1902,7 +1908,7 @@ static struct aws_s3_request_metrics *s_s3_request_finish_up_and_release_metrics
19021908
aws_high_res_clock_get_ticks((uint64_t *)&metrics->time_metrics.end_timestamp_ns);
19031909
metrics->time_metrics.total_duration_ns =
19041910
metrics->time_metrics.end_timestamp_ns - metrics->time_metrics.start_timestamp_ns;
1905-
aws_high_res_clock_get_ticks((uint64_t *)&metrics->time_metrics.request_end_timestamp_ns);
1911+
aws_high_res_clock_get_ticks((uint64_t *)&metrics->time_metrics.s3_request_last_attempt_end_timestamp_ns);
19061912
}
19071913

19081914
if (meta_request->telemetry_callback != NULL) {

source/s3_request.c

Lines changed: 27 additions & 35 deletions
Original file line numberDiff line numberDiff line change
@@ -92,23 +92,11 @@ void aws_s3_request_setup_send_data(struct aws_s3_request *request, struct aws_h
9292
if (request->num_times_prepared > 0 && request->send_data.metrics != NULL) {
9393
/* If there is a metrics from previous attempt, complete it now. */
9494

95-
/* checkpoint retry_delay_end and calculate duration */
96-
aws_high_res_clock_get_ticks(
97-
(uint64_t *)&request->send_data.metrics->time_metrics.retry_delay_end_timestamp_ns);
98-
request->send_data.metrics->time_metrics.retry_delay_duration_ns =
99-
request->send_data.metrics->time_metrics.retry_delay_end_timestamp_ns -
100-
request->send_data.metrics->time_metrics.retry_delay_start_timestamp_ns;
101-
10295
struct aws_s3_request_metrics *metric = request->send_data.metrics;
10396
aws_high_res_clock_get_ticks((uint64_t *)&metric->time_metrics.end_timestamp_ns);
10497
metric->time_metrics.total_duration_ns =
10598
metric->time_metrics.end_timestamp_ns - metric->time_metrics.start_timestamp_ns;
10699

107-
if (metric->time_metrics.receive_start_timestamp_ns != -1) {
108-
metric->time_metrics.service_call_duration_ns =
109-
metric->time_metrics.receive_start_timestamp_ns - metric->time_metrics.conn_acquire_start_timestamp_ns;
110-
}
111-
112100
struct aws_s3_meta_request *meta_request = request->meta_request;
113101
if (meta_request != NULL && meta_request->telemetry_callback != NULL) {
114102

@@ -120,7 +108,7 @@ void aws_s3_request_setup_send_data(struct aws_s3_request *request, struct aws_h
120108
}
121109

122110
/* retain the first attempt timestamp since we should not re-initialize it. */
123-
first_attempt_start_timestamp_ns = metric->time_metrics.request_start_timestamp_ns;
111+
first_attempt_start_timestamp_ns = metric->time_metrics.s3_request_first_attempt_start_timestamp_ns;
124112

125113
request->send_data.metrics = aws_s3_request_metrics_release(metric);
126114
aws_s3_request_clean_up_send_data(request);
@@ -129,20 +117,24 @@ void aws_s3_request_setup_send_data(struct aws_s3_request *request, struct aws_h
129117

130118
// metrics persisted to the next request
131119
request->send_data.metrics->crt_info_metrics.retry_attempt = request->num_times_prepared;
132-
request->send_data.metrics->time_metrics.request_start_timestamp_ns = first_attempt_start_timestamp_ns;
133-
}
134-
135-
/* Set request start timestamp */
136-
if (first_attempt_start_timestamp_ns == -1) {
137-
aws_high_res_clock_get_ticks((uint64_t *)&request->send_data.metrics->time_metrics.request_start_timestamp_ns);
120+
request->send_data.metrics->time_metrics.s3_request_first_attempt_start_timestamp_ns = first_attempt_start_timestamp_ns;
138121
}
139122

140123
request->send_data.message = message;
141124
s_populate_metrics_from_message(request, message);
142125
/* Start the timestamp */
143126
aws_high_res_clock_get_ticks((uint64_t *)&request->send_data.metrics->time_metrics.start_timestamp_ns);
144127

145-
request->send_data.metrics->crt_info_metrics.part_number = request->part_number;
128+
/* Set s3 request start timestamp if first attempt*/
129+
if (first_attempt_start_timestamp_ns == -1) {
130+
request->send_data.metrics->time_metrics.s3_request_first_attempt_start_timestamp_ns =
131+
request->send_data.metrics->time_metrics.start_timestamp_ns;
132+
}
133+
134+
/* copy delay duration since previous attempt */
135+
request->send_data.metrics->time_metrics.retry_delay_start_timestamp_ns = request->retry_start_timestamp_ns;
136+
request->send_data.metrics->time_metrics.retry_delay_end_timestamp_ns = request->retry_end_timestamp_ns;
137+
request->send_data.metrics->time_metrics.retry_delay_duration_ns = request->retry_duration_ns;
146138

147139
aws_http_message_acquire(message);
148140
}
@@ -233,9 +225,9 @@ struct aws_s3_request_metrics *aws_s3_request_metrics_new(struct aws_allocator *
233225
struct aws_s3_request_metrics *metrics = aws_mem_calloc(allocator, 1, sizeof(struct aws_s3_request_metrics));
234226
metrics->allocator = allocator;
235227

236-
metrics->time_metrics.request_start_timestamp_ns = -1;
237-
metrics->time_metrics.request_end_timestamp_ns = -1;
238-
metrics->time_metrics.request_duration_ns = -1;
228+
metrics->time_metrics.s3_request_first_attempt_start_timestamp_ns = -1;
229+
metrics->time_metrics.s3_request_last_attempt_end_timestamp_ns = -1;
230+
metrics->time_metrics.s3_request_total_duration_ns = -1;
239231

240232
metrics->time_metrics.start_timestamp_ns = -1;
241233
metrics->time_metrics.end_timestamp_ns = -1;
@@ -617,35 +609,35 @@ uint32_t aws_s3_request_metrics_get_retry_attempt(const struct aws_s3_request_me
617609
return metrics->crt_info_metrics.retry_attempt;
618610
}
619611

620-
void aws_s3_request_metrics_get_request_start_timestamp_ns(
612+
void aws_s3_request_metrics_get_s3_request_first_attempt_start_timestamp_ns(
621613
const struct aws_s3_request_metrics *metrics,
622-
uint64_t *out_request_start_time) {
614+
uint64_t *out_s3_request_first_attempt_start_time) {
623615
AWS_PRECONDITION(metrics);
624-
AWS_PRECONDITION(out_request_start_time);
625-
*out_request_start_time = metrics->time_metrics.request_start_timestamp_ns;
616+
AWS_PRECONDITION(out_s3_request_first_attempt_start_time);
617+
*out_s3_request_first_attempt_start_time = metrics->time_metrics.s3_request_first_attempt_start_timestamp_ns;
626618
}
627619

628-
int aws_s3_request_metrics_get_request_end_timestamp_ns(
620+
int aws_s3_request_metrics_get_s3_request_last_attempt_end_timestamp_ns(
629621
const struct aws_s3_request_metrics *metrics,
630-
uint64_t *out_request_end_time) {
622+
uint64_t *out_s3_request_last_attempt_end_time) {
631623
AWS_PRECONDITION(metrics);
632-
AWS_PRECONDITION(out_request_end_time);
633-
if (metrics->time_metrics.request_end_timestamp_ns < 0) {
624+
AWS_PRECONDITION(out_s3_request_last_attempt_end_time);
625+
if (metrics->time_metrics.s3_request_last_attempt_end_timestamp_ns < 0) {
634626
return aws_raise_error(AWS_ERROR_S3_METRIC_DATA_NOT_AVAILABLE);
635627
}
636-
*out_request_end_time = metrics->time_metrics.request_end_timestamp_ns;
628+
*out_s3_request_last_attempt_end_time = metrics->time_metrics.s3_request_last_attempt_end_timestamp_ns;
637629
return AWS_OP_SUCCESS;
638630
}
639631

640-
int aws_s3_request_metrics_get_request_duration_ns(
632+
int aws_s3_request_metrics_get_s3_request_total_duration_ns(
641633
const struct aws_s3_request_metrics *metrics,
642634
uint64_t *out_request_duration) {
643635
AWS_PRECONDITION(metrics);
644636
AWS_PRECONDITION(out_request_duration);
645-
if (metrics->time_metrics.request_duration_ns < 0) {
637+
if (metrics->time_metrics.s3_request_total_duration_ns < 0) {
646638
return aws_raise_error(AWS_ERROR_S3_METRIC_DATA_NOT_AVAILABLE);
647639
}
648-
*out_request_duration = metrics->time_metrics.request_duration_ns;
640+
*out_request_duration = metrics->time_metrics.s3_request_total_duration_ns;
649641
return AWS_OP_SUCCESS;
650642
}
651643

source/s3_util.c

Lines changed: 0 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -723,17 +723,6 @@ void aws_s3_request_finish_up_metrics_synced(struct aws_s3_request *request, str
723723
metrics->time_metrics.total_duration_ns =
724724
metrics->time_metrics.end_timestamp_ns - metrics->time_metrics.start_timestamp_ns;
725725

726-
if (metrics->time_metrics.receive_start_timestamp_ns != -1) {
727-
metrics->time_metrics.service_call_duration_ns = metrics->time_metrics.receive_start_timestamp_ns -
728-
metrics->time_metrics.conn_acquire_start_timestamp_ns;
729-
}
730-
731-
if (metrics->crt_info_metrics.error_code != AWS_S3_CONNECTION_FINISH_CODE_RETRY) {
732-
aws_high_res_clock_get_ticks((uint64_t *)&metrics->time_metrics.request_end_timestamp_ns);
733-
metrics->time_metrics.request_duration_ns =
734-
metrics->time_metrics.request_end_timestamp_ns - metrics->time_metrics.request_start_timestamp_ns;
735-
}
736-
737726
if (meta_request->telemetry_callback != NULL) {
738727
struct aws_s3_meta_request_event event = {.type = AWS_S3_META_REQUEST_EVENT_TELEMETRY};
739728
event.u.telemetry.metrics = aws_s3_request_metrics_acquire(metrics);

0 commit comments

Comments
 (0)