gpt4 book ai didi

c# - 将 Hangfire 作业记录到 Application Insights 并将事件与操作 ID 相关联

转载 作者:行者123 更新时间:2023-12-04 08:32:34 26 4
gpt4 key购买 nike

我觉得这应该比结果简单得多,或者我只是想太多了。

我有一个 .NET Core 3.1 Web API 应用程序,它使用 HangFire 在后台处理一些作业。我还配置了 Application Insights 以从 .NET Core API 记录遥测。

我可以查看 Application Insights 中记录的日志记录事件和依赖项遥测数据。但是,每个事件/日志/依赖项都会根据唯一的操作 ID 和父 ID 进行记录。

我正在尝试确定如何确保记录的任何事件或在后台作业上下文中使用的任何依赖项都根据对后台作业进行排队的原始请求的操作 ID 和/或父 ID 进行记录.

当我对作业进行排队时,我可以获得传入 HTTP 请求的当前操作 ID,然后将其与作业一起推送到 HangFire 队列中。当作业执行时,我可以取回该OperationId。然后,我需要做的是使 OperationID 在作业执行的整个上下文/生命周期中可用,以便将其附加到发送到 Application Insightd 的任何遥测。

我认为我可以创建一个 IJobContext 接口(interface),可以将其注入(inject)到执行该作业的类中。在这种情况下,我可以推送 OperationID。然后,我可以创建一个 ITelemetryInitializer,它也将 IJobContext 作为依赖项。然后,在 ITelemetryInitializer 中,我可以设置发送到 Application Insights 的遥测数据的 OperationID 和 ParentId。这是一些简单的代码:

public class HangFirePanelMessageQueue : IMessageQueue
{
private readonly MessageProcessor _messageProcessor;
private readonly IHangFireJobContext _jobContext;
private readonly TelemetryClient _telemetryClient;

public HangFirePanelMessageQueue(MessageProcessor panelMessageProcessor,
IIoTMessageSerializer iotHubMessageSerialiser,
IHangFireJobContext jobContext, TelemetryClient telemetryClient)
{
_messageProcessor = panelMessageProcessor;
_jobContext = jobContext;
_telemetryClient = telemetryClient;
}

public async Task ProcessQueuedMessage(string message, string operationId)
{
var iotMessage = _iotHubMessageSerialiser.GetMessage(message);

_jobContext?.Set(iotMessage.CorrelationID, iotMessage.MessageID);

await _messageProcessor.ProcessMessage(iotMessage);
}

public Task QueueMessageForProcessing(string message)
{
var dummyTrace = new TraceTelemetry("Queuing message for processing", SeverityLevel.Information);
_telemetryClient.TrackTrace(dummyTrace);
string opId = dummyTrace.Context.Operation.Id;

BackgroundJob.Enqueue(() =>
ProcessQueuedMessage(message, opId));

return Task.CompletedTask;
}
}

IJobContext 看起来像这样:

public interface IHangFireJobContext
{
bool Initialised { get; }

string OperationId { get; }

string JobId { get; }

void Set(string operationId, string jobId);
}

然后我会有一个 ITelemetryInitializer 来丰富任何 ITelemetry:

public class EnrichBackgroundJobTelemetry : ITelemetryInitializer
{
private readonly IHangFireJobContext jobContext;

public EnrichBackgroundJobTelemetry(IHangFireJobContext jobContext)
{
this.jobContext = jobContext;
}

public void Initialize(ITelemetry telemetry)
{
if (!jobContext.Initialised)
{
return;
}

telemetry.Context.Operation.Id = jobContext.OperationId;
}
}

但是我遇到的问题是 ITelemetryInitializer 是一个单例,因此它将使用 IHangFireJobContext 实例化一次,然后永远不会为任何后续 HangFire 作业进行更新。

我确实找到了https://github.com/skwasjer/Hangfire.Correlate项目,延伸https://github.com/skwasjer/Correlate 。 Correlate 创建一个关联上下文,可以通过类似于 IHttpContextAccessor 的 ICorrelationContextAccessor 访问该上下文。

但是,Correlate 的脚注指出“请考虑 .NET Core 3 现在具有对 W3C TraceContext 的内置支持(博客),并且还有其他分布式跟踪库,其功能比 Correlate 多。”其中将 Application Insights 列为更高级的分布式跟踪的替代方案之一。

那么,任何人都可以帮助我了解如何丰富在 HangFire 作业上下文中创建的任何进入 Application Insights 的遥测吗?我认为正确的答案是使用 ITelemetryInitializer 并填充该 ITelemetry 项上的 OperationId,但是,我不确定要向 ITelemetryInitialzer 中注入(inject)什么依赖项才能访问 HangFire 作业上下文。

最佳答案

When I queue a job, I can get the current OperationId of the incoming HTTP request, and I push that into the HangFire queue with the job.

那么,我说你有一个 Controller 操作可以将工作推向停滞状态,这样说对吗?如果是这样,您可以做的是在 Controller 方法内获取操作 ID 并将其传递给作业。使用该操作 ID 来启动使用该操作 ID 的新操作。该操作以及该操作期间生成的所有遥测数据将链接到原始请求。

我没有hangfire集成,但下面的代码显示了总体思路:一些工作在后台排队等待完成,并且应该链接到有关遥测的请求:

        [HttpGet("/api/demo5")]
public ActionResult TrackWorker()
{
var requestTelemetry = HttpContext.Features.Get<RequestTelemetry>();

_taskQueue.QueueBackgroundWorkItem(async ct =>
{
using(var op = _telemetryClient.StartOperation<DependencyTelemetry>("QueuedWork", requestTelemetry.Context.Operation.Id))
{
_ = await new HttpClient().GetStringAsync("http://blank.org");

await Task.Delay(250);
op.Telemetry.ResultCode = "200";
op.Telemetry.Success = true;
}
});

return Accepted();
}

完整的示例可以在 here 找到.

enter image description here

关于c# - 将 Hangfire 作业记录到 Application Insights 并将事件与操作 ID 相关联,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/64955718/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com