]> arthur.barton.de Git - netdata.git/blobdiff - plugins.d/python.d.plugin
Merge pull request #1733 from simonnagl/feature/travisAddMacOS
[netdata.git] / plugins.d / python.d.plugin
index 05d23b9ae09f98ab8b165d929b3214fe6f2d9060..44b729094ce307189f3fcecbdfc32464c37d1b60 100755 (executable)
@@ -9,6 +9,7 @@ import os
 import sys
 import time
 import threading
+from re import sub
 
 # -----------------------------------------------------------------------------
 # globals & environment setup
@@ -66,6 +67,26 @@ try:
 except ImportError:
     msg.fatal('Cannot find yaml library')
 
+try:
+    from collections import OrderedDict
+    ORDERED = True
+    DICT = OrderedDict
+    msg.info('YAML output is ordered')
+except ImportError:
+    ORDERED = False
+    DICT = dict
+    msg.info('YAML output is unordered')
+else:
+    def ordered_load(stream, Loader=yaml.Loader, object_pairs_hook=OrderedDict):
+        class OrderedLoader(Loader):
+            pass
+        def construct_mapping(loader, node):
+           loader.flatten_mapping(node)
+           return object_pairs_hook(loader.construct_pairs(node))
+        OrderedLoader.add_constructor(
+            yaml.resolver.BaseResolver.DEFAULT_MAPPING_TAG,
+            construct_mapping)
+        return yaml.load(stream, OrderedLoader)
 
 class PythonCharts(object):
     """
@@ -234,7 +255,7 @@ class PythonCharts(object):
         # check if there are dict in config dict
         many_jobs = False
         for name in config:
-            if type(config[name]) is dict:
+            if isinstance(config[name], DICT):
                 many_jobs = True
                 break
 
@@ -340,7 +361,7 @@ class PythonCharts(object):
                     i += 1
                     try:
                         if job.override_name is not None:
-                            new_name = job.__module__ + '_' + job.override_name
+                            new_name = job.__module__ + '_' + sub(r'\s+', '_', job.override_name)
                             if new_name in overridden:
                                 msg.info("DROPPED:", job.name, ", job '" + job.override_name + "' is already served by another job.")
                                 self._stop(job)
@@ -419,7 +440,10 @@ def read_config(path):
     """
     try:
         with open(path, 'r') as stream:
-            config = yaml.load(stream)
+            if ORDERED:
+                config = ordered_load(stream, yaml.SafeLoader)
+            else:
+                config = yaml.load(stream)
     except (OSError, IOError):
         msg.error(str(path), "is not a valid configuration file")
         return None