Skip to content

Commit

Permalink
finish up metrics after streaming body
Browse files Browse the repository at this point in the history
  • Loading branch information
TingDaoK committed Dec 11, 2023
1 parent 0cc6be7 commit 6f54603
Show file tree
Hide file tree
Showing 7 changed files with 46 additions and 31 deletions.
3 changes: 1 addition & 2 deletions include/aws/s3/private/s3_util.h
Original file line number Diff line number Diff line change
Expand Up @@ -290,8 +290,7 @@ AWS_S3_API
void aws_s3_request_finish_up_metrics_synced(
struct aws_s3_request *request,
struct aws_s3_meta_request *meta_request,
int error_code,
bool record_end);
int error_code);

AWS_EXTERN_C_END

Expand Down
12 changes: 6 additions & 6 deletions source/s3_auto_ranged_get.c
Original file line number Diff line number Diff line change
Expand Up @@ -673,7 +673,7 @@ static void s_s3_auto_ranged_get_request_finished(
/* BEGIN CRITICAL SECTION */
{
aws_s3_meta_request_lock_synced_data(meta_request);
bool record_end = true;
bool finishing_metrics = true;

/* If the object range was found, then record it. */
if (found_object_size) {
Expand Down Expand Up @@ -723,9 +723,8 @@ static void s_s3_auto_ranged_get_request_finished(
}

aws_s3_meta_request_stream_response_body_synced(meta_request, request);
/* The body of the request is queued to be streamed, don't record the end timestamp for the request
* yet. */
record_end = false;
/* The body of the request is queued to be streamed, don't finish the metrics yet. */
finishing_metrics = false;

AWS_LOGF_DEBUG(
AWS_LS_S3_META_REQUEST,
Expand Down Expand Up @@ -760,8 +759,9 @@ static void s_s3_auto_ranged_get_request_finished(
meta_request->synced_data.finish_result.validation_algorithm = request->validation_algorithm;
}
}
aws_s3_request_finish_up_metrics_synced(request, meta_request, error_code, record_end);

if (finishing_metrics) {
aws_s3_request_finish_up_metrics_synced(request, meta_request, error_code);
}
aws_s3_meta_request_unlock_synced_data(meta_request);
}
/* END CRITICAL SECTION */
Expand Down
2 changes: 1 addition & 1 deletion source/s3_auto_ranged_put.c
Original file line number Diff line number Diff line change
Expand Up @@ -1621,7 +1621,7 @@ static void s_s3_auto_ranged_put_request_finished(
} break;
}

aws_s3_request_finish_up_metrics_synced(request, meta_request, error_code, true /*record_end*/);
aws_s3_request_finish_up_metrics_synced(request, meta_request, error_code);
aws_s3_meta_request_unlock_synced_data(meta_request);
}

Expand Down
2 changes: 1 addition & 1 deletion source/s3_copy_object.c
Original file line number Diff line number Diff line change
Expand Up @@ -805,7 +805,7 @@ static void s_s3_copy_object_request_finished(
}
}

aws_s3_request_finish_up_metrics_synced(request, meta_request, error_code, true /*record_end*/);
aws_s3_request_finish_up_metrics_synced(request, meta_request, error_code);

aws_s3_meta_request_unlock_synced_data(meta_request);
}
9 changes: 6 additions & 3 deletions source/s3_default_meta_request.c
Original file line number Diff line number Diff line change
Expand Up @@ -401,7 +401,7 @@ static void s_s3_meta_request_default_request_finished(
meta_request_default->synced_data.cached_response_status = request->send_data.response_status;
meta_request_default->synced_data.request_completed = true;
meta_request_default->synced_data.request_error_code = error_code;
bool record_end = true;
bool finishing_metrics = true;

if (error_code == AWS_ERROR_SUCCESS) {
/* Send progress_callback for delivery on io_event_loop thread.
Expand All @@ -426,11 +426,14 @@ static void s_s3_meta_request_default_request_finished(
aws_s3_meta_request_stream_response_body_synced(meta_request, request);
/* The body of the request is queued to be streamed, don't record the end timestamp for the request
* yet. */
record_end = false;
finishing_metrics = false;
} else {
aws_s3_meta_request_set_fail_synced(meta_request, request, error_code);
}
aws_s3_request_finish_up_metrics_synced(request, meta_request, error_code, record_end);

if (finishing_metrics) {
aws_s3_request_finish_up_metrics_synced(request, meta_request, error_code);
}

aws_s3_meta_request_unlock_synced_data(meta_request);
}
Expand Down
30 changes: 23 additions & 7 deletions source/s3_meta_request.c
Original file line number Diff line number Diff line change
Expand Up @@ -1710,6 +1710,22 @@ static void s_s3_meta_request_event_delivery_task(struct aws_task *task, void *a
aws_atomic_fetch_sub(&client->stats.num_requests_streaming_response, 1);

++num_parts_delivered;

if (request->send_data.metrics != NULL) {
/* Request is done streaming the body, complete the metrics for the request now. */
struct aws_s3_request_metrics *metrics = request->send_data.metrics;
metrics->crt_info_metrics.error_code = error_code;
aws_high_res_clock_get_ticks((uint64_t *)&metrics->time_metrics.end_timestamp_ns);
metrics->time_metrics.total_duration_ns =
metrics->time_metrics.end_timestamp_ns - metrics->time_metrics.start_timestamp_ns;

if (meta_request->telemetry_callback != NULL) {
/* We already in the meta request event thread, invoke the telemetry callback directly */
meta_request->telemetry_callback(meta_request, metrics, meta_request->user_data);
}
request->send_data.metrics = aws_s3_request_metrics_release(metrics);
}

aws_s3_request_release(request);
} break;

