Skip to content
Merged
Show file tree
Hide file tree
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
Original file line number Diff line number Diff line change
Expand Up @@ -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;
Expand All @@ -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;

Expand Down Expand Up @@ -45,16 +47,18 @@ CosmosDiagnostics clientSideRequestStatistics(ClientSideRequestStatistics client
*/
@Override
public String toString() {
StringBuilder stringBuilder = new StringBuilder();
stringBuilder.append("userAgent=").append(USER_AGENT).append("\n");
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Is there an Environment.NewLine or equivalent for Java? It might not work correctly on Windows where new line is \r\n

Copy link
Member Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Good point @j82w, we can use - System.lineSeparator()
https://docs.oracle.com/javase/8/docs/api/java/lang/System.html#lineSeparator--

I will port that change as a separate PR for everywhere in SDK code.

Copy link
Member Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Tracking this issue here : #11594

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();
}

/**
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -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;
Expand Down Expand Up @@ -37,6 +38,8 @@
public class CosmosException extends AzureException {
private static final long serialVersionUID = 1L;

private final static String USER_AGENT = Utils.getUserAgent();

private final int statusCode;
private final Map<String, String> responseHeaders;

Expand Down Expand Up @@ -258,7 +261,7 @@ CosmosException setDiagnostics(CosmosDiagnostics cosmosDiagnostics) {

@Override
public String toString() {
return getClass().getSimpleName() + "{" + "error=" + cosmosError + ", resourceAddress='"
return getClass().getSimpleName() + "{" + "userAgent=" + USER_AGENT + ", error=" + cosmosError + ", resourceAddress='"
+ resourceAddress + '\'' + ", statusCode=" + statusCode + ", message=" + getMessage()
+ ", causeInfo=" + causeInfo() + ", responseHeaders=" + responseHeaders + ", requestHeaders="
+ filterSensitiveData(requestHeaders) + '}';
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -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) {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -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;
Expand Down Expand Up @@ -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);
}
Expand Down Expand Up @@ -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 {
Expand All @@ -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();
}

Expand All @@ -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);
}
Expand Down Expand Up @@ -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() {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -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;
Expand All @@ -22,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;
Expand Down Expand Up @@ -53,6 +55,12 @@

public class CosmosExceptionTest {

@Test(groups = { "unit" })
public void sdkVersionPresent() {
CosmosException dce = BridgeInternal.createCosmosException(0);
assertThat(dce.toString()).contains("userAgent=" + Utils.getUserAgent());
}

@Test(groups = { "unit" })
public void headerNotNull1() {
CosmosException dce = BridgeInternal.createCosmosException(0);
Expand Down Expand Up @@ -110,6 +118,7 @@ public void statusCodeIsCorrect(Class<CosmosException> type, int expectedStatusC
constructor.setAccessible(true);
final CosmosException instance = constructor.newInstance("some-message", null, "some-uri");
assertEquals(instance.getStatusCode(), expectedStatusCode);
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);
Expand Down