Home > GAE和编程 > Appstats for Python

Appstats for Python

April 25th, 2010 发表评论 阅读评论

前段时间在Google App Engine官方博客上看到app_engine更新了关于“Application profile with python & java appengine  and Appstats”的文章 Easy Performance Profiling with Appstats ,目前Google App Engine文档中已有英文原文。

注:Appstats是一个可视化的性能分析工具,是大名鼎鼎的Python作者Guido写的,具体内容请参考Appstats

Python的SDK包含了一套叫做Appstats的用于衡量你的应用程序性能的工具。 Appstats与您的Web应用框架集成以记录事件,并提供一个基于Web的管理界面用于浏览统计.

安装事件记录器(Event Recorder)

为记录Web请求的数据,每个请求句柄必须调用Appstats。这里有两种很容易的方法来将Appstats添加到你的处理程序代码中。

  • 一个工作在任何WSGI web应用框架(包括webapp)下的run_wsgi_app()函数(在google.appengine.ext.webapp.util包中)扩展
  • 一个Django的Web应用框架的“中间件”类

通过run_wsgi_app()函数使用Appstats

为了在一个WSGI兼容的框架(如webapp应用),你必须使用run_wsgi_app()函数来调用您的请求处理程序的脚本应用。举个例子:你可以使用类似于下面代码创建一个Webapp应用的应用实例,并运行它:

from google.appengine.ext import webapp
from google.appengine.ext.webapp.util import run_wsgi_app

application = webapp.WSGIApplication([('/', MainPage),
                                      ('/newentry', NewEntry),
                                      ('/editentry', EditEntry),
                                      ('/deleteentry', DeleteEntry),
                                     ],
                                     debug=True)

def main():
    run_wsgi_app(application)

if __name__ == '__main__':
    main()

如果你使用另外一种方法来调用WSGI应用程序,(如wsgiref.handlers.CGIHandler),你必须修改你的处理程序都使用run_wsgi_app()来使用Appstats。

接下来,在你的应用根目录下创建一个名为appengine_config.py的文件,并写入以下内容的代码:

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

run_wsgi_app()函数导入这个文件,并且调用webapp_add_wsgi_middleware(app)功能(如果发现的话)。

在下文查看Configuring Appstats关于appengine_config.py的更多信息。

在Django中使用Appstats

要在Django应用中安装Appstats中间件,编辑您的settings.py文件,在MIDDLEWARE_CLASSES中的第一行中添加以下的内容:

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

    # ...
)

Appstats中间件必须放在第一项目位置,以使分析器可以在统计数据中包括其他中间件。

你不必改动其他其他程序代码,Django中间件可以在适当的时候调用Appstats记录事件。

设置管理界面

你可以通过在app.yaml文件中加入请求处理程序来启用Appstats。你可以使用任何url以/stats.*结尾的路径来启用界面,在你的app.yaml文件中加入以下URL句柄:

- url: /stats.*  script: $PYTHON_LIB/google/appengine/ext/appstats/ui.py

这个例子将所有的URL以/stats开始的路径影射到Appstats UI界面。(记住在URL模式的结尾包含.*来将所有URL路径映射到以这个为前缀的接口上。)

补充:Appstats网络接口只能由应用程序管理员访问。这已经在Appstats代码中处理,因此该句柄并不需要在配置中限制:login: admin。脱离登陆限制使得Appstats更易于在开发工具中使用。

要访问您的应用程序的Appstats界面,请使用您的浏览器访问您选择的网络路径。你可以使用开发工具测试,以确保设置正确:http://localhost:8080/stats

配置 Appstats

你可以通过在您的应用程序的根目录创建名为appengine_config.py的文件来配置Appstats。对于一个配置选项的完整例子,请参阅SDK中的文件:google/appengine/ext/appstats/sample_appengine_config.py

了解关于appengine_config.py的一些事:

  • 如果你的请求句柄修改sys.path,那么你必须在appengine_config.py中对sys.path做出同样的修改,这样在Appstats中才能看到所有文件。
  • 如果您使用run_wsgi_app()方法来调用 Django(而不是使用上述方法的中间件)和调用google.appengine.dist.use_library()方法来选择Django的版本,您也必须添加此调用appengine_config.py。 (我们建议使用中间件的方法代替。)

如何工作

Appstats使用API钩子来添加自身到基于App Engine服务API的远程过程调用框架。它记录所有调用API的统计,然后将这些数据使用__appstats__的名字空间存储到分布式内存数据缓存(Memcache)。Appstats保留对最近1000次请求的统计数据,这些数据中的每个数据包括大约200字节的简要记录和高达100KB详细记录。你可以控制详细记录存储的数量。(参见配置Appstats和示例配置文件。)

API钩子增加一些请求处理的开销,Appstats在日志报告的“info”级别增加了一个由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://appid.appspot.com/stats/detail?time=1234567890123

