- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我觉得这应该比结果简单得多,或者我只是想太多了。
我有一个 .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 找到.
关于c# - 将 Hangfire 作业记录到 Application Insights 并将事件与操作 ID 相关联,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/64955718/
我有多个应用程序使用 Application Insights for Production Data。我正在尝试使用 City 遥测字段来映射我们当前的用户。这些数据的跟踪似乎非常不一致,并且在大多
有没有办法在 ASP.NET Web 应用程序中禁用 Application Insights?假设我想关闭生产中运行的应用程序中的所有数据收集。 最佳答案 如果 ikey 在 Application
如何在 Azure Application Insights 中将时差转换为毫秒 let startTime = todatetime('2017-05-15T17:02:23.7148691Z');
我在 Application Insights Analytics 中有一些数据,它有一个动态对象作为自定义维度的属性。例如: | timestamp | name
我从 Chrome 开发工具和 Google Page Speed Insights 页面运行 Google Page Speed Insights(移动)得到了不同的结果。当我从 Chrome 开发
我在我的 ASP.NET MVC Angular 应用程序中使用 App insights。我在我的布局文件中插入了 JavaScript block (我得到了 from the Microsoft
在我们当前的本地设置中,我们有 20 多个 .net core 3.1 API 应用程序(单独的 ASP.NET Core API 应用程序)。我们已开始将 2 个 APi 应用程序迁移到使用单个 A
我有一个应用洞察查询。在此查询中,我想将多个列加入/合并为一个列以显示如何实现这一点。 我想结合 ip、城市、州、国家。 customEvents | where timestamp >= ago(7
我有一个托管在 Windows Server 2008 上的 ASP.Net MVC 4 应用程序。我使用的是 Microsoft Application Insights,它非常适用于客户端指标,例
我已经开始使用应用程序洞察来记录来自控制台应用程序的消息。 仅记录严重和错误。未记录信息或跟踪。关于为什么排除信息的任何想法? class Program { static void Mai
我将 App Service 捆绑的 App Insights 代理与 .Net 4.7 应用程序一起使用,并且没有使用 SDK。我配置代理的唯一选项是应用程序设置,如文档 https://docs.
我正在使用 Application insights 进行由外向内测试,但我的代码未使用它进行检测。我不想收到关于我的服务的每周电子邮件摘要,因为大多数栏目都是空白的。如何禁用正在发送的电子邮件? (
这不是一个特别技术性的问题,但是其他人的洞察数据有问题吗? http://www.facebook.com/insights/?sk=ao_119242438097337 自 18 日(6 天前)以来
我们的 ASP.NET MVC 应用程序包含一些 URI 路径参数,例如: https://example.com/api/query/14hes1017ceimgS2ESsIec 在 Applica
我想使用一个包含数组的变量,所以我可以将它与 in 过滤器一起使用。 这行得通: traces | where cloud_RoleName in ("A", "B") 这不起作用(语法错误): le
我的 Facebook Insights 帐户中添加了 Facebook“Insights For My Domain”。我有一个不再使用的旧域,想从我的 Facebook Insights 帐户中删
有人使用过Sonatype Insight-Application Health Checker吗?它要求您扫描应用程序(war、jar、zip 等),然后将其结果上传到Sonatype Insigh
我正在使用这个引用 documentation用于应用洞察。 如何使用不同查询的输出进行子选择? //Query 1 Events | where Timestamp >= ago(30min) a
我正在试用预览版,并尝试将见解添加到本地部署在我机器上的 IIS Web 应用程序。它是一个运行在普通应用程序池中的 .Net 4.5 应用程序。添加见解后启动应用程序时,出现此异常: 无法加载文件或
如何将 Application insights 最终用户用户分析添加到 DocFx 以跟踪每个文档页面的使用情况? Application Insights 文档指出您需要在结束标记之前立即插入下面
我是一名优秀的程序员,十分优秀!