Open hmellor opened 7 months ago
@kakkoyun this might be something to look at to learn more about the project as well.
Thanks for pointing this out @hmellor. I was am doing something similar but got an "Method Not Allowed" when doing a GET request for http://localhost:8000/metrics. I am using hypercorn but I do not get the redirect. However, this does seem to work
curl http://localhost:8000/metrics/
I think I found the root cause. It has to do with how FastApi and Starlette (which FastApi is based on) are mounting sub-applications. A metrics sub-application is created as follows:
metrics_app = make_asgi_app()
app.mount("/metrics", metrics_app)
And from FastApi and Starlette docs you can read that sub-applications are mounted under a prefix, in this case "/metrics". So when you want to actually access this sub-application I guess a new root endpoint is automatically added thus creating "/metrics/". Not sure if or how you could fix this, but it looks like this is intended behavior when running the prometheus client as a FastApi sub-application.
Here you can find the docs:
In aioprometheus
(a third party Prometheus client) they use add_route
to expose the metrics and they don't have this problem
from aioprometheus.asgi.starlette import metrics
app.add_route("/metrics", metrics)
Yes, that is exactly the cause. In this client the make_asgi_app() creates a sub-application that is mounted with app.mount() thus creating a "/metrics" prefix vs an actual route. While the aioprometheus.asgi.starlette implementation is adding a route directly with _app.addroute(). So "/metrics" is the actual route and not a prefix.
This workaround appears to work (changes route.path_regex
from ^/metrics/(?P<path>.*)$
to ^/metrics(?P<path>.*)$
):
import re
from starlette.routing import Mount
...
# Add prometheus asgi middleware to route /metrics requests
route = Mount("/metrics", make_asgi_app())
route.path_regex = re.compile('^/metrics(?P<path>.*)$')
app.routes.append(route)
The documentation gives an example application which mounts the ASGI app to
/metrics
in a FastAPI appand says that you should be able to see the metrics at http://localhost:8000/metrics, however if you try to access this endpoint
you get redirected to
/metrics/
.It would be better if this redirect could be avoided.