Krinkle has uploaded a new change for review. ( 
https://gerrit.wikimedia.org/r/372577 )

Change subject: webperf: Add unit tests for schema handlers and stat dispatching
......................................................................

webperf: Add unit tests for schema handlers and stat dispatching

* Separate make_stat from dispatch_stat.
* Convert the schema handlers to generators by using 'yield make_stat'
  instead of simply calling dispatch_stat.
* Update the main call to the schema handlers to now iterate over
  the yielded results and call dispatch_stat there instead.
* Add a unit test that calls the schema handlers without calling
  dispatch_stat. Commit a random sample from the Kafka stream
  including the expected output.

Change-Id: Ic05e519c3284d5dba06c47367d38e5545a2762b9
---
M modules/webperf/files/navtiming.py
A modules/webperf/files/navtiming_expected.txt
A modules/webperf/files/navtiming_fixture.yaml
3 files changed, 571 insertions(+), 15 deletions(-)


  git pull ssh://gerrit.wikimedia.org:29418/operations/puppet 
refs/changes/77/372577/1

diff --git a/modules/webperf/files/navtiming.py 
b/modules/webperf/files/navtiming.py
index 353a2bc..20558f4 100755
--- a/modules/webperf/files/navtiming.py
+++ b/modules/webperf/files/navtiming.py
@@ -292,12 +292,16 @@
     return ('Other', '_')
 
 
-def dispatch_stat(*args):
+def dispatch_stat(stat):
+    sock.sendto(stat, addr)
+
+
+def make_stat(*args):
     args = list(args)
     value = args.pop()
     name = '.'.join(arg.replace(' ', '_') for arg in args)
     stat = '%s:%s|ms' % (name, value)
-    sock.sendto(stat.encode('utf-8'), addr)
+    return stat.encode('utf-8')
 
 
 def handles(schema):
@@ -319,9 +323,9 @@
     if duration is None:
         duration = event.get('duration')
     if duration and is_sane(duration):
-        dispatch_stat('mw.performance.save', duration)
+        yield make_stat('mw.performance.save', duration)
         if version:
-            dispatch_stat('mw.performance.save_by_version',
+            yield make_stat('mw.performance.save_by_version',
                           version.replace('.', '_'), duration)
 
 
@@ -378,19 +382,19 @@
         prefix = 'frontend.navtiming'
 
         if is_sane(value):
-            dispatch_stat(prefix, metric, site, auth, value)
-            dispatch_stat(prefix, metric, site, 'overall', value)
-            dispatch_stat(prefix, metric, 'overall', value)
+            yield make_stat(prefix, metric, site, auth, value)
+            yield make_stat(prefix, metric, site, 'overall', value)
+            yield make_stat(prefix, metric, 'overall', value)
 
             ua = parse_ua(meta['userAgent']) or ('Other', '_')
-            dispatch_stat(prefix, metric, 'by_browser', ua[0], ua[1], value)
-            dispatch_stat(prefix, metric, 'by_browser', ua[0], 'all', value)
+            yield make_stat(prefix, metric, 'by_browser', ua[0], ua[1], value)
+            yield make_stat(prefix, metric, 'by_browser', ua[0], 'all', value)
 
         if continent is not None:
-            dispatch_stat(prefix, metric, 'by_continent', continent, value)
+            yield make_stat(prefix, metric, 'by_continent', continent, value)
 
         if country_name is not None:
-            dispatch_stat(prefix, metric, 'by_country', country_name, value)
+            yield make_stat(prefix, metric, 'by_country', country_name, value)
 
 
 if __name__ == '__main__':
@@ -429,7 +433,8 @@
             if 'schema' in meta:
                 f = handlers.get(meta['schema'])
                 if f is not None:
-                    f(meta)
+                    for stat in f(meta):
+                        dispatch_stat(stat)
         # If we reach this line, consumer_timeout_ms elapsed without events
         raise RuntimeError('No messages received in %d seconds.' % 
kafka_consumer_timeout_seconds)
     finally:
@@ -438,10 +443,9 @@
 
 # ##### Tests ######
 # To run:
-#   python -m unittest navtiming
+#   python -m unittest -v navtiming
 #
-class TestParseUa(unittest.TestCase):
-
+class TestNavTiming(unittest.TestCase):
     def test_parse_ua(self):
         with open('navtiming_ua_data.yaml') as f:
             data = yaml.safe_load(f)
@@ -453,3 +457,15 @@
                         parse_ua(ua),
                         expect
                     )
+
+    def test_handlers(self):
+        with open('navtiming_fixture.yaml') as f:
+            fixture = yaml.safe_load(f)
+            actual = []
+            for meta in fixture:
+                f = handlers.get(meta['schema'])
+                assert f is not None
+                for stat in f(meta):
+                    actual.append(stat)
+            expected = open('navtiming_expected.txt')
+            self.assertItemsEqual(actual, expected.read().splitlines())
diff --git a/modules/webperf/files/navtiming_expected.txt 
b/modules/webperf/files/navtiming_expected.txt
new file mode 100644
index 0000000..d7ad14c
--- /dev/null
+++ b/modules/webperf/files/navtiming_expected.txt
@@ -0,0 +1,504 @@
+frontend.navtiming.connecting.by_continent.Europe:0|ms
+frontend.navtiming.connecting.by_continent.North_America:0|ms
+frontend.navtiming.connecting.by_continent.South_America:0|ms
+frontend.navtiming.connecting.by_country.Argentina:0|ms
+frontend.navtiming.connecting.by_country.Canada:0|ms
+frontend.navtiming.connecting.by_country.Italy:0|ms
+frontend.navtiming.dnsLookup.by_continent.Europe:0|ms
+frontend.navtiming.dnsLookup.by_continent.Europe:0|ms
+frontend.navtiming.dnsLookup.by_continent.Europe:0|ms
+frontend.navtiming.dnsLookup.by_continent.Europe:0|ms
+frontend.navtiming.dnsLookup.by_continent.North_America:0|ms
+frontend.navtiming.dnsLookup.by_continent.North_America:0|ms
+frontend.navtiming.dnsLookup.by_continent.South_America:0|ms
+frontend.navtiming.dnsLookup.by_country.Argentina:0|ms
+frontend.navtiming.dnsLookup.by_country.Canada:0|ms
+frontend.navtiming.dnsLookup.by_country.France:0|ms
+frontend.navtiming.dnsLookup.by_country.Italy:0|ms
+frontend.navtiming.dnsLookup.by_country.United_Kingdom:0|ms
+frontend.navtiming.dnsLookup.by_country.United_Kingdom:0|ms
+frontend.navtiming.dnsLookup.by_country.United_States:0|ms
+frontend.navtiming.domComplete.by_browser.Chrome.60:1471|ms
+frontend.navtiming.domComplete.by_browser.Chrome.all:1471|ms
+frontend.navtiming.domComplete.by_browser.Chrome_Mobile.57:2880|ms
+frontend.navtiming.domComplete.by_browser.Chrome_Mobile.59:5921|ms
+frontend.navtiming.domComplete.by_browser.Chrome_Mobile.all:2880|ms
+frontend.navtiming.domComplete.by_browser.Chrome_Mobile.all:5921|ms
+frontend.navtiming.domComplete.by_browser.Mobile_Safari.10_0:2381|ms
+frontend.navtiming.domComplete.by_browser.Mobile_Safari.10_0:343|ms
+frontend.navtiming.domComplete.by_browser.Mobile_Safari.all:2381|ms
+frontend.navtiming.domComplete.by_browser.Mobile_Safari.all:343|ms
+frontend.navtiming.domComplete.by_browser.Other._:455|ms
+frontend.navtiming.domComplete.by_browser.Other.all:455|ms
+frontend.navtiming.domComplete.by_browser.iOS_other.8:5513|ms
+frontend.navtiming.domComplete.by_browser.iOS_other.all:5513|ms
+frontend.navtiming.domComplete.by_continent.Europe:1471|ms
+frontend.navtiming.domComplete.by_continent.Europe:2381|ms
+frontend.navtiming.domComplete.by_continent.Europe:5513|ms
+frontend.navtiming.domComplete.by_continent.Europe:5921|ms
+frontend.navtiming.domComplete.by_continent.North_America:343|ms
+frontend.navtiming.domComplete.by_continent.North_America:455|ms
+frontend.navtiming.domComplete.by_continent.South_America:2880|ms
+frontend.navtiming.domComplete.by_country.Argentina:2880|ms
+frontend.navtiming.domComplete.by_country.Canada:455|ms
+frontend.navtiming.domComplete.by_country.France:1471|ms
+frontend.navtiming.domComplete.by_country.Italy:5921|ms
+frontend.navtiming.domComplete.by_country.United_Kingdom:2381|ms
+frontend.navtiming.domComplete.by_country.United_Kingdom:5513|ms
+frontend.navtiming.domComplete.by_country.United_States:343|ms
+frontend.navtiming.domComplete.desktop.anonymous:1471|ms
+frontend.navtiming.domComplete.desktop.anonymous:5513|ms
+frontend.navtiming.domComplete.desktop.overall:1471|ms
+frontend.navtiming.domComplete.desktop.overall:5513|ms
+frontend.navtiming.domComplete.mobile.anonymous:2381|ms
+frontend.navtiming.domComplete.mobile.anonymous:2880|ms
+frontend.navtiming.domComplete.mobile.anonymous:343|ms
+frontend.navtiming.domComplete.mobile.anonymous:455|ms
+frontend.navtiming.domComplete.mobile.anonymous:5921|ms
+frontend.navtiming.domComplete.mobile.overall:2381|ms
+frontend.navtiming.domComplete.mobile.overall:2880|ms
+frontend.navtiming.domComplete.mobile.overall:343|ms
+frontend.navtiming.domComplete.mobile.overall:455|ms
+frontend.navtiming.domComplete.mobile.overall:5921|ms
+frontend.navtiming.domComplete.overall:1471|ms
+frontend.navtiming.domComplete.overall:2381|ms
+frontend.navtiming.domComplete.overall:2880|ms
+frontend.navtiming.domComplete.overall:343|ms
+frontend.navtiming.domComplete.overall:455|ms
+frontend.navtiming.domComplete.overall:5513|ms
+frontend.navtiming.domComplete.overall:5921|ms
+frontend.navtiming.domInteractive.by_browser.Chrome.60:476|ms
+frontend.navtiming.domInteractive.by_browser.Chrome.all:476|ms
+frontend.navtiming.domInteractive.by_browser.Chrome_Mobile.57:2867|ms
+frontend.navtiming.domInteractive.by_browser.Chrome_Mobile.59:1818|ms
+frontend.navtiming.domInteractive.by_browser.Chrome_Mobile.all:1818|ms
+frontend.navtiming.domInteractive.by_browser.Chrome_Mobile.all:2867|ms
+frontend.navtiming.domInteractive.by_browser.Mobile_Safari.10_0:1072|ms
+frontend.navtiming.domInteractive.by_browser.Mobile_Safari.10_0:204|ms
+frontend.navtiming.domInteractive.by_browser.Mobile_Safari.all:1072|ms
+frontend.navtiming.domInteractive.by_browser.Mobile_Safari.all:204|ms
+frontend.navtiming.domInteractive.by_browser.Other._:266|ms
+frontend.navtiming.domInteractive.by_browser.Other.all:266|ms
+frontend.navtiming.domInteractive.by_browser.iOS_other.8:715|ms
+frontend.navtiming.domInteractive.by_browser.iOS_other.all:715|ms
+frontend.navtiming.domInteractive.by_continent.Europe:1072|ms
+frontend.navtiming.domInteractive.by_continent.Europe:1818|ms
+frontend.navtiming.domInteractive.by_continent.Europe:476|ms
+frontend.navtiming.domInteractive.by_continent.Europe:715|ms
+frontend.navtiming.domInteractive.by_continent.North_America:204|ms
+frontend.navtiming.domInteractive.by_continent.North_America:266|ms
+frontend.navtiming.domInteractive.by_continent.South_America:2867|ms
+frontend.navtiming.domInteractive.by_country.Argentina:2867|ms
+frontend.navtiming.domInteractive.by_country.Canada:266|ms
+frontend.navtiming.domInteractive.by_country.France:476|ms
+frontend.navtiming.domInteractive.by_country.Italy:1818|ms
+frontend.navtiming.domInteractive.by_country.United_Kingdom:1072|ms
+frontend.navtiming.domInteractive.by_country.United_Kingdom:715|ms
+frontend.navtiming.domInteractive.by_country.United_States:204|ms
+frontend.navtiming.domInteractive.desktop.anonymous:476|ms
+frontend.navtiming.domInteractive.desktop.anonymous:715|ms
+frontend.navtiming.domInteractive.desktop.overall:476|ms
+frontend.navtiming.domInteractive.desktop.overall:715|ms
+frontend.navtiming.domInteractive.mobile.anonymous:1072|ms
+frontend.navtiming.domInteractive.mobile.anonymous:1818|ms
+frontend.navtiming.domInteractive.mobile.anonymous:204|ms
+frontend.navtiming.domInteractive.mobile.anonymous:266|ms
+frontend.navtiming.domInteractive.mobile.anonymous:2867|ms
+frontend.navtiming.domInteractive.mobile.overall:1072|ms
+frontend.navtiming.domInteractive.mobile.overall:1818|ms
+frontend.navtiming.domInteractive.mobile.overall:204|ms
+frontend.navtiming.domInteractive.mobile.overall:266|ms
+frontend.navtiming.domInteractive.mobile.overall:2867|ms
+frontend.navtiming.domInteractive.overall:1072|ms
+frontend.navtiming.domInteractive.overall:1818|ms
+frontend.navtiming.domInteractive.overall:204|ms
+frontend.navtiming.domInteractive.overall:266|ms
+frontend.navtiming.domInteractive.overall:2867|ms
+frontend.navtiming.domInteractive.overall:476|ms
+frontend.navtiming.domInteractive.overall:715|ms
+frontend.navtiming.fetchStart.by_browser.Chrome_Mobile.57:2|ms
+frontend.navtiming.fetchStart.by_browser.Chrome_Mobile.59:170|ms
+frontend.navtiming.fetchStart.by_browser.Chrome_Mobile.all:170|ms
+frontend.navtiming.fetchStart.by_browser.Chrome_Mobile.all:2|ms
+frontend.navtiming.fetchStart.by_browser.Other._:1|ms
+frontend.navtiming.fetchStart.by_browser.Other.all:1|ms
+frontend.navtiming.fetchStart.by_continent.Europe:170|ms
+frontend.navtiming.fetchStart.by_continent.North_America:1|ms
+frontend.navtiming.fetchStart.by_continent.South_America:2|ms
+frontend.navtiming.fetchStart.by_country.Argentina:2|ms
+frontend.navtiming.fetchStart.by_country.Canada:1|ms
+frontend.navtiming.fetchStart.by_country.Italy:170|ms
+frontend.navtiming.fetchStart.mobile.anonymous:170|ms
+frontend.navtiming.fetchStart.mobile.anonymous:1|ms
+frontend.navtiming.fetchStart.mobile.anonymous:2|ms
+frontend.navtiming.fetchStart.mobile.overall:170|ms
+frontend.navtiming.fetchStart.mobile.overall:1|ms
+frontend.navtiming.fetchStart.mobile.overall:2|ms
+frontend.navtiming.fetchStart.overall:170|ms
+frontend.navtiming.fetchStart.overall:1|ms
+frontend.navtiming.fetchStart.overall:2|ms
+frontend.navtiming.firstPaint.by_browser.Chrome.60:754|ms
+frontend.navtiming.firstPaint.by_browser.Chrome.all:754|ms
+frontend.navtiming.firstPaint.by_browser.Chrome_Mobile.57:2858|ms
+frontend.navtiming.firstPaint.by_browser.Chrome_Mobile.59:424|ms
+frontend.navtiming.firstPaint.by_browser.Chrome_Mobile.all:2858|ms
+frontend.navtiming.firstPaint.by_browser.Chrome_Mobile.all:424|ms
+frontend.navtiming.firstPaint.by_continent.Europe:424|ms
+frontend.navtiming.firstPaint.by_continent.Europe:754|ms
+frontend.navtiming.firstPaint.by_continent.South_America:2858|ms
+frontend.navtiming.firstPaint.by_country.Argentina:2858|ms
+frontend.navtiming.firstPaint.by_country.France:754|ms
+frontend.navtiming.firstPaint.by_country.Italy:424|ms
+frontend.navtiming.firstPaint.desktop.anonymous:754|ms
+frontend.navtiming.firstPaint.desktop.overall:754|ms
+frontend.navtiming.firstPaint.mobile.anonymous:2858|ms
+frontend.navtiming.firstPaint.mobile.anonymous:424|ms
+frontend.navtiming.firstPaint.mobile.overall:2858|ms
+frontend.navtiming.firstPaint.mobile.overall:424|ms
+frontend.navtiming.firstPaint.overall:2858|ms
+frontend.navtiming.firstPaint.overall:424|ms
+frontend.navtiming.firstPaint.overall:754|ms
+frontend.navtiming.loadEventEnd.by_browser.Chrome.60:1499|ms
+frontend.navtiming.loadEventEnd.by_browser.Chrome.all:1499|ms
+frontend.navtiming.loadEventEnd.by_browser.Chrome_Mobile.57:2880|ms
+frontend.navtiming.loadEventEnd.by_browser.Chrome_Mobile.59:5925|ms
+frontend.navtiming.loadEventEnd.by_browser.Chrome_Mobile.all:2880|ms
+frontend.navtiming.loadEventEnd.by_browser.Chrome_Mobile.all:5925|ms
+frontend.navtiming.loadEventEnd.by_browser.Mobile_Safari.10_0:2427|ms
+frontend.navtiming.loadEventEnd.by_browser.Mobile_Safari.10_0:350|ms
+frontend.navtiming.loadEventEnd.by_browser.Mobile_Safari.all:2427|ms
+frontend.navtiming.loadEventEnd.by_browser.Mobile_Safari.all:350|ms
+frontend.navtiming.loadEventEnd.by_browser.Other._:479|ms
+frontend.navtiming.loadEventEnd.by_browser.Other.all:479|ms
+frontend.navtiming.loadEventEnd.by_browser.iOS_other.8:5899|ms
+frontend.navtiming.loadEventEnd.by_browser.iOS_other.all:5899|ms
+frontend.navtiming.loadEventEnd.by_continent.Europe:1499|ms
+frontend.navtiming.loadEventEnd.by_continent.Europe:2427|ms
+frontend.navtiming.loadEventEnd.by_continent.Europe:5899|ms
+frontend.navtiming.loadEventEnd.by_continent.Europe:5925|ms
+frontend.navtiming.loadEventEnd.by_continent.North_America:350|ms
+frontend.navtiming.loadEventEnd.by_continent.North_America:479|ms
+frontend.navtiming.loadEventEnd.by_continent.South_America:2880|ms
+frontend.navtiming.loadEventEnd.by_country.Argentina:2880|ms
+frontend.navtiming.loadEventEnd.by_country.Canada:479|ms
+frontend.navtiming.loadEventEnd.by_country.France:1499|ms
+frontend.navtiming.loadEventEnd.by_country.Italy:5925|ms
+frontend.navtiming.loadEventEnd.by_country.United_Kingdom:2427|ms
+frontend.navtiming.loadEventEnd.by_country.United_Kingdom:5899|ms
+frontend.navtiming.loadEventEnd.by_country.United_States:350|ms
+frontend.navtiming.loadEventEnd.desktop.anonymous:1499|ms
+frontend.navtiming.loadEventEnd.desktop.anonymous:5899|ms
+frontend.navtiming.loadEventEnd.desktop.overall:1499|ms
+frontend.navtiming.loadEventEnd.desktop.overall:5899|ms
+frontend.navtiming.loadEventEnd.mobile.anonymous:2427|ms
+frontend.navtiming.loadEventEnd.mobile.anonymous:2880|ms
+frontend.navtiming.loadEventEnd.mobile.anonymous:350|ms
+frontend.navtiming.loadEventEnd.mobile.anonymous:479|ms
+frontend.navtiming.loadEventEnd.mobile.anonymous:5925|ms
+frontend.navtiming.loadEventEnd.mobile.overall:2427|ms
+frontend.navtiming.loadEventEnd.mobile.overall:2880|ms
+frontend.navtiming.loadEventEnd.mobile.overall:350|ms
+frontend.navtiming.loadEventEnd.mobile.overall:479|ms
+frontend.navtiming.loadEventEnd.mobile.overall:5925|ms
+frontend.navtiming.loadEventEnd.overall:1499|ms
+frontend.navtiming.loadEventEnd.overall:2427|ms
+frontend.navtiming.loadEventEnd.overall:2880|ms
+frontend.navtiming.loadEventEnd.overall:350|ms
+frontend.navtiming.loadEventEnd.overall:479|ms
+frontend.navtiming.loadEventEnd.overall:5899|ms
+frontend.navtiming.loadEventEnd.overall:5925|ms
+frontend.navtiming.loadEventStart.by_browser.Chrome.60:1472|ms
+frontend.navtiming.loadEventStart.by_browser.Chrome.all:1472|ms
+frontend.navtiming.loadEventStart.by_browser.Chrome_Mobile.57:2880|ms
+frontend.navtiming.loadEventStart.by_browser.Chrome_Mobile.59:5924|ms
+frontend.navtiming.loadEventStart.by_browser.Chrome_Mobile.all:2880|ms
+frontend.navtiming.loadEventStart.by_browser.Chrome_Mobile.all:5924|ms
+frontend.navtiming.loadEventStart.by_browser.Mobile_Safari.10_0:2381|ms
+frontend.navtiming.loadEventStart.by_browser.Mobile_Safari.10_0:343|ms
+frontend.navtiming.loadEventStart.by_browser.Mobile_Safari.all:2381|ms
+frontend.navtiming.loadEventStart.by_browser.Mobile_Safari.all:343|ms
+frontend.navtiming.loadEventStart.by_browser.Other._:456|ms
+frontend.navtiming.loadEventStart.by_browser.Other.all:456|ms
+frontend.navtiming.loadEventStart.by_browser.iOS_other.8:5513|ms
+frontend.navtiming.loadEventStart.by_browser.iOS_other.all:5513|ms
+frontend.navtiming.loadEventStart.by_continent.Europe:1472|ms
+frontend.navtiming.loadEventStart.by_continent.Europe:2381|ms
+frontend.navtiming.loadEventStart.by_continent.Europe:5513|ms
+frontend.navtiming.loadEventStart.by_continent.Europe:5924|ms
+frontend.navtiming.loadEventStart.by_continent.North_America:343|ms
+frontend.navtiming.loadEventStart.by_continent.North_America:456|ms
+frontend.navtiming.loadEventStart.by_continent.South_America:2880|ms
+frontend.navtiming.loadEventStart.by_country.Argentina:2880|ms
+frontend.navtiming.loadEventStart.by_country.Canada:456|ms
+frontend.navtiming.loadEventStart.by_country.France:1472|ms
+frontend.navtiming.loadEventStart.by_country.Italy:5924|ms
+frontend.navtiming.loadEventStart.by_country.United_Kingdom:2381|ms
+frontend.navtiming.loadEventStart.by_country.United_Kingdom:5513|ms
+frontend.navtiming.loadEventStart.by_country.United_States:343|ms
+frontend.navtiming.loadEventStart.desktop.anonymous:1472|ms
+frontend.navtiming.loadEventStart.desktop.anonymous:5513|ms
+frontend.navtiming.loadEventStart.desktop.overall:1472|ms
+frontend.navtiming.loadEventStart.desktop.overall:5513|ms
+frontend.navtiming.loadEventStart.mobile.anonymous:2381|ms
+frontend.navtiming.loadEventStart.mobile.anonymous:2880|ms
+frontend.navtiming.loadEventStart.mobile.anonymous:343|ms
+frontend.navtiming.loadEventStart.mobile.anonymous:456|ms
+frontend.navtiming.loadEventStart.mobile.anonymous:5924|ms
+frontend.navtiming.loadEventStart.mobile.overall:2381|ms
+frontend.navtiming.loadEventStart.mobile.overall:2880|ms
+frontend.navtiming.loadEventStart.mobile.overall:343|ms
+frontend.navtiming.loadEventStart.mobile.overall:456|ms
+frontend.navtiming.loadEventStart.mobile.overall:5924|ms
+frontend.navtiming.loadEventStart.overall:1472|ms
+frontend.navtiming.loadEventStart.overall:2381|ms
+frontend.navtiming.loadEventStart.overall:2880|ms
+frontend.navtiming.loadEventStart.overall:343|ms
+frontend.navtiming.loadEventStart.overall:456|ms
+frontend.navtiming.loadEventStart.overall:5513|ms
+frontend.navtiming.loadEventStart.overall:5924|ms
+frontend.navtiming.mediaWikiLoadComplete.by_browser.Chrome.60:2360|ms
+frontend.navtiming.mediaWikiLoadComplete.by_browser.Chrome.all:2360|ms
+frontend.navtiming.mediaWikiLoadComplete.by_browser.Chrome_Mobile.30:1322|ms
+frontend.navtiming.mediaWikiLoadComplete.by_browser.Chrome_Mobile.57:3129|ms
+frontend.navtiming.mediaWikiLoadComplete.by_browser.Chrome_Mobile.59:1697|ms
+frontend.navtiming.mediaWikiLoadComplete.by_browser.Chrome_Mobile.all:1322|ms
+frontend.navtiming.mediaWikiLoadComplete.by_browser.Chrome_Mobile.all:1697|ms
+frontend.navtiming.mediaWikiLoadComplete.by_browser.Chrome_Mobile.all:3129|ms
+frontend.navtiming.mediaWikiLoadComplete.by_browser.Mobile_Safari.10_0:1253|ms
+frontend.navtiming.mediaWikiLoadComplete.by_browser.Mobile_Safari.10_0:131|ms
+frontend.navtiming.mediaWikiLoadComplete.by_browser.Mobile_Safari.all:1253|ms
+frontend.navtiming.mediaWikiLoadComplete.by_browser.Mobile_Safari.all:131|ms
+frontend.navtiming.mediaWikiLoadComplete.by_browser.Other._:1625|ms
+frontend.navtiming.mediaWikiLoadComplete.by_browser.Other.all:1625|ms
+frontend.navtiming.mediaWikiLoadComplete.by_browser.iOS_other.8:4920|ms
+frontend.navtiming.mediaWikiLoadComplete.by_browser.iOS_other.all:4920|ms
+frontend.navtiming.mediaWikiLoadComplete.by_continent.Asia:1322|ms
+frontend.navtiming.mediaWikiLoadComplete.by_continent.Europe:1253|ms
+frontend.navtiming.mediaWikiLoadComplete.by_continent.Europe:1697|ms
+frontend.navtiming.mediaWikiLoadComplete.by_continent.Europe:2360|ms
+frontend.navtiming.mediaWikiLoadComplete.by_continent.Europe:4920|ms
+frontend.navtiming.mediaWikiLoadComplete.by_continent.North_America:131|ms
+frontend.navtiming.mediaWikiLoadComplete.by_continent.North_America:1625|ms
+frontend.navtiming.mediaWikiLoadComplete.by_continent.South_America:3129|ms
+frontend.navtiming.mediaWikiLoadComplete.by_country.Argentina:3129|ms
+frontend.navtiming.mediaWikiLoadComplete.by_country.Canada:1625|ms
+frontend.navtiming.mediaWikiLoadComplete.by_country.France:2360|ms
+frontend.navtiming.mediaWikiLoadComplete.by_country.Italy:1697|ms
+frontend.navtiming.mediaWikiLoadComplete.by_country.United_Kingdom:1253|ms
+frontend.navtiming.mediaWikiLoadComplete.by_country.United_Kingdom:4920|ms
+frontend.navtiming.mediaWikiLoadComplete.by_country.United_States:131|ms
+frontend.navtiming.mediaWikiLoadComplete.desktop.anonymous:2360|ms
+frontend.navtiming.mediaWikiLoadComplete.desktop.anonymous:4920|ms
+frontend.navtiming.mediaWikiLoadComplete.desktop.overall:2360|ms
+frontend.navtiming.mediaWikiLoadComplete.desktop.overall:4920|ms
+frontend.navtiming.mediaWikiLoadComplete.mobile.anonymous:1253|ms
+frontend.navtiming.mediaWikiLoadComplete.mobile.anonymous:131|ms
+frontend.navtiming.mediaWikiLoadComplete.mobile.anonymous:1322|ms
+frontend.navtiming.mediaWikiLoadComplete.mobile.anonymous:1625|ms
+frontend.navtiming.mediaWikiLoadComplete.mobile.anonymous:1697|ms
+frontend.navtiming.mediaWikiLoadComplete.mobile.anonymous:3129|ms
+frontend.navtiming.mediaWikiLoadComplete.mobile.overall:1253|ms
+frontend.navtiming.mediaWikiLoadComplete.mobile.overall:131|ms
+frontend.navtiming.mediaWikiLoadComplete.mobile.overall:1322|ms
+frontend.navtiming.mediaWikiLoadComplete.mobile.overall:1625|ms
+frontend.navtiming.mediaWikiLoadComplete.mobile.overall:1697|ms
+frontend.navtiming.mediaWikiLoadComplete.mobile.overall:3129|ms
+frontend.navtiming.mediaWikiLoadComplete.overall:1253|ms
+frontend.navtiming.mediaWikiLoadComplete.overall:131|ms
+frontend.navtiming.mediaWikiLoadComplete.overall:1322|ms
+frontend.navtiming.mediaWikiLoadComplete.overall:1625|ms
+frontend.navtiming.mediaWikiLoadComplete.overall:1697|ms
+frontend.navtiming.mediaWikiLoadComplete.overall:2360|ms
+frontend.navtiming.mediaWikiLoadComplete.overall:3129|ms
+frontend.navtiming.mediaWikiLoadComplete.overall:4920|ms
+frontend.navtiming.receiving.by_browser.Chrome.60:54|ms
+frontend.navtiming.receiving.by_browser.Chrome.all:54|ms
+frontend.navtiming.receiving.by_browser.Chrome_Mobile.57:10|ms
+frontend.navtiming.receiving.by_browser.Chrome_Mobile.59:709|ms
+frontend.navtiming.receiving.by_browser.Chrome_Mobile.all:10|ms
+frontend.navtiming.receiving.by_browser.Chrome_Mobile.all:709|ms
+frontend.navtiming.receiving.by_browser.Mobile_Safari.10_0:208|ms
+frontend.navtiming.receiving.by_browser.Mobile_Safari.10_0:37|ms
+frontend.navtiming.receiving.by_browser.Mobile_Safari.all:208|ms
+frontend.navtiming.receiving.by_browser.Mobile_Safari.all:37|ms
+frontend.navtiming.receiving.by_browser.Other._:51|ms
+frontend.navtiming.receiving.by_browser.Other.all:51|ms
+frontend.navtiming.receiving.by_browser.iOS_other.8:338|ms
+frontend.navtiming.receiving.by_browser.iOS_other.all:338|ms
+frontend.navtiming.receiving.by_continent.Europe:208|ms
+frontend.navtiming.receiving.by_continent.Europe:338|ms
+frontend.navtiming.receiving.by_continent.Europe:54|ms
+frontend.navtiming.receiving.by_continent.Europe:709|ms
+frontend.navtiming.receiving.by_continent.North_America:37|ms
+frontend.navtiming.receiving.by_continent.North_America:51|ms
+frontend.navtiming.receiving.by_continent.South_America:10|ms
+frontend.navtiming.receiving.by_country.Argentina:10|ms
+frontend.navtiming.receiving.by_country.Canada:51|ms
+frontend.navtiming.receiving.by_country.France:54|ms
+frontend.navtiming.receiving.by_country.Italy:709|ms
+frontend.navtiming.receiving.by_country.United_Kingdom:208|ms
+frontend.navtiming.receiving.by_country.United_Kingdom:338|ms
+frontend.navtiming.receiving.by_country.United_States:37|ms
+frontend.navtiming.receiving.desktop.anonymous:338|ms
+frontend.navtiming.receiving.desktop.anonymous:54|ms
+frontend.navtiming.receiving.desktop.overall:338|ms
+frontend.navtiming.receiving.desktop.overall:54|ms
+frontend.navtiming.receiving.mobile.anonymous:10|ms
+frontend.navtiming.receiving.mobile.anonymous:208|ms
+frontend.navtiming.receiving.mobile.anonymous:37|ms
+frontend.navtiming.receiving.mobile.anonymous:51|ms
+frontend.navtiming.receiving.mobile.anonymous:709|ms
+frontend.navtiming.receiving.mobile.overall:10|ms
+frontend.navtiming.receiving.mobile.overall:208|ms
+frontend.navtiming.receiving.mobile.overall:37|ms
+frontend.navtiming.receiving.mobile.overall:51|ms
+frontend.navtiming.receiving.mobile.overall:709|ms
+frontend.navtiming.receiving.overall:10|ms
+frontend.navtiming.receiving.overall:208|ms
+frontend.navtiming.receiving.overall:338|ms
+frontend.navtiming.receiving.overall:37|ms
+frontend.navtiming.receiving.overall:51|ms
+frontend.navtiming.receiving.overall:54|ms
+frontend.navtiming.receiving.overall:709|ms
+frontend.navtiming.responseStart.by_browser.Chrome.60:212|ms
+frontend.navtiming.responseStart.by_browser.Chrome.all:212|ms
+frontend.navtiming.responseStart.by_browser.Chrome_Mobile.57:349|ms
+frontend.navtiming.responseStart.by_browser.Chrome_Mobile.59:280|ms
+frontend.navtiming.responseStart.by_browser.Chrome_Mobile.all:280|ms
+frontend.navtiming.responseStart.by_browser.Chrome_Mobile.all:349|ms
+frontend.navtiming.responseStart.by_browser.Mobile_Safari.10_0:124|ms
+frontend.navtiming.responseStart.by_browser.Mobile_Safari.10_0:625|ms
+frontend.navtiming.responseStart.by_browser.Mobile_Safari.all:124|ms
+frontend.navtiming.responseStart.by_browser.Mobile_Safari.all:625|ms
+frontend.navtiming.responseStart.by_browser.Other._:92|ms
+frontend.navtiming.responseStart.by_browser.Other.all:92|ms
+frontend.navtiming.responseStart.by_browser.iOS_other.8:232|ms
+frontend.navtiming.responseStart.by_browser.iOS_other.all:232|ms
+frontend.navtiming.responseStart.by_continent.Europe:212|ms
+frontend.navtiming.responseStart.by_continent.Europe:232|ms
+frontend.navtiming.responseStart.by_continent.Europe:280|ms
+frontend.navtiming.responseStart.by_continent.Europe:625|ms
+frontend.navtiming.responseStart.by_continent.North_America:124|ms
+frontend.navtiming.responseStart.by_continent.North_America:92|ms
+frontend.navtiming.responseStart.by_continent.South_America:349|ms
+frontend.navtiming.responseStart.by_country.Argentina:349|ms
+frontend.navtiming.responseStart.by_country.Canada:92|ms
+frontend.navtiming.responseStart.by_country.France:212|ms
+frontend.navtiming.responseStart.by_country.Italy:280|ms
+frontend.navtiming.responseStart.by_country.United_Kingdom:232|ms
+frontend.navtiming.responseStart.by_country.United_Kingdom:625|ms
+frontend.navtiming.responseStart.by_country.United_States:124|ms
+frontend.navtiming.responseStart.desktop.anonymous:212|ms
+frontend.navtiming.responseStart.desktop.anonymous:232|ms
+frontend.navtiming.responseStart.desktop.overall:212|ms
+frontend.navtiming.responseStart.desktop.overall:232|ms
+frontend.navtiming.responseStart.mobile.anonymous:124|ms
+frontend.navtiming.responseStart.mobile.anonymous:280|ms
+frontend.navtiming.responseStart.mobile.anonymous:349|ms
+frontend.navtiming.responseStart.mobile.anonymous:625|ms
+frontend.navtiming.responseStart.mobile.anonymous:92|ms
+frontend.navtiming.responseStart.mobile.overall:124|ms
+frontend.navtiming.responseStart.mobile.overall:280|ms
+frontend.navtiming.responseStart.mobile.overall:349|ms
+frontend.navtiming.responseStart.mobile.overall:625|ms
+frontend.navtiming.responseStart.mobile.overall:92|ms
+frontend.navtiming.responseStart.overall:124|ms
+frontend.navtiming.responseStart.overall:212|ms
+frontend.navtiming.responseStart.overall:232|ms
+frontend.navtiming.responseStart.overall:280|ms
+frontend.navtiming.responseStart.overall:349|ms
+frontend.navtiming.responseStart.overall:625|ms
+frontend.navtiming.responseStart.overall:92|ms
+frontend.navtiming.sslNegotiation.by_browser.Chrome.30:585|ms
+frontend.navtiming.sslNegotiation.by_browser.Chrome.all:585|ms
+frontend.navtiming.sslNegotiation.by_browser.Chrome_Mobile.49:110|ms
+frontend.navtiming.sslNegotiation.by_browser.Chrome_Mobile.59:1285|ms
+frontend.navtiming.sslNegotiation.by_browser.Chrome_Mobile.59:91|ms
+frontend.navtiming.sslNegotiation.by_browser.Chrome_Mobile.all:110|ms
+frontend.navtiming.sslNegotiation.by_browser.Chrome_Mobile.all:1285|ms
+frontend.navtiming.sslNegotiation.by_browser.Chrome_Mobile.all:91|ms
+frontend.navtiming.sslNegotiation.by_browser.Mobile_Safari.10_0:116|ms
+frontend.navtiming.sslNegotiation.by_browser.Mobile_Safari.all:116|ms
+frontend.navtiming.sslNegotiation.by_continent.Europe:110|ms
+frontend.navtiming.sslNegotiation.by_continent.Europe:116|ms
+frontend.navtiming.sslNegotiation.by_continent.Europe:1285|ms
+frontend.navtiming.sslNegotiation.by_continent.Europe:91|ms
+frontend.navtiming.sslNegotiation.by_country.France:110|ms
+frontend.navtiming.sslNegotiation.by_country.France:116|ms
+frontend.navtiming.sslNegotiation.by_country.Germany:1285|ms
+frontend.navtiming.sslNegotiation.by_country.Italy:91|ms
+frontend.navtiming.sslNegotiation.mobile.anonymous:110|ms
+frontend.navtiming.sslNegotiation.mobile.anonymous:116|ms
+frontend.navtiming.sslNegotiation.mobile.anonymous:1285|ms
+frontend.navtiming.sslNegotiation.mobile.anonymous:585|ms
+frontend.navtiming.sslNegotiation.mobile.anonymous:91|ms
+frontend.navtiming.sslNegotiation.mobile.overall:110|ms
+frontend.navtiming.sslNegotiation.mobile.overall:116|ms
+frontend.navtiming.sslNegotiation.mobile.overall:1285|ms
+frontend.navtiming.sslNegotiation.mobile.overall:585|ms
+frontend.navtiming.sslNegotiation.mobile.overall:91|ms
+frontend.navtiming.sslNegotiation.overall:110|ms
+frontend.navtiming.sslNegotiation.overall:116|ms
+frontend.navtiming.sslNegotiation.overall:1285|ms
+frontend.navtiming.sslNegotiation.overall:585|ms
+frontend.navtiming.sslNegotiation.overall:91|ms
+frontend.navtiming.waiting.by_browser.Chrome.60:196|ms
+frontend.navtiming.waiting.by_browser.Chrome.all:196|ms
+frontend.navtiming.waiting.by_browser.Chrome_Mobile.57:206|ms
+frontend.navtiming.waiting.by_browser.Chrome_Mobile.59:102|ms
+frontend.navtiming.waiting.by_browser.Chrome_Mobile.all:102|ms
+frontend.navtiming.waiting.by_browser.Chrome_Mobile.all:206|ms
+frontend.navtiming.waiting.by_browser.Mobile_Safari.10_0:624|ms
+frontend.navtiming.waiting.by_browser.Mobile_Safari.all:624|ms
+frontend.navtiming.waiting.by_browser.Other._:71|ms
+frontend.navtiming.waiting.by_browser.Other.all:71|ms
+frontend.navtiming.waiting.by_browser.iOS_other.8:231|ms
+frontend.navtiming.waiting.by_browser.iOS_other.all:231|ms
+frontend.navtiming.waiting.by_continent.Europe:102|ms
+frontend.navtiming.waiting.by_continent.Europe:196|ms
+frontend.navtiming.waiting.by_continent.Europe:231|ms
+frontend.navtiming.waiting.by_continent.Europe:624|ms
+frontend.navtiming.waiting.by_continent.North_America:71|ms
+frontend.navtiming.waiting.by_continent.South_America:206|ms
+frontend.navtiming.waiting.by_country.Argentina:206|ms
+frontend.navtiming.waiting.by_country.Canada:71|ms
+frontend.navtiming.waiting.by_country.France:196|ms
+frontend.navtiming.waiting.by_country.Italy:102|ms
+frontend.navtiming.waiting.by_country.United_Kingdom:231|ms
+frontend.navtiming.waiting.by_country.United_Kingdom:624|ms
+frontend.navtiming.waiting.desktop.anonymous:196|ms
+frontend.navtiming.waiting.desktop.anonymous:231|ms
+frontend.navtiming.waiting.desktop.overall:196|ms
+frontend.navtiming.waiting.desktop.overall:231|ms
+frontend.navtiming.waiting.mobile.anonymous:102|ms
+frontend.navtiming.waiting.mobile.anonymous:206|ms
+frontend.navtiming.waiting.mobile.anonymous:624|ms
+frontend.navtiming.waiting.mobile.anonymous:71|ms
+frontend.navtiming.waiting.mobile.overall:102|ms
+frontend.navtiming.waiting.mobile.overall:206|ms
+frontend.navtiming.waiting.mobile.overall:624|ms
+frontend.navtiming.waiting.mobile.overall:71|ms
+frontend.navtiming.waiting.overall:102|ms
+frontend.navtiming.waiting.overall:196|ms
+frontend.navtiming.waiting.overall:206|ms
+frontend.navtiming.waiting.overall:231|ms
+frontend.navtiming.waiting.overall:624|ms
+frontend.navtiming.waiting.overall:71|ms
+mw.performance.save:1042|ms
+mw.performance.save:1452|ms
+mw.performance.save:2193|ms
+mw.performance.save:2495|ms
+mw.performance.save:2526|ms
+mw.performance.save:2729|ms
+mw.performance.save:620|ms
+mw.performance.save:627|ms
+mw.performance.save:636|ms
+mw.performance.save_by_version.1_30_0-wmf_14:1042|ms
+mw.performance.save_by_version.1_30_0-wmf_14:1452|ms
+mw.performance.save_by_version.1_30_0-wmf_14:2193|ms
+mw.performance.save_by_version.1_30_0-wmf_14:2495|ms
+mw.performance.save_by_version.1_30_0-wmf_14:2526|ms
+mw.performance.save_by_version.1_30_0-wmf_14:2729|ms
+mw.performance.save_by_version.1_30_0-wmf_14:620|ms
+mw.performance.save_by_version.1_30_0-wmf_14:627|ms
+mw.performance.save_by_version.1_30_0-wmf_14:636|ms
diff --git a/modules/webperf/files/navtiming_fixture.yaml 
b/modules/webperf/files/navtiming_fixture.yaml
new file mode 100644
index 0000000..a291ca2
--- /dev/null
+++ b/modules/webperf/files/navtiming_fixture.yaml
@@ -0,0 +1,36 @@
+# Random sample from August 2017
+# Anonimised:
+# - event
+#    - namespaceId: 1
+#    - revId: 1
+#    - pageId: 1
+# - recvFrom: example
+# - revision: 1
+# - seqId: 1
+# - timestamp: 1
+# - uuid: example
+# - webHost: example
+# - wiki: example
+
+- {"event": {"action": "view", "connectEnd": 1154, "connectStart": 485, 
"dnsLookup": 426, "domComplete": 4545, "domInteractive": 2289, "isAnon": true, 
"isHiDPI": false, "isHttp2": false, "loadEventEnd": 4613, "loadEventStart": 
4545, "mediaWikiLoadComplete": 2091, "mediaWikiVersion": "1.30.0-wmf.14", 
"mobileMode": "stable", "namespaceId": 1, "pageId": 1, "requestStart": 1154, 
"responseEnd": 1246, "responseStart": 1237, "revId": 1, 
"secureConnectionStart": 569}, "recvFrom": "example", "revision": 1, "schema": 
"NavigationTiming", "seqId": 1, "timestamp": 1, "userAgent": "{\"os_minor\": 
\"4\", \"is_bot\": false, \"os_major\": \"4\", \"device_family\": \"XM13G\", 
\"os_family\": \"Android\", \"browser_minor\": \"0\", \"wmf_app_version\": 
\"-\", \"browser_major\": \"30\", \"browser_family\": \"Chrome\", 
\"is_mediawiki\": false}", "uuid": "example", "webHost": "example", "wiki": 
"example"}
+- {"event": {"action": "view", "connectEnd": 359, "connectStart": 223, 
"dnsLookup": 29, "domComplete": 2070, "domInteractive": 787, "firstPaint": 781, 
"isAnon": true, "isHiDPI": true, "isHttp2": true, "loadEventEnd": 2104, 
"loadEventStart": 2070, "mediaWikiLoadComplete": 1266, "mediaWikiVersion": 
"1.30.0-wmf.14", "mobileMode": "stable", "namespaceId": 1, "originCountry": 
"IT", "originRegion": "", "pageId": 1, "requestStart": 361, "responseEnd": 462, 
"responseStart": 416, "revId": 1, "secureConnectionStart": 268}, "recvFrom": 
"example", "revision": 1, "schema": "NavigationTiming", "seqId": 1, 
"timestamp": 1, "userAgent": "{\"os_minor\": \"4\", \"is_bot\": false, 
\"os_major\": \"4\", \"device_family\": \"Samsung GT-I9195I\", \"os_family\": 
\"Android\", \"browser_minor\": \"0\", \"wmf_app_version\": \"-\", 
\"browser_major\": \"59\", \"browser_family\": \"Chrome Mobile\", 
\"is_mediawiki\": false}", "uuid": "example", "webHost": "example", "wiki": 
"example"}
+- {"event": {"mediaWikiVersion": "1.30.0-wmf.14", "saveTiming": 2495}, 
"recvFrom": "example", "revision": 1, "schema": "SaveTiming", "seqId": 1, 
"timestamp": 1, "userAgent": "{\"os_minor\": null, \"is_bot\": false, 
\"os_major\": null, \"device_family\": \"Other\", \"os_family\": \"Windows 
10\", \"browser_minor\": \"0\", \"wmf_app_version\": \"-\", \"browser_major\": 
\"60\", \"browser_family\": \"Chrome\", \"is_mediawiki\": false}", "uuid": 
"example", "webHost": "example", "wiki": "example"}
+- {"event": {"mediaWikiVersion": "1.30.0-wmf.14", "saveTiming": 620}, 
"recvFrom": "example", "revision": 1, "schema": "SaveTiming", "seqId": 1, 
"timestamp": 1, "userAgent": "{\"os_minor\": null, \"is_bot\": false, 
\"os_major\": null, \"device_family\": \"Other\", \"os_family\": \"Windows 
10\", \"browser_minor\": \"0\", \"wmf_app_version\": \"-\", \"browser_major\": 
\"54\", \"browser_family\": \"Firefox\", \"is_mediawiki\": false}", "uuid": 
"example", "webHost": "example", "wiki": "example"}
+- {"event": {"action": "view", "isAnon": true, "isHiDPI": true, "isHttp2": 
false, "mediaWikiLoadComplete": 1322, "mediaWikiVersion": "1.30.0-wmf.14", 
"mobileMode": "stable", "namespaceId": 1, "originCountry": "UZ", 
"originRegion": "", "pageId": 1, "revId": 1}, "recvFrom": "example", 
"revision": 1, "schema": "NavigationTiming", "seqId": 1, "timestamp": 1, 
"userAgent": "{\"os_minor\": \"4\", \"is_bot\": false, \"os_major\": \"4\", 
\"device_family\": \"Artel Sentinel X D5\", \"os_family\": \"Android\", 
\"browser_minor\": \"0\", \"wmf_app_version\": \"-\", \"browser_major\": 
\"30\", \"browser_family\": \"Chrome Mobile\", \"is_mediawiki\": false}", 
"uuid": "example", "webHost": "example", "wiki": "example"}
+- {"event": {"mediaWikiVersion": "1.30.0-wmf.14", "saveTiming": 2526}, 
"recvFrom": "example", "revision": 1, "schema": "SaveTiming", "seqId": 1, 
"timestamp": 1, "userAgent": "{\"os_minor\": null, \"is_bot\": false, 
\"os_major\": null, \"device_family\": \"Other\", \"os_family\": \"Windows 7\", 
\"browser_minor\": \"0\", \"wmf_app_version\": \"-\", \"browser_major\": 
\"54\", \"browser_family\": \"Firefox\", \"is_mediawiki\": false}", "uuid": 
"example", "webHost": "example", "wiki": "example"}
+- {"event": {"mediaWikiVersion": "1.30.0-wmf.14", "saveTiming": 1042}, 
"recvFrom": "example", "revision": 1, "schema": "SaveTiming", "seqId": 1, 
"timestamp": 1, "userAgent": "{\"os_minor\": null, \"is_bot\": false, 
\"os_major\": null, \"device_family\": \"Other\", \"os_family\": \"Windows 
8.1\", \"browser_minor\": \"0\", \"wmf_app_version\": \"-\", \"browser_major\": 
\"11\", \"browser_family\": \"IE\", \"is_mediawiki\": false}", "uuid": 
"example", "webHost": "example", "wiki": "example"}
+- {"event": {"mediaWikiVersion": "1.30.0-wmf.14", "saveTiming": 2729}, 
"recvFrom": "example", "revision": 1, "schema": "SaveTiming", "seqId": 1, 
"timestamp": 1, "userAgent": "{\"os_minor\": null, \"is_bot\": false, 
\"os_major\": null, \"device_family\": \"Other\", \"os_family\": \"Windows 
10\", \"browser_minor\": \"0\", \"wmf_app_version\": \"-\", \"browser_major\": 
\"60\", \"browser_family\": \"Chrome\", \"is_mediawiki\": false}", "uuid": 
"example", "webHost": "example", "wiki": "example"}
+- {"event": {"action": "view", "dnsLookup": 0, "domComplete": 1471, 
"domInteractive": 476, "firstPaint": 754, "isAnon": true, "isHiDPI": false, 
"isHttp2": true, "loadEventEnd": 1499, "loadEventStart": 1472, 
"mediaWikiLoadComplete": 2360, "mediaWikiVersion": "1.30.0-wmf.14", 
"namespaceId": 1, "originCountry": "FR", "originRegion": "PDL", "pageId": 1, 
"requestStart": 16, "responseEnd": 266, "responseStart": 212, "revId": 1}, 
"recvFrom": "example", "revision": 1, "schema": "NavigationTiming", "seqId": 1, 
"timestamp": 1, "userAgent": "{\"os_minor\": null, \"is_bot\": false, 
\"os_major\": null, \"device_family\": \"Other\", \"os_family\": \"Windows 7\", 
\"browser_minor\": \"0\", \"wmf_app_version\": \"-\", \"browser_major\": 
\"60\", \"browser_family\": \"Chrome\", \"is_mediawiki\": false}", "uuid": 
"example", "webHost": "example", "wiki": "example"}
+- {"event": {"mediaWikiVersion": "1.30.0-wmf.14", "saveTiming": 2193}, 
"recvFrom": "example", "revision": 1, "schema": "SaveTiming", "seqId": 1, 
"timestamp": 1, "userAgent": "{\"os_minor\": null, \"is_bot\": false, 
\"os_major\": null, \"device_family\": \"Other\", \"os_family\": \"Windows 
10\", \"browser_minor\": \"0\", \"wmf_app_version\": \"-\", \"browser_major\": 
\"60\", \"browser_family\": \"Chrome\", \"is_mediawiki\": false}", "uuid": 
"example", "webHost": "example", "wiki": "example"}
+- {"event": {"mediaWikiVersion": "1.30.0-wmf.14", "saveTiming": 636}, 
"recvFrom": "example", "revision": 1, "schema": "SaveTiming", "seqId": 1, 
"timestamp": 1, "userAgent": "{\"os_minor\": null, \"is_bot\": false, 
\"os_major\": null, \"device_family\": \"Other\", \"os_family\": \"Windows 7\", 
\"browser_minor\": \"0\", \"wmf_app_version\": \"-\", \"browser_major\": 
\"55\", \"browser_family\": \"Firefox\", \"is_mediawiki\": false}", "uuid": 
"example", "webHost": "example", "wiki": "example"}
+- {"event": {"action": "view", "connectEnd": 546, "connectStart": 386, 
"dnsLookup": 39, "domComplete": 2186, "domInteractive": 869, "fetchStart": 1, 
"isAnon": true, "isHiDPI": true, "isHttp2": true, "loadEventEnd": 2246, 
"loadEventStart": 2186, "mediaWikiLoadComplete": 3693, "mediaWikiVersion": 
"1.30.0-wmf.14", "mobileMode": "stable", "namespaceId": 1, "originCountry": 
"FR", "originRegion": "", "pageId": 1, "requestStart": 547, "responseEnd": 715, 
"responseStart": 634, "revId": 1, "secureConnectionStart": 436}, "recvFrom": 
"example", "revision": 1, "schema": "NavigationTiming", "seqId": 1, 
"timestamp": 1, "userAgent": "{\"os_minor\": \"0\", \"is_bot\": false, 
\"os_major\": \"6\", \"device_family\": \"Asus Z00ED\", \"os_family\": 
\"Android\", \"browser_minor\": \"0\", \"wmf_app_version\": \"-\", 
\"browser_major\": \"49\", \"browser_family\": \"Chrome Mobile\", 
\"is_mediawiki\": false}", "uuid": "example", "webHost": "example", "wiki": 
"example"}
+- {"event": {"action": "view", "connectEnd": 975, "connectStart": 813, 
"dnsLookup": 34, "domComplete": 2384, "domInteractive": 1338, "fetchStart": 
777, "isAnon": true, "isHiDPI": true, "isHttp2": true, "loadEventEnd": 2400, 
"loadEventStart": 2384, "mediaWikiLoadComplete": 758, "mediaWikiVersion": 
"1.30.0-wmf.14", "mobileMode": "stable", "namespaceId": 1, "originCountry": 
"FR", "originRegion": "ARA", "pageId": 1, "requestStart": 976, "responseEnd": 
1244, "responseStart": 1030, "revId": 1, "secureConnectionStart": 859}, 
"recvFrom": "example", "revision": 1, "schema": "NavigationTiming", "seqId": 1, 
"timestamp": 1, "userAgent": "{\"os_minor\": \"3\", \"is_bot\": false, 
\"os_major\": \"10\", \"device_family\": \"iPad\", \"os_family\": \"iOS\", 
\"browser_minor\": \"0\", \"wmf_app_version\": \"-\", \"browser_major\": 
\"10\", \"browser_family\": \"Mobile Safari\", \"is_mediawiki\": false}", 
"uuid": "example", "webHost": "example", "wiki": "example"}
+- {"event": {"action": "view", "connectEnd": 2, "connectStart": 2, 
"dnsLookup": 0, "domComplete": 2880, "domInteractive": 2867, "fetchStart": 2, 
"firstPaint": 2858, "isAnon": true, "isHiDPI": true, "isHttp2": true, 
"loadEventEnd": 2880, "loadEventStart": 2880, "mediaWikiLoadComplete": 3129, 
"mediaWikiVersion": "1.30.0-wmf.14", "mobileMode": "stable", "namespaceId": 1, 
"originCountry": "AR", "originRegion": "C", "pageId": 1, "requestStart": 143, 
"responseEnd": 359, "responseStart": 349, "revId": 1}, "recvFrom": "example", 
"revision": 1, "schema": "NavigationTiming", "seqId": 1, "timestamp": 1, 
"userAgent": "{\"os_minor\": \"0\", \"is_bot\": false, \"os_major\": \"6\", 
\"device_family\": \"MotoE2(4G-LTE)\", \"os_family\": \"Android\", 
\"browser_minor\": \"0\", \"wmf_app_version\": \"-\", \"browser_major\": 
\"57\", \"browser_family\": \"Chrome Mobile\", \"is_mediawiki\": false}", 
"uuid": "example", "webHost": "example", "wiki": "example"}
+- {"event": {"action": "view", "connectEnd": 1, "connectStart": 1, 
"dnsLookup": 0, "domComplete": 455, "domInteractive": 266, "fetchStart": 1, 
"isAnon": true, "isHiDPI": true, "isHttp2": true, "loadEventEnd": 479, 
"loadEventStart": 456, "mediaWikiLoadComplete": 1625, "mediaWikiVersion": 
"1.30.0-wmf.14", "mobileMode": "stable", "namespaceId": 1, "originCountry": 
"CA", "originRegion": "AB", "pageId": 1, "requestStart": 21, "responseEnd": 
143, "responseStart": 92, "revId": 1}, "recvFrom": "example", "revision": 1, 
"schema": "NavigationTiming", "seqId": 1, "timestamp": 1, "userAgent": 
"{\"os_minor\": \"0\", \"is_bot\": false, \"os_major\": \"6\", 
\"device_family\": \"Samsung SM-G903W\", \"os_family\": \"Android\", 
\"browser_minor\": \"4\", \"wmf_app_version\": \"-\", \"browser_major\": \"5\", 
\"browser_family\": \"Samsung Internet\", \"is_mediawiki\": false}", "uuid": 
"example", "webHost": "example", "wiki": "example"}
+- {"event": {"action": "view", "connectEnd": 170, "connectStart": 170, 
"dnsLookup": 0, "domComplete": 5921, "domInteractive": 1818, "fetchStart": 170, 
"firstPaint": 424, "isAnon": true, "isHiDPI": true, "isHttp2": true, 
"loadEventEnd": 5925, "loadEventStart": 5924, "mediaWikiLoadComplete": 1697, 
"mediaWikiVersion": "1.30.0-wmf.14", "mobileMode": "stable", "namespaceId": 1, 
"originCountry": "IT", "originRegion": "25", "pageId": 1, "requestStart": 178, 
"responseEnd": 989, "responseStart": 280, "revId": 1}, "recvFrom": "example", 
"revision": 1, "schema": "NavigationTiming", "seqId": 1, "timestamp": 1, 
"userAgent": "{\"os_minor\": \"0\", \"is_bot\": false, \"os_major\": \"6\", 
\"device_family\": \"A0001\", \"os_family\": \"Android\", \"browser_minor\": 
\"0\", \"wmf_app_version\": \"-\", \"browser_major\": \"59\", 
\"browser_family\": \"Chrome Mobile\", \"is_mediawiki\": false}", "uuid": 
"example", "webHost": "example", "wiki": "example"}
+- {"event": {"action": "view", "dnsLookup": 0, "domComplete": 343, 
"domInteractive": 204, "isAnon": true, "isHiDPI": true, "isHttp2": true, 
"loadEventEnd": 350, "loadEventStart": 343, "mediaWikiLoadComplete": 131, 
"mediaWikiVersion": "1.30.0-wmf.14", "mobileMode": "stable", "namespaceId": 1, 
"originCountry": "US", "originRegion": "DE", "pageId": 1, "responseEnd": 161, 
"responseStart": 124, "revId": 1}, "recvFrom": "example", "revision": 1, 
"schema": "NavigationTiming", "seqId": 1, "timestamp": 1, "userAgent": 
"{\"os_minor\": \"2\", \"is_bot\": false, \"os_major\": \"10\", 
\"device_family\": \"iPhone\", \"os_family\": \"iOS\", \"browser_minor\": 
\"0\", \"wmf_app_version\": \"-\", \"browser_major\": \"10\", 
\"browser_family\": \"Mobile Safari\", \"is_mediawiki\": false}", "uuid": 
"example", "webHost": "example", "wiki": "example"}
+- {"event": {"dnsLookup": 0, "domComplete": 2381, "domInteractive": 1072, 
"isAnon": true, "isHiDPI": true, "isHttp2": true, "loadEventEnd": 2427, 
"loadEventStart": 2381, "mediaWikiLoadComplete": 1253, "mediaWikiVersion": 
"1.30.0-wmf.14", "mobileMode": "stable", "originCountry": "GB", "originRegion": 
"ENG", "requestStart": 1, "responseEnd": 833, "responseStart": 625}, 
"recvFrom": "example", "revision": 1, "schema": "NavigationTiming", "seqId": 1, 
"timestamp": 1, "userAgent": "{\"os_minor\": \"3\", \"is_bot\": false, 
\"os_major\": \"10\", \"device_family\": \"iPad\", \"os_family\": \"iOS\", 
\"browser_minor\": \"0\", \"wmf_app_version\": \"-\", \"browser_major\": 
\"10\", \"browser_family\": \"Mobile Safari\", \"is_mediawiki\": false}", 
"uuid": "example", "webHost": "example", "wiki": "example"}
+- {"event": {"action": "view", "connectEnd": 2029, "connectStart": 321, 
"dnsLookup": 254, "domComplete": 10023, "domInteractive": 5515, "fetchStart": 
15, "firstPaint": 5511, "isAnon": true, "isHiDPI": true, "isHttp2": true, 
"loadEventEnd": 10104, "loadEventStart": 10023, "mediaWikiLoadComplete": 4489, 
"mediaWikiVersion": "1.30.0-wmf.14", "mobileMode": "stable", "namespaceId": 1, 
"originCountry": "DE", "originRegion": "HB", "pageId": 1, "requestStart": 2032, 
"responseEnd": 4961, "responseStart": 2450, "revId": 1, 
"secureConnectionStart": 744}, "recvFrom": "example", "revision": 1, "schema": 
"NavigationTiming", "seqId": 1, "timestamp": 1, "userAgent": "{\"os_minor\": 
\"0\", \"is_bot\": false, \"os_major\": \"7\", \"device_family\": \"Samsung 
SM-G920F\", \"os_family\": \"Android\", \"browser_minor\": \"0\", 
\"wmf_app_version\": \"-\", \"browser_major\": \"59\", \"browser_family\": 
\"Chrome Mobile\", \"is_mediawiki\": false}", "uuid": "example", "webHost": 
"example", "wiki": "example"}
+- {"event": {"mediaWikiVersion": "1.30.0-wmf.14", "saveTiming": 1452}, 
"recvFrom": "example", "revision": 1, "schema": "SaveTiming", "seqId": 1, 
"timestamp": 1, "userAgent": "{\"os_minor\": null, \"is_bot\": false, 
\"os_major\": null, \"device_family\": \"Other\", \"os_family\": \"Windows 7\", 
\"browser_minor\": \"0\", \"wmf_app_version\": \"-\", \"browser_major\": 
\"47\", \"browser_family\": \"Opera\", \"is_mediawiki\": false}", "uuid": 
"example", "webHost": "example", "wiki": "example"}
+- {"event": {"action": "view", "dnsLookup": 0, "domComplete": 5513, 
"domInteractive": 715, "isAnon": true, "isHiDPI": true, "isHttp2": true, 
"loadEventEnd": 5899, "loadEventStart": 5513, "mediaWikiLoadComplete": 4920, 
"mediaWikiVersion": "1.30.0-wmf.14", "namespaceId": 1, "originCountry": "GB", 
"originRegion": "ENG", "pageId": 1, "requestStart": 1, "responseEnd": 570, 
"responseStart": 232, "revId": 1}, "recvFrom": "example", "revision": 1, 
"schema": "NavigationTiming", "seqId": 1, "timestamp": 1, "userAgent": 
"{\"os_minor\": \"3\", \"is_bot\": false, \"os_major\": \"9\", 
\"device_family\": \"iPhone\", \"os_family\": \"iOS\", \"browser_minor\": 
\"2\", \"wmf_app_version\": \"-\", \"browser_major\": \"8\", 
\"browser_family\": \"Firefox iOS\", \"is_mediawiki\": false}", "uuid": 
"example", "webHost": "example", "wiki": "example"}
+- {"event": {"mediaWikiVersion": "1.30.0-wmf.14", "saveTiming": 627}, 
"recvFrom": "example", "revision": 1, "schema": "SaveTiming", "seqId": 1, 
"timestamp": 1, "userAgent": "{\"os_minor\": null, \"is_bot\": false, 
\"os_major\": null, \"device_family\": \"Other\", \"os_family\": \"Windows 7\", 
\"browser_minor\": \"0\", \"wmf_app_version\": \"-\", \"browser_major\": 
\"60\", \"browser_family\": \"Chrome\", \"is_mediawiki\": false}", "uuid": 
"example", "webHost": "example", "wiki": "example"}

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

Gerrit-MessageType: newchange
Gerrit-Change-Id: Ic05e519c3284d5dba06c47367d38e5545a2762b9
Gerrit-PatchSet: 1
Gerrit-Project: operations/puppet
Gerrit-Branch: production
Gerrit-Owner: Krinkle <[email protected]>

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

Reply via email to