Google Cloud Platform

Stackdriver による .NET アプリのロギング、モニタリング、診断

優れたクラウド アプリケーションを構築するにあたって重要なことは、そのアプリケーションが今日や明日だけでなく、その後もずっと稼働し続けるようにすることです。

Google Stackdriver は、Windows や .NET 向けの強力なロギング、モニタリング、および診断の各ツールを提供し、アプリケーションの継続稼働を支援します。すでに Khan Academy や Wix をはじめとするさまざまな規模の企業が、運用を簡素化するために Stackdriver を活用しています。

Google Cloud Platform(GCP)は、Stackdriver LoggingStackdriver Monitoring を通じて、ログ エージェントやクライアント ライブラリ、モニタリング エージェント、診断用の Stackdriver Diagnostics ライブラリといった優れたツールを .NET 開発者に提供し、アプリケーションに何が起こっているのかを完全に把握できるようにします。

この投稿では、GCP 上でアプリケーションをデプロイし運用している .NET 開発者に向けて用意された新しいオプションを紹介します。

ログ エージェント

.NET アプリケーションが稼働している Google Compute Engine 仮想マシン(VM)において、リクエストとアプリケーション ログを自動的に収集できるようになりました。これは、Google App Engine standard / flexible environment の VM が提供するログ情報と似ています。

Stackdriver Logging でログの記録を開始するには、こちらのドキュメントに従ってログ エージェントを Compute Engine VM 上にインストールします。きちんと動いているかどうかを確認するには、Stackdriver のログ ビューアにおいて、textPayload: “Successfully sent to Google Cloud Logging API” と書かれているテスト ログ エントリを探してください。

ログ エージェントが VM にインストールされると、ログが送られてくるようになり、Windows Event Viewer が収集したイベントから自動生成されるログを介して、何が起こっているのかをログの視点から見ることができます。アプリケーションに必要な VM の数にかかわらず、Stackdriver のログ ビューアは、アプリケーション全体で生成された Windows ログの統合ビューを提供します。

121321.png

モニタリング エージェント

アプリケーションが発する警告やエラーのログを自動的に記録することは、ほんの始まりに過ぎません。Stackdriver Monitoring では、利用している Windows VM の詳しい指標まで追跡し、事前に設定したしきい値を超えるとアラートを発します。

たとえば、Windows VM のメモリ使用率が 80 % を超えたときに、その状況を把握したいとしましょう。ここでモニタリング エージェントが登場します。モニタリング エージェントには Windows VM に対するオプションのエージェントが用意されており、CPU やメモリの使用率に加え、ページ ファイルやボリュームの指標を収集し、監視しています。

VM で Microsoft IIS や SQL Server が稼働している場合、エージェントはこれらのサービスからも指標を収集します。サードパーティ製のアプリケーションを含め、収集可能な指標の一覧はこちらに掲載されています。また、モニタリング エージェントのインストール方法はこちらに説明があります。

モニタリング エージェントを起動して、モニタリングの本当の力を探ってみましょう。つまり、アラートのことです。特定のしきい値を超えるとアラートが出力されるようにポリシーを設定するのです。

たとえば、VM の CPU 使用率が 80 % 以上の状態が 15 分間続いた場合にアラートを送るというポリシーを設定する方法は、次のとおりです。

ステップ 1 : 指標となるしきい値の条件を追加します。Stackdriver Monitoring のメイン メニューから “Alerting > Create a policy” を選択し、“Add Condition” をクリックします。そして、条件のタイプと適切な値を選びます。
ysxGTBR1rYrFTwMLMQ-kzL49Y6IShE08DW5YIaAZJJEn3kbfWqay_Tc0gecUKVLpqqtKacX8-GZIpgSHF2Q3zUtSLZ0Jd9XjShF6Ie8Q0EfL6Se0fdYZFrC0MX3QBVo121DYQYhRnqaj.PNG

ステップ 2 : アラート ポリシーの詳細を設定します。アラート メールを受信するには、“Notifications” にて任意のメール アドレスを入力します。また、任意の “Documentation” フィールドにその他の詳細を入力しましょう。最後に、ポリシーに名称を付け、“Save Policy” をクリックします。

z3PJJPjvibnIWmoEoeu0hlueDX8FxE2eKsNJr899aW-oqvsptsK_t-2f7bZpMYwDdMVTBjOkRR4LsGF17whll8n0I-QSsXm1kGWGKdgW_GTd3gDZ6rLh39aMQGdHVizFG3nV83h88czy.PNG

