events: rework metrics (#4407)
* rework metrics Signed-off-by: Jens Langhammer <jens@goauthentik.io> * change graphs to be over last week Signed-off-by: Jens Langhammer <jens@goauthentik.io> * fix Apps with most usage card Signed-off-by: Jens Langhammer <jens@goauthentik.io> Signed-off-by: Jens Langhammer <jens@goauthentik.io>
This commit is contained in:
		@ -1,4 +1,7 @@
 | 
			
		||||
"""authentik administration metrics"""
 | 
			
		||||
from datetime import timedelta
 | 
			
		||||
 | 
			
		||||
from django.db.models.functions import ExtractDay
 | 
			
		||||
from drf_spectacular.utils import extend_schema, extend_schema_field
 | 
			
		||||
from guardian.shortcuts import get_objects_for_user
 | 
			
		||||
from rest_framework.fields import IntegerField, SerializerMethodField
 | 
			
		||||
@ -21,38 +24,44 @@ class CoordinateSerializer(PassiveSerializer):
 | 
			
		||||
class LoginMetricsSerializer(PassiveSerializer):
 | 
			
		||||
    """Login Metrics per 1h"""
 | 
			
		||||
 | 
			
		||||
    logins_per_1h = SerializerMethodField()
 | 
			
		||||
    logins_failed_per_1h = SerializerMethodField()
 | 
			
		||||
    authorizations_per_1h = SerializerMethodField()
 | 
			
		||||
    logins = SerializerMethodField()
 | 
			
		||||
    logins_failed = SerializerMethodField()
 | 
			
		||||
    authorizations = SerializerMethodField()
 | 
			
		||||
 | 
			
		||||
    @extend_schema_field(CoordinateSerializer(many=True))
 | 
			
		||||
    def get_logins_per_1h(self, _):
 | 
			
		||||
        """Get successful logins per hour for the last 24 hours"""
 | 
			
		||||
    def get_logins(self, _):
 | 
			
		||||
        """Get successful logins per 8 hours for the last 7 days"""
 | 
			
		||||
        user = self.context["user"]
 | 
			
		||||
        return (
 | 
			
		||||
            get_objects_for_user(user, "authentik_events.view_event")
 | 
			
		||||
            .filter(action=EventAction.LOGIN)
 | 
			
		||||
            .get_events_per_hour()
 | 
			
		||||
            get_objects_for_user(user, "authentik_events.view_event").filter(
 | 
			
		||||
                action=EventAction.LOGIN
 | 
			
		||||
            )
 | 
			
		||||
            # 3 data points per day, so 8 hour spans
 | 
			
		||||
            .get_events_per(timedelta(days=7), ExtractDay, 7 * 3)
 | 
			
		||||
        )
 | 
			
		||||
 | 
			
		||||
    @extend_schema_field(CoordinateSerializer(many=True))
 | 
			
		||||
    def get_logins_failed_per_1h(self, _):
 | 
			
		||||
        """Get failed logins per hour for the last 24 hours"""
 | 
			
		||||
    def get_logins_failed(self, _):
 | 
			
		||||
        """Get failed logins per 8 hours for the last 7 days"""
 | 
			
		||||
        user = self.context["user"]
 | 
			
		||||
        return (
 | 
			
		||||
            get_objects_for_user(user, "authentik_events.view_event")
 | 
			
		||||
            .filter(action=EventAction.LOGIN_FAILED)
 | 
			
		||||
            .get_events_per_hour()
 | 
			
		||||
            get_objects_for_user(user, "authentik_events.view_event").filter(
 | 
			
		||||
                action=EventAction.LOGIN_FAILED
 | 
			
		||||
            )
 | 
			
		||||
            # 3 data points per day, so 8 hour spans
 | 
			
		||||
            .get_events_per(timedelta(days=7), ExtractDay, 7 * 3)
 | 
			
		||||
        )
 | 
			
		||||
 | 
			
		||||
    @extend_schema_field(CoordinateSerializer(many=True))
 | 
			
		||||
    def get_authorizations_per_1h(self, _):
 | 
			
		||||
        """Get successful authorizations per hour for the last 24 hours"""
 | 
			
		||||
    def get_authorizations(self, _):
 | 
			
		||||
        """Get successful authorizations per 8 hours for the last 7 days"""
 | 
			
		||||
        user = self.context["user"]
 | 
			
		||||
        return (
 | 
			
		||||
            get_objects_for_user(user, "authentik_events.view_event")
 | 
			
		||||
            .filter(action=EventAction.AUTHORIZE_APPLICATION)
 | 
			
		||||
            .get_events_per_hour()
 | 
			
		||||
            get_objects_for_user(user, "authentik_events.view_event").filter(
 | 
			
		||||
                action=EventAction.AUTHORIZE_APPLICATION
 | 
			
		||||
            )
 | 
			
		||||
            # 3 data points per day, so 8 hour spans
 | 
			
		||||
            .get_events_per(timedelta(days=7), ExtractDay, 7 * 3)
 | 
			
		||||
        )
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
		Reference in New Issue
	
	Block a user