from rest_framework import serializers from .models import ServiceGroup, Service, ServiceCheckRecord # 引入loguru库用于日志记录 try: from loguru import logger except ImportError: import logging logger = logging.getLogger(__name__) class ServiceGroupSerializer(serializers.ModelSerializer): class Meta: model = ServiceGroup fields = '__all__' class ServiceCheckRecordSerializer(serializers.ModelSerializer): class Meta: model = ServiceCheckRecord fields = '__all__' class ServiceSerializer(serializers.ModelSerializer): latest_status = serializers.CharField(source='get_latest_status', read_only=True) latest_check_time = serializers.DateTimeField(source='get_latest_check_time', read_only=True) latest_response_time = serializers.FloatField(source='get_latest_response_time', read_only=True) class Meta: model = Service fields = '__all__' class ServiceCheckInSerializer(serializers.Serializer): """客户端上报数据序列化器""" service_name = serializers.CharField(max_length=200) host = serializers.CharField(max_length=255) port = serializers.IntegerField(required=False, allow_null=True) check_type = serializers.CharField(max_length=50, default='tcp') status = serializers.ChoiceField(choices=Service.STATUS_CHOICES) response_time = serializers.FloatField(required=False, allow_null=True) message = serializers.CharField(required=False, allow_blank=True) def create(self, validated_data): """创建或更新服务记录""" service_name = validated_data['service_name'] host = validated_data['host'] port = validated_data.get('port') check_type = validated_data.get('check_type', 'tcp') status = validated_data['status'] response_time = validated_data.get('response_time') message = validated_data.get('message', '') logger.info(f"收到服务上报: {service_name} ({host}:{port}), 状态: {status}") # 获取或创建默认分组 group_name = 'Default' group, created = ServiceGroup.objects.get_or_create(name=group_name) if created: logger.info(f"创建默认分组: {group_name}") # 获取或创建服务 service, created = Service.objects.get_or_create( name=service_name, host=host, port=port, check_type=check_type, defaults={'group': group} ) if created: logger.info(f"创建新服务: {service_name} ({host}:{port})") # 创建检测记录 record = ServiceCheckRecord.objects.create( service=service, status=status, response_time=response_time, message=message ) logger.info(f"保存检测记录: {service_name}, 状态: {status}, 响应时间: {response_time}ms") return { 'service_id': service.id, 'record_id': record.id } class StatusSummarySerializer(serializers.Serializer): """状态摘要序列化器""" total_services = serializers.IntegerField() up_services = serializers.IntegerField() down_services = serializers.IntegerField() unknown_services = serializers.IntegerField() uptime_percentage = serializers.FloatField()