首页 > 解决方案 > 使用自定义遥测修复端到端跟踪

问题描述

我有一个基于天蓝色功能的天蓝色应用程序。假设它由名为 A 和 B 的两个应用程序组成,并且 A 和 B 具有以下功能:

A:

乙:

应用 A 和 B 通过来自 func_A_2 的 HTTP 帖子连接,该帖子触发 func_B_1。所有其他功能都与服务总线队列相连(A 为 1 -> 2,B 为 1 -> 2 -> 3)。整个应用程序是用 Java 编写的。

目前,我们在应用程序洞察中得到了如下所示的痕迹

func_A_1 -> func_A_2 -> HTTP POST -> func_B_1 -> func_B_2 -> func_B_3

并且请求 id 表看起来像这样(简化)

功能 操作 ID ID 家长 ID
func_A_1 AAA 1 AAA
func_A_2 AAA 2 1
HTTP POST AAA 3 2
func_B_1 AAA 4 3
func_B_2 AAA 5 4
func_B_3 AAA 6 5

并且所有调用都在相同的操作 id 下。这是完美的。但这仅在我们在 Windows 实例上运行应用程序时才有效。由于其他原因,我们不得不更改为 Linux 实例。从文档来看,Linux 上 Java 实例的 HTTP 请求似乎没有被自动跟踪,这意味着我们在两个不同的操作 id 下获得了两个单独的跟踪,如下所示:

func_A_1 -> func_A_2

func_B_1 -> func_B_2 -> func_B_3

并且请求 id 表看起来像这样(简化)

功能 操作 ID ID 家长 ID
func_A_1 AAA 1 AAA
func_A_2 AAA 2 1
func_B_1 BBB 3 BBB
func_B_2 BBB 4 3
func_B_3 BBB 5 4

作为一种解决方案,我的想法是制作一个自定义遥测来处理丢失的 HTTP POST 跟踪。

从 ExecutionContext 我可以使用 getTraceContext().getTraceparent() 来获取 func_A_2 中的 Id 和操作 Id,因为它具有以下形式:00-AAA-2-00。我的想法是在帖子的 HTTP 标头中发送这些信息。然后在 func_B_1 开始时,我将使用 (parentId = 2, operationId = AAA, id = 3) 创建一个名为 HTTP POST 的自定义遥测,我想这将使它出现在应用程序洞察跟踪中的 func_A_2 下方。但是,我仍想对 (func_B_1 -> func_B_2 -> func_B_3) 链使用天蓝色自动跟踪。这意味着我必须以某种方式将 func_B_1 的 ExecutionContext parentId 和 operationId 更改为 3 和 AAA(并且 azure 有望通过链为我携带新的操作 ID,并为函数 1 到 3 创建新的 ID)。但我找不到任何方法来实现这一点。我尝试使用:

RequestTelemetryContext context = new RequestTelemetryContext()
context.getHttpRequestTelemetry().getContext().getOperation().setId("AAA")
context.getHttpRequestTelemetry().getContext().getOperation().setParentId("2")
ThreadContext.setRequestTelemetryContext(context)

但是,这似乎并没有改变自动生成遥测的 Azure 应用程序见解中的实际 Id。也许我的方法是不可能的。但是,任何可以让我找到解决方案的帮助都将不胜感激。

标签: javaazureazure-functionsazure-application-insightstelemetry

解决方案


推荐阅读