vishalanandl177 / DRF-API-Logger

An API Logger for your Django Rest Framework project.
https://github.com/vishalanandl177/DRF-API-Logger
Apache License 2.0
303 stars 57 forks source link

Logger did not log any data for some endpoint on database #86

Closed NunChatSpace closed 10 months ago

NunChatSpace commented 10 months ago

Hi everyone,

Thank you for your help and sorry for taking your time. I'm beginner at drf-api-logger, I would like everyone to help me to find this problem.

Problem: The drf-api-logger did not write any data to database when it's not local environment (but other endpoints are written). But request body's data was committed to database at table metrics It's happen on endpoint POST /metrics

What I try:

  1. I tried to debug it on my local environment by insert print to each every line at __call___ on /drf_api_logger/middleware/api_logger_middleware.py
  2. Make a request to POST /metrics

Result is it reaches to LOGGER_THREAD.put_log_data(data=d) inside if LOGGER_THREAD: with valid data from request/response body.

Quesitons:

  1. How can I debug it on another environment?

For settings, view and serializer of /metrics file: settings.py

MIDDLEWARE = [
    "debug_toolbar.middleware.DebugToolbarMiddleware",
    "corsheaders.middleware.CorsMiddleware",
    "django.middleware.security.SecurityMiddleware",
    "django.contrib.sessions.middleware.SessionMiddleware",
    "django.middleware.common.CommonMiddleware",
    "django.middleware.csrf.CsrfViewMiddleware",
    "django.contrib.auth.middleware.AuthenticationMiddleware",
    "django.contrib.messages.middleware.MessageMiddleware",
    "django.middleware.clickjacking.XFrameOptionsMiddleware",
    "drf_api_logger.middleware.api_logger_middleware.APILoggerMiddleware",
]
...
DRF_API_LOGGER_DATABASE = True

file: views/metric.py

class MetricViewSet(mixins.CreateModelMixin, GenericViewSet):
    http_method_names = ["post"]
    permission_classes = []
    authentication_classes = [MyCustomAuthen]

    def get_serializer_class(self):
        return MetricSerializer

file: serializers/metric.py

class MetricDataSerializer(serializers.Serializer):
    {fields}

    def create(self, validated_data):
        for data in validated_data:
            Metric.objects.create(
                {fields}
            )

        return len(validated_data)

class MetricInfoSerializer(serializers.Serializer):
    {fields}
    data = MetricDataSerializer(many=True)

    def create(self, validated_data):
       {fields}

        return dict(
            message="OK",
            data_size=created_size,
            send_time=validated_data.get("send_time"),
            data=[],
        )

file: MyCustomAuthen

from rest_framework.authentication import TokenAuthentication
from rest_framework import HTTP_HEADER_ENCODING, exceptions
from django.utils.translation import gettext_lazy as _

class MyCustomAuthen(TokenAuthentication):
    def authenticate(self, request):
        auth = request.META.get("HTTP_AUTHORIZATION", b"")
        if not auth:
            msg = _("Invalid token header. No credentials provided.")
            raise exceptions.AuthenticationFailed(msg)

        (_key, _token) = auth.split()
        if not _key and not _token:
            msg = _("Invalid token")
            raise exceptions.AuthenticationFailed(msg)

        if _key.lower() != self.keyword.lower():
            msg = _("Invalid token")
            raise exceptions.AuthenticationFailed(msg)

        return self.authenticate_credentials(_token, request)

    def authenticate_credentials(self, key, request):
        try:
            ip = self.get_client_ip(request)
            token = get_token(key)
        except:
            raise exceptions.AuthenticationFailed(_("Invalid token."))

        return (token.name, token)

    def get_client_ip(self, request):
        """
        Get the client's IP address from the request.
        """
        x_forwarded_for = request.META.get("HTTP_X_FORWARDED_FOR")
        if x_forwarded_for:
            ip = x_forwarded_for.split(",")[0]
        else:
            ip = request.META.get("REMOTE_ADDR")
        return ip

request body schema:

{
    "data_size": 0,
    "send_time": "2023-09-27T10:31:21.280Z",
    "data": []
}