モニタリングのポリシーを設定すると、ポリシーの詳細ページが表示されます。そのページには、何らかの障害が発生したときの状況も表示されます。

AnJIq-Llp_HHEHhaJgdsSd6YKt_IsLVUCKu2GuNmTPUPTm1JJuFqYeWEK-Bi4Mh4Z3270VDnMIxq16PRH6OJj3qn64Gne8S5pc7v2AxVCv0jxDt-AGMa6M8unypcq8t7_SaLetPQda7u.PNG

ウェブ サーバーの監視にあたっては、“Uptime check”(稼働時間チェック)というアラートが、継続的に HTTP や HTTPS、TCP を経由して VM に ping を送信するため、ウェブ サーバーが反応しているか、また予定どおりにページが機能しているかを確認できます。

ウェブ サーバーに対して、特定のホスト名にて 5 分間隔で ping を送信するといった稼働時間チェックの作成方法は次のとおりです。

  1. Monitoring ダッシュボードの “Uptime checks” において “Create Check” をクリックします。
  2. “Title”(ホスト名)、“Check Type”(プロトコル)、“Resource Type”(リソースタイプ)、“Hostname”(ホスト名)、“Path”(パス)など、作成する稼働時間チェックの詳細を入力するとともに、何分おきに稼働時間チェックを実施するかを “Check every”(チェック間隔)で指定します。
  3. “Save” をクリックします。

RmIg7r2CHytYG75BMTRK2Zu-DnfxpNp4cscVZ3MbLuDRMHC1j2FMRBvw7dkhFeALYafiYwCZ-LG6IEwz97YIwIG7ncPLH1JXZ9bmJSD5Ie62D1hbWn11Gq8Ud99s6QorKegWqnAOu0jf.PNG

新しくなった稼働時間チェックのページには、チェックが行われている場所と、それぞれの状況が表示されます。

3hxOkqxB7OIvO7MTUIGvM4UGJZfxJfJtzigZ0_HgDJku7HN014EEkTGPWnrePDzRSrpAnva2-R5jpT6Do8FQujMO8v21l_rraPnTaUzuEC2cUbyXfZ0E2fMQycH0gpTIdMotIqbUwpoh.PNG

.NET アプリのカスタム イベントのログを記録

リソースを監視するだけでなく、アプリケーション特有の重要なイベントのログも記録できます。“Google.Cloud.Logging.V2” はログ用 .NET クライアント ライブラリのベータ版で、Stackdriver と Log4Net のインテグレーションによってカスタム イベントのログが簡単に生成できます。

ステップ 1 : ログ クライアントの NuGet パッケージを Visual Studio のプロジェクトに追加します。

Visual Studio のソリューションを右クリックし、“Manage Nuget packages for solution” を選択します。Visual Studio の NuGet ユーザー インターフェースにて “Include prerelease” にチェックを入れ、Google.Cloud.Logging.V2 という名前のパッケージを検索し、インストールします。次に、“Google.Cloud.Logging.Log4Net” パッケージも同様にインストールします。

ステップ 2 : 以下のコードが含まれているウェブ アプリケーションの Web.Config ファイルに Log4Net XML の設定セクションを追加します。

  <configuration>
  <configSections>
    <section name="log4net" type="log4net.Config.Log4NetConfigurationSectionHandler, log4net" />
  </configSections>
  <log4net>
   <appender name="CloudLogger" type="Google.Cloud.Logging.Log4Net.GoogleStackdriverAppender,Google.Cloud.Logging.Log4Net">
     <layout type="log4net.Layout.PatternLayout">
       <conversionPattern value="%-4timestamp [%thread] %-5level %logger %ndc - %message" />
      </layout>
      <projectId value="YOUR-PROJECT-ID" />
      <logId value="mySampleLog" />
    </appender>
    <root>
     <level value="ALL" />
     <appender-ref ref="CloudLogger" />
    </root>
  </log4net>

ステップ 3 : Logging を利用できるようにするため、次のコードをアプリケーションの Global.asax.cs ファイルに追加し、Log4Net を設定します。

  log4net.Config.XmlConfigurator.Configure();

Global.asax.cs の .The Application_Start() メソッドは次のようになるはずです。

  protected void Application_Start()
{
    GlobalConfiguration.Configure(WebApiConfig.Register);
    // Configure log4net to use Stackdriver logging from the XML configuration file.
    log4net.Config.XmlConfigurator.Configure();
}

