in Microsoft.Azure.Cosmos/src/Tracing/TraceWriter.TraceTextWriter.cs [334:468]
public void Visit(ClientSideRequestStatisticsTraceDatum clientSideRequestStatisticsTraceDatum)
{
StringBuilder stringBuilder = new StringBuilder();
stringBuilder.AppendLine($"Start Time: {clientSideRequestStatisticsTraceDatum.RequestStartTimeUtc.ToString(TraceWriter.HourTimeFormatString, CultureInfo.InvariantCulture)}");
if (clientSideRequestStatisticsTraceDatum.RequestEndTimeUtc.HasValue)
{
stringBuilder.AppendLine($"End Time: {clientSideRequestStatisticsTraceDatum.RequestEndTimeUtc.Value.ToString(TraceWriter.HourTimeFormatString, CultureInfo.InvariantCulture)}");
}
stringBuilder.AppendLine("Contacted Replicas");
Dictionary<Documents.TransportAddressUri, int> uriAndCounts = new Dictionary<Documents.TransportAddressUri, int>();
foreach (Documents.TransportAddressUri uri in clientSideRequestStatisticsTraceDatum.ContactedReplicas)
{
if (uri == null)
{
continue;
}
if (!uriAndCounts.TryGetValue(uri, out int count))
{
count = 0;
}
uriAndCounts[uri] = ++count;
}
foreach (KeyValuePair<Documents.TransportAddressUri, int> uriAndCount in uriAndCounts)
{
stringBuilder.AppendLine($"{space}{uriAndCount.Key?.ToString() ?? "<null>"}: {uriAndCount.Value}");
}
stringBuilder.AppendLine("Failed to Contact Replicas");
foreach (Documents.TransportAddressUri failedToContactReplica in clientSideRequestStatisticsTraceDatum.FailedReplicas)
{
stringBuilder.AppendLine($"{space}{failedToContactReplica?.ToString() ?? "<null>"}");
}
stringBuilder.AppendLine("Regions Contacted");
foreach (Documents.TransportAddressUri regionContacted in clientSideRequestStatisticsTraceDatum.ContactedReplicas)
{
stringBuilder.AppendLine($"{space}{regionContacted?.ToString() ?? "<null>"}");
}
stringBuilder.AppendLine("Address Resolution Statistics");
stringBuilder.AppendLine(AddressResolutionStatisticsTextTable.Singleton.TopLine);
stringBuilder.AppendLine(AddressResolutionStatisticsTextTable.Singleton.Header);
stringBuilder.AppendLine(AddressResolutionStatisticsTextTable.Singleton.MiddleLine);
foreach (KeyValuePair<string, AddressResolutionStatistics> stat in clientSideRequestStatisticsTraceDatum.EndpointToAddressResolutionStatistics)
{
string row = AddressResolutionStatisticsTextTable.Singleton.GetRow(
stat.Value.StartTime.ToString(TraceWriter.HourTimeFormatString, CultureInfo.InvariantCulture),
stat.Value.EndTime.HasValue ? stat.Value.EndTime.Value.ToString(TraceWriter.HourTimeFormatString, CultureInfo.InvariantCulture) : "NO END TIME",
stat.Value.TargetEndpoint);
stringBuilder.AppendLine(row);
}
stringBuilder.AppendLine(AddressResolutionStatisticsTextTable.Singleton.BottomLine);
stringBuilder.AppendLine("Store Response Statistics");
foreach (StoreResponseStatistics stat in clientSideRequestStatisticsTraceDatum.StoreResponseStatisticsList)
{
if (stat.RequestStartTime.HasValue)
{
stringBuilder.AppendLine($"{space}Start Time: {stat.RequestStartTime.Value.ToString(TraceWriter.HourTimeFormatString, CultureInfo.InvariantCulture)}");
}
else
{
stringBuilder.AppendLine("{space}Start Time Not Found");
}
stringBuilder.AppendLine($"{space}End Time: {stat.RequestResponseTime.ToString(TraceWriter.HourTimeFormatString, CultureInfo.InvariantCulture)}");
stringBuilder.AppendLine($"{space}Resource Type: {stat.RequestResourceType}");
stringBuilder.AppendLine($"{space}Operation Type: {stat.RequestOperationType}");
if (stat.StoreResult != null)
{
stringBuilder.AppendLine($"{space}Store Result");
stringBuilder.AppendLine($"{space}{space}Activity Id: {stat.StoreResult.ActivityId ?? "<null>"}");
stringBuilder.AppendLine($"{space}{space}Store Physical Address: {stat.StoreResult.StorePhysicalAddress?.ToString() ?? "<null>"}");
stringBuilder.AppendLine($"{space}{space}Status Code: {stat.StoreResult.StatusCode}/{stat.StoreResult.SubStatusCode}");
stringBuilder.AppendLine($"{space}{space}Is Valid: {stat.StoreResult.IsValid}");
stringBuilder.AppendLine($"{space}{space}LSN Info");
stringBuilder.AppendLine($"{space}{space}{space}LSN: {stat.StoreResult.LSN}");
stringBuilder.AppendLine($"{space}{space}{space}Item LSN: {stat.StoreResult.ItemLSN}");
stringBuilder.AppendLine($"{space}{space}{space}Global LSN: {stat.StoreResult.GlobalCommittedLSN}");
stringBuilder.AppendLine($"{space}{space}{space}Quorum Acked LSN: {stat.StoreResult.QuorumAckedLSN}");
stringBuilder.AppendLine($"{space}{space}{space}Using LSN: {stat.StoreResult.UsingLocalLSN}");
stringBuilder.AppendLine($"{space}{space}Session Token: {stat.StoreResult.SessionToken?.ConvertToString() ?? "<null>"}");
stringBuilder.AppendLine($"{space}{space}Quorum Info");
stringBuilder.AppendLine($"{space}{space}{space}Current Replica Set Size: {stat.StoreResult.CurrentReplicaSetSize}");
stringBuilder.AppendLine($"{space}{space}{space}Current Write Quorum: {stat.StoreResult.CurrentWriteQuorum}");
stringBuilder.AppendLine($"{space}{space}Exception");
try
{
stringBuilder.AppendLine($"{space}{space}{stat.StoreResult.GetException()}");
}
catch (Exception)
{
// This method throws if there is no exception.
}
}
}
if (clientSideRequestStatisticsTraceDatum.HttpResponseStatisticsList.Any())
{
stringBuilder.AppendLine("Http Response Statistics");
foreach (HttpResponseStatistics stat in clientSideRequestStatisticsTraceDatum.HttpResponseStatisticsList)
{
stringBuilder.AppendLine($"{space}HttpResponse");
stringBuilder.AppendLine($"{space}{space}RequestStartTime: {stat.RequestStartTime.ToString("o", CultureInfo.InvariantCulture)}");
stringBuilder.AppendLine($"{space}{space}DurationInMs: {stat.Duration.TotalMilliseconds:0.00}");
stringBuilder.AppendLine($"{space}{space}RequestUri: {stat.RequestUri}");
stringBuilder.AppendLine($"{space}{space}ResourceType: {stat.ResourceType}");
stringBuilder.AppendLine($"{space}{space}HttpMethod: {stat.HttpMethod}");
if (stat.Exception != null)
{
stringBuilder.AppendLine($"{space}{space}ExceptionType: {stat.Exception.GetType()}");
stringBuilder.AppendLine($"{space}{space}ExceptionMessage: {stat.Exception.Message}");
}
if (stat.HttpResponseMessage != null)
{
stringBuilder.AppendLine($"{space}{space}StatusCode: {stat.HttpResponseMessage.StatusCode}");
if (!stat.HttpResponseMessage.IsSuccessStatusCode)
{
stringBuilder.AppendLine($"{space}{space}ReasonPhrase: {stat.HttpResponseMessage.ReasonPhrase}");
}
}
}
}
this.toStringValue = stringBuilder.ToString();
}