【问题标题】:Prometheus python client error Address already in usePrometheus python客户端报错地址已经在使用
【发布时间】:2017-06-28 03:28:16
【问题描述】:

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

如果我无法从一个 Web 应用程序启动两台服务器,那么我应该将哪个端口传递给 start_http_server() 以公开指标?

在我启动应用程序之前,两个端口上都没有运行任何东西。

【问题讨论】:

    标签: python monitoring prometheus


    【解决方案1】:

    其他一些进程正在使用端口 (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
    

    标准输出上应该没有任何内容。

    【讨论】:

      【解决方案2】:

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

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

      你可以看https://github.com/prometheus/client_python/issues/155,这里处理的是同样的情况

      【讨论】:

      • 鼓励链接到外部资源,但请在链接周围添加上下文,以便您的其他用户了解它是什么以及为什么存在。始终引用重要链接中最相关的部分,以防目标站点无法访问或永久离线
      【解决方案3】:

      端口 8000 无需在其上运行 Web 服务器即可使用。使用您的操作系统命令行查找正在使用端口的进程,然后将其终止。如果服务也在运行导致它再次生成,请禁用该进程。

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

      编辑: 看起来这是 Prometheus 中的错误。 Github Issue

      【讨论】:

      • 在我开始这个过程之前,8000 上没有运行任何东西。
      • @ralphie9224 我明白了...看起来你发现了一个错误。这是 Prometheus 中一直存在的问题。他们仍在努力修复它。这是对话Pull Request
      【解决方案4】:

      您不能在同一个线程上运行两个 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
      

      【讨论】:

        【解决方案5】:

        可能您的 8000 端口已被占用。可以改成其他端口,比如8001

        【讨论】:

          【解决方案6】:

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

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

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2019-04-08
            • 2017-06-06
            • 2014-09-09
            • 1970-01-01
            相关资源
            最近更新 更多