Azure Insights:通过函数执行链跟踪自定义属性

Posted

技术标签:

【中文标题】Azure Insights:通过函数执行链跟踪自定义属性【英文标题】:Azure Insights: tracking custom property through the chain of function executions 【发布时间】:2022-01-19 18:39:45 【问题描述】:

我的 Azure 应用中有 Azure Function1->Function2->Service 调用流。 Function1 有多个并发调用,每个调用都可以通过一些唯一的输入文档 ID 来标识。我想知道如何在 c# 代码中将 Azure Insight 上下文中的某些内容设置为 Funciton1 开头的该文档 ID,以便在任何后续调用中登录到 Azure Insights 的任何 [traces][exceptions][dependencies] 都包含文档 ID。我注意到它们都有customDimension 嵌套的属性列表,所以可能会以某种方式在其中添加一个属性。另外,如果 Function1 并行运行多次,我不希望这些文档 id 混淆。

目标是能够以最少的额外 c# 代码在各种日志中跟踪此文档 id,避免将文档 id 从函数传递到其他函数和其他服务,因此查看任何类型的日志(wheatear it's跟踪或异常或其他)我能够立即识别执行所属的文档。有可能吗?

【问题讨论】:

【参考方案1】:

要将自定义属性附加到所有日志,使用 azure 函数并不难,只需使用 telemetry initializer 即可:

    public class TelemetryEnrichment : ITelemetryInitializer
    
        public void Initialize(ITelemetry telemetry)
        
            if (!(telemetry is ISupportProperties item)) return;

            // Demonstrate static property
            item.Properties["Environment"] = "Production";
        
    

如果是 http 触发函数,您可以像这样丰富请求遥测:

var requestTelemetry = req.HttpContext.Features.Get<RequestTelemetry>();
requestTelemetry.Properties.Add("aProp", "aValue");

您还希望拥有由入口函数调用的其他函数记录的属性。这并不容易做到:您需要手动将 id 传递给另一个函数,例如使用该函数的 url 传递它。

但是,如果您必须将 ID 附加到入口函数的日志,您可以轻松地创建一个查询来关联日志。基于operation id可以得到函数和服务之间通信流程的全貌,见the docs:

这样,您无需将 Id 作为自定义属性包含在每个遥测项中。

【讨论】:

彼得,谢谢您的回答。但是,将这种方法应用于我的情况有几个问题,我不知道如何克服:1)ITelemetryInitializer 对我不起作用,因为我需要记录函数输入参数(doc id,每个函数调用都是唯一的)。 2) Properties 集合被标记为 [Obsolete]。如果我尝试搜索它所替换的内容,则会将我带到无法将输入参数传递给的相同 ITelemetryInitializer 。 3)它是由时间触发函数触发的持久函数,它衍生出我想要跟踪的其他多个并发函数 @YMC 我稍后会解决这些问题,我没有看到任何无法解决的问题,但在我的手机上接听是行不通的:-)

以上是关于Azure Insights:通过函数执行链跟踪自定义属性的主要内容,如果未能解决你的问题,请参考以下文章

Application Insights 和 Azure 流分析查询将整个自定义维度导出为字符串

Application Insights 和 Azure 流分析查询自定义 JSON 属性

API Application Insights 使用的良好实践

在Azure Application Insights中记录机器人数据

Azure App Insights 中的 Flush()

Application Insights 从自定义数据源中清除数据