可配置的应用程序洞察检测工具

时间:2017-02-15 18:25:51

标签: asp.net-mvc azure asp.net-mvc-5 azure-application-insights

如何才能最好地使Application Inisghts的Instrumentation Key可以以允许Azure管理员管理MVC5 Web应用程序的App Services部署设置的方式进行配置?在MVC应用程序初始化中是否存在应该执行此操作的某个事件,或者几乎可以在任何时候执行此操作?我也在使用Trace Listener集成。

默认情况下,Instrumentation Key(iKey)在ApplicationInsights.config文件中设置。此外,如果您包含JavaScript部分,则再次在_Layout.cshtml文件中设置iKey。这是两个不同的地方,你需要管理一个iKey。

我希望能够通过应用服务 - >来管理此密钥。 Azure门户的应用程序设置标签。原因是:

  1. 我想部署这个应用程序的多个实例,每个实例都有自己独特的iKey
  2. 我想定期更改此iKey(因为原因
  3. 我不希望这个iKey存储在我们的代码存储库中(“dev”iKey可以存储在代码存储库中)也不希望它由我们的构建自动化管理(同样,因为原因

2 个答案:

答案 0 :(得分:8)

这是我目前正在使用的实现,它似乎有效。但是,我有其他实现似乎设置iKey太早或太晚,因为它似乎在部署到Azure的物理web.config文件中使用iKey而不是从应用程序设置中拉出标签。是否有更好的选择以最佳方式执行此操作?

<强> ApplicationInsights.config

<!-- Find the following node and *remove* it. It will have a GUID in it.
     If you leave this, you may receive some errors even with all of the
     other changes. -->
<InstrumentationKey>{GUID HERE}</InstrumentationKey>

<强>的Global.asax.cs

    protected void Application_Start()
    {
        // Add this first line below
        Microsoft.ApplicationInsights.Extensibility.TelemetryConfiguration.Active.InstrumentationKey =
            ConfigurationManager.AppSettings["ai:InstrumentationKey"];

        // Showing the rest of this so you can see the order of operations
        AreaRegistration.RegisterAllAreas();
        GlobalConfiguration.Configure(WebApiConfig.Register);
        FilterConfig.RegisterGlobalFilters(GlobalFilters.Filters);
        RouteConfig.RegisterRoutes(RouteTable.Routes);
        AutomapperConfig.Init();
    }

<强>的web.config

<!-- Add the following to <appSettings> and put your iKey value in here. -->
<add key="ai:InstrumentationKey" value="*****" />

_Layout.cshtml (位于HTML的<head>部分。请注意未来的读者:我建议您不要使用整个代码段,而只需使用开始instrumentationKey:并将该行集成到现有版本的JS片段的其余部分!):

<script type = 'text/javascript' >
    var appInsights=window.appInsights||function(config)
    {
        function r(config){ t[config] = function(){ var i = arguments; t.queue.push(function(){ t[config].apply(t, i)})} }
        var t = { config:config},u=document,e=window,o='script',s=u.createElement(o),i,f;for(s.src=config.url||'//az416426.vo.msecnd.net/scripts/a/ai.0.js',u.getElementsByTagName(o)[0].parentNode.appendChild(s),t.cookie=u.cookie,t.queue=[],i=['Event','Exception','Metric','PageView','Trace','Ajax'];i.length;)r('track'+i.pop());return r('setAuthenticatedUserContext'),r('clearAuthenticatedUserContext'),config.disableExceptionTracking||(i='onerror',r('_'+i),f=e[i],e[i]=function(config, r, u, e, o) { var s = f && f(config, r, u, e, o); return s !== !0 && t['_' + i](config, r, u, e, o),s}),t
    }({
        instrumentationKey:'@(Microsoft.ApplicationInsights.Extensibility.TelemetryConfiguration.Active.InstrumentationKey)'
    });

    window.appInsights=appInsights;
    appInsights.trackPageView();
</script>

答案 1 :(得分:3)

您指定的所有方法都很棒。我们的建议是使用web.config应用程序设置并在global.asax.cs中使用它进行标准初始化。当我们挂钩OnBeginRequest()时,在initlization之前不会发送遥测。

https://docs.microsoft.com/en-us/azure/application-insights/app-insights-api-custom-events-metrics#a-namedynamic-ikeya-dynamic-instrumentation-key

另一种可能效果很好的方法是设置SDK获取的APPINSIGHTS_INSTRUMENTATIONKEY环境变量。当然,这取决于你是否在同一台机器上有多个应用程序。

https://github.com/Microsoft/ApplicationInsights-dotnet/blob/v2.2.0/src/Core/Managed/Net40/Extensibility/Implementation/TelemetryConfigurationFactory.cs#L22