Добавьте пользовательские свойства телеметрии в функцию Azure - PullRequest
1 голос
/ 02 июля 2019

У меня есть функция Azure (v2), в которой данные передаются в виде JSON через тело HTTP.Я хочу записать некоторые из этих данных JSON в Application Insights, используя стандартные Trace и Request события.

Что я пробовал до сих пор:

  • Используйте пользовательский ITelemetryInitializer, который анализирует тело и добавляет свойства к ISupportProperties.Properties.Это имеет два недостатка: тело читается и анализируется несколько раз для каждого запроса (один раз в моей функции и несколько раз в инициализаторе телеметрии), и иногда доступ к телу вызывает исключение, потому что он был удален (возможно, он выходит из строя).области видимости в конце вызова функции).
  • Используйте TelemetryClient внутри моей функции.Но у этого клиента, похоже, нет подходящего свойства для установки:
    • TelemetryClient.Context.GlobalProperties предназначено для глобальных свойств, а не для свойств в области запроса;
    • TelemetryClient.Context.Properties устарело,и я не вижу, как я могу использовать рекомендованную замену ISupportProperties.Properties там.

В идеале я хочу использовать данные, которые анализируются внутри моей функции, и использовать этоданные для инициализации данных телеметрии.

1 Ответ

1 голос
/ 09 июля 2019
  1. Вы можете обновить свойства телеметрии запроса, добавив теги к Activity.Current подобно Activity.Current?.AddTag("my-prop", ExtractPropFromRequest()); Без каких-либо дополнительных изменений эти теги будут появляться в запросах. К сожалению, вы не получите их на следах.

  2. Вы также можете один раз проанализировать тело запроса в функции и сохранить его в AsyncLocal. Затем получите доступ к этому AsyncLocal в TelemetryInitializer

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; ... } } }

...