来自服务总线消息的公共交通访问 Activity
masstransit access Activity from service bus message
我正在使用 Masstransit 在两个服务之间通过服务总线发送 Request/Response(不要问为什么)。
我想设置自定义应用程序洞察遥测。我知道 ServiceBus 消息添加了诊断元数据,因此消费者可以提取它并使用它来添加服务之间的关联。但是我无法在 MassTransit 中访问它,或者至少我不知道如何访问它。
有什么建议吗?
您可以将 Application Insights 与 MassTransit 一起使用,有一个包可以直接写入指标。
文档可在此处获取:
http://masstransit-project.com/MassTransit/usage/monitoring/applications-insights.html
此外,根据我使用 DiagnosticSource 的经验,我认为您可以从任何地方访问 Activity.Current
。不过,AppInsights 可能会有所不同。
几个月过去了,我实施的解决方案被证明是一个很好的解决方案。
我创建了实现 IReceiveObserver 的 class。在 PreReceive 上,我能够访问 (ServiceBusReceiveContext)context 并启动具有正确父 ID 的遥测操作。所以看起来像这样:
public Task PreReceive(ReceiveContext context)
{
var serviceBusContext = (ServiceBusReceiveContext)context;
var requestActivity = new Activity("Process");
requestActivity.SetParentId(serviceBusContext.Properties["Diagnostic-Id"].ToString());
IOperationHolder<RequestTelemetry> operation = _telemetryClient.StartOperation<RequestTelemetry>(requestActivity);
operation.Telemetry.Success = true;
serviceBusContext.Properties.Add(TelemetryOperationKey, operation);
return Task.CompletedTask;
}
在 PostReceive 上我可以停止操作:
public Task PostReceive(ReceiveContext context)
{
var serviceBusContext = (ServiceBusReceiveContext)context;
var operation = (IOperationHolder<RequestTelemetry>)serviceBusContext.Properties[TelemetryOperationKey];
operation.Dispose();
return Task.CompletedTask;
}
发生异常时我也会施展魔法:
public Task ReceiveFault(ReceiveContext context, Exception exception)
{
_telemetryClient.TrackException(exception);
var serviceBusContext = (ServiceBusReceiveContext)context;
var operation = (IOperationHolder<RequestTelemetry>)serviceBusContext.Properties[TelemetryOperationKey];
operation.Telemetry.ResponseCode = "Fail";
operation.Telemetry.Success = false;
operation.Dispose();
return Task.CompletedTask;
}
很难通过阅读 MassTransit 文档找到此解决方案。我会说 MassTransit 在某些情况下是一个很棒的工具,没有其他选择。但是文档很差。
我正在使用 Masstransit 在两个服务之间通过服务总线发送 Request/Response(不要问为什么)。
我想设置自定义应用程序洞察遥测。我知道 ServiceBus 消息添加了诊断元数据,因此消费者可以提取它并使用它来添加服务之间的关联。但是我无法在 MassTransit 中访问它,或者至少我不知道如何访问它。
有什么建议吗?
您可以将 Application Insights 与 MassTransit 一起使用,有一个包可以直接写入指标。
文档可在此处获取:
http://masstransit-project.com/MassTransit/usage/monitoring/applications-insights.html
此外,根据我使用 DiagnosticSource 的经验,我认为您可以从任何地方访问 Activity.Current
。不过,AppInsights 可能会有所不同。
几个月过去了,我实施的解决方案被证明是一个很好的解决方案。 我创建了实现 IReceiveObserver 的 class。在 PreReceive 上,我能够访问 (ServiceBusReceiveContext)context 并启动具有正确父 ID 的遥测操作。所以看起来像这样:
public Task PreReceive(ReceiveContext context)
{
var serviceBusContext = (ServiceBusReceiveContext)context;
var requestActivity = new Activity("Process");
requestActivity.SetParentId(serviceBusContext.Properties["Diagnostic-Id"].ToString());
IOperationHolder<RequestTelemetry> operation = _telemetryClient.StartOperation<RequestTelemetry>(requestActivity);
operation.Telemetry.Success = true;
serviceBusContext.Properties.Add(TelemetryOperationKey, operation);
return Task.CompletedTask;
}
在 PostReceive 上我可以停止操作:
public Task PostReceive(ReceiveContext context)
{
var serviceBusContext = (ServiceBusReceiveContext)context;
var operation = (IOperationHolder<RequestTelemetry>)serviceBusContext.Properties[TelemetryOperationKey];
operation.Dispose();
return Task.CompletedTask;
}
发生异常时我也会施展魔法:
public Task ReceiveFault(ReceiveContext context, Exception exception)
{
_telemetryClient.TrackException(exception);
var serviceBusContext = (ServiceBusReceiveContext)context;
var operation = (IOperationHolder<RequestTelemetry>)serviceBusContext.Properties[TelemetryOperationKey];
operation.Telemetry.ResponseCode = "Fail";
operation.Telemetry.Success = false;
operation.Dispose();
return Task.CompletedTask;
}
很难通过阅读 MassTransit 文档找到此解决方案。我会说 MassTransit 在某些情况下是一个很棒的工具,没有其他选择。但是文档很差。