Skip to content

Distributed Tracing: Fixes SDK responses compatibility with opentelemetry response #4097

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Merged
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