如何使用 WCF 中多个环境的检测密钥配置 Application Insights?

Posted

技术标签:

【中文标题】如何使用 WCF 中多个环境的检测密钥配置 Application Insights?【英文标题】:How to configure Application Insights with instrumentation keys from multiple environments in WCF? 【发布时间】:2021-06-08 21:40:32 【问题描述】:

如果我使用this Microsoft documentation 中所述的ApplicationInsights.config 文件设置我的 WCF 项目,并且数据按预期记录到 Application Insights(使用硬编码的检测密钥)。

在使用 ApplicationInsights.config 文件时,是否有任何方法可以基于每个环境指定检测密钥?

配置文件如下所示:

<?xml version="1.0" encoding="utf-8"?>
<ApplicationInsights xmlns="http://schemas.microsoft.com/ApplicationInsights/2013/Settings">
 <TelemetryInitializers>
   <Add Type="Microsoft.ApplicationInsights.DependencyCollector.HttpDependenciesParsingTelemetryInitializer, Microsoft.AI.DependencyCollector" />
   <Add Type="Microsoft.ApplicationInsights.WindowsServer.AzureRoleEnvironmentTelemetryInitializer, Microsoft.AI.WindowsServer" />
   <Add Type="Microsoft.ApplicationInsights.WindowsServer.BuildInfoConfigComponentVersionTelemetryInitializer, Microsoft.AI.WindowsServer" />
   <Add Type="Microsoft.ApplicationInsights.Web.WebTestTelemetryInitializer, Microsoft.AI.Web" />
   <Add Type="Microsoft.ApplicationInsights.Web.SyntheticUserAgentTelemetryInitializer, Microsoft.AI.Web">
     <!-- Extended list of bots:
           search|spider|crawl|Bot|Monitor|BrowserMob|BingPreview|PagePeeker|WebThumb|URL2PNG|ZooShot|GomezA|Google SketchUp|Read Later|KTXN|KHTE|Keynote|Pingdom|AlwaysOn|zao|borg|oegp|silk|Xenu|zeal|NING|htdig|lycos|slurp|teoma|voila|yahoo|Sogou|CiBra|Nutch|Java|JNLP|Daumoa|Genieo|ichiro|larbin|pompos|Scrapy|snappy|speedy|vortex|favicon|indexer|Riddler|scooter|scraper|scrubby|WhatWeb|WinHTTP|voyager|archiver|Icarus6j|mogimogi|Netvibes|altavista|charlotte|findlinks|Retreiver|TLSProber|WordPress|wsr-agent|http client|Python-urllib|AppEngine-Google|semanticdiscovery|facebookexternalhit|web/snippet|Google-HTTP-Java-Client-->
     <Filters>search|spider|crawl|Bot|Monitor|AlwaysOn</Filters>
   </Add>
   <Add Type="Microsoft.ApplicationInsights.Web.ClientIpHeaderTelemetryInitializer, Microsoft.AI.Web" />
   <Add Type="Microsoft.ApplicationInsights.Web.AzureAppServiceRoleNameFromHostNameHeaderInitializer, Microsoft.AI.Web" />
   <Add Type="Microsoft.ApplicationInsights.Web.OperationNameTelemetryInitializer, Microsoft.AI.Web" />
   <Add Type="Microsoft.ApplicationInsights.Web.OperationCorrelationTelemetryInitializer, Microsoft.AI.Web" />
   <Add Type="Microsoft.ApplicationInsights.Web.UserTelemetryInitializer, Microsoft.AI.Web" />
   <Add Type="Microsoft.ApplicationInsights.Web.AuthenticatedUserIdTelemetryInitializer, Microsoft.AI.Web" />
   <Add Type="Microsoft.ApplicationInsights.Web.AccountIdTelemetryInitializer, Microsoft.AI.Web" />
   <Add Type="Microsoft.ApplicationInsights.Web.SessionTelemetryInitializer, Microsoft.AI.Web" />
 </TelemetryInitializers>
 <TelemetryModules>
   <Add Type="Microsoft.ApplicationInsights.DependencyCollector.DependencyTrackingTelemetryModule, Microsoft.AI.DependencyCollector">
     <ExcludeComponentCorrelationHttpHeadersOnDomains>
       <!-- 
       Requests to the following hostnames will not be modified by adding correlation headers.         
       Add entries here to exclude additional hostnames.
       NOTE: this configuration will be lost upon NuGet upgrade.
       -->
       <Add>core.windows.net</Add>
       <Add>core.chinacloudapi.cn</Add>
       <Add>core.cloudapi.de</Add>
       <Add>core.usgovcloudapi.net</Add>
     </ExcludeComponentCorrelationHttpHeadersOnDomains>
     <IncludeDiagnosticSourceActivities>
       <Add>Microsoft.Azure.EventHubs</Add>
       <Add>Microsoft.Azure.ServiceBus</Add>
     </IncludeDiagnosticSourceActivities>
   </Add>
   <Add Type="Microsoft.ApplicationInsights.Extensibility.PerfCounterCollector.PerformanceCollectorModule, Microsoft.AI.PerfCounterCollector">
     <!--
     Use the following syntax here to collect additional performance counters:

     <Counters>
       <Add PerformanceCounter="\Process(??APP_WIN32_PROC??)\Handle Count" ReportAs="Process handle count" />
       ...
     </Counters>

     PerformanceCounter must be either \CategoryName(InstanceName)\CounterName or \CategoryName\CounterName

     NOTE: performance counters configuration will be lost upon NuGet upgrade.

     The following placeholders are supported as InstanceName:
       ??APP_WIN32_PROC?? - instance name of the application process  for Win32 counters.
       ??APP_W3SVC_PROC?? - instance name of the application IIS worker process for IIS/ASP.NET counters.
       ??APP_CLR_PROC?? - instance name of the application CLR process for .NET counters.
     -->
   </Add>
   <Add Type="Microsoft.ApplicationInsights.Extensibility.PerfCounterCollector.QuickPulse.QuickPulseTelemetryModule, Microsoft.AI.PerfCounterCollector" />
   <Add Type="Microsoft.ApplicationInsights.WindowsServer.AppServicesHeartbeatTelemetryModule, Microsoft.AI.WindowsServer" />
   <Add Type="Microsoft.ApplicationInsights.WindowsServer.AzureInstanceMetadataTelemetryModule, Microsoft.AI.WindowsServer">
     <!--
     Remove individual fields collected here by adding them to the ApplicationInsighs.HeartbeatProvider 
     with the following syntax:

     <Add Type="Microsoft.ApplicationInsights.Extensibility.Implementation.Tracing.DiagnosticsTelemetryModule, Microsoft.ApplicationInsights">
       <ExcludedHeartbeatProperties>
         <Add>osType</Add>
         <Add>location</Add>
         <Add>name</Add>
         <Add>offer</Add>
         <Add>platformFaultDomain</Add>
         <Add>platformUpdateDomain</Add>
         <Add>publisher</Add>
         <Add>sku</Add>
         <Add>version</Add>
         <Add>vmId</Add>
         <Add>vmSize</Add>
         <Add>subscriptionId</Add>
         <Add>resourceGroupName</Add>
         <Add>placementGroupId</Add>
         <Add>tags</Add>
         <Add>vmScaleSetName</Add>
       </ExcludedHeartbeatProperties>
     </Add>

     NOTE: exclusions will be lost upon upgrade.
     -->
   </Add>
   <Add Type="Microsoft.ApplicationInsights.WindowsServer.DeveloperModeWithDebuggerAttachedTelemetryModule, Microsoft.AI.WindowsServer" />
   <Add Type="Microsoft.ApplicationInsights.WindowsServer.UnhandledExceptionTelemetryModule, Microsoft.AI.WindowsServer" />
   <Add Type="Microsoft.ApplicationInsights.WindowsServer.UnobservedExceptionTelemetryModule, Microsoft.AI.WindowsServer">
     <!--</Add>
   <Add Type="Microsoft.ApplicationInsights.WindowsServer.FirstChanceExceptionStatisticsTelemetryModule, Microsoft.AI.WindowsServer">-->
   </Add>
   <Add Type="Microsoft.ApplicationInsights.Web.RequestTrackingTelemetryModule, Microsoft.AI.Web">
     <Handlers>
       <!-- 
       Add entries here to filter out additional handlers: 

       NOTE: handler configuration will be lost upon NuGet upgrade.
       -->
       <Add>Microsoft.VisualStudio.Web.PageInspector.Runtime.Tracing.RequestDataHttpHandler</Add>
       <Add>System.Web.StaticFileHandler</Add>
       <Add>System.Web.Handlers.AssemblyResourceLoader</Add>
       <Add>System.Web.Optimization.BundleHandler</Add>
       <Add>System.Web.Script.Services.ScriptHandlerFactory</Add>
       <Add>System.Web.Handlers.TraceHandler</Add>
       <Add>System.Web.Services.Discovery.DiscoveryRequestHandler</Add>
       <Add>System.Web.HttpDebugHandler</Add>
     </Handlers>
   </Add>
   <Add Type="Microsoft.ApplicationInsights.Web.ExceptionTrackingTelemetryModule, Microsoft.AI.Web" />
   <Add Type="Microsoft.ApplicationInsights.Web.AspNetDiagnosticTelemetryModule, Microsoft.AI.Web" />
 </TelemetryModules>
 <ApplicationIdProvider Type="Microsoft.ApplicationInsights.Extensibility.Implementation.ApplicationId.ApplicationInsightsApplicationIdProvider, Microsoft.ApplicationInsights" />
 <TelemetrySinks>
   <Add Name="default">
     <TelemetryProcessors>
       <Add Type="Microsoft.ApplicationInsights.Extensibility.PerfCounterCollector.QuickPulse.QuickPulseTelemetryProcessor, Microsoft.AI.PerfCounterCollector" />
       <Add Type="Microsoft.ApplicationInsights.Extensibility.AutocollectedMetricsExtractor, Microsoft.ApplicationInsights" />
       <Add Type="Microsoft.ApplicationInsights.WindowsServer.TelemetryChannel.AdaptiveSamplingTelemetryProcessor, Microsoft.AI.ServerTelemetryChannel">
         <MaxTelemetryItemsPerSecond>5</MaxTelemetryItemsPerSecond>
         <ExcludedTypes>Event</ExcludedTypes>
       </Add>
       <Add Type="Microsoft.ApplicationInsights.WindowsServer.TelemetryChannel.AdaptiveSamplingTelemetryProcessor, Microsoft.AI.ServerTelemetryChannel">
         <MaxTelemetryItemsPerSecond>5</MaxTelemetryItemsPerSecond>
         <IncludedTypes>Event</IncludedTypes>
       </Add>
     </TelemetryProcessors>
     <TelemetryChannel Type="Microsoft.ApplicationInsights.WindowsServer.TelemetryChannel.ServerTelemetryChannel, Microsoft.AI.ServerTelemetryChannel" />
   </Add>
 </TelemetrySinks>
 <!-- 
   Learn more about Application Insights configuration with ApplicationInsights.config here: 
   http://go.microsoft.com/fwlink/?LinkID=513840
 -->
 <InstrumentationKey>your-instrumentation-key-here</InstrumentationKey>
