はじめに

Application Insightsは、Webアプリケーションのパフォーマンス管理のためのAzureのサービスです。さまざまなアプリケーションと統合して、パフォーマンス状況の集計や異常の検知などを一括で管理することができる横断的なソリューションとなっています。今回は、サンプルアプリケーションにApplication Insightsを統合し、さまざまなデータの収集と確認方法やアラームの通知方法などについて説明していきます。

Application Insightsとは

Application Insightsは、一般的にAPM(アプリケーション性能管理)ツールと呼ばれる製品のひとつです。APMツールはログの収集、アプリケーションの応答時間やレスポンス状態の監視を通してアプリケーションの稼働状況の管理を行います。稼働状況のデータを収集することで、アプリケーションに異常が発生した場合に素早く通知することができたり、あるいは事前に異常の発生を予測したりすることが可能となります。

Application InsightsはAzureのサービスラインナップの一つですが、パフォーマンスの監視対象となるアプリケーションはAzureプラットフォーム上のものでなくても構いません。現在は、.NET、.NET Core、Node.js、Javaといったプラットフォームで稼働するアプリケーションに対応しています。また、Visual Studio App CenterHockeyAppといったモバイルアプリの開発プラットフォームと統合することで、モバイルアプリのパフォーマンスも管理できるようになっています。

Application Insightsの監視対象となる項目

Application Insightsが管理できるアプリケーションの情報には以下のものが含まれます。

・要求レート、応答時間、エラー率
・依存率、応答時間、エラー率
・例外の発生
・ページビュー、読み込みのパフォーマンス
・WebページからのAjax呼び出し
・ユーザー数とセッション数
・WindowsやLinuxサーバのCPU、メモリ、ネットワーク使用率などのパフォーマンスカウンター
・DockerやAzureのホスト診断
・アプリの診断トレースログ
・カスタムイベントやメトリック

これらの情報を次に説明するしくみを使ってアプリケーションからApplication Insightsに送信し、Azureポータル上で確認することができるようになります。

  • Application Insightsのダッシュボード

    Application Insightsのダッシュボード

Application Insightsがデータを収集するしくみ

Application Insightsでは、収集対象となるサーバやクライアントのアプリケーションに「インストルメンテーション」と呼ばれるパッケージをインストールすることで、データをApplication Insightsに送信します。なおApplication Insightsでは送信するデータのことを「テレメトリ」と呼びます。

  • Application Insightsのしくみ

    Application Insightsのしくみ

送信されたテレメトリはApplication Insights内で種類によって分類され、Azureポータル上で確認することができます。ほかにも、メール送信、Webhook(HTTPベースのデータ送信)やPowerBI(Microsoftが提供するのデータ分析・視覚化ツール)等へ連携して確認することもできます。

アプリケーションのデータをApplication Insightsに送信してみよう

ここからは、実際にアプリケーションとApplication Insightsを統合し、テレメトリがApplication Insightsに送信されてAzureポータル上で監視ができることを確認していきます。

今回は、以前紹介したAzure Functionsでアプリケーションを作成します。Azureポータル上でAzure FunctionsにApplication Insightsを統合し、テレメトリを送信するコードを実装していきます。送信するテレメトリは数種類用意し、Azureポータル内にあるApplication Insightsのダッシュボード上で種類別に分類されることを確認します。テレメトリの中にはエラーとして検知されるものも含めます。Application Insightsがエラーを検知したら、アラートをメールで開発者に送信する仕組みまで作成していきます。

Function AppとApplication Insightsリソースの作成

まずはAzure Functionsのアプリケーション(Function App)を作成していきます。Azureポータルにログインし、左側メニューから「リソース作成」を選択し、「Serverless Function App」を選択します。(表示されていない場合は、「Search the Marketplace」と表示されている検索フォームに「function」と入力することで選択することができます。)

  • リソースの新規作成

    リソースの新規作成

Function Appの作成画面に移ったら、必須項目を入力していきます。「アプリ名」には任意の名前を入力してください。「サブスクリプション」はお持ちのサブスクリプションを選択します。「リソースグループ」と「Storage」は既存のものがあれば利用しても構いませんし、新規作成しても構いません。「OS」はWindowsを選択します。「ホスティングプラン」は従量課金プランを選択します(使用量に応じて課金が発生しますのでご注意下さい)。「場所」は東日本を選択します。

