96 lines
3.3 KiB
Python
96 lines
3.3 KiB
Python
|
|
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()
|