Prometheus python客户端错误地址已在使用中

时间:2017-06-28 03:28:16

标签: python monitoring prometheus

我正在运行地址为127.0.0.1:5000的网络应用,并且正在使用Prometheus的python客户端库。我使用docs中示例中的start_http_server(8000)来公开该端口上的指标。该应用程序运行,但我得到[Errno 48] Address already in use并且当我尝试点击它时,localhost:8000没有连接任何东西。

如果我无法从一个网络应用启动两个服务器,那么我应该将哪个端口传递到start_http_server()以显示指标?

在启动应用程序之前,任何端口上都没有运行任何内容。

6 个答案:

答案 0 :(得分:2)

某些其他过程正在利用端口(8000)。要终止正在端口(8000)上运行的进程,只需找到该进程的process_id [pid]。

lsof -i :8000

这将向您显示在端口8000上运行的进程,如下所示:

COMMAND   PID   USER   FD   TYPE  DEVICE SIZE/OFF NODE NAME
python3 21271 hashed    3u  IPv4 1430288      0t0  TCP *:8000 (LISTEN)

您可以使用kill命令杀死进程,如下所示:

sudo kill -9 21271

重新检查该进程是否使用相同的命令终止

lsof -i :8000

标准输出上什么也没有。

答案 1 :(得分:1)

这主要是因为您正在端口8000上重新启动服务器。

为解决此问题,我创建了一个函数,该函数将在确保使用前一个服务器或端口后创建服务器。

您可以查看https://github.com/prometheus/client_python/issues/155,此处案例已解决

答案 2 :(得分:0)

端口8000不需要在其上运行Web服务器,因为它已经在使用中。使用您的OS命令行查找正在使用该端口然后将其终止的进程。如果某个服务也在运行,导致它再次生成,请禁用该过程。

更简单的解决方案是使用另一个端口而不是8000。

编辑:看起来这是普罗米修斯的一个错误。 Github Issue

答案 3 :(得分:0)

您不能在同一线程上运行两个http服务器。 我不知道为什么,但是prometheus_client的实现没有在单独的线程上运行服务器。 我的解决办法是

import logging.config
import os

import connexion
from multiprocessing.pool import ThreadPool
from prometheus_client import start_http_server

app = connexion.App(__name__, specification_dir='./')
app.add_api('swagger.yml')


# If we're running in stand alone mode, run the application
if __name__ == '__main__':
    pool = ThreadPool(1)
    pool.apply_async(start_http_server, (8000, ))  # start prometheus in a different thread
    app.run(host='0.0.0.0', port=5000, debug=True) . # start my server

答案 4 :(得分:0)

也许您的8000端口已被占用。您可以将其更改为另一个端口,例如8001

答案 5 :(得分:0)

当flask的debug模式设置为True时,flask服务器启动后重新加载代码,第二次调用到prometheus服务器的绑定

将flask app debug 参数设置为False 以解决它