From 8ef3cccac29f1ab99c55a9f1a2c914a7e86533e6 Mon Sep 17 00:00:00 2001 From: Jann Haber Date: Fri, 17 Jun 2022 12:14:58 +0200 Subject: [PATCH 1/2] Make Metrics server listen on IPv4 and IPv6 sockets. --- django_prometheus/exports.py | 12 +++++++++++- 1 file changed, 11 insertions(+), 1 deletion(-) diff --git a/django_prometheus/exports.py b/django_prometheus/exports.py index f88bc218..8bdea583 100644 --- a/django_prometheus/exports.py +++ b/django_prometheus/exports.py @@ -1,6 +1,7 @@ import logging import os import threading +import socket import prometheus_client from django.conf import settings @@ -18,6 +19,15 @@ logger = logging.getLogger(__name__) +def DualStackHTTPServer(HTTPServer): + """ + Default for the python HTTPServer address_family is socket.AF_INET. + This will by default create a server which works IPv4 only. + To add compatibility with IPv6, we set the address_family. + """ + address_family = socket.AF_INET6 + + def SetupPrometheusEndpointOnPort(port, addr=""): """Exports Prometheus metrics on an HTTPServer running in its own thread. @@ -83,7 +93,7 @@ def SetupPrometheusEndpointOnPortRange(port_range, addr=""): ) for port in port_range: try: - httpd = HTTPServer((addr, port), prometheus_client.MetricsHandler) + httpd = DualStackHTTPServer((addr, port), prometheus_client.MetricsHandler) except OSError: # Python 2 raises socket.error, in Python 3 socket.error is an # alias for OSError From 6999652ec5d3ce930f54748204adac457bdb41e3 Mon Sep 17 00:00:00 2001 From: Jann Haber Date: Fri, 17 Jun 2022 20:49:59 +0200 Subject: [PATCH 2/2] Fix the obvious error --- django_prometheus/exports.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/django_prometheus/exports.py b/django_prometheus/exports.py index 8bdea583..bce4b523 100644 --- a/django_prometheus/exports.py +++ b/django_prometheus/exports.py @@ -19,7 +19,7 @@ logger = logging.getLogger(__name__) -def DualStackHTTPServer(HTTPServer): +class DualStackHTTPServer(HTTPServer): """ Default for the python HTTPServer address_family is socket.AF_INET. This will by default create a server which works IPv4 only.