perf: execution type

This commit is contained in:
feng 2025-03-13 17:52:41 +08:00 committed by feng626
parent 9992fb35be
commit 7c4931b6af
9 changed files with 55 additions and 20 deletions

View File

@ -32,5 +32,5 @@ class BackupAccountExecutionViewSet(AutomationExecutionViewSet):
def get_queryset(self): def get_queryset(self):
queryset = super().get_queryset() queryset = super().get_queryset()
queryset = queryset.filter(automation__type=self.tp) queryset = queryset.filter(type=self.tp)
return queryset return queryset

View File

@ -130,7 +130,7 @@ class ChangSecretExecutionViewSet(AutomationExecutionViewSet):
def get_queryset(self): def get_queryset(self):
queryset = super().get_queryset() queryset = super().get_queryset()
queryset = queryset.filter(automation__type=self.tp) queryset = queryset.filter(type=self.tp)
return queryset return queryset

View File

@ -9,6 +9,7 @@ from rest_framework.views import APIView
from accounts.const import AutomationTypes, ChangeSecretRecordStatusChoice from accounts.const import AutomationTypes, ChangeSecretRecordStatusChoice
from accounts.models import ChangeSecretAutomation, AutomationExecution, ChangeSecretRecord from accounts.models import ChangeSecretAutomation, AutomationExecution, ChangeSecretRecord
from assets.models import Node, Asset from assets.models import Node, Asset
from common.const import Status
from common.utils import lazyproperty from common.utils import lazyproperty
from common.utils.timezone import local_zero_hour, local_now from common.utils.timezone import local_zero_hour, local_now
from ops.celery import app from ops.celery import app
@ -97,17 +98,19 @@ class ChangeSecretDashboardApi(APIView):
return qs.count() return qs.count()
return self.get_queryset_date_filter(qs, field).count() return self.get_queryset_date_filter(qs, field).count()
@staticmethod def get_status_counts(self, executions):
def get_status_counts(records): executions = executions.filter(type=self.tp)
pending = ChangeSecretRecordStatusChoice.pending total, failed, success = 0, 0, 0
failed = ChangeSecretRecordStatusChoice.failed for status in executions.values_list('status', flat=True):
total_ids = {str(i) for i in records.exclude(status=pending).values('execution_id').distinct()} total += 1
failed_ids = {str(i) for i in records.filter(status=failed).values('execution_id').distinct()} if status in [Status.failed, Status.error]:
total = len(total_ids) failed += 1
failed = len(total_ids & failed_ids) elif status == Status.success:
success += 1
return { return {
'total_count_change_secret_executions': total, 'total_count_change_secret_executions': total,
'total_count_success_change_secret_executions': total - failed, 'total_count_success_change_secret_executions': success,
'total_count_failed_change_secret_executions': failed, 'total_count_failed_change_secret_executions': failed,
} }
@ -131,8 +134,8 @@ class ChangeSecretDashboardApi(APIView):
data['total_count_change_secret_assets'] = self.get_change_secret_asset_queryset().count() data['total_count_change_secret_assets'] = self.get_change_secret_asset_queryset().count()
if _all or query_params.get('total_count_change_secret_status'): if _all or query_params.get('total_count_change_secret_status'):
records = self.get_queryset_date_filter(self.change_secret_records_queryset, 'date_finished') executions = self.get_queryset_date_filter(AutomationExecution.objects.all(), 'date_start')
data.update(self.get_status_counts(records)) data.update(self.get_status_counts(executions))
if _all or query_params.get('daily_success_and_failure_metrics'): if _all or query_params.get('daily_success_and_failure_metrics'):
success, failed = self.get_daily_success_and_failure_metrics() success, failed = self.get_daily_success_and_failure_metrics()

View File

