使用 OTEL 跟踪长时间运行作业的进度

问题描述 投票:0回答:1

我正在寻找一种好方法来为我们的应用程序中的一些长时间运行的作业添加可观察性。

应用程序是 dotnet 8。

我们的应用程序有时会启动后台任务来执行一些集成工作,这些任务可能需要几个小时。

我已经在项目中安装了

Azure.Monitor.OpenTelemetry.AspNetCore
nuget 包。

目标是这样的

  • 能够在工作完成之前洞察工作已经开始
  • 能够在运行过程中查看进度信息:“开始步骤 X”等。
  • 确保这些作业的信息没有被抽样出来
  • 确保正常的 Web 请求流量遵循配置的采样率
  • 确保非集成作业日志条目仅发送至“警告”级别以上

挑战

据我所知,我无法在整个作业中使用单个跨度/活动,因为这样在完成之前不会发送任何内容。

我可以在跨度/活动中使用 ILogger,但随后它将受到全局日志级别的约束。

如果我使用“跨度事件”,那么在跨度完成之前它们不会被传输。

似乎无法为 Application Insights 导出器自定义采样率

asp.net-core .net-core azure-application-insights open-telemetry
1个回答
0
投票

到目前为止,你的结论是正确的,但恐怕对于大多数可观察性后端来说,目前这还不是一个很好解决的问题。

现在的最终答案是“多个跨度”。

将其视为消息传递。

  1. 生成一个span,用于将action发送到后台(可能是发送到数据库的action,或者放到后台channel上)并结束它。
  2. 当您从 DB/channel 中选取它进行一部分处理时生成一个跨度并结束它。
  3. 为下一个操作生成跨度并结束它。

您最终将得到一个分布式跟踪,其中没有一个跨度覆盖整个操作。

如果您需要查询开始/结束,您可以执行一些时髦的查询(取决于平台,但对于 kusto/Azure 监视器,您可以这样做,这似乎就是您正在做的事情),或者您可以向下传播开始时间使用行李的链条并将其添加到最后一个跨度。

有一些可观察性后端确实使这种查询变得更容易,请记住并非所有后端都是相同的,有些后端比其他后端更适合此类工作流程,所以这是您唯一的用例,也许可以考虑其他选项。

© www.soinside.com 2019 - 2024. All rights reserved.