增加了api功能:
创建API文档页面 :新建了 status/templates/status/api_docs.html 模板文件,包含:
- API认证方式说明
- 所有API端点的详细说明(POST /api/checkin/、GET /api/services/、GET /api/services/{id}/history/、GET /api/status-summary/)
- 每个端点的请求体和响应体示例
- 状态码和检测类型的说明
This commit is contained in:
96
status/serializers.py
Normal file
96
status/serializers.py
Normal file
@@ -0,0 +1,96 @@
|
||||
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()
|
||||
Reference in New Issue
Block a user