我正在运行地址为127.0.0.1:5000的网络应用,并且正在使用Prometheus的python客户端库。我使用docs中示例中的start_http_server(8000)
来公开该端口上的指标。该应用程序运行,但我得到[Errno 48] Address already in use
并且当我尝试点击它时,localhost:8000没有连接任何东西。
如果我无法从一个网络应用启动两个服务器,那么我应该将哪个端口传递到start_http_server()
以显示指标?
在启动应用程序之前,任何端口上都没有运行任何内容。
答案 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
以解决它