适用于 Python 2 的 Appstats

Python 2 SDK 包含用于分析应用的 RPC(远程过程调用)性能的 Appstats 库。App Engine RPC 是应用程序与 App Engine 服务 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 请求处理程序

    要将 Appstats 与 WSGI 请求处理程序(包括 webapp2 等 WSGI 框架)一起使用,您必须用 Appstats 中间件封装 WSGI 应用。要实现此目的,最简单的方法是定义一个 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 框架

    要在 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.py 中的 sys.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 的统计信息。点击加号按钮展开条目,以按 RPC 显示路径请求明细:

    屏幕截图

  • Path Stats(路径统计信息)表显示发送给应用的每个路径请求的统计信息。点击加号按钮展开条目,以按路径请求的 RPC 显示明细:

    屏幕截图

    如果您启用了 API 费用跟踪功能,该表还会显示费用。

  • Requests History(请求历史记录)表显示与各个请求相关的数据。点击加号按钮展开条目,按 RPC 显示明细。点击请求链接显示包括单个 RPC 计时的请求的时间轴:

    屏幕截图

  • RPC Timeline(时间轴)图表显示特定 RPC 调用的时间以及处理请求的时长。RPC 总计栏显示等待 RPC 调用的总时间,Grand 总计栏显示处理请求的总时间。从下面的时间轴可以看出,大部分时间都花费在 RPC 调用上。这是导致应用性能低下的常见原因。其他标签页会显示关于请求的其他信息。在分析 RPC 调用的性能时,了解 RPC 调用对应用响应时间的影响是非常重要的。

    屏幕截图

  • 交互式游乐场允许开发人员将任意 Python 代码输入网络表单并在其应用环境中执行。

    导航到 Appstats 后,点击交互式游乐场的链接。这时就会显示带有单个文本区域的表单。在文本区域中输入您喜欢的任意 Python 代码,然后提交表单以执行。打印到标准输出的任何结果都会显示在文本区域旁,并显示代码生成的 RPC 调用的时间轴分析。

    您可以启用或停用交互式游乐场。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>

此行报告了已更新的内存缓存密钥、摘要 (part) 记录和详细信息 (full) 记录的大小、以及记录此信息所花的时间(以秒为单位)。此日志行还提供了指向可显示此事件数据的 Appstats 管理界面的链接。