Преглед на файлове

[desktop] Write metrics to a file

Erick Tryzelaar преди 10 години
родител
ревизия
a61a2a7
променени са 3 файла, в които са добавени 92 реда и са изтрити 0 реда
  1. 15 0
      desktop/core/src/desktop/conf.py
  2. 74 0
      desktop/core/src/desktop/lib/metrics/file_reporter.py
  3. 3 0
      desktop/core/src/desktop/urls.py

+ 15 - 0
desktop/core/src/desktop/conf.py

@@ -351,6 +351,21 @@ SMTP = ConfigSection(
   )
 )
 
+METRICS = ConfigSection(
+  key='metrics',
+  help=_("""Configuration options for metrics"""),
+  members=dict(
+    LOCATION=Config(
+      key='location',
+      help=_('Write metrics to this location'),
+      type=str),
+    COLLECTION_INTERVAL=Config(
+      key='collection_interval',
+      help=_('Time in milliseconds on how frequently to collect metrics'),
+      type=int),
+  )
+)
+
 DATABASE = ConfigSection(
   key='database',
   help=_("""Configuration options for specifying the Desktop Database.

+ 74 - 0
desktop/core/src/desktop/lib/metrics/file_reporter.py

@@ -0,0 +1,74 @@
+# Licensed to Cloudera, Inc. under one
+# or more contributor license agreements.  See the NOTICE file
+# distributed with this work for additional information
+# regarding copyright ownership.  Cloudera, Inc. licenses this file
+# to you under the Apache License, Version 2.0 (the
+# "License"); you may not use this file except in compliance
+# with the License.  You may obtain a copy of the License at
+#
+#     http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+import json
+import logging
+import os
+import tempfile
+import threading
+
+from pyformance.reporters.reporter import Reporter
+
+from desktop.lib.metrics import global_registry
+
+LOG = logging.getLogger(__name__)
+
+class FileReporter(Reporter):
+  def __init__(self, location, *args, **kwargs):
+    super(FileReporter, self).__init__(*args, **kwargs)
+    self.location = location
+
+  def report_now(self, registry=None, timestamp=None):
+    dirname = os.path.dirname(self.location)
+    try:
+      os.makedirs(dirname)
+    except OSError:
+      pass
+
+    # Write the metrics to a temporary file, then atomically
+    # rename the file to the real location.
+
+    f = tempfile.NamedTemporaryFile(
+        dir=dirname,
+        delete=False)
+
+    try:
+      json.dump(self.registry.dump_metrics(), f)
+      f.close()
+
+      os.rename(f.name, self.location)
+    except Exception:
+      os.remove(f.name)
+      raise
+
+_reporter = None
+
+
+def start_file_reporter():
+  from desktop.conf import METRICS
+
+  global _reporter
+
+  if _reporter is None:
+    location = METRICS.LOCATION.get()
+    interval = METRICS.COLLECTION_INTERVAL.get()
+
+    if location is not None and interval is not None:
+      _reporter = FileReporter(
+          location,
+          reporting_interval=interval / 1000.0,
+          registry=global_registry())
+      _reporter.start()

+ 3 - 0
desktop/core/src/desktop/urls.py

@@ -30,6 +30,9 @@ import re
 # this file has been loaded after `desktop.settings` has been loaded.
 import desktop.monkey_patches
 
+import desktop.lib.metrics.file_reporter
+desktop.lib.metrics.file_reporter.start_file_reporter()
+
 from django.conf import settings
 from django.conf.urls import include, patterns
 from django.conf.urls.static import static