我有一个Flask服务器,它有一个metrics()
端点(它是名为count_var
的变量的使用者)。
Prometheus通过每10秒调用此metrics()端点来获取数据
有一个名为run_job
的生产者线程,由该服务器在开始时使用以下代码创建,该线程每30秒运行一次以填充该count_var
以下所有代码都在test.py中
if __name__ == '__main__':
def run_job():
while True:
try:
app.logger.info("collect metrics....")
getMetrics()
except Exception as e:
app.logger.info("Exception {}".format(e))
pass
time.sleep(30)
thread = threading.Thread(target=run_job)
thread.start()
app.logger.info('start server')
app.run('0.0.0.0')
我有一个工作getMetrics()
代码,它声明了如下的全局变量(变量在metrics()
中使用,并在prometheus中正确显示)
import threading
count_var = 0
app = Flask(__name__)
def getMetrics():
global count_var
# fill count_var here
此代码的使用者是metrics()端点
@app.route("/metrics", methods=['GET'])
def metrics():
PROMCOUNT.set(count_var)
return
Response(prometheus_client.generate_latest(registry),
mimetype=CONTENT_TYPE_LATEST)
我想避免完全使用全局变量。我查看了在进程和线程之间共享count_var
的队列,但数据的生成和消耗速率不同(而且getMetrics()
可能会出错或阻塞,当调用metrics()
端点时,队列将为空)
我还研究了multiprocessing
,但是从示例中我看到您需要启动与multiprocessing.Process
共享数据的进程……我不能使用它来创建使用者,因为这是一个REST端点
目前没有回答
相关问题 更多 >
编程相关推荐