diff --git a/sdk/cosmos/azure-cosmos/src/main/java/com/azure/cosmos/implementation/ClientSideRequestStatistics.java b/sdk/cosmos/azure-cosmos/src/main/java/com/azure/cosmos/implementation/ClientSideRequestStatistics.java index 0ebf42806806..a581e33d7d21 100644 --- a/sdk/cosmos/azure-cosmos/src/main/java/com/azure/cosmos/implementation/ClientSideRequestStatistics.java +++ b/sdk/cosmos/azure-cosmos/src/main/java/com/azure/cosmos/implementation/ClientSideRequestStatistics.java @@ -253,13 +253,13 @@ public GatewayStatistics getGatewayStatistics() { public static class StoreResponseStatistics { @JsonSerialize(using = StoreResult.StoreResultSerializer.class) - StoreResult storeResult; + private StoreResult storeResult; @JsonSerialize(using = DiagnosticsInstantSerializer.class) - Instant requestResponseTimeUTC; + private Instant requestResponseTimeUTC; @JsonSerialize - ResourceType requestResourceType; + private ResourceType requestResourceType; @JsonSerialize - OperationType requestOperationType; + private OperationType requestOperationType; public StoreResult getStoreResult() { return storeResult; @@ -268,13 +268,21 @@ public StoreResult getStoreResult() { public Instant getRequestResponseTimeUTC() { return requestResponseTimeUTC; } + + public ResourceType getRequestResourceType() { + return requestResourceType; + } + + public OperationType getRequestOperationType() { + return requestOperationType; + } } - private static class SystemInformation { - String usedMemory; - String availableMemory; - String systemCpuLoad; - int availableProcessors; + public static class SystemInformation { + private String usedMemory; + private String availableMemory; + private String systemCpuLoad; + private int availableProcessors; public String getUsedMemory() { return usedMemory; @@ -347,34 +355,50 @@ public static List getCappedSupplementalResponseStatist public static class AddressResolutionStatistics { @JsonSerialize(using = DiagnosticsInstantSerializer.class) - Instant startTimeUTC; + private Instant startTimeUTC; @JsonSerialize(using = DiagnosticsInstantSerializer.class) - Instant endTimeUTC; + private Instant endTimeUTC; @JsonSerialize - String targetEndpoint; + private String targetEndpoint; @JsonSerialize - String errorMessage; + private String errorMessage; // If one replica return error we start address call in parallel, // on other replica valid response, we end the current user request, // indicating background addressResolution is still inflight @JsonSerialize - boolean inflightRequest = true; + private boolean inflightRequest = true; public Instant getStartTimeUTC() { return startTimeUTC; } + + public Instant getEndTimeUTC() { + return endTimeUTC; + } + + public String getTargetEndpoint() { + return targetEndpoint; + } + + public String getErrorMessage() { + return errorMessage; + } + + public boolean isInflightRequest() { + return inflightRequest; + } } public static class GatewayStatistics { - String sessionToken; - OperationType operationType; - ResourceType resourceType; - int statusCode; - int subStatusCode; - String requestCharge; - RequestTimeline requestTimeline; - String partitionKeyRangeId; + private String sessionToken; + private OperationType operationType; + private ResourceType resourceType; + private int statusCode; + private int subStatusCode; + private String requestCharge; + private RequestTimeline requestTimeline; + private String partitionKeyRangeId; public String getSessionToken() { return sessionToken; diff --git a/sdk/cosmos/azure-cosmos/src/main/java/com/azure/cosmos/implementation/FeedResponseDiagnostics.java b/sdk/cosmos/azure-cosmos/src/main/java/com/azure/cosmos/implementation/FeedResponseDiagnostics.java index 1d37eb3c68af..09d90ab69498 100644 --- a/sdk/cosmos/azure-cosmos/src/main/java/com/azure/cosmos/implementation/FeedResponseDiagnostics.java +++ b/sdk/cosmos/azure-cosmos/src/main/java/com/azure/cosmos/implementation/FeedResponseDiagnostics.java @@ -6,6 +6,7 @@ import com.azure.cosmos.implementation.query.QueryInfo; import com.azure.cosmos.implementation.query.metrics.QueryMetricsTextWriter; import com.fasterxml.jackson.core.JsonProcessingException; +import com.fasterxml.jackson.databind.ObjectMapper; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -23,6 +24,7 @@ public class FeedResponseDiagnostics { private final static String EQUALS = "="; private final static String QUERY_PLAN = "QueryPlan"; private final static String SPACE = " "; + private static final ObjectMapper mapper = new ObjectMapper(); private static final Logger LOGGER = LoggerFactory.getLogger(FeedResponseDiagnostics.class); private Map queryMetricsMap; private QueryInfo.QueryPlanDiagnosticsContext diagnosticsContext; @@ -69,7 +71,7 @@ public String toString() { try { stringBuilder.append(QUERY_PLAN + SPACE + "RequestTimeline ") .append(EQUALS) - .append(Utils.getSimpleObjectMapper().writeValueAsString(diagnosticsContext.getRequestTimeline())) + .append(mapper.writeValueAsString(diagnosticsContext.getRequestTimeline())) .append(System.lineSeparator()) .append(System.lineSeparator()); } catch (JsonProcessingException e) { @@ -87,7 +89,7 @@ public String toString() { } try { stringBuilder - .append(Utils.getSimpleObjectMapper().writeValueAsString(clientSideRequestStatisticsList)); + .append(mapper.writeValueAsString(clientSideRequestStatisticsList)); } catch (JsonProcessingException e) { LOGGER.error("Error while parsing diagnostics ", e); } diff --git a/sdk/cosmos/azure-cosmos/src/main/java/com/azure/cosmos/implementation/TracerProvider.java b/sdk/cosmos/azure-cosmos/src/main/java/com/azure/cosmos/implementation/TracerProvider.java index 9989f283fe3d..798fa91cc283 100644 --- a/sdk/cosmos/azure-cosmos/src/main/java/com/azure/cosmos/implementation/TracerProvider.java +++ b/sdk/cosmos/azure-cosmos/src/main/java/com/azure/cosmos/implementation/TracerProvider.java @@ -17,6 +17,7 @@ import com.azure.cosmos.models.CosmosResponse; import com.azure.cosmos.models.ModelBridgeInternal; import com.fasterxml.jackson.core.JsonProcessingException; +import com.fasterxml.jackson.databind.ObjectMapper; import org.HdrHistogram.ConcurrentDoubleHistogram; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -39,6 +40,7 @@ public class TracerProvider { private Tracer tracer; private static final Logger LOGGER = LoggerFactory.getLogger(TracerProvider.class); + private static final ObjectMapper mapper = new ObjectMapper(); private final static String JSON_STRING = "JSON"; public final static String DB_TYPE_VALUE = "Cosmos"; public final static String DB_TYPE = "db.type"; @@ -380,18 +382,18 @@ private void addDiagnosticsOnTracerEvent(CosmosDiagnostics cosmosDiagnostics, Co for (ClientSideRequestStatistics.StoreResponseStatistics storeResponseStatistics : clientSideRequestStatistics.getResponseStatisticsList()) { attributes = new HashMap<>(); - attributes.put(JSON_STRING, Utils.getSimpleObjectMapper().writeValueAsString(storeResponseStatistics)); + attributes.put(JSON_STRING, mapper.writeValueAsString(storeResponseStatistics)); Iterator eventIterator = null; try { - if (storeResponseStatistics.storeResult != null) { + if (storeResponseStatistics.getStoreResult() != null) { eventIterator = - DirectBridgeInternal.getRequestTimeline(storeResponseStatistics.storeResult.toResponse()).iterator(); + DirectBridgeInternal.getRequestTimeline(storeResponseStatistics.getStoreResult().toResponse()).iterator(); } } catch (CosmosException ex) { eventIterator = BridgeInternal.getRequestTimeline(ex).iterator(); } - OffsetDateTime requestStartTime = OffsetDateTime.ofInstant(storeResponseStatistics.requestResponseTimeUTC + OffsetDateTime requestStartTime = OffsetDateTime.ofInstant(storeResponseStatistics.getRequestResponseTimeUTC() , ZoneOffset.UTC); if (eventIterator != null) { while (eventIterator.hasNext()) { @@ -411,12 +413,12 @@ private void addDiagnosticsOnTracerEvent(CosmosDiagnostics cosmosDiagnostics, Co for (ClientSideRequestStatistics.StoreResponseStatistics statistics : ClientSideRequestStatistics.getCappedSupplementalResponseStatisticsList(clientSideRequestStatistics.getSupplementalResponseStatisticsList())) { attributes = new HashMap<>(); - attributes.put(JSON_STRING, Utils.getSimpleObjectMapper().writeValueAsString(statistics)); - OffsetDateTime requestStartTime = OffsetDateTime.ofInstant(statistics.requestResponseTimeUTC, + attributes.put(JSON_STRING, mapper.writeValueAsString(statistics)); + OffsetDateTime requestStartTime = OffsetDateTime.ofInstant(statistics.getRequestResponseTimeUTC(), ZoneOffset.UTC); - if (statistics.storeResult != null) { + if (statistics.getStoreResult() != null) { Iterator eventIterator = - DirectBridgeInternal.getRequestTimeline(statistics.storeResult.toResponse()).iterator(); + DirectBridgeInternal.getRequestTimeline(statistics.getStoreResult().toResponse()).iterator(); while (eventIterator.hasNext()) { RequestTimeline.Event event = eventIterator.next(); if (event.getName().equals("created")) { @@ -432,12 +434,12 @@ private void addDiagnosticsOnTracerEvent(CosmosDiagnostics cosmosDiagnostics, Co if (clientSideRequestStatistics.getGatewayStatistics() != null) { attributes = new HashMap<>(); attributes.put(JSON_STRING, - Utils.getSimpleObjectMapper().writeValueAsString(clientSideRequestStatistics.getGatewayStatistics())); + mapper.writeValueAsString(clientSideRequestStatistics.getGatewayStatistics())); OffsetDateTime requestStartTime = OffsetDateTime.ofInstant(clientSideRequestStatistics.getRequestStartTimeUTC(), ZoneOffset.UTC); - if (clientSideRequestStatistics.getGatewayStatistics().requestTimeline != null) { + if (clientSideRequestStatistics.getGatewayStatistics().getRequestTimeline() != null) { Iterator eventIterator = - clientSideRequestStatistics.getGatewayStatistics().requestTimeline.iterator(); + clientSideRequestStatistics.getGatewayStatistics().getRequestTimeline().iterator(); while (eventIterator.hasNext()) { RequestTimeline.Event event = eventIterator.next(); if (event.getName().equals("created")) { @@ -453,7 +455,7 @@ private void addDiagnosticsOnTracerEvent(CosmosDiagnostics cosmosDiagnostics, Co if (clientSideRequestStatistics.getRetryContext().getRetryStartTime() != null) { attributes = new HashMap<>(); attributes.put(JSON_STRING, - Utils.getSimpleObjectMapper().writeValueAsString(clientSideRequestStatistics.getRetryContext())); + mapper.writeValueAsString(clientSideRequestStatistics.getRetryContext())); this.addEvent("Retry Context", attributes, OffsetDateTime.ofInstant(clientSideRequestStatistics.getRetryContext().getRetryStartTime(), ZoneOffset.UTC), context); @@ -464,9 +466,9 @@ private void addDiagnosticsOnTracerEvent(CosmosDiagnostics cosmosDiagnostics, Co for (ClientSideRequestStatistics.AddressResolutionStatistics addressResolutionStatistics : clientSideRequestStatistics.getAddressResolutionStatistics().values()) { attributes = new HashMap<>(); - attributes.put(JSON_STRING, Utils.getSimpleObjectMapper().writeValueAsString(addressResolutionStatistics)); + attributes.put(JSON_STRING, mapper.writeValueAsString(addressResolutionStatistics)); this.addEvent("AddressResolutionStatistics" + diagnosticsCounter++, attributes, - OffsetDateTime.ofInstant(addressResolutionStatistics.startTimeUTC, ZoneOffset.UTC), context); + OffsetDateTime.ofInstant(addressResolutionStatistics.getStartTimeUTC(), ZoneOffset.UTC), context); } //adding serializationDiagnosticsContext @@ -474,7 +476,7 @@ private void addDiagnosticsOnTracerEvent(CosmosDiagnostics cosmosDiagnostics, Co for (SerializationDiagnosticsContext.SerializationDiagnostics serializationDiagnostics : clientSideRequestStatistics.getSerializationDiagnosticsContext().serializationDiagnosticsList) { attributes = new HashMap<>(); - attributes.put(JSON_STRING, Utils.getSimpleObjectMapper().writeValueAsString(serializationDiagnostics)); + attributes.put(JSON_STRING, mapper.writeValueAsString(serializationDiagnostics)); this.addEvent("SerializationDiagnostics " + serializationDiagnostics.serializationType, attributes, OffsetDateTime.ofInstant(serializationDiagnostics.startTimeUTC, ZoneOffset.UTC), context); } @@ -483,7 +485,7 @@ private void addDiagnosticsOnTracerEvent(CosmosDiagnostics cosmosDiagnostics, Co //adding systemInformation attributes = new HashMap<>(); attributes.put(JSON_STRING, - Utils.getSimpleObjectMapper().writeValueAsString(clientSideRequestStatistics.getRegionsContacted())); + mapper.writeValueAsString(clientSideRequestStatistics.getRegionsContacted())); this.addEvent("RegionContacted", attributes, OffsetDateTime.ofInstant(clientSideRequestStatistics.getRequestStartTimeUTC(), ZoneOffset.UTC), context); @@ -491,14 +493,14 @@ private void addDiagnosticsOnTracerEvent(CosmosDiagnostics cosmosDiagnostics, Co //adding systemInformation attributes = new HashMap<>(); attributes.put(JSON_STRING, - Utils.getSimpleObjectMapper().writeValueAsString(ClientSideRequestStatistics.fetchSystemInformation())); + mapper.writeValueAsString(ClientSideRequestStatistics.fetchSystemInformation())); this.addEvent("SystemInformation", attributes, OffsetDateTime.ofInstant(clientSideRequestStatistics.getRequestStartTimeUTC(), ZoneOffset.UTC), context); //adding clientCfgs attributes = new HashMap<>(); attributes.put(JSON_STRING, - Utils.getSimpleObjectMapper().writeValueAsString(clientSideRequestStatistics.getDiagnosticsClientContext())); + mapper.writeValueAsString(clientSideRequestStatistics.getDiagnosticsClientContext())); this.addEvent("ClientCfgs", attributes, OffsetDateTime.ofInstant(clientSideRequestStatistics.getRequestStartTimeUTC(), ZoneOffset.UTC), context); } diff --git a/sdk/cosmos/azure-cosmos/src/main/java/com/azure/cosmos/util/CosmosPagedFlux.java b/sdk/cosmos/azure-cosmos/src/main/java/com/azure/cosmos/util/CosmosPagedFlux.java index 3c372d46acfd..77b6dc8d9f34 100644 --- a/sdk/cosmos/azure-cosmos/src/main/java/com/azure/cosmos/util/CosmosPagedFlux.java +++ b/sdk/cosmos/azure-cosmos/src/main/java/com/azure/cosmos/util/CosmosPagedFlux.java @@ -29,6 +29,7 @@ import com.azure.cosmos.implementation.query.QueryInfo; import com.azure.cosmos.models.FeedResponse; import com.fasterxml.jackson.core.JsonProcessingException; +import com.fasterxml.jackson.databind.ObjectMapper; import org.HdrHistogram.ConcurrentDoubleHistogram; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -63,6 +64,7 @@ public final class CosmosPagedFlux extends ContinuablePagedFlux> { private static final Logger LOGGER = LoggerFactory.getLogger(CosmosPagedFlux.class); + private static final ObjectMapper mapper = new ObjectMapper(); private final Function>> optionsFluxFunction; private final Consumer> feedResponseConsumer; @@ -318,7 +320,7 @@ private void addDiagnosticsOnTracerEvent(TracerProvider tracerProvider, CosmosDi cosmosDiagnosticsAccessor.getFeedResponseDiagnostics(cosmosDiagnostics).getQueryPlanDiagnosticsContext() : null; if (queryPlanDiagnosticsContext != null) { attributes.put("JSON", - Utils.getSimpleObjectMapper().writeValueAsString(queryPlanDiagnosticsContext)); + mapper.writeValueAsString(queryPlanDiagnosticsContext)); tracerProvider.addEvent("Query Plan Statistics", attributes, OffsetDateTime.ofInstant(queryPlanDiagnosticsContext.getStartTimeUTC(), ZoneOffset.UTC), parentContext); } @@ -342,7 +344,7 @@ private void addDiagnosticsOnTracerEvent(TracerProvider tracerProvider, CosmosDi for (ClientSideRequestStatistics.StoreResponseStatistics statistics : clientSideRequestStatistics.getResponseStatisticsList()) { attributes.put("StoreResponse" + counter++, - Utils.getSimpleObjectMapper().writeValueAsString(statistics)); + mapper.writeValueAsString(statistics)); } //adding Supplemental StoreResponse @@ -350,13 +352,13 @@ private void addDiagnosticsOnTracerEvent(TracerProvider tracerProvider, CosmosDi for (ClientSideRequestStatistics.StoreResponseStatistics statistics : ClientSideRequestStatistics.getCappedSupplementalResponseStatisticsList(clientSideRequestStatistics.getSupplementalResponseStatisticsList())) { attributes.put("Supplemental StoreResponse" + counter++, - Utils.getSimpleObjectMapper().writeValueAsString(statistics)); + mapper.writeValueAsString(statistics)); } //adding retry context if (clientSideRequestStatistics.getRetryContext().getRetryStartTime() != null) { attributes.put("Retry Context", - Utils.getSimpleObjectMapper().writeValueAsString(clientSideRequestStatistics.getRetryContext())); + mapper.writeValueAsString(clientSideRequestStatistics.getRetryContext())); } //adding addressResolutionStatistics @@ -364,7 +366,7 @@ private void addDiagnosticsOnTracerEvent(TracerProvider tracerProvider, CosmosDi for (ClientSideRequestStatistics.AddressResolutionStatistics addressResolutionStatistics : clientSideRequestStatistics.getAddressResolutionStatistics().values()) { attributes.put("AddressResolutionStatistics" + counter++, - Utils.getSimpleObjectMapper().writeValueAsString(addressResolutionStatistics)); + mapper.writeValueAsString(addressResolutionStatistics)); } //adding serializationDiagnosticsContext @@ -374,28 +376,28 @@ private void addDiagnosticsOnTracerEvent(TracerProvider tracerProvider, CosmosDi clientSideRequestStatistics.getSerializationDiagnosticsContext().serializationDiagnosticsList) { attributes = new HashMap<>(); attributes.put("SerializationDiagnostics" + counter++, - Utils.getSimpleObjectMapper().writeValueAsString(serializationDiagnostics)); + mapper.writeValueAsString(serializationDiagnostics)); } } //adding gatewayStatistics if(clientSideRequestStatistics.getGatewayStatistics() != null) { attributes.put("GatewayStatistics", - Utils.getSimpleObjectMapper().writeValueAsString(clientSideRequestStatistics.getGatewayStatistics())); + mapper.writeValueAsString(clientSideRequestStatistics.getGatewayStatistics())); } //adding systemInformation attributes.put("RegionContacted", - Utils.getSimpleObjectMapper().writeValueAsString(clientSideRequestStatistics.getRegionsContacted())); + mapper.writeValueAsString(clientSideRequestStatistics.getRegionsContacted())); //adding systemInformation attributes.put("SystemInformation", - Utils.getSimpleObjectMapper().writeValueAsString(ClientSideRequestStatistics.fetchSystemInformation())); + mapper.writeValueAsString(ClientSideRequestStatistics.fetchSystemInformation())); //adding clientCfgs attributes.put("ClientCfgs", - Utils.getSimpleObjectMapper().writeValueAsString(clientSideRequestStatistics.getDiagnosticsClientContext())); + mapper.writeValueAsString(clientSideRequestStatistics.getDiagnosticsClientContext())); if (clientSideRequestStatistics.getResponseStatisticsList() != null && clientSideRequestStatistics.getResponseStatisticsList().size() > 0 && clientSideRequestStatistics.getResponseStatisticsList().get(0).getStoreResult() != null) {