次の方法で共有


Application Insights を使用して .NET アプリケーションとサービスを監視する (クラシック API)

注意事項

Azure Monitor Application Insights を利用する新規のアプリケーションやお客様には、Azure Monitor OpenTelemetry Distro をお勧めします。 Azure Monitor OpenTelemetry Distro では、Application Insights SDK と同様の機能とエクスペリエンスが提供されます。 .NETNode.jsPython 用の移行ガイドを使用して Application Insights SDK から移行することはできますが、下位互換性を確保するために引き続きいくつかの機能を追加する取り組みを行っています。

この記事では、ASP.NET、ASP.NET Core、Worker Service (非 HTTP) アプリケーションの Application Insights を有効にして構成する方法について説明します。 Application Insights は、アプリから次のテレメトリを収集できます:

  • Requests
  • 依存関係
  • Exceptions
  • 性能カウンター
  • トレース (ログ)
  • ハートビート
  • カスタム イベントとメトリック (手動インストルメンテーションが必要)
  • ページ ビュー (Web ページには JavaScript SDK が必要)
  • 可用性テスト (可用性テストを手動で設定する必要があります)

サポートされているシナリオ

Application Insights SDK for ASP.NET Core および SDK for Worker Service では、アプリケーションの実行場所や実行方法に関係なく、アプリケーションを監視できます。 アプリケーションが実行されていて、Azure へのネットワーク接続がある場合は、テレメトリを収集することができます。

サポートされています ASP.NET ASP.NET Core Worker サービス
オペレーティング システム ウィンドウズ Windows、Linux、または macOS Windows、Linux、または macOS
ホスティング方法 インプロセス (IIS または IIS Express) プロセス内またはプロセス外 コンソールまたはバックグラウンド サービス (通常は dotnet CLI または Windows サービス/Linux デーモンを介してプロセスとして実行されます)
デプロイ方法 Web デプロイ、MSI、または手動ファイルコピー フレームワーク依存または自己完結型 フレームワーク依存または自己完結型
ウェブサーバー インターネット インフォメーション サービス (IIS) インターネット インフォメーション サーバー (IIS) または Kestrel 適用できません (Web サーバーなし。メッセージング、バックグラウンド タスク、コンソール アプリなどの HTTP 以外のワークロード向けに設計されています)
ホスティング プラットフォーム Azure App Service (Windows)、Azure Virtual Machines、またはオンプレミス サーバー Azure App Service、Azure Virtual Machines、Docker、Azure Kubernetes Service (AKS) の Web Apps 機能 Azure Virtual Machines、Azure Kubernetes Service (AKS)、コンテナー、または .NET Core がサポートされている任意の環境
.NET バージョン .NET Framework 4.6.1 以降 正式に サポートされているすべての .NET バージョン (プレビュー段階ではない) 正式に サポートされているすべての .NET バージョン (プレビュー段階ではない)
IDE Visual Studio Visual Studio、Visual Studio Code、またはコマンド ライン Visual Studio、Visual Studio Code、またはコマンド ライン

ワーカー サービスは、HTTP 要求/応答パイプラインの外部でタスクを実行する、実行時間の長いバックグラウンド アプリケーションです。 Application Insights SDK for Worker Service は、新しく導入された .NET Core Worker サービスASP.NET Core のバックグラウンド タスク、および .NET Core や .NET Framework などのコンソール アプリで使用できます。

Worker Service SDK では、テレメトリの収集は単独では行われません。 代わりに、 DependencyCollectorPerfCounterCollectorApplicationInsightsLoggingProvider などの他の既知の Application Insights 自動コレクターが取り込まれます。 この SDK は、テレメトリ収集を有効にして構成するために、 IServiceCollection の拡張メソッドを公開します。

Application Insights を追加する

[前提条件]

基本的な Web アプリケーションを作成する

まだ機能している Web アプリケーションがない場合は、次のガイダンスを使用して作成できます。

  1. Visual Studio を開きます。
  2. [ 新しいプロジェクトの作成] を選択します
  3. C#ASP.NET Web アプリケーション (.NET Framework) を選択し、[次へ] を選択します。
  4. プロジェクト名を入力し、[作成] を選択します。
  5. [MVC] を選択し、[作成] を選択します。

Application Insights を自動的に追加する (Visual Studio)

このセクションでは、テンプレート ベースの Web アプリに Application Insights を自動的に追加する方法について説明します。

Visual Studio 2019 には、.NET Framework ベースのアプリで、インストルメンテーション キーまたは接続文字列をユーザー シークレットに格納すると壊れるという既知の問題があります。 このバグを回避するには、最終的に キーをApplicationinsights.config ファイルにハードコーディングする必要があります。

Visual Studio の ASP.NET Web アプリ プロジェクト内から:

  1. [プロジェクト]>[Application Insights Telemetry の追加]>[Application Insights SDK (ローカル)]>[次へ]>[完了]>[閉じる] の順に選択します。

  2. ApplicationInsights.config ファイルを開きます。

  3. 終了タグ </ApplicationInsights> の前に、自分の Application Insights リソースの接続文字列を含む行を追加します。 新しく作成された Application Insights リソースの [概要] ペインで接続文字列を見つけます。

    <ConnectionString>Copy connection string from Application Insights Resource Overview</ConnectionString>
    
  4. [プロジェクト]>[NuGet パッケージの管理]>[更新] を選択します。 次に、各 Microsoft.ApplicationInsights NuGet パッケージを最新の安定版リリースに更新します。

  5. [IIS Express] を選択してアプリケーションを実行します。 基本的な ASP.NET アプリが開きます。 サイトでページを移動して閲覧すると、テレメトリが Application Insights に送信されます。

Application Insights を手動で追加する (Visual Studio を使用しない)

このセクションでは、テンプレート ベースの Web アプリに Application Insights を手動で追加する方法について説明します。

  1. 次の NuGet パッケージとその依存関係をプロジェクトに追加します。

  2. 場合によっては、ApplicationInsights.config ファイルが自動的に作成されます。 ファイルが既に存在する場合は、手順 4 に進みます。

    ない場合は、自分で作成してください。 ASP.NET アプリケーションのルート ディレクトリに、ApplicationInsights.configという名前の新規ファイルを作成します。

  3. 次の XML 構成を新しく作成したファイルにコピーします。


    展開して構成を表示する
    <?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>Azure.Messaging.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>
            <!--
              Adjust the include and exclude examples to specify the desired semicolon-delimited types. (Dependency, Event, Exception, PageView, Request, Trace)
            -->
          </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
      -->
      <ConnectionString>Copy the connection string from your Application Insights resource</ConnectionString>
    </ApplicationInsights>
    
  4. 接続文字列を追加します。このためには、次の 2 つの方法があります。

    • (推奨) 構成で接続文字列を設定します。

      </ApplicationInsights> で、終了タグ の前に Application Insights リソースの接続文字列を追加します。 新しく作成された Application Insights リソースの [概要] ペインで接続文字列を見つけることができます。

      <ConnectionString>Copy the connection string from your Application Insights resource</ConnectionString>
      
    • コードで接続文字列を設定します。

      program.cs クラスに接続文字列を指定します。

      var configuration = new TelemetryConfiguration
      {
          ConnectionString = "Copy the connection string from your Application Insights resource"
      };
      
  5. プロジェクトの ApplicationInsights.config ファイルと同じレベルに、AiHandleErrorAttribute.cs という名前の新しい C# ファイルが含まれる ErrorHandler という名前のフォルダーを作成します。 このファイルの内容は次のようになります。

    using System;
    using System.Web.Mvc;
    using Microsoft.ApplicationInsights;
    
    namespace WebApplication10.ErrorHandler //namespace will vary based on your project name
    {
        [AttributeUsage(AttributeTargets.Class | AttributeTargets.Method, Inherited = true, AllowMultiple = true)] 
        public class AiHandleErrorAttribute : HandleErrorAttribute
        {
            public override void OnException(ExceptionContext filterContext)
            {
                if (filterContext != null && filterContext.HttpContext != null && filterContext.Exception != null)
                {
                    //If customError is Off, then AI HTTPModule will report the exception
                    if (filterContext.HttpContext.IsCustomErrorEnabled)
                    {   
                        var ai = new TelemetryClient();
                        ai.TrackException(filterContext.Exception);
                    } 
                }
                base.OnException(filterContext);
            }
        }
    }
    
  6. App_Start フォルダーで FilterConfig.cs ファイルを開き、次のサンプルに一致するように変更します。

    using System.Web;
    using System.Web.Mvc;
    
    namespace WebApplication10 //Namespace will vary based on project name
    {
        public class FilterConfig
        {
            public static void RegisterGlobalFilters(GlobalFilterCollection filters)
            {
                filters.Add(new ErrorHandler.AiHandleErrorAttribute());
            }
        }
    }
    
  7. Web.config が既に更新されている場合は、この手順をスキップします。 そうでない場合は、ファイルを次のように更新します。


    展開して構成を表示する
    <?xml version="1.0" encoding="utf-8"?>
    <!--
      For more information on how to configure your ASP.NET application, please visit
      https://go.microsoft.com/fwlink/?LinkId=301880
      -->
    <configuration>
      <appSettings>
        <add key="webpages:Version" value="3.0.0.0" />
        <add key="webpages:Enabled" value="false" />
        <add key="ClientValidationEnabled" value="true" />
        <add key="UnobtrusiveJavaScriptEnabled" value="true" />
      </appSettings>
      <system.web>
        <compilation debug="true" targetFramework="4.7.2" />
        <httpRuntime targetFramework="4.7.2" />
        <!-- Code added for Application Insights start -->
        <httpModules>
          <add name="TelemetryCorrelationHttpModule" type="Microsoft.AspNet.TelemetryCorrelation.TelemetryCorrelationHttpModule, Microsoft.AspNet.TelemetryCorrelation" />
          <add name="ApplicationInsightsWebTracking" type="Microsoft.ApplicationInsights.Web.ApplicationInsightsHttpModule, Microsoft.AI.Web" />
        </httpModules>
        <!-- Code added for Application Insights end -->
      </system.web>
      <runtime>
        <assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1">
          <dependentAssembly>
            <assemblyIdentity name="Antlr3.Runtime" publicKeyToken="eb42632606e9261f" />
            <bindingRedirect oldVersion="0.0.0.0-3.5.0.2" newVersion="3.5.0.2" />
          </dependentAssembly>
          <dependentAssembly>
            <assemblyIdentity name="Newtonsoft.Json" publicKeyToken="30ad4fe6b2a6aeed" />
            <bindingRedirect oldVersion="0.0.0.0-12.0.0.0" newVersion="12.0.0.0" />
          </dependentAssembly>
          <dependentAssembly>
            <assemblyIdentity name="System.Web.Optimization" publicKeyToken="31bf3856ad364e35" />
            <bindingRedirect oldVersion="1.0.0.0-1.1.0.0" newVersion="1.1.0.0" />
          </dependentAssembly>
          <dependentAssembly>
            <assemblyIdentity name="WebGrease" publicKeyToken="31bf3856ad364e35" />
            <bindingRedirect oldVersion="0.0.0.0-1.6.5135.21930" newVersion="1.6.5135.21930" />
          </dependentAssembly>
          <dependentAssembly>
            <assemblyIdentity name="System.Web.Helpers" publicKeyToken="31bf3856ad364e35" />
            <bindingRedirect oldVersion="1.0.0.0-3.0.0.0" newVersion="3.0.0.0" />
          </dependentAssembly>
          <dependentAssembly>
            <assemblyIdentity name="System.Web.WebPages" publicKeyToken="31bf3856ad364e35" />
            <bindingRedirect oldVersion="1.0.0.0-3.0.0.0" newVersion="3.0.0.0" />
          </dependentAssembly>
          <dependentAssembly>
            <assemblyIdentity name="System.Web.Mvc" publicKeyToken="31bf3856ad364e35" />
            <bindingRedirect oldVersion="1.0.0.0-5.2.7.0" newVersion="5.2.7.0" />
          </dependentAssembly>
          <!-- Code added for Application Insights start -->
          <dependentAssembly>
            <assemblyIdentity name="System.Memory" publicKeyToken="cc7b13ffcd2ddd51" culture="neutral" />
            <bindingRedirect oldVersion="0.0.0.0-4.0.1.1" newVersion="4.0.1.1" />
          </dependentAssembly>
          <!-- Code added for Application Insights end -->
        </assemblyBinding>
      </runtime>
      <system.codedom>
        <compilers>
          <compiler language="c#;cs;csharp" extension=".cs" type="Microsoft.CodeDom.Providers.DotNetCompilerPlatform.CSharpCodeProvider, Microsoft.CodeDom.Providers.DotNetCompilerPlatform, Version=2.0.1.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35" warningLevel="4" compilerOptions="/langversion:default /nowarn:1659;1699;1701" />
          <compiler language="vb;vbs;visualbasic;vbscript" extension=".vb" type="Microsoft.CodeDom.Providers.DotNetCompilerPlatform.VBCodeProvider, Microsoft.CodeDom.Providers.DotNetCompilerPlatform, Version=2.0.1.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35" warningLevel="4" compilerOptions="/langversion:default /nowarn:41008 /define:_MYTYPE=\&quot;Web\&quot; /optionInfer+" />
        </compilers>
      </system.codedom>
      <system.webServer>
        <validation validateIntegratedModeConfiguration="false" />
        <!-- Code added for Application Insights start -->
        <modules>
          <remove name="TelemetryCorrelationHttpModule" />
          <add name="TelemetryCorrelationHttpModule" type="Microsoft.AspNet.TelemetryCorrelation.TelemetryCorrelationHttpModule, Microsoft.AspNet.TelemetryCorrelation" preCondition="managedHandler" />
          <remove name="ApplicationInsightsWebTracking" />
          <add name="ApplicationInsightsWebTracking" type="Microsoft.ApplicationInsights.Web.ApplicationInsightsHttpModule, Microsoft.AI.Web" preCondition="managedHandler" />
        </modules>
        <!-- Code added for Application Insights end -->
      </system.webServer>
    </configuration>
    

これで、サーバー側アプリケーション監視は正常に構成されました。 Web アプリを実行すると、テレメトリが Application Insights に表示されるようになったことがわかります。

Application Insights がテレメトリを受け取るかどうかを確認する

アプリケーションを実行し、それに対して要求を行います。 これで Application Insights にテレメトリが送られるはずです。 Application Insights SDK によって、次のテレメトリと共に、アプリケーションへの受信 Web 要求が自動的に収集されます。

テレメトリの構成

このセクションでは...

リアルタイムの指標

Live Metrics を使用すると、Application Insights を使用したアプリケーションの監視が正しく構成されているかどうかをすばやく確認できます。 テレメトリが Azure portal 内に表示されるまで数分かかることがありますが、[ライブ メトリック] ペインには、実行中のプロセスの CPU 使用率がほぼリアルタイムで表示されます。 また、要求、依存関係、トレースなどの他のテレメトリも表示できます。

.NET アプリケーションの推奨される手順に従ってオンボードした場合、Live Metrics は既定で有効になります。

任意の .NET アプリケーションのコードを使用して Live Metrics を有効にする

Live Metrics を手動で構成するには:

  1. NuGet パッケージ Microsoft.ApplicationInsights.PerfCounterCollector をインストールします。

  2. 次のサンプル コンソール アプリ コードは、Live Metrics の設定方法を示しています。

using Microsoft.ApplicationInsights;
using Microsoft.ApplicationInsights.Extensibility;
using Microsoft.ApplicationInsights.Extensibility.PerfCounterCollector.QuickPulse;
using System;
using System.Threading.Tasks;

namespace LiveMetricsDemo
{
    class Program
    {
        static void Main(string[] args)
        {
            // Create a TelemetryConfiguration instance.
            TelemetryConfiguration config = TelemetryConfiguration.CreateDefault();
            config.InstrumentationKey = "INSTRUMENTATION-KEY-HERE";
            QuickPulseTelemetryProcessor quickPulseProcessor = null;
            config.DefaultTelemetrySink.TelemetryProcessorChainBuilder
                .Use((next) =>
                {
                    quickPulseProcessor = new QuickPulseTelemetryProcessor(next);
                    return quickPulseProcessor;
                })
                .Build();

            var quickPulseModule = new QuickPulseTelemetryModule();

            // Secure the control channel.
            // This is optional, but recommended.
            quickPulseModule.AuthenticationApiKey = "YOUR-API-KEY-HERE";
            quickPulseModule.Initialize(config);
            quickPulseModule.RegisterTelemetryProcessor(quickPulseProcessor);

            // Create a TelemetryClient instance. It is important
            // to use the same TelemetryConfiguration here as the one
            // used to set up live metrics.
            TelemetryClient client = new TelemetryClient(config);

            // This sample runs indefinitely. Replace with actual application logic.
            while (true)
            {
                // Send dependency and request telemetry.
                // These will be shown in live metrics.
                // CPU/Memory Performance counter is also shown
                // automatically without any additional steps.
                client.TrackDependency("My dependency", "target", "http://sample",
                    DateTimeOffset.Now, TimeSpan.FromMilliseconds(300), true);
                client.TrackRequest("My Request", DateTimeOffset.Now,
                    TimeSpan.FromMilliseconds(230), "200", true);
                Task.Delay(1000).Wait();
            }
        }
    }
}

トレース (ログ)

このセクションでは、診断トレース ログを ASP.NET または ASP.NET Core アプリケーションから Application Insights に送信し、ポータルでそれらのログを探索/検索する方法について説明します。

トレース ログを使用して、各ユーザー要求に関連付けられているトレースを識別し、それらを他のイベントおよび例外レポートと関連付けることができます。

Application Insights は、ILogger を介して ASP.NET Core やその他の .NET アプリからログをキャプチャし、クラシック ASP.NET (.NET Framework) からクラシック SDK とアダプターを介してログをキャプチャします。

  • 既定では、Application Insights プロバイダーは、重大度が Warning 以上のログのみを送信します。 Information またはそれより低いレベルのログを含めるには、appsettings.json でログ レベルの設定を更新します。

  • バックグラウンド サービス用の Application Insights を有効にするために使用される Microsoft.ApplicationInsights.WorkerService NuGet パッケージは対象範囲外です。

  • よく寄せられる質問 (FAQ) を確認するには、「.NET でのログ記録に関する FAQ」を参照してください。

Application Insights で収集できる診断ログを出力するログ記録方法を選択します。

アプリにログ記録をインストールする

System.Diagnostics トレースを使用するクラシック ASP.NET アプリの場合は、構成で Application Insights TraceListener を構成します。

web.configまたはapp.configにリスナーを追加します。

<configuration>
  <system.diagnostics>
    <trace>
      <listeners>
        <add name="myAppInsightsListener"
             type="Microsoft.ApplicationInsights.TraceListener.ApplicationInsightsTraceListener, Microsoft.ApplicationInsights.TraceListener" />
      </listeners>
    </trace>
  </system.diagnostics>
</configuration>

ログ キャプチャ モジュールは、サードパーティのロガーに便利なアダプターです。 ただし、 NLoglog4Net、または System.Diagnostics.Traceをまだ使用していない場合は、 Application Insights TrackTrace() を 直接呼び出す方法を検討してください。

ログを収集するように Application Insights を構成する

オプション 1: まだ追加していない場合は、Application Insights をプロジェクトに追加します。 Visual Studio で Application Insights を追加する場合は、ログ コレクターを含めるオプションがあります。

オプション 2: ソリューション エクスプローラーでプロジェクトを右クリックし、 Application Insights を構成します。 [トレース収集を構成する] オプションを選択します。

Application Insights メニューまたはログ コレクター オプションがない場合は、専用の トラブルシューティングの記事を参照してください。

手動インストール

Application Insights インストーラーでプロジェクトの種類がサポートされていない場合 (デスクトップ/コンソールのシナリオなど)、または明示的なパッケージ レベルの制御が必要な場合は、このメソッドを使用します。

  1. ソリューション エクスプローラーでプロジェクトを右クリックし、[ NuGet パッケージの管理] を選択します。

  2. Application Insights を検索します。

  3. 次のいずれかのパッケージを選択します。

NuGet パッケージは、必要なアセンブリをインストールし、必要に応じて web.config または app.configを変更します。

インストール手順:

パッケージ固有のインストール手順については、以下のセクションのいずれかを展開します。


ILogger
  1. Microsoft.Extensions.Logging.ApplicationInsightsをインストールします。

  2. ApplicationInsightsLoggerProvider を追加します。

using Microsoft.Extensions.Logging.ApplicationInsights;

var builder = WebApplication.CreateBuilder(args);

// Add services to the container.

builder.Services.AddControllers();
// Learn more about configuring Swagger/OpenAPI at https://aka.ms/aspnetcore/swashbuckle
builder.Services.AddEndpointsApiExplorer();
builder.Services.AddSwaggerGen();

builder.Logging.AddApplicationInsights(
        configureTelemetryConfiguration: (config) => 
            config.ConnectionString = builder.Configuration.GetConnectionString("APPLICATIONINSIGHTS_CONNECTION_STRING"),
            configureApplicationInsightsLoggerOptions: (options) => { }
    );

builder.Logging.AddFilter<ApplicationInsightsLoggerProvider>("your-category", LogLevel.Trace);

var app = builder.Build();

// Configure the HTTP request pipeline.
if (app.Environment.IsDevelopment())
{
    app.UseSwagger();
    app.UseSwaggerUI();
}

app.UseHttpsRedirection();

app.UseAuthorization();

app.MapControllers();

app.Run();

NuGet パッケージがインストールされ、プロバイダーが依存関係の挿入に登録されると、アプリはログを記録する準備が整います。 コンストラクターの挿入では、ILogger またはジェネリック型の代替である ILogger<TCategoryName> のいずれかが必要になります。 これらの実装が解決されると、ApplicationInsightsLoggerProvider によってこれらが提供されるようになります。 ログされたメッセージや例外は、Application Insights に送信されます。

たとえば、次のコントローラーの例を考えてみましょう。

public class ValuesController : ControllerBase
{
    private readonly ILogger _logger;

    public ValuesController(ILogger<ValuesController> logger)
    {
        _logger = logger;
    }

    [HttpGet]
    public ActionResult<IEnumerable<string>> Get()
    {
        _logger.LogWarning("An example of a Warning trace..");
        _logger.LogError("An example of an Error level message");

        return new string[] { "value1", "value2" };
    }
}

詳細については、ASP.NET Coreでのログに関するページ、および「ILogger ログからはどのような種類の Application Insights テレメトリが生成されますか? Application Insights ではどこで ILogger ログを見ることができますか?」を参照してください。

診断ログ呼び出しの挿入 (System.Diagnostics.Trace/log4net/NLog)

System.Diagnostics.Traceを使用する場合、一般的な呼び出しは次のようになります。

System.Diagnostics.Trace.TraceWarning("Slow response - database01");

log4netまたはNLogを選択した場合は、次のコマンドを使用してください。

    logger.Warn("Slow response - database01");
EventSource イベントを使用する

