Patrick José
Patrick José

Reputation: 425

How to check my metrics using prometheus_flask_exporter lib

I want to keep track of metrics in my flask application using the lib prometheus_flask_exporter.

For what i could understand this lib already tracks default metrics in the /metrics endpoint. But when i try to access the http://localhost:5000/metrics I get 404 Not Found.

So i tried to set a histogram metric on the user_list, but i get the same 404 not Found when i try to access the http://localhost:5000/metrics

init.py:

from flask import Flask
from flask_sqlalchemy import SQLAlchemy
from flasgger import Swagger
from flask_caching import Cache
from prometheus_flask_exporter import PrometheusMetrics


app = Flask(__name__)
app.debug = True
app.config.from_object('dev_maintenance.yaml_config_loader')
cache = Cache(app)
db = SQLAlchemy(app)
swagger = Swagger(app)
metrics = PrometheusMetrics(app)


import dev_maintenance.mesos_callback
import dev_maintenance.db_model
import dev_maintenance.active_directory
import dev_maintenance.user_list
import dev_maintenance.audit
import dev_maintenance.machines
import dev_maintenance.yaml_config_loader
import dev_maintenance.roles
import dev_maintenance.user_details


if __name__ == '__main__':
    app.run(debug=True)

user_list.py

from dev_maintenance import app
from flask import jsonify, request
from flask_simpleldap import LDAP
from flask_jwt_extended import jwt_required
from dev_maintenance import metrics


ldap = LDAP(app)


@app.route('/api/user', methods=['GET'])
@metrics.do_not_track()
@metrics.histogram('requests_by_status_and_path', 'Request latencies by status and path',
                   labels={'status': lambda r: r.status_code, 'path': lambda: request.path})
def user_list():

    user_list = []
    users = ldap.get_group_members('ship_crew')

    for user in users:
        user_list.append(str(user, encoding='utf-8').split(",")[0].split("=")[1])
    return jsonify(user_list)

Do i need to create a /metrics route? Because in the git documentation does not say anything about that, so i suppose this is already set behind the scenes.

Upvotes: 6

Views: 2588

Answers (1)

Instead of "app.run(debug=True)" use "app.run(debug=False)". debug=True was breaking things.

From:https://github.com/rycus86/prometheus_flask_exporter/blob/master/README.md

Please note, that changes being live-reloaded, when running the Flask app with debug=True, are not going to be reflected in the metrics. See https://github.com/rycus86/prometheus_flask_exporter/issues/4 for more details.

Alternatively - since version 0.5.1 - if you set the DEBUG_METRICS environment variable, you will get metrics for the latest reloaded code. These will be exported on the main Flask app. Serving the metrics on a different port is not going to work most probably - e.g. PrometheusMetrics.start_http_server(..) is not expected to work.

Upvotes: 8

Related Questions