注意事項
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);
}
性能カウンター
ASP.NET はパフォーマンス カウンターを完全にサポートしますが、ASP.NET Core では SDK のバージョンとホスティング環境に応じて制限付きのサポートが提供されます。 詳細については、「Application Insights の .NET のカウンター」を参照してください。
イベント カウンター
Application Insights では、 EventCounterCollectionModule
を使用した EventCounters の収集がサポートされています。これは、ASP.NET Core に対して既定で有効になっています。 収集するカウンターの一覧を構成する方法については、「 Application Insights の .NET のカウンター」を参照してください。
SDK の構成と調整
このセクションでは...
- Application Insighs SDK を構成する
- テレメトリ初期化子
- テレメトリ プロセッサ
- サンプリング
- 既定の TelemetryModules を構成または削除する
- HTTP 経由でのエンリッチと関連付け
Application Insights SDK を構成する
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 を制御する同等のファイルはありません。
この記事では、構成ファイルに表示されるセクション、SDK のコンポーネントを制御する方法、およびそれらのコンポーネントを読み込む NuGet パッケージについて説明します。
テレメトリ モジュール
各テレメトリ モジュールは、特定の種類のデータを収集し、コア API を使用してデータを送信します。 モジュールは異なる NuGet パッケージによってインストールされ、必要な行も .config ファイルに追加されます。
各モジュールの構成ファイルにノードがあります。 モジュールを無効にするには、ノードを削除するか、コメント アウトします。
モジュール | 説明 |
---|---|
依存関係の追跡:DependencyCollector |
アプリがデータベースと外部サービスとデータベースに対して行う呼び出しに関するテレメトリを収集します。 このモジュールを IIS サーバーで動作させるには、 Application Insights エージェントをインストールする必要があります。
TrackDependency API を使用して、独自の依存関係追跡コードを記述することもできます。 • Microsoft.ApplicationInsights.DependencyCollector.DependencyTrackingTelemetryModule • Microsoft.ApplicationInsights.DependencyCollector NuGet パッケージ エージェント ベースの (コードレス) アタッチを使用して、コードを変更せずに依存関係を自動収集できます。 Azure Web アプリで使用するには、 Application Insights 拡張機能を有効にします。 Azure VM または Azure 仮想マシン スケール セットで使用するには、 VM と仮想マシン スケール セットのアプリケーション監視拡張機能を有効にします。 |
パフォーマンス コレクター:PerformanceCollectorModule |
IIS のインストールから CPU、メモリ、ネットワーク負荷などのシステム パフォーマンス カウンターを収集します。 自分で設定したパフォーマンス カウンターなど、収集するカウンターを指定できます。 • Microsoft.ApplicationInsights.Extensibility.PerfCounterCollector.PerformanceCollectorModule • Microsoft.ApplicationInsights.PerfCounterCollector NuGet パッケージ |
診断テレメトリ:DiagnosticsTelemetryModule |
Application Insights インストルメンテーション コード自体のエラーを報告します。 たとえば、コードがパフォーマンス カウンターにアクセスできない場合や、 ITelemetryInitializer が例外をスローする場合です。 このモジュールによって追跡されたトレース テレメトリが 診断検索に表示されます。• Microsoft.ApplicationInsights.Extensibility.Implementation.Tracing.DiagnosticsTelemetryModule • Microsoft.ApplicationInsights NuGet パッケージ。 このパッケージのみをインストールした場合、ApplicationInsights.config ファイルは自動的に作成されません。 |
開発者モード:DeveloperModeWithDebuggerAttachedTelemetryModule |
デバッガーがアプリケーション プロセスにアタッチされている場合、Application Insights TelemetryChannel は、一度に 1 つのテレメトリ項目ですぐにデータを送信するように強制します。 この設計により、アプリケーションがテレメトリを追跡してから Application Insights ポータルに表示するまでの時間が短縮されます。 CPU とネットワーク帯域幅に大きなオーバーヘッドが発生します。• Microsoft.ApplicationInsights.WindowsServer.DeveloperModeWithDebuggerAttachedTelemetryModule • Application Insights Windows Server NuGet パッケージ |
Web 要求の追跡:Web.RequestTrackingTelemetryModule |
HTTP 要求の応答時間と結果コードを報告します。 • Microsoft.ApplicationInsights.Web.RequestTrackingTelemetryModule • Microsoft.ApplicationInsights.Web NuGet パッケージ |
例外の追跡:ExceptionTrackingTelemetryModule |
Web アプリのハンドルされない例外を追跡します。 詳細については、「 エラーと例外」を参照してください。 • Microsoft.ApplicationInsights.Web.ExceptionTrackingTelemetryModule 。• Microsoft.ApplicationInsights.Web NuGet パッケージ。 • Microsoft.ApplicationInsights.WindowsServer.UnobservedExceptionTelemetryModule :観察されていないタスクを追跡します。 例外。• Microsoft.ApplicationInsights.WindowsServer.UnhandledExceptionTelemetryModule : worker ロール、Windows サービス、コンソール アプリケーションのハンドルされない例外を追跡します。• Application Insights Windows Server NuGet パッケージ。 |
EventSource の追跡:EventSourceTelemetryModule |
トレースとして Application Insights に送信される EventSource イベントを構成できます。 EventSource イベントの追跡については、「 EventSource イベントの使用」を参照してください。 • Microsoft.ApplicationInsights.EventSourceListener.EventSourceTelemetryModule • Microsoft.ApplicationInsights.EventSourceListener |
ETW イベント追跡:EtwCollectorTelemetryModule |
トレースとして Application Insights に送信される ETW プロバイダーからのイベントを構成できます。 ETW イベントの追跡については、「 ETW イベントの使用」を参照してください。 • Microsoft.ApplicationInsights.EtwCollector.EtwCollectorTelemetryModule • Microsoft.ApplicationInsights.EtwCollector |
Application Insights パッケージ:Microsoft.ApplicationInsights |
SDK の コア API を提供します。 他のテレメトリ モジュールでは、この API を使用します。 また、 それを使用して独自のテレメトリを定義することもできます。 • ApplicationInsights.configにエントリがありません。 • Microsoft.ApplicationInsights NuGet パッケージ。 この NuGet をインストールするだけでは、.config ファイルは生成されません。 |
テレメトリ チャネル
テレメトリ チャネルは、Application Insights サービスへのテレメトリのバッファリングと転送を管理します。
-
Microsoft.ApplicationInsights.WindowsServer.TelemetryChannel.ServerTelemetryChannel
は、Web アプリケーションの既定のチャネルです。 メモリ内のデータをバッファーし、再試行メカニズムとローカル ディスク ストレージを使用して、より信頼性の高いテレメトリ配信を実現します。 -
Microsoft.ApplicationInsights.InMemoryChannel
は軽量テレメトリ チャネルです。 これは、他のチャネルが構成されていない場合に使用されます。
テレメトリ初期化子
テレメトリ初期化子は、テレメトリのすべての項目と共に送信されるコンテキスト プロパティを設定します。
独自の 初期化子を記述 して、コンテキスト プロパティを設定できます。
標準初期化子はすべて、Web パッケージまたは WindowsServer NuGet パッケージによって設定されます。
初期化 子 | 説明 |
---|---|
AccountIdTelemetryInitializer |
AccountId プロパティを設定します。 |
AuthenticatedUserIdTelemetryInitializer |
JavaScript SDK によって設定された AuthenticatedUserId プロパティを設定します。 |
AzureRoleEnvironmentTelemetryInitializer |
Azure ランタイム環境から抽出された情報を使用して、すべてのテレメトリ項目のDevice コンテキストのRoleName プロパティとRoleInstance プロパティを更新します。 |
BuildInfoConfigComponentVersionTelemetryInitializer |
MS Build によって生成されたBuildInfo.config ファイルから抽出された値を使用して、すべてのテレメトリ項目のComponent コンテキストのVersion プロパティを更新します。 |
ClientIpHeaderTelemetryInitializer |
要求のX-Forwarded-For HTTP ヘッダーに基づいて、すべてのテレメトリ項目のLocation コンテキストのIp プロパティを更新します。 |
DeviceTelemetryInitializer |
すべてのテレメトリ項目の Device コンテキストの次のプロパティを更新します。• Type は PC に設定されています。• Id は、Web アプリケーションが実行されているコンピューターのドメイン名に設定されます。• OemName は、WMI を使用して Win32_ComputerSystem.Manufacturer フィールドから抽出された値に設定されます。• Model は、WMI を使用して Win32_ComputerSystem.Model フィールドから抽出された値に設定されます。• NetworkType は、 NetworkInterface プロパティから抽出された値に設定されます。• Language は、 CurrentCulture プロパティの名前に設定されます。 |
DomainNameRoleInstanceTelemetryInitializer |
すべてのテレメトリ項目のDevice コンテキストのRoleInstance プロパティを、Web アプリケーションが実行されているコンピューターのドメイン名で更新します。 |
OperationNameTelemetryInitializer |
HTTP メソッドに基づいて、RequestTelemetry のName プロパティと、すべてのテレメトリ項目のOperation コンテキストのName プロパティ、および要求を処理するために呼び出された ASP.NET MVC コントローラーとアクションの名前を Udate します。 |
OperationIdTelemetryInitializer または OperationCorrelationTelemetryInitializer |
自動的に生成されたRequestTelemetry.Id を使用して要求の処理中に追跡されたすべてのテレメトリ項目のOperation.Id コンテキスト プロパティを更新します。 |
SessionTelemetryInitializer |
ユーザーのブラウザーで実行されている ApplicationInsights JavaScript インストルメンテーション コードによって生成されたai_session Cookie から抽出された値を使用して、すべてのテレメトリ項目のSession コンテキストのId プロパティを更新します。 |
SyntheticTelemetryInitializer または SyntheticUserAgentTelemetryInitializer |
可用性テストや検索エンジン ボットなど、合成ソースからの要求を処理するときに追跡されるすべてのテレメトリ項目の User 、 Session 、および Operation コンテキスト プロパティを更新します。 既定では、 メトリック ス エクスプローラー には合成テレメトリは表示されません。<Filters> 要求の識別プロパティを設定します。 |
UserTelemetryInitializer |
ユーザーのブラウザーで実行されている Application Insights JavaScript インストルメンテーション コードによって生成されたai_user Cookie から抽出された値を使用して、すべてのテレメトリ項目のUser コンテキストのId プロパティとAcquisitionDate プロパティを更新します。 |
WebTestTelemetryInitializer |
可用性テストからの HTTP 要求のユーザー ID、セッション ID、および合成ソース のプロパティを設定します。<Filters> 要求の識別プロパティを設定します。 |
Azure Service Fabric で実行されている .NET アプリケーションの場合は、 Microsoft.ApplicationInsights.ServiceFabric
NuGet パッケージを含めることができます。 このパッケージには、Service Fabric プロパティをテレメトリ項目に追加する FabricTelemetryInitializer
プロパティが含まれています。 詳細については、この NuGet パッケージによって追加されるプロパティに関する GitHub ページ を参照してください。
テレメトリ プロセッサ
テレメトリ プロセッサは、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 プロバイダー
プロバイダーは 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 のペアのDictionary<string,string>
である Defined
プロパティがあります。
このクラスには省略可能なプロパティ 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 アプリケーションでテレメトリ初期化子を使用する方法については、「 Application Insights SDK でのテレメトリのフィルター処理と前処理」を参照してください。
テレメトリ プロセッサ
ASP.NET アプリケーションでテレメトリ プロセッサを使用する方法については、「 Application Insights SDK でのテレメトリのフィルター処理と前処理」を参照してください。
サンプリング
ASP.NET アプリケーションのサンプリングを構成する方法については、「 Application Insights でのサンプリング」を参照してください。
既定の TelemetryModules を構成または削除する
Application Insights では、ユーザーによる手動の追跡を必要とせずに特定のワークロードに関するテレメトリが自動収集されます。
既定では、次の自動収集モジュールが有効になります。 これらのモジュールでは、自動的にテレメトリが収集されます。 それらを無効にするか構成して、既定の動作を変更できます。
-
RequestTrackingTelemetryModule
: 受信 Web 要求から RequestTelemetry を収集します。 -
DependencyTrackingTelemetryModule
: 送信 HTTP 呼び出しと SQL 呼び出しから DependencyTelemetry を収集します。 -
PerformanceCollectorModule
: Windows PerformanceCounters を収集します。 -
QuickPulseTelemetryModule
: [ライブ メトリック] ペイン内に表示するテレメトリを収集します。 -
AppServicesHeartbeatTelemetryModule
: アプリケーションがホストされる App Service 環境について、(カスタム メトリックとして送信される) ハート ビートを収集します。 -
AzureInstanceMetadataTelemetryModule
: アプリケーションがホストされる Azure VM 環境について、(カスタム メトリックとして送信される) ハート ビートを収集します。 -
EventCounterCollectionModule
: EventCounters を収集します。 このモジュールは新機能であり、SDK バージョン 2.8.0 以降で使用できます。
ASP.NET アプリケーションのテレメトリ モジュールを構成または削除する方法については、「 ApplicationInsights.config または .xmlを使用して Application Insights SDK を構成 する」を参照してください。
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 の主な機能強化は、サービスの更新に関するページでも要約しています。
次のステップ
- サポートされているバージョンの Application Insights SDK を実行していることを確認します。
- 代理トランザクションを追加して、可用性監視を使用して、世界中から Web サイトが利用可能であることをテストします。
- テレメトリ トラフィックとデータ ストレージのコストを削減するために、サンプリングを構成します。
- ユーザー フローの探索: ユーザーがアプリ内をどのように移動しているかを把握します。
- スナップショット コレクションを構成して、例外がスローされたときのソース コードと変数の状態を確認します。
- API を使用して、アプリのパフォーマンスと使用の詳細を表示するための独自のイベントとメトリックスを送信します。
- よく寄せられる質問 (FAQ) を確認するには、「 Applications Insights for ASP.NET FAQ」を参照してください。