注意事項
Azure Monitor Application Insights を利用する新規のアプリケーションやお客様には、Azure Monitor OpenTelemetry Distro をお勧めします。 Azure Monitor OpenTelemetry Distro では、Application Insights SDK と同様の機能とエクスペリエンスが提供されます。 .NET、Node.js、Python 用の移行ガイドを使用して Application Insights SDK から移行することはできますが、下位互換性を確保するために引き続きいくつかの機能を追加する取り組みを行っています。
この記事では、テレメトリを送信するためにコア アプリケーションを ASP.NET および ASP.NET するための Application Insights を有効にして構成する方法について説明します。 Application Insights は、アプリから次のテレメトリを収集できます。
- リクエスト
- 依存関係
- 例外
- 性能カウンター
- トレース (ログ)
- ハートビート
- カスタム イベントとメトリック (手動インストルメンテーションが必要)
- ページ ビュー (Web ページには JavaScript SDK が必要)
- 可用性テスト (可用性 テストを手動で設定する必要があります)
サポートされているシナリオ
メモ
Application Insights SDK for ASP.NET Core では、実行されている場所や方法に関係なく、アプリケーションを監視できます。 アプリケーションが実行されていて、Azure へのネットワーク接続がある場合は、テレメトリを収集することができます。 Application Insights の監視は、.NET Core がサポートされているすべての場所でサポートされます。
サポートされています | ASP.NET | ASP.NET Core |
---|---|---|
オペレーティング システム | ウィンドウズ | Windows、Linux、または macOS |
ホスティング方法 | インプロセス (IIS または IIS Express) | プロセス内またはプロセス外 |
デプロイ方法 | Web デプロイ、MSI、または手動ファイルコピー | フレームワーク依存または自己完結型 |
ウェブサーバー | インターネット インフォメーション サービス (IIS) | インターネット インフォメーション サーバー (IIS) または Kestrel |
ホスティング プラットフォーム | Azure App Service (Windows)、Azure Virtual Machines、またはオンプレミス サーバー | Azure App Service、Azure Virtual Machines、Docker、Azure Kubernetes Service (AKS) の Web Apps 機能 |
.NET バージョン | .NET Framework 4.6.1 以降 | 正式に サポートされているすべての .NET バージョン (プレビュー段階ではない) |
IDE | Visual Studio | Visual Studio、Visual Studio Code、またはコマンド ライン |
Application Insights の追加
前提条件
- Azure サブスクリプション。 まだお持ちでない場合は、 無料の Azure アカウントを作成します。
- Application Insights ワークスペース ベースのリソース。
- 機能している Web アプリケーション。 まだお持ちでない場合は、「 基本的な Web アプリを作成する」を参照してください。
- 次のワークロードを備えた最新バージョンの Visual Studio :
- ASP.NET および Web の開発
- Azure の開発
基本的な Web アプリを作成する
まだ機能している Web アプリケーションがない場合は、次のガイダンスを使用して作成できます。
メモ
MVC アプリケーションの例を使います。 Worker サービスを使用している場合は、ワーカー サービス アプリケーション向け Application Insights に関する手順を使用します。
- Visual Studio を開きます。
- [ 新しいプロジェクトの作成] を選択します。
- C#ASP.NET Web アプリケーション (.NET Framework) を選択し、[次へ] を選択します。
- プロジェクト名を入力し、[作成] を選択します。
- [MVC] を選択し、[作成] を選択します。
Application Insights を自動的に追加する (Visual Studio)
このセクションでは、テンプレート ベースの Web アプリに Application Insights を自動的に追加する方法について説明します。
Visual Studio の ASP.NET Web アプリ プロジェクト内から:
[プロジェクト]>[Application Insights Telemetry の追加]>[Application Insights SDK (ローカル)]>[次へ]>[完了]>[閉じる] の順に選択します。
ApplicationInsights.config ファイルを開きます。
終了タグ
</ApplicationInsights>
の前に、自分の Application Insights リソースの接続文字列を含む行を追加します。 新しく作成された Application Insights リソースの [概要] ペインで接続文字列を見つけます。<ConnectionString>Copy connection string from Application Insights Resource Overview</ConnectionString>
[プロジェクト]>[NuGet パッケージの管理]>[更新] を選択します。 次に、各
Microsoft.ApplicationInsights
NuGet パッケージを最新の安定版リリースに更新します。[IIS Express] を選択してアプリケーションを実行します。 基本的な ASP.NET アプリが開きます。 サイトでページを移動して閲覧すると、テレメトリが Application Insights に送信されます。
Application Insights を手動で追加する (Visual Studio を使用しない)
このセクションでは、テンプレート ベースの Web アプリに Application Insights を手動で追加する方法について説明します。
次の NuGet パッケージとその依存関係をプロジェクトに追加します。
場合によっては、ApplicationInsights.config ファイルが自動的に作成されます。 ファイルが既に存在する場合は、手順 4 に進みます。
ない場合は、自分で作成してください。 ASP.NET アプリケーションのルート ディレクトリに、ApplicationInsights.configという名前の新規ファイルを作成します。
次の 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>
接続文字列を追加します。このためには、次の 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" };
プロジェクトの 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); } } }
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()); } } }
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=\"Web\" /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 を手動で構成するには:
NuGet パッケージ Microsoft.ApplicationInsights.PerfCounterCollector をインストールします。
次のサンプル コンソール アプリ コードは、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();
}
}
}
}
トレース (ログ)
Application Insights は、ILogger を介して ASP.NET Core やその他の .NET アプリからログをキャプチャし、クラシック ASP.NET (.NET Framework) からクラシック SDK とアダプターを介してログをキャプチャします。
ヒント
既定では、Application Insights プロバイダーは、重大度が
Warning
以上のログのみを送信します。Information
または下位レベルのログを含めるには、appsettings.json
でログ レベルの設定を更新します。バックグラウンド サービスに対して Application Insights を有効にするために使用される
Microsoft.ApplicationInsights.WorkerService
NuGet パッケージは、スコープ外です。 詳細については、「 Application Insights for Worker Service アプリ」を参照してください。
メモ
よく寄せられる質問 (FAQ) を確認するには、「 .NET でのログ記録に関する FAQ」を参照してください。
ILogger ガイダンスは、ASP.NET には適用されません。 クラシック ASP.NET アプリから Application Insights にトレース ログを送信するには、次のようなサポートされているアダプターを使用します。
- Application Insights TraceListener を使用した System.Diagnostics.Trace
- 公式の Application Insights ターゲットを含む log4net または NLog
詳細な手順と構成例については、「 トレース ログを Application Insights に送信する」を参照してください。
コンソール アプリケーション
コンソール アプリケーションに 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 のシナリオ (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");
}
ログを検索する
ILogger ログはトレース テレメトリとして表示されます (Application Insights のテーブル traces
と Log Analytics の AppTraces
)。
例
Azure portal で Application Insights に移動し、次のコマンドを実行します。
traces
| where severityLevel >= 2 // 2=Warning, 1=Information, 0=Verbose
| take 50
依存関係
自動追跡された依存関係
.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);
依存関係を手動で追跡する
次の例では、依存関係が自動的に収集されず、手動追跡が必要になります。
- 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
から拡張メソッドの StartOperation
と StopOperation
が提供されます。出力方向の依存関係の追跡で確認できるように、それを利用して依存関係を手動追跡できます。
標準の依存関係追跡モジュールを無効にする
詳細については、 テレメトリ モジュールを参照してください。
詳細な SQL 追跡で完全な SQL クエリを取得する
SQL 呼び出しの場合、サーバーとデータベースの名前が常に収集され、収集された DependencyTelemetry
の名前として保存されます。 「データ」という名称の別のフィールドがあります。これに完全な SQL クエリ テキストを含めることができます。
メモ
Azure Functions には、SQL テキスト コレクションを有効にするための別の設定が必要です。 詳細については、「SQL クエリ コレクションを有効にする」を参照してください。
ASP.NET アプリケーションの場合は、バイト コード インストルメンテーションの支援により、完全な SQL クエリ テキストが収集されます。これには、インストルメンテーション エンジン、または System.Data.SqlClient ライブラリではなく Microsoft.Data.SqlClient NuGet パッケージの使用が要求されます。 完全な SQL クエリの収集を有効にするためのプラットフォーム固有の手順を、次の表に示します。
プラットホーム | 完全な 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 クエリはキャプチャされません。
例外
Web アプリケーションの例外は、 Application Insights で報告できます。 失敗した要求を、クライアントとサーバーの両方で例外やその他のイベントと関連付けることができ、原因をすばやく診断できます。 このセクションでは、例外レポートの設定、例外の明示的な報告、エラーの診断などを行う方法について説明します。
例外レポートを設定する
Application Insights は、サーバーまたはクライアントで発生する例外を報告するように設定できます。 アプリケーションが依存しているプラットフォームに応じて、適切な拡張機能または SDK が必要です。
サーバー側アプリケーションから例外を報告するには、次のシナリオを検討してください。
- Azure Web アプリ用の Application Insights 拡張機能 を追加します。
- Azure Virtual Machines と Azure Virtual Machine Scale Sets IIS でホストされるアプリの アプリケーション監視拡張機能 を追加します。
- Application Insights SDK を アプリ コードに追加するか、IIS Web サーバー用 の Application Insights エージェント を実行するか、Java Web アプリの Java エージェント を有効にします。
重要
このセクションでは、コード例の観点から .NET Framework アプリに焦点を当てています。 .NET Framework で動作する一部のメソッドは、.NET Core SDK では廃止されています。
エラーと例外を診断する
Application Insights には、監視対象のアプリケーションでエラーを診断するのに役立つ、キュレーションされた Application Performance Management エクスペリエンスが用意されています。
詳細な手順については、「 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 によってインターセプトされるため、それらをキャプチャして報告するためのコードを追加する必要があります。
次のようにすることができます。
- 例外ハンドラーに コードを挿入して例外を報告することで、例外を明示的にログに記録します。
- ASP.NET フレームワークを構成して例外を自動的にキャプチャします。 必要な追加は、フレームワークの種類によって異なります。
例外を明示的に報告する
報告する最も簡単な方法は、例外ハンドラーに 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);
}
プロパティと測定値のパラメーターは省略可能ですが、 フィルター処理や 追加情報の追加に役立ちます。 たとえば、複数のゲームを実行できるアプリがある場合は、特定のゲームに関連するすべての例外レポートを見つけることができます。 各ディクショナリに必要な数の項目を追加できます。
ブラウザーの例外
ほとんどのブラウザーの例外が報告されます。
Web ページにコンテンツ配信ネットワークまたはその他のドメインからのスクリプト ファイルが含まれている場合は、スクリプト タグに属性 crossorigin="anonymous"
があり、サーバーが CORS ヘッダーを送信していることを確認します。 この動作により、これらのリソースからハンドルされない JavaScript 例外のスタック トレースと詳細を取得できます。
テレメトリ クライアントを再利用する
メモ
TelemetryClient
を 1 回インスタンス化し、アプリケーションの有効期間中に再利用することをお勧めします。
.NET の依存関係挿入 (DI)、適切な .NET SDK、および DI 用の Application Insights を正しく構成する場合は、コンストラクター パラメーターとしてTelemetryClientを要求できます。
public class ExampleController : ApiController
{
private readonly TelemetryClient _telemetryClient;
public ExampleController(TelemetryClient telemetryClient)
{
_telemetryClient = telemetryClient;
}
}
前の例では、 TelemetryClient
が ExampleController
クラスに挿入されています。
Web フォーム
Web フォームの場合、HTTP モジュールは、 CustomErrors
で構成されたリダイレクトがない場合に例外を収集できます。 ただし、アクティブなリダイレクトがある場合は、Global.asax.csの 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 (ベータ 3 以降) 以降、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
Global.asax.csでグローバル フィルターとしてAiHandleErrorAttribute
を登録します。
public class MyMvcApplication : System.Web.HttpApplication
{
public static void RegisterGlobalFilters(GlobalFilterCollection filters)
{
filters.Add(new AiHandleErrorAttribute());
}
}
MVC 4、MVC 5
FilterConfig.csでグローバル フィルターとして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 (ベータ 3 以降) 以降、Application Insights は、Web API 2 以降のコントローラー メソッドでスローされた未処理の例外を自動的に収集します。 次の例で説明するように、このような例外を追跡するカスタム ハンドラーを以前に追加した場合は、それを削除して、例外の二重追跡を防ぐことができます。
例外フィルターで処理できないケースがいくつかあります。 例えば次が挙げられます。
- コントローラー コンストラクターからスローされる例外。
- メッセージ ハンドラーからスローされる例外。
- ルーティング中にスローされる例外。
- 応答コンテンツのシリアル化中にスローされる例外。
- アプリケーションの起動時にスローされる例外。
- バックグラウンド タスクでスローされる例外。
アプリケーションによって 処理 されるすべての例外は、引き続き手動で追跡する必要があります。 コントローラーから発生するハンドルされない例外は、通常、500 "内部サーバー エラー" 応答になります。 このような応答が、処理された例外の結果として手動で構築された場合、または例外がまったくない場合は、対応する要求テレメトリで 500 ResultCode
追跡されます。 ただし、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
を拡張し、IErrorHandler
とIServiceBehavior
を実装するクラスを追加します。
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 例外の両方が含まれます。
メトリックス エクスプローラー タブを開き、新しいグラフを追加します。 [ パフォーマンス カウンター] で、[ 例外率] を選択します。
.NET Framework は、間隔内の例外の数をカウントし、間隔の長さで割ることによって、レートを計算します。
この数は、Application Insights ポータルで計算された例外数と異なり、レポート TrackException
カウントされます。 サンプリング間隔は異なり、SDK はすべての処理された例外と未処理の例外に対して TrackException
レポートを送信しません。
カスタム メトリック コレクション
Azure Monitor Application Insights .NET SDK と .NET Core SDK には、カスタム メトリックを収集する 2 つの異なる方法があります。
-
TrackMetric()
メソッド。事前集計が不足しています。 - 事前集計を持つ
GetMetric()
メソッド。
集計を使用することをお勧めします。 TrackMetric()
カスタム メトリックを収集する推奨される方法ではなくなりました。 この記事では、 GetMetric()
メソッドとそのしくみの根拠の一部を使用する手順について説明します。
拡張して、事前集計と非事前集計 API の詳細を確認します
TrackMetric()
メソッドは、メトリックを示す未加工のテレメトリを送信します。 値ごとに 1 つのテレメトリ項目を送信するのは非効率的です。
TrackMetric()
メソッドは、すべてのTrackMetric(item)
がテレメトリ初期化子とプロセッサの完全な SDK パイプラインを通過するため、パフォーマンスの面でも非効率的です。
TrackMetric()
とは異なり、GetMetric()
はローカルの事前集計を処理し、集計された概要メトリックのみを 1 分の固定間隔で送信します。 2 番目またはミリ秒レベルでカスタム メトリックを厳密に監視する必要がある場合は、1 分ごとに監視するだけでストレージとネットワーク トラフィックのコストのみが発生します。 この動作により、集計メトリックに対して送信する必要があるテレメトリ項目の合計数が大幅に減るため、調整が発生するリスクも大幅に軽減されます。
Application Insights では、 TrackMetric()
と GetMetric()
を介して収集されたカスタム メトリックは サンプリングの対象になりません。 重要なメトリックをサンプリングすると、それらのメトリックを中心に構築されたアラートが信頼性が低下するシナリオが発生する可能性があります。 カスタム メトリックをサンプリングしない場合、通常、アラートのしきい値に違反するとアラートが発生することを確信できます。 カスタム メトリックはサンプリングされないため、潜在的な懸念事項がいくつかあります。
1 秒おきにメトリックで、またはさらに細かい間隔で傾向を追跡すると、次の結果が得られます。
- データ ストレージ コストの増加。 Azure Monitor に送信するデータの量にはコストがかかります。 送信するデータが多いほど、監視の全体的なコストが高くなります。
- ネットワーク トラフィックまたはパフォーマンスのオーバーヘッドの増加。 一部のシナリオでは、このオーバーヘッドによって、金銭的コストとアプリケーション パフォーマンス コストの両方が発生する可能性があります。
- インジェスト調整のリスク。 Azure Monitor は、アプリが短時間で高率のテレメトリを送信すると、データ ポイントをドロップ ("スロットル") します。
調整は、アラートが見落とされる可能性があるため、懸念事項です。 アラートをトリガーする条件がローカルで発生し、送信されるデータが多すぎるため、インジェスト エンドポイントで削除される可能性があります。 独自のローカル集計ロジックを実装していない限り、.NET と .NET Core に TrackMetric()
を使用することはお勧めしません。 特定の期間にイベントが発生したすべてのインスタンスを追跡しようとしている場合は、 TrackEvent()
の方が適している可能性があります。 カスタム メトリックとは異なり、カスタム イベントはサンプリングの対象となることに注意してください。 独自のローカル事前集計を記述しなくても、 TrackMetric()
を引き続き使用できます。 しかし、そうする場合は、落とし穴に注意してください。
要約すると、事前集計が行われ、すべてのGetMetric()
呼び出しから値が蓄積され、1 分に 1 回要約/集計が送信されるため、Track()
することをお勧めします。
GetMetric()
メソッドは、すべての関連情報を収集しながら送信するデータ ポイントを減らすことで、コストとパフォーマンスのオーバーヘッドを大幅に削減できます。
GetMetric の概要
この例では、基本的な .NET Core 3.1 worker サービス アプリケーションを使用します。 これらの例で使用するテスト環境をレプリケートする場合は、 ワーカー サービスの監視に関する記事の手順 1 から 6 に従います。 次の手順では、基本的なワーカー サービス プロジェクト テンプレートに 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
ループが繰り返し実行されていることがわかります。 1 つのテレメトリ項目が 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"}}}}
この 1 つのテレメトリ項目は、41 個の個別のメトリック測定の集計を表します。 同じ値を何度も繰り返し送信していたため、最大値 (stDev
) と最小値 (0
) のmax
の標準偏差 (min
) があります。
value
プロパティは、集計されたすべての個々の値の合計を表します。
メモ
GetMetric
メソッドでは、最後の値 (gauge
など) の追跡やヒストグラムや分布の追跡はサポートされていません。
ログ (Analytics) エクスペリエンスで Application Insights リソースを調べると、個々のテレメトリ項目は次のスクリーンショットのようになります。
メモ
未加工のテレメトリ項目には、取り込まれた後に明示的な合計プロパティ/フィールドが含まれませんでしたが、作成されます。 この場合、 value
プロパティと valueSum
プロパティの両方が同じものを表します。
また、ポータルの [メトリック] セクションで、 ログ ベースのメトリックとカスタム メトリックの両方としてカスタム メトリック テレメトリにアクセスすることもできます。 次のスクリーンショットは、ログベースのメトリックの例です。
高スループットの使用に関するキャッシュ メトリック リファレンス
メトリック値は、場合によっては頻繁に観察される場合があります。 たとえば、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 ミリ秒に短縮しました。 結果は 772 TrackValue()
呼び出しになります。
多次元メトリック
前のセクションの例は、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 つのフォーム ファクターの 1 つの集計を表します。 前と同様に、 ログ (分析) ビューでさらに詳しく調べることができます。
メトリックス エクスプローラーで、次の手順を実行します。
メトリックを新しいカスタム ディメンションで分割したり、メトリック ビューを使用してカスタム ディメンションを表示したりできないことに注意してください。
既定では、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 Operation
。
TrackMetric()
メソッドまたはその他のTrackXXX()
メソッドは、OperationName
に正しく設定Special 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 個以下の異なる値です。
重要
調整を回避するには、ディメンションのカーディナル値が低い値を使用します。
ディメンションと時系列の上限のコンテキストでは、 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 を使用してカスタム操作を追跡する方法に関するガイダンスを提供します。
概要
操作は、アプリケーションによって実行される論理的な作業です。 名前、開始時刻、期間、結果、ユーザー名、プロパティ、結果などの実行コンテキストがあります。 操作 A が操作 B によって開始された場合、操作 B は A の親として設定されます。1 つの操作には親を 1 つだけ含めることができますが、多くの子操作を含めることができます。 操作とテレメトリの相関関係の詳細については、「 Application Insights テレメトリの相関関係」を参照してください。
Application Insights .NET SDK では、操作は抽象クラス OperationTelemetry とその子孫 RequestTelemetry と DependencyTelemetry によって記述されます。
受信操作の追跡
Application Insights Web SDK は、IIS パイプラインおよびすべての ASP.NET Core アプリケーションで実行される ASP.NET アプリケーションの HTTP 要求を自動的に収集します。 他のプラットフォームやフレームワークには、コミュニティでサポートされているソリューションがあります。 標準またはコミュニティでサポートされているソリューションでアプリケーションがサポートされていない場合は、手動でインストルメント化できます。
カスタム追跡を必要とするもう 1 つの例は、キューから項目を受け取るワーカーです。 一部のキューでは、このキューにメッセージを追加する呼び出しが依存関係として追跡されます。 メッセージ処理を記述する高度な操作は、自動的には収集されません。
このような操作を追跡する方法を見てみましょう。
大まかに言えば、タスクは 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 リソースにテレメトリを送信すると、トランザクション診断エクスペリエンスと Application Map によってトランザクションが表示され、エンドツーエンドでマップされます。 キューの場合、この機能はまだサポートされていません。
Service Bus キュー
トレース情報については、 Azure Service Bus メッセージングによる分散トレースと相関関係に関するページを参照してください。
Azure Storage キュー
次の例は、 Azure Storage キュー の操作を追跡し、プロデューサー、コンシューマー、Azure Storage の間でテレメトリを関連付ける方法を示しています。
ストレージ キューには HTTP API があります。 キューへのすべての呼び出しは、HTTP 要求の Application Insights Dependency Collector によって追跡されます。 既定では、ASP.NET および ASP.NET Core アプリケーションで構成されます。 他の種類のアプリケーションについては、 コンソール アプリケーションのドキュメントを参照してください。
また、Application Insights 操作 ID とストレージ要求 ID を関連付けることもできます。 ストレージ要求クライアントとサーバー要求 ID を設定および取得する方法については、「 Azure Storage の監視、診断、トラブルシューティング」を参照してください。
ストレージ キューは HTTP API をサポートしているため、キューに対するすべての操作は Application Insights によって自動的に追跡されます。 多くの場合、このインストルメンテーションで十分です。 コンシューマー側のトレースをプロデューサー トレースと関連付けるためには、関連付け用 HTTP プロトコルで行う方法と同様に、関連付けコンテキストを渡す必要があります。
この例では、 Enqueue
操作を追跡する方法を示します。 次のようにすることができます。
-
再試行を関連付ける (存在する場合): すべての再試行には、
Enqueue
操作である共通の親が 1 つ存在します。 それ以外の場合は、受信要求の子として追跡されます。 キューに対する複数の論理要求がある場合、再試行の原因となった呼び出しを見つけるのが難しい場合があります。 - ストレージ ログを関連付ける (必要な場合):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
を作成 (および開始) します。 操作名以外のプロパティを割り当てる必要 はありません 。 -
operation.Telemetry.Id
ではなく、メッセージ ペイロードにyourActivity.Id
をシリアル化します。Activity.Current.Id
を使用することもできます。
同様に、他のキュー操作もインストルメント化できます。 ピーク操作は、デキュー操作と同様の方法でインストルメント化する必要があります。 キュー管理操作のインストルメント化は必要ありません。 Application Insights は HTTP などの操作を追跡します。ほとんどの場合、これで十分です。
メッセージ削除をインストルメント化するときは、操作 (関連付け) 識別子を設定してください。 または、 Activity
API を使用することもできます。 Application Insights SDK によって行われるため、テレメトリ項目に操作識別子を設定する必要はありません。
- キューから項目を取得した後、新しい
Activity
を作成します。 -
Activity.SetParentId(message.ParentId)
を使用して、コンシューマー ログとプロデューサー ログを関連付ける。 -
Activity
を開始します。 -
Start/StopOperation
ヘルパーを使用して、デキュー操作、プロセス操作、および削除操作を追跡します。 同じ非同期制御フロー (実行コンテキスト) から実行します。 この方法では、正しく関連付けられます。 -
Activity
を停止します。 -
Start/StopOperation
を使用するか、テレメトリTrack
手動で呼び出します。
依存関係の種類
Application Insights では、依存関係の種類を使用して UI エクスペリエンスをカスタマイズします。 キューでは、トランザクション診断エクスペリエンスを向上させる次の種類のDependencyTelemetry
が認識されます。
-
Azure queue
Azure Storage キュー用 -
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.StartOperation
は DependencyTelemetry
を作成し、関連付けコンテキストを満たします。 たとえば、操作をスケジュールした受信要求によって作成された親操作があるとします。
BackgroundTask
が受信要求と同じ非同期制御フローで開始される限り、その親操作と関連付けられます。
BackgroundTask
入れ子になったすべてのテレメトリ項目は、要求の終了後も、その原因となった要求と自動的に関連付けられます。
操作 (Activity
) が関連付けられていないバックグラウンド スレッドからタスクが開始されると、 BackgroundTask
には親がありません。 ただし、入れ子になった操作を含めることができます。 タスクから報告されたすべてのテレメトリ項目は、BackgroundTask
で作成されたDependencyTelemetry
に関連付けられます。
送信依存関係の追跡
独自の依存関係の種類または Application Insights でサポートされていない操作を追跡できます。
Service Bus キューまたは Storage キュー内の Enqueue
メソッドは、このようなカスタム追跡の例として使用できます。
カスタム依存関係追跡の一般的なアプローチは、次のとおりです。
- 関連付けに必要な
DependencyTelemetry
プロパティとその他のプロパティ (開始、タイムスタンプ、期間など) を満たすTelemetryClient.StartOperation
(拡張) メソッドを呼び出します。 - 名前や必要なその他のコンテキストなど、
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 は使用可能なカウンターのサブセットを収集します。
ヒント
他のメトリックと同様に、カウンターが指定された制限を超えている場合に警告するように アラートを設定 できます。 アラートを設定するには、[ アラート ] ウィンドウを開き、[ アラートの追加] を選択します。
前提条件
パフォーマンス カウンターを Performance Monitor Users グループに追加して、パフォーマンス カウンターを監視するアクセス許可をアプリ プール サービス アカウントに付与します。
net localgroup "Performance Monitor Users" /add "IIS APPPOOL\NameOfYourPool"
カウンターの表示
[メトリック] ウィンドウには、パフォーマンス カウンターの既定のセットが表示されます。
ASP.NET Web アプリケーションの既定のカウンター:
- % プロセス\プロセッサ時間
- % Process\Processor Time Normalized
- Memory\Available Bytes
- ASP.NET Requests/Sec
- .NET 共通言語ランタイム (CLR) 例外が 1 秒ごとにスローされる
- ASP.NET ApplicationsRequest の実行時間
- Process\Private Bytes
- Process\IO Data Bytes/sec
- アプリケーション キュー内のアプリケーションの ASP.NET\要求
- Processor(_Total)\% Processor Time
カウンターを追加する
必要なパフォーマンス カウンターがメトリックの一覧に含まれていない場合は、それを追加できます。
オプション 1: ApplicationInsights.configでの構成
ローカル サーバーで次の PowerShell コマンドを使用して、サーバーで使用できるカウンターを確認します。
Get-Counter -ListSet *
詳細については、
Get-Counter
を参照してください。ApplicationInsights.config
を開きます。開発中に Application Insights をアプリに追加した場合:
- プロジェクト内の
ApplicationInsights.config
を編集します。 - サーバーに再デプロイします。
- プロジェクト内の
パフォーマンス コレクター ディレクティブを編集します。
<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 コンソール アプリケーションのコードでパフォーマンス カウンターを収集する
システム パフォーマンス カウンターを収集して 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 スキーマは、各パフォーマンス カウンターのcategory
、counter
名、および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 メカニズムです。 EventCounters は、Windows、Linux、macOS のすべての OS プラットフォームでサポートされています。 これは、Windows システムでのみサポートされている PerformanceCounters に相当するクロスプラットフォームと考えることができます。
ユーザーはニーズに合わせてカスタム イベント カウンターを発行できますが、 .NET では既定でこれらのカウンターのセットが発行されます。 このドキュメントでは、Azure Application Insights でイベント カウンター (システム定義またはユーザー定義) を収集して表示するために必要な手順について説明します。
ヒント
他のメトリックと同様に、カウンターが指定された制限を超えている場合に警告するように アラートを設定 できます。 アラートを設定するには、[ アラート ] ウィンドウを開き、[ アラートの追加] を選択します。
Application Insights を使用して EventCounters を収集する
Application Insights では、新しくリリースされた NuGet パッケージ EventCounters
の一部であるEventCounterCollectionModule
を使用したの収集がサポートされています。
EventCounterCollectionModule
は、 AspNetCore または WorkerService を使用するときに自動的に有効になります。
EventCounterCollectionModule
は、構成できない収集頻度が 60 秒のカウンターを収集します。 EventCounters を収集するために特別なアクセス許可は必要ありません。 ASP.NET Core アプリケーションの場合は、 Microsoft.ApplicationInsights.AspNetCore パッケージも追加する必要があります。
dotnet add package Microsoft.ApplicationInsights.EventCounterCollector
dotnet add package Microsoft.ApplicationInsights.AspNetCore
収集される既定のカウンター
2.15.0 バージョンの AspNetCore SDK または WorkerService SDK 以降では、既定ではカウンターは収集されません。 モジュール自体が有効になっているため、ユーザーは必要なカウンターを追加して収集できます。
.NET ランタイムによって発行された既知のカウンターの一覧を取得するには、「 使用可能なカウンター」 ドキュメントを参照してください。
収集するカウンターのカスタマイズ
次の例は、カウンターを追加または削除する方法を示しています。 このカスタマイズは、 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);
WorkerService 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 を参照してください。
Application Insights SDK を構成する
このセクションでは...
- テレメトリ チャネル
- テレメトリ モジュール
- テレメトリを無効にする
- テレメトリ初期化子
- テレメトリ プロセッサ
- ApplicationId プロバイダー
- スナップショット コレクション
- サンプリング
- HTTP 経由でのエンリッチと関連付け
Application Insights SDK for ASP.NET と ASP.NET Core をカスタマイズして、既定の構成を変更できます。
Application Insights .NET SDK は、多くの NuGet パッケージで構成されています。 コア パッケージは、Application Insights にテレメトリを送信するための API を提供します。 その他のパッケージ には、アプリケーションとそのコンテキストからのテレメトリを自動的に追跡するためのテレメトリ モジュール と 初期化子 が用意されています。 構成ファイルを調整することで、テレメトリ モジュールと初期化子を有効または無効にすることができます。 また、一部のパラメーターを設定することもできます。
構成ファイルには、 ApplicationInsights.config
または ApplicationInsights.xml
という名前が付けられます。 名前は、アプリケーションの種類によって異なります。
ほとんどのバージョンの SDK をインストールすると、プロジェクトに自動的に追加されます。
既定では、 Add>Application Insights Telemetry をサポートする Visual Studio テンプレート プロジェクトの自動エクスペリエンスを使用すると、 ApplicationInsights.config
ファイルがプロジェクト のルート フォルダーに作成されます。 コンパイル後、bin フォルダーにコピーされます。 また、 IIS サーバー上の Application Insights エージェントによって Web アプリにも追加されます。
重要
Azure Web サイトの拡張機能、または Azure VM と仮想マシン スケール セットの拡張機能が使用されている場合、構成ファイルは無視されます。
Web ページに SDK を制御する同等のファイルはありません。
テレメトリ チャネル
テレメトリ チャネルは、 Application Insights SDK の不可欠な部分です。 Application Insights サービスへのテレメトリのバッファリングと送信を管理します。 SDK の .NET バージョンと .NET Core バージョンには、 InMemoryChannel
と ServerTelemetryChannel
の 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 以外の環境では、有効な場所を指定する必要があります。または、テレメトリがローカル ディスクに格納されません。
どのチャネルを使用する必要がありますか?
実行時間の長いアプリケーションを含むほとんどの運用シナリオでは、 ServerTelemetryChannel
することをお勧めします。 テレメトリのフラッシュの詳細については、Flush()
の使用に関するページを参照してください。
Flush() を使用する場合
Flush()
メソッドは、バッファーに格納されたテレメトリを直ちに送信します。 ただし、特定のシナリオでのみ使用する必要があります。
次の場合に Flush()
を使用します。
- アプリケーションがシャットダウンされようとしており、終了する前にテレメトリが確実に送信されるようにする必要があります。
- 例外ハンドラーを使用していて、テレメトリが配信されていることを保証する必要があります。
- すぐに終了するバックグラウンド ジョブや CLI ツールのような有効期間の短いプロセスを記述しています。
Web サービスなどの実行時間の長いアプリケーションでは、 Flush()
を使用しないでください。 SDK は、バッファリングと転送を自動的に管理します。
Flush()
を不必要に呼び出すとパフォーマンスの問題が発生する可能性があり、特に同期的にフラッシュされないServerTelemetryChannel
を使用する場合は、すべてのデータが送信されるとは限りません。
テレメトリ モジュール
Application Insights では、ユーザーによる手動の追跡を必要とせずに特定のワークロードに関するテレメトリが自動収集されます。
既定では、次の自動収集モジュールが有効になります。 それらを無効にするか構成して、既定の動作を変更できます。
各テレメトリ モジュールは、特定の種類のデータを収集し、コア API を使用してデータを送信します。 モジュールは異なる NuGet パッケージによってインストールされ、必要な行も .config ファイルに追加されます。
Area | 説明 |
---|---|
要求の追跡 | 受信 Web 要求の要求テレメトリ (応答時間、結果コード) を収集します。 モジュール: Microsoft.ApplicationInsights.Web.RequestTrackingTelemetryModule NuGet:Microsoft.ApplicationInsights.Web |
依存関係の追跡 | 送信依存関係 (HTTP 呼び出し、SQL 呼び出し) に関するテレメトリを収集します。 IIS で作業するには、 Application Insights エージェントをインストールします。
TrackDependency API を使用してカスタム依存関係の追跡を記述することもできます。
App Service と VM/VMSS の監視を使用した自動侵入をサポートします。 モジュール: 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/VMSS) | 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 |
例外追跡 (Unobserved/Unhandled) | ワーカー ロール、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 パッケージによって異なります。
テレメトリを無効にする
各モジュールの構成ファイルにノードがあります。 モジュールを無効にするには、ノードを削除するか、コメント アウトします。
テレメトリ初期化子
テレメトリを追加情報で強化したり、標準のテレメトリ モジュールによって設定されたテレメトリ プロパティをオーバーライドしたりするには、テレメトリ初期化子を使用します。
テレメトリ初期化子は、テレメトリのすべての項目と共に送信されるコンテキスト プロパティを設定します。
独自の 初期化子を記述 して、コンテキスト プロパティを設定できます。
標準初期化子はすべて、Web パッケージまたは WindowsServer NuGet パッケージによって設定されます。
初期化 子 | 説明 |
---|---|
AccountIdTelemetryInitializer |
AccountId プロパティを設定します。 |
AuthenticatedUserIdTelemetryInitializer |
JavaScript SDK によって設定された AuthenticatedUserId プロパティを設定します。 |
AzureRoleEnvironmentTelemetryInitializer |
Azure ランタイム環境から抽出された情報を使用して、すべてのテレメトリ項目のRoleName コンテキストのRoleInstance プロパティとDevice プロパティを更新します。 |
BuildInfoConfigComponentVersionTelemetryInitializer |
MS Build によって生成されたVersion ファイルから抽出された値を使用して、すべてのテレメトリ項目のComponent コンテキストのBuildInfo.config プロパティを更新します。 |
ClientIpHeaderTelemetryInitializer |
要求のIp HTTP ヘッダーに基づいて、すべてのテレメトリ項目のLocation コンテキストのX-Forwarded-For プロパティを更新します。 |
DeviceTelemetryInitializer |
すべてのテレメトリ項目の Device コンテキストの次のプロパティを更新します。• Type は PC に設定されています。• Id は、Web アプリケーションが実行されているコンピューターのドメイン名に設定されます。• OemName は、WMI を使用して Win32_ComputerSystem.Manufacturer フィールドから抽出された値に設定されます。• Model は、WMI を使用して Win32_ComputerSystem.Model フィールドから抽出された値に設定されます。• NetworkType は、 NetworkInterface プロパティから抽出された値に設定されます。• Language は、 CurrentCulture プロパティの名前に設定されます。 |
DomainNameRoleInstanceTelemetryInitializer |
すべてのテレメトリ項目のRoleInstance コンテキストのDevice プロパティを、Web アプリケーションが実行されているコンピューターのドメイン名で更新します。 |
OperationNameTelemetryInitializer |
HTTP メソッドに基づいて、Name のRequestTelemetry プロパティと、すべてのテレメトリ項目のName コンテキストのOperation プロパティ、および要求を処理するために呼び出された ASP.NET MVC コントローラーとアクションの名前を更新します。 |
OperationIdTelemetryInitializer または OperationCorrelationTelemetryInitializer |
自動的に生成されたOperation.Id を使用して要求の処理中に追跡されたすべてのテレメトリ項目のRequestTelemetry.Id コンテキスト プロパティを更新します。 |
SessionTelemetryInitializer |
ユーザーのブラウザーで実行されている Id JavaScript インストルメンテーション コードによって生成されたSession Cookie から抽出された値を使用して、すべてのテレメトリ項目のai_session コンテキストのApplicationInsights プロパティを更新します。 |
SyntheticTelemetryInitializer または SyntheticUserAgentTelemetryInitializer |
可用性テストや検索エンジン ボットなど、合成ソースからの要求を処理するときに追跡されるすべてのテレメトリ項目の User 、 Session 、および 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 ページ を参照してください。
ASP.NET アプリケーションでテレメトリ初期化子を使用する方法については、「 Application Insights SDK でのテレメトリのフィルター処理と前処理」を参照してください。
テレメトリ プロセッサ
テレメトリ プロセッサは、SDK からポータルに送信される前に、各テレメトリ項目をフィルター処理および変更できます。
ASP.NET アプリケーションでテレメトリ プロセッサを使用する方法については、「 Application Insights SDK でのテレメトリのフィルター処理と前処理」を参照してください。
独自のテレメトリ プロセッサを記述できます。
アダプティブ サンプリング テレメトリ プロセッサ (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>
接続文字列
この設定により、データが表示される 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 は、 RequestTelemetry
と DependencyTelemetry
に含まれており、ポータルでの相関関係の決定に使用されます。
この機能は、 TelemetryConfiguration.ApplicationIdProvider
を設定することで使用できます。
インターフェイス: IApplicationIdProvider
public interface IApplicationIdProvider
{
bool TryGetApplicationId(string instrumentationKey, out string applicationId);
}
Microsoft.ApplicationInsights SDK には、ApplicationInsightsApplicationIdProvider
とDictionaryApplicationIdProvider
の 2 つの実装が用意されています。
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 のペアに依存します。
このクラスには、インストルメンテーション キーとアプリケーション ID のペアのDefined
である 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 アプリのスナップショット デバッガーを有効にする」を参照してください。
サンプリング
コア アプリケーションの ASP.NET と ASP.NET のサンプリングを構成する方法については、「 Application Insights でのサンプリング」を参照してください。
HTTP を使用してデータを強化する
var requestTelemetry = HttpContext.Current?.Items["Microsoft.ApplicationInsights.RequestTelemetry"] as RequestTelemetry;
if (requestTelemetry != null)
{
requestTelemetry.Properties["myProp"] = "someData";
}
クライアント側の監視を追加します。
前のセクションでは、サーバー側の監視を自動および手動で構成する方法に関するガイダンスを提供しました。 クライアント側の監視を追加するには、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 ローダーのスクリプトベースのセットアップ手順に従います。
トラブルシューティング
専用のトラブルシューティングに関する記事をご覧ください。
Visual Studio 2019 には、.NET Framework ベースのアプリで、インストルメンテーション キーまたは接続文字列をユーザー シークレットに格納すると壊れるという既知の問題があります。 このバグを回避するには、最終的にキーを applicationinsights.config ファイルにハードコードする必要があります。 この記事は、ユーザー シークレットを使用しないことで、この問題を完全に回避することを目的としています。
アプリケーション ホストとインジェスト サービスの間の接続をテストする
Application Insights SDK とエージェントからテレメトリが送信され、インジェスト エンドポイントへの REST 呼び出しとして取り込まれます。 Web サーバーまたはアプリケーション ホスト マシンからインジェスト サービス エンドポイントへの接続は、PowerShell の生の REST クライアントを使用するか、curl コマンドを使用してテストできます。 「Azure Monitor Application Insights でアプリケーション テレメトリが見つからない場合のトラブルシューティング」をご覧ください。
オープンソース SDK
最新の更新プログラムとバグ修正については、リリース ノートを参照してください。
リリース ノート
バージョン 2.12 以降: .NET ソフトウェア開発キット (SDK) (ASP.NET、ASP.NET Core、ログ アダプターを含む)
Application Insights の主な機能強化は、サービスの更新に関するページでも要約しています。
次のステップ
- よく寄せられる質問 (FAQ) を確認するには、「 Applications Insights for ASP.NET FAQ 」および「 Application Insights for ASP.NET Core FAQ」を参照してください。
- サポートされているバージョンの Application Insights SDK を実行していることを確認します。
- Application Insights の種類と データ モデル のデータ モデルを参照してください。
- 代理トランザクションを追加して、可用性監視を使用して、世界中から Web サイトが利用可能であることをテストします。
- Application Insights での テレメトリの相関関係 の基本について説明します。
- テレメトリを関連付ける方法については、 System.Diagnostics.Activity ユーザー ガイド を参照してください。
- スナップショット コレクションを構成して、例外がスローされたときのソース コードと変数の状態を確認します。
- API を使用して、アプリのパフォーマンスと使用の詳細を表示するための独自のイベントとメトリックスを送信します。