У меня есть сервер Flask с конечной точкой metrics()
(которая является потребителем для переменной с именем count_var
). Прометей очищает данные, вызывая эту конечную точку metrics () каждые 10 с. В начале этого сервера на этом сервере создается поток с именем 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()
) I также рассмотрел multiprocessing
, но из примеров, которые я видел, необходимо запустить процессы, совместно использующие данные с multiprocessing.Process
... Я не могу использовать его для создания потребителя, поскольку это конечная точка REST