Java 用 Appstats(Java 7 ランタイムのみ)

Java SDK には、アプリケーションの RPC(リモート プロシージャ コール)のパフォーマンスを測定する Appstats ライブラリが含まれています。App Engine RPC は、アプリケーションと App Engine Service API の間で行われる往復のネットワーク呼び出しです。たとえば、次の API 呼び出しはすべて RPC 呼び出しになります。

  • DatastoreService.get()DatastoreService.put()DatastoreService.query() などの Datastore の呼び出し
  • MemcacheService.get()MemcacheService.getAll() などの Memcache の呼び出し
  • URL 取得呼び出し
  • Mail 呼び出し

スケーラブルなアプリケーションでは、さまざまな要因でパフォーマンスが低下するため、パフォーマンスの最適化やデバッグが難しくなる場合があります。このような問題をログやリクエスト時間の統計情報などの通常の情報源で修正するのは非常に困難です。アプリケーションのほとんどのリクエストは、リクエストを処理するネットワーク呼び出しの完了を待機することに大半の時間を費やしています。

アプリケーションの処理速度を確保するには、次の項目を確認する必要があります。

  • アプリケーションで不要な RPC 呼び出しが行われていないか。
  • 同一のデータを取得する場合、繰り返し RPC を呼び出すのではなく、データをキャッシュに格納する必要があるか。
  • 複数のリクエストを連続ではなく並行して実行したほうがアプリケーションのパフォーマンスが向上するかどうか。

Appstats ライブラリを使用すると、このような問題を解決できます。このライブラリは RPC 呼び出しを測定し、アプリケーションが RPC を効率的に使用しているかどうか確認します。また、特定のリクエストに対するすべての RPC 呼び出しを追跡し、呼び出しごとに時間とコストを報告します。

アプリケーションのコスト管理については、アプリリソースの使用状況を管理するをご覧ください。

動画デモを見る

設定

Appstats の利用を開始するにあたって、ダウンロードやインストールが必要なものはありません。以下の手順に沿ってアプリケーションを設定して再度デプロイし、Appstats コンソールにアクセスするだけです。残りの処理は Appstats ライブラリが実行します。

依存関係

依存関係 appengine-api-labs をプロジェクトに追加する必要があります。以下の例は、この操作を Maven pom.xml ファイルで行った場合の例です。

<dependency>
 <groupId>com.google.appengine</groupId>
 <artifactId>appengine-api-labs</artifactId>
 <version>1.9.76</version>
 <!-- <scope>test</scope> -->
</dependency>

1. イベント レコーダーのインストール

Appstats は、サーブレット フィルタを使用して各リクエストの情報を収集します。サーブレット フィルタは SDK で提供されるクラスです。モニタリングするリクエストのフィルタをインストールするには、<filter> 要素と <filter-mapping> 要素をデプロイ記述子web.xml)に追加します。

サーブレット フィルタをインストールするには、web.xml ファイルの先頭に以下のようなセクションを追加します。

<filter>
  <filter-name>appstats</filter-name>
   <filter-class>com.google.appengine.tools.appstats.AppstatsFilter</filter-class>
</filter>

