Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 1 addition & 0 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,7 @@

* Add support for Django 6.1.
* Drop support for Python 3.9.
* Fold unknown HTTP methods into `<invalid method>` in `django_http_requests_latency_seconds_by_view_method`, like the other per-method metrics.
* TBD

## v2.5.0 - May 26th, 2026
Expand Down
4 changes: 2 additions & 2 deletions django_prometheus/middleware.py
Original file line number Diff line number Diff line change
Expand Up @@ -287,7 +287,7 @@ def process_response(self, request, response):
request,
response,
view=self._get_view_name(request),
method=request.method,
method=self._method(request),
).observe(TimeSince(request.prometheus_after_middleware_event))
else:
self.label_metric(self.metrics.requests_unknown_latency, request, response).inc()
Expand All @@ -303,7 +303,7 @@ def process_exception(self, request, exception):
self.metrics.requests_latency_by_view_method,
request,
view=self._get_view_name(request),
method=request.method,
method=self._method(request),
).observe(TimeSince(request.prometheus_after_middleware_event))
else:
self.label_metric(self.metrics.requests_unknown_latency, request).inc()
20 changes: 20 additions & 0 deletions django_prometheus/tests/end2end/testapp/test_middleware.py
Original file line number Diff line number Diff line change
Expand Up @@ -131,6 +131,26 @@ def test_exception_latency_histograms(self, client):
method="GET",
)

def test_latency_histograms_bound_invalid_methods(self, client):
# Unknown HTTP methods are client-controlled and must be folded
# into "<invalid method>" for the latency histogram too, like the
# other per-method metrics, to keep label cardinality bounded.
registry = save_registry()
client.generic("FOOBAR", "/help")
assert_metric_diff(
registry,
1,
M("requests_latency_seconds_by_view_method_count"),
view="testapp.views.help",
method="<invalid method>",
)
assert_metric_equal(
None,
M("requests_latency_seconds_by_view_method_count"),
view="testapp.views.help",
method="FOOBAR",
)

def test_streaming_responses(self, client):
registry = save_registry()
client.get("/")
Expand Down