Python 如何在Apache下运行的应用程序中保持动态应用程序级统计信息?

Python 如何在Apache下运行的应用程序中保持动态应用程序级统计信息?,python,multithreading,apache,pylons,fork,Python,Multithreading,Apache,Pylons,Fork,我有一个在apache下运行的应用程序,我想保留“即时”统计数据。我想让应用程序告诉我以下内容: 每秒请求数,按请求类型细分 通过thrift向各种后端服务发出请求的延迟(按服务和服务器细分) 每秒服务的错误数 等等 我希望这样做没有任何外部依赖。但是,我遇到了在apache进程之间共享统计信息的问题。显然,我不能只使用全局内存。这类问题的好模式是什么 该应用程序是使用pylons用python编写的,尽管我怀疑这更像是一个“跨进程通信”的设计问题,而不是特定于python的问题。也许您可以

我有一个在apache下运行的应用程序,我想保留“即时”统计数据。我想让应用程序告诉我以下内容:

  • 每秒请求数,按请求类型细分
  • 通过thrift向各种后端服务发出请求的延迟(按服务和服务器细分)
  • 每秒服务的错误数
  • 等等
我希望这样做没有任何外部依赖。但是,我遇到了在apache进程之间共享统计信息的问题。显然,我不能只使用全局内存。这类问题的好模式是什么


该应用程序是使用pylons用python编写的,尽管我怀疑这更像是一个“跨进程通信”的设计问题,而不是特定于python的问题。

也许您可以将相关计数器和其他统计信息保存在所有apache进程都可以访问的memcached中?

使用pylons.g对象。它是Pylons应用程序的lib/app_Globals.py文件中Globals类的实例。它的状态变化对所有线程都是可见的,所以其中的内容必须是线程安全的

lib/app_globals.py:

class Globals(object):
    def __init__(self):
        self.requests_served = 0
控制器/status.py:

from pylons import g

class StatusController(BaseController):
    def status(self):
        g.requests_served += 1
        return "Served %d requests." % g.requests_served
我想在没有任何外部干扰的情况下完成这项工作 依赖关系

如果您的apache不知何故死亡怎么办?(关注点分离?)

就我个人而言,我使用(冗余)来监控硬件本身、服务、和应用程序指标。通过这种方式,我可以轻松/自动绘制“每秒请求/在线用户”、“cpu负载/每秒用户活动X”等图表,这些图表对很多事情都有帮助

为nagios编写插件真的很容易,而且任何语言都有数千个预制脚本

Apache监控

我通过nagios插件从apache mod_状态页面提取所需信息来监控apache

插件响应示例:

APACHE正常-0.080秒。响应时间,忙/闲18/16,打开766/800,请求12.4,字节PERREQ 3074,字节PERSEC 38034

应用程序监控

我使用mod_status作为示例,列出了您希望监视的内容

对于我们的应用程序,我们有一个非常小的Nagios插件框架,因此基本上每个Nagios检查都是一个小类,它对缓存或数据库运行检查,并将其值返回给Nagios(小而简单的命令行脚本)

更多示例:

Memcache:
OK - consumption: 82.88% (106.1 MBytes/128.0 MBytes), connections: 2, requests/s: 10.99, hitrate: 95.2% (34601210/36346999), getrate: 50.1% (36346999/72542987)

Application feature #1 usage:
OK - last 5m: 22 last 24h: 655 ever: 26121

Application feature #2 usage:
OK - last 5m: 39 last 24h: 11011

Other applications metrics:
OK - users online: 556
我想说的是:为应用程序监控扩展Nagios非常容易。 我的小框架花了我3-4个小时来编写,现在我添加的任何检查都只需要几分钟


是的,这是一个想法,但正如我前面提到的,我真的希望它在没有任何外部依赖的情况下工作,因为它将用于在其他服务可能无法正常工作时诊断问题。这不适用于不同的流程(预工作和工作模型都会发生这种情况)。这是显而易见的方法,我们已经尝试过:)我们正在使用nagios。但是,我们希望收集应用程序级别的统计数据,这些统计数据超出了mod_status所能提供的范围。也许重新表述这个问题的一个好方法是“如何使用自定义应用程序统计信息创建类似mod_status的东西?”编辑我的答案以了解更多应用程序监控细节