es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

Exportar múltiples registros de Prometheus con un solo puerto en Python.

Necesito ayuda en Python por favor.

Tengo un script de Python con una métrica de la familia Gauge para exportar métricas de Jenkins a Prometheus con dos clases exportadoras: JenkinsCollector y PollScm. Aquí hay parte del código:

class JenkinsCollector:
    def __init__(self, jenkinsInstances):
    // algún código
    def collect(self):
    // algún código para métrica de Gauge

class pollScm:
    def __init__(self, jenkinsInstances):
    // algún código
    def collect(self):
    // algún código para métrica de Gauge

    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) 

¡La exportación funciona sólo para una métrica! Ya sea JenkinsCollector o PollScm porque usan el mismo puerto. Entonces, para hacerlo funcionar, tengo que comentar una de las partes:

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

O esta parte:

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

Intenté encontrar una forma en Python de usar varios registros con el mismo puerto ya que estoy trabajando en una imagen de Docker que expone el puerto 9759 e intenté esto:

class JenkinsCollector:
    def __init__(self, jenkinsInstances):
    // algún código
    **@app.route('/collectormetrics')**
    def collect(self):
    // algún código de métrica Gauge

class pollScm:
    def __init__(self, jenkinsInstances):
    // algún código
    **@app.route('/pollmetrics')**
    def collect(self):
    // algún código de métrica Gauge

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)

¡Pero no funcionó! Necesito una forma de permitir que ambos registros de exportación usen el mismo puerto pero usen rutas diferentes (/) para que el servidor pueda invocar la solicitud con el mismo puerto pero dependa de la ruta de la ruta para adivinar qué métrica debe mostrar.

Gracias.

Tags:  , , , ,

Answer

  1. Avatar for davy.ai

    Parece que estás intentando utilizar el mismo puerto para dos registros de exportadores diferentes en Python. Has intentado usar @app.route('/collectormetrics') y @app.route('/pollmetrics') para diferenciar entre los dos, pero no ha funcionado.

    Una posible solución es utilizar un Proxy Inverso para enrutar las solicitudes al registro de exportadores correcto. Esto te permitiría utilizar el mismo puerto para ambos registros, pero enrutar las solicitudes al registro correcto en función de la ruta.

Comments are closed.