</ApplicationInsights>

我的 web.config 包含以下内容:

<system.web>
    <compilation debug="true" targetFramework="4.7.2" />
    <httpRuntime targetFramework="4.7.2" />
    <httpModules>
      <add name="TelemetryCorrelationHttpModule" type="Microsoft.AspNet.TelemetryCorrelation.TelemetryCorrelationHttpModule, Microsoft.AspNet.TelemetryCorrelation" />
      <add name="ApplicationInsightsWebTracking" type="Microsoft.ApplicationInsights.Web.ApplicationInsightsHttpModule, Microsoft.AI.Web" />
    </httpModules>
  </system.web>

This documentation 建议我可以在代码中设置检测密钥(例如在this answer 建议的AppInitialize 方法中),但它似乎不起作用。

TelemetryConfiguration configuration = TelemetryConfiguration.CreateDefault();
configuration.InstrumentationKey = "xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx";

【问题讨论】:

【参考方案1】:

虽然此解决方案似乎有一些注意事项(取决于您的托管策略),但有时可以添加 Global.asax,并使用 Application_Start 挂钩来注入您的配置(此答案假设您是使用配置转换)。

例如:

using System;

namespace SomeWcfThing

    public class Global : System.Web.HttpApplication
    

        protected void Application_Start(object sender, EventArgs e)
        
            Microsoft.ApplicationInsights.Extensibility.TelemetryConfiguration.Active.InstrumentationKey =
                System.Configuration.ConfigurationManager.AppSettings["InstrumentationKey"];
        
    

【讨论】:

【参考方案2】:

正确的方法是使用 TelemetryConfiguration.CreateDefault() 方法从磁盘加载任何配置,然后在生成的配置上设置/更改其他值。

创建 TelemetryConfiguration 实例后,将其传递给 TelemetryClient 的构造函数以创建客户端并开始记录。

【讨论】:

以上是关于如何使用 WCF 中多个环境的检测密钥配置 Application Insights?的主要内容,如果未能解决你的问题,请参考以下文章

如何将单个 WCF 服务配置为具有多个 HTTP 和 HTTPS 端点?

在 Web 场环境中使用共享缓存来检测 WCF 中的重放攻击

如何在生产中配置 WCF 客户端?

WCF - 在单个 APP.Config 文件中定义多个服务?

WCF C# - 从 App.config 获取特定的配置值

如何将 WCF 配置为接受 SSL 和非 SSL