#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. Ты не можешь иметь и то, и другое.