此行报告了memcache键更新,该摘要(部分)和细节(全部)记录,和用于记录此信息花费的时间(秒级)。该日志行包括到Appstats管理界面显示此事件的数据的链接。

补充:由于Appstats钩子直接挂到远程过程调用的框架中,管理界面可以使用API名称来区分您的应用程序使用的Python API。这些名称大多是直观的:例如datastore_v3.Get称为db.get()db.Model.get()。数据记录(Datastore)查询通常涉及一个datastore_v3.RunQuery,其次是0个或者多个datastore_v3.Next查询。(RunQuery返回第一个较少的结果,因此API仅当获取较多结果才使用Next调用,避免不必要的Next调用可能会加快您的应用程序速度!)

参考自: Appstats for Python

转载请以超链接注明来自  云在天边看世界
本文永久链接  http://www.tangblog.info/2010/04/25/Appstats-for-python.html

分类: GAE和编程 标签: ,

  1. avatar
    云在天边 2010-05-21 at 16:41 |#16

    @leyond-453002
    参照别人修改的,但不是用自带的那个
  2. avatar
    leyond 2010-05-21 at 15:45 |#15

    你这个代码插件是自己弄的吗
  3. avatar
    云在天边 2010-05-14 at 11:22 |#14

    @DualR-416001
    你设个logging info吧,这样可以到后台logs下看一下是哪里出问题了
  4. avatar
    DualR 2010-05-14 at 11:15 |#13

    @云在天边-415001邮件发送人是管理员。
  5. avatar
    云在天边 2010-05-14 at 11:13 |#12

    @DualR-410002
    你设置的邮件发送人是管理员吗?只有成为该项目的管理员的邮箱才能成功发送邮件
  6. avatar
    DualR 2010-05-13 at 23:33 |#11

    @云在天边-411001收到了,需要配置某些地方吗?日志显示
    Mail API Calls 5 of 7,000 Okay
    Recipients Emailed 5 of 2,000 Okay
    可是却收不到邮件。
  7. avatar
    云在天边 2010-05-13 at 22:16 |#10

    @DualR-410001
    我来回复,测试一下,收到了吗,呵呵
  8. avatar
    DualR 2010-05-13 at 21:44 |#9

    我选在了下面的“有回复时邮件通知我”,想测试下你的blog的这个功能。google app engine 邮件服务似乎不稳定,我给自己的blog也添加了这个功能,似乎不行,就有两次成功收到了邮件。
  9. avatar
    leyond 2010-05-12 at 18:09 |#8

    引用云在天边
    @leyond-398002

    嗯,自己动手以后就会更熟悉哦

    恩,如果我知道有commet.emmail这个变量,我就会了。参考了弄好了
  10. avatar
    云在天边 2010-05-11 at 18:55 |#7

    @leyond-398002
    嗯,自己动手以后就会更熟悉哦
  11. avatar
    leyond 2010-05-11 at 17:53 |#6

    @云在天边-403001
    理论我明白了 thx
  12. avatar
    云在天边 2010-05-11 at 17:24 |#5

    @leyond-377003
    这个模版首先需要有admin的独立style设置,然后你需要在comments.html修改一下,加上判断当前用户是否是管理员或者匹配某个份信息。
    如:{% ifequal comment.email '***@example.com' %}
    代码
    {%else%}
    代码
    {% endifequal %}
  13. avatar
    leyond 2010-05-11 at 17:13 |#4


    你的评论,头像怎么会显示在右边呢,这个不错,可以指点下我吗?
  14. avatar
    test 2010-04-27 at 11:30 |#3

    手机测试
  15. avatar
    云在天边 2010-04-26 at 14:48 |#2

    @yanpeng-274003
    不怎么样啊。。。
  16. avatar
    yanpeng 2010-04-26 at 14:46 |#1

    广告的效果咋样啊
Comment pages
  1. 本文目前尚无任何 trackbacks 和 pingbacks.
/static/smilies/icon_twisted.gif /static/smilies/icon_smile.gif /static/smilies/icon_cry.gif /static/smilies/icon_question.gif /static/smilies/icon_razz.gif /static/smilies/icon_mrgreen.gif /static/smilies/icon_sad.gif /static/smilies/icon_evil.gif /static/smilies/icon_exclaim.gif /static/smilies/icon_redface.gif /static/smilies/icon_biggrin.gif /static/smilies/icon_surprised.gif /static/smilies/icon_eek.gif /static/smilies/icon_confused.gif /static/smilies/icon_cool.gif /static/smilies/icon_lol.gif /static/smilies/icon_mad.gif /static/smilies/icon_rolleyes.gif /static/smilies/icon_wink.gif /static/smilies/icon_idea.gif /static/smilies/icon_arrow.gif /static/smilies/icon_neutral.gif
capacha 请输入验证码(不区分大小写)