Filippo Giunchedi has submitted this change and it was merged.

Change subject: txstatsd: add support for graphite line-protocol
......................................................................


txstatsd: add support for graphite line-protocol

txstatsd uses graphite's native carbon client, which works well but only
supports pickle format.
However I couldn't find any non-graphite tools available that can route pickle
protocol, we are going to use carbon-c-relay in the first iteration which is
plaintext-only. See also
http://graphite.readthedocs.org/en/latest/feeding-carbon.html#the-plaintext-protocol

Changing carbon client code completely isn't an appealing option to me and we
already ship txstatsd via custom debian packages anyway.

So the ugly approach in this case is to monkey-patch the functions used to
serialize metrics and restrict plaintext protocol support to txstatsd only :(

Change-Id: I3b4230f8a358adaee7134bd586b503774574a31e
---
M txstatsd.conf-example
M txstatsd/service.py
2 files changed, 30 insertions(+), 1 deletion(-)

Approvals:
  Filippo Giunchedi: Verified; Looks good to me, approved
  Faidon Liambotis: Looks good to me, but someone else must approve



diff --git a/txstatsd.conf-example b/txstatsd.conf-example
index 1119fa9..53eef1d 100644
--- a/txstatsd.conf-example
+++ b/txstatsd.conf-example
@@ -5,6 +5,8 @@
 carbon-cache-port: 2003
 # The UDP port where we will listen.
 listen-port: 8125
+# Write metrics using graphite's line-oriented protocol instead of pickle
+use-line-protocol: 0
 
 # The number of milliseconds between each flush.
 flush-interval: 60000
@@ -23,4 +25,4 @@
 monitor-response: txstatsd pong
 
 [plugin_sample]
-sample-key: sample-value
\ No newline at end of file
+sample-key: sample-value
diff --git a/txstatsd/service.py b/txstatsd/service.py
index f8721d7..bc77694 100644
--- a/txstatsd/service.py
+++ b/txstatsd/service.py
@@ -156,6 +156,8 @@
          "The port where carbon cache is listening.", int],
         ["carbon-cache-name", "n", None,
          "An identifier for the carbon-cache instance."],
+        ["use-line-protocol", "P", 0,
+         "Use graphite line protocol when sending metrics."],
         ["listen-port", "l", 8125,
          "The UDP port where we will listen.", int],
         ["flush-interval", "i", 60000,
@@ -252,6 +254,23 @@
     return current_stats
 
 
+def _CarbonClientLineProtocol_sendDatapoints(self, datapoints):
+    """Serialize data in line (or plaintext) format, one metric per line."""
+    def _serialize(data):
+        return "".join("%s %s %s\n" % (x, y[1], y[0]) for x, y in data)
+
+    from carbon import instrumentation
+    self.sendString(_serialize(datapoints))
+    instrumentation.increment(self.sent, len(datapoints))
+    self.factory.checkQueue()
+
+
+def _Int32StringReceiver_sendString(self, string):
+    """Write data verbatim to the transport, StringReceiver standard
+       implementation would length-prefix the string instead."""
+    self.transport.write(string)
+
+
 def createService(options):
     """Create a txStatsD service."""
     from carbon.routers import ConsistentHashingRouter
@@ -331,6 +350,14 @@
                                     report_name.upper(), ()):
                 reporting.schedule(reporter, 60, metrics.gauge)
 
+    # monkey-patch line protocol sending function :(
+    if options["use-line-protocol"]:
+        import carbon.client
+        carbon.client.CarbonClientProtocol._sendDatapoints = \
+                _CarbonClientLineProtocol_sendDatapoints
+        carbon.client.CarbonClientProtocol.sendString = \
+                _Int32StringReceiver_sendString
+
     # XXX Make this configurable.
     router = ConsistentHashingRouter()
     carbon_client = CarbonClientManager(router)

-- 
To view, visit https://gerrit.wikimedia.org/r/180786
To unsubscribe, visit https://gerrit.wikimedia.org/r/settings

Gerrit-MessageType: merged
Gerrit-Change-Id: I3b4230f8a358adaee7134bd586b503774574a31e
Gerrit-PatchSet: 4
Gerrit-Project: operations/debs/txstatsd
Gerrit-Branch: master
Gerrit-Owner: Filippo Giunchedi <fgiunch...@wikimedia.org>
Gerrit-Reviewer: Alexandros Kosiaris <akosia...@wikimedia.org>
Gerrit-Reviewer: Chasemp <chas...@gmail.com>
Gerrit-Reviewer: Faidon Liambotis <fai...@wikimedia.org>
Gerrit-Reviewer: Filippo Giunchedi <fgiunch...@wikimedia.org>
Gerrit-Reviewer: Yuvipanda <yuvipa...@gmail.com>

_______________________________________________
MediaWiki-commits mailing list
MediaWiki-commits@lists.wikimedia.org
https://lists.wikimedia.org/mailman/listinfo/mediawiki-commits

Reply via email to