From 691051c254859f4a8197e2585c2638dd8aa59ce0 Mon Sep 17 00:00:00 2001
From: pycook <pycook@126.com>
Date: Thu, 11 Jan 2024 10:10:01 +0800
Subject: [PATCH] perf(api): /api/v0.1/ci/adc/statistics

perf(api): /api/v0.1/ci/adc/statistics
---
 cmdb-api/api/commands/click_cmdb.py | 13 ++++++++++---
 cmdb-api/api/lib/cmdb/cache.py      | 21 +++++++++++++++++++++
 cmdb-api/api/lib/cmdb/ci.py         | 12 ++----------
 3 files changed, 33 insertions(+), 13 deletions(-)

diff --git a/cmdb-api/api/commands/click_cmdb.py b/cmdb-api/api/commands/click_cmdb.py
index 54c8c91..eb662ac 100644
--- a/cmdb-api/api/commands/click_cmdb.py
+++ b/cmdb-api/api/commands/click_cmdb.py
@@ -1,14 +1,13 @@
 # -*- coding:utf-8 -*-
 
 
+import click
 import copy
 import datetime
 import json
+import requests
 import time
 import uuid
-
-import click
-import requests
 from flask import current_app
 from flask.cli import with_appcontext
 from flask_login import login_user
@@ -185,11 +184,19 @@ def cmdb_counter():
         UserCRUD.add(username='worker', password=uuid.uuid4().hex, email='worker@xxx.com')
 
     login_user(UserCache.get('worker'))
+
+    i = 0
     while True:
         try:
             db.session.remove()
 
             CMDBCounterCache.reset()
+
+            if i % 5 == 0:
+                CMDBCounterCache.flush_adc_counter()
+                i = 0
+
+            i += 1
         except:
             import traceback
             print(traceback.format_exc())
diff --git a/cmdb-api/api/lib/cmdb/cache.py b/cmdb-api/api/lib/cmdb/cache.py
index c19812f..6795b5a 100644
--- a/cmdb-api/api/lib/cmdb/cache.py
+++ b/cmdb-api/api/lib/cmdb/cache.py
@@ -5,8 +5,10 @@ from __future__ import unicode_literals
 from flask import current_app
 
 from api.extensions import cache
+from api.extensions import db
 from api.lib.cmdb.custom_dashboard import CustomDashboardManager
 from api.models.cmdb import Attribute
+from api.models.cmdb import CI
 from api.models.cmdb import CIType
 from api.models.cmdb import CITypeAttribute
 from api.models.cmdb import RelationType
@@ -227,6 +229,7 @@ class CITypeAttributeCache(object):
 
 class CMDBCounterCache(object):
     KEY = 'CMDB::Counter'
+    KEY2 = 'CMDB::Counter2'
 
     @classmethod
     def get(cls):
@@ -429,3 +432,21 @@ class CMDBCounterCache(object):
             return
 
         return numfound
+
+    @classmethod
+    def flush_adc_counter(cls):
+        res = db.session.query(CI.type_id, CI.is_auto_discovery)
+        result = dict()
+        for i in res:
+            result.setdefault(i.type_id, dict(total=0, auto_discovery=0))
+            result[i.type_id]['total'] += 1
+            if i.is_auto_discovery:
+                result[i.type_id]['auto_discovery'] += 1
+
+        cache.set(cls.KEY2, result, timeout=0)
+
+        return result
+
+    @classmethod
+    def get_adc_counter(cls):
+        return cache.get(cls.KEY2) or cls.flush_adc_counter()
diff --git a/cmdb-api/api/lib/cmdb/ci.py b/cmdb-api/api/lib/cmdb/ci.py
index 3aed0d7..eeeb67a 100644
--- a/cmdb-api/api/lib/cmdb/ci.py
+++ b/cmdb-api/api/lib/cmdb/ci.py
@@ -5,7 +5,6 @@ import copy
 import datetime
 import json
 import threading
-
 from flask import abort
 from flask import current_app
 from flask_login import current_user
@@ -16,6 +15,7 @@ from api.extensions import rd
 from api.lib.cmdb.cache import AttributeCache
 from api.lib.cmdb.cache import CITypeAttributesCache
 from api.lib.cmdb.cache import CITypeCache
+from api.lib.cmdb.cache import CMDBCounterCache
 from api.lib.cmdb.ci_type import CITypeAttributeManager
 from api.lib.cmdb.ci_type import CITypeManager
 from api.lib.cmdb.ci_type import CITypeRelationManager
@@ -218,15 +218,7 @@ class CIManager(object):
 
     @classmethod
     def get_ad_statistics(cls):
-        res = CI.get_by(to_dict=False)
-        result = dict()
-        for i in res:
-            result.setdefault(i.type_id, dict(total=0, auto_discovery=0))
-            result[i.type_id]['total'] += 1
-            if i.is_auto_discovery:
-                result[i.type_id]['auto_discovery'] += 1
-
-        return result
+        return CMDBCounterCache.get_adc_counter()
 
     @staticmethod
     def ci_is_exist(unique_key, unique_value, type_id):