Python 用 Appstats

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

  • Datastore 呼び出し: ndb.get_multi()ndb.put_multi()ndb.gql() など
  • Memcache 呼び出し: memcache.get()memcache.get_multi() など
  • URL Fetch 呼び出し: urlfetch.fetch() など
  • Mail 呼び出し: mail.send() など

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

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

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

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

アプリケーションでの RPC の使用を最適化することにより、コストを削減できます。アプリのリソース使用量の管理をご覧ください。

動画デモを見る

設定

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

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

ウェブ リクエストに関する統計情報を記録するには、アプリケーションの各リクエスト ハンドラで Appstats を呼び出す必要があります。アプリケーションで使用しているフレームワークに応じて、次のいずれかを選択します。

  • WSGI リクエスト ハンドラ

    WSGI フレームワーク(webapp2 など)を含め、WSGI リクエスト ハンドラとともに Appstats を使用するには、WSGI アプリケーションを Appstats ミドルウェアでラップする必要があります。そのための最も簡単な方法は、WSGI ミドルウェアの定義により、appengine_config.py を使ってすべての WSGI アプリケーションをラップすることです。

    アプリケーションのルート ディレクトリに appengine_config.py というファイルがない場合は作成します。このファイルに以下の関数を追加します。

    def webapp_add_wsgi_middleware(app):
        from google.appengine.ext.appstats import recording
        app = recording.appstats_wsgi_middleware(app)
        return app

    WSGI アプリケーションを呼び出す前に、ランタイムはこのファイルをインポートし、webapp_add_wsgi_middleware 関数(見つかった場合)を呼び出します。

    appengine_config.py について詳しくは、下記のオプションの設定をご覧ください。

  • Django フレームワーク

    Appstats ミドルウェアを Django アプリケーションにインストールするには、settings.py ファイルを編集し、次の行を MIDDLEWARE_CLASSES の最初の項目として追加します。

    MIDDLEWARE_CLASSES = (
      'google.appengine.ext.appstats.recording.AppStatsDjangoMiddleware',
    
      # ...
    )
    

    Appstats ミドルウェアは 1 つ目の項目でなければなりません。これにより、プロファイラは他のミドルウェアを統計情報に含めることができます。

    Django ミドルウェアは必要に応じて、Appstats を呼び出してイベントを記録します。他のアプリケーション コードを変更する必要はありません。

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

Appstats のコンソールにアクセスするには、ウェブブラウザでアプリケーションの URL に移動します。この URL のパスは、以下に示す 2 つの方法のいずれかで設定する必要があります。

  • デフォルト URL

    Appstats をデフォルトのディレクトリ(/_ah/stats/)にマッピングするには、appstats ビルトインを app.yaml ファイルに追加します。

    runtime: python27
    api_version: 1
    threadsafe: yes
    
    builtins:
    - appstats: on
    
    handlers:
    - url: .*
      script: main.app
    

  • カスタム URL

    Appstats をデフォルト以外のディレクトリにマッピングする必要がある場合、url ディレクティブを app.yaml で使用できます。

    - url: /stats.* script: google.appengine.ext.appstats.ui.app

3. オプションの設定

Appstats の動作を設定するには、コンテンツをアプリケーションのルート ディレクトリの appengine_config.py ファイルに追加します。設定オプションのさまざまな例については、SDK の google/appengine/ext/appstats/sample_appengine_config.py ファイルをご覧ください。

appengine_config.py については次の点にご注意ください。

  • リクエスト ハンドラが sys.path を変更する場合は、同じ内容の変更を appengine_config.pysys.path に加えて、Appstats ウェブ インターフェースですべてのファイルを表示できるようにする必要があります。

コストの表示

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

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

Appstats の設定は開発用サーバーでテストできます。上記のデフォルト URL を使用するようにコンソールパスを設定した場合、コンソールには http://localhost:8080/_ah/stats/ からアクセスできます。

5. デプロイ

Appstats の設定に問題がなければ、アプリケーションをデプロイします。上記のデフォルト URL を使用するようにコンソールパスを設定した場合、コンソールには http://your_app_id.appspot.com/_ah/stats からアクセスできます。

Appstats コンソールについて

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

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

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

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

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

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

  • Interactive Playground では、デベロッパーがウェブフォームに任意の Python コードを入力し、アプリの環境内で実行できます。

    Interactive Playground を使用するには、Appstats に移動して該当するリンクをクリックします。1 つのテキスト領域で構成されるフォームが表示されます。テキスト領域に任意の Python コードを入力し、フォームを送信して実行します。標準出力に出力された結果がテキスト領域の横に表示され、コードで生成された RPC 呼び出しのタイムライン分析が表示されます。

    Interactive Playground は、有効にするか無効にするかを切り替え可能です。SDK ではデフォルトで有効になり、本番環境ではデフォルトで無効になります。有効にするには、appengine_config.py ファイルに次の行を追加します。

    appstats_SHELL_OK = True
    

仕組み

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

API フックによって、要求ハンドラにオーバーヘッドがかかります。Appstats は、「情報」レベルのメッセージをログに追加して、Appstats ライブラリ自体で消費されているリソースの量をレポートします。ログには次のような行が出力されます。

INFO 2009-08-25 12:04:07,277 recording.py:290] Saved; key: __appstats__:046800, part: 160 bytes, full: 25278 bytes, overhead: 0.019 + 0.018; link: http://your_app_id.appspot.com/stats/detail?time=1234567890123

この行では、更新された memcache キー、概要レコード(part)と詳細レコード(full)のサイズ、この情報の記録にかかった時間(秒)をレポートしています。ログ行には、このイベントのデータが表示される Appstats 管理インターフェースへのリンクも含まれます。

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

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

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