Skip to content
Original file line number Diff line number Diff line change
Expand Up @@ -223,7 +223,7 @@ Documents.OperationType operationType
this.scope.AddAttribute(OpenTelemetryAttributeKeys.RequestContentLength, this.response.RequestContentLength);
this.scope.AddAttribute(OpenTelemetryAttributeKeys.ResponseContentLength, this.response.ResponseContentLength);
this.scope.AddAttribute(OpenTelemetryAttributeKeys.StatusCode, (int)this.response.StatusCode);
this.scope.AddAttribute(OpenTelemetryAttributeKeys.SubStatusCode, (int)this.response.SubStatusCode);
this.scope.AddAttribute(OpenTelemetryAttributeKeys.SubStatusCode, this.response.SubStatusCode);
this.scope.AddAttribute(OpenTelemetryAttributeKeys.RequestCharge, this.response.RequestCharge);
this.scope.AddAttribute(OpenTelemetryAttributeKeys.ItemCount, this.response.ItemCount);
this.scope.AddAttribute(OpenTelemetryAttributeKeys.ActivityId, this.response.ActivityId);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -4,37 +4,39 @@

namespace Microsoft.Azure.Cosmos
{
using System;
using System.IO;
using System.Net;
using Microsoft.Azure.Cosmos.Core.Trace;
using Telemetry;

internal sealed class OpenTelemetryResponse : OpenTelemetryAttributes
{
internal OpenTelemetryResponse(TransactionalBatchResponse responseMessage)
: this(
statusCode: responseMessage.StatusCode,
requestCharge: responseMessage.Headers?.RequestCharge,
requestCharge: OpenTelemetryResponse.GetHeader(responseMessage)?.RequestCharge,
responseContentLength: null,
diagnostics: responseMessage.Diagnostics,
itemCount: responseMessage.Headers?.ItemCount,
itemCount: OpenTelemetryResponse.GetHeader(responseMessage)?.ItemCount,
requestMessage: null,
subStatusCode: (int)responseMessage.Headers?.SubStatusCode,
activityId: responseMessage.Headers?.ActivityId,
correlationId: responseMessage.Headers?.CorrelatedActivityId)
subStatusCode: OpenTelemetryResponse.GetHeader(responseMessage)?.SubStatusCode,
activityId: OpenTelemetryResponse.GetHeader(responseMessage)?.ActivityId,
correlationId: OpenTelemetryResponse.GetHeader(responseMessage)?.CorrelatedActivityId)
{
}

internal OpenTelemetryResponse(ResponseMessage responseMessage)
: this(
statusCode: responseMessage.StatusCode,
requestCharge: responseMessage.Headers?.RequestCharge,
requestCharge: OpenTelemetryResponse.GetHeader(responseMessage)?.RequestCharge,
responseContentLength: OpenTelemetryResponse.GetPayloadSize(responseMessage),
diagnostics: responseMessage.Diagnostics,
itemCount: responseMessage.Headers?.ItemCount,
itemCount: OpenTelemetryResponse.GetHeader(responseMessage)?.ItemCount,
requestMessage: responseMessage.RequestMessage,
subStatusCode: (int)responseMessage.Headers?.SubStatusCode,
activityId: responseMessage.Headers?.ActivityId,
correlationId: responseMessage.Headers?.CorrelatedActivityId,
subStatusCode: OpenTelemetryResponse.GetHeader(responseMessage)?.SubStatusCode,
activityId: OpenTelemetryResponse.GetHeader(responseMessage)?.ActivityId,
correlationId: OpenTelemetryResponse.GetHeader(responseMessage)?.CorrelatedActivityId,
operationType: responseMessage is QueryResponse ? Documents.OperationType.Query : Documents.OperationType.Invalid
)
{
Expand All @@ -47,7 +49,7 @@ private OpenTelemetryResponse(
CosmosDiagnostics diagnostics,
string itemCount,
RequestMessage requestMessage,
int subStatusCode,
Documents.SubStatusCodes? subStatusCode,
string activityId,
string correlationId,
Documents.OperationType operationType = Documents.OperationType.Invalid)
Expand All @@ -58,7 +60,7 @@ private OpenTelemetryResponse(
this.ResponseContentLength = responseContentLength;
this.Diagnostics = diagnostics;
this.ItemCount = itemCount;
this.SubStatusCode = subStatusCode;
this.SubStatusCode = (int)(subStatusCode ?? Documents.SubStatusCodes.Unknown);
this.ActivityId = activityId;
this.CorrelatedActivityId = correlationId;
this.OperationType = operationType;
Expand All @@ -74,5 +76,31 @@ private static string GetPayloadSize(ResponseMessage response)
}
return response?.Headers?.ContentLength;
}

private static Headers GetHeader(TransactionalBatchResponse responseMessage)
{
try
{
return responseMessage?.Headers;
}
catch (NotImplementedException ex)
{
DefaultTrace.TraceVerbose("Failed to get headers from TransactionalBatchResponse. Exception: {0}", ex);
return null;
}
}

private static Headers GetHeader(ResponseMessage responseMessage)
{
try
{
return responseMessage?.Headers;
}
catch (NotImplementedException ex)
{
DefaultTrace.TraceVerbose("Failed to get headers from ResponseMessage. Exception: {0}", ex);
return null;
}
}
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -4,37 +4,39 @@

namespace Microsoft.Azure.Cosmos
{
using System;
using System.Net;
using Microsoft.Azure.Cosmos.Core.Trace;
using Telemetry;

internal sealed class OpenTelemetryResponse<T> : OpenTelemetryAttributes
{
internal OpenTelemetryResponse(FeedResponse<T> responseMessage)
: this(
statusCode: responseMessage.StatusCode,
requestCharge: responseMessage.Headers?.RequestCharge,
responseContentLength: responseMessage?.Headers?.ContentLength,
requestCharge: OpenTelemetryResponse<T>.GetHeader(responseMessage)?.RequestCharge,
responseContentLength: OpenTelemetryResponse<T>.GetHeader(responseMessage)?.ContentLength,
diagnostics: responseMessage.Diagnostics,
itemCount: responseMessage.Headers?.ItemCount,
itemCount: OpenTelemetryResponse<T>.GetHeader(responseMessage)?.ItemCount,
requestMessage: responseMessage.RequestMessage,
subStatusCode: (int)responseMessage.Headers?.SubStatusCode,
activityId: responseMessage.Headers?.ActivityId,
correlatedActivityId: responseMessage.Headers?.CorrelatedActivityId,
subStatusCode: OpenTelemetryResponse<T>.GetHeader(responseMessage)?.SubStatusCode,
activityId: OpenTelemetryResponse<T>.GetHeader(responseMessage)?.ActivityId,
correlatedActivityId: OpenTelemetryResponse<T>.GetHeader(responseMessage)?.CorrelatedActivityId,
operationType: responseMessage is QueryResponse<T> ? Documents.OperationType.Query : Documents.OperationType.Invalid)
{
}

internal OpenTelemetryResponse(Response<T> responseMessage)
: this(
statusCode: responseMessage.StatusCode,
requestCharge: responseMessage.Headers?.RequestCharge,
responseContentLength: responseMessage?.Headers?.ContentLength,
requestCharge: OpenTelemetryResponse<T>.GetHeader(responseMessage)?.RequestCharge,
responseContentLength: OpenTelemetryResponse<T>.GetHeader(responseMessage)?.ContentLength,
diagnostics: responseMessage.Diagnostics,
itemCount: responseMessage.Headers?.ItemCount,
itemCount: OpenTelemetryResponse<T>.GetHeader(responseMessage)?.ItemCount,
requestMessage: responseMessage.RequestMessage,
subStatusCode: (int)responseMessage.Headers?.SubStatusCode,
activityId: responseMessage.Headers?.ActivityId,
correlatedActivityId: responseMessage.Headers?.CorrelatedActivityId,
subStatusCode: OpenTelemetryResponse<T>.GetHeader(responseMessage)?.SubStatusCode,
activityId: OpenTelemetryResponse<T>.GetHeader(responseMessage)?.ActivityId,
correlatedActivityId: OpenTelemetryResponse<T>.GetHeader(responseMessage)?.CorrelatedActivityId,
operationType: responseMessage is QueryResponse ? Documents.OperationType.Query : Documents.OperationType.Invalid)
{
}
Expand All @@ -46,7 +48,7 @@ private OpenTelemetryResponse(
CosmosDiagnostics diagnostics,
string itemCount,
RequestMessage requestMessage,
int subStatusCode,
Documents.SubStatusCodes? subStatusCode,
string activityId,
string correlatedActivityId,
Documents.OperationType operationType)
Expand All @@ -57,10 +59,36 @@ private OpenTelemetryResponse(
this.ResponseContentLength = responseContentLength;
this.Diagnostics = diagnostics;
this.ItemCount = itemCount;
this.SubStatusCode = subStatusCode;
this.SubStatusCode = (int)(subStatusCode ?? Documents.SubStatusCodes.Unknown);
this.ActivityId = activityId;
this.CorrelatedActivityId = correlatedActivityId;
this.OperationType = operationType;
}

private static Headers GetHeader(FeedResponse<T> responseMessage)
{
try
{
return responseMessage?.Headers;
}
catch (NotImplementedException ex)
{
DefaultTrace.TraceWarning("Failed to get headers from FeedResponse<T>. Exception: {0}", ex);
return null;
}
}

private static Headers GetHeader(Response<T> responseMessage)
{
try
{
return responseMessage?.Headers;
}
catch (NotImplementedException ex)
{
DefaultTrace.TraceWarning("Failed to get headers from Response<T>. Exception: {0}", ex);
return null;
}
}
}
}
Loading