summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--storperf/carbon/__init__.py0
-rw-r--r--storperf/carbon/converter.py45
-rw-r--r--tests/__init__.py0
-rw-r--r--tests/carbon/__init__.py0
-rw-r--r--tests/carbon/emitter_test.py65
5 files changed, 110 insertions, 0 deletions
diff --git a/storperf/carbon/__init__.py b/storperf/carbon/__init__.py
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/storperf/carbon/__init__.py
diff --git a/storperf/carbon/converter.py b/storperf/carbon/converter.py
new file mode 100644
index 0000000..4ad5be2
--- /dev/null
+++ b/storperf/carbon/converter.py
@@ -0,0 +1,45 @@
+##############################################################################
+# Copyright (c) 2015 EMC and others.
+#
+# All rights reserved. This program and the accompanying materials
+# are made available under the terms of the Apache License, Version 2.0
+# which accompanies this distribution, and is available at
+# http://www.apache.org/licenses/LICENSE-2.0
+##############################################################################
+
+class JSONToCarbon(object):
+ def __init__(self):
+ pass
+
+ def convert_to_dictionary(self, json_object, prefix=None):
+ self.timestamp = str(json_object['timestamp'])
+ self.flat_dictionary = {}
+ self.resurse_to_flat_dictionary(json_object, prefix)
+ return self.flat_dictionary
+
+ def resurse_to_flat_dictionary(self, json, prefix=None):
+ if type(json) == dict:
+ for k, v in json.items():
+ if prefix is None:
+ key = k.decode("utf-8").replace(" ", "_")
+ else:
+ key = prefix + "." + k.decode("utf-8").replace(" ", "_")
+ if hasattr(v, '__iter__'):
+ self.resurse_to_flat_dictionary(v, key)
+ else:
+ self.flat_dictionary[key] = str(v).replace(" ", "_") + " " + self.timestamp
+ elif type(json) == list:
+ index = 0
+ for v in json:
+ index += 1
+ if hasattr(v, '__iter__'):
+ self.resurse_to_flat_dictionary(v, prefix+"."+str(index))
+ else:
+ if prefix is None:
+ self.flat_dictionary[index] = str(v).replace(" ", "_")
+ + " " + self.timestamp
+ else:
+ key = prefix + "." + index;
+ self.flat_dictionary[key] = str(v).replace(" ", "_") + " " + self.timestamp
+ else:
+ self.flat_dictionary[json] = self.timestamp
diff --git a/tests/__init__.py b/tests/__init__.py
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/tests/__init__.py
diff --git a/tests/carbon/__init__.py b/tests/carbon/__init__.py
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/tests/carbon/__init__.py
diff --git a/tests/carbon/emitter_test.py b/tests/carbon/emitter_test.py
new file mode 100644
index 0000000..5caba61
--- /dev/null
+++ b/tests/carbon/emitter_test.py
@@ -0,0 +1,65 @@
+##############################################################################
+# Copyright (c) 2015 EMC and others.
+#
+# All rights reserved. This program and the accompanying materials
+# are made available under the terms of the Apache License, Version 2.0
+# which accompanies this distribution, and is available at
+# http://www.apache.org/licenses/LICENSE-2.0
+##############################################################################
+
+import unittest
+
+import json
+import SocketServer
+import threading
+from time import sleep
+
+import carbon.converter
+import carbon.emitter
+
+class MetricsHandler(SocketServer.BaseRequestHandler):
+
+ def handle(self):
+ # Echo the back to the client
+ CarbonMetricTransmitterTest.response = self.request.recv(1024)
+ return
+
+class MetricsServer(SocketServer.ThreadingMixIn, SocketServer.TCPServer):
+ pass
+
+class CarbonMetricTransmitterTest(unittest.TestCase):
+ listen_port = 0
+ response = None
+
+ def setUp(self):
+
+ address = ('localhost', 0)
+ server = MetricsServer(address, MetricsHandler)
+ ip, self.listen_port = server.server_address
+
+ t = threading.Thread(target=server.serve_forever)
+ t.setDaemon(True)
+ t.start()
+
+ def test_transmit_metrics(self):
+
+ testconv = carbon.converter.JSONToCarbon()
+ json_object = json.loads("""{"timestamp" : "12345"}""")
+ result = testconv.convert_to_dictionary(json_object, "host.run-name")
+
+ emitter = carbon.emitter.CarbonMetricTransmitter()
+ emitter.carbon_port = self.listen_port
+ emitter.transmit_metrics(result)
+
+ count = 0
+
+ while (CarbonMetricTransmitterTest.response == None and count < 10):
+ count += 1
+ sleep(0.1)
+
+ self.assertEqual("host.run-name.timestamp 12345 12345\n",
+ CarbonMetricTransmitterTest.response,
+ CarbonMetricTransmitterTest.response)
+
+if __name__ == '__main__':
+ unittest.main() \ No newline at end of file