System.Diagnostics.Tracing.EventSource イベントをトレースとして Application Insights に送信するように構成できます。

  1. Microsoft.ApplicationInsights.EventSourceListener NuGet パッケージをインストールします。

  2. ApplicationInsights.configTelemetryModules セクションを編集します。

        <Add Type="Microsoft.ApplicationInsights.EventSourceListener.EventSourceTelemetryModule, Microsoft.ApplicationInsights.EventSourceListener">
          <Sources>
            <Add Name="MyCompany" Level="Verbose" />
          </Sources>
        </Add>
    

ソースごとに、次のパラメーターを設定できます。

  • Name は、収集する EventSource の名前を指定します。
  • Level は、収集するログ 記録レベルを指定します。 CriticalErrorInformationalLogAlwaysVerbose、または Warning です。
  • キーワード (省略可能) は、使用するキーワードの組み合わせの整数値を指定します。
DiagnosticSource イベントを使用する

トレースとして Application Insights に送信される System.Diagnostics.DiagnosticSource イベントを構成できます。

  1. Microsoft.ApplicationInsights.DiagnosticSourceListener NuGet パッケージをインストールします。

  2. ApplicationInsights.configTelemetryModules セクションを編集します。

        <Add Type="Microsoft.ApplicationInsights.DiagnosticSourceListener.DiagnosticSourceTelemetryModule, Microsoft.ApplicationInsights.DiagnosticSourceListener">
          <Sources>
            <Add Name="MyDiagnosticSourceName" />
          </Sources>
        </Add>
    

トレースする診断ソースごとに、 Name 属性が診断ソースの名前に設定されたエントリを追加します。

ETW イベントを使用する

Event Tracing for Windows (ETW) イベントをトレースとして Application Insights に送信するように構成できます。

  1. Microsoft.ApplicationInsights.EtwCollector NuGet パッケージをインストールします。

  2. ApplicationInsights.config ファイルの "TelemetryModules" セクションを編集します。

ETW イベントは、SDK をホストするプロセスが、パフォーマンス ログ ユーザーまたは管理者のメンバーである ID で実行されている場合にのみ収集できます。

    <Add Type="Microsoft.ApplicationInsights.EtwCollector.EtwCollectorTelemetryModule, Microsoft.ApplicationInsights.EtwCollector">
      <Sources>
        <Add ProviderName="MyCompanyEventSourceName" Level="Verbose" />
      </Sources>
    </Add>

ソースごとに、次のパラメーターを設定できます。

  • ProviderName は、収集する ETW プロバイダーの名前です。
  • ProviderGuid は、収集する ETW プロバイダーの GUID を指定します。 ProviderNameの代わりに使用できます。
  • レベル は、収集するログ 記録レベルを設定します。 重大エラー情報LogAlways詳細、または警告を指定できます。
  • キーワード (省略可能) は、使用するキーワードの組み合わせの整数値を設定します。
Trace API を直接使用する

Application Insights トレース API を直接呼び出すことができます。 ログ アダプターは、この API を使用します。 例えば次が挙げられます。

TelemetryConfiguration configuration = TelemetryConfiguration.CreateDefault();
var telemetryClient = new TelemetryClient(configuration);
telemetryClient.TrackTrace("Slow response - database01");

TrackTraceの利点は、比較的長いデータをメッセージに格納できることです。 たとえば、POST データをエンコードできます。

メッセージに重大度レベルを追加することもできます。 また、他のテレメトリと同様に、プロパティ値を追加して、さまざまなトレース セットのフィルター処理や検索に役立ちます。 例えば次が挙げられます。

TelemetryConfiguration configuration = TelemetryConfiguration.CreateDefault();
var telemetryClient = new TelemetryClient(configuration);
telemetryClient.TrackTrace("Slow database response",
                            SeverityLevel.Warning,
                            new Dictionary<string, string> { { "database", "db.ID" } });

トランザクション検索で、特定のデータベースに関連する特定の重大度レベルのすべてのメッセージを簡単に除外できるようになりました。

コンソール アプリケーション

Application Insights ログ記録をコンソール アプリケーションに追加するには、最初に 以下のNuGet パッケージをインストールします:

次の例では、Microsoft.Extensions.Logging.ApplicationInsights パッケージを使用し、コンソール アプリケーションの既定の動作を示します。 Microsoft.Extensions.Logging.ApplicationInsights パッケージは、コンソール アプリケーションで使用するか、メトリック、分散トレース、サンプリング、テレメトリ初期化子などの完全な機能セットを使用せずに、Application Insights の最小限の実装が必要な場合に常に使用する必要があります。

using Microsoft.ApplicationInsights.Channel;
using Microsoft.ApplicationInsights.Extensibility;
using Microsoft.Extensions.DependencyInjection;
using Microsoft.Extensions.Logging;

using var channel = new InMemoryChannel();

try
{
    IServiceCollection services = new ServiceCollection();
    services.Configure<TelemetryConfiguration>(config => config.TelemetryChannel = channel);
    services.AddLogging(builder =>
    {
        // Only Application Insights is registered as a logger provider
        builder.AddApplicationInsights(
            configureTelemetryConfiguration: (config) => config.ConnectionString = "<YourConnectionString>",
            configureApplicationInsightsLoggerOptions: (options) => { }
        );
    });

    IServiceProvider serviceProvider = services.BuildServiceProvider();
    ILogger<Program> logger = serviceProvider.GetRequiredService<ILogger<Program>>();

    logger.LogInformation("Logger is working...");
}
finally
{
    // Explicitly call Flush() followed by Delay, as required in console apps.
    // This ensures that even if the application terminates, telemetry is sent to the back end.
    channel.Flush();

    await Task.Delay(TimeSpan.FromMilliseconds(1000));
}

詳細については、「ILogger ログからはどのような種類の Application Insights テレメトリが生成されますか? Application Insights ではどこで ILogger ログを見ることができますか?」を参照してください。

ログのスコープ

次のガイダンスは、ILogger のシナリオ (ASP.NET Core とコンソールのみ) に適用されます。 クラシック ASP.NET には適用されません。

ApplicationInsightsLoggingProvider では、既定で有効になっているログ スコープがサポートされています。

スコープの型が IReadOnlyCollection<KeyValuePair<string,object>> の場合、コレクション内のキーと値の各ペアが、カスタム プロパティとして、Application Insights テレメトリに追加されます。 次の例では、ログは TraceTelemetry としてキャプチャされ、プロパティに ("MyKey", "MyValue") があります。

using (_logger.BeginScope(new Dictionary<string, object> { ["MyKey"] = "MyValue" }))
{
    _logger.LogError("An example of an Error level message");
}

他の型がスコープとして使用される場合は、Application Insights テレメトリのプロパティ Scope に格納されます。 次の例では、TraceTelemetry に、スコープを含む Scope という名前のプロパティが設定されます。

using (_logger.BeginScope("hello scope"))
{
    _logger.LogError("An example of an Error level message");
}

ログを検索する

デバッグ モードでアプリを実行するか、ライブでデプロイします。

Application Insights ポータルのアプリの [概要] ウィンドウで、[ トランザクション検索 ] を選択します。ここで、次の操作を行うことができます。

  • ログ トレースまたは特定のプロパティを持つ項目でフィルター処理します。
  • 特定の項目を詳細に調べます。
  • 同じユーザー要求に関連する (同じ操作 ID を持つ) 他のシステム ログ データを検索します。
  • ページの構成をお気に入りに保存します。

アプリケーションから大量のデータが送信され、Application Insights SDK for ASP.NET バージョン 2.0.0-beta3 以降を使用している場合、 アダプティブ サンプリング 機能が動作し、テレメトリの一部のみが送信される可能性があります。 詳細については、サンプリングに関する記事を参照してください。

Azure Monitor ログで調べる

ILogger ログはトレース テレメトリとして表示されます (Application Insights のテーブル traces と Log Analytics の AppTraces )。

Azure portal で Application Insights に移動し、次のコマンドを実行します:

traces
| where severityLevel >= 2 // 2=Warning, 1=Information, 0=Verbose
| take 50

分散トレース

最新のクラウドおよび マイクロサービス アーキテクチャでは、可用性とスループットを向上させながらコストを削減する、シンプルで個別にデプロイ可能なサービスが実現されています。 ただし、システム全体の推論とデバッグが難しくなっています。 分散トレースでは、クラウドおよびマイクロサービス アーキテクチャの呼び出し履歴と同様に動作するパフォーマンス プロファイラーを提供することで、この問題を解決します。

Azure Monitor には、分散トレース データを使用するための 2 つのエクスペリエンスが用意されています。1 つのトランザクション/要求の トランザクション診断 ビューと、システムの対話方法を示す アプリケーション マップ ビューです。

Application Insights では、分散テレメトリの相関関係を使用して、各コンポーネントを個別に監視し、障害やパフォーマンスの低下を担当するコンポーネントを検出できます。 この記事では、Application Insights で使用されるさまざまな言語とプラットフォームでのデータ モデル、コンテキスト伝達手法、プロトコル、相関戦術の実装について説明します。

Application Insights の自動インストルメンテーションまたは SDK を使用して、分散トレースを有効にする。

.NET、.NET Core、Java、Node.js、JavaScript 用の Application Insights エージェントと SDK はすべて、分散トレースをネイティブにサポートします。

適切な Application Insights SDK がインストールされ、構成されると、一般的なフレームワーク、ライブラリ、テクノロジのトレース情報が SDK 依存関係オートコレクタによって自動的に収集されます。 サポートされているテクノロジの完全な一覧は、 Dependency autocollection ドキュメントで入手できます。

TelemetryClient で TrackDependency を呼び出して、任意のテクノロジを手動で追跡することもできます。

テレメトリの相関関係のデータ モデル

Application Insights では、分散テレメトリの相関関係のための データ モデル を定義します。 テレメトリを論理操作に関連付けるために、すべてのテレメトリ項目には operation_Id というコンテキスト フィールドがあります。 分散トレース内のすべてのテレメトリ項目は、この識別子を共有します。 そのため、1 つのレイヤーからテレメトリを失った場合でも、他のコンポーネントから報告されたテレメトリを関連付けることができます。

分散論理操作は、通常、コンポーネントの 1 つによって処理される要求である一連の小規模な操作で構成されます。 要求テレメトリは、 これらの操作を定義します。 すべての要求テレメトリ項目には、一意かつグローバルに識別する独自の id があります。 要求に関連付けられているすべてのテレメトリ項目 (トレースや例外など) は、要求operation_parentIdの値にidを設定する必要があります。

依存関係テレメトリ は、別のコンポーネントへの HTTP 呼び出しなど、すべての送信操作を表します。 また、グローバルに一意の独自の id も定義します。 この依存関係呼び出しによって開始された要求テレメトリは、この idoperation_parentIdとして使用します。

operation_Idoperation_parentIdrequest.id、およびdependency.idを使用して、分散論理操作のビューを構築できます。 これらのフィールドは、テレメトリ呼び出しの因果関係の順序も定義します。

マイクロサービス環境では、コンポーネントからのトレースはさまざまなストレージ項目に移動できます。 Application Insights では、すべてのコンポーネントに独自の接続文字列を含めることができます。 Application Insights は、論理操作のテレメトリを取得するために、すべてのストレージ項目からデータを照会します。

ストレージ項目の数が多い場合は、次の場所に関するヒントが必要です。 Application Insights データ モデルでは、この問題を解決するために、 request.sourcedependency.targetという 2 つのフィールドが定義されています。 最初のフィールドは、依存関係要求を開始したコンポーネントを識別します。 2 番目のフィールドは、依存関係呼び出しの応答を返したコンポーネントを識別します。

複数の異なるインスタンスからのクエリの詳細については、 Azure Monitor の Log Analytics ワークスペース、アプリケーション、およびリソース全体のデータのクエリを参照してください。

Example

例を見てみましょう。 株価と呼ばれるアプリケーションは、Stock と呼ばれる外部 API を使用して、株式の現在の市場価格を示します。 株価アプリケーションには、 GET /Home/Stockを使用してクライアント Web ブラウザーが開く Stock ページというページがあります。 アプリケーションは、HTTP 呼び出し GET /api/stock/valueを使用して Stock API に対してクエリを実行します。

クエリを実行することで、結果のテレメトリを分析できます。

(requests | union dependencies | union pageViews)
| where operation_Id == "STYz"
| project timestamp, itemType, name, id, operation_ParentId, operation_Id

結果では、すべてのテレメトリ項目がルート operation_Idを共有します。 ページから Ajax 呼び出しが行われると、依存関係テレメトリに新しい一意の ID (qJSXU) が割り当てられ、pageView の ID が operation_ParentIdとして使用されます。 その後、サーバー要求は Ajax ID を operation_ParentIdとして使用します。

アイテムタイプ 名前 ID operation_ParentId operation_Id
pageView 株式ページ STYz STYz
依存関係 GET /Home/Stock qJSXU STYz STYz
要求 GET Home/Stock KqKwlrSt9PA= qJSXU STYz
依存関係 GET /api/stock/value bBrf2L7mm2g= KqKwlrSt9PA= STYz

呼び出し GET /api/stock/value が外部サービスに対して行われる場合は、 dependency.target フィールドを適切に設定できるように、そのサーバーの ID を把握する必要があります。 外部サービスが監視をサポートしていない場合、 target はサービスのホスト名に設定されます。 たとえば stock-prices-api.com です。 ただし、定義済みの HTTP ヘッダーを返すことによってサービス自体が識別される場合、 target には、Application Insights がそのサービスからのテレメトリに対してクエリを実行して分散トレースを構築できるようにするサービス ID が含まれます。

W3C TraceContext を使用した関連付けヘッダー

Application Insights は、次を定義する W3C トレース コンテキストに移行しています。

  • traceparent: 呼び出しの一意な操作IDとグローバルに一意の識別子を格納します。
  • tracestate: システム固有のトレース コンテキストを実行します。

Application Insights SDK の最新バージョンでは、Trace-Context プロトコルがサポートされていますが、オプトインが必要な場合があります。 (Application Insights SDK でサポートされていた以前の関連付けプロトコルとの下位互換性は維持されます)。

関連付け HTTP プロトコル (Request-Id とも呼ばれます) は非推奨になっています。 このプロトコルは、次の 2 つのヘッダーを定義します。

  • Request-Id: 呼び出しのグローバルに一意の ID を伝送します。
  • Correlation-Context: 分散トレース プロパティの名前と値のペアのコレクションを保持します。

Application Insights では、関連付け HTTP プロトコルの 拡張機能 も定義されます。 Request-Context名前と値のペアを使用して、直前の呼び出し元または呼び出し先が使用するプロパティのコレクションを伝達します。 Application Insights SDK では、このヘッダーを使用して、 dependency.target フィールドと request.source フィールドを設定します。

W3C トレース コンテキストおよび Application Insights データ モデルは、次のようにマップされます。

Application Insights W3C TraceContext
IdRequestDependency parent-id
Operation_Id trace-id
Operation_ParentId この範囲の親範囲の parent-id。 ルート範囲の場合は、このフィールドを空にする必要があります。

詳細については、「 Application Insights テレメトリ データ モデル」を参照してください。

W3C 分散トレースのサポートを有効にする

W3C TraceContext ベースの分散トレースは、レガシ Request-Id プロトコルとの下位互換性と共に、最近のすべての .NET Framework/.NET Core SDK で既定で有効になっています。

テレメトリの関連付け

関連付けは、アプリのオンボード時に既定で処理されます。 特別なアクションは必要ありません。

.NET ランタイムでは、ActivityDiagnosticSource の助けを借りて配布がサポートされます

Application Insights .NET SDK では、 DiagnosticSourceActivity を使用してテレメトリを収集し、関連付けることができます。

依存関係

自動追跡された依存関係

.NET と .NET Core 向けの Application Insights SDK には DependencyTrackingTelemetryModule が付属しています。これは、依存関係を自動的に収集するテレメトリ モジュールです。 モジュール DependencyTrackingTelemetryModule は、Microsoft.ApplicationInsights.DependencyCollector NuGet パッケージとして提供されており、Microsoft.ApplicationInsights.Web NuGet パッケージまたは Microsoft.ApplicationInsights.AspNetCore NuGet パッケージを使用すると自動的に取り込まれます。

DependencyTrackingTelemetryModule では現在のところ、次の依存関係が自動的に追跡されます。

依存関係 詳細
HTTP/HTTPS ローカルまたはリモートの http/https 呼び出し。
WCF の呼び出し HTTP ベースのバインディングを使用する場合にのみ自動追跡されます。
SQL SqlClient で行われる呼び出し。 SQL クエリのキャプチャについては、「詳細な SQL 追跡で完全な SQL クエリを取得する」を参照してください。
Azure Blob Storage、Table Storage、または Queue Storage Azure Storage クライアントで行われた呼び出し。
Azure Event Hubs クライアント SDK 最新のパッケージを使用します: https://nuget.org/packages/Azure.Messaging.EventHubs
Azure Service Bus クライアント SDK 最新のパッケージを使用します: https://nuget.org/packages/Azure.Messaging.ServiceBus
Azure Cosmos DB HTTP/HTTPS が使用されている場合は、自動的に追跡されます。 TCP を使用した直接モードでの操作のトレースは、プレビュー パッケージ >= 3.33.0-preview を使用して自動的にキャプチャされます。 詳細については、ドキュメントを参照してください。

依存関係が自動収集されない場合でも、TrackDependency 呼び出しを使えば手動で追跡することができます。

依存関係の追跡のしくみの詳細については、「Application Insights での依存関係の追跡」を参照してください。

コンソール アプリで自動依存関係追跡を設定する

.NET コンソール アプリから依存関係を自動的に追跡するには、NuGet パッケージ Microsoft.ApplicationInsights.DependencyCollector をインストールし、DependencyTrackingTelemetryModule を初期化します:

    DependencyTrackingTelemetryModule depModule = new DependencyTrackingTelemetryModule();
    depModule.Initialize(TelemetryConfiguration.Active);

.NET Core コンソール アプリの場合、TelemetryConfiguration.Active は非推奨です。

依存関係を手動で追跡する

次の例では、依存関係が自動的に収集されず、手動追跡が必要になります。

  • Azure Cosmos DB は、HTTP/HTTPS が使用されている場合にのみ、自動的に追跡されます。 TCP モードは、2.22.0-Beta1 より古い SDK バージョンの Application Insights によって自動的にキャプチャされることはありません。
  • Redis

SDK で自動追跡されない依存関係については、標準の自動収集モジュールで使用される TrackDependency API を利用し、手動で追跡できます。

自分で記述していないアセンブリを使ってコードを作成する場合、それに対するすべての呼び出しの時間を計ることができます。 このシナリオでは、それが応答時間にどのように貢献するかを知ることができます。

このデータを Application Insights 内の依存関係グラフに表示するには、データを TrackDependency を使用して送信します:


    var startTime = DateTime.UtcNow;
    var timer = System.Diagnostics.Stopwatch.StartNew();
    try
    {
        // making dependency call
        success = dependency.Call();
    }
    finally
    {
        timer.Stop();
        telemetryClient.TrackDependency("myDependencyType", "myDependencyCall", "myDependencyData", startTime, timer.Elapsed, success);
    }

あるいは、TelemetryClient から拡張メソッドの StartOperationStopOperation が提供されます。出力方向の依存関係の追跡で確認できるように、それを利用して依存関係を手動追跡できます。

標準の依存関係追跡モジュールを無効にする

詳細については、テレメトリ モジュールを参照してください。


詳細な SQL 追跡で完全な SQL クエリを取得する

SQL 呼び出しの場合、サーバーとデータベースの名前が常に収集され、収集された DependencyTelemetry の名前として保存されます。 「データ」という名称の別のフィールドがあります。これに完全な SQL クエリ テキストを含めることができます。

Azure Functions には、SQL テキスト コレクションを有効にするための別の設定が必要です。 詳細については、「SQL クエリ コレクションを有効にする」を参照してください。

ASP.NET アプリケーションの場合は、バイト コード インストルメンテーションの支援により、完全な SQL クエリ テキストが収集されます。これには、インストルメンテーション エンジン、または System.Data.SqlClient ライブラリではなく Microsoft.Data.SqlClient NuGet パッケージの使用が要求されます。 完全な SQL クエリの収集を有効にするためのプラットフォーム固有の手順を、次の表に示します。

Platform 完全な SQL クエリを取得するために必要な手順
Azure App Service の Web アプリ Web アプリのコントロール パネルで Application Insights ペインを開き、SQL コマンドを .NET の下で有効にします。
IIS Server (Azure VM やオンプレミスなど) Microsoft.Data.SqlClient NuGet パッケージを使用するか、Application Insights Agent PowerShell モジュールを使用して、インストルメンテーション エンジンをインストールして IIS を再起動します。
Azure Cloud Services StatusMonitor をインストールするスタートアップ タスクを追加します。
ビルド時に ASP.NET または ASP.NET Core アプリケーション用の NuGet パッケージをインストールすることで、アプリを ApplicationInsights SDK にオンボードする必要があります。
IIS Express Microsoft.Data.SqlClient NuGet パッケージを使用します。
Azure App Service での WebJobs Microsoft.Data.SqlClient NuGet パッケージを使用します。

前述のプラットフォーム固有の手順に加えて、次のコードで ファイルを変更することで、"SQL コマンドの収集の有効化も明示的に選択する" 必要があります。ApplicationInsights.config

<TelemetryModules>
  <Add Type="Microsoft.ApplicationInsights.DependencyCollector.DependencyTrackingTelemetryModule, Microsoft.AI.DependencyCollector">
    <EnableSqlCommandTextInstrumentation>true</EnableSqlCommandTextInstrumentation>
  </Add>

前述の例では、インストルメンテーション エンジンが正しくインストールされていることを検証する適切な方法は、収集された DependencyTelemetry の SDK バージョンが rddp であることを確認することです。 rdddsd または rddf を使用すると、依存関係が DiagnosticSource または EventSource コールバックによって収集されるため、完全な SQL クエリはキャプチャされません。

Exceptions

Web アプリケーションの例外は、Application Insights でレポートすることができます。 要求の失敗をクライアントとサーバーの両方の例外またはその他のイベントに相互に関連付けることで、原因をすばやく診断できます。 このセクションでは、例外レポートの設定、例外の明示的な報告、エラーの診断などを行う方法について説明します。

例外のレポートを設定する

サーバーまたはクライアントで発生した例外をレポートするように Application Insights を設定できます。 アプリケーションが依存しているプラットフォームに応じて、適切な拡張機能または SDK が必要です。

サーバー側のアプリケーションから例外をレポートさせるには、次のシナリオを考慮してください。

Important

このセクションでは、コード例の観点から .NET Framework アプリに焦点を当てています。 .NET Framework に対して機能するメソッドの一部は、.NET Core SDK では廃止されています。

エラーと例外を診断する

Application Insights には、監視対象アプリケーションの障害を診断するのに役立つ、キュレーションされたアプリケーション パフォーマンス管理エクスペリエンスが用意されています。

詳細な手順については、「Application Insights を使用してエラー、パフォーマンス、トランザクションを調査する」を参照してください。

カスタムのトレースとログ データ

