アプリケーション マップ:分散アプリケーションのトリアージApplication Map: Triage Distributed Applications

アプリケーション マップを使用すると、分散アプリケーションのすべてのコンポーネントを対象にパフォーマンスのボトルネックや障害のホットスポットを特定できます。Application Map helps you spot performance bottlenecks or failure hotspots across all components of your distributed application. マップ上の各ノードは、アプリケーション コンポーネントまたはその依存関係を表すと共に、正常性の KPI やアラートの状態を保持しています。Each node on the map represents an application component or its dependencies; and has health KPI and alerts status. 任意のコンポーネントをクリックして、さらに詳しい診断結果 (Application Insights イベントなど) にアクセスすることができます。You can click through from any component to more detailed diagnostics, such as Application Insights events. アプリで Azure サービスを使用している場合は、Azure Diagnostics (SQL Database アドバイザーのアドバイス情報など) をクリックすることもできます。If your app uses Azure services, you can also click through to Azure diagnostics, such as SQL Database Advisor recommendations.

コンポーネントとはWhat is a Component?

コンポーネントは、分散/マイクロサービス アプリケーションの、個別にデプロイできる部分です。Components are independently deployable parts of your distributed/microservices application. 開発者と運用チームには、これらのアプリケーション コンポーネントによって生成されたテレメトリに対して、コード レベルの可視性またはアクセスがあります。Developers and operations teams have code-level visibility or access to telemetry generated by these application components.

  • コンポーネントは、チームや組織が (コードやテレメトリに) アクセスできない可能性がある SQL や EventHub などの "観察される" 外部依存関係とは異なります。Components are different from "observed" external dependencies such as SQL, EventHub etc. which your team/organization may not have access to (code or telemetry).
  • コンポーネントは、任意の数のサーバー/ロール/コンテナーのインスタンス上で実行されます。Components run on any number of server/role/container instances.
  • コンポーネントは、個別の Application Insights インストルメンテーション キーである場合も (サブスクリプションが異なる場合も)、単一の Application Insights インストルメンテーション キーにレポートするさまざまなロールである場合もあります。Components can be separate Application Insights instrumentation keys (even if subscriptions are different) or different roles reporting to a single Application Insights instrumentation key. プレビュー マップのエクスペリエンスには、各コンポーネントがその設定方法に関係なく表示されます。The preview map experience shows the components regardless of how they are set up.

複合アプリケーション マップComposite Application Map

関連するアプリケーション コンポーネントの階層を横断的に見ながら完全なアプリケーション トポロジを表示できます。You can see the full application topology across multiple levels of related application components. コンポーネントとしては、さまざまな Application Insights リソースや、単一のリソースに含まれる各種ロールが該当します。Components could be different Application Insights resources, or different roles in a single resource. アプリ マップでは、Application Insights SDK がインストールされているサーバー間での HTTP 依存関係呼び出しに従ってコンポーネントを検索します。The app map finds components by following HTTP dependency calls made between servers with the Application Insights SDK installed.

このエクスペリエンスでは、最初にコンポーネントが順次検出されます。This experience starts with progressive discovery of the components. アプリケーション マップを初めて読み込むとき、一連のクエリがトリガーされて、対象コンポーネントに関連したコンポーネントが検出されます。When you first load the application map, a set of queries is triggered to discover the components related to this component. 左上隅のボタンには、対象アプリケーション内のコンポーネント数が表示され、その数は、コンポーネントが検出されるにつれて更新されます。A button at the top-left corner will update with the number of components in your application as they are discovered.

[マップ コンポーネントの更新] をクリックすると、その時点で検出されたすべてのコンポーネントでマップが更新されます。On clicking "Update map components", the map is refreshed with all components discovered until that point. アプリケーションの複雑さによっては、読み込みに数分かかることがあります。Depending on the complexity of your application, this may take a minute to load.

すべてのコンポーネントが 1 つの Application Insights リソース内のロールである場合、この検出ステップは不要です。If all of the components are roles within a single Application Insights resource, then this discovery step is not required. そのようなアプリケーションでは、そのすべてのコンポーネントが初回読み込みで認識されます。The initial load for such an application will have all its components.

アプリケーション マップのスクリーンショット

このエクスペリエンスが目指す主な目的の 1 つは、何百というコンポーネントを含む複雑なトポロジを視覚化することです。One of the key objectives with this experience is to be able to visualize complex topologies with hundreds of components.

いずれかのコンポーネントをクリックすると、関連する分析情報を表示したり、そのコンポーネントについてのパフォーマンスと障害のトリアージ機能にアクセスしたりすることができます。Click on any component to see related insights and go to the performance and failure triage experience for that component.

ポップアップ

