[英]Prometheus python client error Address already in use
我正在運行一個地址為 127.0.0.1:5000 的網絡應用程序,並且正在使用 Prometheus 的 python 客戶端庫。 我使用他們文檔中示例中的start_http_server(8000)
來公開該端口上的指標。 應用程序運行,但我得到[Errno 48] Address already in use
,當我嘗試點擊它時 localhost:8000 沒有連接到任何東西。
如果我無法從一個 Web 應用程序啟動兩台服務器,那么我應該將哪個端口傳遞給start_http_server()
以公開指標?
在我啟動應用程序之前,兩個端口上都沒有運行任何東西。
其他一些進程正在使用端口 (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
標准輸出上應該沒有任何內容。
這主要是因為您在端口 8000 上再次重新啟動服務器。
為了解決這個問題,我創建了一個函數,該函數將在確保可以使用以前的服務器或端口后創建服務器。
您可以查看https://github.com/prometheus/client_python/issues/155 ,這里解決了相同的案例
端口 8000 不需要在其上運行 Web 服務器即可使其已在使用中。 使用您的操作系統命令行查找正在使用端口的進程,然后將其殺死。 如果服務也在運行,導致它再次生成,請禁用該進程。
一個更簡單的解決方案是使用另一個端口而不是 8000。
編輯:看起來這是普羅米修斯中的一個錯誤。 Github 問題
你不能在同一個線程上運行兩個 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
可能你的8000端口被占用了。 您可以將其更改為其他端口,例如 8001
當flask的debug
模式設置為True
,flask服務器啟動后代碼重新加載,第二次調用到prometheus服務器的綁定
將燒瓶應用程序debug
參數設置為False
以解決它
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.