【发布时间】:2017-07-30 21:31:32
【问题描述】:
我阅读了 prometheus 客户端 https://github.com/prometheus/client_python/#multiprocess-mode-gunicorn 的文档 它提到在 python 中以多进程模式公开指标。我不是 Gunicorn,而是通过 uwsgi 运行 django 应用程序。与文档中的类似,我在项目的 wsgi.py 中添加了代码 -
class WSGIEnvironment(WSGIHandler):
def __call__(self, environ, start_response):
**registry = CollectorRegistry()
multiprocess.MultiProcessCollector(registry)
data = generate_latest(registry)**
django.setup()
return super(WSGIEnvironment, self).__call__(environ,
start_response)
application = WSGIEnvironment()
但在我看来,通过这种方法公开收集的数据并不可行。因此,我在我的 Django 应用程序 /metrics 中公开了一个调用指标视图的 api -
def metrics(request):
registry = CollectorRegistry()
multiprocess.MultiProcessCollector(registry)
data = generate_latest(registry)
print "data", data
return HttpResponse(
data,
content_type=CONTENT_TYPE_LATEST)
我仍然无法查看我的应用程序公开的指标。是否需要任何配置?我想我错过了非常基本的东西。
【问题讨论】:
-
不能在每次调用视图时都创建新的收集器和注册表。将变量放在模块命名空间中(在任何函数或类之外),并且只有一份。
-
创建 MultiProcessCollector 和注册表实际上没问题,如果效率有点低。
-
@KlausD。 - 感谢您的建议。我将这些变量放在函数之外。但是,每当我点击我的 /metrics api 时,我的应用程序在收集指标时会在库级别中断。异常类型 - 'NoneType' 对象没有属性 'endswith'。它在 for metric in collector.collect(): 处失败。是否还有其他我缺少的附加功能,例如“prometheus_multiproc_dir”?
-
我最近在一个项目中遇到了类似的问题。 AFAIR 我会重新安排事情以摆脱它。现在我有一个
prometheus.py和multiprocess.MultiProcessCollector(core.REGISTRY, mkdtemp())和一些仪表,在视图中只有generate_latest()。 -
@KlausD。在多进程代码中调用
mkdtemp()(跨许多uWSGI 工作人员)是否会创建单独的临时目录,这会破坏将来自多个工作人员的数据存储在一个地方的目的?另外,您如何删除此临时目录,因为 Prometheus 建议应在每次应用启动时清除它。
标签: python django uwsgi prometheus