internal static ResponseMessage ToCosmosResponseMessage(this DocumentServiceResponse documentServiceResponse, RequestMessage requestMessage) { Debug.Assert(requestMessage != null, nameof(requestMessage)); ResponseMessage responseMessage = new ResponseMessage(documentServiceResponse.StatusCode, requestMessage); if (documentServiceResponse.ResponseBody != null) { responseMessage.Content = documentServiceResponse.ResponseBody; } if (documentServiceResponse.Headers != null) { foreach (string key in documentServiceResponse.Headers) { responseMessage.Headers.Add(key, documentServiceResponse.Headers[key]); } } CosmosClientSideRequestStatistics cosmosClientSideRequestStatistics = documentServiceResponse.RequestStats as CosmosClientSideRequestStatistics; responseMessage.Diagnostics = new PointOperationStatistics( activityId: responseMessage.Headers.ActivityId, statusCode: documentServiceResponse.StatusCode, subStatusCode: documentServiceResponse.SubStatusCode, requestCharge: responseMessage.Headers.RequestCharge, errorMessage: responseMessage.ErrorMessage, method: requestMessage?.Method, requestUri: requestMessage?.RequestUri, requestSessionToken: requestMessage?.Headers?.Session, responseSessionToken: responseMessage.Headers.Session, clientSideRequestStatistics: cosmosClientSideRequestStatistics); return(responseMessage); }
internal static ResponseMessage ToCosmosResponseMessage(this DocumentServiceResponse response, RequestMessage requestMessage) { Debug.Assert(requestMessage != null, nameof(requestMessage)); ResponseMessage cosmosResponse = new ResponseMessage(response.StatusCode, requestMessage); if (response.ResponseBody != null) { cosmosResponse.Content = response.ResponseBody; } if (response.Headers != null) { foreach (string key in response.Headers) { cosmosResponse.Headers.Add(key, response.Headers[key]); } } CosmosClientSideRequestStatistics cosmosClientSideRequestStatistics = response.RequestStats as CosmosClientSideRequestStatistics; cosmosResponse.Diagnostics = new PointOperationStatistics( statusCode: response.StatusCode, subStatusCode: response.SubStatusCode, requestCharge: cosmosResponse.Headers.RequestCharge, errorMessage: cosmosResponse.ErrorMessage, method: requestMessage?.Method, requestUri: requestMessage?.RequestUri, clientSideRequestStatistics: cosmosClientSideRequestStatistics); return(cosmosResponse); }
private static void ValidateClientSideRequestStatistics(CosmosClientSideRequestStatistics stats, HttpStatusCode?statusCode) { Assert.IsNotNull(stats.ContactedReplicas); Assert.IsNotNull(stats.DiagnosticsContext); Assert.IsNotNull(stats.RegionsContacted); Assert.IsNotNull(stats.FailedReplicas); if (stats.DiagnosticsContext.GetFailedResponseCount() == 0) { Assert.AreEqual(stats.EstimatedClientDelayFromAllCauses, TimeSpan.Zero); Assert.AreEqual(stats.EstimatedClientDelayFromRateLimiting, TimeSpan.Zero); } else if (statusCode != null && (int)statusCode == 429) { Assert.AreNotEqual(stats.EstimatedClientDelayFromAllCauses, TimeSpan.Zero); Assert.AreNotEqual(stats.EstimatedClientDelayFromRateLimiting, TimeSpan.Zero); } // If all the request failed it's possible to not contact a region or replica. if (stats.DiagnosticsContext.GetTotalResponseCount() < stats.DiagnosticsContext.GetFailedResponseCount()) { Assert.IsTrue(stats.RegionsContacted.Count > 0); Assert.IsTrue(stats.ContactedReplicas.Count > 0); } }
internal PointOperationStatistics( string activityId, HttpStatusCode statusCode, Documents.SubStatusCodes subStatusCode, double requestCharge, string errorMessage, HttpMethod method, Uri requestUri, string requestSessionToken, string responseSessionToken, CosmosClientSideRequestStatistics clientSideRequestStatistics) { this.ActivityId = activityId; this.StatusCode = statusCode; this.SubStatusCode = subStatusCode; this.RequestCharge = requestCharge; this.ErrorMessage = errorMessage; this.Method = method; this.RequestUri = requestUri; this.RequestSessionToken = requestSessionToken; this.ResponseSessionToken = responseSessionToken; if (clientSideRequestStatistics != null) { this.requestStartTime = clientSideRequestStatistics.requestStartTime; this.requestEndTime = clientSideRequestStatistics.requestEndTime; this.responseStatisticsList = clientSideRequestStatistics.responseStatisticsList; this.supplementalResponseStatisticsList = clientSideRequestStatistics.supplementalResponseStatisticsList; this.addressResolutionStatistics = clientSideRequestStatistics.addressResolutionStatistics; this.contactedReplicas = clientSideRequestStatistics.ContactedReplicas; this.failedReplicas = clientSideRequestStatistics.FailedReplicas; this.regionsContacted = clientSideRequestStatistics.RegionsContacted; this.requestLatency = clientSideRequestStatistics.RequestLatency; } }
internal static ResponseMessage ToCosmosResponseMessage(this DocumentServiceResponse response, RequestMessage requestMessage) { Debug.Assert(requestMessage != null, nameof(requestMessage)); ResponseMessage cosmosResponse = new ResponseMessage(response.StatusCode, requestMessage); if (response.ResponseBody != null) { cosmosResponse.Content = response.ResponseBody; } if (response.Headers != null) { foreach (string key in response.Headers) { cosmosResponse.Headers.Add(key, response.Headers[key]); } } if (response.RequestStats != null) { CosmosClientSideRequestStatistics cosmosClientSideRequestStatistics = response.RequestStats as CosmosClientSideRequestStatistics; if (cosmosClientSideRequestStatistics != null) { cosmosResponse.Diagnostics = new PointOperationStatistics(cosmosClientSideRequestStatistics); } } return(cosmosResponse); }
public PointOperationStatistics(CosmosClientSideRequestStatistics clientSideRequestStatistics) { this.requestStartTime = clientSideRequestStatistics.requestStartTime; this.requestEndTime = clientSideRequestStatistics.requestEndTime; this.responseStatisticsList = clientSideRequestStatistics.responseStatisticsList; this.supplementalResponseStatisticsList = clientSideRequestStatistics.supplementalResponseStatisticsList; this.addressResolutionStatistics = clientSideRequestStatistics.addressResolutionStatistics; this.contactedReplicas = clientSideRequestStatistics.ContactedReplicas; this.failedReplicas = clientSideRequestStatistics.FailedReplicas; this.regionsContacted = clientSideRequestStatistics.RegionsContacted; this.requestLatency = clientSideRequestStatistics.RequestLatency; }
public void ToStringTest() { CosmosClientSideRequestStatistics cosmosClientSideRequestStatistics = new CosmosClientSideRequestStatistics(); //Setting null supplementalResponseStatisticsList cosmosClientSideRequestStatistics.supplementalResponseStatisticsList = null; PointOperationStatistics pointOperationStatistics = new PointOperationStatistics(cosmosClientSideRequestStatistics); pointOperationStatistics.ToString(); Assert.IsNull(pointOperationStatistics.supplementalResponseStatisticsList); //Adding 5 objects supplementalResponseStatisticsList cosmosClientSideRequestStatistics.supplementalResponseStatisticsList = new List <StoreResponseStatistics> { new StoreResponseStatistics(), new StoreResponseStatistics(), new StoreResponseStatistics(), new StoreResponseStatistics(), new StoreResponseStatistics() }; pointOperationStatistics = new PointOperationStatistics(cosmosClientSideRequestStatistics); pointOperationStatistics.ToString(); Assert.AreEqual(5, pointOperationStatistics.supplementalResponseStatisticsList.Count); //Adding 5 more objects supplementalResponseStatisticsList, making total 10 cosmosClientSideRequestStatistics.supplementalResponseStatisticsList.AddRange(new List <StoreResponseStatistics>() { new StoreResponseStatistics(), new StoreResponseStatistics(), new StoreResponseStatistics(), new StoreResponseStatistics(), new StoreResponseStatistics() }); pointOperationStatistics = new PointOperationStatistics(cosmosClientSideRequestStatistics); pointOperationStatistics.ToString(); Assert.AreEqual(10, pointOperationStatistics.supplementalResponseStatisticsList.Count); //Adding 2 more objects supplementalResponseStatisticsList, making total 12 cosmosClientSideRequestStatistics.supplementalResponseStatisticsList.AddRange(new List <StoreResponseStatistics>() { new StoreResponseStatistics(), new StoreResponseStatistics() }); pointOperationStatistics = new PointOperationStatistics(cosmosClientSideRequestStatistics); pointOperationStatistics.ToString(); Assert.AreEqual(10, pointOperationStatistics.supplementalResponseStatisticsList.Count); }
private static void ValidateClientSideRequestStatistics(CosmosClientSideRequestStatistics stats) { Assert.IsNotNull(stats.ContactedReplicas); Assert.IsNotNull(stats.DiagnosticsContext); Assert.IsNotNull(stats.RegionsContacted); Assert.IsNotNull(stats.FailedReplicas); // If all the request failed it's possible to not contact a region or replica. if (stats.DiagnosticsContext.TotalRequestCount < stats.DiagnosticsContext.FailedRequestCount) { Assert.IsTrue(stats.RegionsContacted.Count > 0); Assert.IsTrue(stats.ContactedReplicas.Count > 0); } }
internal static ResponseMessage ToCosmosResponseMessage(this DocumentServiceResponse documentServiceResponse, RequestMessage requestMessage) { Debug.Assert(requestMessage != null, nameof(requestMessage)); Headers headers = documentServiceResponse.Headers.ToCosmosHeaders(); // Only record point operation stats if ClientSideRequestStats did not record the response. CosmosClientSideRequestStatistics clientSideRequestStatistics = documentServiceResponse.RequestStats as CosmosClientSideRequestStatistics; if (clientSideRequestStatistics == null || (clientSideRequestStatistics.ContactedReplicas.Count == 0 && clientSideRequestStatistics.FailedReplicas.Count == 0)) { requestMessage.DiagnosticsContext.AddDiagnosticsInternal(new PointOperationStatistics( activityId: headers.ActivityId, responseTimeUtc: DateTime.UtcNow, statusCode: documentServiceResponse.StatusCode, subStatusCode: documentServiceResponse.SubStatusCode, requestCharge: headers.RequestCharge, errorMessage: null, method: requestMessage?.Method, requestUri: requestMessage?.RequestUri, requestSessionToken: requestMessage?.Headers?.Session, responseSessionToken: headers.Session)); } // If it's considered a failure create the corresponding CosmosException if (!documentServiceResponse.StatusCode.IsSuccess()) { CosmosException cosmosException = CosmosExceptionFactory.Create( documentServiceResponse, headers, requestMessage); return(cosmosException.ToCosmosResponseMessage(requestMessage)); } ResponseMessage responseMessage = new ResponseMessage( statusCode: documentServiceResponse.StatusCode, requestMessage: requestMessage, headers: headers, cosmosException: null, diagnostics: requestMessage.DiagnosticsContext) { Content = documentServiceResponse.ResponseBody }; return(responseMessage); }
internal PointOperationStatistics( string activityId, HttpStatusCode statusCode, Documents.SubStatusCodes subStatusCode, double requestCharge, string errorMessage, HttpMethod method, Uri requestUri, string requestSessionToken, string responseSessionToken, CosmosClientSideRequestStatistics clientSideRequestStatistics) { this.ActivityId = activityId; this.StatusCode = statusCode; this.SubStatusCode = subStatusCode; this.RequestCharge = requestCharge; this.ErrorMessage = errorMessage; this.Method = method; this.RequestUri = requestUri; this.RequestSessionToken = requestSessionToken; this.ResponseSessionToken = responseSessionToken; this.ClientSideRequestStatistics = clientSideRequestStatistics; }
internal override void AddDiagnosticsInternal(CosmosClientSideRequestStatistics clientSideRequestStatistics) { }
private async Task <HttpResponseMessage> InvokeClientAsync( DocumentServiceRequest request, ResourceType resourceType, Uri physicalAddress, CancellationToken cancellationToken) { Func <Task <HttpResponseMessage> > funcDelegate = async() => { using (HttpRequestMessage requestMessage = await this.PrepareRequestMessageAsync(request, physicalAddress)) { DateTime sendTimeUtc = DateTime.UtcNow; Guid localGuid = Guid.NewGuid(); // For correlating HttpRequest and HttpResponse Traces IClientSideRequestStatistics clientSideRequestStatistics = request.RequestContext.ClientRequestStatistics; if (clientSideRequestStatistics == null) { clientSideRequestStatistics = new CosmosClientSideRequestStatistics(); request.RequestContext.ClientRequestStatistics = clientSideRequestStatistics; } Guid requestedActivityId = Trace.CorrelationManager.ActivityId; this.eventSource.Request( requestedActivityId, localGuid, requestMessage.RequestUri.ToString(), resourceType.ToResourceTypeString(), requestMessage.Headers); TimeSpan durationTimeSpan; string recordAddressResolutionId = clientSideRequestStatistics.RecordAddressResolutionStart(requestMessage.RequestUri); try { HttpResponseMessage responseMessage = await this.httpClient.SendAsync(requestMessage, cancellationToken); DateTime receivedTimeUtc = DateTime.UtcNow; durationTimeSpan = receivedTimeUtc - sendTimeUtc; IEnumerable <string> headerValues; Guid activityId = Guid.Empty; if (responseMessage.Headers.TryGetValues(HttpConstants.HttpHeaders.ActivityId, out headerValues) && headerValues.Count() != 0) { activityId = new Guid(headerValues.First()); } this.eventSource.Response( activityId, localGuid, (short)responseMessage.StatusCode, durationTimeSpan.TotalMilliseconds, responseMessage.Headers); return(responseMessage); } catch (TaskCanceledException ex) { if (!cancellationToken.IsCancellationRequested) { // throw timeout if the cancellationToken is not canceled (i.e. httpClient timed out) durationTimeSpan = DateTime.UtcNow - sendTimeUtc; string message = $"GatewayStoreClient Request Timeout. Start Time:{sendTimeUtc}; Total Duration:{durationTimeSpan}; Http Client Timeout:{this.httpClient.Timeout}; Activity id: {requestedActivityId}; Inner Message: {ex.Message};"; throw new RequestTimeoutException(message, ex, requestMessage.RequestUri); } else { throw; } } catch (OperationCanceledException ex) { if (!cancellationToken.IsCancellationRequested) { // throw timeout if the cancellationToken is not canceled (i.e. httpClient timed out) durationTimeSpan = DateTime.UtcNow - sendTimeUtc; string message = $"GatewayStoreClient Request Timeout. Start Time:{sendTimeUtc}; Total Duration:{durationTimeSpan}; Http Client Timeout:{this.httpClient.Timeout}; Activity id: {requestedActivityId}; Inner Message: {ex.Message};"; throw new RequestTimeoutException(message, ex, requestMessage.RequestUri); } else { throw; } } finally { clientSideRequestStatistics.RecordAddressResolutionEnd(recordAddressResolutionId); } } }; return(await BackoffRetryUtility <HttpResponseMessage> .ExecuteAsync(funcDelegate, new WebExceptionRetryPolicy(), cancellationToken)); }
internal override void AddDiagnosticsInternal(CosmosClientSideRequestStatistics clientSideRequestStatistics) { this.ContextList.Add(clientSideRequestStatistics); }
public override void Visit(CosmosClientSideRequestStatistics clientSideRequestStatistics) { }
public override void Visit(CosmosClientSideRequestStatistics clientSideRequestStatistics) { Assert.IsTrue(this.isContextVisited); this.isCosmosClientSideRequestStatisticsVisited = true; DiagnosticValidator.ValidateClientSideRequestStatistics(clientSideRequestStatistics, this.StatusCode); }
public void ToStringTest() { CosmosClientSideRequestStatistics cosmosClientSideRequestStatistics = new CosmosClientSideRequestStatistics(); //Setting null supplementalResponseStatisticsList PointOperationStatistics pointOperationStatistics = new PointOperationStatistics( activityId: Guid.NewGuid().ToString(), statusCode: System.Net.HttpStatusCode.OK, subStatusCode: Documents.SubStatusCodes.Unknown, requestCharge: 42, errorMessage: null, method: HttpMethod.Get, requestUri: new System.Uri("https://localhost:8081"), requestSessionToken: null, responseSessionToken: null, clientSideRequestStatistics: cosmosClientSideRequestStatistics); Assert.IsNotNull(pointOperationStatistics.ToString()); //Adding 5 objects supplementalResponseStatisticsList for (int i = 0; i < 5; i++) { cosmosClientSideRequestStatistics.SupplementalResponseStatisticsList.Add(new StoreResponseStatistics()); } pointOperationStatistics = new PointOperationStatistics( activityId: Guid.NewGuid().ToString(), statusCode: System.Net.HttpStatusCode.OK, subStatusCode: Documents.SubStatusCodes.Unknown, requestCharge: 42, errorMessage: null, method: HttpMethod.Get, requestUri: new System.Uri("https://localhost:8081"), requestSessionToken: null, responseSessionToken: null, clientSideRequestStatistics: cosmosClientSideRequestStatistics); pointOperationStatistics.ToString(); Assert.AreEqual(5, pointOperationStatistics.ClientSideRequestStatistics.SupplementalResponseStatisticsList.Count); //Adding 5 more objects supplementalResponseStatisticsList, making total 10 cosmosClientSideRequestStatistics.SupplementalResponseStatisticsList.AddRange(new List <StoreResponseStatistics>() { new StoreResponseStatistics(), new StoreResponseStatistics(), new StoreResponseStatistics(), new StoreResponseStatistics(), new StoreResponseStatistics() }); pointOperationStatistics = new PointOperationStatistics( activityId: Guid.NewGuid().ToString(), statusCode: System.Net.HttpStatusCode.OK, subStatusCode: Documents.SubStatusCodes.Unknown, requestCharge: 42, errorMessage: null, method: HttpMethod.Get, requestUri: new System.Uri("https://localhost:8081"), requestSessionToken: null, responseSessionToken: null, clientSideRequestStatistics: cosmosClientSideRequestStatistics); pointOperationStatistics.ToString(); Assert.AreEqual(10, pointOperationStatistics.ClientSideRequestStatistics.SupplementalResponseStatisticsList.Count); //Adding 2 more objects supplementalResponseStatisticsList, making total 12 cosmosClientSideRequestStatistics.SupplementalResponseStatisticsList.AddRange(new List <StoreResponseStatistics>() { new StoreResponseStatistics(), new StoreResponseStatistics() }); pointOperationStatistics = new PointOperationStatistics( activityId: Guid.NewGuid().ToString(), statusCode: System.Net.HttpStatusCode.OK, subStatusCode: Documents.SubStatusCodes.Unknown, requestCharge: 42, errorMessage: null, method: HttpMethod.Get, requestUri: new System.Uri("https://localhost:8081"), requestSessionToken: null, responseSessionToken: null, clientSideRequestStatistics: cosmosClientSideRequestStatistics); pointOperationStatistics.ToString(); Assert.AreEqual(12, pointOperationStatistics.ClientSideRequestStatistics.SupplementalResponseStatisticsList.Count); }
internal abstract void AddDiagnosticsInternal(CosmosClientSideRequestStatistics clientSideRequestStatistics);
public override void Visit(CosmosClientSideRequestStatistics clientSideRequestStatistics) { throw new ArgumentException($"Point Operation should not have {nameof(clientSideRequestStatistics)}"); }
public override void Visit(CosmosClientSideRequestStatistics clientSideRequestStatistics) { Assert.IsFalse(this.isClientSideRequestStatisticsVisited, $"Should only be a single {nameof(CosmosClientSideRequestStatistics)}"); this.isClientSideRequestStatisticsVisited = true; }
public void ToStringTest() { CosmosClientSideRequestStatistics cosmosClientSideRequestStatistics = new CosmosClientSideRequestStatistics(); //Setting null supplementalResponseStatisticsList cosmosClientSideRequestStatistics.supplementalResponseStatisticsList = null; PointOperationStatistics pointOperationStatistics = new PointOperationStatistics( statusCode: System.Net.HttpStatusCode.OK, subStatusCode: Documents.SubStatusCodes.Unknown, requestCharge: 42, errorMessage: null, method: HttpMethod.Get, requestUri: new System.Uri("https://localhost:8081"), clientSideRequestStatistics: cosmosClientSideRequestStatistics); pointOperationStatistics.ToString(); Assert.IsNull(pointOperationStatistics.supplementalResponseStatisticsList); //Adding 5 objects supplementalResponseStatisticsList cosmosClientSideRequestStatistics.supplementalResponseStatisticsList = new List <StoreResponseStatistics> { new StoreResponseStatistics(), new StoreResponseStatistics(), new StoreResponseStatistics(), new StoreResponseStatistics(), new StoreResponseStatistics() }; pointOperationStatistics = new PointOperationStatistics( statusCode: System.Net.HttpStatusCode.OK, subStatusCode: Documents.SubStatusCodes.Unknown, requestCharge: 42, errorMessage: null, method: HttpMethod.Get, requestUri: new System.Uri("https://localhost:8081"), clientSideRequestStatistics: cosmosClientSideRequestStatistics); pointOperationStatistics.ToString(); Assert.AreEqual(5, pointOperationStatistics.supplementalResponseStatisticsList.Count); //Adding 5 more objects supplementalResponseStatisticsList, making total 10 cosmosClientSideRequestStatistics.supplementalResponseStatisticsList.AddRange(new List <StoreResponseStatistics>() { new StoreResponseStatistics(), new StoreResponseStatistics(), new StoreResponseStatistics(), new StoreResponseStatistics(), new StoreResponseStatistics() }); pointOperationStatistics = new PointOperationStatistics( statusCode: System.Net.HttpStatusCode.OK, subStatusCode: Documents.SubStatusCodes.Unknown, requestCharge: 42, errorMessage: null, method: HttpMethod.Get, requestUri: new System.Uri("https://localhost:8081"), clientSideRequestStatistics: cosmosClientSideRequestStatistics); pointOperationStatistics.ToString(); Assert.AreEqual(10, pointOperationStatistics.supplementalResponseStatisticsList.Count); //Adding 2 more objects supplementalResponseStatisticsList, making total 12 cosmosClientSideRequestStatistics.supplementalResponseStatisticsList.AddRange(new List <StoreResponseStatistics>() { new StoreResponseStatistics(), new StoreResponseStatistics() }); pointOperationStatistics = new PointOperationStatistics( statusCode: System.Net.HttpStatusCode.OK, subStatusCode: Documents.SubStatusCodes.Unknown, requestCharge: 42, errorMessage: null, method: HttpMethod.Get, requestUri: new System.Uri("https://localhost:8081"), clientSideRequestStatistics: cosmosClientSideRequestStatistics); pointOperationStatistics.ToString(); Assert.AreEqual(10, pointOperationStatistics.supplementalResponseStatisticsList.Count); }