簡體   English   中英

Prometheus python 客戶端錯誤地址已被使用

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM