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 packages
:Microsoft.ApplicationInsights
和 Microsoft.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
(顺便说一句,我没有测试它)。
我正在尝试从 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 packages
:Microsoft.ApplicationInsights
和 Microsoft.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
(顺便说一句,我没有测试它)。