Ottomata has submitted this change and it was merged. ( 
https://gerrit.wikimedia.org/r/375105 )

Change subject: webperf: Refactor ve.py and add unit tests
......................................................................


webperf: Refactor ve.py and add unit tests

Bug: T110903
Change-Id: I96e81be8d4b1c3dcd9259ae7c4c9ef65b3002b64
---
M modules/webperf/files/ve.py
A modules/webperf/files/ve_expected.txt
A modules/webperf/files/ve_fixture.yaml
3 files changed, 109 insertions(+), 25 deletions(-)

Approvals:
  Ottomata: Verified; Looks good to me, approved



diff --git a/modules/webperf/files/ve.py b/modules/webperf/files/ve.py
index dbebc3f..7546d87 100644
--- a/modules/webperf/files/ve.py
+++ b/modules/webperf/files/ve.py
@@ -7,37 +7,66 @@
 
 import argparse
 import socket
+import unittest
+import yaml
 
 import eventlogging
 
 
-ap = argparse.ArgumentParser(description='PerfData StatsD module')
-ap.add_argument('endpoint', help='URI of EventLogging endpoint')
-ap.add_argument('--statsd-host', default='localhost',
-                type=socket.gethostbyname)
-ap.add_argument('--statsd-port', default=8125, type=int)
-args = ap.parse_args()
-
-addr = args.statsd_host, args.statsd_port
-sock = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
-
-events = eventlogging.connect(args.endpoint)
-
-for meta in events.filter(schema='Edit'):
+def handle_edit(meta):
     event = meta['event']
     if event['editor'] == 'visualeditor':
+        action = event['action']
+        if action == 'saveSuccess':
+            metric = 'save'
+        elif action == 'ready':
+            metric = 'load'
+        else:
+            return
+        timing = int(event['action.%s.timing' % action])
+        # Log values between 0.1s an 100s (1.6min) only
+        if timing < 100 or timing > 100000:
+            return
+        return 'VisualEditor.%s:%s|ms' % (metric, timing)
+
+
+if __name__ == '__main__':
+    ap = argparse.ArgumentParser(description='PerfData StatsD module')
+    ap.add_argument('endpoint', help='URI of EventLogging endpoint')
+    ap.add_argument('--statsd-host', default='localhost',
+                    type=socket.gethostbyname)
+    ap.add_argument('--statsd-port', default=8125, type=int)
+    args = ap.parse_args()
+
+    addr = args.statsd_host, args.statsd_port
+    sock = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
+
+    events = eventlogging.connect(args.endpoint)
+
+    for meta in events.filter(schema='Edit'):
         try:
-            action = event['action']
-            if action == 'saveSuccess':
-                metric = 'save'
-            elif action == 'ready':
-                metric = 'load'
-            else:
-                continue
-            timing = int(event['action.%s.timing' % action])
-            if timing < 100 or timing > 100000:
-                continue
-            stat = 'VisualEditor.%s:%s|ms' % (metric, timing)
-            sock.sendto(stat.encode('utf-8'), addr)
+            stat = handle_edit(meta)
+            if stat is not None:
+                sock.sendto(stat.encode('utf-8'), addr)
         except (ValueError, KeyError):
             continue
+
+
+# ##### Tests ######
+# To run:
+#   python -m unittest ve
+#
+class TestVePerfData(unittest.TestCase):
+    def test_handler(self):
+        with open('ve_fixture.yaml') as fixture_file:
+            fixture = yaml.safe_load(fixture_file)
+            actual = []
+            for meta in fixture:
+                stat = handle_edit(meta)
+                if stat is not None:
+                    actual.append(stat)
+            with open('ve_expected.txt') as expected_file:
+                self.assertItemsEqual(
+                    actual,
+                    expected_file.read().splitlines()
+                )
diff --git a/modules/webperf/files/ve_expected.txt 
b/modules/webperf/files/ve_expected.txt
new file mode 100644
index 0000000..f5ed936
--- /dev/null
+++ b/modules/webperf/files/ve_expected.txt
@@ -0,0 +1,11 @@
+VisualEditor.load:1955|ms
+VisualEditor.load:33097|ms
+VisualEditor.load:3077|ms
+VisualEditor.load:2963|ms
+VisualEditor.load:1769|ms
+VisualEditor.save:14379|ms
+VisualEditor.load:1067|ms
+VisualEditor.load:9615|ms
+VisualEditor.load:2391|ms
+VisualEditor.load:16085|ms
+VisualEditor.load:2711|ms
diff --git a/modules/webperf/files/ve_fixture.yaml 
b/modules/webperf/files/ve_fixture.yaml
new file mode 100644
index 0000000..a10f256
--- /dev/null
+++ b/modules/webperf/files/ve_fixture.yaml
@@ -0,0 +1,44 @@
+# Random sample from August 2017
+# Anonimised by removing all fields, except:
+# - event.action
+# - event.action.*
+# - event.editor
+# - event.version
+# - schema
+
+- {"event": {"action": "saveSuccess", "editor": "wikitext", "version": 1}, 
"schema": "Edit"}
+- {"event": {"action": "saveAttempt", "editor": "wikitext", "version": 1}, 
"schema": "Edit"}
+- {"event": {"action": "abort", "action.abort.mechanism": "navigate", 
"action.abort.timing": 309305, "action.abort.type": "nochange", "editor": 
"visualeditor", "version": 1}, "schema": "Edit"}
+- {"event": {"action": "abort", "action.abort.mechanism": "navigate", 
"action.abort.timing": 59002, "action.abort.type": "nochange", "editor": 
"visualeditor", "version": 1}, "schema": "Edit"}
+- {"event": {"action": "ready", "action.ready.timing": 1955, "editor": 
"visualeditor", "version": 1}, "schema": "Edit"}
+- {"event": {"action": "saveIntent", "editor": "wikitext", "version": 1}, 
"schema": "Edit"}
+- {"event": {"action": "abort", "action.abort.mechanism": "navigate", 
"action.abort.timing": 2903, "action.abort.type": "nochange", "editor": 
"visualeditor", "version": 1}, "schema": "Edit"}
+- {"event": {"action": "ready", "action.ready.timing": 33097, "editor": 
"visualeditor", "version": 1}, "schema": "Edit"}
+- {"event": {"action": "init", "action.init.mechanism": "url", 
"action.init.timing": 206, "action.init.type": "page", "editor": 
"visualeditor", "version": 1}, "schema": "Edit"}
+- {"event": {"action": "ready", "action.ready.timing": 3077, "editor": 
"visualeditor", "version": 1}, "schema": "Edit"}
+- {"event": {"action": "init", "action.init.mechanism": "url", 
"action.init.timing": 817, "action.init.type": "page", "editor": 
"visualeditor", "version": 1}, "schema": "Edit"}
+- {"event": {"action": "ready", "action.ready.timing": 2963, "editor": 
"visualeditor", "version": 1}, "schema": "Edit"}
+- {"event": {"action": "abort", "action.abort.mechanism": "navigate", 
"action.abort.timing": 5502, "action.abort.type": "switchwithout", "editor": 
"visualeditor", "version": 1}, "schema": "Edit"}
+- {"event": {"action": "init", "action.init.mechanism": "url", 
"action.init.timing": 214, "action.init.type": "page", "editor": 
"visualeditor", "version": 1}, "schema": "Edit"}
+- {"event": {"action": "ready", "action.ready.timing": 1769, "editor": 
"visualeditor", "version": 1}, "schema": "Edit"}
+- {"event": {"action": "abort", "action.abort.mechanism": "navigate", 
"action.abort.timing": 3766, "action.abort.type": "switchwithout", "editor": 
"visualeditor", "version": 1}, "schema": "Edit"}
+- {"event": {"action": "saveIntent", "action.saveIntent.timing": 32831, 
"editor": "visualeditor", "version": 1}, "schema": "Edit"}
+- {"event": {"action": "saveAttempt", "action.saveAttempt.timing": 1987, 
"editor": "visualeditor", "version": 1}, "schema": "Edit"}
+- {"event": {"action": "abort", "action.abort.mechanism": "navigate", 
"action.abort.timing": 3834, "action.abort.type": "nochange", "editor": 
"visualeditor", "version": 1}, "schema": "Edit"}
+- {"event": {"action": "init", "action.init.mechanism": "url", 
"action.init.timing": 435, "action.init.type": "page", "editor": 
"visualeditor", "version": 1}, "schema": "Edit"}
+- {"event": {"action": "saveSuccess", "action.saveSuccess.timing": 14379, 
"editor": "visualeditor", "version": 1}, "schema": "Edit"}
+- {"event": {"action": "abort", "action.abort.mechanism": "navigate", 
"action.abort.timing": 128254, "action.abort.type": "nochange", "editor": 
"visualeditor", "version": 1}, "schema": "Edit"}
+- {"event": {"action": "init", "action.init.mechanism": "url", 
"action.init.timing": 147, "action.init.type": "page", "editor": 
"visualeditor", "version": 1}, "schema": "Edit"}
+- {"event": {"action": "saveFailure", "action.saveFailure.type": 
"responseUnknown", "editor": "wikitext", "version": 1}, "schema": "Edit"}
+- {"event": {"action": "init", "action.init.mechanism": "url", 
"action.init.timing": 311, "action.init.type": "page", "editor": 
"visualeditor", "version": 1}, "schema": "Edit"}
+- {"event": {"action": "abort", "action.abort.mechanism": "navigate", 
"action.abort.timing": 619, "action.abort.type": "nochange", "editor": 
"visualeditor", "version": 1}, "schema": "Edit"}
+- {"event": {"action": "ready", "action.ready.timing": 1067, "editor": 
"visualeditor", "version": 1}, "schema": "Edit"}
+- {"event": {"action": "init", "action.init.mechanism": "url", 
"action.init.timing": 656, "action.init.type": "page", "editor": 
"visualeditor", "version": 1}, "schema": "Edit"}
+- {"event": {"action": "ready", "action.ready.timing": 9615, "editor": 
"visualeditor", "version": 1}, "schema": "Edit"}
+- {"event": {"action": "init", "action.init.mechanism": "url", 
"action.init.timing": 237, "action.init.type": "page", "editor": 
"visualeditor", "version": 1}, "schema": "Edit"}
+- {"event": {"action": "ready", "action.ready.timing": 2391, "editor": 
"visualeditor", "version": 1}, "schema": "Edit"}
+- {"event": {"action": "init", "action.init.mechanism": "click", 
"action.init.timing": 142771, "action.init.type": "page", "editor": 
"visualeditor", "version": 1}, "schema": "Edit"}
+- {"event": {"action": "abort", "action.abort.mechanism": "navigate", 
"action.abort.timing": 6249, "action.abort.type": "nochange", "editor": 
"visualeditor", "version": 1}, "schema": "Edit"}
+- {"event": {"action": "ready", "action.ready.timing": 16085, "editor": 
"visualeditor", "version": 1}, "schema": "Edit"}
+- {"event": {"action": "init", "action.init.mechanism": "url", 
"action.init.timing": 345, "action.init.type": "page", "editor": 
"visualeditor", "version": 1}, "schema": "Edit"}
+- {"event": {"action": "ready", "action.ready.timing": 2711, "editor": 
"visualeditor", "version": 1}, "schema": "Edit"}

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

Gerrit-MessageType: merged
Gerrit-Change-Id: I96e81be8d4b1c3dcd9259ae7c4c9ef65b3002b64
Gerrit-PatchSet: 3
Gerrit-Project: operations/puppet
Gerrit-Branch: production
Gerrit-Owner: Krinkle <[email protected]>
Gerrit-Reviewer: Jforrester <[email protected]>
Gerrit-Reviewer: Ottomata <[email protected]>
Gerrit-Reviewer: Phedenskog <[email protected]>
Gerrit-Reviewer: Volans <[email protected]>
Gerrit-Reviewer: jenkins-bot <>

_______________________________________________
MediaWiki-commits mailing list
[email protected]
https://lists.wikimedia.org/mailman/listinfo/mediawiki-commits

Reply via email to