アプリに固有の診断データを取得するには、独自のテレメトリ データを送信するコードを挿入します。 カスタムのテレメトリまたはログ データは、要求、ページ ビュー、およびその他の自動収集されたデータと共に、診断検索に表示されます。

Microsoft.VisualStudio.ApplicationInsights.TelemetryClient を使用すると、いくつかの API が利用できます。

  • TelemetryClient.TrackEvent は通常、使用パターンを監視するために使用されますが、送信されるデータは診断検索のカスタム イベントの下にも表示されます。 イベントには名前が付けられるほか、文字列プロパティや数値メトリックが付与され、それらを元に診断検索をフィルター処理できます。
  • TelemetryClient.TrackTrace は、POST 情報などの長いデータを送信できます。
  • TelemetryClient.TrackException は、Application Insights に例外の詳細 (スタック トレースなど) を送信します。

これらのイベントを表示するには、左側のメニューで [検索] を開きます。 [イベントの種類] ドロップダウン メニューを選択し、[カスタム イベント][トレース]、または [例外] を選択します。

[検索] 画面を示すスクリーンショット。

アプリで大量のテレメトリが生成される場合、アダプティブ サンプリング モジュールは、代表的なイベントの一部のみを送信することで、ポータルに送信される量を自動的に削減します。 同じ操作の一部であるイベントは、関連するイベント間を移動できるように、グループとして選択または選択解除されます。 詳細については、「Application Insights におけるサンプリング」を参照してください。

要求の POST データを表示する

要求詳細では、POST 呼び出しでアプリに送信されたデータは含まれません。 このデータを報告するには:

  • Application Insights SDK をアプリ コードに追加します。
  • アプリケーションにコードを挿入し、Microsoft.ApplicationInsights.TrackTrace() を呼び出します。 メッセージ パラメーターで POST データを送信します。 許可されるサイズには制限があります。そのため、必要不可欠なデータだけを送信するように努めてください。
  • 失敗した要求を調査するときは、関連付けられているトレースを検索します。

既定では、アプリでエラーを引き起こすすべての例外がポータルに表示されるわけではありません。 Web ページで JavaScript SDK を使用すると、ブラウザーの例外が表示されます。 ただし、ほとんどのサーバー側の例外は IIS によってインターセプトされるため、それらをキャプチャして報告するためのコードを追加する必要があります。

次のようにすることができます。

  • 例外を明示的に記録します
  • 例外を自動的にキャプチャします 。 追加しなければならないものはフレームワークの種類によって異なります。
例外を明示的にレポートする

最も簡単なレポート方法は、例外ハンドラーに trackException() の呼び出しを挿入することです。

var telemetry = new TelemetryClient();

try
{
    // ...
}
catch (Exception ex)
{
    var properties = new Dictionary<string, string>
    {
        ["Game"] = currentGame.Name
    };

    var measurements = new Dictionary<string, double>
    {
        ["Users"] = currentGame.Users.Count
    };

    // Send the exception telemetry:
    telemetry.TrackException(ex, properties, measurements);
}

プロパティと測定値のパラメーターは省略可能ですが、フィルター処理と、特別な情報を追加するのに便利です。 たとえば、複数のゲームを実行できるアプリケーションを使用している場合、1 つのゲームに関連する例外レポートをすべて検索できます。 必要な数だけ項目を各辞書に追加できます。

ブラウザーの例外

ほとんどのブラウザー例外が報告されます。

Web ページにコンテンツ配信ネットワークまたは他のドメインのスクリプト ファイルが含まれている場合は、スクリプト タグに crossorigin="anonymous" 属性があり、サーバーが CORS ヘッダーを送信することを確認します。 この動作により、これらのリソースからハンドルされない JavaScript 例外のスタック トレースと詳細を取得できます。

テレメトリ クライアントを再利用する

TelemetryClient を 1 回インスタンス化し、アプリケーションの有効期間中はそれを再利用することをお勧めします。

.NET の依存関係の挿入 (DI) と適切な .NET SDK があって、さらに Application Insights を DI 用に正しく構成すれば、コンストラクターのパラメーターとして TelemetryClient を要求することができます。

public class ExampleController : ApiController
{
    private readonly TelemetryClient _telemetryClient;

    public ExampleController(TelemetryClient telemetryClient)
    {
        _telemetryClient = telemetryClient;
    }
}

前の例では、TelemetryClientExampleController クラスに挿入されます。

Web フォーム

Web フォームの場合、HTTP モジュールは CustomErrors で構成されたリダイレクトがない場合に例外を収集できます。 ただし、アクティブなリダイレクトがある場合、次の行を Application_Error 関数に追加します。

void Application_Error(object sender, EventArgs e)
{
    if (HttpContext.Current.IsCustomErrorEnabled &&
        Server.GetLastError () != null)
    {
        _telemetryClient.TrackException(Server.GetLastError());
    }
}

前の例の _telemetryClient は、クラススコープの TelemetryClient 型変数です。

MVC

Application Insights Web SDK バージョン 2.6 (beta3 以降) から、Application Insights では、MVC 5+ コントローラーのメソッドでスローされた、ハンドルされない例外が自動的に収集されるようになりました。 このような例外を追跡するカスタム ハンドラーを以前に追加した場合は、それを削除して例外の二重追跡を防ぐことができます。

例外がスローされたときに例外フィルターでエラーを正しく処理できないシナリオがいくつかあります。

  • コントローラー コンストラクターから
  • メッセージ ハンドラーから
  • ルーティング中
  • 応答コンテンツのシリアル化中
  • アプリケーションの起動中
  • バックグラウンド タスク内

アプリケーションによって "処理される" すべての例外も手動で追跡する必要があります。 コントローラーで発生したハンドルされない例外では、通常、500 "内部サーバー エラー" 応答が返されます。 このような応答が、処理される例外 (または例外なし) の結果として手動で作成された場合は、ResultCode 500 を使用して対応する要求テレメトリで追跡されます。 ただし、Application Insights SDK では対応する例外を追跡できません。

以前のバージョンのサポート

Application Insights Web SDK 2.5 (および以前) の MVC 4 (および以前) を使用する場合は、次の例を参照して例外を追跡します。


展開して以前のバージョンの手順を表示する

CustomErrors 構成が Off の場合、HTTP モジュールが収集する例外を使用できます。 ただし、RemoteOnly (既定) または On に設定されている場合、例外はクリアされ、Application Insights で自動的に収集することはできません。 この動作を解決するには、System.Web.Mvc.HandleErrorAttribute クラスをオーバーライドし、次のようにオーバーライドしたクラスを異なる MVC バージョンに適用します (GitHub ソースを参照)。

using System;
using System.Web.Mvc;
using Microsoft.ApplicationInsights;

namespace MVC2App.Controllers
{
    [AttributeUsage(AttributeTargets.Class | AttributeTargets.Method, Inherited = true, AllowMultiple = true)]
    public class AiHandleErrorAttribute : HandleErrorAttribute
    {
        public override void OnException(ExceptionContext filterContext)
        {
            if (filterContext != null && filterContext.HttpContext != null && filterContext.Exception != null)
            {
                //The attribute should track exceptions only when CustomErrors setting is On
                //if CustomErrors is Off, exceptions will be caught by AI HTTP Module
                if (filterContext.HttpContext.IsCustomErrorEnabled)
                {   //Or reuse instance (recommended!). See note above.
                    var ai = new TelemetryClient();
                    ai.TrackException(filterContext.Exception);
                }
            }
            base.OnException(filterContext);
        }
    }
}

MVC 2

HandleError 属性をコントローラーの新しい属性に置換します。

    namespace MVC2App.Controllers
    {
        [AiHandleError]
        public class HomeController : Controller
        {
            // Omitted for brevity
        }
    }

サンプル

MVC 3

AiHandleErrorAttribute をグローバル フィルターとして登録します。

public class MyMvcApplication : System.Web.HttpApplication
{
    public static void RegisterGlobalFilters(GlobalFilterCollection filters)
    {
        filters.Add(new AiHandleErrorAttribute());
    }
}

サンプル

MVC 4、MVC 5

AiHandleErrorAttribute をグローバル フィルターとして登録します。

public class FilterConfig
{
    public static void RegisterGlobalFilters(GlobalFilterCollection filters)
    {
        // Default replaced with the override to track unhandled exceptions
        filters.Add(new AiHandleErrorAttribute());
    }
}

サンプル

Web API

Application Insights Web SDK バージョン 2.6 (beta3 以降) から、Application Insights では、Web API 2+ についてコントローラーのメソッドでスローされたハンドルされない例外を自動的に収集します。 次の例で説明するように、このような例外を追跡するカスタム ハンドラーを以前に追加した場合は、それを削除して、例外の二重追跡を防ぐことができます。

例外フィルターで処理できないケースがいくつかあります。 例えば次が挙げられます。

  • コントローラー コンストラクターからスローされる例外。
  • メッセージ ハンドラーからスローされる例外。
  • ルーティング中にスローされる例外。
  • 応答内容のシリアル化中にスローされる例外。
  • アプリケーションの起動中にスローされる例外。
  • バックグラウンド タスクでスローされる例外。

アプリケーションによって "処理される" すべての例外も手動で追跡する必要があります。 コントローラーで発生したハンドルされない例外では、通常、500 "内部サーバー エラー" 応答が返されます。 このような応答が、処理された例外 (または例外なし) の結果として手動で作成された場合は、ResultCode 500 を使用して対応する要求テレメトリで追跡されます。 ただし、Application Insights SDK では対応する例外を追跡できません。

以前のバージョンのサポート

Application Insights Web SDK 2.5 (およびそれ以前) の Web API 1 (およびそれ以前) を使用している場合は、次の例を参照して例外を追跡します。


展開して以前のバージョンの手順を表示する

Web API 1.x

System.Web.Http.Filters.ExceptionFilterAttribute をオーバーライドします。

using System.Web.Http.Filters;
using Microsoft.ApplicationInsights;

namespace WebAPI.App_Start
{
    public class AiExceptionFilterAttribute : ExceptionFilterAttribute
    {
    public override void OnException(HttpActionExecutedContext actionExecutedContext)
    {
        if (actionExecutedContext != null && actionExecutedContext.Exception != null)
        {  //Or reuse instance (recommended!). See note above.
            var ai = new TelemetryClient();
            ai.TrackException(actionExecutedContext.Exception);
        }
        base.OnException(actionExecutedContext);
    }
    }
}

このオーバーライドされた属性を特定のコントローラーに追加するか、WebApiConfig クラスのグローバル フィルター構成に追加できます。

using System.Web.Http;
using WebApi1.x.App_Start;

namespace WebApi1.x
{
    public static class WebApiConfig
    {
        public static void Register(HttpConfiguration config)
        {
            config.Routes.MapHttpRoute(
                name: "DefaultApi",
                routeTemplate: "api/{controller}/{id}",
                defaults: new { id = RouteParameter.Optional });
    
            // ...
            config.EnableSystemDiagnosticsTracing();
    
            // Capture exceptions for Application Insights:
            config.Filters.Add(new AiExceptionFilterAttribute());
        }
    }
}

サンプル

Web API 2.x

IExceptionLogger の実装を追加します。

using System.Web.Http.ExceptionHandling;
using Microsoft.ApplicationInsights;

namespace ProductsAppPureWebAPI.App_Start
{
    public class AiExceptionLogger : ExceptionLogger
    {
        public override void Log(ExceptionLoggerContext context)
        {
            if (context != null && context.Exception != null)
            {
                //or reuse instance (recommended!). see note above
                var ai = new TelemetryClient();
                ai.TrackException(context.Exception);
            }
            base.Log(context);
        }
    }
}

このスニペットを WebApiConfig のサービスに追加します。

using System.Web.Http;
using System.Web.Http.ExceptionHandling;
using ProductsAppPureWebAPI.App_Start;

namespace WebApi2WithMVC
{
    public static class WebApiConfig
    {
        public static void Register(HttpConfiguration config)
        {
            // Web API configuration and services
    
            // Web API routes
            config.MapHttpAttributeRoutes();
    
            config.Routes.MapHttpRoute(
                name: "DefaultApi",
                routeTemplate: "api/{controller}/{id}",
                defaults: new { id = RouteParameter.Optional });

            config.Services.Add(typeof(IExceptionLogger), new AiExceptionLogger());
        }
    }
}

サンプル

代替として、次のように操作できます。

  • 唯一の ExceptionHandler インスタンスを、IExceptionHandler のカスタム実装に置換します。 この例外ハンドラーは、送信する応答メッセージをフレームワークでまだ選択できるときにのみ呼び出されます (たとえば、接続が中止されるときではありません)。
  • Web API 1.x コントローラーに関する前述のセクションで説明したように例外フィルターを使用します (これは、場合によっては呼び出されません)。

WCF

Attribute を拡張し、IErrorHandlerIServiceBehavior を実装するクラスを追加します。

    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.ServiceModel.Description;
    using System.ServiceModel.Dispatcher;
    using System.Web;
    using Microsoft.ApplicationInsights;

    namespace WcfService4.ErrorHandling
    {
      public class AiLogExceptionAttribute : Attribute, IErrorHandler, IServiceBehavior
      {
        public void AddBindingParameters(ServiceDescription serviceDescription,
            System.ServiceModel.ServiceHostBase serviceHostBase,
            System.Collections.ObjectModel.Collection<ServiceEndpoint> endpoints,
            System.ServiceModel.Channels.BindingParameterCollection bindingParameters)
        {
        }

        public void ApplyDispatchBehavior(ServiceDescription serviceDescription,
            System.ServiceModel.ServiceHostBase serviceHostBase)
        {
            foreach (ChannelDispatcher disp in serviceHostBase.ChannelDispatchers)
            {
                disp.ErrorHandlers.Add(this);
            }
        }

        public void Validate(ServiceDescription serviceDescription,
            System.ServiceModel.ServiceHostBase serviceHostBase)
        {
        }

        bool IErrorHandler.HandleError(Exception error)
        {//or reuse instance (recommended!). see note above
            var ai = new TelemetryClient();

            ai.TrackException(error);
            return false;
        }

        void IErrorHandler.ProvideFault(Exception error,
            System.ServiceModel.Channels.MessageVersion version,
            ref System.ServiceModel.Channels.Message fault)
        {
        }
      }
    }

サービス実装に属性を追加します。

namespace WcfService4
{
    [AiLogException]
    public class Service1 : IService1
    {
        // Omitted for brevity
    }
}

サンプル

例外パフォーマンス カウンター

サーバーに Azure Monitor Application Insights エージェントをインストールした場合は、.NET によって測定された例外率のグラフを取得できます。 .NET 例外 (処理済みのものとハンドルされないものの両方) が含まれます。

[メトリックス エクスプローラー] タブを開き、新しいグラフを追加します。 [パフォーマンス カウンター] で、[例外レート] を選択します。

.NET フレームワークでは、ある特定の時間間隔の例外数をカウントし、それを時間間隔の長さで除算してレートを算出します。

この数は、TrackException レポートをカウントする Application Insights ポータルで算出される例外数とは異なります。 サンプリングの時間間隔が異なります。さらに、SDK では、すべての処理済みの例外と未処理の例外について TrackException レポートを送信するわけではありません。

カスタム メトリック コレクション

Azure Monitor Application Insights .NET SDK と .NET Core SDK には、カスタム メトリックを収集する 2 つの異なる方法があります。

  • 事前集計が欠けている TrackMetric() メソッド。
  • 事前集計のある GetMetric() メソッド。

集計を使用することをお勧めします。そのため、TrackMetric()はカスタム メトリックを収集するための推奨される方法ではなくなりました。 この記事では、GetMetric() メソッドの使用方法と、そのしくみの背後にある論理的根拠についていくつか説明します。


拡張して、事前集計と非事前集計 API の詳細を確認します

TrackMetric() メソッドでは、メトリックを示す未加工のテレメトリを送信します。 値ごとに単一のテレメトリ項目を送信することは、非効率的です。 また、すべての TrackMetric() がテレメトリ初期化子とプロセッサの完全な SDK パイプラインを通過するため、TrackMetric(item) メソッドはパフォーマンスの点でも非効率的です。

TrackMetric() とは異なり、GetMetric() ではローカル事前集計が自動的に処理され、1 分の一定間隔で集計されたサマリー メトリックのみが送信されます。 一部のカスタム メトリックを秒またはミリ秒単位で厳密に監視する必要がある場合、1 分ごとに監視するだけのストレージとネットワーク トラフィックのコストのみが発生している間にそのようにすることができます。 また、この動作により、集計されたメトリックに対して送信する必要があるテレメトリ項目の合計数が大幅に減少するため、調整が発生するリスクが大幅に軽減されます。

Application Insights では、TrackMetric()GetMetric() を介して収集されたカスタム メトリックはサンプリングの対象にはなりません。 重要なメトリックをサンプリングすると、それらのメトリックを中心に構築されたアラートが信頼性が低下するシナリオが発生する可能性があります。 カスタム メトリックをサンプリングしないようにすることで、一般に、アラートのしきい値違反が発生した場合にアラートが起動するという確信を得ることができます。 カスタム メトリックはサンプリングされないため、潜在的な懸念事項がいくつかあります。

1 秒ごとに、あるいはさらに細かい間隔でメトリックの傾向を追跡すると、次のようになることがあります。

  • データ ストレージのコストが増加する。 Azure Monitor に送信するデータの量に関連したコストが発生します 送信するデータの量が多いほど、監視の全体的なコストが高くなります。
  • ネットワーク トラフィックまたはパフォーマンスのオーバーヘッドが増加します。 一部のシナリオでは、このオーバーヘッドにより、金銭的にもアプリケーション パフォーマンスの面でもコストがかかる可能性があります。
  • インジェスト調整のリスク アプリで短期間に高いレートのテレメトリを送信すると、Azure Monitor によってデータ ポイントが削除 ("スロットル") されます。

調整が懸念事項になるのは、それによってアラートが起動しなくなる場合があるためです。 アラートをトリガーする条件がローカルで発生し、送信されるデータが多すぎるためにインジェスト エンドポイントで削除される可能性があります。 独自のローカル集計ロジックを実装していない限り、.NET および .NET Core では TrackMetric() を使用しないことをお勧めします。 すべてのインスタンスを追跡しようとしたときに、特定の期間にわたってイベントが発生した場合は、TrackEvent() の方が適していることがわかります。 カスタム メトリックとは異なり、カスタム イベントはサンプリングの対象となることに注意してください。 独自のローカル事前集計を記述しなくても TrackMetric() を引き続き使用することはできます。 ただし、その場合は落とし穴に注意してください。

つまり、事前集計を行い、すべての GetMetric() 呼び出しからの値を蓄積し、1 分ごとにサマリーや集計を送信するという理由から、Track() をお勧めします。 GetMetric() メソッドにより、すべての関連情報を引き続き収集しながら、送信するデータ ポイントを少なくすることによって、コストとパフォーマンスのオーバーヘッドを大幅に削減できます。

GetMetric の使用を開始する

この例では、基本的な .NET Core 3.1 ワーカー サービス アプリケーションを使用します。 これらの例で使用するテスト環境をレプリケートする場合は、 .NET Core Worker Service アプリケーションの手順 1 から 6 に従います。 次の手順では、基本的な worker サービス プロジェクト テンプレートに Application Insights を追加します。 この概念は、Web アプリやコンソール アプリを含め、SDK を使用できる一般的なアプリケーションに適用されます。

メトリックの送信

worker.cs ファイルの内容を次のコードに置き換えます。

using System;
using System.Threading;
using System.Threading.Tasks;
using Microsoft.Extensions.Hosting;
using Microsoft.Extensions.Logging;
using Microsoft.ApplicationInsights;

namespace WorkerService3
{
    public class Worker : BackgroundService
    {
        private readonly ILogger<Worker> _logger;
        private TelemetryClient _telemetryClient;

        public Worker(ILogger<Worker> logger, TelemetryClient tc)
        {
            _logger = logger;
            _telemetryClient = tc;
        }

        protected override async Task ExecuteAsync(CancellationToken stoppingToken)
        {   // The following line demonstrates usages of GetMetric API.
            // Here "computersSold", a custom metric name, is being tracked with a value of 42 every second.
            while (!stoppingToken.IsCancellationRequested)
            {
                _telemetryClient.GetMetric("ComputersSold").TrackValue(42);

                _logger.LogInformation("Worker running at: {time}", DateTimeOffset.Now);
                await Task.Delay(1000, stoppingToken);
            }
        }
    }
}

サンプル コードを実行すると、Visual Studio 出力ウィンドウにテレメトリが送信されることなく、while ループが繰り返し実行されていることがわかります。 単一のテレメトリ項目が約 60 秒のマークで送信され、このテストでは次のようになります:

Application Insights Telemetry: {"name":"Microsoft.ApplicationInsights.Dev.00000000-0000-0000-0000-000000000000.Metric", "time":"2019-12-28T00:54:19.0000000Z",
"ikey":"00000000-0000-0000-0000-000000000000",
"tags":{"ai.application.ver":"1.0.0.0",
"ai.cloud.roleInstance":"Test-Computer-Name",
"ai.internal.sdkVersion":"m-agg2c:2.12.0-21496",
"ai.internal.nodeName":"Test-Computer-Name"},
"data":{"baseType":"MetricData",
"baseData":{"ver":2,"metrics":[{"name":"ComputersSold",
"kind":"Aggregation",
"value":1722,
"count":41,
"min":42,
"max":42,
"stdDev":0}],
"properties":{"_MS.AggregationIntervalMs":"42000",
"DeveloperMode":"true"}}}}

この単一のテレメトリ項目は、41 の個別のメトリック測定の集計を表します。 同じ値を何度も送信していたため、標準偏差 (stDev) は 0 で、最大 (max) と最小 (min) の値は同一になっています。 value プロパティは、集計されたすべての個々の値の合計を表します。

GetMetric メソッドでは、最後の値 (例: gauge) の追跡や、ヒストグラムまたは分布の追跡はサポートされていません。

ログ (Analytics) エクスペリエンスで Application Insights リソースを調べると、個別のテレメトリ項目は次のスクリーンショットのようになります。

Log Analytics のクエリ ビューを示すスクリーンショット。

取り込み後に未加工のテレメトリ項目に明示的な sum プロパティやフィールドは含まれませんが、ここでは 1 つ作成します。 この場合、valuevalueSum の両方のプロパティは同じことを表します。

ログベースとカスタム メトリックの両方として、ポータルの [メトリック] セクションでカスタム メトリック テレメトリにアクセスすることもできます。 次のスクリーンショットはログベースのメトリックの例です。

メトリックス エクスプローラー ビューを示すスクリーンショット。

高スループット使用率のメトリック参照をキャッシュする

場合によっては、メトリック値が頻繁に観測されることがあります。 たとえば、1 秒あたり 500 要求を処理する高スループット サービスでは、要求ごとに 20 個のテレメトリ メトリックの生成が必要になる場合があります。 結果は、1 秒あたり 10,000 の値を追跡することを意味します。 このような高スループットのシナリオでは、ユーザーは、一部の参照を回避して SDK を補助することが必要になる場合があります。

たとえば、前の例では、ComputersSold というメトリックのハンドルを参照し、観測値 42 を追跡しました。 代わりに、複数のトラック呼び出しに対してハンドルがキャッシュされる可能性があります。