最後に、一番下に「Application Insights」の項目があるのでオンを選択します。すると「Application Insightsの場所」が表示されるので、今回はFunction Appの場所に一番近いSoutheast Asia(東南アジア)を選択します。

  • Functionアプリの新規作成

    Functionアプリの新規作成

「作成」ボタンを押してFunction Appの作成を開始します。しばらく待つと作成が完了します。また、このタイミングでApplication Insightsも構成されます。Azureポータルの左側メニューの「すべてのサービス」からApplication Insightsを選択すると、作成したFunction Appと同名のApplication Insightsのリソースが表示されているかと思います。

  • 新規作成されたApplication Insightsリソース

    新規作成されたApplication Insightsリソース

これでApplication Insightsの準備ができたので、Function Appで関数を作成・実行してテレメトリを送信してみましょう。

はじめてのテレメトリ送信

作成したFunction App内に関数を作成して実際にテレメトリを送信してみましょう。Azureポータルの左側メニューの「すべてのサービス」からFunction Appを選択します。Function Appを展開し、「関数」メニューの右側の「+」を選択して関数を新規作成します。今回はタイマー起動で言語はJavaScriptの関数を作成します。

  • タイマー起動関数を新規作成

    タイマー起動関数を新規作成

「この関数を作成する」ボタンをクリックすると「TimerTriggerJS1」という名前の関数が新規作成されます。今回は関数を手動でのみ実行させたいため、「TimerTriggerJS1」を展開して「管理」画面の「関数の状態」を無効にします。この状態で「TimerTriggerJS1」に戻り、「実行」ボタンを押して関数を実行してみましょう。実行後、ログに「Function completed」と表示されれば実行成功です。ここまで操作したら、Application Insightsの画面に移動してみましょう。先ほど作成したApplication Insightsのリソースを選択すると、ダッシュボードが表示されます。

  • Application Insightsのダッシュボード画面

    Application Insightsのダッシュボード画面

ダッシュボード画面では、さまざまな種類のテレメトリの情報を確認することができます。「正常性」の項目では、いくつかのグラフが表示されています。上の図では「SERVER RESPONSE...」と「SERVER REQUESTS」にデータが存在しています。「SERVER REQUESTS」はサーバへのリクエスト数が表示されます。Webアプリケーションの場合はクライアントからのリクエスト数が表示され、今回の例のようにFunction Appの場合は関数の実行回数が表示されます。上の図の筆者の環境では、関数を2回実行したため計2回カウントされています。「SERVER RESPONSE...」は「Server Response Time」つまりサーバの応答時間を表しています。平均応答時間がサマリとして表示されています。

このようにダッシュボードではテレメトリの大まかな情報を確認することができます。ここから各テレメトリの詳細な情報に進んでいって分析を進めるというのがApplication Insightsの基本的な使い方になります。

テレメトリの詳細を確認してみよう

つづいて、関数から送信されたテレメトリの詳細な情報を確認していきましょう。Application Insightsのダッシュボード画面の上部にある「検索」を選択します。するとApplication Insightsに送信されたテレメトリが時系列に表示された画面に遷移します。

  • テレメトリの検索画面

    テレメトリの検索画面

この画面では、7種類のテレメトリの詳細情報について時系列に確認することができます。また、テレメトリの種類、時刻やメッセージに含まれるキーワードなどで検索対象となるテレメトリを絞り込んで検索することもできます。各テレメトリはそれぞれ、以下の用途で分類されています。

詳細画面で確認できるテレメトリの種類

テレメトリの種類 用途
トレース アプリケーション内で実装したログ出力が表示される
要求 Webサーバが受信したHTTPリクエストの内容や、Function Appの関数の実行内容などが表示される
例外 アプリケーションで発生した例外のうち、キャッチされていない例外が表示される
表示 WebブラウザなどのWebクライアントから送信されるテレメトリが表示される。ページビューの計測に使用する
イベント ユーザーアクションなどのイベント情報が表示される
依存関係 サーバーアプリケーションからの他サービス呼び出した際の実行内容が表示される
可用性 可用性テスト(Application InsightsからWebサーバに対するヘルスチェック)の結果が表示される

さまざまな種類のテレメトリを送信する準備をしよう

