|
@@ -1,4 +1,4 @@
|
|
|
-from django.db.models import QuerySet
|
|
|
|
|
|
|
+from django.db.models import QuerySet, Count, Avg, Min, Max, Q
|
|
|
from django.utils.translation import gettext_lazy as _
|
|
from django.utils.translation import gettext_lazy as _
|
|
|
from drf_spectacular.utils import extend_schema
|
|
from drf_spectacular.utils import extend_schema
|
|
|
from rest_framework.parsers import MultiPartParser
|
|
from rest_framework.parsers import MultiPartParser
|
|
@@ -13,7 +13,7 @@ from common.log.log import log
|
|
|
from tools.api.tool import ToolCreateAPI, ToolEditAPI, ToolReadAPI, ToolDeleteAPI, ToolTreeReadAPI, ToolDebugApi, \
|
|
from tools.api.tool import ToolCreateAPI, ToolEditAPI, ToolReadAPI, ToolDeleteAPI, ToolTreeReadAPI, ToolDebugApi, \
|
|
|
ToolExportAPI, ToolImportAPI, ToolPageAPI, PylintAPI, EditIconAPI, GetInternalToolAPI, AddInternalToolAPI, \
|
|
ToolExportAPI, ToolImportAPI, ToolPageAPI, PylintAPI, EditIconAPI, GetInternalToolAPI, AddInternalToolAPI, \
|
|
|
ToolBatchOperateAPI
|
|
ToolBatchOperateAPI
|
|
|
-from tools.models import ToolScope, Tool
|
|
|
|
|
|
|
+from tools.models import ToolScope, Tool, ToolRecord
|
|
|
from tools.serializers.tool import ToolSerializer, ToolTreeSerializer, ToolBatchOperateSerializer
|
|
from tools.serializers.tool import ToolSerializer, ToolTreeSerializer, ToolBatchOperateSerializer
|
|
|
|
|
|
|
|
|
|
|
|
@@ -717,3 +717,52 @@ class ToolView(APIView):
|
|
|
'workspace_id': workspace_id,
|
|
'workspace_id': workspace_id,
|
|
|
**request.data
|
|
**request.data
|
|
|
}).generate_code()
|
|
}).generate_code()
|
|
|
|
|
+
|
|
|
|
|
+ class Statistics(APIView):
|
|
|
|
|
+ """工具使用统计"""
|
|
|
|
|
+ authentication_classes = [TokenAuth]
|
|
|
|
|
+
|
|
|
|
|
+ @extend_schema(
|
|
|
|
|
+ methods=['GET'],
|
|
|
|
|
+ description=_("Get tool usage statistics"),
|
|
|
|
|
+ summary=_("Get tool usage statistics"),
|
|
|
|
|
+ operation_id=_("Get tool usage statistics"),
|
|
|
|
|
+ tags=[_('Tool')]
|
|
|
|
|
+ )
|
|
|
|
|
+ @has_permissions(
|
|
|
|
|
+ PermissionConstants.TOOL_READ.get_workspace_permission(),
|
|
|
|
|
+ PermissionConstants.TOOL_READ.get_workspace_permission_workspace_manage_role(),
|
|
|
|
|
+ RoleConstants.WORKSPACE_MANAGE.get_workspace_role(),
|
|
|
|
|
+ RoleConstants.USER.get_workspace_role()
|
|
|
|
|
+ )
|
|
|
|
|
+ def get(self, request: Request, workspace_id: str):
|
|
|
|
|
+ tool_id = request.query_params.get('tool_id')
|
|
|
|
|
+ days = int(request.query_params.get('days', 7))
|
|
|
|
|
+
|
|
|
|
|
+ query = QuerySet(ToolRecord).filter(workspace_id=workspace_id)
|
|
|
|
|
+
|
|
|
|
|
+ if tool_id:
|
|
|
|
|
+ query = query.filter(tool_id=tool_id)
|
|
|
|
|
+
|
|
|
|
|
+ stats = query.aggregate(
|
|
|
|
|
+ total_count=Count('id'),
|
|
|
|
|
+ success_count=Count('id', filter=Q(state='SUCCESS')),
|
|
|
|
|
+ failure_count=Count('id', filter=Q(state='FAILURE')),
|
|
|
|
|
+ avg_run_time=Avg('run_time'),
|
|
|
|
|
+ min_run_time=Min('run_time'),
|
|
|
|
|
+ max_run_time=Max('run_time')
|
|
|
|
|
+ )
|
|
|
|
|
+
|
|
|
|
|
+ total = stats['total_count'] or 0
|
|
|
|
|
+ success = stats['success_count'] or 0
|
|
|
|
|
+ success_rate = (success / total * 100) if total > 0 else 0
|
|
|
|
|
+
|
|
|
|
|
+ return result.success({
|
|
|
|
|
+ 'total_count': total,
|
|
|
|
|
+ 'success_count': success,
|
|
|
|
|
+ 'failure_count': stats['failure_count'] or 0,
|
|
|
|
|
+ 'success_rate': round(success_rate, 2),
|
|
|
|
|
+ 'avg_run_time': round(stats['avg_run_time'] or 0, 3),
|
|
|
|
|
+ 'min_run_time': stats['min_run_time'] or 0,
|
|
|
|
|
+ 'max_run_time': stats['max_run_time'] or 0
|
|
|
|
|
+ })
|