//...

        protected override async Task ExecuteAsync(CancellationToken stoppingToken)
        {
            // This is where the cache is stored to handle faster lookup
            Metric computersSold = _telemetryClient.GetMetric("ComputersSold");
            while (!stoppingToken.IsCancellationRequested)
            {

                computersSold.TrackValue(42);

                computersSold.TrackValue(142);

                _logger.LogInformation("Worker running at: {time}", DateTimeOffset.Now);
                await Task.Delay(50, stoppingToken);
            }
        }

前の例では、メトリック ハンドルをキャッシュするだけでなく、Task.Delay も 50 ミリ秒に短縮され、ループがより頻繁に実行されるようになりました。 その結果、TrackValue() が 772 回呼び出されました。

多次元メトリック

前のセクションの例は、0 次元メトリックを示しています。 メトリックは多次元にすることもできます。 現在、最大で 10 個のディメンションがサポートされています。

1 次元メトリックを作成する方法の例を次に示します。

//...

        protected override async Task ExecuteAsync(CancellationToken stoppingToken)
        {
            // This is an example of a metric with a single dimension.
            // FormFactor is the name of the dimension.
            Metric computersSold= _telemetryClient.GetMetric("ComputersSold", "FormFactor");

            while (!stoppingToken.IsCancellationRequested)
            {
                // The number of arguments (dimension values)
                // must match the number of dimensions specified while GetMetric.
                // Laptop, Tablet, etc are values for the dimension "FormFactor"
                computersSold.TrackValue(42, "Laptop");
                computersSold.TrackValue(20, "Tablet");
                computersSold.TrackValue(126, "Desktop");


                _logger.LogInformation("Worker running at: {time}", DateTimeOffset.Now);
                await Task.Delay(50, stoppingToken);
            }
        }

このサンプル コードを少なくとも 60 秒実行すると、3 つの異なるテレメトリ項目が Azure に送信されます。 それぞれの項目は、3 つのフォーム ファクターのいずれかの集計を表します。 先ほどと同じように、ログ (Analytics) ビューでさらに確認することができます。

多次元メトリックの Log Analytics ビューを示すスクリーンショット。

メトリックス エクスプローラーでは、次のようになります。

カスタム メトリックを示すスクリーンショット。

新しいカスタム ディメンションでメトリックを分割したり、メトリック ビューでカスタム ディメンションを表示したりできないことがわかります。

分割のサポートを示すスクリーンショット。

既定では、メトリック エクスプローラー内の多次元メトリックは、Application Insights リソースで有効になっていません。

多次元メトリックを有効にする

Application Insights リソースに対して多次元メトリックを有効にするには、[使用量と推定コスト]>[カスタム メトリック]>[カスタム メトリック ディメンションに関するアラートを有効にします]>[OK] の順に選択します。 詳細については、「カスタム メトリックのディメンションと事前集計」を参照してください。

この変更を行って新しい多次元テレメトリを送信した後、[分割を適用] を選択できます。

ポータルで機能をオンにした後に新しく送信されたメトリックにのみ、ディメンションが格納されます。

分割の適用を示すスクリーンショット。

FormFactor ディメンションのメトリック集計を表示します。

フォーム ファクターを示すスクリーンショット。

3 個を超えるディメンションがある場合に MetricIdentifier を使用する

現在、10 個のディメンションがサポートされています。 3 つ以上のディメンションを使用するには、 MetricIdentifierを使用する必要があります。

// Add "using Microsoft.ApplicationInsights.Metrics;" to use MetricIdentifier
// MetricIdentifier id = new MetricIdentifier("[metricNamespace]","[metricId],"[dim1]","[dim2]","[dim3]","[dim4]","[dim5]");
MetricIdentifier id = new MetricIdentifier("CustomMetricNamespace","ComputerSold", "FormFactor", "GraphicsCard", "MemorySpeed", "BatteryCapacity", "StorageCapacity");
Metric computersSold = _telemetryClient.GetMetric(id);
computersSold.TrackValue(110,"Laptop", "Nvidia", "DDR4", "39Wh", "1TB");

カスタム メトリックの構成

メトリックの構成を変更する場合は、メトリックが初期化されている場所で変更を行う必要があります。

特殊なディメンション名

メトリックでは、アクセスに使われる TelemetryClient のテレメトリ コンテキストは使用されません。 MetricDimensionNames クラスの定数として有効である特殊なディメンション名の使用は、このような制限がある場合に最適な回避策です。

次の Special Operation Request Size メトリックによって送信されたメトリック集計では、Context.Operation.Name に設定Special OperationTrackMetric() メソッドまたはその他の TrackXXX() メソッドでは、OperationNameSpecial Operation に正しく設定されています。

        //...
        TelemetryClient specialClient;
        private static int GetCurrentRequestSize()
        {
            // Do stuff
            return 1100;
        }
        int requestSize = GetCurrentRequestSize()

        protected override async Task ExecuteAsync(CancellationToken stoppingToken)
        {
            while (!stoppingToken.IsCancellationRequested)
            {
                //...
                specialClient.Context.Operation.Name = "Special Operation";
                specialClient.GetMetric("Special Operation Request Size").TrackValue(requestSize);
                //...
            }
                   
        }

この場合、MetricDimensionNames 値を指定するために、TelemetryContext クラスに一覧表示されている特殊なディメンション名を使用します。

たとえば、次のステートメントの結果として得られるメトリック集計が Application Insights クラウド エンドポイントに送信されると、その Context.Operation.Name データ フィールドは Special Operation に設定されます:

_telemetryClient.GetMetric("Request Size", MetricDimensionNames.TelemetryContext.Operation.Name).TrackValue(requestSize, "Special Operation");

この特殊ディメンションの値は TelemetryContext にコピーされ、通常のディメンションとしては使用されません。 通常のメトリック探索のために操作ディメンションも保持する場合は、その目的のために別のディメンションを作成する必要があります。

_telemetryClient.GetMetric("Request Size", "Operation Name", MetricDimensionNames.TelemetryContext.Operation.Name).TrackValue(requestSize, "Special Operation", "Special Operation");
ディメンションと時系列の上限

テレメトリ サブシステムで誤ってリソースを使い切らないようにするために、メトリックごとのデータ系列の最大数を制御できます。 既定の制限は、メトリックごとのデータ系列の合計が 1,000 を超えず、ディメンションごとの異なる値が 100 を超えないことです。

Important

調整を回避するには、ディメンションに使用する基数の値を小さくします。

ディメンションと時系列の上限のコンテキストでは、Metric.TrackValue(..) を使用して、制限が観測されていることを確認します。 制限に既に達している場合、Metric.TrackValue(..) により False が返され、値は追跡されません。 それ以外の場合は Trueを返します。 この動作は、メトリックのデータがユーザー入力によって生じる場合に便利です。

MetricConfiguration コンストラクターでは、各メトリック内のさまざまな系列を管理する方法に関するいくつかのオプションを使用します。また、メトリックの個々の系列に対して集計動作を指定する IMetricSeriesConfiguration を実装するクラスのオブジェクトを使用します。

var metConfig = new MetricConfiguration(seriesCountLimit: 100, valuesPerDimensionLimit:2,
                new MetricSeriesConfigurationForMeasurement(restrictToUInt32Values: false));

Metric computersSold = _telemetryClient.GetMetric("ComputersSold", "Dimension1", "Dimension2", metConfig);

// Start tracking.
computersSold.TrackValue(100, "Dim1Value1", "Dim2Value1");
computersSold.TrackValue(100, "Dim1Value1", "Dim2Value2");

// The following call gives 3rd unique value for dimension2, which is above the limit of 2.
computersSold.TrackValue(100, "Dim1Value1", "Dim2Value3");
// The above call does not track the metric, and returns false.
  • seriesCountLimit は、メトリックに含めることができるデータ時系列の最大数です。 この制限に達すると、TrackValue() が呼び出されます。この結果、通常、新しい系列によって false が返されます。
  • valuesPerDimensionLimit では、同じようにディメンションごとに個別の値の数を制限します。
  • restrictToUInt32Values では、負でない整数値のみを追跡するかどうかを決定します。

上限を超えているかどうかを確認するためのメッセージを送信する方法の例を以下に示します。

if (! computersSold.TrackValue(100, "Dim1Value1", "Dim2Value3"))
{
// Add "using Microsoft.ApplicationInsights.DataContract;" to use SeverityLevel.Error
_telemetryClient.TrackTrace("Metric value not tracked as value of one of the dimension exceeded the cap. Revisit the dimensions to ensure they are within the limits",
SeverityLevel.Error);
}

カスタム操作の追跡

Application Insights SDK では、受信 HTTP 要求と、依存関係にあるサービスへの呼び出し (HTTP 要求や SQL クエリなど) を自動的に追跡します。 要求と依存関係の追跡と関連付けによってアプリケーションを構成しているすべてのマイクロサービスの応答性と信頼性を確認することで、アプリケーション全体の状態を把握することができます。

ただし、一律に対応することのできない類のアプリケーション パターンも存在します。 そうしたパターンを適切に監視するためには、手動によるコードのインストルメンテーションが必要となります。 このセクションでは、カスタム キュー処理や実行時間の長いバックグラウンド タスクなど、手動インストルメンテーションが必要になる可能性があるいくつかのパターンについて説明します。

このセクションでは、Application Insights SDK を使用してカスタム操作を追跡する方法についてのガイドラインを示します。

概要

操作は、アプリケーションによって実行される処理の 1 つの論理部分です。 操作には、名前、開始時刻、継続時間、および実行コンテキストがあります (ユーザー名、プロパティ、結果など)。 操作 A が 操作 B によって開始された場合は、操作 B が A の親として設定されます。1 つの操作は、親を 1 つだけ持つことができますが、複数の子操作を持つことができます。 操作とテレメトリの関連付けの詳細については、「Application Insights におけるテレメトリの相関付け」を参照してください。

Application Insights .NET SDK では、操作は、抽象クラス OperationTelemetry とその子孫である RequestTelemetryDependencyTelemetry によって表されます。

受信操作の追跡

Application Insights Web SDK は、IIS パイプラインで実行される ASP.NET アプリケーションとすべての ASP.NET Core アプリケーションを対象に、HTTP 要求を自動的に収集します。 それ以外のプラットフォームとフレームワークについては、コミュニティによってサポートされるソリューションが存在します。 標準のソリューションやコミュニティでサポートされているソリューションでサポートされていないアプリケーションについては、手動でインストルメント化できます。

キューからアイテムを受け取る worker も、独自の追跡が必要なケースです。 キューによっては、そのキューにメッセージを追加する呼び出しが、依存関係として追跡されます。 メッセージの処理を表す上位の操作については、自動的には収集されません。

そのような操作がどのように追跡されるかを見てみましょう。

簡潔に言うと、このタスクとは、RequestTelemetry を作成して既知のプロパティを設定することです。 操作が完了したら、このテレメトリを追跡します。 次の例は、このタスクを示しています。

Owin 自己ホスト型アプリにおける HTTP 要求

この例では、トレース コンテキストは、関連付け用の HTTP プロトコルに従って反映されます。 ここに記載されているヘッダーが受信されることを予期してください。


展開してコードを表示する
public class ApplicationInsightsMiddleware : OwinMiddleware
{
    // You may create a new TelemetryConfiguration instance, reuse one you already have,
    // or fetch the instance created by Application Insights SDK.
    private readonly TelemetryConfiguration telemetryConfiguration = TelemetryConfiguration.CreateDefault();
    private readonly TelemetryClient telemetryClient = new TelemetryClient(telemetryConfiguration);
    
    public ApplicationInsightsMiddleware(OwinMiddleware next) : base(next) {}

    public override async Task Invoke(IOwinContext context)
    {
        // Let's create and start RequestTelemetry.
        var requestTelemetry = new RequestTelemetry
        {
            Name = $"{context.Request.Method} {context.Request.Uri.GetLeftPart(UriPartial.Path)}"
        };

        // If there is a Request-Id received from the upstream service, set the telemetry context accordingly.
        if (context.Request.Headers.ContainsKey("Request-Id"))
        {
            var requestId = context.Request.Headers.Get("Request-Id");
            // Get the operation ID from the Request-Id (if you follow the HTTP Protocol for Correlation).
            requestTelemetry.Context.Operation.Id = GetOperationId(requestId);
            requestTelemetry.Context.Operation.ParentId = requestId;
        }

        // StartOperation is a helper method that allows correlation of 
        // current operations with nested operations/telemetry
        // and initializes start time and duration on telemetry items.
        var operation = telemetryClient.StartOperation(requestTelemetry);

        // Process the request.
        try
        {
            await Next.Invoke(context);
        }
        catch (Exception e)
        {
            requestTelemetry.Success = false;
            requestTelemetry.ResponseCode;
            telemetryClient.TrackException(e);
            throw;
        }
        finally
        {
            // Update status code and success as appropriate.
            if (context.Response != null)
            {
                requestTelemetry.ResponseCode = context.Response.StatusCode.ToString();
                requestTelemetry.Success = context.Response.StatusCode >= 200 && context.Response.StatusCode <= 299;
            }
            else
            {
                requestTelemetry.Success = false;
            }

            // Now it's time to stop the operation (and track telemetry).
            telemetryClient.StopOperation(operation);
        }
    }
    
    public static string GetOperationId(string id)
    {
        // Returns the root ID from the '|' to the first '.' if any.
        int rootEnd = id.IndexOf('.');
        if (rootEnd < 0)
            rootEnd = id.Length;

        int rootStart = id[0] == '|' ? 1 : 0;
        return id.Substring(rootStart, rootEnd - rootStart);
    }
}

この関連付け用の HTTP プロトコルも、Correlation-Context ヘッダーを宣言しますが、 ここでは、簡潔にするために省略されています。

キューのインストルメンテーション

W3C トレース コンテキスト関連付け用の HTTP プロトコルは、関連付けの詳細を HTTP 要求で渡しますが、すべてのキュー プロトコルでは、同じ詳細がキュー メッセージでどのように渡されるかを定義する必要があります。 AMQP などの一部のキュー プロトコルでは、より多くのメタデータを渡すことができます。 Azure Storage Queue などの他のプロトコルでは、コンテキストをメッセージ ペイロードにエンコードする必要があります。

コンポーネント間のトレースは、キューではまだサポートされていません。

HTTP を使用すると、プロデューサーとコンシューマーが、異なる Application Insights リソースにテレメトリを送信する場合、トランザクションの診断エクスペリエンスとアプリケーション マップでトランザクションが表示され、エンドツーエンドでマップされます。 キューの場合、この機能はまだサポートされていません。

Service Bus キュー

トレース情報については、「Azure Service Bus メッセージングを介した分散トレースと相関付け」を参照してください。

Azure Storage キュー

Azure Storage キューの操作を追跡し、プロデューサー、コンシューマー、Azure Storage 間でテレメトリを相互に関連付ける例を次に示します。

Storage キューには HTTP API があります。 キューに対するすべての呼び出しは、Application Insights の HTTP 要求の依存関係コレクターによって追跡されます。 既定では、ASP.NET と ASP.NET Core アプリケーションで構成されます。 他の種類のアプリケーションについては、コンソール アプリケーションに関するドキュメントを参照してください。

Application Insights の操作 ID を Storage の要求 ID に関連付けることもできます。 Storage の要求クライアントとサーバーの要求 ID の設定および取得方法については、「Azure Storage の監視、診断、およびトラブルシューティング」を参照してください。

Storage キューは HTTP API をサポートしているため、キューを使ったすべての操作は自動的に ApplicationInsights によって追跡されます。 多くのケースには、このインストルメンテーションで対応することができます。 コンシューマー側のトレースとプロデューサー側のトレースを相互に関連付けるには、関連付け用の HTTP プロトコルでの実行方法に似た関連付けコンテキストを渡す必要があります。

この例は、Enqueue 操作を追跡する方法を示しています。 次のようにすることができます。

  • 再試行を関連付ける (存在する場合): すべての再試行には、Enqueue 操作という共通の親が 1 つ存在します。 また、受信要求の子として追跡されます。 キューに対する論理要求が複数存在する場合、どの呼び出しが再試行されたかを見極めることは難しいことがあります。
  • Storage ログを関連付ける (存在する場合に必要に応じて): Storage ログは Application Insights のテレメトリに関連付けられます。

Enqueue 操作は、親の操作の子です。 たとえば、受信 HTTP 要求です。 HTTP の依存関係呼び出しは、Enqueue 操作の子であり、受信要求の孫でもあります。

public async Task Enqueue(CloudQueue queue, string message)
{
    var operation = telemetryClient.StartOperation<DependencyTelemetry>("enqueue " + queue.Name);
    operation.Telemetry.Type = "Azure queue";
    operation.Telemetry.Data = "Enqueue " + queue.Name;

    // MessagePayload represents your custom message and also serializes correlation identifiers into payload.
    // For example, if you choose to pass payload serialized to JSON, it might look like
    // {'RootId' : 'some-id', 'ParentId' : '|some-id.1.2.3.', 'message' : 'your message to process'}
    var jsonPayload = JsonConvert.SerializeObject(new MessagePayload
    {
        RootId = operation.Telemetry.Context.Operation.Id,
        ParentId = operation.Telemetry.Id,
        Payload = message
    });
    
    CloudQueueMessage queueMessage = new CloudQueueMessage(jsonPayload);

    // Add operation.Telemetry.Id to the OperationContext to correlate Storage logs and Application Insights telemetry.
    OperationContext context = new OperationContext { ClientRequestID = operation.Telemetry.Id};

    try
    {
        await queue.AddMessageAsync(queueMessage, null, null, new QueueRequestOptions(), context);
    }
    catch (StorageException e)
    {
        operation.Telemetry.Properties.Add("AzureServiceRequestID", e.RequestInformation.ServiceRequestID);
        operation.Telemetry.Success = false;
        operation.Telemetry.ResultCode = e.RequestInformation.HttpStatusCode.ToString();
        telemetryClient.TrackException(e);
    }
    finally
    {
        // Update status code and success as appropriate.
        telemetryClient.StopOperation(operation);
    }
}  

アプリケーションから報告されるテレメトリの量を減らすため、またはその他の理由で Enqueue 操作を追跡しない場合は、Activity API を直接使用します。

  • Application Insights 操作を開始する代わりに、新しい Activity を作成 (および開始) します。 操作名以外のプロパティを割り当てる必要 はありません
  • yourActivity.Id ではなく operation.Telemetry.Id をメッセージ ペイロードに対してシリアル化します。 Activity.Current.Id を使用することもできます。

他のキュー操作も、同じようにインストルメント化できます。 Peek 操作をインストルメント化する場合は、デキューと同様の方法を使用する必要があります。 キューの管理操作をインストルメント化する必要はありません。 HTTP などの操作は Application Insights によって追跡されます。ほとんどの場合はそれで十分です。

メッセージの削除をインストルメント化するときは、必ず操作 (関連付け) ID を設定してください。 別の方法として、Activity API を使用することもできます。 その場合は、テレメトリ項目に対する操作 ID を自分で設定する必要はありません。それは Application Insights SDK によって自動的に行われます。

  • キューから項目を取得した後、新しい Activity を作成します。
  • Activity.SetParentId(message.ParentId) を使用して、コンシューマーとプロデューサーのログを相互に関連付けます。
  • Activity を開始します。
  • Start/StopOperation ヘルパーを使用して、Dequeue、Process、Delete の各操作を追跡します。 追跡は、同じ非同期制御フロー (実行コンテキスト) から行ってください。 そうすることで、相互の関連付けが適切に行われます。
  • Activity を停止します。
  • Start/StopOperation を使用するか、Track テレメトリを手動で呼び出します。
依存関係の種類

Application Insights では、依存関係の種類を使用して UI エクスペリエンスがカスタマイズされます。 キューの場合、DependencyTelemetryを向上させる次の種類の が認識されます。

  • Azure Storage キューの Azure queue
  • Azure Event Hubs のAzure Event Hubs
  • Azure Service Bus の Azure Service Bus
バッチ処理

一部のキューでは、1 つの要求で複数のメッセージをデキューできます。 このようなメッセージの処理には依存関係はなく、異なる論理操作に属していると推測されます。 Dequeue 操作を処理対象の特定のメッセージに関連付けることはできません。

各メッセージは、独自の非同期制御フローの中で処理する必要があります。 詳細については、「出力方向の依存関係の追跡」セクションを参照してください。

長時間実行されるバックグラウンド タスク

アプリケーションの中には、ユーザーの要求によって発生する、長時間実行される操作を開始するものがあります。 トレース/インストルメンテーションの観点から見ると、これは要求や依存関係のインストルメンテーションと変わりません。

async Task BackgroundTask()
{
    var operation = telemetryClient.StartOperation<DependencyTelemetry>(taskName);
    operation.Telemetry.Type = "Background";
    try
    {
        int progress = 0;
        while (progress < 100)
        {
            // Process the task.
            telemetryClient.TrackTrace($"done {progress++}%");
        }
        // Update status code and success as appropriate.
    }
    catch (Exception e)
    {
        telemetryClient.TrackException(e);
        // Update status code and success as appropriate.
        throw;
    }
    finally
    {
        telemetryClient.StopOperation(operation);
    }
}

この例では、telemetryClient.StartOperationDependencyTelemetry を作成し、関連付けのコンテキストを設定しています。 操作のスケジュールが設定された受信要求によって作成された親操作があるとします。 BackgroundTask が受信要求と同じ非同期制御フローで開始されていれば、受信要求はその親操作と関連付けられます。 BackgroundTask と、入れ子になっているすべてのテレメトリ項目は、(要求の終了後も) それを発生させた要求と自動的に関連付けられます。

いずれの操作 (Activity) も関連付けられていないバックグラウンド スレッドからタスクが開始された場合、BackgroundTask には親が存在しません。 ただし、入れ子になった操作が存在する可能性があります。 そのタスクから報告されるすべてのテレメトリ項目は、DependencyTelemetry で作成された BackgroundTask に関連付けられます。

出力方向の依存関係の追跡

Application Insights がサポートしていない独自の依存関係や操作を追跡することができます。

このようなカスタム追跡の例として、Service Bus キューまたは Azure Storage キューの Enqueue メソッドを挙げることができます。

カスタム依存関係の追跡に使用される一般的な手法は次のとおりです。

  • 関連付けに必要な TelemetryClient.StartOperation プロパティと、start、time stamp、duration などのその他のプロパティを設定するDependencyTelemetry (拡張機能) メソッドを呼び出します。
  • DependencyTelemetry のその他のカスタム プロパティ (名前やその他の必要なプロパティ) を設定します。
  • 依存関係呼び出しを行い、応答が返るまで待機します。
  • 操作が完了したら、StopOperation を使用して操作を停止します。
  • 例外を処理します。
public async Task RunMyTaskAsync()
{
    using (var operation = telemetryClient.StartOperation<DependencyTelemetry>("task 1"))
    {
        try 
        {
            var myTask = await StartMyTaskAsync();
            // Update status code and success as appropriate.
        }
        catch(...) 
        {
            // Update status code and success as appropriate.
        }
    }
}