エラーを調査するInvestigate failures

[investigate failures] (エラーの調査) を選択すると、[failures] ウィンドウが開きます。Select investigate failures to launch the failures pane.

[investigate failures] (エラーの調査) ボタンのスクリーンショット

[failures] エクスペリエンスのスクリーンショット

パフォーマンスを調査するInvestigate performance

パフォーマンスの問題のトラブルシューティングを行うには、パフォーマンスの調査 を選択します。To troubleshoot performance problems, select investigate performance.

[investigate performance] (パフォーマンスの調査) ボタンのスクリーンショット

[performance] (パフォーマンス) エクスペリエンスのスクリーンショット

詳細の表示Go to details

呼び出し履歴レベルまでのビューを提供できるエンドツーエンドのトランザクション エクスペリエンスの詳細を表示するには、 [詳細に移動] を選択します。Select go to details to explore the end-to-end transaction experience, which can offer views down to the call stack level.

[go-to-details] (詳細の表示) ボタンのスクリーンショット

[end-to-end transaction details] (エンドツーエンドのトランザクションの詳細) のスクリーンショット

ログの表示 (Analytics)View Logs (Analytics)

さらにアプリケーション データのクエリと調査を行うには、Analytics で表示 (Analytics) をクリックします。To query and investigate your applications data further, click view in Logs (Analytics).

[view in analytics] (Analytics で表示) ボタンのスクリーンショット

Analytics エクスペリエンスのスクリーンショット。

警告Alerts

アクティブなアラートと、アラートがトリガーされる原因になっている元のルールを表示するには、アラート を選択します。To view active alerts and the underlying rules that cause the alerts to be triggered, select alerts.

[alerts] (アラート) ボタンのスクリーンショット

Analytics エクスペリエンスのスクリーンショット

クラウド ロール名の設定Set cloud role name

アプリケーション マップでは、クラウド ロール名プロパティを使用して、マップ上のコンポーネントが識別されます。Application Map uses the cloud role name property to identify the components on the map. Application Insights SDK では、コンポーネントで生成されたテレメトリにクラウド ロール名プロパティが自動的に追加されます。The Application Insights SDK automatically adds the cloud role name property to the telemetry emitted by components. たとえば、SDK では、Web サイト名またはサービス ロール名がクラウド ロール名プロパティに追加されます。For example, the SDK will add a web site name or service role name to the cloud role name property. ただし、既定値をオーバーライドする必要のある場合があります。However, there are cases where you may want to override the default value. クラウド ロール名をオーバーライドし、アプリケーション マップ上に表示される内容を変更するには、次のようにします。To override cloud role name and change what gets displayed on the Application Map:

.NET/.NET Core.NET/.NET Core

以下のようにカスタム TelemetryInitializer を作成します。Write custom TelemetryInitializer as below.

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

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

ASP.NET アプリ: アクティブな TelemetryConfiguration に初期化子を読み込むASP.NET apps: Load initializer to the active TelemetryConfiguration

ApplicationInsights.config:In ApplicationInsights.config :

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

ASP.NET Web アプリのもう 1 つの方法は、Global.aspx.cs などのコード内で初期化子をインスタンス化することです。An alternate method for ASP.NET Web apps is to instantiate the initializer in code, for example in Global.aspx.cs:

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

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

注意

ApplicationInsights.config または TelemetryConfiguration.Active を使用して初期化子を追加することは、ASP.NET Core アプリケーションでは無効です。Adding initializer using ApplicationInsights.config or using TelemetryConfiguration.Active is not valid for ASP.NET Core applications.

ASP.NET Core アプリ: アクティブな TelemetryConfiguration に初期化子を読み込むASP.NET Core apps: Load initializer to the TelemetryConfiguration

ASP.NET Core アプリケーションの場合、新しい TelemetryInitializer を追加するには、次に示すように Dependency Injection コンテナーに追加します。For ASP.NET Core applications, adding a new TelemetryInitializer is done by adding it to the Dependency Injection container, as shown below. これは Startup.cs クラスの ConfigureServices メソッドで行われます。This is done in ConfigureServices method of your Startup.cs class.

 using Microsoft.ApplicationInsights.Extensibility;
 using CustomInitializer.Telemetry;
 public void ConfigureServices(IServiceCollection services)
{
    services.AddSingleton<ITelemetryInitializer, MyTelemetryInitializer>();
}

Node.jsNode.js

var appInsights = require("applicationinsights");
appInsights.setup('INSTRUMENTATION_KEY').start();
appInsights.defaultClient.context.tags["ai.cloud.role"] = "your role name";
appInsights.defaultClient.context.tags["ai.cloud.roleInstance"] = "your role instance";

Node.js の別の方法Alternate method for Node.js

