Skip to content

feat: add service protocol benchmarks #1271

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

Merged
merged 3 commits into from
Apr 18, 2025
Merged
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 2 additions & 0 deletions runtime/observability/telemetry-api/api/telemetry-api.api
Original file line number Diff line number Diff line change
@@ -298,6 +298,8 @@ public final class aws/smithy/kotlin/runtime/telemetry/metrics/Histogram$Default
public final class aws/smithy/kotlin/runtime/telemetry/metrics/HistogramKt {
public static final fun measureSeconds (Laws/smithy/kotlin/runtime/telemetry/metrics/Histogram;Laws/smithy/kotlin/runtime/collections/Attributes;Laws/smithy/kotlin/runtime/telemetry/context/Context;Lkotlin/jvm/functions/Function0;)Ljava/lang/Object;
public static synthetic fun measureSeconds$default (Laws/smithy/kotlin/runtime/telemetry/metrics/Histogram;Laws/smithy/kotlin/runtime/collections/Attributes;Laws/smithy/kotlin/runtime/telemetry/context/Context;Lkotlin/jvm/functions/Function0;ILjava/lang/Object;)Ljava/lang/Object;
public static final fun recordPayloadSize (Laws/smithy/kotlin/runtime/telemetry/metrics/Histogram;Ljava/lang/Long;Laws/smithy/kotlin/runtime/collections/Attributes;Laws/smithy/kotlin/runtime/telemetry/context/Context;)V
public static synthetic fun recordPayloadSize$default (Laws/smithy/kotlin/runtime/telemetry/metrics/Histogram;Ljava/lang/Long;Laws/smithy/kotlin/runtime/collections/Attributes;Laws/smithy/kotlin/runtime/telemetry/context/Context;ILjava/lang/Object;)V
public static final fun recordSeconds-dWUq8MI (Laws/smithy/kotlin/runtime/telemetry/metrics/Histogram;JLaws/smithy/kotlin/runtime/collections/Attributes;Laws/smithy/kotlin/runtime/telemetry/context/Context;)V
public static synthetic fun recordSeconds-dWUq8MI$default (Laws/smithy/kotlin/runtime/telemetry/metrics/Histogram;JLaws/smithy/kotlin/runtime/collections/Attributes;Laws/smithy/kotlin/runtime/telemetry/context/Context;ILjava/lang/Object;)V
}
Original file line number Diff line number Diff line change
@@ -67,3 +67,16 @@ public inline fun <T> DoubleHistogram.measureSeconds(attributes: Attributes = em
recordSeconds(tv.duration, attributes, context)
return tv.value
}

/**
* Records the size of a payload in bytes to this histogram.
*
* @param value The payload size in bytes, or null if no payload
* @param attributes attributes to associate with this measurement
* @param context (Optional) trace context to associate with this measurement
*/
@InternalApi
public fun DoubleHistogram.recordPayloadSize(value: Long?, attributes: Attributes = emptyAttributes(), context: Context? = null) {
val bytes = value?.toDouble() ?: 0.0
record(bytes, attributes, context)
}
2 changes: 2 additions & 0 deletions runtime/protocol/http-client/api/http-client.api
Original file line number Diff line number Diff line change
@@ -601,8 +601,10 @@ public final class aws/smithy/kotlin/runtime/http/operation/OperationMetrics {
public fun <init> (Ljava/lang/String;Laws/smithy/kotlin/runtime/telemetry/TelemetryProvider;)V
public final fun getDeserializationDuration ()Laws/smithy/kotlin/runtime/telemetry/metrics/Histogram;
public final fun getProvider ()Laws/smithy/kotlin/runtime/telemetry/TelemetryProvider;
public final fun getRequestPayloadSize ()Laws/smithy/kotlin/runtime/telemetry/metrics/Histogram;
public final fun getResolveEndpointDuration ()Laws/smithy/kotlin/runtime/telemetry/metrics/Histogram;
public final fun getResolveIdentityDuration ()Laws/smithy/kotlin/runtime/telemetry/metrics/Histogram;
public final fun getResponsePayloadSize ()Laws/smithy/kotlin/runtime/telemetry/metrics/Histogram;
public final fun getRpcAttemptDuration ()Laws/smithy/kotlin/runtime/telemetry/metrics/Histogram;
public final fun getRpcAttemptOverheadDuration ()Laws/smithy/kotlin/runtime/telemetry/metrics/Histogram;
public final fun getRpcAttempts ()Laws/smithy/kotlin/runtime/telemetry/metrics/MonotonicCounter;
Original file line number Diff line number Diff line change
@@ -17,6 +17,7 @@ import aws.smithy.kotlin.runtime.http.engine.EngineAttributes
import aws.smithy.kotlin.runtime.http.operation.OperationMetrics
import aws.smithy.kotlin.runtime.http.request.HttpRequest
import aws.smithy.kotlin.runtime.http.response.HttpResponse
import aws.smithy.kotlin.runtime.telemetry.metrics.recordPayloadSize
import aws.smithy.kotlin.runtime.telemetry.metrics.recordSeconds
import kotlin.time.TimeMark
import kotlin.time.TimeSource
@@ -105,4 +106,12 @@ internal class OperationTelemetryInterceptor(
override fun readBeforeAttempt(context: ProtocolRequestInterceptorContext<Any, HttpRequest>) {
attemptStart = timeSource.markNow()
}

override fun readBeforeTransmit(context: ProtocolRequestInterceptorContext<Any, HttpRequest>) {
metrics.requestPayloadSize.recordPayloadSize(context.protocolRequest.body.contentLength)
}

override fun readAfterTransmit(context: ProtocolResponseInterceptorContext<Any, HttpRequest, HttpResponse>) {
metrics.responsePayloadSize.recordPayloadSize(context.protocolResponse.body.contentLength)
}
}
Original file line number Diff line number Diff line change
@@ -37,4 +37,6 @@ public class OperationMetrics(
public val resolveEndpointDuration: DoubleHistogram = meter.createDoubleHistogram("smithy.client.call.resolve_endpoint_duration", "s", "The time it takes to resolve an endpoint for a request")
public val resolveIdentityDuration: DoubleHistogram = meter.createDoubleHistogram("smithy.client.call.auth.resolve_identity_duration", "s", "The time it takes to resolve an identity for signing a request")
public val signingDuration: DoubleHistogram = meter.createDoubleHistogram("smithy.client.call.auth.signing_duration", "s", "The time it takes to sign a request")
public val requestPayloadSize: DoubleHistogram = meter.createDoubleHistogram("smithy.client.call.request_payload_size", "bytes", "The payload size of a request")
public val responsePayloadSize: DoubleHistogram = meter.createDoubleHistogram("smithy.client.call.response_payload_size", "bytes", "The payload size of a response")
}
Loading