操作を破棄すると操作が停止されるため、StopOperation を呼び出す代わりに実行することもできます。

Warnung

場合によっては、未処理の例外によって呼び出しが妨げられるfinally可能性があるため、操作が追跡されないことがあります。

並列操作の処理と追跡

StopOperation の呼び出しは、開始された操作を停止するだけです。 現在実行中の操作が停止する操作と一致しない場合、StopOperation は何も行いません。 この状況は、同じ実行コンテキストで複数の操作を並行して開始した場合に起こることがあります。

var firstOperation = telemetryClient.StartOperation<DependencyTelemetry>("task 1");
var firstTask = RunMyTaskAsync();

var secondOperation = telemetryClient.StartOperation<DependencyTelemetry>("task 2");
var secondTask = RunMyTaskAsync();

await firstTask;

// FAILURE!!! This will do nothing and will not report telemetry for the first operation
// as currently secondOperation is active.
telemetryClient.StopOperation(firstOperation); 

await secondTask;

並行して実行されている操作を分離するには、常に同じ StartOperation メソッドで を呼び出して操作を処理する必要があります。 操作が同期の場合 (つまり非同期ではない場合) は、プロセスをラップし、Task.Run を使用して追跡します。

public void RunMyTask(string name)
{
    using (var operation = telemetryClient.StartOperation<DependencyTelemetry>(name))
    {
        Process();
        // Update status code and success as appropriate.
    }
}

public async Task RunAllTasks()
{
    var task1 = Task.Run(() => RunMyTask("task 1"));
    var task2 = Task.Run(() => RunMyTask("task 2"));
    
    await Task.WhenAll(task1, task2);
}

ApplicationInsights 操作と System.Diagnostics.Activity

System.Diagnostics.Activity は、分散トレース コンテキストを表し、プロセスの内部および外部でコンテキストを作成および伝達し、テレメトリ項目を関連付けるために、フレームワークおよびライブラリで使用されます。 Activity は、フレームワーク/ライブラリ間の通知メカニズムとして System.Diagnostics.DiagnosticSource と連携し、受信や送信要求、例外などの重要なイベントについて通知します。

アクティビティは Application Insights の最上位の機能です。 依存関係と要求の自動収集は、DiagnosticSource イベントと共にそれらに大きく依存しています。 アプリケーションで Activity を作成する場合、Application Insights テレメトリが作成される結果にはなりません。 Application Insights では、 DiagnosticSource イベントを受信し、イベント名とペイロードを把握して、 Activity をテレメトリに変換する必要があります。

Application Insights 操作 (要求または依存関係) には、それぞれ Activity が含まれます。 StartOperation が呼び出されると、その下に Activity が作成されます。 StartOperation は、要求または依存関係テレメトリを追跡し、すべてが関連付けられていることを確認する推奨の方法です。

Application Insights のカウンター

Application Insights では、パフォーマンス カウンターとイベント カウンターがサポートされます。 このガイドでは、.NET アプリケーションでの目的、構成、使用方法など、両方の概要について説明します。

概要

  • パフォーマンス カウンター は Windows オペレーティング システムに組み込まれており、CPU 使用率、メモリ使用量、ディスク アクティビティなどの定義済みのメトリックが提供されます。 これらのカウンターは、最小限のセットアップで標準のパフォーマンス メトリックを監視するのに最適です。 Windows ベースのアプリケーションでのリソース使用率の追跡やシステム レベルのボトルネックのトラブルシューティングに役立ちますが、カスタム アプリケーション固有のメトリックはサポートされていません。

  • イベント カウンター は、Windows、Linux、macOS など、複数のプラットフォームで動作します。 これにより、開発者は、軽量でカスタマイズ可能なアプリケーション固有のメトリックを定義および監視でき、パフォーマンス カウンターよりも柔軟性が高くなります。 イベント カウンターは、システム メトリックが不十分な場合や、クロスプラットフォーム アプリケーションで詳細なテレメトリが必要な場合に便利です。 明示的な実装と構成が必要であるため、セットアップの労力が増えます。

性能カウンター

Windows には、プロセッサ、メモリ、ディスクの使用率の統計を収集するために使用されるものなど、さまざまなパフォーマンス カウンターが用意されています。 ユーザーが独自のパフォーマンス カウンターを定義することもできます。

アプリケーションは、オンプレミスのホストまたは管理アクセス権を持つ仮想マシン上のインターネット インフォメーション サーバー (IIS) で実行されている場合、パフォーマンス カウンターの収集をサポートします。 Azure Web Apps として実行されているアプリケーションはパフォーマンス カウンターに直接アクセスできませんが、Application Insights は使用可能なカウンターのサブセットを収集します。

ヒント

他のメトリックと同様に、アラートを設定し、カウンターが指定した制限を超える場合に警告することができます。 アラートを設定するには、[アラート] ウィンドウを開き、[アラートの追加] を選択します。

[前提条件]

パフォーマンス モニター ユーザー グループに追加して、パフォーマンス カウンターを監視するアクセス許可をアプリ プール サービス アカウントに付与します。

net localgroup "Performance Monitor Users" /add "IIS APPPOOL\NameOfYourPool"

カウンターを表示する

[メトリック] ウィンドウには、既定のパフォーマンス カウンターのセットが表示されます。

ASP.NET Web アプリケーションの既定のカウンター:

  • % プロセス\プロセッサ時間
  • % プロセス\プロセッサ時間正規化
  • Memory\使用可能バイト数
  • ASP.NET リクエスト/秒
  • スローされる .NET 共通言語ランタイム (CLR) 例外の数/秒
  • ASP.NET ApplicationsRequest の実行時間
  • プロセス\プライベート・バイト
  • プロセス\IOデータ バイト/秒
  • ASP.NETアプリケーション\アプリケーションキュー内の要求
  • Processor(_Total)\% プロセッサ時間

カウンターを追加する

目的のパフォーマンス カウンターがメトリックの一覧に含まれていない場合は、追加することができます。

オプション 1: ApplicationInsights.config での構成

  1. サーバーで使えるカウンターを確認するには、ローカル サーバーで次の PowerShell コマンドを実行します。

    Get-Counter -ListSet *
    

    詳細については、Get-Counterを参照してください。

  2. ApplicationInsights.configを開きます。

    開発の間にアプリに Application Insights を追加した場合は、以下のようにします。

    1. プロジェクトで ApplicationInsights.config を編集します。
    2. サーバーに再デプロイします。
  3. パフォーマンス コレクター ディレクティブを編集します。

    
        <Add Type="Microsoft.ApplicationInsights.Extensibility.PerfCounterCollector.PerformanceCollectorModule, Microsoft.AI.PerfCounterCollector">
          <Counters>
            <Add PerformanceCounter="\Objects\Processes"/>
            <Add PerformanceCounter="\Sales(photo)\# Items Sold" ReportAs="Photo sales"/>
          </Counters>
        </Add>
    

標準カウンターと、自分で実装したカウンターの両方をキャプチャします。 \Objects\Processes は、すべての Windows システムで使える標準カウンターの例です。 \Sales(photo)\# Items Sold は、Web サービスに実装されているカスタム カウンターの例です。

形式は \Category(instance)\Counter です。インスタンスが存在しないカテゴリの場合は、単に \Category\Counter です。

ReportAs と一致しないカウンター名には [a-zA-Z()/-_ \.]+ パラメーターが必要です。

インスタンスを指定すると、報告されたメトリックのディメンション CounterInstanceName になります。

オプション 2: コードでの構成

次のセクションを参照してください。

ASP.NET Web アプリケーションまたは .NET/.NET Core Console アプリケーションについてコードでパフォーマンス カウンターを収集する

システム パフォーマンス カウンターを収集し、それらを Application Insights に送信する場合は、次のスニペットを使用できます。

    var perfCollectorModule = new PerformanceCollectorModule();
    perfCollectorModule.Counters.Add(new PerformanceCounterCollectionRequest(
      @"\Process([replace-with-application-process-name])\Page Faults/sec", "PageFaultsPerfSec"));
    perfCollectorModule.Initialize(TelemetryConfiguration.Active);

作成したカスタム メトリックの場合も同様です。

    var perfCollectorModule = new PerformanceCollectorModule();
    perfCollectorModule.Counters.Add(new PerformanceCounterCollectionRequest(
      @"\Sales(photo)\# Items Sold", "Photo sales"));
    perfCollectorModule.Initialize(TelemetryConfiguration.Active);

Azure Web Apps と Azure App Service 上の Windows コンテナーで実行されているアプリケーションのパフォーマンス カウンター

Azure Web Apps にデプロイされた ASP.NET アプリケーションと ASP.NET Core アプリケーションは、特別なサンド ボックス環境で実行されます。 Azure App Service にデプロイされたアプリケーションは、Windows コンテナーを利用するか、サンドボックス環境でホストすることができます。 アプリケーションが Windows コンテナーにデプロイされている場合は、すべての標準パフォーマンス カウンターをコンテナー イメージで使用できます。

サンドボックス環境では、システム パフォーマンス カウンターへの直接アクセスはできません。 ただし、「環境変数として公開されるパフォーマンス カウンター」に記載されているように、限定されたカウンターのサブセットが、環境変数として公開されています。 この環境ではカウンターのサブセットのみが使用可能です。 完全な一覧については、「環境変数として公開されるパフォーマンス カウンター」を参照してください。

Application Insights SDK for ASP.NET および ASP.NET Core は、コードが Web アプリまたは Windows 以外のコンテナーにデプロイされているかどうかを検出します。 この検出により、サンドボックス環境でパフォーマンス カウンターを収集するか、Windows コンテナーまたは仮想マシンでホストされている場合に標準の収集メカニズムを利用するかが決まります。

パフォーマンス カウンターの Log Analytics クエリ

Log Analytics でパフォーマンス カウンター レポートを検索して表示できます。

performanceCounters スキーマは、各パフォーマンス カウンターの categorycounter 名、および instance 名を表示します。 各アプリケーションのテレメトリでは、そのアプリケーションのカウンターのみが確認できます。 たとえば、使用できるカウンターを表示するには次のようにします。

performanceCounters | summarize count(), avg(value) by category, instance, counter

ここで、Instance は役割またはサーバー マシンのインスタンスではなくパフォーマンス カウンターのインスタンスを示します。 パフォーマンス カウンター インスタンス名は通常、プロセスまたはアプリケーションの名前によって、プロセッサ時間などのカウンターをセグメントに分割します。

最近の利用可能なメモリのグラフを取得するには、次のようにします。

performanceCounters | where counter == "Available Bytes" | summarize avg(value), min(value) by bin(timestamp, 1h) | render timechart

他のテレメトリと同様に、performanceCounters にも、アプリを実行しているホスト サーバー インスタンスの ID を示す列 cloud_RoleInstance があります。 たとえば、異なるコンピューター上でのアプリのパフォーマンスを比較するには、次のようにします。

performanceCounters | where counter == "% Processor Time" and instance == "SendMetrics" | summarize avg(value) by cloud_RoleInstance, bin(timestamp, 1d)

パフォーマンス カウンターに関する FAQ

よく寄せられる質問 (FAQ) を確認するには、「パフォーマンス カウンターに関する FAQ」を参照してください。

イベント カウンター

EventCounter は、カウンターまたは統計情報を発行および使用するための .NET/.NET Core メカニズムです。 EventCounter は、Windows、Linux、および macOS のすべての OS プラットフォームでサポートされています。 これは、Windows システムでのみサポートされている PerformanceCounters に相当するクロスプラットフォームと考えることができます。

ユーザーは必要に応じてカスタムのイベント カウンターを発行できますが、.NET によってこれらのカウンターのセットが既定で発行されます。 このドキュメントでは、Azure Application Insights での (システム定義またはユーザー定義の) イベント カウンターの収集および表示に必要な手順について説明します。

ヒント

他のメトリックと同様に、アラートを設定し、カウンターが指定した制限を超える場合に警告することができます。 アラートを設定するには、[アラート] ウィンドウを開き、[アラートの追加] を選択します。

Application Insights を使用した EventCounter の収集

Application Insights では、その EventCounters (新しくリリースされた NuGet パッケージである EventCounterCollectionModule の一部) を使用した の収集をサポートしています。 EventCounterCollectionModule は、AspNetCore または WorkerService のいずれかを使用すると、自動的に有効になります。 EventCounterCollectionModule は、構成できない収集頻度が 60 秒のカウンターを収集します。 EventCounter を収集するために特別なアクセス許可は必要ありません。 ASP.NET Core アプリケーションの場合は、Microsoft.ApplicationInsights.AspNetCore パッケージも追加する必要があります。

dotnet add package Microsoft.ApplicationInsights.EventCounterCollector
dotnet add package Microsoft.ApplicationInsights.AspNetCore

収集される既定のカウンター

AspNetCore SDK または WorkerService SDK の 2.15.0 バージョン以降では、カウンターの収集は既定で行われません。 モジュール自体が有効になっているため、ユーザーは必要なカウンターを追加して収集できます。

.NET Runtime で発行されている既知のカウンターの一覧を取得するには、利用できるカウンターのドキュメントを参照してください。

収集されるカウンターのカスタマイズ

次の例は、カウンターを追加または削除する方法を示しています。 このカスタマイズは、AddApplicationInsightsTelemetry() または AddApplicationInsightsWorkerService() を使用して Application Insights テレメトリ収集を有効にした後、アプリケーション サービス構成の一部として行われます。 ASP.NET Core アプリケーションのコード例を次に示します。 その他の種類のアプリケーションについては、 テレメトリ モジュールの構成に関するページを参照してください。

using Microsoft.ApplicationInsights.Extensibility.EventCounterCollector;
using Microsoft.Extensions.DependencyInjection;

builder.Services.ConfigureTelemetryModule<EventCounterCollectionModule>(
        (module, o) =>
        {
            // Removes all default counters, if any.
            module.Counters.Clear();

            // Adds a user defined counter "MyCounter" from EventSource named "MyEventSource"
            module.Counters.Add(
                new EventCounterCollectionRequest("MyEventSource", "MyCounter"));

            // Adds the system counter "gen-0-size" from "System.Runtime"
            module.Counters.Add(
                new EventCounterCollectionRequest("System.Runtime", "gen-0-size"));
        }
    );

EventCounter コレクション モジュールの無効化

EventCounterCollectionModule を無効にするには、ApplicationInsightsServiceOptions を使用します。

次の例では、ASP.NET Core SDK を使用します。

using Microsoft.ApplicationInsights.AspNetCore.Extensions;
using Microsoft.Extensions.DependencyInjection;

var applicationInsightsServiceOptions = new ApplicationInsightsServiceOptions();
applicationInsightsServiceOptions.EnableEventCounterCollectionModule = false;
builder.Services.AddApplicationInsightsTelemetry(applicationInsightsServiceOptions);

Worker Service SDK にも同様の方法を使用できますが、次の例に示すように名前空間を変更する必要があります。

using Microsoft.ApplicationInsights.AspNetCore.Extensions;
using Microsoft.Extensions.DependencyInjection;

var applicationInsightsServiceOptions = new ApplicationInsightsServiceOptions();
applicationInsightsServiceOptions.EnableEventCounterCollectionModule = false;
builder.Services.AddApplicationInsightsTelemetry(applicationInsightsServiceOptions);

イベント カウンターの Log Analytics クエリ

また、Log Analytics 内で customMetrics テーブルのイベント カウンター レポートを検索して表示することもできます。

たとえば、次のクエリを実行して、どのカウンターが収集され、クエリに使用できるかを確認します。

customMetrics | summarize avg(value) by name

最近の期間おける特定のカウンター (例: ThreadPool Completed Work Item Count) のグラフを取得するには、次のクエリを実行します。

customMetrics 
| where name contains "System.Runtime|ThreadPool Completed Work Item Count"
| where timestamp >= ago(1h)
| summarize avg(value) by cloud_RoleInstance, bin(timestamp, 1m)
| render timechart

他のテレメトリと同様に、customMetrics にも、アプリを実行しているホスト サーバー インスタンスの ID を示す列 cloud_RoleInstance があります。 前述のクエリは、インスタンスごとのカウンター値を示しており、さまざまなサーバー インスタンスのパフォーマンスを比較するために使用できます。

イベント カウンターに関する FAQ

よく寄せられる質問 (FAQ) を確認するには、「イベント カウンターに関する FAQ」を参照してください。

テレメトリのフィルター処理と強化

このセクションでは...

テレメトリのフィルター処理と前処理

SDK から送信される前に、テレメトリをフィルター処理、変更、または強化するコードを記述できます。 この処理には、HTTP 要求の収集や依存関係の収集など、標準のテレメトリ モジュールから送信されるデータが含まれます。

  • フィルター処理 では、 ITelemetryProcessorを実装することで、SDK から送信される前にテレメトリを変更または破棄できます。 たとえば、ロボットからの要求を除外することで、テレメトリの量を減らすことができます。 サンプリングとは異なり、送信または破棄される内容を完全に制御できますが、集計されたログに基づくメトリックに影響します。 項目を破棄する方法によっては、関連する項目間を移動する機能が失われる場合もあります。

  • ITelemetryInitializerを実装して、アプリから送信されたテレメトリにプロパティを追加または変更します。 たとえば、計算値やバージョン番号を追加して、ポータルでデータをフィルター処理できます。

  • サンプリング により、統計情報に影響を与えずにテレメトリの量が減ります。 関連するデータ ポイントがまとめて保持されるため、問題を診断するときにそれらの間を移動できます。 ポータルでは、サンプリングを補正するために合計カウントが乗算されます。

SDK API は、カスタム イベントとメトリックを送信するために使用されます。

フィルタリング

この手法を使用すると、テレメトリ ストリームに含まれるもの、またはテレメトリ ストリームから除外される内容を直接制御できます。 フィルター処理を使用して、テレメトリ項目が Application Insights に送信されないようにすることができます。 サンプリングでフィルター処理を使用することも、個別に使用することもできます。

テレメトリをフィルター処理するには、テレメトリ プロセッサを記述し、 TelemetryConfigurationに登録します。 すべてのテレメトリはプロセッサを通過します。 ストリームから削除するか、チェーン内の次のプロセッサに渡すかを選択できます。 HTTP 要求コレクターや依存関係コレクターなどの標準モジュールからのテレメトリと、自分で追跡したテレメトリが含まれます。 たとえば、ロボットからの要求や成功した依存関係呼び出しに関するテレメトリを除外できます。

Warnung

プロセッサを使用して SDK から送信されたテレメトリをフィルター処理すると、ポータルに表示される統計情報が偏り、関連項目のフォローが困難になる可能性があります。

代わりに、 サンプリングの使用を検討してください。

ITelemetryProcessor と ITelemetryInitializer

テレメトリ プロセッサとテレメトリ初期化子の違いは何ですか?

  • 実行できる操作には、いくつかの重複があります。 どちらもテレメトリのプロパティを追加または変更するために使用できますが、その目的には初期化子を使用することをお勧めします。
  • テレメトリ初期化子は、テレメトリ プロセッサの前に常に実行されます。
  • テレメトリ初期化子は、複数回呼び出される場合があります。 慣例により、既に設定されているプロパティは設定されません。
  • テレメトリ プロセッサを使用すると、テレメトリ項目を完全に置き換えたり破棄したりすることができます。
  • 登録されているすべてのテレメトリ初期化子は、すべてのテレメトリ項目に対して呼び出されます。 テレメトリ プロセッサの場合、SDK は最初のテレメトリ プロセッサの呼び出しを保証します。 残りのプロセッサが呼び出されるかどうかは、前述のテレメトリ プロセッサによって決定されます。
  • テレメトリ初期化子を使用して、より多くのプロパティでテレメトリを強化するか、既存のプロパティをオーバーライドします。 テレメトリ プロセッサを使用してテレメトリを除外します。

プロパティの追加/変更

テレメトリ初期化子を使用して、テレメトリを追加情報で強化したり、標準のテレメトリ モジュールによって設定されたテレメトリ プロパティをオーバーライドしたりします。

たとえば、Web パッケージの Application Insights は、HTTP 要求に関するテレメトリを収集します。 既定では、応答コード > =400 で要求に失敗としてフラグを設定します。 代わりに 400 を成功として扱う場合は、成功プロパティを設定するテレメトリ初期化子を指定できます。

テレメトリ初期化子を指定すると、Track*() メソッドのいずれかが呼び出されるたびに呼び出されます。 この初期化子には、標準のテレメトリ モジュールによって呼び出される Track() メソッドが含まれています。 慣例により、これらのモジュールは初期化子によって既に設定されたプロパティを設定しません。 テレメトリ初期化子は、テレメトリ プロセッサを呼び出す前に呼び出されるため、初期化子によって実行されるエンリッチメントはプロセッサに表示されます。

テレメトリ初期化子

テレメトリを追加情報で強化したり、標準のテレメトリ モジュールによって設定されたテレメトリ プロパティをオーバーライドしたりするには、テレメトリ初期化子を使用します。

テレメトリの初期化子は、テレメトリのあらゆるアイテムと共に送信されるコンテキスト プロパティを設定します。 独自の初期化子を記述して、コンテキスト プロパティを設定できます。

標準の初期化子は Web または WindowsServer NuGet パッケージによりすべて設定されます。

初期化子 Description
AccountIdTelemetryInitializer AccountId プロパティを設定します。
AuthenticatedUserIdTelemetryInitializer JavaScript SDK によって設定された AuthenticatedUserId プロパティを設定します。
AzureRoleEnvironmentTelemetryInitializer すべてのテレメトリ項目の RoleName コンテキストの RoleInstance プロパティと Device プロパティを Azure ランタイム環境から抽出された情報で更新します。
BuildInfoConfigComponentVersionTelemetryInitializer MS Build によって生成された Version ファイルから抽出された値を使用して、すべてのテレメトリ項目の Component コンテキストの BuildInfo.config プロパティを更新します。
ClientIpHeaderTelemetryInitializer 要求の Ip HTTP ヘッダーに基づいて、すべてのテレメトリ項目の Location コンテキストの X-Forwarded-For プロパティを更新します。
DeviceTelemetryInitializer すべてのテレメトリ項目の Device コンテキストの次のプロパティを更新します:

TypePCに設定されています。
Id は、Web アプリケーションが実行されているコンピューターのドメイン名に設定されます。
OemName は、WMI を使用して Win32_ComputerSystem.Manufacturer フィールドから抽出された値に設定されます。
Model は、WMI を使用して Win32_ComputerSystem.Model フィールドから抽出された値に設定されます。
NetworkType は、NetworkInterface プロパティから抽出された値に設定されます。
Language は、CurrentCulture プロパティの名前に設定されます。
DomainNameRoleInstanceTelemetryInitializer すべてのテレメトリ項目の RoleInstance コンテキストの Device プロパティを Web アプリケーションが実行されているコンピューターのドメイン名で更新します。
OperationNameTelemetryInitializer HTTP メソッド、ASP.NET MVC コントローラー名、要求を起動するアクションに基づいて、NameRequestTelemetry プロパティおよび Name コンテキストの Operation プロパティを更新します。
OperationIdTelemetryInitializer または OperationCorrelationTelemetryInitializer 自動的に生成された Operation.Id を使用して要求の処理中に追跡されたすべてのテレメトリ項目の RequestTelemetry.Id コンテキスト プロパティを更新します。
SessionTelemetryInitializer ユーザーのブラウザーで実行されている Id JavaScript インストルメンテーション コードによって生成された Session Cookie から抽出された値を使用して、すべてのテレメトリ項目の ai_session コンテキストの ApplicationInsights プロパティを更新します。
SyntheticTelemetryInitializer または SyntheticUserAgentTelemetryInitializer 可用性テストや検索エンジン ボットなど、合成ソースからの要求を処理するときに追跡されるすべてのテレメトリ項目の UserSession、および Operation コンテキスト プロパティを更新します。 既定では、メトリックス エクスプローラーには合成テレメトリは表示されません。

