Skip to content

Commit 26917f2

Browse files
authored
feat: enable access to metrics for HTTP streams (#86)
1 parent 36f2090 commit 26917f2

File tree

9 files changed

+129
-12
lines changed

9 files changed

+129
-12
lines changed
Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,8 @@
1+
{
2+
"id": "cfc58da7-d2c6-47d7-a40e-72893b49bca7",
3+
"type": "feature",
4+
"description": "Enable access to metrics for HTTP streams",
5+
"issues": [
6+
"https://github.com/awslabs/smithy-kotlin/issues/893"
7+
]
8+
}

aws-crt-kotlin/api/android/aws-crt-kotlin.api

Lines changed: 29 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -634,14 +634,43 @@ public abstract interface class aws/sdk/kotlin/crt/http/HttpStream : aws/sdk/kot
634634
public abstract fun writeChunk ([BZ)V
635635
}
636636

637+
public final class aws/sdk/kotlin/crt/http/HttpStreamMetrics {
638+
public fun <init> (JJJJJJI)V
639+
public final fun component1 ()J
640+
public final fun component2 ()J
641+
public final fun component3 ()J
642+
public final fun component4 ()J
643+
public final fun component5 ()J
644+
public final fun component6 ()J
645+
public final fun component7 ()I
646+
public final fun copy (JJJJJJI)Laws/sdk/kotlin/crt/http/HttpStreamMetrics;
647+
public static synthetic fun copy$default (Laws/sdk/kotlin/crt/http/HttpStreamMetrics;JJJJJJIILjava/lang/Object;)Laws/sdk/kotlin/crt/http/HttpStreamMetrics;
648+
public fun equals (Ljava/lang/Object;)Z
649+
public final fun getReceiveEndTimestampNs ()J
650+
public final fun getReceiveStartTimestampNs ()J
651+
public final fun getReceivingDurationNs ()J
652+
public final fun getSendEndTimestampNs ()J
653+
public final fun getSendStartTimestampNs ()J
654+
public final fun getSendingDurationNs ()J
655+
public final fun getStreamId ()I
656+
public fun hashCode ()I
657+
public fun toString ()Ljava/lang/String;
658+
}
659+
660+
public final class aws/sdk/kotlin/crt/http/HttpStreamMetricsJVMKt {
661+
public static final fun toKotlin (Lsoftware/amazon/awssdk/crt/http/HttpStreamMetrics;)Laws/sdk/kotlin/crt/http/HttpStreamMetrics;
662+
}
663+
637664
public abstract interface class aws/sdk/kotlin/crt/http/HttpStreamResponseHandler {
665+
public abstract fun onMetrics (Laws/sdk/kotlin/crt/http/HttpStream;Laws/sdk/kotlin/crt/http/HttpStreamMetrics;)V
638666
public abstract fun onResponseBody (Laws/sdk/kotlin/crt/http/HttpStream;Laws/sdk/kotlin/crt/io/Buffer;)I
639667
public abstract fun onResponseComplete (Laws/sdk/kotlin/crt/http/HttpStream;I)V
640668
public abstract fun onResponseHeaders (Laws/sdk/kotlin/crt/http/HttpStream;IILjava/util/List;)V
641669
public abstract fun onResponseHeadersDone (Laws/sdk/kotlin/crt/http/HttpStream;I)V
642670
}
643671

644672
public final class aws/sdk/kotlin/crt/http/HttpStreamResponseHandler$DefaultImpls {
673+
public static fun onMetrics (Laws/sdk/kotlin/crt/http/HttpStreamResponseHandler;Laws/sdk/kotlin/crt/http/HttpStream;Laws/sdk/kotlin/crt/http/HttpStreamMetrics;)V
645674
public static fun onResponseBody (Laws/sdk/kotlin/crt/http/HttpStreamResponseHandler;Laws/sdk/kotlin/crt/http/HttpStream;Laws/sdk/kotlin/crt/io/Buffer;)I
646675
public static fun onResponseHeadersDone (Laws/sdk/kotlin/crt/http/HttpStreamResponseHandler;Laws/sdk/kotlin/crt/http/HttpStream;I)V
647676
}

aws-crt-kotlin/api/jvm/aws-crt-kotlin.api

Lines changed: 29 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -634,14 +634,43 @@ public abstract interface class aws/sdk/kotlin/crt/http/HttpStream : aws/sdk/kot
634634
public abstract fun writeChunk ([BZ)V
635635
}
636636

637+
public final class aws/sdk/kotlin/crt/http/HttpStreamMetrics {
638+
public fun <init> (JJJJJJI)V
639+
public final fun component1 ()J
640+
public final fun component2 ()J
641+
public final fun component3 ()J
642+
public final fun component4 ()J
643+
public final fun component5 ()J
644+
public final fun component6 ()J
645+
public final fun component7 ()I
646+
public final fun copy (JJJJJJI)Laws/sdk/kotlin/crt/http/HttpStreamMetrics;
647+
public static synthetic fun copy$default (Laws/sdk/kotlin/crt/http/HttpStreamMetrics;JJJJJJIILjava/lang/Object;)Laws/sdk/kotlin/crt/http/HttpStreamMetrics;
648+
public fun equals (Ljava/lang/Object;)Z
649+
public final fun getReceiveEndTimestampNs ()J
650+
public final fun getReceiveStartTimestampNs ()J
651+
public final fun getReceivingDurationNs ()J
652+
public final fun getSendEndTimestampNs ()J
653+
public final fun getSendStartTimestampNs ()J
654+
public final fun getSendingDurationNs ()J
655+
public final fun getStreamId ()I
656+
public fun hashCode ()I
657+
public fun toString ()Ljava/lang/String;
658+
}
659+
660+
public final class aws/sdk/kotlin/crt/http/HttpStreamMetricsJVMKt {
661+
public static final fun toKotlin (Lsoftware/amazon/awssdk/crt/http/HttpStreamMetrics;)Laws/sdk/kotlin/crt/http/HttpStreamMetrics;
662+
}
663+
637664
public abstract interface class aws/sdk/kotlin/crt/http/HttpStreamResponseHandler {
665+
public abstract fun onMetrics (Laws/sdk/kotlin/crt/http/HttpStream;Laws/sdk/kotlin/crt/http/HttpStreamMetrics;)V
638666
public abstract fun onResponseBody (Laws/sdk/kotlin/crt/http/HttpStream;Laws/sdk/kotlin/crt/io/Buffer;)I
639667
public abstract fun onResponseComplete (Laws/sdk/kotlin/crt/http/HttpStream;I)V
640668
public abstract fun onResponseHeaders (Laws/sdk/kotlin/crt/http/HttpStream;IILjava/util/List;)V
641669
public abstract fun onResponseHeadersDone (Laws/sdk/kotlin/crt/http/HttpStream;I)V
642670
}
643671

644672
public final class aws/sdk/kotlin/crt/http/HttpStreamResponseHandler$DefaultImpls {
673+
public static fun onMetrics (Laws/sdk/kotlin/crt/http/HttpStreamResponseHandler;Laws/sdk/kotlin/crt/http/HttpStream;Laws/sdk/kotlin/crt/http/HttpStreamMetrics;)V
645674
public static fun onResponseBody (Laws/sdk/kotlin/crt/http/HttpStreamResponseHandler;Laws/sdk/kotlin/crt/http/HttpStream;Laws/sdk/kotlin/crt/io/Buffer;)I
646675
public static fun onResponseHeadersDone (Laws/sdk/kotlin/crt/http/HttpStreamResponseHandler;Laws/sdk/kotlin/crt/http/HttpStream;I)V
647676
}
Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,15 @@
1+
/*
2+
* Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.
3+
* SPDX-License-Identifier: Apache-2.0
4+
*/
5+
package aws.sdk.kotlin.crt.http
6+
7+
public data class HttpStreamMetrics(
8+
val sendStartTimestampNs: Long,
9+
val sendEndTimestampNs: Long,
10+
val sendingDurationNs: Long,
11+
val receiveStartTimestampNs: Long,
12+
val receiveEndTimestampNs: Long,
13+
val receivingDurationNs: Long,
14+
val streamId: Int,
15+
)

aws-crt-kotlin/common/src/aws/sdk/kotlin/crt/http/HttpStreamResponseHandler.kt

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -68,6 +68,15 @@ public interface HttpStreamResponseHandler {
6868
// window size through `Stream.incrementWindow()`?
6969
bodyBytesIn.len
7070

71+
/**
72+
* Called right before stream is complete, whether successful or unsuccessful.
73+
* @param stream The HTTP stream to which the metrics apply
74+
* @param metrics The [HttpStreamMetrics] containing metrics for the given stream
75+
*/
76+
public fun onMetrics(stream: HttpStream, metrics: HttpStreamMetrics) {
77+
/* Optional callback, nothing to do by default */
78+
}
79+
7180
/**
7281
* Called from Native when the Response has completed.
7382
* @param stream completed stream

aws-crt-kotlin/jvm/src/aws/sdk/kotlin/crt/http/HttpRequestUtil.kt

Lines changed: 18 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -8,56 +8,63 @@ package aws.sdk.kotlin.crt.http
88
import aws.sdk.kotlin.crt.io.MutableBuffer
99
import aws.sdk.kotlin.crt.io.byteArrayBuffer
1010
import java.nio.ByteBuffer
11+
import software.amazon.awssdk.crt.http.HttpHeader as HttpHeaderJni
1112
import software.amazon.awssdk.crt.http.HttpRequest as HttpRequestJni
1213
import software.amazon.awssdk.crt.http.HttpRequestBodyStream as HttpRequestBodyStreamJni
14+
import software.amazon.awssdk.crt.http.HttpStream as HttpStreamJni
15+
import software.amazon.awssdk.crt.http.HttpStreamMetrics as HttpStreamMetricsJni
16+
import software.amazon.awssdk.crt.http.HttpStreamResponseHandler as HttpStreamResponseHandlerJni
1317

1418
/**
1519
* Convert the KMP version of [HttpRequest] into the JNI equivalent
1620
*/
1721
internal fun HttpRequest.into(): HttpRequestJni {
1822
val jniHeaders = headers.entries()
1923
.map { entry ->
20-
entry.value.map {
21-
software.amazon.awssdk.crt.http.HttpHeader(entry.key, it)
22-
}
24+
entry.value.map { HttpHeaderJni(entry.key, it) }
2325
}
2426
.flatten()
2527
.toTypedArray()
2628

2729
val bodyStream = body?.let { JniRequestBodyStream(it) }
28-
return software.amazon.awssdk.crt.http.HttpRequest(method, encodedPath, jniHeaders, bodyStream)
30+
return HttpRequestJni(method, encodedPath, jniHeaders, bodyStream)
2931
}
3032

31-
internal fun HttpStreamResponseHandler.asJniStreamResponseHandler(): software.amazon.awssdk.crt.http.HttpStreamResponseHandler {
33+
internal fun HttpStreamResponseHandler.asJniStreamResponseHandler(): HttpStreamResponseHandlerJni {
3234
val handler = this
33-
return object : software.amazon.awssdk.crt.http.HttpStreamResponseHandler {
35+
return object : HttpStreamResponseHandlerJni {
3436
override fun onResponseHeaders(
35-
stream: software.amazon.awssdk.crt.http.HttpStream,
37+
stream: HttpStreamJni,
3638
statusCode: Int,
3739
blockType: Int,
38-
headers: Array<out software.amazon.awssdk.crt.http.HttpHeader>?,
40+
headers: Array<out HttpHeaderJni>?,
3941
) {
4042
val ktHeaders = headers?.map { HttpHeader(it.name, it.value) }
4143
val ktStream = HttpStreamJVM(stream)
4244
handler.onResponseHeaders(ktStream, statusCode, blockType, ktHeaders)
4345
}
4446

45-
override fun onResponseHeadersDone(stream: software.amazon.awssdk.crt.http.HttpStream, blockType: Int) {
47+
override fun onResponseHeadersDone(stream: HttpStreamJni, blockType: Int) {
4648
val ktStream = HttpStreamJVM(stream)
4749
handler.onResponseHeadersDone(ktStream, blockType)
4850
}
4951

50-
override fun onResponseBody(stream: software.amazon.awssdk.crt.http.HttpStream, bodyBytesIn: ByteArray?): Int {
52+
override fun onResponseBody(stream: HttpStreamJni, bodyBytesIn: ByteArray?): Int {
5153
if (bodyBytesIn == null) return 0
5254
val ktStream = HttpStreamJVM(stream)
5355
val buffer = byteArrayBuffer(bodyBytesIn)
5456
return handler.onResponseBody(ktStream, buffer)
5557
}
5658

57-
override fun onResponseComplete(stream: software.amazon.awssdk.crt.http.HttpStream, errorCode: Int) {
59+
override fun onResponseComplete(stream: HttpStreamJni, errorCode: Int) {
5860
val ktStream = HttpStreamJVM(stream)
5961
handler.onResponseComplete(ktStream, errorCode)
6062
}
63+
64+
override fun onMetrics(stream: HttpStreamJni, metrics: HttpStreamMetricsJni) {
65+
val ktStream = HttpStreamJVM(stream)
66+
handler.onMetrics(ktStream, metrics.toKotlin())
67+
}
6168
}
6269
}
6370

Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,19 @@
1+
/*
2+
* Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.
3+
* SPDX-License-Identifier: Apache-2.0
4+
*/
5+
package aws.sdk.kotlin.crt.http
6+
7+
/**
8+
* Convert a CRT JNI metrics object into a Kotlin-native one
9+
*/
10+
public fun software.amazon.awssdk.crt.http.HttpStreamMetrics.toKotlin(): HttpStreamMetrics =
11+
HttpStreamMetrics(
12+
sendStartTimestampNs = this.sendStartTimestampNs,
13+
sendEndTimestampNs = this.sendEndTimestampNs,
14+
sendingDurationNs = this.sendingDurationNs,
15+
receiveStartTimestampNs = this.receiveStartTimestampNs,
16+
receiveEndTimestampNs = this.receiveEndTimestampNs,
17+
receivingDurationNs = this.receivingDurationNs,
18+
streamId = this.streamId,
19+
)

build.gradle.kts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,7 @@ import org.jetbrains.kotlin.gradle.dsl.JvmTarget
1010
buildscript {
1111
repositories {
1212
mavenCentral()
13+
mavenLocal()
1314
}
1415
}
1516

gradle/libs.versions.toml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@ kotlin-version = "1.9.21"
44
aws-kotlin-repo-tools-version = "0.3.2"
55

66
# libs
7-
crt-java-version = "0.29.1"
7+
crt-java-version = "0.29.6"
88
coroutines-version = "1.7.3"
99

1010
# testing

0 commit comments

Comments
 (0)