瀏覽代碼

HUE-9235 [core] Clean up metrics for exporting to prometheus

Ying Chen 5 年之前
父節點
當前提交
5e6aa8d885
共有 3 個文件被更改,包括 60 次插入3 次删除
  1. 23 1
      desktop/core/src/desktop/metrics.py
  2. 3 2
      desktop/core/src/desktop/settings.py
  3. 34 0
      desktop/core/src/desktop/tests.py

+ 23 - 1
desktop/core/src/desktop/metrics.py

@@ -25,15 +25,37 @@ import multiprocessing
 import threading
 
 from datetime import datetime, timedelta
-from prometheus_client import Gauge
+from prometheus_client import Gauge, REGISTRY
 
 from useradmin.models import User
 
+from desktop.conf import ENABLE_PROMETHEUS
 from desktop.lib.metrics import global_registry
 
 
 LOG = logging.getLogger(__name__)
 
+ALLOWED_DJANGO_PROMETHEUS_METRICS = (
+    'django_http_requests_latency_including_middlewares_seconds',
+    'django_http_requests_total_by_method',
+    'django_http_ajax_requests_total',
+    'django_http_ajax_requests_created',
+    'django_http_responses_body_total_bytes',
+    'django_http_responses_total_by_status'
+)
+
+if ENABLE_PROMETHEUS.get():
+  django_collectors = set()
+  django_metrics_names = [name for name in REGISTRY._names_to_collectors.keys() if name.startswith('django_') and not name.startswith(ALLOWED_DJANGO_PROMETHEUS_METRICS)]
+
+  for metric_name in django_metrics_names:
+    collector_obj = REGISTRY._names_to_collectors[metric_name]
+    LOG.info("%d - %s" % (id(collector_obj), metric_name))
+    django_collectors.add(collector_obj)
+
+  for django_collector in django_collectors:
+    REGISTRY.unregister(django_collector)
+
 
 global_registry().gauge_callback(
     name='threads.total',

+ 3 - 2
desktop/core/src/desktop/settings.py

@@ -748,8 +748,9 @@ if desktop.conf.ENABLE_PROMETHEUS.get():
 
   if 'mysql' in DATABASES['default']['ENGINE']:
     DATABASES['default']['ENGINE'] = DATABASES['default']['ENGINE'].replace('django.db.backends', 'django_prometheus.db.backends')
-  for name, val in list(CACHES.items()):
-    val['BACKEND'] = val['BACKEND'].replace('django.core.cache.backends', 'django_prometheus.cache.backends')
+  # enable only when use these metrics: django_cache_get_total, django_cache_hits_total, django_cache_misses_total
+  # for name, val in list(CACHES.items()):
+  #   val['BACKEND'] = val['BACKEND'].replace('django.core.cache.backends', 'django_prometheus.cache.backends')
 
 
 ################################################################

+ 34 - 0
desktop/core/src/desktop/tests.py

@@ -166,6 +166,40 @@ def test_public_views():
     response = c.get(url)
     assert_equal(200, response.status_code)
 
+def test_prometheus_view():
+  if not desktop.conf.ENABLE_PROMETHEUS.get():
+    raise SkipTest
+
+  ALL_PROMETHEUS_METRICS = [
+    'django_http_requests_before_middlewares_total',
+    'django_http_responses_before_middlewares_total',
+    'django_http_requests_latency_including_middlewares_seconds',
+    'django_http_requests_unknown_latency_including_middlewares_total',
+    'django_http_requests_latency_seconds_by_view_method',
+    'django_http_requests_unknown_latency_total',
+    'django_http_ajax_requests_total',
+    'django_http_requests_total_by_method',
+    'django_http_requests_total_by_transport',
+    'django_http_requests_total_by_view_transport_method',
+    'django_http_requests_body_total_bytes',
+    'django_http_responses_total_by_templatename',
+    'django_http_responses_total_by_status',
+    'django_http_responses_body_total_bytes',
+    'django_http_responses_total_by_charset',
+    'django_http_responses_streaming_total',
+    'django_http_exceptions_total_by_type',
+    'django_http_exceptions_total_by_view',
+  ]
+
+  c = Client()
+  response = c.get('/metrics')
+  for metric in ALL_PROMETHEUS_METRICS:
+    metric = metric if isinstance(metric, bytes) else metric.encode('utf-8')
+    if metric not in desktop.metrics.ALLOWED_DJANGO_PROMETHEUS_METRICS:
+      assert_false(metric in response.content, 'metric: %s \n %s' % (metric, response.content))
+    else:
+      assert_true(metric in response.content, 'metric: %s \n %s' % (metric, response.content))
+
 def test_log_view():
   c = make_logged_in_client()