<Filters> は、要求の識別プロパティを設定します。
UserTelemetryInitializer ユーザーのブラウザーで実行されている Application Insights JavaScript インストルメンテーション コードによって生成された Id Cookie から抽出された値を使用して、すべてのテレメトリ項目の AcquisitionDate コンテキストの User プロパティと ai_user プロパティを更新します。
WebTestTelemetryInitializer 可用性テストからの HTTP 要求のユーザー ID、セッション ID、および合成ソース のプロパティを設定します。

<Filters> は、要求の識別プロパティを設定します。

Azure Service Fabric で実行されている .NET アプリケーションの場合、Microsoft.ApplicationInsights.ServiceFabric NuGet パッケージを含めることができます。 このパッケージには、Service Fabric のプロパティをテレメトリ項目に追加する FabricTelemetryInitializer プロパティが含まれています。 詳細については、この NuGet パッケージによって追加されるプロパティに関する GitHub のページをご覧ください。

ITelemetryInitializer の追加

このブログ では、依存関係に通常の ping を自動的に送信して依存関係の問題を診断するプロジェクトについて説明します。

  1. 初期化子を定義する

    using System;
    using Microsoft.ApplicationInsights.Channel;
    using Microsoft.ApplicationInsights.DataContracts;
    using Microsoft.ApplicationInsights.Extensibility;
    
    namespace MvcWebRole.Telemetry
    {
      /*
       * Custom TelemetryInitializer that overrides the default SDK
       * behavior of treating response codes >= 400 as failed requests
       *
       */
        public class MyTelemetryInitializer : ITelemetryInitializer
        {
            public void Initialize(ITelemetry telemetry)
            {
                var requestTelemetry = telemetry as RequestTelemetry;
                // Is this a TrackRequest() ?
                if (requestTelemetry == null) return;
                int code;
                bool parsed = Int32.TryParse(requestTelemetry.ResponseCode, out code);
                if (!parsed) return;
                if (code >= 400 && code < 500)
                {
                    // If we set the Success property, the SDK won't change it:
                    requestTelemetry.Success = true;
    
                    // Allow us to filter these requests in the portal:
                    requestTelemetry.Properties["Overridden400s"] = "true";
                }
                // else leave the SDK to set the Success property
            }
        }
    }
    
  2. 初期化子を読み込む

オプション 1: コードでの構成

protected void Application_Start()
{
    // ...
    TelemetryConfiguration.Active.TelemetryInitializers.Add(new MyTelemetryInitializer());
}

オプション 2: ApplicationInsights.config での構成

<ApplicationInsights>
    <TelemetryInitializers>
    <!-- Fully qualified type name, assembly name: -->
    <Add Type="MvcWebRole.Telemetry.MyTelemetryInitializer, MvcWebRole"/>
    ...
    </TelemetryInitializers>
</ApplicationInsights>

このサンプルの詳細を参照してください。

applicationinsights.config ファイルが出力ディレクトリにあり、最近の変更が含まれていることを確認します。

ITelemetryInitializers の例

カスタム プロパティを追加する

次のサンプル初期化子は、追跡されるすべてのテレメトリにカスタム プロパティを追加します。

public void Initialize(ITelemetry item)
{
    var itemProperties = item as ISupportProperties;
    if(itemProperties != null && !itemProperties.Properties.ContainsKey("customProp"))
    {
        itemProperties.Properties["customProp"] = "customValue";
    }
}
クラウド ロール名とクラウド ロール インスタンスを追加する

手順 1: カスタム TelemetryInitializer を記述する

次のサンプル初期化子は、追跡されるすべてのテレメトリにクラウド ロール名を設定します。

using Microsoft.ApplicationInsights.Channel;
using Microsoft.ApplicationInsights.Extensibility;

namespace CustomInitializer.Telemetry
{
    public class MyTelemetryInitializer : ITelemetryInitializer
    {
        public void Initialize(ITelemetry telemetry)
        {
            if (string.IsNullOrEmpty(telemetry.Context.Cloud.RoleName))
            {
                //set custom role name here
                telemetry.Context.Cloud.RoleName = "Custom RoleName";
                telemetry.Context.Cloud.RoleInstance = "Custom RoleInstance";
            }
        }
    }
}

手順 2: TelemetryConfiguration に初期化子を読み込む

ApplicationInsights.configファイルで次の 手順を実行 します。

    <ApplicationInsights>
      <TelemetryInitializers>
        <!-- Fully qualified type name, assembly name: -->
        <Add Type="CustomInitializer.Telemetry.MyTelemetryInitializer, CustomInitializer"/>
        ...
      </TelemetryInitializers>
    </ApplicationInsights>

Web アプリ ASP.NET 別の方法は、コードで初期化子をインスタンス化することです。 次の例は、 Global.aspx.cs ファイル内のコードを示しています。

 using Microsoft.ApplicationInsights.Extensibility;
 using CustomInitializer.Telemetry;

    protected void Application_Start()
    {
        // ...
        TelemetryConfiguration.Active.TelemetryInitializers.Add(new MyTelemetryInitializer());
    }
位置情報マッピングに使用されるクライアント IP アドレスを制御する

次のサンプル初期化子は、テレメトリ インジェスト中に、クライアント ソケット IP アドレスではなく、位置情報マッピングに使用されるクライアント IP を設定します。

public void Initialize(ITelemetry telemetry)
{
    var request = telemetry as RequestTelemetry;
    if (request == null) return true;
    request.Context.Location.Ip = "{client ip address}"; // Could utilize System.Web.HttpContext.Current.Request.UserHostAddress;   
    return true;
}

テレメトリ プロセッサ

テレメトリ プロセッサは、SDK からポータルに送信される前に、各テレメトリ項目をフィルター処理して変更できます。

  1. ITelemetryProcessor を実装します。

    テレメトリ プロセッサは、処理のチェーンを構築します。 テレメトリ プロセッサをインスタンス化すると、チェーン内の次のプロセッサへの参照が与えられます。 テレメトリ データ ポイントがプロセス メソッドに渡されると、その処理が行われ、チェーン内の次のテレメトリ プロセッサが呼び出されます (または呼び出されません)。

    using Microsoft.ApplicationInsights.Channel;
    using Microsoft.ApplicationInsights.Extensibility;
    using Microsoft.ApplicationInsights.DataContracts;
    
    public class SuccessfulDependencyFilter : ITelemetryProcessor
    {
        private ITelemetryProcessor Next { get; set; }
    
        // next will point to the next TelemetryProcessor in the chain.
        public SuccessfulDependencyFilter(ITelemetryProcessor next)
        {
            this.Next = next;
        }
    
        public void Process(ITelemetry item)
        {
            // To filter out an item, return without calling the next processor.
            if (!OKtoSend(item)) { return; }
    
            this.Next.Process(item);
        }
    
        // Example: replace with your own criteria.
        private bool OKtoSend (ITelemetry item)
        {
            var dependency = item as DependencyTelemetry;
            if (dependency == null) return true;
    
            return dependency.Success != true;
        }
    }
    
  2. プロセッサを追加します。

    次のスニペットを ApplicationInsights.configに挿入します。

    <TelemetryProcessors>
      <Add Type="WebApplication9.SuccessfulDependencyFilter, WebApplication9">
        <!-- Set public property -->
        <MyParamFromConfigFile>2-beta</MyParamFromConfigFile>
      </Add>
    </TelemetryProcessors>
    

    クラスにパブリックの名前付きプロパティを指定することで、.config ファイルから文字列値を渡すことができます。

    Warnung

    .config ファイル内の型名とプロパティ名は、コード内のクラス名とプロパティ名と一致するように注意してください。 .config ファイルが存在しない型またはプロパティを参照している場合、SDK はテレメトリの送信に自動的に失敗する可能性があります。

    または、コードでフィルターを初期化することもできます。 適切な初期化クラス (たとえば、 Global.asax.cs の AppStart) で、プロセッサをチェーンに挿入します。

    次のコード サンプルは廃止されていますが、後世のためにここで入手できます。 OpenTelemetry の使用を開始するか、OpenTelemetry に移行することを検討してください。

    var builder = TelemetryConfiguration.Active.DefaultTelemetrySink.TelemetryProcessorChainBuilder;
    builder.Use((next) => new SuccessfulDependencyFilter(next));
    
    // If you have more processors:
    builder.Use((next) => new AnotherProcessor(next));
    
    builder.Build();
    

    この時点以降に作成されたテレメトリ クライアントは、プロセッサを使用します。

    アダプティブ サンプリング テレメトリ プロセッサー (2.0.0-beta3 以降)

    この機能は既定で有効化されています。 アプリが多数のテレメトリを送信する場合、このプロセッサはその一部を削除します。

    
        <TelemetryProcessors>
          <Add Type="Microsoft.ApplicationInsights.WindowsServer.TelemetryChannel.AdaptiveSamplingTelemetryProcessor, Microsoft.AI.ServerTelemetryChannel">
            <MaxTelemetryItemsPerSecond>5</MaxTelemetryItemsPerSecond>
          </Add>
        </TelemetryProcessors>
    
    

    パラメーターは、アルゴリズムが実現しようとするターゲットを指定します。 SDK の各インスタンスは独立して動作します。 そのため、サーバーが複数のマシンのクラスターである場合は、それに応じてテレメトリの実際のボリュームが乗算されます。

    詳細については、サンプリングに関する記事を参照してください。

    固定レート サンプリング テレメトリ プロセッサー (2.0.0-beta1 以降)

    標準のサンプリング テレメトリ プロセッサ (2.0.1 から) もあります。

        <TelemetryProcessors>
         <Add Type="Microsoft.ApplicationInsights.WindowsServer.TelemetryChannel.SamplingTelemetryProcessor, Microsoft.AI.ServerTelemetryChannel">
    
         <!-- Set a percentage close to 100/N where N is an integer. -->
         <!-- E.g. 50 (=100/2), 33.33 (=100/3), 25 (=100/4), 20, 1 (=100/100), 0.1 (=100/1000) -->
         <SamplingPercentage>10</SamplingPercentage>
         </Add>
       </TelemetryProcessors>
    

フィルターの例

人工的な要求

ボットと Web テストを除外します。 メトリックス エクスプローラーでは合成ソースをフィルター処理するオプションが提供されますが、このオプションでは、SDK 自体でフィルター処理することでトラフィックとインジェスト のサイズを減らすことができます。

public void Process(ITelemetry item)
{
    if (!string.IsNullOrEmpty(item.Context.Operation.SyntheticSource)) {return;}
    
    // Send everything else:
    this.Next.Process(item);
}
失敗した認証

"401" 応答で要求を除外します。

public void Process(ITelemetry item)
{
    var request = item as RequestTelemetry;

    if (request != null &&
    request.ResponseCode.Equals("401", StringComparison.OrdinalIgnoreCase))
    {
        // To filter out an item, return without calling the next processor.
        return;
    }

    // Send everything else
    this.Next.Process(item);
}
高速リモート依存関係呼び出しを除外する

低速の呼び出しのみを診断する場合は、高速呼び出しを除外します。

このフィルター処理により、ポータルに表示される統計情報が傾斜します。

public void Process(ITelemetry item)
{
    var request = item as DependencyTelemetry;

    if (request != null && request.Duration.TotalMilliseconds < 100)
    {
        return;
    }
    this.Next.Process(item);
}

サンプリング

ASP.NET アプリケーションのサンプリングを構成する方法については、「 Application Insights でのサンプリング」を参照してください。

HTTP を使用してデータを強化する

var requestTelemetry = HttpContext.Current?.Items["Microsoft.ApplicationInsights.RequestTelemetry"] as RequestTelemetry;

if (requestTelemetry != null)
{
    requestTelemetry.Properties["myProp"] = "someData";
}

SDK コンポーネントの管理

このセクションでは...

Application Insights SDK for ASP.NET、ASP.NET Core、Worker Service をカスタマイズして、既定の構成を変更できます。

Application Insights .NET SDK は多くの NuGet パッケージで構成されています。 コア パッケージ は、テレメトリを Application Insights に送信するための API を提供します。 追加パッケージは、アプリケーションとそのコンテキストからテレメトリを自動的に追跡するためのテレメトリ モジュール初期化子を提供します。 構成ファイルを調整することによって、テレメトリ モジュールと初期化子を有効または無効にできます。 その中のいくつかに対し、パラメーターを設定することもできます。

構成ファイルの名前は ApplicationInsights.config または ApplicationInsights.xml です。 名前はアプリケーションの種類によって異なります。 構成ファイルは、SDK のほとんどのバージョンのインストール時に、プロジェクトに自動的に追加されます。

既定では、[追加]>[Application Insights Telemetry] がサポートされている Visual Studio テンプレート プロジェクトからの自動化されたエクスペリエンスを使用すると、ApplicationInsights.config ファイルがプロジェクトのルート フォルダーに作成されます。 コンパイル後、bin フォルダーにコピーされます。 また、IIS サーバー上の Application Insights エージェントによって Web アプリにも追加されます。

Important

Azure Web サイトの拡張機能、または Azure VM と Azure 仮想マシン スケール セットの拡張機能が使用されている場合、構成ファイルは無視されます。

Web ページの SDK を制御するための同等のファイルはありません。

テレメトリ チャネル

テレメトリ チャネルは、Application Insights SDK の不可欠な要素です。 これにより、テレメトリのバッファー処理と Application Insights サービスへの送信が管理されます。 この SDK の .NET バージョンと .NET Core バージョンには、InMemoryChannelServerTelemetryChannel の 2 つのテレメトリ チャネルが組み込まれています。 このセクションでは、各チャネルについて説明し、チャネルの動作をカスタマイズする方法について説明します。

よく寄せられる質問 (FAQ) を確認するには、「テレメトリ チャネルに関する FAQ」を参照してください

テレメトリ チャネルとは

テレメトリ チャネルの役割は、テレメトリ項目をバッファリングして、Application Insights サービスに送信することです。それらはそこでクエリと解析のために保存されます。 テレメトリ チャネルは、Microsoft.ApplicationInsights.ITelemetryChannel インターフェイスを実装している任意のクラスです。

テレメトリ チャネルの Send(ITelemetry item) メソッドは、テレメトリ初期化子とテレメトリ プロセッサがすべて呼び出された後に呼び出されます。 そのため、テレメトリ プロセッサによって削除された項目はチャネルに到達しません。 通常、Send() メソッドが項目をバックエンドにすぐに送信することはありません。 通常は、効率的な伝送のため、メモリ内でバッファリングされてから、バッチ単位で送信されます。

バッファーに格納されたテレメトリをすぐに送信することが重要でない限り、Flush() の呼び出しは避けてください。 アプリケーションのシャットダウン、例外処理、バックグラウンド ジョブやコマンド ライン ツールなどの有効期間の短いプロセスを使用する場合にのみ使用します。 Web アプリケーションまたは実行時間の長いサービスでは、SDK はテレメトリ送信を自動的に処理します。 Flush() を不必要に呼び出すと、パフォーマンスの問題が発生する可能性があります。

このほか Live Metrics Stream にも、テレメトリのライブ ストリーミングに役立つカスタム チャネルがあります。 このチャネルは通常のテレメトリ チャネルからは独立しているので、このドキュメントの内容が該当しません。

組み込みのテレメトリ チャネル

Application Insights の .NET SDK と .NET Core SDK には、2 つのチャネルがあらかじめ組み込まれています。

  • InMemoryChannel: 送信されるまでメモリ内の項目をバッファーする軽量チャネル。 項目はメモリ内でバッファー処理され、30 秒ごとまたは 500 項目がバッファー処理されるごとにフラッシュされます。 このチャネルは、障害の後にテレメトリの送信を再試行しないので、保証される信頼性は最小限です。 また、このチャネルでは項目はディスク上に保持されません。 そのため、アプリケーションのシャットダウン時には、正常かどうかに関係なく、未送信の項目は完全に失われます。 このチャネルには、メモリ内のすべてのテレメトリ項目を同期的に強制フラッシュできる Flush() メソッドが実装されています。 このチャネルは、同期的にフラッシュすることが理想的な実行時間の短いアプリケーションに適しています。

    このチャネルは、これよりも大きな Microsoft.ApplicationInsights NuGet パッケージの一部であり、他に何も構成されていないときに SDK が使用する既定のチャネルです。

  • ServerTelemetryChannel: 再試行ポリシーとローカル ディスクにデータを格納する機能を備える、より高度なチャネル。 このチャネルでは、一時的なエラーが発生すると、テレメトリの送信が再試行されます。 また、このチャネルは、ネットワークの停止時またはテレメトリの量が多いときに、ローカル ディスク ストレージを使ってディスク上に項目を保持します。 このような再試行メカニズムとローカル ディスク ストレージを備えているため、このチャネルは信頼性が高いと考えられます。 すべての運用シナリオにはこれをお勧めします。 このチャネルは、公式ドキュメントに従って構成された ASP.NET および ASP.NET Core アプリケーションの既定値です。 このチャネルは、実行時間の長いプロセスがあるサーバーのシナリオに最適です。 このチャネルによって実装される Flush() メソッドは同期的ではありません。

    このチャネルは、Microsoft.ApplicationInsights.WindowsServer.TelemetryChannel NuGet パッケージとして提供されるものであり、Microsoft.ApplicationInsights.Web または Microsoft.ApplicationInsights.AspNetCore NuGet パッケージを使用している場合には自動的に取得されます。

テレメトリ チャネルの構成

テレメトリ チャネルを構成するには、テレメトリ チャネルをアクティブなテレメトリ構成に設定します。 ASP.NET アプリケーションの構成では、テレメトリ チャネル インスタンスを TelemetryConfiguration.Active に設定するか、ApplicationInsights.config を変更します。 ASP.NET Core アプリケーションの構成では、依存関係挿入コンテナーにチャネルを追加します。

以降のセクションでは、さまざまなアプリケーションの種類でチャネルの StorageFolder 設定を構成する例を示します。 StorageFolder は構成可能な設定の 1 つです。 構成設定の完全な一覧については、この記事の後の方にある「チャネル内の構成設定に関するセクション」を参照してください。

オプション 1: コードでの構成

次のコードでは、カスタムの場所に設定された ServerTelemetryChannel を使って StorageFolder インスタンスを設定しています。 このコードをアプリケーションの先頭、通常は Global.aspx.cs の Application_Start() メソッド内に追加します。

using Microsoft.ApplicationInsights.Extensibility;
using Microsoft.ApplicationInsights.WindowsServer.TelemetryChannel;
protected void Application_Start()
{
    var serverTelemetryChannel = new ServerTelemetryChannel();
serverTelemetryChannel.StorageFolder = @"d:\temp\applicationinsights";
    serverTelemetryChannel.Initialize(TelemetryConfiguration.Active);
    TelemetryConfiguration.Active.TelemetryChannel = serverTelemetryChannel;
}

オプション 2: ApplicationInsights.config での構成

ApplicationInsights.config の以下のセクションは、ServerTelemetryChannel にカスタムの場所が構成された StorageFolder チャネルを示しています。

    <TelemetrySinks>
        <Add Name="default">
            <TelemetryProcessors>
                <!-- Telemetry processors omitted for brevity -->
            </TelemetryProcessors>
            <TelemetryChannel Type="Microsoft.ApplicationInsights.WindowsServer.TelemetryChannel.ServerTelemetryChannel, Microsoft.AI.ServerTelemetryChannel">
                <StorageFolder>d:\temp\applicationinsights</StorageFolder>
            </TelemetryChannel>
        </Add>
    </TelemetrySinks>

コンソール アプリケーションのコードでの構成

コンソール アプリについては、.NET、.NET Core ともコードが同じです。

var serverTelemetryChannel = new ServerTelemetryChannel();
serverTelemetryChannel.StorageFolder = @"d:\temp\applicationinsights";
serverTelemetryChannel.Initialize(TelemetryConfiguration.Active);
TelemetryConfiguration.Active.TelemetryChannel = serverTelemetryChannel;

ServerTelemetryChannel の動作の詳細

ServerTelemetryChannel では、到着した項目がメモリ内バッファーに保存されます。 項目は、シリアル化、圧縮、および 30 秒ごとに 1 回、または 500 個の項目がバッファーに格納されるときに、Transmission インスタンスに格納されます。 1 つの Transmission インスタンスは最大 500 個の項目を保持することができ、Application Insights サービスに対する 1 回の HTTPS 呼び出しにより送信されるテレメトリのバッチを表しています。

既定では、最大 10 個の Transmission インスタンスを並列に送信できます。 これより速いペースでテレメトリが到着する場合、またはネットワークや Application Insights のバックエンドが低速の場合は、Transmission インスタンスがメモリ内に格納されます。 このメモリ内 Transmission バッファーの既定の容量は 5 MB です。 メモリ内容量を超えると、Transmission インスタンスは最大 50 MB の制限までローカル ディスクに格納されます。

このほか、ネットワークの問題がある場合にも、Transmission インスタンスがローカル ディスクに保存されます。 アプリケーションがクラッシュした場合に消えずに残るのは、ローカル ディスクに保存されている項目のみです。 これらは、アプリケーションを再起動した時点で送信されます。 ネットワークの問題が解決しない場合、ServerTelemetryChannel はテレメトリの送信を再試行する前に 10 秒から 1 時間の指数バックオフ ロジックを使用します。

チャネルの構成可能な設定

各チャネルの構成可能な設定の完全な一覧については、次を参照してください。

ここでは、ServerTelemetryChannel も設定のなかでも特によく使用するものを紹介します。

  • MaxTransmissionBufferCapacity: 転送をメモリ内にバッファリングするためにチャネルで使われるメモリの最大量 (バイト単位)。 この容量に達すると、新しい項目はローカル ディスクに直接保存されます。 既定値は 5 MB です。 値を大きくするとディスク使用量が少なくなりますが、アプリケーションがクラッシュするとメモリ内の項目が失われることに注意してください。

  • MaxTransmissionSenderCapacity: Application Insights に同時に送信される Transmission インスタンスの最大数。 既定値は 10 です。 この設定はさらに高い値に構成でき、大量のテレメトリが生成される場合はそうすることをお勧めします。 量が多くなるのは、通常、ロード テストの間や、サンプリングがオフになっている場合です。

  • StorageFolder:必要に応じてディスクに項目を保存するためにチャネルが使用するフォルダー。 Windows では、他のパスが明示的に指定されない限り、%LOCALAPPDATA% または %TEMP% が使用されます。 Windows 以外の環境では、既定では、次の場所が (順番に) 使用されます。%TMPDIR%、/var/tmp/ または /tmp/ です。

