diff --git a/crt/aws-c-mqtt b/crt/aws-c-mqtt index 1d512d927..154e9c5dd 160000 --- a/crt/aws-c-mqtt +++ b/crt/aws-c-mqtt @@ -1 +1 @@ -Subproject commit 1d512d92709f60b74e2cafa018e69a2e647f28e9 +Subproject commit 154e9c5dd19ec6d8d4cd690492d2a029f13e2035 diff --git a/src/main/java/software/amazon/awssdk/crt/internal/IoTDeviceSDKMetrics.java b/src/main/java/software/amazon/awssdk/crt/internal/IoTDeviceSDKMetrics.java new file mode 100644 index 000000000..611bd1a1d --- /dev/null +++ b/src/main/java/software/amazon/awssdk/crt/internal/IoTDeviceSDKMetrics.java @@ -0,0 +1,21 @@ +/** + * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. + * SPDX-License-Identifier: Apache-2.0. + */ +package software.amazon.awssdk.crt.internal; + +/** + * @internal + * IoT Device SDK Metrics Structure + */ +public class IoTDeviceSDKMetrics { + private String libraryName; + + public IoTDeviceSDKMetrics() { + this.libraryName = "IoTDeviceSDK/Java"; + } + + public String getLibraryName() { + return libraryName; + } +} diff --git a/src/main/java/software/amazon/awssdk/crt/mqtt/MqttClientConnection.java b/src/main/java/software/amazon/awssdk/crt/mqtt/MqttClientConnection.java index c4ac6af1f..6cec4bcd4 100644 --- a/src/main/java/software/amazon/awssdk/crt/mqtt/MqttClientConnection.java +++ b/src/main/java/software/amazon/awssdk/crt/mqtt/MqttClientConnection.java @@ -17,6 +17,7 @@ import software.amazon.awssdk.crt.mqtt5.Mqtt5Client; import software.amazon.awssdk.crt.mqtt5.Mqtt5ClientOptions; import software.amazon.awssdk.crt.mqtt5.packets.ConnectPacket; +import software.amazon.awssdk.crt.internal.IoTDeviceSDKMetrics; import java.util.concurrent.CompletableFuture; import java.util.function.Consumer; @@ -77,6 +78,7 @@ private static MqttConnectionConfig s_toMqtt3ConnectionConfig(Mqtt5ClientOptions options.setProtocolOperationTimeoutMs(mqtt5options.getAckTimeoutSeconds() != null ? Math.toIntExact(mqtt5options.getAckTimeoutSeconds()) * 1000 : 0); + options.setMetricsEnabled(mqtt5options.getMetricsEnabled()); return options; } @@ -162,6 +164,10 @@ private void SetupConfig(MqttConnectionConfig config) throws MqttException { mqttClientConnectionSetLogin(getNativeHandle(), config.getUsername(), config.getPassword()); } + if (config.getMetricsEnabled()) { + mqttClientConnectionSetMetrics(getNativeHandle(), new IoTDeviceSDKMetrics()); + } + if (config.getMinReconnectTimeoutSecs() != 0L && config.getMaxReconnectTimeoutSecs() != 0L) { mqttClientConnectionSetReconnectTimeout(getNativeHandle(), config.getMinReconnectTimeoutSecs(), config.getMaxReconnectTimeoutSecs()); @@ -502,6 +508,9 @@ private static native boolean mqttClientConnectionSetWill(long connection, Strin private static native void mqttClientConnectionSetLogin(long connection, String username, String password) throws CrtRuntimeException; + private static native void mqttClientConnectionSetMetrics(long connection, IoTDeviceSDKMetrics metrics) + throws CrtRuntimeException; + private static native void mqttClientConnectionSetReconnectTimeout(long connection, long minTimeout, long maxTimeout) throws CrtRuntimeException; diff --git a/src/main/java/software/amazon/awssdk/crt/mqtt/MqttConnectionConfig.java b/src/main/java/software/amazon/awssdk/crt/mqtt/MqttConnectionConfig.java index 255697852..6b6af1084 100644 --- a/src/main/java/software/amazon/awssdk/crt/mqtt/MqttConnectionConfig.java +++ b/src/main/java/software/amazon/awssdk/crt/mqtt/MqttConnectionConfig.java @@ -46,6 +46,9 @@ public final class MqttConnectionConfig extends CrtResource { private HttpProxyOptions proxyOptions; private Consumer websocketHandshakeTransform; + /* metrics */ + private boolean metricsEnabled = true; + public MqttConnectionConfig() {} @@ -538,6 +541,24 @@ public Consumer getWebsocketHandshakeTransform( return websocketHandshakeTransform; } + /** + * Enables or disables IoT Device SDK metrics collection + * + * @param enabled true to enable metrics, false to disable + */ + public void setMetricsEnabled(boolean enabled) { + this.metricsEnabled = enabled; + } + + /** + * Queries whether IoT Device SDK metrics collection is enabled + * + * @return true if metrics are enabled, false if disabled + */ + public boolean getMetricsEnabled() { + return metricsEnabled; + } + /** * Creates a (shallow) clone of this config object * @@ -567,6 +588,7 @@ public MqttConnectionConfig clone() { clone.setWebsocketHandshakeTransform(getWebsocketHandshakeTransform()); clone.setReconnectTimeoutSecs(getMinReconnectTimeoutSecs(), getMaxReconnectTimeoutSecs()); + clone.setMetricsEnabled(getMetricsEnabled()); // success, bump up the ref count so we can escape the try-with-resources block clone.addRef(); diff --git a/src/main/java/software/amazon/awssdk/crt/mqtt5/Mqtt5ClientOptions.java b/src/main/java/software/amazon/awssdk/crt/mqtt5/Mqtt5ClientOptions.java index acd18c8ac..fdfdc8353 100644 --- a/src/main/java/software/amazon/awssdk/crt/mqtt5/Mqtt5ClientOptions.java +++ b/src/main/java/software/amazon/awssdk/crt/mqtt5/Mqtt5ClientOptions.java @@ -12,6 +12,7 @@ import software.amazon.awssdk.crt.mqtt5.packets.ConnectPacket; import software.amazon.awssdk.crt.mqtt.MqttConnectionConfig; +import software.amazon.awssdk.crt.internal.IoTDeviceSDKMetrics; import java.util.Map; import java.util.function.Function; @@ -45,6 +46,11 @@ public class Mqtt5ClientOptions { private Consumer websocketHandshakeTransform; private PublishEvents publishEvents; private TopicAliasingOptions topicAliasingOptions; + // Indicates whether AWS IoT Metrics are enabled for this client, default to true. + // We don't expose this setting in the builder for now. + private IoTDeviceSDKMetrics iotDeviceSDKMetrics; + private boolean metricsEnabled = true; + /** * Returns the host name of the MQTT server to connect to. @@ -263,6 +269,24 @@ public TopicAliasingOptions getTopicAliasingOptions() { return this.topicAliasingOptions; } + /** + * Returns whether AWS IoT Device SDK metrics collection is enabled + * + * @return true if metrics are enabled, false otherwise + */ + public boolean getMetricsEnabled() { + return this.metricsEnabled; + } + + /** + * Enables or disables IoT Device SDK metrics collection + * + * @param enabled true to enable metrics, false to disable + */ + public void setMetricsEnabled(boolean enabled) { + this.metricsEnabled = enabled; + } + /** * Creates a Mqtt5ClientOptionsBuilder instance * @param builder The builder to get the Mqtt5ClientOptions values from @@ -289,6 +313,8 @@ public Mqtt5ClientOptions(Mqtt5ClientOptionsBuilder builder) { this.websocketHandshakeTransform = builder.websocketHandshakeTransform; this.publishEvents = builder.publishEvents; this.topicAliasingOptions = builder.topicAliasingOptions; + this.metricsEnabled = builder.metricsEnabled; + this.iotDeviceSDKMetrics = new IoTDeviceSDKMetrics(); } /******************************************************************************* @@ -583,6 +609,7 @@ static final public class Mqtt5ClientOptionsBuilder { private Consumer websocketHandshakeTransform; private PublishEvents publishEvents; private TopicAliasingOptions topicAliasingOptions; + private boolean metricsEnabled = true; /** * Sets the host name of the MQTT server to connect to. @@ -850,6 +877,17 @@ public Mqtt5ClientOptionsBuilder withTopicAliasingOptions(TopicAliasingOptions o return this; } + /** + * Enables or disables IoT Device SDK metrics collection + * + * @param enabled true to enable metrics, false to disable + * @return The Mqtt5ClientOptionsBuilder after setting the metrics option + */ + public Mqtt5ClientOptionsBuilder withMetricsEnabled(boolean enabled) { + this.metricsEnabled = enabled; + return this; + } + /** * Creates a new Mqtt5ClientOptionsBuilder instance * diff --git a/src/main/resources/META-INF/native-image/software.amazon.awssdk/crt/aws-crt/jni-config.json b/src/main/resources/META-INF/native-image/software.amazon.awssdk/crt/aws-crt/jni-config.json index 02134b607..92322c497 100644 --- a/src/main/resources/META-INF/native-image/software.amazon.awssdk/crt/aws-crt/jni-config.json +++ b/src/main/resources/META-INF/native-image/software.amazon.awssdk/crt/aws-crt/jni-config.json @@ -1256,6 +1256,14 @@ } ] }, + { + "name": "software.amazon.awssdk.crt.internal.IoTDeviceSDKMetrics", + "fields": [ + { + "name": "libraryName" + } + ] + }, { "name": "software.amazon.awssdk.crt.mqtt5.Mqtt5ClientOptions", "fields": [ @@ -1306,6 +1314,12 @@ }, { "name": "topicAliasingOptions" + }, + { + "name": "iotDeviceSDKMetrics" + }, + { + "name": "metricsEnabled" } ], "methods": [ diff --git a/src/native/iot_device_sdk_metrics.c b/src/native/iot_device_sdk_metrics.c new file mode 100644 index 000000000..41b413f5c --- /dev/null +++ b/src/native/iot_device_sdk_metrics.c @@ -0,0 +1,76 @@ +/** + * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. + * SPDX-License-Identifier: Apache-2.0. + */ +#include + +#include "iot_device_sdk_metrics.h" +#include "mqtt5_packets.h" +#include +#include +#include + +static char s_iot_device_sdk_metrics_string[] = "IoTDeviceSDKMetrics"; + +void aws_mqtt_iot_sdk_metrics_java_jni_destroy( + JNIEnv *env, + struct aws_allocator *allocator, + struct aws_mqtt_iot_sdk_metrics_java_jni *java_metrics) { + (void)env; + + if (!java_metrics) { + return; + } + AWS_LOGF_DEBUG(AWS_LS_MQTT_GENERAL, "id=%p: Destroying IoTDeviceSDKMetrics", (void *)java_metrics); + + if (aws_byte_buf_is_valid(&java_metrics->library_name_buf)) { + aws_byte_buf_clean_up(&java_metrics->library_name_buf); + } + + aws_mem_release(allocator, java_metrics); +} + +struct aws_mqtt_iot_sdk_metrics_java_jni *aws_mqtt_iot_sdk_metrics_java_jni_create_from_java( + JNIEnv *env, + struct aws_allocator *allocator, + jobject java_iot_device_sdk_metrics) { + + struct aws_mqtt_iot_sdk_metrics_java_jni *java_metrics = + aws_mem_calloc(allocator, 1, sizeof(struct aws_mqtt_iot_sdk_metrics_java_jni)); + if (java_metrics == NULL) { + AWS_LOGF_ERROR( + AWS_LS_MQTT_GENERAL, "IoTDeviceSDKMetrics create_from_java: Creating new IoTDeviceSDKMetrics failed"); + return NULL; + } + + if (aws_get_string_from_jobject( + env, + java_iot_device_sdk_metrics, + iot_device_sdk_metrics_properties.library_name_field_id, + s_iot_device_sdk_metrics_string, + "library name", + &java_metrics->library_name_buf, + &java_metrics->library_name_cursor, + false, + NULL) == AWS_OP_ERR) { + AWS_LOGF_ERROR(AWS_LS_MQTT_GENERAL, "IoTDeviceSDKMetrics create_from_java: No library name found"); + goto on_error; + } + java_metrics->metrics.library_name = java_metrics->library_name_cursor; + + return java_metrics; + +on_error: + /* Clean up */ + aws_mqtt_iot_sdk_metrics_java_jni_destroy(env, allocator, java_metrics); + return NULL; +} + +struct aws_mqtt_iot_sdk_metrics *aws_mqtt_iot_sdk_metrics_java_jni_get_metrics( + struct aws_mqtt_iot_sdk_metrics_java_jni *java_metrics) { + if (java_metrics) { + return &java_metrics->metrics; + } else { + return NULL; + } +} diff --git a/src/native/iot_device_sdk_metrics.h b/src/native/iot_device_sdk_metrics.h new file mode 100644 index 000000000..06108ebf6 --- /dev/null +++ b/src/native/iot_device_sdk_metrics.h @@ -0,0 +1,31 @@ +/** + * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. + * SPDX-License-Identifier: Apache-2.0. + */ +#ifndef AWS_JNI_IOT_DEVICE_SDK_METRICS_H +#define AWS_JNI_IOT_DEVICE_SDK_METRICS_H + +#include +#include +#include + +struct aws_mqtt_iot_sdk_metrics_java_jni { + struct aws_mqtt_iot_sdk_metrics metrics; + struct aws_byte_buf library_name_buf; + struct aws_byte_cursor library_name_cursor; +}; + +void aws_mqtt_iot_sdk_metrics_java_jni_destroy( + JNIEnv *env, + struct aws_allocator *allocator, + struct aws_mqtt_iot_sdk_metrics_java_jni *java_metrics); + +struct aws_mqtt_iot_sdk_metrics_java_jni *aws_mqtt_iot_sdk_metrics_java_jni_create_from_java( + JNIEnv *env, + struct aws_allocator *allocator, + jobject java_iot_device_sdk_metrics); + +struct aws_mqtt_iot_sdk_metrics *aws_mqtt_iot_sdk_metrics_java_jni_get_metrics( + struct aws_mqtt_iot_sdk_metrics_java_jni *java_metrics); + +#endif /* AWS_JNI_IOT_DEVICE_SDK_METRICS_H */ diff --git a/src/native/java_class_ids.c b/src/native/java_class_ids.c index 97bc76282..e555cad20 100644 --- a/src/native/java_class_ids.c +++ b/src/native/java_class_ids.c @@ -1748,6 +1748,15 @@ static void s_cache_mqtt5_client_options(JNIEnv *env) { "topicAliasingOptions", "Lsoftware/amazon/awssdk/crt/mqtt5/TopicAliasingOptions;"); AWS_FATAL_ASSERT(mqtt5_client_options_properties.topic_aliasing_options_field_id); + mqtt5_client_options_properties.metrics_enabled_field_id = + (*env)->GetFieldID(env, mqtt5_client_options_properties.client_options_class, "metricsEnabled", "Z"); + AWS_FATAL_ASSERT(mqtt5_client_options_properties.metrics_enabled_field_id); + mqtt5_client_options_properties.iot_device_sdk_metrics_field_id = (*env)->GetFieldID( + env, + mqtt5_client_options_properties.client_options_class, + "iotDeviceSDKMetrics", + "Lsoftware/amazon/awssdk/crt/internal/IoTDeviceSDKMetrics;"); + AWS_FATAL_ASSERT(mqtt5_client_options_properties.iot_device_sdk_metrics_field_id); } struct java_aws_mqtt5_topic_aliasing_options_properties mqtt5_topic_aliasing_options_properties; @@ -2635,6 +2644,19 @@ static void s_cache_cognito_credentials_provider(JNIEnv *env) { AWS_FATAL_ASSERT(cognito_credentials_provider_properties.create_chained_future_method_id != NULL); } +struct java_iot_device_sdk_metrics_properties iot_device_sdk_metrics_properties; + +static void s_cache_iot_device_sdk_metrics(JNIEnv *env) { + jclass cls = (*env)->FindClass(env, "software/amazon/awssdk/crt/internal/IoTDeviceSDKMetrics"); + AWS_FATAL_ASSERT(cls); + iot_device_sdk_metrics_properties.iot_device_sdk_metrics_class = (*env)->NewGlobalRef(env, cls); + AWS_FATAL_ASSERT(iot_device_sdk_metrics_properties.iot_device_sdk_metrics_class); + + iot_device_sdk_metrics_properties.library_name_field_id = (*env)->GetFieldID( + env, iot_device_sdk_metrics_properties.iot_device_sdk_metrics_class, "libraryName", "Ljava/lang/String;"); + AWS_FATAL_ASSERT(iot_device_sdk_metrics_properties.library_name_field_id); +} + // Update jni-config.json when adding or modifying JNI classes for GraalVM support. static void s_cache_java_class_ids(void *user_data) { JNIEnv *env = user_data; @@ -2752,6 +2774,7 @@ static void s_cache_java_class_ids(void *user_data) { s_cache_consumer_properties(env); s_cache_cognito_login_token_source(env); s_cache_cognito_credentials_provider(env); + s_cache_iot_device_sdk_metrics(env); } static aws_thread_once s_cache_once_init = AWS_THREAD_ONCE_STATIC_INIT; diff --git a/src/native/java_class_ids.h b/src/native/java_class_ids.h index 3d852b860..6a44aad42 100644 --- a/src/native/java_class_ids.h +++ b/src/native/java_class_ids.h @@ -722,6 +722,8 @@ struct java_aws_mqtt5_client_options_properties { jfieldID publish_events_field_id; jfieldID lifecycle_events_field_id; jfieldID topic_aliasing_options_field_id; + jfieldID metrics_enabled_field_id; + jfieldID iot_device_sdk_metrics_field_id; }; extern struct java_aws_mqtt5_client_options_properties mqtt5_client_options_properties; @@ -1107,6 +1109,13 @@ struct java_cognito_credentials_provider_properties { extern struct java_cognito_credentials_provider_properties cognito_credentials_provider_properties; +/* IoTDeviceSDKMetrics */ +struct java_iot_device_sdk_metrics_properties { + jclass iot_device_sdk_metrics_class; + jfieldID library_name_field_id; +}; +extern struct java_iot_device_sdk_metrics_properties iot_device_sdk_metrics_properties; + /** * All functions bound to JNI MUST call this before doing anything else. * This caches all JNI IDs the first time it is called. Any further calls are no-op; it is thread-safe. diff --git a/src/native/mqtt5_client.c b/src/native/mqtt5_client.c index 2d59c8b26..1cc8f2422 100644 --- a/src/native/mqtt5_client.c +++ b/src/native/mqtt5_client.c @@ -11,6 +11,7 @@ #include #include +#include #include #include #include @@ -1702,6 +1703,7 @@ JNIEXPORT jlong JNICALL Java_software_amazon_awssdk_crt_mqtt5_Mqtt5Client_mqtt5C struct aws_mqtt5_client_options client_options; AWS_ZERO_STRUCT(client_options); struct aws_http_proxy_options_java_jni *java_http_proxy_options = NULL; + struct aws_mqtt_iot_sdk_metrics_java_jni *iot_device_sdk_metrics = NULL; struct aws_byte_buf host_name_buf; /* Needed to track if optionals are set or not */ @@ -2116,6 +2118,29 @@ JNIEXPORT jlong JNICALL Java_software_amazon_awssdk_crt_mqtt5_Mqtt5Client_mqtt5C client_options.client_termination_handler = &s_aws_mqtt5_client_java_termination; client_options.client_termination_handler_user_data = (void *)java_client; + /* Check if metrics are enabled and set metrics value */ + jboolean metrics_enabled = + (*env)->GetBooleanField(env, jni_options, mqtt5_client_options_properties.metrics_enabled_field_id); + if (aws_jni_check_and_clear_exception(env)) { + s_aws_mqtt5_client_log_and_throw_exception( + env, "MQTT5 client new: error getting metrics enabled", AWS_ERROR_INVALID_STATE); + goto clean_up; + } + + if (metrics_enabled) { + jobject jni_iot_device_sdk_metrics = + (*env)->GetObjectField(env, jni_options, mqtt5_client_options_properties.iot_device_sdk_metrics_field_id); + if (aws_jni_check_and_clear_exception(env)) { + s_aws_mqtt5_client_log_and_throw_exception( + env, "MQTT5 client new: error getting IoT device SDK metrics", AWS_ERROR_INVALID_STATE); + goto clean_up; + } + + iot_device_sdk_metrics = + aws_mqtt_iot_sdk_metrics_java_jni_create_from_java(env, allocator, jni_iot_device_sdk_metrics); + client_options.metrics = &iot_device_sdk_metrics->metrics; + } + /* Make the MQTT5 client */ java_client->client = aws_mqtt5_client_new(allocator, &client_options); /* Did we successfully make a client? If not, then throw an exception */ @@ -2133,6 +2158,7 @@ JNIEXPORT jlong JNICALL Java_software_amazon_awssdk_crt_mqtt5_Mqtt5Client_mqtt5C aws_mqtt5_packet_connect_view_java_destroy(env, allocator, connect_options); s_aws_mqtt5_http_proxy_options_java_destroy(env, allocator, java_http_proxy_options); + aws_mqtt_iot_sdk_metrics_java_jni_destroy(env, allocator, iot_device_sdk_metrics); if (aws_byte_buf_is_valid(&host_name_buf)) { aws_byte_buf_clean_up(&host_name_buf); } diff --git a/src/native/mqtt_connection.c b/src/native/mqtt_connection.c index 08819aa27..aa98cd1d2 100644 --- a/src/native/mqtt_connection.c +++ b/src/native/mqtt_connection.c @@ -28,6 +28,7 @@ #include "crt.h" #include "http_request_utils.h" +#include "iot_device_sdk_metrics.h" #include "java_class_ids.h" #include "mqtt5_client_jni.h" #include "mqtt_connection.h" @@ -1111,6 +1112,30 @@ JNIEXPORT void JNICALL Java_software_amazon_awssdk_crt_mqtt_MqttClientConnection } } +JNIEXPORT void JNICALL Java_software_amazon_awssdk_crt_mqtt_MqttClientConnection_mqttClientConnectionSetMetrics( + JNIEnv *env, + jclass jni_class, + jlong jni_connection, + jobject jni_metrics) { + (void)jni_class; + aws_cache_jni_ids(env); + + struct mqtt_jni_connection *connection = (struct mqtt_jni_connection *)jni_connection; + if (!connection) { + aws_jni_throw_runtime_exception(env, "MqttClientConnection.mqtt_set_metrics: Invalid connection"); + return; + } + + struct aws_mqtt_iot_sdk_metrics_java_jni *iot_sdk_metrics_java_jni = + aws_mqtt_iot_sdk_metrics_java_jni_create_from_java(env, aws_jni_get_allocator(), jni_metrics); + + if (aws_mqtt_client_connection_set_metrics(connection->client_connection, &iot_sdk_metrics_java_jni->metrics)) { + aws_jni_throw_runtime_exception(env, "MqttClientConnection.mqtt_set_metrics: Failed to set metrics"); + } + + aws_mqtt_iot_sdk_metrics_java_jni_destroy(env, aws_jni_get_allocator(), iot_sdk_metrics_java_jni); +} + JNIEXPORT void JNICALL Java_software_amazon_awssdk_crt_mqtt_MqttClientConnection_mqttClientConnectionSetReconnectTimeout( JNIEnv *env, diff --git a/src/test/java/software/amazon/awssdk/crt/test/CustomKeyOpsTest.java b/src/test/java/software/amazon/awssdk/crt/test/CustomKeyOpsTest.java index 12da86cf3..a63dfcf5d 100644 --- a/src/test/java/software/amazon/awssdk/crt/test/CustomKeyOpsTest.java +++ b/src/test/java/software/amazon/awssdk/crt/test/CustomKeyOpsTest.java @@ -147,7 +147,8 @@ private void doHappyPathTest() { 8883, null, null, - null); + null, + true); disconnect(); } catch (Exception ex) { throw new RuntimeException(ex); @@ -242,7 +243,8 @@ public void testExceptionFailurePath() { 8883, null, null, - null); + null, + true); } catch (Exception ex) { return; } finally { @@ -265,7 +267,8 @@ private void doExtraCompleteHappyTest() { 8883, null, null, - null); + null, + true); disconnect(); } catch (Exception ex) { throw new RuntimeException(ex); @@ -305,7 +308,8 @@ public void testExceptionExtraCompleteFailurePath() { 8883, null, null, - null); + null, + true); } catch (Exception ex) { return; } finally { diff --git a/src/test/java/software/amazon/awssdk/crt/test/IotServiceTest.java b/src/test/java/software/amazon/awssdk/crt/test/IotServiceTest.java index 91264fa4c..1f032927a 100644 --- a/src/test/java/software/amazon/awssdk/crt/test/IotServiceTest.java +++ b/src/test/java/software/amazon/awssdk/crt/test/IotServiceTest.java @@ -43,7 +43,8 @@ private void doIotServiceTest() { port, null, null, - null); + null, + true); CompletableFuture subscribed = connection.subscribe(TEST_TOPIC, QualityOfService.AT_LEAST_ONCE, messageHandler); subscribed.thenApply(packetId -> subsAcked++); diff --git a/src/test/java/software/amazon/awssdk/crt/test/Mqtt5ClientTest.java b/src/test/java/software/amazon/awssdk/crt/test/Mqtt5ClientTest.java index 06d81e503..e8786f0f4 100644 --- a/src/test/java/software/amazon/awssdk/crt/test/Mqtt5ClientTest.java +++ b/src/test/java/software/amazon/awssdk/crt/test/Mqtt5ClientTest.java @@ -264,7 +264,8 @@ public void onMessageReceived(Mqtt5Client client, PublishReturn publishReturn) { }) .withRetryJitterMode(JitterMode.Default) .withSessionBehavior(ClientSessionBehavior.CLEAN) - .withSocketOptions(socketOptions); + .withSocketOptions(socketOptions) + .withMetricsEnabled(false); // Skip websocket and TLS options - those are all different tests HttpProxyOptions proxyOptions = new HttpProxyOptions(); @@ -330,6 +331,7 @@ private void doConnDC_UC2Test() { AWS_TEST_MQTT5_DIRECT_MQTT_BASIC_AUTH_HOST, Long.parseLong(AWS_TEST_MQTT5_DIRECT_MQTT_BASIC_AUTH_PORT)); builder.withLifecycleEvents(events); + builder.withMetricsEnabled(false); ConnectPacketBuilder connectOptions = new ConnectPacketBuilder(); connectOptions.withUsername(AWS_TEST_MQTT5_BASIC_AUTH_USERNAME).withPassword(AWS_TEST_MQTT5_BASIC_AUTH_PASSWORD.getBytes()); @@ -510,7 +512,8 @@ public void onMessageReceived(Mqtt5Client client, PublishReturn publishReturn) { }) .withRetryJitterMode(JitterMode.Default) .withSessionBehavior(ClientSessionBehavior.CLEAN) - .withSocketOptions(socketOptions); + .withSocketOptions(socketOptions) + .withMetricsEnabled(false); // Skip websocket, proxy options, and TLS options - those are all different tests try (Mqtt5Client client = new Mqtt5Client(builder.build())) { @@ -605,6 +608,7 @@ public void accept(Mqtt5WebsocketHandshakeTransformArgs t) { ConnectPacketBuilder connectOptions = new ConnectPacketBuilder(); connectOptions.withUsername(AWS_TEST_MQTT5_BASIC_AUTH_USERNAME).withPassword(AWS_TEST_MQTT5_BASIC_AUTH_PASSWORD.getBytes()); builder.withConnectOptions(connectOptions.build()); + builder.withMetricsEnabled(false); try (Mqtt5Client client = new Mqtt5Client(builder.build())) { client.start(); @@ -772,7 +776,8 @@ public void onMessageReceived(Mqtt5Client client, PublishReturn publishReturn) { }) .withRetryJitterMode(JitterMode.Default) .withSessionBehavior(ClientSessionBehavior.CLEAN) - .withSocketOptions(socketOptions); + .withSocketOptions(socketOptions) + .withMetricsEnabled(false); Consumer websocketTransform = new Consumer() { @Override diff --git a/src/test/java/software/amazon/awssdk/crt/test/Mqtt5to3AdapterConnectionTest.java b/src/test/java/software/amazon/awssdk/crt/test/Mqtt5to3AdapterConnectionTest.java index a94f8e63e..b69b9badf 100644 --- a/src/test/java/software/amazon/awssdk/crt/test/Mqtt5to3AdapterConnectionTest.java +++ b/src/test/java/software/amazon/awssdk/crt/test/Mqtt5to3AdapterConnectionTest.java @@ -303,7 +303,8 @@ public void TestBasicAuthConnectThroughMqtt5() { connectOptions.withUsername(AWS_TEST_MQTT5_BASIC_AUTH_USERNAME) .withPassword(AWS_TEST_MQTT5_BASIC_AUTH_PASSWORD.getBytes()) .withClientId("test/MQTT5to3Adapter" + UUID.randomUUID().toString()); - builder.withConnectOptions(connectOptions.build()); + builder.withConnectOptions(connectOptions.build()) + .withMetricsEnabled(false); try (Mqtt5Client client = new Mqtt5Client(builder.build()); MqttClientConnection connection = new MqttClientConnection(client, null);) { @@ -496,6 +497,7 @@ public void TestBasicAuthConnectThroughMqtt311() { AWS_TEST_MQTT5_DIRECT_MQTT_BASIC_AUTH_HOST, Long.parseLong(AWS_TEST_MQTT5_DIRECT_MQTT_BASIC_AUTH_PORT)); builder.withLifecycleEvents(events); + builder.withMetricsEnabled(false); ConnectPacketBuilder connectOptions = new ConnectPacketBuilder(); connectOptions.withUsername(AWS_TEST_MQTT5_BASIC_AUTH_USERNAME) diff --git a/src/test/java/software/amazon/awssdk/crt/test/MqttClientConnectionFixture.java b/src/test/java/software/amazon/awssdk/crt/test/MqttClientConnectionFixture.java index 34933d98e..9b8969eee 100644 --- a/src/test/java/software/amazon/awssdk/crt/test/MqttClientConnectionFixture.java +++ b/src/test/java/software/amazon/awssdk/crt/test/MqttClientConnectionFixture.java @@ -181,7 +181,8 @@ MqttClientConnection createMqttClientConnection(TlsContext tlsContext, int port, String username, String password, - HttpProxyOptions httpProxyOptions) throws Exception { + HttpProxyOptions httpProxyOptions, + boolean metricsEnabled) throws Exception { try (EventLoopGroup elg = new EventLoopGroup(1); HostResolver hr = new HostResolver(elg); ClientBootstrap bootstrap = new ClientBootstrap(elg, hr)) { @@ -238,6 +239,7 @@ public void onConnectionClosed(OnConnectionClosedReturn data) { config.setKeepAliveSecs(0); config.setProtocolOperationTimeoutMs(60000); config.setConnectionCallbacks(events); + config.setMetricsEnabled(metricsEnabled); if (httpProxyOptions != null) { config.setHttpProxyOptions(httpProxyOptions); @@ -264,14 +266,14 @@ public void onConnectionClosed(OnConnectionClosedReturn data) { } } - void connectDirect(TlsContext tlsContext, String endpoint, int port, String username, String password, HttpProxyOptions httpProxyOptions) throws Exception { + void connectDirect(TlsContext tlsContext, String endpoint, int port, String username, String password, HttpProxyOptions httpProxyOptions, boolean metricsEnabled) throws Exception { reset(); - MqttClientConnection connection = createMqttClientConnection(tlsContext, endpoint, port, username, password, httpProxyOptions); + MqttClientConnection connection = createMqttClientConnection(tlsContext, endpoint, port, username, password, httpProxyOptions, metricsEnabled); CompletableFuture connected = connection.connect(); connected.get(30, TimeUnit.SECONDS); } - void connectWebsockets(CredentialsProvider credentialsProvider, String endpoint, int port, TlsContext tlsContext, String username, String password, HttpProxyOptions httpProxyOptions) throws Exception + void connectWebsockets(CredentialsProvider credentialsProvider, String endpoint, int port, TlsContext tlsContext, String username, String password, HttpProxyOptions httpProxyOptions, boolean metricsEnabled) throws Exception { String clientId = TEST_CLIENTID + (UUID.randomUUID()).toString(); @@ -322,6 +324,7 @@ public void onConnectionClosed(OnConnectionClosedReturn data) { config.setPort(port); config.setUseWebsockets(true); config.setConnectionCallbacks(events); + config.setMetricsEnabled(metricsEnabled); if (username != null) { config.setUsername(username); diff --git a/src/test/java/software/amazon/awssdk/crt/test/MqttClientConnectionMethodTest.java b/src/test/java/software/amazon/awssdk/crt/test/MqttClientConnectionMethodTest.java index c10cc1e95..f767de7fe 100644 --- a/src/test/java/software/amazon/awssdk/crt/test/MqttClientConnectionMethodTest.java +++ b/src/test/java/software/amazon/awssdk/crt/test/MqttClientConnectionMethodTest.java @@ -60,7 +60,8 @@ private void doConnDC_Cred_UC1Test() { 8883, null, null, - null); + null, + true); disconnect(); } finally { close(); @@ -95,7 +96,8 @@ private void doConnDC_Cred_UC2Test() { 8883, null, null, - null); + null, + true); disconnect(); } catch (Exception ex) { throw new RuntimeException(ex); @@ -127,7 +129,8 @@ private void doConnDC_Cred_UC3Test() { 8883, null, null, - null); + null, + true); disconnect(); } catch (Exception ex) { throw new RuntimeException(ex); @@ -167,7 +170,8 @@ private void doConnDC_Cred_UC4Test() { 8883, null, null, - null); + null, + true); disconnect(); } catch (Exception ex) { throw new RuntimeException(ex); @@ -205,7 +209,7 @@ private void doWebsocketIotCoreConnectionTest(Function connected = connection.connect(); assertThrows(Exception.class, () -> connected.get(30, TimeUnit.SECONDS)); diff --git a/src/test/java/software/amazon/awssdk/crt/test/PublishTest.java b/src/test/java/software/amazon/awssdk/crt/test/PublishTest.java index b4104dbdd..e863688ab 100644 --- a/src/test/java/software/amazon/awssdk/crt/test/PublishTest.java +++ b/src/test/java/software/amazon/awssdk/crt/test/PublishTest.java @@ -98,7 +98,8 @@ private void doRoundTripTest() { 8883, null, null, - null); + null, + true); subscribe(); publishAndCheck(TEST_PAYLOAD.getBytes()); disconnect(); @@ -130,7 +131,8 @@ private void doEmptyRoundTripTest() { 8883, null, null, - null); + null, + true); subscribe(); publishAndCheck(EMPTY_PAYLOAD.getBytes()); disconnect(); @@ -162,7 +164,8 @@ private void doNullRoundTripTest() { 8883, null, null, - null); + null, + true); subscribe(); publishAndCheck(null); disconnect(); diff --git a/src/test/java/software/amazon/awssdk/crt/test/SelfPubSubTest.java b/src/test/java/software/amazon/awssdk/crt/test/SelfPubSubTest.java index db03ad827..342747de0 100644 --- a/src/test/java/software/amazon/awssdk/crt/test/SelfPubSubTest.java +++ b/src/test/java/software/amazon/awssdk/crt/test/SelfPubSubTest.java @@ -49,7 +49,8 @@ private void doPubSubTest() { 8883, null, null, - null); + null, + true); CompletableFuture receivedFuture = new CompletableFuture<>(); Consumer messageHandler = (message) -> { @@ -128,7 +129,8 @@ private void doPubSubOnMessageTest() { 8883, null, null, - null); + null, + true); CompletableFuture subscribed = connection.subscribe(TEST_TOPIC, QualityOfService.AT_LEAST_ONCE); diff --git a/src/test/java/software/amazon/awssdk/crt/test/SubscribeTest.java b/src/test/java/software/amazon/awssdk/crt/test/SubscribeTest.java index e48233649..2c774c7f4 100644 --- a/src/test/java/software/amazon/awssdk/crt/test/SubscribeTest.java +++ b/src/test/java/software/amazon/awssdk/crt/test/SubscribeTest.java @@ -49,7 +49,8 @@ private void doSubscribeUnsubscribeTest() { 8883, null, null, - null); + null, + true); Consumer messageHandler = (message) -> {}; CompletableFuture subscribed = connection.subscribe(TEST_TOPIC, QualityOfService.AT_LEAST_ONCE, diff --git a/src/test/java/software/amazon/awssdk/crt/test/WillTest.java b/src/test/java/software/amazon/awssdk/crt/test/WillTest.java index 059c1707d..cde308eef 100644 --- a/src/test/java/software/amazon/awssdk/crt/test/WillTest.java +++ b/src/test/java/software/amazon/awssdk/crt/test/WillTest.java @@ -50,7 +50,8 @@ private void doWillTest() { 8883, null, null, - null); + null, + true); disconnect(); } catch (Exception ex) { throw new RuntimeException(ex); @@ -83,7 +84,8 @@ private void doEmptyWillTest() { 8883, null, null, - null); + null, + true); disconnect(); } catch (Exception ex) { throw new RuntimeException(ex); @@ -116,7 +118,8 @@ private void doNullWillTest() { 8883, null, null, - null); + null, + true); disconnect(); } catch (Exception ex) { throw new RuntimeException(ex);