<filter-mapping>
  <filter-name>appstats</filter-name>
  <url-pattern>/*</url-pattern>
</filter-mapping>

<url-pattern>/* を使用すると、すべての URL にフィルタが追加されます。これは、以下で説明する Appstats ウェブベースのコンソールに表示されますが、記録の対象外にすることもできます。異なるパターンを指定して、Appstats が比較する URL を減らすこともできます。

2. コンソールパスの設定

Appstats のコンソールにアクセスするには、ウェブブラウザでアプリケーションの URL に移動します。このコンソールは、SDK が提供するサーブレットを使用して、アプリケーションの一部としてコンソールを設定します。

URL パス(/appstats/ にコンソールを設定する場合には、アプリケーション管理者以外のアクセスを禁止するか、web.xml ファイルの先頭に次の要素を追加します。

<servlet>
  <servlet-name>appstats</servlet-name>
  <servlet-class>com.google.appengine.tools.appstats.AppstatsServlet</servlet-class>
</servlet>

<servlet-mapping>
  <servlet-name>appstats</servlet-name>
  <url-pattern>/appstats/*</url-pattern>
</servlet-mapping>

<security-constraint>
  <web-resource-collection>
    <web-resource-name>appstats</web-resource-name>
    <url-pattern>/appstats/*</url-pattern>
  </web-resource-collection>
  <auth-constraint>
    <role-name>admin</role-name>
  </auth-constraint>
</security-constraint>

3. オプションの設定

ロギング

リクエスト固有の情報をアプリケーション ログに書き込むように、AppstatsFilter クラスを構成できます。このロギングを有効にするには、ステップ 1 で作成した filter 要素に logMessage パラメータを追加します。

<filter>
  <filter-name>appstats</filter-name>
  <filter-class>com.google.appengine.tools.appstats.AppstatsFilter</filter-class>
  <init-param>
    <param-name>logMessage</param-name>
    <param-value>Appstats available: /appstats/details?time={ID}</param-value>
  </init-param>
</filter>

フィルタでリクエストが処理されると、param-value のテキスト値がログに追加され、{ID} がリクエストの ID に置き換わります。この例のテキストでは、Appstats の詳細情報へのパスが追加されています。

これらのログエントリは、"INFO" レベルで書き込まれるので、ログレベルを "INFO" に設定する必要があります。次の行を logging.properties ファイルに追加すると、この設定を AppstatsFilter クラスに行うことができます。

com.google.appengine.tools.appstats.AppstatsFilter.level = INFO

コストの表示

AppStats は、RPC について時間だけでなくコストも追跡できます。アプリケーションの処理速度が十分でも、コストが予想よりも高い場合には、予想以上にコストがかかっているオペレーションを探します。コストの追跡を有効にするには、appstats フィルタの calculateRpcCosts パラメータを true に設定します。

<filter>
  <filter-name>appstats</filter-name>
  <filter-class>com.google.appengine.tools.appstats.AppstatsFilter</filter-class>
  <init-param>
    <param-name>calculateRpcCosts</param-name>
    <param-value>true</param-value>
  </init-param>
</filter>

公開アクセス

デフォルトでは、Appstats コンソールにアクセスできるのは、認証されたアプリケーション管理者だけです。コンソールに対する公開アクセスを許可するには、次のことを行う必要があります。

  • ステップ 2 で作成した AppstatsServlet クラスの servlet 要素に requireAdminAuthentication パラメータを追加し、false に設定します。

    <servlet>
      <servlet-name>appstats</servlet-name>
      <servlet-class>com.google.appengine.tools.appstats.AppstatsServlet</servlet-class>
      <init-param>
        <param-name>requireAdminAuthentication</param-name>
        <param-value>false</param-value>
      </init-param>
    </servlet>
    
  • ステップ 2 で作成した security-constraint 要素を削除します。

4. 開発用サーバーからの Appstats のテスト

Appstats の設定は開発用サーバーでテストできます。

  • Eclipse を使用している場合、デフォルトのポートを変更していなければ、http://localhost:8888/appstats/ でコンソールにアクセスできます。
  • dev_appserver コマンドでサーバーを起動している場合、デフォルトのポートを変更していなければ、http://localhost:8080/appstats/ でコンソールにアクセスできます。

5. デプロイ

Appstats の設定に問題がなければ、アプリケーションをデプロイします。http://your_app_id.appspot.com/appstats でコンソールにアクセスします。

Appstats コンソールについて

Appstats コンソールには、RPC 呼び出しの概要、リクエストされた URL パス、最近のリクエストの履歴、個々のリクエストの詳細が表示されます。

  • [RPC Stats] テーブルには、アプリケーションで実行された RPC の種類別に統計情報が表示されます。[+] ボタンを押すとエントリが展開され、RPC でリクエストされたパス別に詳細が表示されます。

  • [Path Stats] テーブルには、アプリケーションに送信されたパスリクエストの統計情報が表示されます。[+] ボタンをクリックするとエントリが展開され、パス別にリクエストの詳細が表示されます。

    API コスト追跡機能を有効にしている場合には、コストも表示されます。

  • [Requests History] テーブルには、個々のリクエストに関連するデータが表示されます。[+] ボタンを押すとエントリが展開され、RPC 別に詳細が表示されます。リクエストのリンクをクリックすると、個々の RPC の時間と一緒にリクエストのタイムラインが表示されます。

  • RPC タイムラインのグラフには、特定の RPC 呼び出しが実行された時間とリクエストの処理にかかった時間が表示されます。[RPC Total] バーには、RPC 呼び出しの待機時間の合計が表示されます。[Grand Total] バーには、リクエストの処理時間の合計が表示されます。下のタイムラインでは、大半の時間は RPC 呼び出しに使用されています。これは珍しいことではありません。他のタブには、リクエストに関する追加情報が表示されます。パフォーマンスを分析するときに、アプリケーションのレスポンス時間に対する RPC 呼び出しの影響を把握することは重要です。

仕組み

Appstats サーブレット フィルタは、App Engine サービス API の基礎となるリモート プロシージャ コールのフレームワークに自身を追加します。リクエスト ハンドラの実行中に行われたすべての API 呼び出しの統計情報を記録し、__appstats__ の名前空間を使用してデータを memcache に格納します。Appstats は、最新の約 1,000 件のリクエストに関する統計情報を保持します。データには、概要レコード(それぞれ約 200 バイト)と詳細レコード(それぞれ最大 100 KB)が含まれます。

Appstats の Java バージョンは固定値を使用し、データが memcache とデータストアに格納されている場合と同様に動作します(この動作は構成できません。Appstats の Python バージョンでは変更可能です)。

このページは役立ちましたか?評価をお願いいたします。

フィードバックを送信...

Java の App Engine スタンダード環境