どのチャネルを使用すればよいですか?

実行時間の長いアプリケーションが含まれるほとんどの運用シナリオでは、ServerTelemetryChannel をお勧めします。 テレメトリのフラッシュの詳細については、Flush() の使用に関するページを参照してください。

Flush() を使用するタイミング

Flush() メソッドは、バッファーに格納されたテレメトリを直ちに送信します。 ただし、特定のシナリオでのみ使用する必要があります。

次のようなときは Flush() を使います。

  • アプリケーションがシャットダウンされようとしており、終了する前にテレメトリが確実に送信されるようにする必要があります。
  • 例外ハンドラーを使用していて、テレメトリが配信されていることを保証する必要があります。
  • すぐに終了するバックグラウンド ジョブや CLI ツールのような有効期間の短いプロセスを記述しています。

Web サービスなどの実行時間の長いアプリケーションでは、Flush() を使用しないでください。 SDK は、バッファリングと転送を自動的に管理します。 Flush() を不必要に呼び出すとパフォーマンスの問題が発生する可能性があり、特に同期的にフラッシュされない ServerTelemetryChannel を使用する場合は、すべてのデータが送信されるとは限りません。

テレメトリ モジュール

Application Insights では、ユーザーによる手動の追跡を必要とせずに特定のワークロードに関するテレメトリが自動収集されます。

既定では、次の自動収集モジュールが有効になります。 それらを無効にするか構成して、既定の動作を変更できます。

各テレメトリ モジュールは特定の種類のデータを回収し、コア API を利用してデータを送信します。 モジュールはさまざまな NuGet パッケージによりインストールされます。NuGet パッケージはまた、必要な行を .config ファイルに追加します。

Area Description
要求の追跡 受信 Web 要求の要求テレメトリ (応答時間、結果コード) を収集します。

モジュール:Microsoft.ApplicationInsights.Web.RequestTrackingTelemetryModule
NuGet:Microsoft.ApplicationInsights.Web
依存関係の追跡 送信依存関係 (HTTP 呼び出し、SQL 呼び出し) に関するテレメトリを収集します。 IIS で作業するには、Application Insights エージェントをインストールしますTrackDependency API を使用してカスタム依存関係の追跡を記述することもできます。 App ServiceVMや仮想マシン スケール セットの監視を自動インストルメンテーションでサポートします。

モジュール:Microsoft.ApplicationInsights.DependencyCollector.DependencyTrackingTelemetryModule
NuGet:Microsoft.ApplicationInsights.DependencyCollector
パフォーマンス カウンター Windows パフォーマンス カウンター (CPU、メモリ、IIS インストールからのネットワーク負荷) を収集します。 (カスタム カウンターを含む) カウンターを指定します。 詳細については、「システム パフォーマンス カウンターの収集」を参照してください。

モジュール:Microsoft.ApplicationInsights.Extensibility.PerfCounterCollector.PerformanceCollectorModule
NuGet:Microsoft.ApplicationInsights.PerfCounterCollector
イベント カウンター .NET EventCounters を収集します。 Windows パフォーマンス カウンターの代わりに、ASP.NET Core とクロスプラットフォームに推奨されます。

Module:EventCounterCollectionModule (SDK ≥ 2.8.0)
ライブ メトリック (QuickPulse) [ライブ メトリック] ウィンドウのテレメトリを収集します。

モジュール:QuickPulseTelemetryModule
ハートビート (App Service) App Service 環境のハートビートとカスタム メトリックを送信します。

モジュール:AppServicesHeartbeatTelemetryModule
ハートビート (VM と仮想マシン スケール セット) Azure VM 環境のハートビートとカスタム メトリックを送信します。

モジュール:AzureInstanceMetadataTelemetryModule
診断テレメトリ Application Insights インストルメンテーション コードのエラー (カウンターの不足、ITelemetryInitializer 例外など) を報告します。 [診断検索] にトレース テレメトリが表示されます。

モジュール:Microsoft.ApplicationInsights.Extensibility.Implementation.Tracing.DiagnosticsTelemetryModule
NuGet:Microsoft.ApplicationInsights

注: このパッケージのみをインストールした場合、ApplicationInsights.config ファイルは自動的に作成されません。
開発者モード (デバッガーがアタッチされている) デバッガーがアタッチされたときに、TelemetryChannel がアイテムを直ちに送信するように強制します。 待機時間は短縮されますが、CPU/ネットワークのオーバーヘッドは増加します。

モジュール:Microsoft.ApplicationInsights.WindowsServer.DeveloperModeWithDebuggerAttachedTelemetryModule
NuGet:Application Insights Windows Server
例外追跡 (Web) Web アプリのハンドルされない例外を追跡します。 失敗と例外に関する記事をご覧ください。

モジュール:Microsoft.ApplicationInsights.Web.ExceptionTrackingTelemetryModule
NuGet:Microsoft.ApplicationInsights.Web
例外追跡 (非監視/非ハンドル) worker ロール、Windows サービス、コンソール アプリの、監視されていないタスクの例外とハンドルされない例外を追跡します。

モジュール:
 • Microsoft.ApplicationInsights.WindowsServer.UnobservedExceptionTelemetryModule
 • Microsoft.ApplicationInsights.WindowsServer.UnhandledExceptionTelemetryModule
NuGet:Microsoft.ApplicationInsights.WindowsServer
EventSource の追跡 構成された EventSource イベントをトレースとして Application Insights に送信します。

モジュール:Microsoft.ApplicationInsights.EventSourceListener.EventSourceTelemetryModule
NuGet:Microsoft.ApplicationInsights.EventSourceListener
ETW コレクター 構成済みの ETW プロバイダー イベントをトレースとして Application Insights に送信します。

モジュール:Microsoft.ApplicationInsights.EtwCollector.EtwCollectorTelemetryModule
NuGet:Microsoft.ApplicationInsights.EtwCollector
コア API (モジュール以外) 他のテレメトリ コンポーネントに使用され、カスタム テレメトリに使用されるコア API

モジュール:Microsoft.ApplicationInsights package
NuGet:Microsoft.ApplicationInsights
注: このパッケージのみをインストールした場合、ApplicationInsights.config ファイルは自動的に作成されません。

テレメトリ モジュールを構成する

TelemetryModules セクションを使用して、モジュールを構成、追加、または削除します。 次の例を示します:

  • DependencyTrackingTelemetryModule を構成します (W3C ヘッダーインジェクションを有効にします)。
  • EventCounterCollectionModule を構成します (既定値をクリアし、1 つのカウンターを追加します)。
  • PerformanceCollectorModule を削除して、パフォーマンス カウンターコレクションを無効にします。
<ApplicationInsights>
  <TelemetryModules>

    <!-- Dependency tracking -->
    <Add Type="Microsoft.ApplicationInsights.DependencyCollector.DependencyTrackingTelemetryModule, Microsoft.AI.DependencyCollector">
      <!-- Match Core example: enable W3C header injection -->
      <EnableW3CHeadersInjection>true</EnableW3CHeadersInjection>
    </Add>

    <!-- EventCounterCollectionModule: add a single counter (if you use event counters) -->
    <Add Type="Microsoft.ApplicationInsights.Extensibility.PerfCounterCollector.EventCounterCollectionModule, Microsoft.AI.PerfCounterCollector">
      <Counters>
        <!-- Mirrors Core example: only collect 'gen-0-size' from System.Runtime -->
        <Add ProviderName="System.Runtime" CounterName="gen-0-size" />
      </Counters>
    </Add>

    <!-- PerformanceCollectorModule (classic Windows performance counters).
         To DISABLE perf-counter collection, do NOT include this module.
         If it already exists in your file, remove or comment it out.
         Example of the line you would remove:
    <Add Type="Microsoft.ApplicationInsights.Extensibility.PerfCounterCollector.PerformanceCollectorModule, Microsoft.AI.PerfCounterCollector" />
    -->

  </TelemetryModules>
</ApplicationInsights>

ApplicationInsights.config に存在するモジュールの正確なセットは、インストールした SDK パッケージによって異なります。

遠隔測定を無効にする

各モジュールの構成ファイルにノードが存在します。 モジュールを無効にするには、ノードを削除するか、コメント アウトします。

接続文字列

この設定により、データが表示される Application Insights リソースが決定されます。 通常は、アプリケーションごとに、個別の接続文字列を使用して個別のリソースを作成します。

コード サンプルについては、「Application Insights の接続文字列」を参照してください。

接続文字列を動的に設定する場合 (たとえば、アプリケーションからの結果を別のリソースに送信するために)、構成ファイルから接続文字列を省略し、代わりにコードで設定することができます。

標準テレメトリ モジュールを含む、TelemetryClient のすべてのインスタンスの接続文字列を設定するには、ASP.NET サービスの global.aspx.cs などの初期化メソッドで次の手順を行います。

