Skip to content

Commit 828a214

Browse files
authored
Adding Platform identification (#1004)
1 parent 1020534 commit 828a214

12 files changed

Lines changed: 212 additions & 150 deletions

File tree

src/main/java/software/amazon/awssdk/crt/iot/IoTDeviceSDKMetrics.java renamed to src/main/java/software/amazon/awssdk/crt/iot/AWSIoTMetrics.java

Lines changed: 33 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -25,10 +25,14 @@
2525
* Holds library identification and metadata entries that are appended
2626
* to the MQTT CONNECT packet username field.
2727
*/
28-
public class IoTDeviceSDKMetrics {
28+
public class AWSIoTMetrics {
2929
private String libraryName;
3030
private List<IoTMetricsMetadata> metadataEntries;
3131

32+
// Library name constants
33+
private static final String SDK_LIBRARY_NAME_JAVA = "IoTDeviceSDK/Java";
34+
private static final String SDK_LIBRARY_NAME_ANDROID = "IoTDeviceSDK/Android";
35+
3236
// Feature ID constants
3337
private static final String RETRY_JITTER_MODE = "A";
3438
private static final String SESSION_BEHAVIOR = "B";
@@ -44,12 +48,12 @@ public class IoTDeviceSDKMetrics {
4448

4549
public static final int IOT_SDK_METRICS_FEATURE_VERSION = 1;
4650

47-
public IoTDeviceSDKMetrics() {
48-
this.libraryName = "IoTDeviceSDK/Java";
51+
public AWSIoTMetrics() {
52+
this.libraryName = getDefaultLibraryName();
4953
this.metadataEntries = new ArrayList<>();
5054
}
5155

52-
public IoTDeviceSDKMetrics(String libraryName, List<IoTMetricsMetadata> metadataEntries) {
56+
public AWSIoTMetrics(String libraryName, List<IoTMetricsMetadata> metadataEntries) {
5357
this.libraryName = libraryName;
5458
this.metadataEntries = metadataEntries;
5559
}
@@ -71,7 +75,7 @@ public IoTDeviceSDKMetrics(String libraryName, List<IoTMetricsMetadata> metadata
7175
* @param clientOptions MQTT5 client options containing connection configuration and user metrics
7276
* @return the merged metrics object ready to be passed to JNI
7377
*/
74-
public static IoTDeviceSDKMetrics createMetricsMqtt5(Mqtt5ClientOptions clientOptions) {
78+
public static AWSIoTMetrics createMetricsMqtt5(Mqtt5ClientOptions clientOptions) {
7579
String crtFeatureList = getEncodedFeatureListMqtt5(clientOptions);
7680
return createMetrics(clientOptions.getUserMetrics(), crtFeatureList);
7781
}
@@ -85,7 +89,7 @@ public static IoTDeviceSDKMetrics createMetricsMqtt5(Mqtt5ClientOptions clientOp
8589
* @param config the MQTT3 connection configuration containing proxy, TLS, and user metrics
8690
* @return the merged metrics object ready to be passed to JNI
8791
*/
88-
public static IoTDeviceSDKMetrics createMetricsMqtt3(MqttConnectionConfig config) {
92+
public static AWSIoTMetrics createMetricsMqtt3(MqttConnectionConfig config) {
8993
String crtFeatureList = getEncodedFeatureListMqtt3(config);
9094
return createMetrics(config.getMetrics(), crtFeatureList);
9195
}
@@ -250,8 +254,8 @@ private static String mergeFeatureLists(String crtFeatures, String userFeatures)
250254
* @param crtFeatureList encoded CRT feature list string
251255
* @return the final metrics object
252256
*/
253-
private static IoTDeviceSDKMetrics createMetrics(IoTDeviceSDKMetrics userMetrics, String crtFeatureList) {
254-
String libraryName = (userMetrics != null) ? userMetrics.getLibraryName() : "IoTDeviceSDK/Java";
257+
private static AWSIoTMetrics createMetrics(AWSIoTMetrics userMetrics, String crtFeatureList) {
258+
String libraryName = (userMetrics != null) ? userMetrics.getLibraryName() : getDefaultLibraryName();
255259

256260
String crtVersion = new PackageInfo().version.toString();
257261
LinkedHashMap<String, String> metadata = new LinkedHashMap<>();
@@ -285,7 +289,7 @@ private static IoTDeviceSDKMetrics createMetrics(IoTDeviceSDKMetrics userMetrics
285289
entries.add(new IoTMetricsMetadata(entry.getKey(), entry.getValue()));
286290
}
287291

288-
return new IoTDeviceSDKMetrics(libraryName, entries);
292+
return new AWSIoTMetrics(libraryName, entries);
289293
}
290294

291295
private static void parseFeatures(String featureStr, Map<String, String> map) {
@@ -306,6 +310,26 @@ private static String protocolVersionValue(boolean isMqtt5) {
306310
return isMqtt5 ? "5" : "3";
307311
}
308312

313+
/**
314+
* Returns the default SDK library name for this platform.
315+
*
316+
* <p>Returns {@code "IoTDeviceSDK/Android"} when running on Android,
317+
* {@code "IoTDeviceSDK/Java"} otherwise. Defaults to
318+
* {@code "IoTDeviceSDK/Java"} if OS detection fails.
319+
*
320+
* @return the platform-appropriate default library name
321+
*/
322+
private static String getDefaultLibraryName() {
323+
try {
324+
if ("android".equals(CRT.getOSIdentifier())) {
325+
return SDK_LIBRARY_NAME_ANDROID;
326+
}
327+
} catch (Exception e) {
328+
// fall through to default
329+
}
330+
return SDK_LIBRARY_NAME_JAVA;
331+
}
332+
309333
/**
310334
* @return {@code "B"} on Windows (IOCP), {@code "A"} otherwise (POSIX). Defaults to {@code "A"} if OS detection fails.
311335
*/

src/main/java/software/amazon/awssdk/crt/mqtt/MqttClientConnection.java

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,7 @@
1717
import software.amazon.awssdk.crt.mqtt5.Mqtt5Client;
1818
import software.amazon.awssdk.crt.mqtt5.Mqtt5ClientOptions;
1919
import software.amazon.awssdk.crt.mqtt5.packets.ConnectPacket;
20-
import software.amazon.awssdk.crt.iot.IoTDeviceSDKMetrics;
20+
import software.amazon.awssdk.crt.iot.AWSIoTMetrics;
2121

2222
import java.util.concurrent.CompletableFuture;
2323
import java.util.function.Consumer;
@@ -165,7 +165,7 @@ private void SetupConfig(MqttConnectionConfig config) throws MqttException {
165165
}
166166

167167
if (!config.getDisableMetrics()) {
168-
IoTDeviceSDKMetrics metrics = IoTDeviceSDKMetrics.createMetricsMqtt3(config);
168+
AWSIoTMetrics metrics = AWSIoTMetrics.createMetricsMqtt3(config);
169169
mqttClientConnectionSetMetrics(getNativeHandle(), metrics);
170170
}
171171

@@ -509,7 +509,7 @@ private static native boolean mqttClientConnectionSetWill(long connection, Strin
509509
private static native void mqttClientConnectionSetLogin(long connection, String username, String password)
510510
throws CrtRuntimeException;
511511

512-
private static native void mqttClientConnectionSetMetrics(long connection, IoTDeviceSDKMetrics metrics)
512+
private static native void mqttClientConnectionSetMetrics(long connection, AWSIoTMetrics metrics)
513513
throws CrtRuntimeException;
514514

515515
private static native void mqttClientConnectionSetReconnectTimeout(long connection, long minTimeout,

src/main/java/software/amazon/awssdk/crt/mqtt/MqttConnectionConfig.java

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,7 @@
99

1010
import software.amazon.awssdk.crt.CrtResource;
1111
import software.amazon.awssdk.crt.http.HttpProxyOptions;
12-
import software.amazon.awssdk.crt.iot.IoTDeviceSDKMetrics;
12+
import software.amazon.awssdk.crt.iot.AWSIoTMetrics;
1313
import software.amazon.awssdk.crt.io.ClientTlsContext;
1414
import software.amazon.awssdk.crt.io.SocketOptions;
1515
import software.amazon.awssdk.crt.mqtt5.Mqtt5Client;
@@ -51,7 +51,7 @@ public final class MqttConnectionConfig extends CrtResource {
5151

5252
/* metrics */
5353
private boolean disableMetrics = false;
54-
private IoTDeviceSDKMetrics metrics = null;
54+
private AWSIoTMetrics metrics = null;
5555

5656
public MqttConnectionConfig() {}
5757

@@ -570,7 +570,7 @@ public boolean getDisableMetrics() {
570570
*
571571
* @param metrics metrics configuration from the IoT SDK layer
572572
*/
573-
public void setMetrics(IoTDeviceSDKMetrics metrics) {
573+
public void setMetrics(AWSIoTMetrics metrics) {
574574
this.metrics = metrics;
575575
}
576576

@@ -579,7 +579,7 @@ public void setMetrics(IoTDeviceSDKMetrics metrics) {
579579
*
580580
* @return metrics configuration, or null if not set
581581
*/
582-
public IoTDeviceSDKMetrics getMetrics() {
582+
public AWSIoTMetrics getMetrics() {
583583
return metrics;
584584
}
585585

src/main/java/software/amazon/awssdk/crt/mqtt5/Mqtt5ClientOptions.java

Lines changed: 8 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,7 @@
1212

1313
import software.amazon.awssdk.crt.mqtt5.packets.ConnectPacket;
1414
import software.amazon.awssdk.crt.mqtt.MqttConnectionConfig;
15-
import software.amazon.awssdk.crt.iot.IoTDeviceSDKMetrics;
15+
import software.amazon.awssdk.crt.iot.AWSIoTMetrics;
1616

1717
import java.util.Map;
1818
import java.util.function.Function;
@@ -49,8 +49,8 @@ public class Mqtt5ClientOptions {
4949
// Opt-out flag for AWS IoT Metrics. When true, metrics are disabled.
5050
// Default is false (metrics enabled).
5151
private boolean disableMetrics = false;
52-
private IoTDeviceSDKMetrics userMetrics;
53-
private IoTDeviceSDKMetrics iotDeviceSDKMetrics;
52+
private AWSIoTMetrics userMetrics;
53+
private AWSIoTMetrics awsIoTMetrics;
5454

5555

5656
/**
@@ -284,7 +284,7 @@ public boolean getDisableMetrics() {
284284
*
285285
* @return the user metrics, or null if none were provided
286286
*/
287-
public IoTDeviceSDKMetrics getUserMetrics() {
287+
public AWSIoTMetrics getUserMetrics() {
288288
return this.userMetrics;
289289
}
290290

@@ -327,9 +327,9 @@ public Mqtt5ClientOptions(Mqtt5ClientOptionsBuilder builder) {
327327
this.disableMetrics = builder.disableMetrics;
328328
this.userMetrics = builder.metrics;
329329
if (this.disableMetrics) {
330-
this.iotDeviceSDKMetrics = null;
330+
this.awsIoTMetrics = null;
331331
} else {
332-
this.iotDeviceSDKMetrics = IoTDeviceSDKMetrics.createMetricsMqtt5(this);
332+
this.awsIoTMetrics = AWSIoTMetrics.createMetricsMqtt5(this);
333333
}
334334
}
335335

@@ -634,7 +634,7 @@ static final public class Mqtt5ClientOptionsBuilder {
634634
private PublishEvents publishEvents;
635635
private TopicAliasingOptions topicAliasingOptions;
636636
private boolean disableMetrics = false;
637-
private IoTDeviceSDKMetrics metrics = null;
637+
private AWSIoTMetrics metrics = null;
638638

639639
/**
640640
* Sets the host name of the MQTT server to connect to.
@@ -921,7 +921,7 @@ public Mqtt5ClientOptionsBuilder withDisableMetrics(boolean disableMetrics) {
921921
* @param metrics metrics configuration from the IoT SDK layer
922922
* @return The Mqtt5ClientOptionsBuilder after setting the metrics
923923
*/
924-
public Mqtt5ClientOptionsBuilder withMetrics(IoTDeviceSDKMetrics metrics) {
924+
public Mqtt5ClientOptionsBuilder withMetrics(AWSIoTMetrics metrics) {
925925
this.metrics = metrics;
926926
return this;
927927
}

src/main/resources/META-INF/native-image/software.amazon.awssdk/crt/aws-crt/jni-config.json

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1268,7 +1268,7 @@
12681268
]
12691269
},
12701270
{
1271-
"name": "software.amazon.awssdk.crt.iot.IoTDeviceSDKMetrics",
1271+
"name": "software.amazon.awssdk.crt.iot.AWSIoTMetrics",
12721272
"fields": [
12731273
{
12741274
"name": "libraryName"
@@ -1341,7 +1341,7 @@
13411341
"name": "topicAliasingOptions"
13421342
},
13431343
{
1344-
"name": "iotDeviceSDKMetrics"
1344+
"name": "awsIoTMetrics"
13451345
},
13461346
{
13471347
"name": "disableMetrics"
Lines changed: 20 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -6,20 +6,20 @@
66
/**
77
* JNI bridge for IoT Device SDK Metrics.
88
*
9-
* Converts a Java IoTDeviceSDKMetrics object (library name + metadata key-value
9+
* Converts a Java AWSIoTMetrics object (library name + metadata key-value
1010
* entries) into a native aws_mqtt_iot_metrics struct that the C MQTT layer uses
1111
* to append SDK telemetry to the CONNECT packet username field.
1212
*
1313
*/
1414
#include <jni.h>
1515

16-
#include "iot_device_sdk_metrics.h"
16+
#include "aws_iot_metrics.h"
1717
#include "mqtt5_packets.h"
1818
#include <aws/mqtt/mqtt.h>
1919
#include <crt.h>
2020
#include <java_class_ids.h>
2121

22-
static char s_iot_device_sdk_metrics_string[] = "IoTDeviceSDKMetrics";
22+
static char s_aws_iot_metrics_string[] = "AWSIoTMetrics";
2323

2424
/* Frees all native memory associated with a parsed metrics struct. */
2525
void aws_mqtt_iot_metrics_java_jni_destroy(
@@ -31,7 +31,7 @@ void aws_mqtt_iot_metrics_java_jni_destroy(
3131
if (!java_metrics) {
3232
return;
3333
}
34-
AWS_LOGF_DEBUG(AWS_LS_MQTT_GENERAL, "id=%p: Destroying IoTDeviceSDKMetrics", (void *)java_metrics);
34+
AWS_LOGF_DEBUG(AWS_LS_MQTT_GENERAL, "id=%p: Destroying AWSIoTMetrics", (void *)java_metrics);
3535

3636
/* Free the library name buffer */
3737
if (aws_byte_buf_is_valid(&java_metrics->library_name_buf)) {
@@ -58,19 +58,19 @@ void aws_mqtt_iot_metrics_java_jni_destroy(
5858
aws_mem_release(allocator, java_metrics);
5959
}
6060

61-
/* Parses a Java IoTDeviceSDKMetrics object into a native metrics struct for the C MQTT layer. */
61+
/* Parses a Java AWSIoTMetrics object into a native metrics struct for the C MQTT layer. */
6262
struct aws_mqtt_iot_metrics_java_jni *aws_mqtt_iot_metrics_java_jni_create_from_java(
6363
JNIEnv *env,
6464
struct aws_allocator *allocator,
65-
jobject java_iot_device_sdk_metrics) {
65+
jobject java_aws_iot_metrics) {
6666

6767
jobject metadata_list = NULL;
6868

6969
/* Zero-initialize so all fields are safe for cleanup on any error path */
7070
struct aws_mqtt_iot_metrics_java_jni *java_metrics =
7171
aws_mem_calloc(allocator, 1, sizeof(struct aws_mqtt_iot_metrics_java_jni));
7272

73-
AWS_LOGF_DEBUG(AWS_LS_MQTT_GENERAL, "id=%p: Creating IoTDeviceSDKMetrics from Java object", (void *)java_metrics);
73+
AWS_LOGF_DEBUG(AWS_LS_MQTT_GENERAL, "id=%p: Creating AWSIoTMetrics from Java object", (void *)java_metrics);
7474

7575
/*
7676
* Extract the library name (e.g. "IoTDeviceSDK/Java").
@@ -79,25 +79,25 @@ struct aws_mqtt_iot_metrics_java_jni *aws_mqtt_iot_metrics_java_jni_create_from_
7979
*/
8080
if (aws_get_string_from_jobject(
8181
env,
82-
java_iot_device_sdk_metrics,
83-
iot_device_sdk_metrics_properties.library_name_field_id,
84-
s_iot_device_sdk_metrics_string,
82+
java_aws_iot_metrics,
83+
aws_iot_metrics_properties.library_name_field_id,
84+
s_aws_iot_metrics_string,
8585
"library name",
8686
&java_metrics->library_name_buf,
8787
&java_metrics->metrics.library_name,
8888
false,
8989
NULL) == AWS_OP_ERR) {
90-
AWS_LOGF_ERROR(AWS_LS_MQTT_GENERAL, "IoTDeviceSDKMetrics create_from_java: No library name found");
90+
AWS_LOGF_ERROR(AWS_LS_MQTT_GENERAL, "AWSIoTMetrics create_from_java: No library name found");
9191
goto on_error;
9292
}
9393

9494
/* Read the Java List<IoTMetricsMetadata> field */
95-
metadata_list = (*env)->GetObjectField(
96-
env, java_iot_device_sdk_metrics, iot_device_sdk_metrics_properties.metadata_entries_field_id);
95+
metadata_list =
96+
(*env)->GetObjectField(env, java_aws_iot_metrics, aws_iot_metrics_properties.metadata_entries_field_id);
9797

9898
/* Null list is valid — return metrics with just library name */
9999
if (metadata_list == NULL || aws_jni_check_and_clear_exception(env)) {
100-
AWS_LOGF_DEBUG(AWS_LS_MQTT_GENERAL, "id=%p: IoTDeviceSDKMetrics no metadata entries", (void *)java_metrics);
100+
AWS_LOGF_DEBUG(AWS_LS_MQTT_GENERAL, "id=%p: AWSIoTMetrics no metadata entries", (void *)java_metrics);
101101
return java_metrics;
102102
}
103103

@@ -106,7 +106,7 @@ struct aws_mqtt_iot_metrics_java_jni *aws_mqtt_iot_metrics_java_jni_create_from_
106106

107107
/* Empty list is valid — return metrics with just library name */
108108
if (aws_jni_check_and_clear_exception(env) || count <= 0) {
109-
AWS_LOGF_DEBUG(AWS_LS_MQTT_GENERAL, "id=%p: IoTDeviceSDKMetrics metadata list empty", (void *)java_metrics);
109+
AWS_LOGF_DEBUG(AWS_LS_MQTT_GENERAL, "id=%p: AWSIoTMetrics metadata list empty", (void *)java_metrics);
110110
(*env)->DeleteLocalRef(env, metadata_list);
111111
return java_metrics;
112112
}
@@ -127,15 +127,15 @@ struct aws_mqtt_iot_metrics_java_jni *aws_mqtt_iot_metrics_java_jni_create_from_
127127
/* Call List.get(i) to get the IoTMetricsMetadata object */
128128
jobject entry = (*env)->CallObjectMethod(env, metadata_list, boxed_list_properties.list_get_id, i);
129129
if (!entry || aws_jni_check_and_clear_exception(env)) {
130-
AWS_LOGF_ERROR(AWS_LS_MQTT_GENERAL, "IoTDeviceSDKMetrics: failed to get entry at index %d", (int)i);
130+
AWS_LOGF_ERROR(AWS_LS_MQTT_GENERAL, "AWSIoTMetrics: failed to get entry at index %d", (int)i);
131131
(*env)->DeleteLocalRef(env, entry);
132132
goto on_error;
133133
}
134134

135135
/* Read the key field. Empty string is allowed; null Java field is not. */
136136
jstring key_jstr = (jstring)(*env)->GetObjectField(env, entry, iot_metrics_metadata_properties.key_field_id);
137137
if (aws_jni_check_and_clear_exception(env) || !key_jstr) {
138-
AWS_LOGF_ERROR(AWS_LS_MQTT_GENERAL, "IoTDeviceSDKMetrics: exception or null key at index %d", (int)i);
138+
AWS_LOGF_ERROR(AWS_LS_MQTT_GENERAL, "AWSIoTMetrics: exception or null key at index %d", (int)i);
139139
(*env)->DeleteLocalRef(env, key_jstr);
140140
(*env)->DeleteLocalRef(env, entry);
141141
goto on_error;
@@ -145,7 +145,7 @@ struct aws_mqtt_iot_metrics_java_jni *aws_mqtt_iot_metrics_java_jni_create_from_
145145
jstring value_jstr =
146146
(jstring)(*env)->GetObjectField(env, entry, iot_metrics_metadata_properties.value_field_id);
147147
if (aws_jni_check_and_clear_exception(env) || !value_jstr) {
148-
AWS_LOGF_ERROR(AWS_LS_MQTT_GENERAL, "IoTDeviceSDKMetrics: exception or null value at index %d", (int)i);
148+
AWS_LOGF_ERROR(AWS_LS_MQTT_GENERAL, "AWSIoTMetrics: exception or null value at index %d", (int)i);
149149
(*env)->DeleteLocalRef(env, key_jstr);
150150
(*env)->DeleteLocalRef(env, value_jstr);
151151
(*env)->DeleteLocalRef(env, entry);
@@ -179,7 +179,7 @@ struct aws_mqtt_iot_metrics_java_jni *aws_mqtt_iot_metrics_java_jni_create_from_
179179

180180
AWS_LOGF_DEBUG(
181181
AWS_LS_MQTT_GENERAL,
182-
"IoTDeviceSDKMetrics: metadata[%d] key=\"" PRInSTR "\" value=\"" PRInSTR "\"",
182+
"AWSIoTMetrics: metadata[%d] key=\"" PRInSTR "\" value=\"" PRInSTR "\"",
183183
(int)i,
184184
AWS_BYTE_CURSOR_PRI(java_metrics->metadata_entries[i].key),
185185
AWS_BYTE_CURSOR_PRI(java_metrics->metadata_entries[i].value));
@@ -195,7 +195,7 @@ struct aws_mqtt_iot_metrics_java_jni *aws_mqtt_iot_metrics_java_jni_create_from_
195195

196196
AWS_LOGF_DEBUG(
197197
AWS_LS_MQTT_GENERAL,
198-
"id=%p: IoTDeviceSDKMetrics creation complete, %d metadata entries",
198+
"id=%p: AWSIoTMetrics creation complete, %d metadata entries",
199199
(void *)java_metrics,
200200
(int)count);
201201

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -2,8 +2,8 @@
22
* Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.
33
* SPDX-License-Identifier: Apache-2.0.
44
*/
5-
#ifndef AWS_JNI_IOT_DEVICE_SDK_METRICS_H
6-
#define AWS_JNI_IOT_DEVICE_SDK_METRICS_H
5+
#ifndef AWS_JNI_AWS_IOT_METRICS_H
6+
#define AWS_JNI_AWS_IOT_METRICS_H
77

88
#include <aws/mqtt/mqtt.h>
99
#include <crt.h>
@@ -25,6 +25,6 @@ void aws_mqtt_iot_metrics_java_jni_destroy(
2525
struct aws_mqtt_iot_metrics_java_jni *aws_mqtt_iot_metrics_java_jni_create_from_java(
2626
JNIEnv *env,
2727
struct aws_allocator *allocator,
28-
jobject java_iot_device_sdk_metrics);
28+
jobject java_aws_iot_metrics);
2929

30-
#endif /* AWS_JNI_IOT_DEVICE_SDK_METRICS_H */
30+
#endif /* AWS_JNI_AWS_IOT_METRICS_H */

0 commit comments

Comments
 (0)