使用Azure Function v2的自定义Application Insight TelemetryInitializer

时间:2019-01-29 08:11:16

标签: c# .net azure azure-functions azure-application-insights

在Azure函数中,我们使用.NET HttpClient类,Azure Servicebus SDK和Azure Storage SDK发出许多请求-一切都通过Application Insight日志中的生成漂亮地记录下来,显示了依赖性和全部!

现在,我们想添加一个ITelemetryInitializer的实现,以便为上述SDK编写的EventTelemetry添加一些尺寸。

我们首先创建一个实现ITelemetryInitializer接口的类。

public class ReferrerTelemetryInitializer : ITelemetryInitializer
{
    public void Initialize(ITelemetry telemetry)
    {
        if (telemetry is EventTelemetry)
        {
            // Add some code
        }
    }
}

然后,我创建一个实现IWebJobsStartup接口的类,以DI注入我的初始化程序。

[assembly: WebJobsStartup(typeof(Startup))]

namespace LoggingTest
{
    public class Startup : IWebJobsStartup
    {
        public void Configure(IWebJobsBuilder builder)
        {
            builder.Services.AddSingleton<ITelemetryInitializer, ReferrerTelemetryInitializer>();
        }
    }
}

注意:我只在.NET Core 2.0中启动了Startup类(而在2.1中则没有)-尽管这似乎是一个已知的issue的打开?

但是,初始化器类中的Initialize方法却不会触发(在Core 2.0中,在我看到Startup类已经注册了DI ReferrerTelemetryInitializer实现之后)?

我们缺少什么?

2 个答案:

答案 0 :(得分:1)

您不会丢失任何东西,它应该可以正常工作。有一个known issue会破坏WebJobStartup函数。

SDK不会自动报告

EventTelemtery(它们报告请求,依赖项,异常,跟踪和度量标准)。您可以检查Net Core 2.0上是否用其他类型的遥测调用了initialize吗?

答案 1 :(得分:0)

Azure Function v3

对于 2021 年在 Azure Function v3 中处理此问题的人员,现在确实可以使用。

TelemetryClient 由 Azure Function 主机/运行时配置。 它将通过依赖注入从服务集合中获取注册的 ITelemetryInitializer。

项目文件

<PackageReference Include="Microsoft.Azure.Functions.Extensions" Version="1.1.0" />
<PackageReference Include="Microsoft.Azure.WebJobs.Logging.ApplicationInsights" Version="3.0.27" />
<PackageReference Include="Microsoft.NET.Sdk.Functions" Version="3.0.11" />

启动

public class Startup : FunctionsStartup
{
    public override void Configure(IFunctionsHostBuilder builder)
    {
        builder.Services.AddSingleton<ITelemetryInitializer, TheCustomTelemetryInitializer>();            
    }
}

而且对本地发展很重要!:

<块引用>

然后您需要在 local.settings.json 中为您的 APPINSIGHTS_INSTRUMENTATIONKEY 添加一些值。这是它与常规控制台应用程序不同的地方,即使检测键为空,它也可以在本地工作。在功能应用程序中,显然你需要在那里添加一些价值。它可以是任何东西,我已经这样做了并且效果很好:

Source

"APPINSIGHTS_INSTRUMENTATIONKEY": "you-need-to-have-anything-at-all-here-so-it-will-work-locally"