import prometheus_client from rest_framework.views import APIView from rest_framework.permissions import AllowAny from django.http import HttpResponse, HttpResponseNotFound from django.utils.decorators import method_decorator from django.views.decorators.cache import cache_page from django.conf import settings from labs.prometheus.metrics import update_metrics from labs.utils.network import get_client_ip class PrometheusMetricsView(APIView): permission_classes = (AllowAny,) @method_decorator(cache_page(timeout=10)) def get(self, request, *args, **kwargs): # Only allow access from trusted IPs or staff users. if not ( request.user and request.user.is_authenticated and request.user.is_staff ): ip, _ = get_client_ip(request) if ip not in settings.PROMETHEUS_TRUSTED_IPS: return HttpResponseNotFound() update_metrics() return HttpResponse( prometheus_client.generate_latest(), content_type=prometheus_client.CONTENT_TYPE_LATEST, )