根据配置

时间:2018-03-22 20:01:14

标签: c# asp.net-core asp.net-core-2.0 azure-application-insights

如果由appsettings.json中设置的配置值指定,我希望Azure ApplicationInsights仅用于ASP.NET Core应用程序。

我把它放在我的_Layout.cshml中以禁用客户端见解:

    @if (Configuration.GetSection("UseInsights").Get<bool>())
    {
        @Html.Raw(JavaScriptSnippet.FullScript)
    }

但仍然发送了服务器端遥测,所以我通过配置禁用了它:

TelemetryConfiguration.Active.DisableTelemetry = true;

这会停止发送请求和异常数据,但CPU使用率等内容仍在我的Insights仪表板上发送并显示。

我认为合适的方法是有条件地在.UseApplicationInsights()上启用WebHost.CreateDefaultBuilder()扩展名,但这是一个鸡和鸡蛋的情况,因为我无法访问配置设置,直到之后主机已经建成。在调用BuildWebHost()后,我可以在某处完全禁用洞察吗?

2 个答案:

答案 0 :(得分:2)

  

{&#34; ApplicationInsights&#34;:{       &#34; InstrumentationKey&#34;:&#34; 11111111-2222-3333-4444-555555555555&#34; }}

您可以通过appsettings.json中是否存在检测键来控制服务器端遥测。 对于每个环境,您可能有单独的appsettings.json,并且每个都可以包含不同的检测键,或者如果您不希望将遥测发送到ApplicationInsights服务,则根本不包含任何内容,如下所示。

  

{&#34; ApplicationInsights&#34;:{       &#34; InstrumentationKey&#34;:&#34;&#34; }}

答案 1 :(得分:0)

以下是我在禁用时完全删除任何Azure Application Insights所做的工作。

我为JavaScript片段创建了一个接口,该接口被注入客户端遥测:

public interface IInsightsJavaScriptSnippet
{
    string FullScript { get; }
}

有两个实现,一个在启用Insights时包装Microsoft.ApplicationInsights.AspNetCore.JavaScriptSnippet的实现:

public class InsightsJavaScriptSnippet : IInsightsJavaScriptSnippet
{
    private readonly JavaScriptSnippet _snippet;

    public InsightsJavaScriptSnippet(JavaScriptSnippet snippet)
    {
        _snippet = snippet;
    }

    public string FullScript => _snippet.FullScript;
}

另一个输出空字符串时它们不是:

public class BlankJavaScriptSnippet : IInsightsJavaScriptSnippet
{
    public string FullScript => string.Empty;
}

然后我根据配置值注册一个或另一个。 services.AddApplicationInsightsTelemetry()会注册JavaScriptSnippet,然后将其注入InsightsJavaScriptSnippet的构造函数中:

if (Configuration.GetSection("UseInsights").Get<bool>())
        {
            services.AddApplicationInsightsTelemetry(Configuration["ApplicationInsights:InstrumentationKey"]);
            services.AddSingleton<IInsightsJavaScriptSnippet, InsightsJavaScriptSnippet>();
        }
        else
        {
            services.AddSingleton<IInsightsJavaScriptSnippet, BlankJavaScriptSnippet>();
        }

然后,我将IInsightsJavaScriptSnippet注入_Layout.cshtml而不是Microsoft JavaScriptSnippet

@inject MyApp.Services.IInsightsJavaScriptSnippet JavaScriptSnippet
// ... snipped code
<head>
    @Html.Raw(JavaScriptSnippet.FullScript)
</head>

如果我们没有使用Insights,那么HTML不会增加任何内容。