!40 新增告警生成及告警管理,修改task查询返回

1. 新增告警生成及告警管理
2. 修改task查询返回
This commit is contained in:
剑子仙机 2022-03-04 02:42:50 +00:00 committed by Gitee
commit 82be60bed8
No known key found for this signature in database
GPG Key ID: 173E9B9CA92EEF8F
11 changed files with 121 additions and 13 deletions

View File

@ -0,0 +1 @@

View File

@ -0,0 +1,3 @@
from django.contrib import admin
# Register your models here.

View File

@ -0,0 +1,13 @@
import logging
from django.apps import AppConfig
logger = logging.getLogger(__name__)
class AlarmConfig(AppConfig):
default_auto_field = 'django.db.models.BigAutoField'
name = 'apps.alarm'
def ready(self):
logger.info(">>> alarm module loading success")

View File

@ -0,0 +1,22 @@
from django.db import models
from lib import BaseModel
from apps.accounts.models import User
from apps.host.models import HostModel
class AlarmModel(BaseModel):
LEVEL_CHOICES = (
(0, 'info'),
(1, 'warning'),
(2, 'error')
)
receiver = models.ForeignKey(User, on_delete=models.CASCADE, related_name="alarm_user", verbose_name="告警接受者")
host = models.ForeignKey(HostModel, on_delete=models.CASCADE, related_name="alarm_hosts", verbose_name="告警主机")
level = models.IntegerField(choices=LEVEL_CHOICES, default=0, verbose_name="告警级别")
message = models.TextField(verbose_name="告警内容")
collected_time = models.DateTimeField(verbose_name="告警采集时间")
duration_time = models.TimeField(null=True, blank=True, verbose_name="告警持续时间")
item = models.CharField(max_length=100, verbose_name="告警项")
class Meta:
db_table = "alarm"

View File

@ -0,0 +1,16 @@
import logging
from rest_framework import serializers
from apps.alarm.models import AlarmModel
logger = logging.getLogger(__name__)
class AlarmSerializer(serializers.ModelSerializer):
collected_time = serializers.DateTimeField(label=u'告警采集时间', format="%Y-%m-%d %H:%M:%S")
level = serializers.SerializerMethodField(label='级别', read_only=True)
class Meta:
model = AlarmModel
fields = "__all__"
def get_level(self, obj):
return obj.get_level_display()

View File

@ -0,0 +1,13 @@
from django.urls import path
from django.urls.conf import include
from rest_framework.routers import DefaultRouter
from apps.alarm import views
router = DefaultRouter()
router.register('alarm', views.AlarmAPIView)
urlpatterns = [
path('api/v1/', include(router.urls)),
]

View File

@ -0,0 +1,45 @@
from rest_framework.viewsets import GenericViewSet
from rest_framework import mixins
from django.db.models import Q
from apps.alarm import serializer
from django_filters.rest_framework import DjangoFilterBackend
from rest_framework.filters import SearchFilter, OrderingFilter
from apps.alarm.models import AlarmModel
from lib import *
logger = logging.getLogger(__name__)
class AlarmAPIView(GenericViewSet,
mixins.ListModelMixin,
mixins.RetrieveModelMixin,
mixins.CreateModelMixin
):
queryset = AlarmModel.objects.filter(Q(deleted_at__isnull=True) | Q(deleted_at=''))
serializer_class = serializer.AlarmSerializer
filter_backends = (DjangoFilterBackend, SearchFilter, OrderingFilter)
search_fields = ('id', 'host__id', 'receiver__id', 'level') # 模糊查询
filter_fields = ('id', 'host__id', 'receiver__id', 'level') # 精确查询
authentication_classes = []
def create(self, request, *args, **kwargs):
try:
response = super().create(request, *args, **kwargs)
return success(result=response.data, message="插入成功")
except Exception as e:
logger.error(e)
return other_response(message=str(e), code=400, success=False)
def retrieve(self, request, *args, **kwargs):
instance = self.get_queryset().filter(**kwargs).first()
if not instance:
return success([])
serializer = self.get_serializer(instance)
return success(result=serializer.data)
def list(self, request, *args, **kwargs):
queryset = self.filter_queryset(self.get_queryset())
if not queryset:
return success([], total=0)
return super(AlarmAPIView, self).list(request, *args, **kwargs)

View File

@ -8,15 +8,9 @@ from apps.task.models import JobModel
class TaskFilter(BaseFilterBackend):
def filter_queryset(self, request: Request, queryset, view):
params = request.query_params.dict()
queryset_all = JobModel.objects.all()
search = params.get("search", None)
if search:
queryset = queryset | queryset_all.filter(params__contains=search)
queryset = queryset | queryset_all.filter(host_by__contains=search)
service_name = params.get('service_name', None)
if service_name:
queryset = queryset.filter(params__contains=service_name)
host_by = params.get('host_by', None)
if host_by:
queryset = queryset.filter(host_by__contains=host_by)
service_name_all = '"service_name"'+': '+'"%s"' % service_name
print(service_name_all)
queryset = queryset.filter(params__contains=service_name_all)
return queryset

View File

@ -45,7 +45,7 @@ class TaskAPIView(GenericViewSet,
queryset = JobModel.objects.filter(Q(deleted_at__isnull=True) | Q(deleted_at=''))
serializer_class = seriaizer.JobListSerializer
filter_backends = (DjangoFilterBackend, SearchFilter, OrderingFilter, TaskFilter)
search_fields = ('id', 'task_id', 'created_by__id', 'status') # 模糊查询
search_fields = ('id', 'task_id', 'created_by__id', 'status', 'params') # 模糊查询
filter_fields = ('id', 'task_id', 'created_by__id', 'status') # 精确查询
authentication_classes = []
@ -114,9 +114,8 @@ class TaskAPIView(GenericViewSet,
def list(self, request, *args, **kwargs):
queryset = self.filter_queryset(self.get_queryset())
if not queryset:
return success([])
serializer = self.get_serializer(queryset, many=True)
return success(serializer.data)
return success([], total=0)
return super(TaskAPIView, self).list(request, *args, **kwargs)
def destroy(self, request, *args, **kwargs):
instance = self.get_queryset().filter(**kwargs).first()

View File

@ -20,6 +20,7 @@ INSTALLED_APPS = [
'apps.monitor',
'apps.task',
'apps.vmcore',
'apps.alarm',
'consumer',
'rest_framework',

View File

@ -24,6 +24,7 @@ urlpatterns = [
path('', include("apps.monitor.urls")),
path('', include("apps.task.urls")),
path('', include("apps.vmcore.urls")),
path('', include("apps.alarm.urls")),
]
if settings.DEBUG: