在Azure Function中添加自定义遥测属性

时间:2019-07-02 11:55:11

标签: azure-functions azure-application-insights

我有一个Azure函数(v2),其中数据通过HTTP正文作为JSON传递。我想使用标准的 Trace Request 事件将这些JSON数据记录在Application Insights中。

到目前为止,我已经尝试过:

  • 使用自定义的square.x = 0来解析正文并将属性添加到ITelemetryInitializer。但是,这样做有两个缺点:对每个请求都多次读取和解析主体(一次在我的Function中,在遥测初始化程序中多次),并且有时访问主体会引发异常,因为它已被处置(可能已熄灭)函数调用末尾的范围。
  • 在函数中使用ISupportProperties.Properties。但是此客户端似乎没有合适的属性来设置:
    • TelemetryClient用于全局属性,而不用于请求范围的属性;
    • TelemetryClient.Context.GlobalProperties已过时,我看不到如何使用推荐的替代品TelemetryClient.Context.Properties

理想情况下,我想使用在函数中解析的数据,并使用该数据初始化遥测数据。

1 个答案:

答案 0 :(得分:1)

  1. 您可以通过在Activity.Current上添加标签(如Activity.Current?.AddTag("my-prop", ExtractPropFromRequest());)来更新请求遥测属性,而无需进行任何其他更改,这些标签将出现在请求中。不幸的是,您不会将它们印在痕迹上。

  2. 您还可以在函数中解析一次请求正文,并将其存储在AsyncLocal中。然后在TelemetryInitializer中访问此AsyncLocal

public class AsyncLocalPropertyTelemetryInitializer : ITelemetryInitializer { public void Initialize(ITelemetry telemetry) { if (telemetry is ISupportProperties propTelemetry && Function1.AdditionalContext.Value != null) // you may find a better way to make it work with DI { propTelemetry.Properties["my-prop"] = Function1.AdditionalContext.Value; } } } public static class Function { internal static readonly AsyncLocal<string> AdditionalContext = new AsyncLocal<string>(); [FunctionName("Function1")] public static async Task<IActionResult> Run([HttpTrigger(AuthorizationLevel.Function, "get", "post", Route = null)] HttpRequest req, ILogger log) { AdditionalContext.Value = "something important"; // read the body here log.LogInformation("C# HTTP trigger function processed a request.") AdditionalContext.Value = null; ... } } }