【问题标题】:How to export app metrics using prometheus client from an Django app running as an uwsgi server?如何使用 prometheus 客户端从作为 uwsgi 服务器运行的 Django 应用程序导出应用程序指标?
【发布时间】: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.pymultiprocess.MultiProcessCollector(core.REGISTRY, mkdtemp()) 和一些仪表,在视图中只有generate_latest()
  • @KlausD。在多进程代码中调用mkdtemp() (跨许多uWSGI 工作人员)是否会创建单独的临时目录,这会破坏将来自多个工作人员的数据存储在一个地方的目的?另外,您如何删除此临时目录,因为 Prometheus 建议应在每次应用启动时清除它。

标签: python django uwsgi prometheus


【解决方案1】:

看起来确实不错。我的工作方式与此类似,只需创建一个视图(与您发布的完全一样),无需修改 wsgi.py

如果未找到任何指标,/metrics 视图将提供一个空白页面。 如果您看到一个空白页面,则记录指标可能有问题。 如果您看到 404,那么您的 urls.py 有问题。

一个常见的错误是调用计数器而不增加它:

# right
my_counter.labels(my_label='a').inc()

# wrong
my_counter.labels(my_label='a')

希望对您有所帮助。

【讨论】:

    猜你喜欢
    • 2011-07-22
    • 2018-01-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多