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 使用的良好实践