Azure Functions 和 AppInsights RequestTelemetry

Azure Functions and AppInsights RequestTelemetry

我正在尝试从 HttpTrigger Azure Function v3 增强 AppInsights 中的 RequestTelemetry。

函数使用 DI 和 Startup 初始化 class。

[assembly: FunctionsStartup(typeof(Startup))]
namespace Hager.Example.FunctionApp.FunctionApp
{
    public class Startup : FunctionsStartup
    {
        public override void Configure(IFunctionsHostBuilder builder)
        {
            // No service for repro
        }
    }
}

还有我的函数

    public class Function1
    {
        private readonly ILogger _logger;

        public Function1(ILogger<Function1> logger)
        {
            _logger = logger;
        }

        [FunctionName("HttpTriggered")]
        public IActionResult Run(
            [HttpTrigger(AuthorizationLevel.Function, "get", "post", Route = null)] HttpRequestMessage req)
        {
            using var loggerScope = _logger.BeginScope("{InScope1}{InScope2}{InScope3}", Guid.NewGuid(), Guid.NewGuid(), Guid.NewGuid());

            _logger.LogInformation("Started Execution");
            _logger.LogWarning("With a custom property: {CustomProperty}.", Guid.NewGuid());

            Activity.Current?.AddTag("TagStart", Guid.NewGuid());

            if (Activity.Current == null)
            {
                // Always null
                _logger.LogError("No ActivityCurrent {Activity}.", Activity.Current);
                _logger.LogError("ActivityCurrent Tags {Activity}.", Activity.Current?.Tags);
            }

            // Activity.Current.AddTag("Tag2", Guid.NewGuid());  // <- NullException

            _logger.LogInformation("Finished Execution");

            return new NoContentResult();
        }
    }

我的项目包:

  <ItemGroup>
    <PackageReference Include="Microsoft.ApplicationInsights" Version="2.17.0" />
    <PackageReference Include="Microsoft.ApplicationInsights.AspNetCore" Version="2.17.0" />
    <PackageReference Include="Microsoft.Azure.Functions.Extensions" Version="1.1.0" />
    <PackageReference Include="Microsoft.NET.Sdk.Functions" Version="3.0.11" />
  </ItemGroup>

每个记录器和范围都按预期工作,但对象 ActivityTag 始终为空,这在 Azure Functions 中不应该。

我是不是漏掉了什么?

更新:

添加了 Op 的解决方案:通过使用 request.HttpContext?.Features.Get<RequestTelemetry>(),效果很好。


请卸载 2 Application Insights packagesMicrosoft.ApplicationInsightsMicrosoft.ApplicationInsights.AspNetCore

默认情况下,Application Insights 包不收集 activity 标记。所以应该是这个原因。

我在没有安装上述 2 Application Insights packages 的情况下测试了你的 azure 功能,它运行良好。下面是测试结果截图:

这里加上我的local.settings.json供大家参考,代码和你的一样:

{
    "IsEncrypted": false,
  "Values": {
    "AzureWebJobsStorage": "xxxx",
    "FUNCTIONS_WORKER_RUNTIME": "dotnet",
    "APPINSIGHTS_INSTRUMENTATIONKEY": "xxx"
  }
}

如果这 2 个包是必需的,也许您可​​以尝试按照 添加自定义 ITelemetryInitializer(顺便说一句,我没有测试它)。