Filippo Giunchedi has uploaded a new change for review. ( 
https://gerrit.wikimedia.org/r/388478 )

Change subject: mtail: add test scaffolding
......................................................................

mtail: add test scaffolding

Provide unittest-based tests for catching regressions in mtail rules.

Bug: T179565
Change-Id: I4f3f41125f41f95eee028feb7f08453bd5f9b452
---
A modules/mtail/files/test/logs/exim.test
A modules/mtail/files/test/mtail_store.py
A modules/mtail/files/test/mtail_test.py
3 files changed, 75 insertions(+), 0 deletions(-)


  git pull ssh://gerrit.wikimedia.org:29418/operations/puppet 
refs/changes/78/388478/1

diff --git a/modules/mtail/files/test/logs/exim.test 
b/modules/mtail/files/test/logs/exim.test
new file mode 100644
index 0000000..a3dc38e
--- /dev/null
+++ b/modules/mtail/files/test/logs/exim.test
@@ -0,0 +1,3 @@
+2017-11-02 10:20:48 1eACc9-0002y4-Ik => :blackhole: <w...@wikimedia.org> 
R=aliases
+2017-11-02 10:41:52 1eACwY-0004ON-3Z => foo...@wikimedia.org R=otrs 
T=remote_smtp S=1789 H=mendelevium.eqiad.wmnet [10.64.32.174] C="250 OK 
id=1eACwa-0001jO-8e" DT=0s
+2017-11-02 10:44:25 1eACyz-0004Vc-Il => z...@wikimedia.org 
(b...@wikimedia.org, r...@wikimedia.org, r...@wikisource.org, 
postmas...@wikisource.org) <ab...@wikisource.org> R=ldap_account T=remote_smtp 
S=181295 H=aspmx.l.google.com [209.85.232.27] 
X=TLS1.2:ECDHE_RSA_AES_128_GCM_SHA256:128 DN="C=US,ST=California,L=Mountain 
View,O=Google Inc,CN=mx.google.com" C="250 2.0.0 OK 1509619465 v37si20676qtg.44 
- gsmtp" DT=2s
diff --git a/modules/mtail/files/test/mtail_store.py 
b/modules/mtail/files/test/mtail_store.py
new file mode 100644
index 0000000..527e315
--- /dev/null
+++ b/modules/mtail/files/test/mtail_store.py
@@ -0,0 +1,51 @@
+import json
+import subprocess
+
+
+class MtailMetricStore(object):
+    def __init__(self, progs, logs):
+        self._store = {}
+        self._progs = progs
+        self._logs = logs
+        self.parse_metric_store(self.run_mtail()[0])
+
+    def run_mtail(self):
+        stdout, stderr = subprocess.Popen(
+                ['mtail', '-one_shot', '-one_shot_metrics', '-logtostderr',
+                 '-progs', self._progs, '-logs', self._logs], 
stderr=subprocess.PIPE,
+                stdout=subprocess.PIPE).communicate()
+        return stdout, stderr
+
+    def parse_metric_store(self, output):
+        metrics_store = []
+
+        in_json = False
+        for line in output.splitlines():
+            if in_json:
+                metrics_store.append(line)
+            if line.startswith('Metrics store:{'):
+                in_json = True
+                metrics_store.append('{')
+
+        self._store = json.loads(''.join(metrics_store))
+
+    def get_metric(self, name):
+        if name not in self._store:
+            raise ValueError('metric %s not found in store', name)
+        return MtailMetric(self._store[name][0].get('Keys', []),
+                           
self._store[name][0]['LabelValues'][0].get('Labels', []),
+                           
self._store[name][0]['LabelValues'][0]['Value']['Value'])
+
+
+class MtailMetric(object):
+    def __init__(self, keys, labels, value):
+        self._keys = keys
+        self._labels = labels
+        self._value = value
+        self._labelpairs = self.get_labelpairs(keys, labels)
+
+    def get_labelpairs(self, keys, labels):
+        res = []
+        for k, v in zip(keys, labels):
+            res.append('%s=%s' % (k, v))
+        return res
diff --git a/modules/mtail/files/test/mtail_test.py 
b/modules/mtail/files/test/mtail_test.py
new file mode 100644
index 0000000..4de6c74
--- /dev/null
+++ b/modules/mtail/files/test/mtail_test.py
@@ -0,0 +1,21 @@
+import mtail_store
+import unittest
+import os
+
+test_dir = os.path.join(os.path.dirname(__file__))
+
+
+class EximTest(unittest.TestCase):
+    def setUp(self):
+        self.store = mtail_store.MtailMetricStore(
+                os.path.join(test_dir, '../programs/exim.mtail'),
+                os.path.join(test_dir, 'logs/exim.test'))
+
+    def testEximMessages(self):
+        m = self.store.get_metric('exim_messages_total')
+        self.assertEqual(3, m._value)
+        self.assertIn('status=out', m._labelpairs)
+
+        m = self.store.get_metric('exim_messages_bytes')
+        self.assertEqual(183084, m._value)
+        self.assertIn('status=out', m._labelpairs)

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

Gerrit-MessageType: newchange
Gerrit-Change-Id: I4f3f41125f41f95eee028feb7f08453bd5f9b452
Gerrit-PatchSet: 1
Gerrit-Project: operations/puppet
Gerrit-Branch: production
Gerrit-Owner: Filippo Giunchedi <fgiunch...@wikimedia.org>

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

Reply via email to