using Microsoft.ApplicationInsights.Extensibility;
using Microsoft.ApplicationInsights;

    protected void Application_Start()
    {
        TelemetryConfiguration configuration = TelemetryConfiguration.CreateDefault();
        configuration.ConnectionString = "InstrumentationKey=00000000-0000-0000-0000-000000000000";
        var telemetryClient = new TelemetryClient(configuration);

特定のイベント セットを異なるリソースに送信する場合、特定のテレメトリ クライアントのキーを設定できます。


    var tc = new TelemetryClient();
    tc.Context.ConnectionString = "InstrumentationKey=00000000-0000-0000-0000-000000000000";
    tc.TrackEvent("myEvent");
    // ...

新しい接続文字列を取得するには、Application Insights ポータルで新しいリソースを作成します

ApplicationId プロバイダー

ASP.NET の場合、このプロバイダーは SDK v2.6.0* 以降で使用できます。

このプロバイダーの目的は、接続文字列に基づいて、アプリケーション ID を検索することです。 アプリケーション ID は RequestTelemetryDependencyTelemetry に含まれており、ポータルでの相関関係を決定するために使用されます。

この機能は、TelemetryConfiguration.ApplicationIdProvider を設定することで使用できます。

インターフェイス: IApplicationIdProvider

public interface IApplicationIdProvider
{
    bool TryGetApplicationId(string instrumentationKey, out string applicationId);
}

Microsoft.ApplicationInsights SDK 内に次の 2 つの実装が用意されています。ApplicationInsightsApplicationIdProviderDictionaryApplicationIdProvider

ApplicationInsightsApplicationIdProvider

このラッパーはプロファイル API 用です。 要求を調整し、結果をキャッシュします。 このプロバイダーは、Microsoft.ApplicationInsights.DependencyCollector または Microsoft.ApplicationInsights.Web をインストールすると自動的に含まれます。

クラスは、ProfileQueryEndpoint と呼ばれる省略可能なプロパティを公開します。 既定では、https://dc.services.visualstudio.com/api/profiles/{0}/appId に設定されています。

プロキシを構成する必要がある場合は、ベース アドレスをプロキシ化し、パスに /api/profiles/{0}/appId が含まれていることを確認することをお勧めします。 実行時に、{0} は各要求のインストルメンテーション キーに置き換えられます。

ApplicationInsights.config を使用した構成例

<ApplicationInsights>
    ...
    <ApplicationIdProvider Type="Microsoft.ApplicationInsights.Extensibility.Implementation.ApplicationId.ApplicationInsightsApplicationIdProvider, Microsoft.ApplicationInsights">
        <ProfileQueryEndpoint>https://dc.services.visualstudio.com/api/profiles/{0}/appId</ProfileQueryEndpoint>
    </ApplicationIdProvider>
    ...
</ApplicationInsights>

コードを使用した構成例

TelemetryConfiguration.Active.ApplicationIdProvider = new ApplicationInsightsApplicationIdProvider();

DictionaryApplicationIdProvider

この静的プロバイダーは、構成済みのインストルメンテーション キーとアプリケーション ID のペアに依存しています。

このクラスには Defined プロパティがあります。これは、インストルメンテーション キーとアプリケーション ID のペアである Dictionary<string,string> です。

このクラスには、オプションのプロパティ Next があり、構成にない接続文字列が要求されたときに使用する、別のプロバイダーの構成に使うことができます。

ApplicationInsights.config を使用した構成例

<ApplicationInsights>
    ...
    <ApplicationIdProvider Type="Microsoft.ApplicationInsights.Extensibility.Implementation.ApplicationId.DictionaryApplicationIdProvider, Microsoft.ApplicationInsights">
        <Defined>
            <Type key="InstrumentationKey_1" value="ApplicationId_1"/>
            <Type key="InstrumentationKey_2" value="ApplicationId_2"/>
        </Defined>
        <Next Type="Microsoft.ApplicationInsights.Extensibility.Implementation.ApplicationId.ApplicationInsightsApplicationIdProvider, Microsoft.ApplicationInsights" />
    </ApplicationIdProvider>
    ...
</ApplicationInsights>

コードを使用した構成例

TelemetryConfiguration.Active.ApplicationIdProvider = new DictionaryApplicationIdProvider{
 Defined = new Dictionary<string, string>
    {
        {"InstrumentationKey_1", "ApplicationId_1"},
        {"InstrumentationKey_2", "ApplicationId_2"}
    }
};

スナップショット コレクションを構成する

ASP.NET および ASP.NET Core アプリケーションのスナップショット コレクションを構成する方法については、「Azure Service Fabric、Cloud Services、および Virtual Machines で .NET アプリのスナップショット デバッガーを有効にする」を参照してください。

クライアント側の監視を追加します。

前のセクションでは、サーバー側の監視を自動および手動で構成する方法に関するガイダンスを提供しました。 クライアント側の監視を追加するには、Microsoft の クライアント側 JavaScript SDK を使用します。 ページの HTML の終了タグ の前に </head>を追加すると、任意の Web ページのクライアント側トランザクションを監視できます。

各 HTML ページのヘッダーに JavaScript (Web) SDK ローダー スクリプトを手動で追加することもできますが、代わりにその JavaScript (Web) SDK ローダー スクリプトをプライマリ ページに追加することをお勧めします。 このアクションにより、JavaScript (Web) JavaScript (Web) SDK ローダー スクリプトがサイトのすべてのページに挿入されます。

この記事のテンプレートベースの ASP.NET MVC アプリの場合、編集する必要があるファイルは _Layout.cshtml です。 それは、[ビュー]>[共有] の下にあります。 クライアント側の監視を追加するには、_Layout.cshtml を開き、クライアント側の JavaScript (Web) JavaScript SDK 構成に関する記事の JavaScript (Web) SDK ローダーのスクリプトベースのセットアップ手順に従います。

カスタム イベントとメトリックのコア API

アプリケーションに数行のコードを挿入して、ユーザーが何をしているのかを調べるか、問題の診断に役立ちます。 デバイス アプリ、デスクトップ アプリ、Web クライアント、Web サーバーからテレメトリを送信できます。 Application Insights コア テレメトリ API を使用して、カスタム イベントとメトリック、および独自のバージョンの標準テレメトリを送信します。 この API は、標準の Application Insights データ コレクターが使用するのと同じ API です。

API の概要

コア API は、 GetMetric (.NET のみ) などのいくつかのバリエーションとは別に、すべてのプラットフォームで統一されています。

メソッド 使用目的
TrackPageView ページ、画面、ペイン、またはフォーム。
TrackEvent ユーザー アクションとその他のイベント。 ユーザーの動作を追跡したり、パフォーマンスを監視したりするために使用されます。
GetMetric ゼロメトリックと多次元メトリック、一元的に構成された集計、C# のみ。
TrackMetric 特定のイベントに関連しないキューの長さなどのパフォーマンス測定。
TrackException 診断のための例外をログに記録する。 他のイベントに関連して発生した場所をトレースし、スタック トレースを調べます。
TrackRequest パフォーマンス分析のためのサーバー要求の頻度と期間をログに記録します。
TrackTrace リソース診断ログ メッセージ。 サードパーティのログをキャプチャすることもできます。
TrackDependency アプリが依存する外部コンポーネントへの呼び出しの期間と頻度をログに記録します。

これらのテレメトリ呼び出しのほとんどに プロパティとメトリックをアタッチ できます。

[前提条件]

Application Insights SDK に関する参照がまだない場合:

  1. Application Insights SDK をプロジェクトに追加します。

  2. デバイスまたは Web サーバーのコードには、次のものが含まれます。

    using Microsoft.ApplicationInsights;
    

TelemetryClient インスタンスを取得する

TelemetryClientのインスタンスを取得します。

Azure Functions v2 以降または Azure WebJobs v3 以降を使用する場合は、「 Azure Functions の監視」を参照してください。

ASP.NET Core アプリと .NET/.NET Core アプリの非 HTTP/Worker の場合は、それぞれのドキュメントで説明されているように、依存関係挿入コンテナーからTelemetryClientのインスタンスを取得します。

private TelemetryClient telemetry = new TelemetryClient();

このメソッドが廃止されたことを示すメッセージが表示される場合は、 microsoft/ApplicationInsights-dotnet#1152 を参照してください。

受信 HTTP 要求は自動的にキャプチャされます。 アプリの他のモジュールに対して、 TelemetryClient のインスタンスをさらに作成したい場合があります。 たとえば、ミドルウェア クラスに 1 つの TelemetryClient インスタンスがあり、ビジネス ロジック イベントを報告できます。 UserIdDeviceIdなどのプロパティを設定して、マシンを識別できます。 この情報は、インスタンスが送信するすべてのイベントに添付されます。

TelemetryClient.Context.User.Id = "...";
TelemetryClient.Context.Device.Id = "...";

TelemetryClient はスレッド セーフです。

TrackEvent

Application Insights では、 カスタム イベント、メトリックス エクスプローラー で集計されたカウントとして、 および診断検索 で個別の出現回数として表示できるデータ ポイントです。 (MVC やその他のフレームワークの "イベント" には関連しません)。

コード TrackEvent 呼び出しを挿入して、さまざまなイベントをカウントします。 たとえば、ユーザーが特定の機能を選択する頻度を追跡できます。 または、特定の目標を達成する頻度や、特定の種類の間違いを犯す頻度を知りたい場合があります。

たとえば、ゲーム アプリでは、ユーザーがゲームに勝利するたびにイベントを送信します。

telemetry.TrackEvent("WinGame");

Log Analytics のカスタム イベント

テレメトリは、customEventsまたは使用状況エクスペリエンス テーブルにあります。 イベントは、 trackEvent(..) または Click Analytics Autocollection プラグインから発生する可能性があります。

サンプリングが処理中の場合、itemCount プロパティには 1 より大きい値が表示されます。 たとえば、 itemCount==10 は、 trackEvent()への呼び出しが 10 回の場合、サンプリング プロセスはそのうちの 1 つだけを送信することを意味します。 カスタム イベントの正しい数を取得するには、 customEvents | summarize sum(itemCount)などのコードを使用します。

itemCount の最小値は 1 です。レコード自体はエントリを表します。

GetMetric

GetMetric()呼び出しを効果的に使用して、.NET および .NET Core アプリケーションのローカルに事前集計されたメトリックをキャプチャする方法については、「.NET および .NET Core のカスタム メトリック コレクション」を参照してください。

TrackMetric

Microsoft.ApplicationInsights.TelemetryClient.TrackMetric は、メトリックを送信するための推奨される方法ではありません。 メトリックは、送信される前に、常に一定期間にわたって事前に集計する必要があります。 GetMetric(..) オーバーロードのいずれかを使用して、SDK の事前集計機能にアクセスするためのメトリック オブジェクトを取得します。

独自の事前集計ロジックを実装している場合は、 TrackMetric() メソッドを使用して結果の集計を送信できます。 アプリケーションで、すべての機会に個別のテレメトリ項目を送信する必要がある場合は、一定期間にわたって集計を行わないと、イベント テレメトリのユース ケースが発生する可能性があります。 TelemetryClient.TrackEvent(Microsoft.ApplicationInsights.DataContracts.EventTelemetry)を参照してください。

Application Insights では、特定のイベントにアタッチされていないメトリックをグラフ化できます。 たとえば、キューの長さを一定の間隔で監視できます。 メトリックでは、個々の測定値はバリエーションや傾向よりも関心が低く、統計グラフが役立ちます。

Application Insights にメトリックを送信するには、 TrackMetric(..) API を使用できます。 メトリックを送信するには、次の 2 つの方法があります。

  • 単一の値。 アプリケーションで測定を実行するたびに、対応する値を Application Insights に送信します。

    たとえば、コンテナー内の項目の数を示すメトリックがあるとします。 特定の期間中、最初に 3 つの項目をコンテナーに配置してから、2 つの項目を削除します。 したがって、 TrackMetric を 2 回呼び出します。 まず、 3 値を渡し、値を -2渡します。 Application Insights には、両方の値が格納されます。

  • 集計。 メトリックを使用する場合、1 回の測定に対する関心はほとんどありません。 代わりに、特定の期間中に発生した内容の概要が重要です。 このような概要は 、集計と呼ばれます。

    前の例では、その期間の集計メトリックの合計が 1 され、メトリック値の数が 2されています。 集計方法を使用する場合は、期間ごとに 1 回だけ TrackMetric を呼び出し、集計値を送信します。 この方法をお勧めします。Application Insights に送信するデータ ポイントの数を減らしてコストとパフォーマンスのオーバーヘッドを大幅に削減しながら、すべての関連情報を収集できるためです。

単一値の例

1 つのメトリック値を送信するには:

var sample = new MetricTelemetry();
sample.Name = "queueLength";
sample.Sum = 42.3;
telemetryClient.TrackMetric(sample);

Log Analytics のカスタム メトリック

テレメトリは、customMetrics テーブルで使用できます。 各行は、アプリ内の trackMetric(..) の呼び出しを表します。

  • valueSum: 測定値の合計。 平均値を取得するには、 valueCountで除算します。
  • valueCount: この trackMetric(..) 呼び出しに集計された測定値の数。

valueCount の最小値は 1 です。レコード自体はエントリを表します。

ページ ビュー

デバイスまたは Web ページ アプリでは、各画面またはページが読み込まれると、ページ ビューテレメトリが既定で送信されます。 ただし、既定の設定を変更して、ページ ビューを追跡する時間を増やしたり、異なる時間に変更したりできます。 たとえば、タブまたはペインを表示するアプリでは、ユーザーが新しいウィンドウを開くたびにページを追跡できます。

ユーザーとセッションのデータは、ページ ビューと共にプロパティとして送信されるため、ページ ビューテレメトリがある場合は、ユーザーグラフとセッション グラフが有効になります。

カスタム ページ ビュー

telemetry.TrackPageView("GameReviewPage");

Log Analytics のページ テレメトリ

Log Analytics では、2 つのテーブルにブラウザー操作のデータが表示されます。

  • pageViews: URL とページ タイトルに関するデータが含まれます。
  • browserTimings: 受信データの処理にかかった時間など、クライアントのパフォーマンスに関するデータが含まれます。

ブラウザーがさまざまなページを処理するのにかかる時間を確認するには:

browserTimings
| summarize avg(networkDuration), avg(processingDuration), avg(totalDuration) by name

さまざまなブラウザーの人気を発見するには:

pageViews
| summarize count() by client_Browser

ページ ビューを AJAX 呼び出しに関連付けるには、依存関係と結合します。

pageViews
| join (dependencies) on operation_Id

TrackRequest

サーバー SDK では TrackRequest を使用して HTTP 要求をログに記録します。

Web サービス モジュールが実行されていないコンテキストで要求をシミュレートする場合は、自分で呼び出すこともできます。

要求テレメトリを送信する推奨される方法は、要求が 操作コンテキストとして機能する場所です。

操作コンテキスト

テレメトリ項目を操作コンテキストに関連付けることで、テレメトリ項目を相互に関連付けることができます。 標準の要求追跡モジュールは、HTTP 要求の処理中に送信される例外やその他のイベントに対してこれを行います。 SearchAnalytics では、操作 ID を使用して、要求に関連付けられているすべてのイベントを簡単に見つけることができます。

テレメトリを手動で追跡する場合、テレメトリの相関関係を確認する最も簡単な方法は、次のパターンを使用することです。

// Establish an operation context and associated telemetry item:
using (var operation = telemetryClient.StartOperation<RequestTelemetry>("operationName"))
{
    // Telemetry sent in here uses the same operation ID.
    ...
    telemetryClient.TrackTrace(...); // or other Track* calls
    ...

    // Set properties of containing telemetry item--for example:
    operation.Telemetry.ResponseCode = "200";

    // Optional: explicitly send telemetry item:
    telemetryClient.StopOperation(operation);

} // When operation is disposed, telemetry item is sent.

相関関係の詳細については、「 Application Insights のテレメトリの相関関係」を参照してください。

操作コンテキストの設定と共に、 StartOperation は、指定した種類のテレメトリ項目を作成します。 操作を破棄するとき、または明示的に StopOperationを呼び出すと、テレメトリ項目が送信されます。 テレメトリの種類として RequestTelemetry を使用する場合、その期間は開始から停止までの時間間隔に設定されます。

操作のスコープ内で報告されたテレメトリ項目は、その操作の子要素になります。 操作コンテキストは入れ子にすることができます。

検索では、操作コンテキストを使用して[関連アイテム]リストを作成します。

[関連アイテム] リストを示すスクリーンショット。

カスタム操作の追跡の詳細については、「 Application Insights .NET SDK を使用したカスタム操作の追跡」を参照してください。

Log Analytics の要求

Application Insights Analytics では、要求が requests テーブルに表示されます。

サンプリングが処理中の場合、itemCount プロパティには 1 より大きい値が表示されます。 たとえば、 itemCount==10 は、 trackRequest()への呼び出しが 10 回の場合、サンプリング プロセスはそのうちの 1 つだけを送信することを意味します。 要求の正しい数と要求名でセグメント化された平均期間を取得するには、次のようなコードを使用します。

requests
| summarize count = sum(itemCount), avgduration = avg(duration) by name

TrackException

Application Insights に例外を送信する:

レポートにはスタック トレースが含まれます。

try
{
    ...
}
catch (Exception ex)
{
    telemetry.TrackException(ex);
}

SDK では多くの例外が自動的にキャッチされるため、 TrackException を明示的に呼び出す必要はありません。

Log Analytics の例外

Application Insights Analytics では、例外が exceptions テーブルに表示されます。

サンプリングが処理中の場合、itemCount プロパティには 1 より大きい値が表示されます。 たとえば、 itemCount==10 は、 trackException()への呼び出しが 10 回の場合、サンプリング プロセスはそのうちの 1 つだけを送信することを意味します。 例外の種類別にセグメント化された例外の正しい数を取得するには、次のようなコードを使用します。

exceptions
| summarize sum(itemCount) by type

重要なスタック情報のほとんどは既に個別の変数に抽出されていますが、 details 構造を引き離してさらに多くを得ることができます。 この構造体は動的であるため、結果を想定した型にキャストする必要があります。 例えば次が挙げられます。

exceptions
| extend method2 = tostring(details[0].parsedStack[1].method)

例外を関連する要求に関連付けるには、結合を使用します。

exceptions
| join (requests) on operation_Id

TrackTrace

TrackTrace を使用すると、Application Insights に「階層リンクの軌跡」を送信して問題を診断するときに役立ちます。 診断データのチャンクを送信し、 診断検索で検査できます。

.NET ログ アダプターでは、この API を使用してサードパーティのログをポータルに送信します。

telemetry.TrackTrace(message, SeverityLevel.Warning, properties);

メソッドの入力や退出などの診断イベントをログに記録します。

パラメーター Description
message 診断データ。 名前よりもはるかに長い場合があります。
properties 文字列と文字列のマップ。 ポータルで 例外をフィルター処理 するために、さらに多くのデータが使用されます。 既定値は空です。
severityLevel サポートされている値: SeverityLevel.ts

メッセージの内容は検索できますが、プロパティ値とは異なり、フィルター処理することはできません。

messageのサイズ制限は、プロパティの制限よりもはるかに大きくなります。 TrackTraceの利点は、比較的長いデータをメッセージに格納できることです。 たとえば、POST データをエンコードできます。

メッセージに重大度レベルを追加することもできます。 また、他のテレメトリと同様に、プロパティ値を追加して、さまざまなトレース セットのフィルター処理や検索に役立ちます。 例えば次が挙げられます。

var telemetry = new Microsoft.ApplicationInsights.TelemetryClient();
telemetry.TrackTrace("Slow database response",
                SeverityLevel.Warning,
                new Dictionary<string,string> { {"database", db.ID} });

検索では、特定のデータベースに関連する特定の重大度レベルのすべてのメッセージを簡単に除外できます。

Log Analytics のトレース

Application Insights Analytics では、TrackTraceの呼び出しが traces テーブルに表示されます。

サンプリングが処理中の場合、itemCount プロパティには 1 より大きい値が表示されます。 たとえば、 itemCount==10 は、 trackTrace()への呼び出しが 10 回の場合、サンプリング プロセスはそのうちの 1 つだけを送信することを意味します。 トレース呼び出しの正しい数を取得するには、 traces | summarize sum(itemCount)などのコードを使用します。

TrackDependency

TrackDependency呼び出しを使用して、外部コードへの呼び出しの応答時間と成功率を追跡します。 結果は、ポータルの依存関係グラフに表示されます。 次のコード スニペットは、依存関係の呼び出しが行われる場所を問わず追加する必要があります。

.NET と .NET Core の場合は、関連付けに必要なTelemetryClient.StartOperationプロパティと、開始時刻や期間などの他のプロパティを満たすDependencyTelemetry (拡張機能) メソッドを使用することもできます。そのため、次の例のようにカスタム タイマーを作成する必要はありません。 詳細については、「 Application Insights .NET SDK を使用したカスタム操作の追跡」の送信依存関係の追跡に関するセクションを参照してください。

var success = false;
var startTime = DateTime.UtcNow;
var timer = System.Diagnostics.Stopwatch.StartNew();
try
{
    success = dependency.Call();
}
catch(Exception ex)
{
    success = false;
    telemetry.TrackException(ex);
    throw new Exception("Operation went wrong", ex);
}
finally
{
    timer.Stop();
    telemetry.TrackDependency("DependencyType", "myDependency", "myCall", startTime, timer.Elapsed, success);
}

サーバー SDK には、データベースや REST API など、特定の依存関係呼び出しを自動的に検出して追跡する 依存関係モジュール が含まれています。 モジュールを動作させるには、サーバーにエージェントをインストールする必要があります。

自動追跡でキャッチされない呼び出しを追跡する場合は、この呼び出しを使用します。

C# で標準の依存関係追跡モジュールを無効にするには、 ApplicationInsights.config を編集し、 DependencyCollector.DependencyTrackingTelemetryModuleへの参照を削除します。

Log Analytics の依存関係

Application Insights Analytics では、trackDependency呼び出しが dependencies テーブルに表示されます。

サンプリングが処理中の場合、itemCount プロパティには 1 より大きい値が表示されます。 たとえば、 itemCount==10 は、 trackDependency()への呼び出しが 10 回の場合、サンプリング プロセスはそのうちの 1 つだけを送信することを意味します。 ターゲット コンポーネントによってセグメント化された依存関係の正しい数を取得するには、次のようなコードを使用します。

dependencies
| summarize sum(itemCount) by target

依存関係を関連する要求に関連付けるには、結合を使用します。

dependencies
| join (requests) on operation_Id

データの消去

通常、SDK は一定の間隔 (通常は 30 秒)、またはバッファーがいっぱいになると (通常は 500 項目) データを送信します。 場合によっては、バッファーをフラッシュしたいことがあります。 たとえば、シャットダウンするアプリケーションで SDK を使用している場合です。

Flush()を使用する場合は、次のパターンをお勧めします。

telemetry.Flush();
// Allow some time for flushing before shutdown.
System.Threading.Thread.Sleep(5000);

FlushAsync()を使用する場合は、次のパターンをお勧めします。

await telemetryClient.FlushAsync()
// No need to sleep

テレメトリが失われないことを保証するために、アプリケーションのシャットダウンの一部として常にフラッシュすることをお勧めします。

自動フラッシュ構成を確認する: ファイルでweb.config、Application Insights でインストルメント化された .NET アプリケーションのパフォーマンスが低下する可能性があります。 自動フラッシュを有効にすると、 System.Diagnostics.Trace.Trace* メソッドを呼び出すたびに、個々のテレメトリ項目が個別の Web 要求としてインジェスト サービスに送信されます。 これにより、Web サーバーでネットワークとストレージの枯渇が発生する可能性があります。 パフォーマンスを向上させるには、自動フラッシュを無効にし、より効果的なテレメトリ データ転送用に設計された ServerTelemetryChannel を利用することをお勧めします。

この関数は、 サーバー テレメトリ チャネルに対して非同期です。

認証済みユーザー

Web アプリでは、ユーザーは既定 で Cookie によって識別されます 。 ユーザーが別のコンピューターまたはブラウザーからアプリにアクセスした場合、または Cookie を削除した場合、1 人のユーザーが複数回カウントされる可能性があります。

ユーザーがアプリにサインインした場合は、ブラウザー コードで認証されたユーザー ID を設定することで、より正確な数を取得できます。 ユーザーの実際のサインイン名を使用する必要はありません。 必要なのは、そのユーザーに固有の ID のみです。 スペースや ,;=|文字を含めることはできません。

ユーザー ID もセッション Cookie で設定され、サーバーに送信されます。 サーバー SDK がインストールされている場合、認証されたユーザー ID は、クライアントとサーバーの両方のテレメトリのコンテキスト プロパティの一部として送信されます。 その後、フィルター処理して検索できます。

アプリでユーザーをアカウントにグループ化する場合は、アカウントの識別子を渡すこともできます。 同じ文字制限が適用されます。

メトリックス エクスプローラーでは、ユーザー、認証済み、ユーザー アカウントをカウントするグラフ作成できます。

特定のユーザー名とアカウントを持つクライアント データ ポイントを 検索 することもできます。

.NET Core SDK の ApplicationInsightsServiceOptions クラスの EnableAuthenticationTrackingJavaScript プロパティ は、Application Insights JavaScript SDK によって送信される各トレースの認証 ID としてユーザー名を挿入するために必要な JavaScript 構成を簡略化します。

このプロパティを true に設定すると、ASP.NET Core のユーザーのユーザー名が クライアント側のテレメトリと共に出力されます。 このため、 appInsights.setAuthenticatedUserContext を手動で追加する必要はなくなりました。これは、ASP.NET Core 用 SDK によって既に挿入されているためです。 認証 ID は、 JavaScript API リファレンスで説明されているように、.NET Core の SDK がサーバー側のテレメトリを識別して使用するサーバーにも送信されます。

SPA Web アプリなど、ASP.NET Core MVC と同じ方法で動作しない JavaScript アプリケーションの場合でも、 appInsights.setAuthenticatedUserContext を手動で追加する必要があります。

プロパティを使用してデータをフィルター処理、検索、セグメント化する

プロパティと測定値は、イベント、メトリック、ページ ビュー、例外、およびその他のテレメトリ データにアタッチできます。

プロパティ は、使用状況レポートでテレメトリをフィルター処理するために使用できる文字列値です。 たとえば、アプリで複数のゲームが提供されている場合は、各イベントにゲームの名前を添付して、どのゲームがより人気のあるかを確認できます。

文字列の長さには 8,192 という制限があります。 大量のデータを送信する場合は、 TrackTraceのメッセージ パラメーターを使用します。

メトリック は、グラフィカルに表示できる数値です。 たとえば、ゲーマーが達成するスコアが徐々に増加しているかどうかを確認できます。 グラフは、イベントと共に送信されるプロパティでセグメント化できるため、ゲームごとに個別のグラフまたは積み上げグラフを取得できます。

正しく表示するには、メトリック値が 0 以上である必要があります。

使用できる プロパティ、プロパティ値、メトリックの数にはいくつかの制限 があります。

// Set up some properties and metrics:
var properties = new Dictionary <string, string>
    {{"game", currentGame.Name}, {"difficulty", currentGame.Difficulty}};
var metrics = new Dictionary <string, double>
    {{"Score", currentGame.Score}, {"Opponents", currentGame.OpponentCount}};

// Send the event:
telemetry.TrackEvent("WinGame", properties, metrics);

Important

個人を特定できる情報をプロパティに記録しないようにしてください。

プロパティとメトリックを設定する別の方法

より便利な場合は、別のオブジェクトでイベントのパラメーターを収集できます。

var event = new EventTelemetry();

event.Name = "WinGame";
event.Metrics["processingTime"] = stopwatch.Elapsed.TotalMilliseconds;
event.Properties["game"] = currentGame.Name;
event.Properties["difficulty"] = currentGame.Difficulty;
event.Metrics["Score"] = currentGame.Score;
event.Metrics["Opponents"] = currentGame.Opponents.Length;

telemetry.TrackEvent(event);

Warnung

同じテレメトリ項目インスタンス (この例ではevent ) を再利用して、 Track*() を複数回呼び出さないでください。 この方法では、誤った構成でテレメトリが送信される可能性があります。

Log Analytics のカスタム測定値とプロパティ

Log Analytics では、カスタム メトリックとプロパティが各テレメトリ レコードのcustomMeasurements属性とcustomDimensions属性に表示されます。

たとえば、要求テレメトリに "game" という名前のプロパティを追加した場合、このクエリでは、"game" のさまざまな値の出現回数がカウントされ、カスタム メトリック "score" の平均が表示されます。

requests
| summarize sum(itemCount), avg(todouble(customMeasurements.score)) by tostring(customDimensions.game)

次の点に注意してください。

  • customDimensionsまたはcustomMeasurements JSON から値を抽出する場合は、動的な型を持つため、tostringまたはtodoubleキャストする必要があります。
  • サンプリングの可能性を考慮するには、sum(itemCount)しないcount()使用します。

タイミングイベント

アクションの実行にかかる時間をグラフに表示したい場合があります。 たとえば、ユーザーがゲーム内の選択肢を検討するのにかかる時間を知りたい場合があります。 この情報を取得するには、測定パラメーターを使用します。

var stopwatch = System.Diagnostics.Stopwatch.StartNew();

// ... perform the timed action ...

stopwatch.Stop();

var metrics = new Dictionary <string, double>
    {{"processingTime", stopwatch.Elapsed.TotalMilliseconds}};

// Set up some properties:
var properties = new Dictionary <string, string>
    {{"signalSource", currentSignalSource.Name}};

// Send the event:
telemetry.TrackEvent("SignalProcessed", properties, metrics);

カスタム テレメトリの既定のプロパティ

書き込む一部のカスタム イベントの既定のプロパティ値を設定する場合は、 TelemetryClient インスタンスで設定します。 これらは、そのクライアントから送信されるすべてのテレメトリ項目にアタッチされます。

using Microsoft.ApplicationInsights.DataContracts;

var gameTelemetry = new TelemetryClient();
gameTelemetry.Context.GlobalProperties["Game"] = currentGame.Name;
// Now all telemetry is automatically sent with the context property:
gameTelemetry.TrackEvent("WinGame");

個々のテレメトリ呼び出しは、プロパティ ディクショナリの既定値をオーバーライドできます。

標準コレクション モジュールからのデータを含むすべてのテレメトリにプロパティを追加するにはITelemetryInitializerを実装します。

遠隔測定を無効にする

テレメトリの収集と送信を 動的に停止して開始 するには:

using  Microsoft.ApplicationInsights.Extensibility;

TelemetryConfiguration.Active.DisableTelemetry = true;

開発者モード

デバッグ中に、結果をすぐに確認できるように、パイプラインを通じてテレメトリを迅速化すると便利です。 また、テレメトリに関する問題を追跡するのに役立つ他のメッセージも表示されます。 アプリの速度が低下する可能性があるため、運用環境でオフにします。

TelemetryConfiguration.Active.TelemetryChannel.DeveloperMode = true;

選択したカスタム テレメトリのインストルメンテーション キーを設定する

var telemetry = new TelemetryClient();
telemetry.InstrumentationKey = "---my key---";
// ...

動的接続文字列

開発、テスト、運用環境からのテレメトリの混在を回避するために、環境に応じて 個別の Application Insights リソースを作成 し、そのキーを変更できます。

構成ファイルからインストルメンテーション キーを取得する代わりに、コードで設定できます。 ASP.NET サービスの global.aspx.cs など、初期化メソッドでキーを設定します。

protected void Application_Start()
{
    Microsoft.ApplicationInsights.Extensibility.
    TelemetryConfiguration.Active.InstrumentationKey =
        // - for example -
        WebConfigurationManager.Settings["ikey"];
    ...
}

TelemetryContext

TelemetryClient には、すべてのテレメトリ データと共に送信される値を含む Context プロパティがあります。 これらは通常、標準のテレメトリ モジュールによって設定されますが、自分で設定することもできます。 例えば次が挙げられます。

telemetry.Context.Operation.Name = "MyOperationName";

これらの値のいずれかを自分で設定する場合は、値と標準値が混同されないように、 ApplicationInsights.config から関連する行を削除することを検討してください。

  • コンポーネント: アプリとそのバージョン。
  • デバイス: アプリが実行されているデバイスに関するデータ。 Web アプリでは、テレメトリが送信されるサーバーまたはクライアント デバイスです。
  • InstrumentationKey: テレメトリが表示される Azure の Application Insights リソース。 それは通常、 ApplicationInsights.configから拾われます.
  • 場所: デバイスの地理的な場所。
  • 操作: Web アプリでは、現在の HTTP 要求。 他の種類のアプリでは、この値を設定してイベントをグループ化できます。
    • ID: 診断検索でイベントを検査するときに関連項目を見つけられるように、さまざまなイベントを関連付ける生成された値。
    • 名前: 識別子。通常は HTTP 要求の URL です。
    • SyntheticSource: null または空でない場合は、要求のソースがロボットまたは Web テストとして識別されたことを示す文字列。 既定では、メトリックス エクスプローラーの計算から除外されます。
  • セッション: ユーザーのセッション。 ID は生成された値に設定されます。これは、ユーザーがしばらくアクティブになっていないときに変更されます。
  • ユーザー: ユーザー情報。

Limits

アプリケーションごと (インストルメンテーション キーごと) のメトリックとイベントの数には制限があります。 制限は、選択する料金プランによって異なります。

Resource 既定の制限 上限 注記
1 日あたりの合計データ量 100 GB サポートにお問い合わせください。 上限を設定してデータを減らすことができます。 さらにデータが必要な場合は、ポータルで上限を最大 1,000 GB まで引き上げることができます。 1,000 GB を超える容量については、AIDataCap@microsoft.com までメールでご連絡ください。
Throttling 32,000 イベント/秒 サポートにお問い合わせください。 制限は 1 分間にわたって測定されます。
データ保持ログ 30 日 - 730 日 730 日 このリソースはログ用です。
データ保持メトリック 90 日間 90 日間 このリソースはメトリックス エクスプローラー用です。
可用性の複数手順のテストの詳細な結果の保持 90 日間 90 日間 このリソースは、各手順の詳細な結果を提供します。
テレメトリ項目の最大サイズ 64 KB 64 KB
バッチあたりの最大テレメトリ項目数 64,000 64,000
プロパティとメトリック名の長さ 150 150 型スキーマに関するページを参照してください。
プロパティ値の文字列の長さ 8,192 8,192 型スキーマに関するページを参照してください。
トレースおよび例外のメッセージ長 32,768 32,768 型スキーマに関するページを参照してください。
Application Insights リソースあたりの可用性テスト 100 100
リソース グループあたりの可用性テスト数 800 800 Azure Resource Manager を参照してください
可用性テストのテストあたりの最大リダイレクト数 10 10
可用性テストの最小テスト頻度 300 秒 5分未満のテスト周波数、またはカスタム周波数には、カスタム TrackAvailability の実装が必要です。
.NET Profilerスナップショット デバッガーのデータ保持 2 週間 サポートにお問い合せください。 保持の最大限度は 6 か月です。
.NET Profiler の 1 日あたりの送信データ 制限なし 制限なし。
スナップショット デバッガーの 1 日あたりの送信データ 監視対象アプリごとに 1 日あたり 30 のスナップショット 制限なし。 アプリケーションあたりに収集されるスナップショットの数は、構成することで変更できます。

価格とクォータの詳細については、「Application Insights の課金」を参照してください。

データ レート制限に達しないようにするには、サンプリングを使用 します

データの保持期間を確認するには、「 データの保持とプライバシー」を参照してください。

サンプル アプリケーション

.NET Core コンソール アプリケーション: .NET Core (2.0 以降) または .NET Framework (4.7.2 以降) で記述されたコンソール アプリケーションを使用している場合は、このサンプルを使用します。

HostedServices を使用したコア バックグラウンド タスクの ASP.NET: ASP.NET Core を使用していて、 公式のガイダンスに従ってバックグラウンド タスクを作成している場合は、このサンプルを使用します。

.NET Core Worker Service: 公式のガイダンスに従って .NET Worker Service アプリケーションがある場合は、このサンプルを使用します。

トラブルシューティング

専用のトラブルシューティングに関する記事をご覧ください。

アプリケーション ホストとインジェスト サービスの間の接続をテストする

Application Insights SDK とエージェントからテレメトリが送信され、インジェスト エンドポイントへの REST 呼び出しとして取り込まれます。 Web サーバーまたはアプリケーション ホスト マシンからインジェスト サービス エンドポイントへの接続は、PowerShell の生の REST クライアントを使用するか、curl コマンドを使用してテストできます。 「Azure Monitor Application Insights でアプリケーション テレメトリが見つからない場合のトラブルシューティング」をご覧ください。

オープンソース SDK

コードを読んで協力してください。

最新の更新プログラムとバグ修正については、リリース ノートを参照してください

リリース ノート

バージョン 2.12 以降: .NET ソフトウェア開発キット (SDK) (ASP.NET、ASP.NET Core、ログ アダプターを含む)

Application Insights の主な機能強化は、サービスの更新に関するページでも要約しています。

次のステップ

リファレンス ドキュメント