次に、Function Appの関数を修正して異なるテレメトリを送信できるようにしてみましょう。まずはApplication InsightsのNode.js向けSDKをインストールします。Function Appに対してNode.jsのライブラリをインストールするには、KuduというAzureに付属するツール上から、Node.jsのパッケージマネージャであるnpmコマンドを実行します。Kuduには「https://<Function Appの名前>.scm.azurewebsites.net」でアクセスすることができます(筆者の環境では「https://app-insights-sample.scm.azurewebsites.net」となります)。

  • Kuduのトップページ

    Kuduのトップページ

Kuduのページが表示されたら、画面上部のメニューから「Debug console」→「PowerShell」を選択します。するとカレントディレクトリの一覧と、その下にPowerShellのコンソールが表示された画面に移ります。PowerShellコンソールで「cd site\wwwroot\」と入力し、Function Appの関数のディレクトリに移動します(筆者の環境では「cd site\wwwroot\TimerTriggerJS1」となります)。

関数のディレクトリに移動できたら、npm initコマンドを実行します。このコマンドにより、このディレクトリでnpmを使用するにあたっての初期化処理が実行されます。コマンドを実行すると、以下のリストのように対話形式でいくつかの項目について入力を求められますので、状況に応じて適切な内容を入力していきます。今回はサンプルアプリのため、「name」以外は空白のままとしています。「name」については大文字が許容されないため、関数名を小文字に置き換えた内容で入力しています。

npm initコマンド

 npm init
 ・・・中略
 name: (TimerTriggerJS1)  timer-trigger-js1
 version: (1.0.0)  <何も入力せずEnterキーを押下>
 description:  <何も入力せずEnterキーを押下>
 entry point: (index.js) <何も入力せずEnterキーを押下>
 test command: <何も入力せずEnterキーを押下>
 git repository: <何も入力せずEnterキーを押下>
 keywords:  <何も入力せずEnterキーを押下>
 author:  <何も入力せずEnterキーを押下>
 license: (ISC)  <何も入力せずEnterキーを押下>
 ・・・中略
 Is this ok? (yes)  <何も入力せずEnterキーを押下>

「Is this ok? (yes) 」をEnterキーを押下してしばらくすると、ディレクトリ上に「package.json」というファイルが作成されます(PowerShellコンソール上部のディレクトリの一覧から確認できます)。このファイルが作成されれば、npm initコマンドは完了です。

  • npm initコマンドの実行例

    npm initコマンドの実行例

なお、「Is this ok? (yes) 」でEnterキー押下後にコンソールがプロンプトを返さずに止まってしまう場合がありますが、package.jsonが作成されていればコマンド自体は完了しているので、一度ブラウザを更新し再度このディレクトリまで移動するようにしてください。

次にApplication InsightsのSDKをインストールします。以下のコマンドを実行します。

npm installコマンド

 npm install --save applicationinsights

「npm install」に続きインストールしたいライブラリの名前を指定します。今回は「applicationinsights」がインストール対象のライブラリ名です。「--save」は、インストールしたライブラリをディスクに保存して以降もライブラリを使用できるようにするオプションです。コマンドを実行し、成功するとディレクトリ上に/node_modulesというディレクトリが作成されます。node_modulesディレクトリには以下の図のように/applicationinsightsと依存するライブラリが存在しているか確認してください。

  • Application InsightsのSDKインストール後のnode_modulesディレクトリの内容

    Application InsightsのSDKインストール後のnode_modulesディレクトリの内容

ここまででApplication InsightsのSDKを使用する準備が整いました。再度関数に戻ってさまざまなテレメトリを送信してみましょう。

さまざまな種類のテレメトリを送信しよう

Function Appに戻り、TimerTriggerJS1関数を修正してさまざまなテレメトリを送信してみましょう。関数を以下のリストのように修正します。

