Да, это возможно.
Вариант 1: Использование инициализатора телеметрии с помощью AsyncLocal :
public class CustomTelemetryInitializer : ITelemetryInitializer
{
public static AsyncLocal<string> MyValue = new AsyncLocal<string>();
public void Initialize(ITelemetry telemetry)
{
if (telemetry is ISupportProperties propertyItem)
{
propertyItem.Properties["myProp"] = MyValue.Value;
}
}
}
Вы можетеустановите значение AsyncLocal в функции следующим образом:
[FunctionName("Function")]
public static async Task<IActionResult> Run(
[HttpTrigger(AuthorizationLevel.Function, "get", "post", Route = null)]
HttpRequest req,
ILogger log)
{
var name = req.Query["name"];
CustomTelemetryInitializer.MyValue.Value = name;
log.LogInformation("C# HTTP trigger function processed a request.");
return new OkObjectResult($"Hello, {name}");
}
При запуске функции вы можете увидеть информацию на портале:
Вы можете найти весь код в этом репо
Теперь, обращаясь к вашим комментариям. Да, вам нужно что-то дополнительное. Экземпляр ITelemetryInitializer
необходимо зарегистрировать с помощью внедрения зависимостей. Это делается в классе Startup
, как указано в документации :
using Microsoft.ApplicationInsights.Extensibility;
using Microsoft.Azure.Functions.Extensions.DependencyInjection;
using Microsoft.Extensions.DependencyInjection;
[assembly: FunctionsStartup(typeof(FunctionApp.Startup))]
namespace FunctionApp
{
public class Startup : FunctionsStartup
{
public override void Configure(IFunctionsHostBuilder builder)
{
builder.Services.AddSingleton<ITelemetryInitializer, CustomTelemetryInitializer>();
builder.Services.AddLogging();
}
}
}
После регистрации SDK Application Insights будет использовать CustomTelemetryInitializer
.
Опция 2 Другая опция не включает какой-либо TelemetryInitializer, но вы можете добавить только свойства к сгенерированному RequestTelemetry, который добавляется интеграцией Azure Function App Insights. Это делается с использованием факта, что текущий TelemetryRequest
хранится в HttpContext
:
[FunctionName("Function")]
public static IActionResult Run(
[HttpTrigger(AuthorizationLevel.Function, "get", "post", Route = null)]
HttpRequest req,
ILogger log)
{
var name = req.Query["name"];
CustomTelemetryInitializer.MyValue.Value = name;
log.LogInformation("C# HTTP trigger function processed a request.");
var telemetryItem = req.HttpContext.Features.Get<RequestTelemetry>();
telemetryItem.Properties["SetInFunc"] = name;
return new OkObjectResult($"Hello, {name}");
}
Это также будет отображаться на портале:
Проблема в том, что контекст добавляется только в Запрос? Возможно, но вы знаете, что вы можете запросить все связанные телеметрии и узнать, какой контекст используется, например:
union (traces), (requests), (dependencies), (customEvents), (exceptions)
| extend itemType = iif(itemType == 'availabilityResult',itemType,iif(itemType == 'customEvent',itemType,iif(itemType == 'dependency',itemType,iif(itemType == 'pageView',itemType,iif(itemType == 'request',itemType,iif(itemType == 'trace',itemType,iif(itemType == 'exception',itemType,"")))))))
| extend prop = customDimensions.SetInFunc
| where ((itemType == 'trace' or (itemType == 'request' or (itemType == 'pageView' or (itemType == 'customEvent' or (itemType == 'exception' or (itemType == 'dependency' or itemType == 'availabilityResult')))))))
| top 101 by timestamp desc
покажет:
Вся телеметрия, исходящая из одного вызова, будет иметь одинаковый operation_Id
.