Преглед изворни кода

[metrics] Fix lost connection due to cx_Oracle database error (#4273)

Ying Chen пре 2 месеци
родитељ
комит
1ca16e37a9
2 измењених фајлова са 12 додато и 10 уклоњено
  1. 5 4
      apps/useradmin/src/useradmin/metrics.py
  2. 7 6
      desktop/core/src/desktop/metrics.py

+ 5 - 4
apps/useradmin/src/useradmin/metrics.py

@@ -17,6 +17,7 @@
 import logging
 from datetime import datetime, timedelta
 
+from cx_Oracle import DatabaseError as OracleDatabaseError
 from django.db import connection
 from django.db.utils import DatabaseError, OperationalError
 from prometheus_client import Gauge
@@ -35,7 +36,7 @@ def active_users():
         first_login=False,
         hostname__isnull=False
     ).count()
-  except (OperationalError, DatabaseError) as oe:
+  except (OperationalError, DatabaseError, OracleDatabaseError) as oe:
     LOG.debug('active_users recovering from %s' % str(oe))
     connection.close()
     connection.connect()
@@ -45,7 +46,7 @@ def active_users():
         hostname__isnull=False
     ).count()
   except Exception as e:
-    LOG.exception('Could not get active_users')
+    LOG.exception('Could not get active_users: %s' % str(e))
     count = 0
   return count
 
@@ -67,14 +68,14 @@ def active_users_per_instance():
   try:
     count = UserProfile.objects.filter(last_activity__gt=datetime.now() - timedelta(hours=1),
                                        hostname=get_localhost_name()).count()
-  except (OperationalError, DatabaseError) as oe:
+  except (OperationalError, DatabaseError, OracleDatabaseError) as oe:
     LOG.debug('active_users_per_instance recovering from %s' % str(oe))
     connection.close()
     connection.connect()
     count = UserProfile.objects.filter(last_activity__gt=datetime.now() - timedelta(hours=1),
                                        hostname=get_localhost_name()).count()
   except Exception as e:
-    LOG.exception('Could not get active_users per instance')
+    LOG.exception('Could not get active_users per instance: %s' % str(e))
     count = 0
   return count
 

+ 7 - 6
desktop/core/src/desktop/metrics.py

@@ -18,15 +18,16 @@ from __future__ import absolute_import
 
 import gc
 import logging
-import threading
 import multiprocessing
+import threading
 from builtins import range
 from datetime import datetime, timedelta
 
+from cx_Oracle import DatabaseError as OracleDatabaseError
 from django.db import connection
 from django.db.utils import DatabaseError, OperationalError
 from future import standard_library
-from prometheus_client import REGISTRY, Gauge
+from prometheus_client import Gauge, REGISTRY
 
 from desktop.conf import ENABLE_PROMETHEUS
 from desktop.lib.metrics import global_registry
@@ -149,13 +150,13 @@ def user_count():
   users = 0
   try:
     users = User.objects.count()
-  except (OperationalError, DatabaseError) as oe:
+  except (OperationalError, DatabaseError, OracleDatabaseError) as oe:
     LOG.debug('user_count recovering from %s' % str(oe))
     connection.close()
     connection.connect()
     users = User.objects.count()
   except Exception as e:
-    LOG.exception('Metrics: Failed to get number of user accounts')
+    LOG.exception('Metrics: Failed to get number of user accounts: %s' % str(e))
   return users
 
 
@@ -207,7 +208,7 @@ def num_of_queries():
       is_history=True,
       last_modified__gt=datetime.now() - timedelta(minutes=10)
     ).count()
-  except (OperationalError, DatabaseError) as oe:
+  except (OperationalError, DatabaseError, OracleDatabaseError) as oe:
     LOG.debug('num_of_queries recovering from %s' % str(oe))
     connection.close()
     connection.connect()
@@ -217,7 +218,7 @@ def num_of_queries():
       last_modified__gt=datetime.now() - timedelta(minutes=10)
     ).count()
   except Exception as e:
-    LOG.exception('Could not get num_of_queries')
+    LOG.exception('Could not get num_of_queries: %s' % str(e))
     count = 0
   return count