ステップ 4 : クライアント ライブラリに含めるために、次のステートメントをアプリケーション コードに追加します。

  using log4net;

ステップ 5 : アプリケーションに次のコードを追加し、Stackdriver のログ ビューアに表示されることになるログを指定します。

  // Retrieve a logger for this context.
ILog log = LogManager.GetLogger(typeof(WebApiConfig));
// Log some information to Google Stackdriver Logging.
log.Info("Hello World.");

このコードをビルドして実行すると、以下のようなログ エントリが表示されます。

CBsMA3CBPNVfrD2KhAucRI43JJpcxHTcIwnCRrdcWifH0N0RMIDU-K7E5nWrJcdEcss2eHU5TmA9DELyMa6-MYospK0iGHAZ6Qm9ZPOkyunH2aCQr9I3_KW6uso6kgk_tdSDKwBn5xhr.PNG

.NET アプリケーション用ログ クライアント NuGet パッケージのインストール方法と使用方法については、こちらのドキュメントを参照してください。

.NET アプリの診断

VM が問題なく動いていたとしても、予期しない使用パターンなどにより、アプリケーションにランタイムの例外が発生することがあります。そこで、耳寄りの情報をお届けしましょう。私たち Google は先ごろ、Compute Engine VM 用の Stackdriver Diagnostics ASP.NET NuGet パッケージをリリースしました。これにより、アプリケーションのすべての例外エラーが自動的に Stackdriver Error Reporting で記録されるようになります。

ステップ 1 : Error Reporting API を有効にします。

ステップ 2 : Visual Studio のソリューションを右クリックし、“Manage Nuget packages for solution” を選択します。“Include prerelease” にチェックを入れ、“Google.Cloud.Diagnostics.AspNet” という名前のパッケージを検索し、インストールします。

ステップ 3 : アプリケーション コードに以下のライブラリを追加します。

  using Google.Cloud.Diagnostics.AspNet;

ステップ 4 : .NET ウェブ アプリケーションの Register メソッドに次のコードを追加します。

  public static void Register(HttpConfiguration config)
{
    // Add a catch all for the uncaught exceptions.
    string projectId = "YOUR-PROJECT-ID";
    string serviceName = "NAME-OF-YOUR-SERVICE";
    string version = "VERSION-OF-YOUR-SERVICE";
    // Add a catch all for the uncaught exceptions.
    config.Services.Add(typeof(IExceptionLogger), 
        ErrorReportingExceptionLogger.Create(projectId, serviceName, version));
}

以下は、Error Reporting に表示される例外の一例です。

IuNqAVyvLOzk5yr5pDAuP_ldV5LbYvXmybF1H6VVt8UKk7qtuJfQCY3Y9b9X54r6NthHISZEGxIMhi5_Ow4QJiSFVTASwvFL3ZSAbOo7L1UL-TkJxEJ1tAxt_bX2VDPG1JLeVUYzlf8v.PNG

例外をクリックすると詳細が確認できます。

mVMjqNjCwUdbksBf3Vodaomj33Lo7rGweeL8B8X2dwPRHe7am8nzrEVx_dNqBnPpZGbUw2hCclMTDdy-tjt6nCc9lfJdfwAZ33BjXT42Ck0y8lvsQBUDZsGXNBFX2HcWv5UQf-0czka0.PNG

.NET アプリケーション用 Stackdriver Diagnostics ASP.NET NuGet パッケージのインストール方法と使用方法については、こちらのドキュメントを参照してください。

使ってみよう

Google Cloud 上の .NET アプリケーションでロギングやモニタリング、診断機能を使用することがいかに簡単か、おわかりいただけたと思います。

ぜひ Google Cloud に .NET アプリケーションをデプロイしてみてください。そして、ログ エージェントやモニタリング エージェントを VM 上にインストールし、アプリケーションに Stackdriver Diagnostics とログ クライアント パッケージを追加するのです。

これで、アプリケーションに起こっていることが確実に記録されます。夜中に何かが発生した場合でも通知されますので、これまでよりもゆっくり眠ることができるでしょう。

* この投稿は米国時間 12 月 21 日、Developer Relations である Jonathan Simon によって投稿されたもの(投稿はこちら)の抄訳です。

- Posted by Jonathan Simon, Developer Relations