Posted at

Application InsightsをPHPのシステムに組み込む ~基本情報とテレメトリの整理編~


はじめに

PHP製のWebAPIのシステムで各種調査(不具合調査、速度調査など)を行うとき、既存のテキストベースのログだと流石に辛くなってきたなーと感じてたところで、AzureのApplication Insightsを使う機会があったので採用することになった。

その調査過程などをメモがてらまとめます。


Application Insightsの基本情報


そもそもApplication Insightsとは

Azure Application Insights とは何か | Microsoft Docs

以下引用


Application Insights は、複数のプラットフォームで使用できる Web 開発者向けの拡張可能なアプリケーション パフォーマンス管理 (APM) サービスです。

このサービスを使用して、実行中の Web アプリケーションを監視することができます。 パフォーマンスに異常があると、自動的に検出されます。

組み込まれている強力な分析ツールを使えば、問題を診断し、ユーザーがアプリを使用して実行している操作を把握できます。

Application Insights は、パフォーマンスやユーザビリティを継続的に向上させるうえで役立つように設計されています。



メリット


  • ログ情報が構造化されているのでパラメータの集計や検索(フィルタリング)がやりやすい。

    ⇒ 特に例外時のトレース情報は便利すぎる

  • 同一API内でのログが自動的にグルーピングされるので前後関係が追いやすい


デメリット


  • PHPに限って言うとSDKの開発に力が入っておらず、今後もサポートされるかという点が際どい

  • ログの情報量に応じてサーバ送信コストが掛かるため、どうしても処理が全体的に重くなる

    ⇒ 解決策は試行錯誤しているのでいずれまた

  • 従量課金なのでシステム規模によってはコストが掛かる

    ⇒ とはいえだいぶ安いみたいだが、正直コスト計算がよくわからない…

  • 多少のラグがある

    ⇒ Azure Portalで確認できるようになるには数分待つ必要があるので組み込みの確認中は微妙なストレスがあるものの、本来の使い方的には影響はない

  • 便利すぎて調子に乗ってログを吐きすぎちゃう


テレメトリの種類について

これまでログと言ってたけど、Application Insights的には正しくはテレメトリ。

種類が沢山あるほか、基本的にApplication Insights自体がC#での使用を推奨しているためPHPのSDKを踏まえた使い方の目安も交えて整理する。



  • Trace(トレース)

    Applicationの内部ログ

    主に操作の流れを追跡するために利用する

    他のテレメトリと違い、いわゆるログレベルが指定できる(severityLevel

    弊社のシステムでは今の所MethodのIN/OUTのみ使用しているが、重要な分岐などに入れるのも効果的だと思われる



  • Request(要求)

    外部のURLにリクエストを送るとき利用する

    システムから外部のWebAPIをCallする際に



  • PageView(表示)

    WebAPIでは不使用でいいと思われる(WebAppならば、おそらくRenderのタイミングで出力するのでは)



  • Custom Event(カスタム イベント)

    基本的に自由に使えると思われる

    あるポイントでのパラメータなども確認する用途もこれでいいと思われる

    弊社のシステムではAPIの入り口での全パラメーターの記録と、APIの出口で使用したメモリ量、Query発行数を記録するようにしている

    Traceを使っていないのは、Traceには計測情報の付与ができなかったため)


  • Exception(例外)

    例外発生箇所やStackTraceが取得できる(C#ならダンプまで取れるかもしれないがPHPでは無理っぽい)

    例外発生時には自動的に処理されるのが望ましいが、おそらくTry/Catchで明確に処理しているところでは手動で追加する必要がありそう(もしかするとC#辺りだと自動的に全部処理してくれるのかも)

    弊社のシステムではコード中でcatchしそこなったものは自動的に出力するようにしている


  • Dependency(依存関係)

    外部コンポーネント(主にDB)の呼出時間などを記録する

    パフォーマンス劣化に主要因であるQueryの発行状況を細かく観察できるので一番有益なテレメトリ

    前述したRequestと多少混同するが、RequestはHTTP経由の外部サーバについか、それ以外はDependencyだと思われる


  • Availability(可用性)

    公式の解説では出てくるテレメトリなのだが用途がイマイチ理解できていないし、PHPのSDKでの指定方法も不明


  • Metric(測定基準)

    キューの長さなどのパフォーマンス収集に使用する

    前述した使用メモリの計測やQuery発行数の記録は本来こちらを使うべきなのかもしれないが、.NET SDKではtrackMetric()が非推奨になっているため使うのが憚られるので、弊社システムでは未使用


今回は一旦ここまで。

次回はPHPのSDKの使い方の具体例を交えてまとめる予定です。