var appInsights = require("applicationinsights");
appInsights.setup('INSTRUMENTATION_KEY').start();

appInsights.defaultClient.addTelemetryProcessor(envelope => {
    envelope.tags["ai.cloud.role"] = "your role name";
    envelope.tags["ai.cloud.roleInstance"] = "your role instance"
});

JavaJava

Application Insights Java SDK 2.5.0 以降では、ApplicationInsights.xml ファイルに <RoleName> を追加することで、クラウド ロール名を指定できます。例:Starting with Application Insights Java SDK 2.5.0, you can specify the cloud role name by adding <RoleName> to your ApplicationInsights.xml file, e.g.

<?xml version="1.0" encoding="utf-8"?>
<ApplicationInsights xmlns="http://schemas.microsoft.com/ApplicationInsights/2013/Settings" schemaVersion="2014-05-30">
   <InstrumentationKey>** Your instrumentation key **</InstrumentationKey>
   <RoleName>** Your role name **</RoleName>
   ...
</ApplicationInsights>

Application Insights Spring Boot スターターで Spring Boot を使用する場合、必要な変更は application.properties ファイルにアプリケーションのカスタム名を設定することだけです。If you use Spring Boot with the Application Insights Spring Boot starter, the only required change is to set your custom name for the application in the application.properties file.

spring.application.name=<name-of-app>

Spring Boot スターターにより、クラウド ロール名が、ユーザーが spring.application.name プロパティに入力した値に自動的に割り当てられます。The Spring Boot starter will automatically assign cloud role name to the value you enter for the spring.application.name property.

クライアント/ブラウザー側の JavaScriptClient/browser-side JavaScript

appInsights.queue.push(() => {
appInsights.addTelemetryInitializer((envelope) => {
  envelope.tags["ai.cloud.role"] = "your role name";
  envelope.tags["ai.cloud.roleInstance"] = "your role instance";
});
});

アプリケーション マップのコンテキスト内でのクラウド ロール名の理解Understanding cloud role name within the context of the Application Map

クラウド ロール名をどのように考えるかに関する限り、複数のクラウド ロール名が存在するアプリケーション マップを調べると役に立つ可能性があります。As far as how to think about cloud role name, it can be helpful to look at an Application Map that has multiple cloud role names present:

アプリケーション マップのスクリーンショット

上記のアプリケーション マップでは、緑色の囲みの中の名前が、それぞれこの特定の分散アプリケーションの異なる側面のクラウド ロール名の値になります。In the Application Map above each of the names in green boxes are cloud role name values for different aspects of this particular distributed application. したがって、このアプリでは、ロールは AuthenticationacmefrontendInventory ManagementPayment Processing Worker Role で構成されます。So for this app its roles consist of: Authentication, acmefrontend, Inventory Management, a Payment Processing Worker Role.

このアプリの場合、クラウド ロール名のそれぞれが、一意の Application Insights リソースと各自のインストルメンテーション キーも表しています。In the case of this app each of those cloud role names also represents a different unique Application Insights resource with their own instrumentation keys. このアプリケーションの所有者は、これら 4 つの異なる Application Insights リソースにアクセスできるため、アプリケーション マップによって基になる関係を 1 つのマップにまとめることができます。Since the owner of this application has access to each of those four disparate Application Insights resources, Application Map is able to stitch together a map of the underlying relationships.

公式な定義:For the official definitions:

   [Description("Name of the role the application is a part of. Maps directly to the role name in azure.")]
    [MaxStringLength("256")]
    705: string      CloudRole = "ai.cloud.role";
    
    [Description("Name of the instance where the application is running. Computer name for on-premises, instance name for Azure.")]
    [MaxStringLength("256")]
    715: string      CloudRoleInstance = "ai.cloud.roleInstance";

または、クラウド ロール名によって Web フロント エンドのどこかに問題があることが通知されたが、Web フロント エンドは複数の負荷分散サーバーで実行されているため、Kusto クエリによってレイヤーを深くドリルインして、問題がすべての Web フロント エンド サーバー/インスタンスに影響するのか、1 つだけに影響するのかを知ることが非常に重要なシナリオでは、クラウド ロール インスタンスが有用である可能性があります。Alternatively, cloud role instance can be helpful for scenarios where cloud role name tells you the problem is somewhere in your web front-end, but you might be running your web front-end across multiple load-balanced servers so being able to drill in a layer deeper via Kusto queries and knowing if the issue is impacting all web front-end servers/instances or just one can be extremely important.

コンテナー化された環境でアプリが実行されている場合は、個々のサーバーを知るだけでは特定の問題を見つけられない可能性があり、クラウド ロール インスタンスの値をオーバーライドした方がよいシナリオです。A scenario where you might want to override the value for cloud role instance could be if your app is running in a containerized environment where just knowing the individual server might not be enough information to locate a given issue.