@ -55,7 +55,7 @@ class CheckAccountExecutionViewSet(AutomationExecutionViewSet):
def get_queryset(self): def get_queryset(self):
queryset = super().get_queryset() queryset = super().get_queryset()
queryset = queryset.filter(automation__type=self.tp) queryset = queryset.filter(type=self.tp)
return queryset return queryset
@action(methods=["get"], detail=False, url_path="adhoc") @action(methods=["get"], detail=False, url_path="adhoc")

View File

@ -46,7 +46,7 @@ class DiscoverAccountsExecutionViewSet(AutomationExecutionViewSet):
def get_queryset(self): def get_queryset(self):
queryset = super().get_queryset() queryset = super().get_queryset()
queryset = queryset.filter(automation__type=self.tp) queryset = queryset.filter(type=self.tp)
return queryset return queryset
@xframe_options_sameorigin @xframe_options_sameorigin

View File

@ -38,7 +38,7 @@ class PushAccountExecutionViewSet(AutomationExecutionViewSet):
def get_queryset(self): def get_queryset(self):
queryset = super().get_queryset() queryset = super().get_queryset()
queryset = queryset.filter(automation__type=self.tp) queryset = queryset.filter(type=self.tp)
return queryset return queryset

View File

@ -3,10 +3,10 @@ import json
import logging import logging
import os import os
import shutil import shutil
import time
from collections import defaultdict from collections import defaultdict
from socket import gethostname from socket import gethostname
import time
import yaml import yaml
from django.conf import settings from django.conf import settings
from django.template.loader import render_to_string from django.template.loader import render_to_string
@ -175,7 +175,7 @@ class BaseManager:
self.do_run(*args, **kwargs) self.do_run(*args, **kwargs)
except Exception as e: except Exception as e:
logging.exception(e) logging.exception(e)
self.status = 'error' self.status = Status.error
finally: finally:
self.post_run() self.post_run()
@ -485,8 +485,11 @@ class BasePlaybookManager(PlaybookPrepareMixin, BaseManager):
self.on_host_error(host, error, detail) self.on_host_error(host, error, detail)
def post_run(self): def post_run(self):
if self.summary['fail_assets']: if any(
self.status = 'failed' self.summary.get(key, 0) > 0
for key in ("fail_assets", "fail_accounts")
):
self.status = Status.failed
super().post_run() super().post_run()
def on_runner_success(self, runner, cb): def on_runner_success(self, runner, cb):

View File

@ -0,0 +1,28 @@
# Generated by Django 4.1.13 on 2025-03-13 09:14
from django.db import migrations, models
def migrate_execution_type(apps, schema_editor):
execution_model = apps.get_model('assets', 'AutomationExecution')
execution_objs = []
for execution in execution_model.objects.all():
snapshot = execution.snapshot
execution.type = snapshot.get('type', '')
execution_objs.append(execution)
execution_model.objects.bulk_update(execution_objs, ['type'])
class Migration(migrations.Migration):
dependencies = [
('assets', '0014_alter_automationexecution_duration'),
]
operations = [
migrations.AddField(
model_name='automationexecution',
name='type',
field=models.CharField(default='', max_length=16, verbose_name='Type'),
),
migrations.RunPython(migrate_execution_type)
]

View File

@ -142,6 +142,7 @@ class AutomationExecution(OrgModelMixin):
null=True, verbose_name=_("Date start"), db_index=True null=True, verbose_name=_("Date start"), db_index=True
) )
date_finished = models.DateTimeField(null=True, verbose_name=_("Date finished")) date_finished = models.DateTimeField(null=True, verbose_name=_("Date finished"))
type = models.CharField(default='', max_length=16, verbose_name=_("Type"))
duration = models.DecimalField(default=0, max_digits=10, decimal_places=2, verbose_name=_("Duration")) duration = models.DecimalField(default=0, max_digits=10, decimal_places=2, verbose_name=_("Duration"))
snapshot = EncryptJsonDictTextField( snapshot = EncryptJsonDictTextField(
default=dict, blank=True, null=True, verbose_name=_("Automation snapshot") default=dict, blank=True, null=True, verbose_name=_("Automation snapshot")