TimerTriggerJS1関数の修正(index.js)

 // Application InsightsのSDKをインポート、セットアップ・・・①
 const appInsights = require("applicationinsights");
 appInsights.setup();

 // クライアントの生成・・・②
 const client = appInsights.defaultClient;

 module.exports = function (context, myTimer) {
     var timeStamp = new Date().toISOString();

     if(myTimer.isPastDue)
     {
         context.log('JavaScript is running late!');
     }
     // コメントアウト
     // context.log('JavaScript timer trigger function ran!', timeStamp);

     //// さまざまなテレメトリを送信する・・・③
     // 「カスタムイベント」テレメトリの送信
     client.trackEvent({name: "my custom event", properties: {customProperty: "custom property value"}});
     // 「例外」テレメトリの送信
     client.trackException({exception: new Error("handled exceptions can be logged with this method")});
     // 「トレース」テレメトリの送信
     client.trackTrace({message: "trace message"});
     // 「依存関係」テレメトリの送信
     client.trackDependency({target:"http://dbname", name:"select customers proc", data:"SELECT * FROM Customers", duration:231, resultCode:0, success: true, dependencyTypeName: "ZSQL"});
     // 「要求」テレメトリの送信
     client.trackRequest({name:"GET /customers", url:"http://myserver/customers", duration:309, resultCode:200, success:true});

     context.done();
 };

index.jsの先頭に、先ほどnpmでインストールしたApplication InsightsのSDKライブラリをインポート、セットアップするコードを追加します(①)。このオブジェクトからクライアントオブジェクトを生成します(②)。クライアントオブジェクトには、各テレメトリの送信に対応したメソッドが用意されています(③)。 関数を「保存して実行」してみましょう。関数が成功し、しばらくするとApplication Insights上でテレメトリを確認することができます。以下の図のように、異なる種類のテレメトリとしてデータが送信されているかと思います。

  • さまざまなテレメトリの送信結果

    さまざまなテレメトリの送信結果

アラームを追加してみよう

例外の発生や、サーバリソースの高負荷状態などの異常を素早く検知したい場合、Application Insightsからアラートを送信することができます。アラートはメールやWebhookによって送信することができます。ここではメールでサーバの例外発生を通知するアラートを作成してみます。 AzureポータルからApplication Insightsを表示し、メニューから「警告」を選択し、「メトリックアラートの追加」を選択し「規則の追加」画面に遷移します。

「名前」にはアラートの名前を入力します。今回はFunction Appの例外を検知したいので、「メトリック」のプルダウンから「Server exceptions」を選択します。

  • アラートの追加(名前の入力、メトリックの選択)

    アラートの追加(名前の入力、メトリックの選択)

次に「条件」、「しきい値」、「期間」を指定していきます。これらを組み合わせてアラートを通知するルールとしていきます。今回は「ある5分間のうちに例外が1回でも発生したら」アラートとするように指定しています。 最後に通知先の設定をします。今回は自分1人に対してのみメールを送信したいので、「追加の管理者メール」に自身の有効なメールアドレスを入力します。

  • アラートの追加(条件の指定、通知先の設定)

    アラートの追加(条件の指定、通知先の設定)

「OK」ボタンを選択して設定を保存するとアラートが有効になります。Function Appに戻り、先ほど修正した内容で関数を「実行」ボタンから実行してみましょう。しばらくすると設定したメールアドレス宛てにアラートが発生した旨のメールがApplication Insightsから届きます。

  • Application Insightsからのアラート発生通知メール

    Application Insightsからのアラート発生通知メール

メール内の「View application in Azure Portal」というリンクを開くとApplication Insightsの画面が表示されるので、ここから例外について調査を開始することができるようになっています。さらに5分以上経過すると、次はアラート解消のメールが届きます。

  • Application Insightsからのアラート解消通知メール

    Application Insightsからのアラート解消通知メール

これは、先ほどの関数手動実行による例外発生からの5分間で新たに例外が発生していないため、アラートの発生条件から外れたこと表しています。

まとめ

今回はFunction Appのサンプルアプリケーションを使って、テレメトリの送信方法やアラートの通知方法などのApplication Insightsの使い方について説明しました。Application Insightsの機能や連携できるサービスは多岐に渡るので、収集したいデータの対象と目的を明確にしてApplication Insightsの適用範囲を広めていくことをおすすめします。 次回は、AzureのNoSQLサービスである「Cosmos DB」を使ったNoSQLデータベースの使い方について紹介します。

WINGSプロジェクト 秋葉龍一 著/山田祥寛監修
<WINGSプロジェクトについて>テクニカル執筆プロジェクト(代表山田祥寛)。海外記事の翻訳から、主にWeb開発分野の書籍・雑誌/Web記事の執筆、講演等を幅広く手がける。一緒に執筆をできる有志を募集中