クラウド ロール名プロパティをテレメトリ初期化子でオーバーライドする方法の詳細については、ITelemetryInitializer プロパティの追加に関するページを参照してください。For more information about how to override the cloud role name property with telemetry initializers, see Add properties: ITelemetryInitializer.

トラブルシューティングTroubleshooting

アプリケーション マップを期待どおりに動作させることで問題が発生している場合は、次の手順を試してください。If you're having trouble getting Application Map to work as expected, try these steps:

全般General

  1. 正式にサポートされている SDK を使用していることを確認します。Make sure you're using an officially supported SDK. サポートされていない/コミュニティ SDK は相関関係をサポートしていない場合があります。Unsupported/community SDKs might not support correlation.

    サポートされている SDK の一覧については、この記事をご覧ください。Refer to this article for a list of supported SDKs.

  2. すべてのコンポーネントを最新の SDK バージョンにアップグレードします。Upgrade all components to the latest SDK version.

  3. C# で Azure Functions を使用している場合は、Functions V2 にアップグレードします。If you're using Azure Functions with C#, upgrade to Functions V2.

  4. クラウド ロール名が正しく構成されていることを確認します。Confirm cloud role name is correctly configured.

  5. 依存関係が欠落している場合は、自動収集された依存関係の一覧にあることを確認します。If you're missing a dependency, make sure it's in the list of auto-collected dependencies. ない場合でも、TrackDependency 呼び出しを使えば手動で追跡することができます。If not, you can still track it manually with a track dependency call.

マップ上のノードが多すぎるToo many nodes on the map

アプリケーション マップでは、要求テレメトリ内に存在する一意のクラウド ロール名ごとにアプリケーション ノードが作成され、依存関係テレメトリ内のタイプ、ターゲット、およびクラウド ロール名の一意の組み合わせごとに依存関係ノードが作成されます。Application Map constructs an application node for each unique cloud role name present in your request telemetry and a dependency node for each unique combination of type, target, and cloud role name in your dependency telemetry. テレメトリ内のノード数が 10,000 を超える場合は、アプリケーション マップですべてのノードとリンクをフェッチできないため、マップが不完全になります。If there are more than 10,000 nodes in your telemetry, Application Map will not be able to fetch all the nodes and links, so your map will be incomplete. この場合、マップを表示したときに警告メッセージが表示されます。If this happens, a warning message will appear when viewing the map.

また、アプリケーション マップでサポートされる、個別にレンダリングされるグループ化解除ノードは、一度に 1000 個までです。In addition, Application Map only supports up to 1000 separate ungrouped nodes rendered at once. アプリケーション マップでは、視覚化の複雑さを低減するために、種類と呼び出し元が同じ依存関係がグループ化されます。ただし、テレメトリの一意のクラウド ロール名が多すぎる場合や、依存関係の種類が多すぎる場合は、そのグループ化でも不十分となり、マップでレンダリングできなくなります。Application Map reduces visual complexity by grouping dependencies together that have the same type and callers, but if your telemetry has too many unique cloud role names or too many dependency types, that grouping will be insufficient, and the map will be unable to render.

これを解決するには、クラウド ロール名、依存関係の種類、および依存関係のターゲットのフィールドが正しく設定されるように、インストルメンテーションを変更する必要があります。To fix this, you'll need to change your instrumentation to properly set the cloud role name, dependency type, and dependency target fields.

  • 依存関係のターゲットは、依存関係の論理名を表す必要があります。Dependency target should represent the logical name of a dependency. 多くの場合、これは依存関係のサーバーまたはリソース名と等しくなります。In many cases, it’s equivalent to the server or resource name of the dependency. たとえば、HTTP の依存関係の場合は、ホスト名に設定にされます。For example, in the case of HTTP dependencies it is set to the hostname. 要求ごとに変化する一意の ID またはパラメーターを含めてはなりません。It should not contain unique IDs or parameters that change from one request to another.

  • 依存関係の種類は、依存関係の論理型を表す必要があります。Dependency type should represent the logical type of a dependency. たとえば、一般的な依存関係の種類には、HTTP、SQL、Azure Blob などがあります。For example, HTTP, SQL or Azure Blob are typical dependency types. 一意の ID は含めないでください。It should not contain unique IDs.

  • クラウド ロール名の目的については、上記のセクションを参照してください。The purpose of cloud role name is described in the above section.

ポータルのフィードバックPortal feedback

ご意見やご感想は、フィードバック オプションからお寄せください。To provide feedback, use the feedback option.

MapLink-1 image

次のステップNext steps