Expand Down Expand Up @@ -1744,16 +1760,16 @@ static void s_s3_meta_request_event_delivery_task(struct aws_task *task, void *a
} break;

case AWS_S3_META_REQUEST_EVENT_TELEMETRY: {
struct aws_s3_request_metrics *metric = event.u.telemetry.metrics;
struct aws_s3_request_metrics *metrics = event.u.telemetry.metrics;
AWS_FATAL_ASSERT(meta_request->telemetry_callback != NULL);
AWS_FATAL_ASSERT(metric != NULL);
AWS_FATAL_ASSERT(metrics != NULL);

if (metric->time_metrics.end_timestamp_ns == -1) {
aws_high_res_clock_get_ticks((uint64_t *)&metric->time_metrics.end_timestamp_ns);
metric->time_metrics.total_duration_ns =
metric->time_metrics.end_timestamp_ns - metric->time_metrics.start_timestamp_ns;
if (metrics->time_metrics.end_timestamp_ns == -1) {
aws_high_res_clock_get_ticks((uint64_t *)&metrics->time_metrics.end_timestamp_ns);
metrics->time_metrics.total_duration_ns =
metrics->time_metrics.end_timestamp_ns - metrics->time_metrics.start_timestamp_ns;
}
meta_request->telemetry_callback(meta_request, metric, meta_request->user_data);
meta_request->telemetry_callback(meta_request, metrics, meta_request->user_data);
event.u.telemetry.metrics = aws_s3_request_metrics_release(event.u.telemetry.metrics);
} break;

Expand Down
19 changes: 8 additions & 11 deletions source/s3_util.c
Original file line number Diff line number Diff line change
Expand Up @@ -630,26 +630,23 @@ int aws_s3_crt_error_code_from_server_error_code_string(struct aws_byte_cursor e
void aws_s3_request_finish_up_metrics_synced(
struct aws_s3_request *request,
struct aws_s3_meta_request *meta_request,
int error_code,
bool record_end) {
int error_code) {
AWS_PRECONDITION(meta_request);
AWS_PRECONDITION(request);

if (request->send_data.metrics != NULL) {
/* Request is done, complete the metrics for the request now. */
struct aws_s3_request_metrics *metric = request->send_data.metrics;
metric->crt_info_metrics.error_code = error_code;
if (record_end) {
aws_high_res_clock_get_ticks((uint64_t *)&metric->time_metrics.end_timestamp_ns);
metric->time_metrics.total_duration_ns =
metric->time_metrics.end_timestamp_ns - metric->time_metrics.start_timestamp_ns;
}
struct aws_s3_request_metrics *metrics = request->send_data.metrics;
metrics->crt_info_metrics.error_code = error_code;
aws_high_res_clock_get_ticks((uint64_t *)&metrics->time_metrics.end_timestamp_ns);
metrics->time_metrics.total_duration_ns =
metrics->time_metrics.end_timestamp_ns - metrics->time_metrics.start_timestamp_ns;

if (meta_request->telemetry_callback != NULL) {
struct aws_s3_meta_request_event event = {.type = AWS_S3_META_REQUEST_EVENT_TELEMETRY};
event.u.telemetry.metrics = aws_s3_request_metrics_acquire(metric);
event.u.telemetry.metrics = aws_s3_request_metrics_acquire(metrics);
aws_s3_meta_request_add_event_for_delivery_synced(meta_request, &event);
}
request->send_data.metrics = aws_s3_request_metrics_release(metric);
request->send_data.metrics = aws_s3_request_metrics_release(metrics);
}
}

0 comments on commit 6f54603

Please sign in to comment.