Python 2 適用的 Appstats

Python 2 SDK 包含 Appstats 程式庫,這個程式庫可用於剖析應用程式遠端程序呼叫 (RPC) 的效能。App Engine RPC 是應用程式與 App Engine Service API 之間的來回網路呼叫。例如以下 API 呼叫都是 RPC 呼叫:

  • Datastore 呼叫,例如 ndb.get_multi()ndb.put_multi()ndb.gql()
  • Memcache 呼叫,例如 memcache.get()memcache.get_multi()
  • 網址擷取呼叫,例如 urlfetch.fetch()
  • 郵件呼叫,例如 mail.send()

可擴充應用程式的最佳化或除錯工作可能相當困難,因為有許多問題可能會導致效能不彰或產生預期外的費用。這些問題非常難以透過常見的資訊來源 (如記錄檔或要求的時間統計資料) 進行偵錯。大多數的應用程式要求會將大部分時間花在等待網路呼叫完成,屬於滿足要求的過程之一。

為了讓應用程式保持快速運作,您必須知道以下事項:

  • 您的應用程式是否發出不必要的 RPC 呼叫?
  • 如要取得相同的資料,是否應對資料進行快取處理,而非重複發出 RPC 呼叫?
  • 如果平行執行多個要求,而非序列執行,應用程式的執行效果是否會更好?

Appstats 資料庫可協助您回答這些問題,並且讓您能夠剖析 RPC 呼叫,以驗證應用程式是否正以最有效的方式使用 RPC 呼叫。Appstats 可追蹤特定要求的所有 RPC 呼叫,並回報每次呼叫的時間與成本。

將應用程式的 RPC 使用量最佳化,或許也可以減少您的支出。請參閱「管理應用程式資源」。

觀看影片示範。

設定

Appstats 無須下載或安裝,即可開始使用。您只需如下步驟所述,設定您的應用程式、重新部署並存取 Appstats 指控台即可,其餘部分由 Appstats 資料庫負責。

1.安裝事件記錄器

如果要記錄網路要求的統計資料,您應用程式的每個要求處理常式皆須叫用 Appstats。請依據您應用程式使用的架構,選擇以下其中一項:

  • WSGI 要求處理常式

    如果要以 WSGI 要求處理常式使用 Appstats,包括 webapp2 這類 WSGI 架構,請務必將 appstats 中介軟體納入 WSGI 應用程式。達成此目的最簡單的方法,就是使用 appengine_config.py 定義 WSGI 中介軟體,以納入每個 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 架構

    如要在 Django 應用程式中安裝 Appstats 中介軟體,請編輯 settings.py 檔案,並新增下列程式碼,將該行做為 MIDDLEWARE_CLASSES 中的第一個項目:

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

    Appstats 中介軟體必須為第一個項目,分析器才能將其他中介軟體納入統計資料中。

    在適當情況下,Django 中介軟體會呼叫 Appstats 來記錄事件。您無需變更任何其他的應用程式程式碼。

2. 設定主控台路徑

您可以使用網頁瀏覽器前往您應用程式的網址,進入 Appstats 主控台。可使用以下其中一種方法設定網址路徑:

  • 預設網址

    如果要將 Appstats 對應至預設目錄 (/_ah/stats/),請將 appstats 內建項目新增至 app.yaml 檔案:

    runtime: python27
    api_version: 1
    threadsafe: yes
    
    builtins:
    - appstats: on
    
    handlers:
    - url: .*
      script: main.app
    
  • 自訂網址

    如果需要將 Appstats 對應至預設目錄以外的目錄,請在 app.yaml 中使用 url 指令:

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

3. 選用設定

您可以在應用程式根目錄的 appengine_config.py 檔案中新增內容,以設定 Appstats 的行為。如需完整的設定選項範例,請查看 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 設定。如果將主控台路徑設為預設網址,就可以在 http://localhost:8080/_ah/stats/ 使用主控台。

5. 部署

如果您對 Appstats 設定感到滿意,請部署應用程式。如果您設定控制台路徑以使用上述預設網址,可以前往 http://your_app_id.appspot.com/_ah/stats 存取控制台。

Appstats 主控台導覽

Appstats 主控台會提供各種高階資訊,包括已發出的 RPC 呼叫、要求的網址路徑、近期要求記錄以及個別要求的詳細資料:

  • 「RPC Stats」表格會顯示應用程式發出的各個 RPC 類型統計資料。按一下加號按鈕,便會展開項目,依照 RPC 的路徑要求顯示細項資料:

    螢幕截圖

  • 「Path Stats」表格會顯示傳送到應用程式的每個路徑要求的統計資料。按一下加號按鈕,便會展開項目,依照路徑要求的 RPC 來顯示細項資料:

    螢幕截圖

    如果啟用 API 成本追蹤功能,該表格也會顯示成本。

  • 「Requests History」表格會顯示個別要求的相關資料。按一下加號按鈕,便會展開項目,依照 RPC 顯示細項資料。按一下要求連結,則會顯示要求的時間軸,包括個別 RPC 的時間:

    螢幕截圖

  • RPC 的「Timeline」圖表會顯示發起特定 RPC 呼叫的時間,以及處理要求所花的時間。「RPC Total」長條代表等待 RPC 呼叫所花的總時間,而「Grand Total」長條則是處理要求所花的總時間。如下列時間軸所示,大多數時間都花在 RPC 呼叫。通常都是如此情況。其他分頁則會顯示要求的其他相關資訊。在分析效能時,瞭解 RPC 呼叫對應用程式回應時間的影響,是相當重要的一點。

    螢幕截圖

  • 開發人員可透過「Interactive Playground」將任意 Python 程式碼輸入至網路表單,並在應用程式環境的內部執行。

    前往 Appstats 後,請按一下 Interactive Playground 的連結。會出現只有一個文字區域的表單。請在文字區域中輸入任何 Python 程式碼,然後提交表單,即可執行該程式碼。文字區域會顯示標準輸出下會顯示的任何結果,同時顯示程式碼產生的 RPC 呼叫的時間軸分析。

    可啟用或停用 Interactive Playground。在 SDK 中,該功能預設為啟用,在實際工作環境中則時預設停用。如要啟用這項功能,請在 appengine_config.py 檔案中加入以下這行程式碼:

    <pre suppresswarning="yes" class="prettyprint">
    appstats_SHELL_OK = True
    </pre>
    

運作方式

Appstats 會使用 API 掛鉤將自己新增至 App Engine 服務 API 底層的遠端程序呼叫架構內,並記錄要求處理常式期間所有進行的 API 呼叫的統計資料,然後再使用 __appstats__ 的命名空間將資料儲存到 Memcache 中。Appstats 最多可保留最近 1,000 筆要求的統計資料。資料包含摘要記錄,每筆記錄約 200 位元組,並包含詳細的記錄,每筆最多 100 KB。您可以控制詳細資訊記錄中儲存的資訊量。(請參閱「選用設定」和設定檔範例)。

API 掛鉤會對要求處理常式增加一點負擔。Appstats 會在 info 等級的記錄中新增訊息,以回報 appstats 資料庫自身所消耗的資源數量。記錄行外觀如下:

<pre suppresswarning="yes" class="prettyprint">
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.[REGION_ID].r.appspot.com/stats/detail?time=1234567890123
</pre>

這行會回報已更新的 Memcache 索引鍵、摘要 (part) 和詳細資料 (full) 記錄的大小,以及記錄這項資訊所花費的時間 (以秒為單位)。行中將包含 Appstats 管理介面的連結,而此事件的資料即顯示在該介面中。