Ejemplo n.º 1
0
        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;
     }
 }
Ejemplo n.º 5
0
        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);
            }
        }
Ejemplo n.º 9
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)
 {
 }
Ejemplo n.º 12
0
        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;
 }
Ejemplo n.º 20
0
        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);
        }