python экспортирует несколько реестров prometheus с одним портом

#python-3.x #jenkins #python-requests #prometheus #metrics

Вопрос:

мне нужна ваша помощь в python pleaaaaz

у меня есть скрипт на python с метрикой семейства датчиков для экспорта метрик Дженкинса в prometheus с двумя классами экспортеров : jenkinsCollector и PollScm. вот некоторые из кода :

 class JenkinsCollector:  def __init__(self, jenkinsInstances): // some code  def collect(self): // some code for gauge metric  class pollScm:  def __init__(self, jenkinsInstances): // some code  def collect(self): // some code for gauge metric  registrynode = CollectorRegistry()  registrynode.register(JenkinsCollector(  jenkinsInstances=jenkinsInstances ))  start_http_server(port=9759,registry=registrynode)    registryscm = CollectorRegistry()  registryscm.register(pollScm(  jenkinsInstances=jenkinsInstances ))  start_http_server(port=9759,registry=registryscm)   

экспорт работает только для одной метрики !! либо jenkinsCollector, либо PollScm, потому что они используют один и тот же порт !! поэтому, чтобы это сработало, я должен прокомментировать либо эту часть

 registrynode = CollectorRegistry()  registrynode.register(JenkinsCollector(  jenkinsInstances=jenkinsInstances ))  start_http_server(port=9759,registry=registrynode)  

Или эта часть

 registryscm = CollectorRegistry()  registryscm.register(pollScm(  jenkinsInstances=jenkinsInstances ))  start_http_server(port=9759,registry=registryscm)  

Я попытался найти способ в python использовать несколько реестров с одним и тем же портом, так как я работаю в образе докера, который предоставляет порт 9759, и попробовал это :

 class JenkinsCollector:  def __init__(self, jenkinsInstances): //some code  **@app.route('/collectormetrics')**  def collect(self): //some code of gauge metric class pollScm:  def __init__(self, jenkinsInstances): //some code  **@app.route('/pollmetrics')**  def collect(self): //some code of gauge metric if __name__ == '__main__':  if environ['PATH_INFO'] == '/collectormetrics':  registrynode = CollectorRegistry()  registrynode.register(JenkinsCollector(  jenkinsInstances=jenkinsInstances ))  start_http_server(port=9759,registry=registrynode)  elif environ['PATH_INFO'] == '/pollmetrics':  registryscm = CollectorRegistry()  registryscm.register(pollScm(  jenkinsInstances=jenkinsInstances ))  start_http_server(port=9759,registry=registryscm)  

Но это не сработало !! мне нужен способ разрешить обоим реестрам экспортеров использовать один и тот же порт, но использовать другой путь ( ‘ / ‘ ), чтобы сервер мог вызывать запрос с одним и тем же портом, но в зависимости от пути маршрута угадать, какая метрика должна отображаться!

я вам очень благодарен.

Комментарии:

1. Это не будет работать с start_http_server тем , что происходит из библиотеки prometheus_client. Похоже, что вы также определили маршруты в Flask (?), поэтому вместо этого вам следует создать полноценное приложение Flask. Ты не можешь иметь и то, и другое.