From 1bc3880470161680b5567b1e6b33ee636e2e9fdf Mon Sep 17 00:00:00 2001 From: Kushagra Thapar Date: Fri, 29 May 2020 11:15:07 -0700 Subject: [PATCH 1/2] Added SDK version to CosmosException and unit tests --- .../src/main/java/com/azure/cosmos/CosmosException.java | 4 +++- .../test/java/com/azure/cosmos/CosmosExceptionTest.java | 8 ++++++++ 2 files changed, 11 insertions(+), 1 deletion(-) diff --git a/sdk/cosmos/azure-cosmos/src/main/java/com/azure/cosmos/CosmosException.java b/sdk/cosmos/azure-cosmos/src/main/java/com/azure/cosmos/CosmosException.java index 8f103fc03953..eae93de1ea31 100644 --- a/sdk/cosmos/azure-cosmos/src/main/java/com/azure/cosmos/CosmosException.java +++ b/sdk/cosmos/azure-cosmos/src/main/java/com/azure/cosmos/CosmosException.java @@ -37,6 +37,8 @@ public class CosmosException extends AzureException { private static final long serialVersionUID = 1L; + private final static String SDK_VERSION = HttpConstants.Versions.SDK_VERSION; + private final int statusCode; private final Map responseHeaders; @@ -258,7 +260,7 @@ CosmosException setDiagnostics(CosmosDiagnostics cosmosDiagnostics) { @Override public String toString() { - return getClass().getSimpleName() + "{" + "error=" + cosmosError + ", resourceAddress='" + return getClass().getSimpleName() + "{" + "sdkVersion=" + SDK_VERSION + ", error=" + cosmosError + ", resourceAddress='" + resourceAddress + '\'' + ", statusCode=" + statusCode + ", message=" + getMessage() + ", causeInfo=" + causeInfo() + ", responseHeaders=" + responseHeaders + ", requestHeaders=" + filterSensitiveData(requestHeaders) + '}'; diff --git a/sdk/cosmos/azure-cosmos/src/test/java/com/azure/cosmos/CosmosExceptionTest.java b/sdk/cosmos/azure-cosmos/src/test/java/com/azure/cosmos/CosmosExceptionTest.java index 60135d5d7912..c86b0d86d4f9 100644 --- a/sdk/cosmos/azure-cosmos/src/test/java/com/azure/cosmos/CosmosExceptionTest.java +++ b/sdk/cosmos/azure-cosmos/src/test/java/com/azure/cosmos/CosmosExceptionTest.java @@ -7,6 +7,7 @@ import com.azure.cosmos.implementation.ConflictException; import com.azure.cosmos.implementation.ForbiddenException; import com.azure.cosmos.implementation.GoneException; +import com.azure.cosmos.implementation.HttpConstants; import com.azure.cosmos.implementation.InternalServerErrorException; import com.azure.cosmos.implementation.InvalidPartitionException; import com.azure.cosmos.implementation.LockedException; @@ -53,6 +54,12 @@ public class CosmosExceptionTest { + @Test(groups = { "unit" }) + public void sdkVersionPresent() { + CosmosException dce = BridgeInternal.createCosmosException(0); + assertThat(dce.toString()).contains("sdkVersion=" + HttpConstants.Versions.SDK_VERSION); + } + @Test(groups = { "unit" }) public void headerNotNull1() { CosmosException dce = BridgeInternal.createCosmosException(0); @@ -110,6 +117,7 @@ public void statusCodeIsCorrect(Class type, int expectedStatusC constructor.setAccessible(true); final CosmosException instance = constructor.newInstance("some-message", null, "some-uri"); assertEquals(instance.getStatusCode(), expectedStatusCode); + assertThat(instance.toString()).contains("sdkVersion=" + HttpConstants.Versions.SDK_VERSION); } catch (IllegalAccessException | InstantiationException | NoSuchMethodException | InvocationTargetException error) { String message = lenientFormat("could not create instance of %s due to %s", type, error); throw new AssertionError(message, error); From 12f51f3015ed4691dd5a981ddc3266b7c75c3f59 Mon Sep 17 00:00:00 2001 From: Kushagra Thapar Date: Fri, 29 May 2020 12:43:07 -0700 Subject: [PATCH 2/2] Added user agent to both exception and diagnostics --- .../com/azure/cosmos/CosmosDiagnostics.java | 22 +++++++++++-------- .../com/azure/cosmos/CosmosException.java | 5 +++-- .../azure/cosmos/implementation/Utils.java | 4 ++++ .../azure/cosmos/CosmosDiagnosticsTest.java | 6 +++++ .../com/azure/cosmos/CosmosExceptionTest.java | 5 +++-- 5 files changed, 29 insertions(+), 13 deletions(-) diff --git a/sdk/cosmos/azure-cosmos/src/main/java/com/azure/cosmos/CosmosDiagnostics.java b/sdk/cosmos/azure-cosmos/src/main/java/com/azure/cosmos/CosmosDiagnostics.java index ae385646d228..5e180826e941 100644 --- a/sdk/cosmos/azure-cosmos/src/main/java/com/azure/cosmos/CosmosDiagnostics.java +++ b/sdk/cosmos/azure-cosmos/src/main/java/com/azure/cosmos/CosmosDiagnostics.java @@ -3,7 +3,7 @@ package com.azure.cosmos; import com.azure.cosmos.implementation.FeedResponseDiagnostics; -import com.azure.cosmos.implementation.apachecommons.lang.StringUtils; +import com.azure.cosmos.implementation.Utils; import com.fasterxml.jackson.core.JsonProcessingException; import com.fasterxml.jackson.databind.ObjectMapper; import org.slf4j.Logger; @@ -18,6 +18,8 @@ public final class CosmosDiagnostics { private static final Logger LOGGER = LoggerFactory.getLogger(CosmosDiagnostics.class); private static final ObjectMapper OBJECT_MAPPER = new ObjectMapper(); + private static final String USER_AGENT = Utils.getUserAgent(); + private ClientSideRequestStatistics clientSideRequestStatistics; private FeedResponseDiagnostics feedResponseDiagnostics; @@ -45,16 +47,18 @@ CosmosDiagnostics clientSideRequestStatistics(ClientSideRequestStatistics client */ @Override public String toString() { + StringBuilder stringBuilder = new StringBuilder(); + stringBuilder.append("userAgent=").append(USER_AGENT).append("\n"); if (this.feedResponseDiagnostics != null) { - return feedResponseDiagnostics.toString(); - } - - try { - return OBJECT_MAPPER.writeValueAsString(this.clientSideRequestStatistics); - } catch (JsonProcessingException e) { - LOGGER.error("Error while parsing diagnostics " + e); + stringBuilder.append(feedResponseDiagnostics); + } else { + try { + stringBuilder.append(OBJECT_MAPPER.writeValueAsString(this.clientSideRequestStatistics)); + } catch (JsonProcessingException e) { + LOGGER.error("Error while parsing diagnostics " + e); + } } - return StringUtils.EMPTY; + return stringBuilder.toString(); } /** diff --git a/sdk/cosmos/azure-cosmos/src/main/java/com/azure/cosmos/CosmosException.java b/sdk/cosmos/azure-cosmos/src/main/java/com/azure/cosmos/CosmosException.java index eae93de1ea31..8de2c3186798 100644 --- a/sdk/cosmos/azure-cosmos/src/main/java/com/azure/cosmos/CosmosException.java +++ b/sdk/cosmos/azure-cosmos/src/main/java/com/azure/cosmos/CosmosException.java @@ -7,6 +7,7 @@ import com.azure.cosmos.implementation.Constants; import com.azure.cosmos.implementation.HttpConstants; import com.azure.cosmos.implementation.RequestTimeline; +import com.azure.cosmos.implementation.Utils; import com.azure.cosmos.implementation.directconnectivity.Uri; import com.azure.cosmos.implementation.CosmosError; import com.azure.cosmos.models.ModelBridgeInternal; @@ -37,7 +38,7 @@ public class CosmosException extends AzureException { private static final long serialVersionUID = 1L; - private final static String SDK_VERSION = HttpConstants.Versions.SDK_VERSION; + private final static String USER_AGENT = Utils.getUserAgent(); private final int statusCode; private final Map responseHeaders; @@ -260,7 +261,7 @@ CosmosException setDiagnostics(CosmosDiagnostics cosmosDiagnostics) { @Override public String toString() { - return getClass().getSimpleName() + "{" + "sdkVersion=" + SDK_VERSION + ", error=" + cosmosError + ", resourceAddress='" + return getClass().getSimpleName() + "{" + "userAgent=" + USER_AGENT + ", error=" + cosmosError + ", resourceAddress='" + resourceAddress + '\'' + ", statusCode=" + statusCode + ", message=" + getMessage() + ", causeInfo=" + causeInfo() + ", responseHeaders=" + responseHeaders + ", requestHeaders=" + filterSensitiveData(requestHeaders) + '}'; diff --git a/sdk/cosmos/azure-cosmos/src/main/java/com/azure/cosmos/implementation/Utils.java b/sdk/cosmos/azure-cosmos/src/main/java/com/azure/cosmos/implementation/Utils.java index 01bbee1e7a6c..69d34828242b 100644 --- a/sdk/cosmos/azure-cosmos/src/main/java/com/azure/cosmos/implementation/Utils.java +++ b/sdk/cosmos/azure-cosmos/src/main/java/com/azure/cosmos/implementation/Utils.java @@ -374,6 +374,10 @@ public static boolean isValidConsistency(ConsistencyLevel backendConsistency, } } + public static String getUserAgent() { + return getUserAgent(HttpConstants.Versions.SDK_NAME, HttpConstants.Versions.SDK_VERSION); + } + public static String getUserAgent(String sdkName, String sdkVersion) { String osName = System.getProperty("os.name"); if (osName == null) { diff --git a/sdk/cosmos/azure-cosmos/src/test/java/com/azure/cosmos/CosmosDiagnosticsTest.java b/sdk/cosmos/azure-cosmos/src/test/java/com/azure/cosmos/CosmosDiagnosticsTest.java index 458fe67417e3..0367d9df15b4 100644 --- a/sdk/cosmos/azure-cosmos/src/test/java/com/azure/cosmos/CosmosDiagnosticsTest.java +++ b/sdk/cosmos/azure-cosmos/src/test/java/com/azure/cosmos/CosmosDiagnosticsTest.java @@ -9,6 +9,7 @@ import com.azure.cosmos.implementation.ResourceType; import com.azure.cosmos.implementation.RxDocumentServiceRequest; import com.azure.cosmos.implementation.TestConfigurations; +import com.azure.cosmos.implementation.Utils; import com.azure.cosmos.models.CosmosContainerResponse; import com.azure.cosmos.models.CosmosDatabaseResponse; import com.azure.cosmos.models.CosmosItemRequestOptions; @@ -76,6 +77,7 @@ public void gatewayDiagnostics() { assertThat(diagnostics).contains("\"operationType\":\"Create\""); assertThat(diagnostics).contains("\"metaDataName\":\"CONTAINER_LOOK_UP\""); assertThat(diagnostics).contains("\"serializationType\":\"PARTITION_KEY_FETCH_SERIALIZATION\""); + assertThat(diagnostics).contains("userAgent=" + Utils.getUserAgent()); assertThat(createResponse.getDiagnostics().getDuration()).isNotNull(); validateTransportRequestTimelineGateway(diagnostics); } @@ -108,6 +110,7 @@ public void gatewayDiagnosticsOnException() { assertThat(diagnostics).doesNotContain(("\"gatewayStatistics\":null")); assertThat(diagnostics).contains("\"statusCode\":404"); assertThat(diagnostics).contains("\"operationType\":\"Read\""); + assertThat(diagnostics).contains("userAgent=" + Utils.getUserAgent()); assertThat(exception.getDiagnostics().getDuration()).isNotNull(); validateTransportRequestTimelineGateway(diagnostics); } finally { @@ -127,6 +130,7 @@ public void systemDiagnosticsForSystemStateInformation() { assertThat(diagnostics).contains("availableMemory"); assertThat(diagnostics).contains("processCpuLoad"); assertThat(diagnostics).contains("systemCpuLoad"); + assertThat(diagnostics).contains("userAgent=" + Utils.getUserAgent()); assertThat(createResponse.getDiagnostics().getDuration()).isNotNull(); } @@ -144,6 +148,7 @@ public void directDiagnostics() { assertThat(diagnostics).contains("\"metaDataName\":\"PARTITION_KEY_RANGE_LOOK_UP\""); assertThat(diagnostics).contains("\"metaDataName\":\"SERVER_ADDRESS_LOOKUP\""); assertThat(diagnostics).contains("\"serializationType\":\"PARTITION_KEY_FETCH_SERIALIZATION\""); + assertThat(diagnostics).contains("userAgent=" + Utils.getUserAgent()); assertThat(createResponse.getDiagnostics().getDuration()).isNotNull(); validateTransportRequestTimelineDirect(diagnostics); } @@ -252,6 +257,7 @@ public void serializationOnVariousScenarios() { CosmosItemProperties properties = readItemResponse.getItem(); diagnostics = readItemResponse.getDiagnostics().toString(); assertThat(diagnostics).contains("\"serializationType\":\"ITEM_DESERIALIZATION\""); + assertThat(diagnostics).contains("userAgent=" + Utils.getUserAgent()); } private CosmosItemProperties getCosmosItemProperties() { diff --git a/sdk/cosmos/azure-cosmos/src/test/java/com/azure/cosmos/CosmosExceptionTest.java b/sdk/cosmos/azure-cosmos/src/test/java/com/azure/cosmos/CosmosExceptionTest.java index c86b0d86d4f9..0a7026dce048 100644 --- a/sdk/cosmos/azure-cosmos/src/test/java/com/azure/cosmos/CosmosExceptionTest.java +++ b/sdk/cosmos/azure-cosmos/src/test/java/com/azure/cosmos/CosmosExceptionTest.java @@ -23,6 +23,7 @@ import com.azure.cosmos.implementation.RetryWithException; import com.azure.cosmos.implementation.ServiceUnavailableException; import com.azure.cosmos.implementation.UnauthorizedException; +import com.azure.cosmos.implementation.Utils; import com.azure.cosmos.implementation.http.HttpHeaders; import com.azure.cosmos.implementation.CosmosError; import com.azure.cosmos.implementation.guava25.collect.ImmutableMap; @@ -57,7 +58,7 @@ public class CosmosExceptionTest { @Test(groups = { "unit" }) public void sdkVersionPresent() { CosmosException dce = BridgeInternal.createCosmosException(0); - assertThat(dce.toString()).contains("sdkVersion=" + HttpConstants.Versions.SDK_VERSION); + assertThat(dce.toString()).contains("userAgent=" + Utils.getUserAgent()); } @Test(groups = { "unit" }) @@ -117,7 +118,7 @@ public void statusCodeIsCorrect(Class type, int expectedStatusC constructor.setAccessible(true); final CosmosException instance = constructor.newInstance("some-message", null, "some-uri"); assertEquals(instance.getStatusCode(), expectedStatusCode); - assertThat(instance.toString()).contains("sdkVersion=" + HttpConstants.Versions.SDK_VERSION); + assertThat(instance.toString()).contains("userAgent=" + Utils.getUserAgent()); } catch (IllegalAccessException | InstantiationException | NoSuchMethodException | InvocationTargetException error) { String message = lenientFormat("could not create instance of %s due to %s", type, error); throw new AssertionError(message, error);