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

Change subject: webperf: Update event logging consumer for userAgent schema 
change
......................................................................


webperf: Update event logging consumer for userAgent schema change

We want to keep metrics reported backwards compatible.
We modify a bit the browser_family returned by ua-parser
so browser 'buckets' remain unchanged
and thus metrics are continuous.

This code can process a raw user agent or one that
has been parsed by ua-parser.

Bug: T156760
Change-Id: I85323b69976ee1b132099a9b9e26351a968c9ca7
---
M modules/webperf/files/navtiming.py
M modules/webperf/files/navtiming_ua_data.yaml
2 files changed, 214 insertions(+), 29 deletions(-)

Approvals:
  Krinkle: Looks good to me, but someone else must approve
  Ottomata: Verified; Looks good to me, approved



diff --git a/modules/webperf/files/navtiming.py 
b/modules/webperf/files/navtiming.py
index 22169f1..57b415e 100755
--- a/modules/webperf/files/navtiming.py
+++ b/modules/webperf/files/navtiming.py
@@ -14,6 +14,7 @@
 import eventlogging
 import yaml
 
+import json
 
 handlers = {}
 
@@ -86,9 +87,16 @@
     'ZA': 'South Africa',   'AU': 'Australia',
 }
 
+# Only return the small subset of browsers we whitelisted, this to avoid 
arbitrary growth
+# in Graphite with low-sampled properties that are not useful
+# (which has lots of other negative side effects too).
+# Anything not in the whitelist should go into "Other" instead.
+
 
 def parse_ua(ua):
     """Return a tuple of browser_family and browser_major, or None.
+
+    Can parse a raw user agent or a json object alredy digested by ua-parser
 
     Inspired by https://github.com/ua-parser/uap-core
 
@@ -96,6 +104,105 @@
     - Must return a string in form "<browser_family>.<browser_major>".
     - Use the same family name as ua-parser.
     - Ensure version number match doesn't contain dots (or transform them).
+
+    """
+    # trick, if app version is there this is a digested user agent
+    m = re.search('wmf_app_version', ua)
+
+    if m is not None:
+        return parse_ua_obj(ua)
+    else:
+        return parse_ua_legacy(ua)
+
+
+def parse_ua_obj(ua):
+    """
+    Parses user agent digested by ua-parser
+    Note that only browser major is reported
+    """
+    ua_obj = json.loads(ua)
+
+    browser_family = "Other"
+    version = ua_obj['browser_major']
+
+    # Chrome for iOS
+    if ua_obj['browser_family'] == 'Chrome Mobile iOS' and ua_obj['os_family'] 
== 'iOS':
+        browser_family = 'Chrome_Mobile_iOS'
+
+    # Mobile Safari on iOS
+    elif ua_obj['browser_family'] == 'Mobile Safari' and ua_obj['os_family'] 
== 'iOS':
+        browser_family = 'Mobile_Safari'
+        version = "{0}_{1}".format(ua_obj['browser_major'], 
ua_obj['browser_minor'])
+
+    # iOS WebView
+    elif ua_obj['os_family'] == 'iOS' and ua_obj['browser_family'] == 'Mobile 
Safari UIWebView':
+        browser_family = 'iOS_WebView'
+
+    # Opera >=14 for Android (WebKit-based)
+    elif ua_obj['browser_family'] == 'Opera Mobile' and ua_obj['os_family'] == 
'Android':
+        browser_family = 'Opera_Mobile'
+
+    # Android browser (pre Android 4.4)
+    elif ua_obj['browser_family'] == 'Android' and ua_obj['os_family'] == 
'Android':
+        browser_family = 'Android'
+
+    # Chrome for Android
+    elif ua_obj['browser_family'] == 'Chrome Mobile' and ua_obj['os_family'] 
== 'Android':
+        browser_family = 'Chrome_Mobile'
+
+    # Opera >= 15 (Desktop)
+    # todo assuming all operas not iOS or Android are desktop
+    elif (ua_obj['browser_family'] == 'Opera' and int(ua_obj['browser_major']) 
>= 15
+            and ua_obj['os_family'] != 'Android' and ua_obj['os_family'] != 
'iOS'):
+        browser_family = 'Opera'
+
+    # Internet Explorer 11
+    elif ua_obj['browser_family'] == 'IE' and ua_obj['browser_major'] == '11':
+        browser_family = 'MSIE'
+
+    # Internet Explorer <= 10
+    elif ua_obj['browser_family'] == 'IE' and int(ua_obj['browser_major']) < 
11:
+        browser_family = 'MSIE'
+
+    # Firefox for Android
+    elif ua_obj['browser_family'] == 'Firefox Mobile' and ua_obj['os_family'] 
== 'Android':
+        browser_family = 'Firefox_Mobile'
+
+    # Firefox (Desktop)
+    elif ua_obj['browser_family'] == 'Firefox':
+        browser_family = 'Firefox'
+
+    # Microsoft Edge (but note, not 'Edge Mobile')
+    elif ua_obj['browser_family'] == 'Edge':
+        browser_family = 'Edge'
+
+    # Chrome/Chromium
+    elif ua_obj['browser_family'] == 'Chrome' or ua_obj['browser_family'] == 
'Chromium':
+        browser_family = ua_obj['browser_family']
+
+    # Safari (Desktop)
+    elif ua_obj['browser_family'] == 'Safari' and ua_obj['os_family'] != 'iOS':
+        browser_family = 'Safari'
+
+    # Misc iOS
+    elif ua_obj['os_family'] == 'iOS':
+        browser_family = 'iOS_other'
+
+    # Opera (Desktop)
+    elif ua_obj['browser_family'] == 'Opera':
+        browser_family = 'Opera'
+
+    # 'Other' should report no version
+    else:
+        browser_family == 'Other'
+        version = '_'
+
+    return (browser_family, version)
+
+
+def parse_ua_legacy(ua):
+    """
+    Parses raw user agent
     """
 
     # Chrome for iOS
@@ -182,6 +289,8 @@
     m = re.match('Opera/(\d+)', ua)
     if m is not None:
         return ('Opera', m.group(1))
+
+    return ('Other', '_')
 
 
 def dispatch_stat(*args):
@@ -317,10 +426,7 @@
         with open('navtiming_ua_data.yaml') as f:
             data = yaml.safe_load(f)
             for case in data:
-                if case == 'Other._':
-                    expect = None
-                else:
-                    expect = tuple(case.split('.'))
+                expect = tuple(case.split('.'))
                 uas = data.get(case)
                 for ua in uas:
                     self.assertEqual(
diff --git a/modules/webperf/files/navtiming_ua_data.yaml 
b/modules/webperf/files/navtiming_ua_data.yaml
index 5710225..2c9a9ba 100644
--- a/modules/webperf/files/navtiming_ua_data.yaml
+++ b/modules/webperf/files/navtiming_ua_data.yaml
@@ -1,59 +1,138 @@
+# https://developer.chrome.com/multidevice/user-agent#webview_user_agent
+
 Android.4:
-  # https://developer.chrome.com/multidevice/user-agent#webview_user_agent
-  - 'Mozilla/5.0 (Linux; U; Android 4.1.1; en-gb; Build/KLP) 
AppleWebKit/534.30 (KHTML, like Gecko) Version/4.0 Safari/534.30'
-  - 'Mozilla/5.0 (Linux; Android 4.4; Nexus 5 Build/_BuildID_) 
AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Chrome/30.0.0.0 Mobile 
Safari/537.36'
+    - 'Mozilla/5.0 (Linux; U; Android 4.1.1; en-gb; Build/KLP) 
AppleWebKit/534.30 (KHTML, like Gecko) Version/4.0 Safari/534.30'
+    - '{"os_minor": "1", "os_major": "4", "device_family": "Generic 
Smartphone", "os_family": "Android", "browser_minor": "1", "wmf_app_version": 
"-", "browser_major": "4", "browser_family": "Android"}'
+    # ua_parser: Chrome_Mobile.30
+    - 'Mozilla/5.0 (Linux; Android 4.4; Nexus 5 Build/_BuildID_) 
AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Chrome/30.0.0.0 Mobile 
Safari/537.36'
+
 Android.5:
-  - 'Mozilla/5.0 (Linux; Android 5.1.1; Nexus 5 Build/LMY48B; wv) 
AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Chrome/43.0.2357.65 Mobile 
Safari/537.36'
+    # ua_parser: Chrome_Mobile.43a
+    - 'Mozilla/5.0 (Linux; Android 5.1.1; Nexus 5 Build/LMY48B; wv) 
AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Chrome/43.0.2357.65 Mobile 
Safari/537.36'
+
+Android.7:
+    - '{"browser_major":"7","os_family":"Android","os_major":"7", 
"browser_minor": "0", 
"device_family":"VS995","browser_family":"Android","os_minor":"0","wmf_app_version":"-"}'
 
 Chromium.10:
-  - 'Mozilla/5.0 (X11; U; Linux i686; en-US) AppleWebKit/534.16 (KHTML, like 
Gecko) Ubuntu/10.10 Chromium/10.0.648.133 Chrome/10.0.648.133 Safari/534.16'
+    - 'Mozilla/5.0 (X11; U; Linux i686; en-US) AppleWebKit/534.16 (KHTML, like 
Gecko) Ubuntu/10.10 Chromium/10.0.648.133 Chrome/10.0.648.133 Safari/534.16'
+    - '{"os_minor": "10", "os_major": "10", "device_family": "Other", 
"os_family": "Ubuntu", "browser_minor": "0", "wmf_app_version": "-", 
"browser_major": "10", "browser_family": "Chromium"}'
+
+Chrome.9:
+    - '{"browser_major":"9","os_family":"Windows 
XP","os_major":"-","device_family":"Other","browser_family":"Chrome","browser_minor":
 "0", "os_minor":"-","wmf_app_version":"-"}'
+
 Chrome.50:
-  - 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_10_5) AppleWebKit/537.36 
(KHTML, like Gecko) Chrome/50.0.2652.0 Safari/537.36'
+    - 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_10_5) AppleWebKit/537.36 
(KHTML, like Gecko) Chrome/50.0.2652.0 Safari/537.36'
+    - '{"os_minor": "10", "os_major": "10", "device_family": "Other", 
"os_family": "Mac OS X", "browser_minor": "0", "wmf_app_version": "-", 
"browser_major": "50", "browser_family": "Chrome"}'
+
 Chrome_Mobile.35:
-  - 'Mozilla/5.0 (Linux; Android 4.4.2; Nexus 5 Build/KOT49H) 
AppleWebKit/537.36 (KHTML, like Gecko) Chrome/35.0.1916.122 Mobile 
Safari/537.36'
+    - 'Mozilla/5.0 (Linux; Android 4.4.2; Nexus 5 Build/KOT49H) 
AppleWebKit/537.36 (KHTML, like Gecko) Chrome/35.0.1916.122 Mobile 
Safari/537.36'
+    - '{"os_minor": "4", "os_major": "4", "device_family": "Nexus 5", 
"os_family": "Android", "browser_minor": "0", "wmf_app_version": "-", 
"browser_major": "35", "browser_family": "Chrome Mobile"}'
+
+Chrome_Mobile.52:
+    - 
'{"browser_major":"52","os_family":"Android","os_major":"4","browser_minor": 
"0", "device_family":"Ultra Wave","browser_family":"Chrome 
Mobile","os_minor":"4","wmf_app_version":"-"}'
+
 Chrome_Mobile_iOS.19:
-  - 'Mozilla/5.0 (iPhone; U; CPU iPhone OS 5_1_1 like Mac OS X; en-gb) 
AppleWebKit/534.46.0 (KHTML, like Gecko) CriOS/19.0.1084.60 Mobile/9B206 
Safari/7534.48.3'
+    - 'Mozilla/5.0 (iPhone; U; CPU iPhone OS 5_1_1 like Mac OS X; en-gb) 
AppleWebKit/534.46.0 (KHTML, like Gecko) CriOS/19.0.1084.60 Mobile/9B206 
Safari/7534.48.3'
+    - '{"os_minor": "1", "os_major": "5", "device_family": "iPhone", 
"os_family": "iOS", "browser_minor": "0", "wmf_app_version": "-", 
"browser_major": "19", "browser_family": "Chrome Mobile iOS"}'
+
+Chrome_Mobile_iOS.56:
+    - 
'{"browser_major":"56","os_family":"iOS","os_major":"10","device_family":"iPad","browser_minor":
 "0", "browser_family":"Chrome Mobile 
iOS","os_minor":"2","wmf_app_version":"-"}'
+
+Firefox.9:
+    - '{"browser_major":"9","os_family":"Windows 
Vista","os_major":"-","device_family":"Other","browser_minor": "0", 
"browser_family":"Firefox","os_minor":"-","wmf_app_version":"-"}'
 
 Firefox.43:
-  - 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10.10; rv:43.0) Gecko/20100101 
Firefox/43.0'
+    - 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10.10; rv:43.0) Gecko/20100101 
Firefox/43.0'
+    - '{"os_minor": "10", "os_major": "10", "device_family": "Other", 
"os_family": "Mac OS X", "browser_minor": "0", "wmf_app_version": "-", 
"browser_major": "43", "browser_family": "Firefox"}'
+
+Firefox_Mobile.53:
+    - 
'{"browser_major":"53","os_family":"Android","os_major":"7","device_family":"Generic
 Smartphone","browser_minor": "0", "browser_family":"Firefox 
Mobile","os_minor":"1","wmf_app_version":"-"}'
+
 Firefox_Mobile.41:
-  - 'Mozilla/5.0 (Android 5.0; Tablet; rv:41.0) Gecko/41.0 Firefox/41.0'
+    - 'Mozilla/5.0 (Android 5.0; Tablet; rv:41.0) Gecko/41.0 Firefox/41.0'
+    - '{"os_minor": "0", "os_major": "5", "device_family": "Generic Tablet", 
"os_family": "Android", "browser_minor": "0", "wmf_app_version": "-", 
"browser_major": "41", "browser_family": "Firefox Mobile"}'
 
 Opera.9:
-  - 'Opera/9.50 (Nintendo DSi; Opera/507; U; en-US)'
+    - 'Opera/9.50 (Nintendo DSi; Opera/507; U; en-US)'
+    - '{"os_minor": null, "os_major": null, "device_family": "Nintendo DSi", 
"os_family": "Other", "wmf_app_version": "-","browser_minor": "0",  
"browser_major": "9", "browser_family": "Opera"}'
+    - '{"browser_major":"9","os_family":"Windows 
XP","os_major":"-","device_family":"HTC 
P3700","browser_family":"Opera","browser_minor": "0", 
"os_minor":"-","wmf_app_version":"-"}'
+
 Opera.10:
-  - 'Opera/9.80 (Windows NT 5.1; U; ru) Presto/2.5.24 Version/10.53'
+    - 'Opera/9.80 (Windows NT 5.1; U; ru) Presto/2.5.24 Version/10.53'
+    - '{"os_minor": null, "os_major": null, "device_family": "Other", 
"os_family": "Windows XP", "browser_minor": "53", "wmf_app_version": "-", 
"browser_major": "10", "browser_family": "Opera"}'
+
+Opera.16:
+    - 
'{"browser_major":"16","os_family":"Android","os_major":"4","device_family":"CAT-01","browser_minor":
 "0", "browser_family":"Opera","os_minor":"2","wmf_app_version":"-"}'
+
 Opera.33:
-  - 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_10_5) AppleWebKit/537.36 
(KHTML, like Gecko) Chrome/46.0.2490.86 Safari/537.36 OPR/33.0.1990.115'
+    - 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_10_5) AppleWebKit/537.36 
(KHTML, like Gecko) Chrome/46.0.2490.86 Safari/537.36 OPR/33.0.1990.115'
+    - '{"os_minor": "10", "os_major": "10", "device_family": "Other", 
"os_family": "Mac OS X", "browser_minor": "0", "wmf_app_version": "-", 
"browser_major": "33", "browser_family": "Opera"}'
 
 Opera_Mobile.14:
   - 'Mozilla/5.0 (Linux; Android; 4.1.2; GT) AppleWebKit/537.22 (KHTML, like 
Gecko) Chrome/25.0.1234.12 Mobile Safari/537.22 OPR/14.0.123.123'
+  - '{"os_minor": null, "os_major": null, "device_family": "Generic 
Smartphone", "os_family": "Android","browser_minor": "0",  "wmf_app_version": 
"-", "browser_major": "14", "browser_family": "Opera Mobile"}'
+  - 
'{"browser_major":"14","os_family":"Android","os_major":"6","device_family":"Moto
 G (4)","browser_minor": "0", "browser_family":"Opera 
Mobile","os_minor":"0","wmf_app_version":"-"}'
+
+Opera_Mobile.18:
+    - 
'{"browser_major":"18","os_family":"Android","os_major":"4","device_family":"2014811","browser_family":"Opera
 Mobile","os_minor":"4","wmf_app_version":"-"}'
 
 Edge.12:
-  - 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like 
Gecko) Chrome/42.0.2311.135 Safari/537.36 Edge/12.9600'
+    - 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, 
like Gecko) Chrome/42.0.2311.135 Safari/537.36 Edge/12.9600'
+    - '{"os_minor": null, "os_major": null, "device_family": "Other", 
"os_family": "Windows 10", "browser_minor": "9600", "wmf_app_version": "-", 
"browser_major": "12", "browser_family": "Edge"}'
+
+Edge.15:
+    - '{"browser_major":"15","os_family":"Windows 
10","os_major":"-","device_family":"Lumia 535","browser_minor": "0", 
"browser_family":"Edge","os_minor":"-","wmf_app_version":"-"}'
 
 MSIE.11:
-  - 'Mozilla/5.0 (Windows NT 6.3; Win64; x64; Trident/7.0; rv:11.0) like Gecko'
+    - 'Mozilla/5.0 (Windows NT 6.3; Win64; x64; Trident/7.0; rv:11.0) like 
Gecko'
+    - '{"browser_major":"11","os_family":"Windows 
Vista","os_major":"-","device_family":"Other","browser_minor": "0", 
"browser_family":"IE","os_minor":"-","wmf_app_version":"-"}'
+
 MSIE.10:
-  - 'Mozilla/5.0 (compatible; MSIE 10.0; Windows NT 6.2; ARM; Trident/6.0)'
+    - 'Mozilla/5.0 (compatible; MSIE 10.0; Windows NT 6.2; ARM; Trident/6.0)'
+    - '{"os_minor": null, "os_major": null, "device_family": "Other", 
"os_family": "Windows RT", "browser_minor": "0", "wmf_app_version": "-", 
"browser_major": "10", "browser_family": "IE"}'
+
 MSIE.8:
-  - 'Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 5.1; Trident/4.0; GTB6; 
.NET CLR 2.0.50727; .NET CLR 1.1.4322)'
+    - 'Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 5.1; Trident/4.0; GTB6; 
.NET CLR 2.0.50727; .NET CLR 1.1.4322)'
+    - '{"os_minor": null, "os_major": null, "device_family": "Other", 
"os_family": "Windows XP","browser_minor": "0",  "wmf_app_version": "-", 
"browser_major": "8", "browser_family": "IE"}'
+    - '{"browser_major":"8","os_family":"Windows 
10","os_major":"-","device_family":"Other","browser_minor": "0", 
"browser_family":"IE","os_minor":"-","wmf_app_version":"-"}'
+
+Safari.7:
+    - '{"browser_major":"7","os_family":"Mac OS 
X","os_major":"-","device_family":"Other","browser_minor": "0", 
"browser_family":"Safari","os_minor":"-","wmf_app_version":"-"}'
 
 Safari.9:
-  - 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_10_5) AppleWebKit/601.4.4 
(KHTML, like Gecko) Version/9.0.3 Safari/601.4.4'
+    - 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_10_5) AppleWebKit/601.4.4 
(KHTML, like Gecko) Version/9.0.3 Safari/601.4.4'
+    - '{"os_minor": "10", "os_major": "10", "device_family": "Other", 
"os_family": "Mac OS X", "browser_minor": "0", "wmf_app_version": "-", 
"browser_major": "9", "browser_family": "Safari"}'
 
 Mobile_Safari.4_0:
-  - 'Mozilla/5.0 (iPad; U; CPU OS 3_2 like Mac OS X; en-us) 
AppleWebKit/531.21.10 (KHTML, like Gecko) Version/4.0.4 Mobile/7B367 
Safari/531.21.10'
+    - 'Mozilla/5.0 (iPad; U; CPU OS 3_2 like Mac OS X; en-us) 
AppleWebKit/531.21.10 (KHTML, like Gecko) Version/4.0.4 Mobile/7B367 
Safari/531.21.10'
+    - '{"os_minor": "2", "os_major": "3", "device_family": "iPad", 
"os_family": "iOS", "browser_minor": "0", "wmf_app_version": "-", 
"browser_major": "4", "browser_family": "Mobile Safari"}'
+
 Mobile_Safari.5_0:
-  - 'Mozilla/5.0 (iPod; U; CPU iPhone OS 4_3_2 like Mac OS X; en-us) 
AppleWebKit/533.17.9 (KHTML, like Gecko) Version/5.0.2 Mobile/8H7 
Safari/6533.18.5'
-Mobile_Safari.5_0:
-  - 'Mozilla/5.0 (iPad; U; CPU OS 4_3_2 like Mac OS X; en-us) 
AppleWebKit/533.17.9 (KHTML, like Gecko) Version/5.0.2 Mobile/8H7 Safari'
+    - 'Mozilla/5.0 (iPod; U; CPU iPhone OS 4_3_2 like Mac OS X; en-us) 
AppleWebKit/533.17.9 (KHTML, like Gecko) Version/5.0.2 Mobile/8H7 
Safari/6533.18.5'
+    - '{"os_minor": "3", "os_major": "4", "device_family": "iPod", 
"os_family": "iOS", "browser_minor": "0", "wmf_app_version": "-", 
"browser_major": "5", "browser_family": "Mobile Safari"}'
+    - 'Mozilla/5.0 (iPad; U; CPU OS 4_3_2 like Mac OS X; en-us) 
AppleWebKit/533.17.9 (KHTML, like Gecko) Version/5.0.2 Mobile/8H7 Safari'
+    - '{"os_minor": "3", "os_major": "4", "device_family": "iPad", 
"os_family": "iOS", "browser_minor": "0", "wmf_app_version": "-", 
"browser_major": "5", "browser_family": "Mobile Safari"}'
+
+Mobile_Safari.9_0:
+    - 
'{"browser_major":"9","os_family":"iOS","os_major":"9","device_family":"iPod","browser_family":"Mobile
 Safari","browser_minor": "0", "os_minor":"3","wmf_app_version":"-"}'
+
+iOS_WebView.4_3:
+    # ua_parser: iOS_other.4
+    - 'Mozilla/5.0 (iPad; U; CPU OS 4_3_2 like Mac OS X; en-us) 
AppleWebKit/533.17.9 (KHTML, like Gecko) Mobile'
 
 iOS_WebView.7_1:
-  - 'Mozilla/5.0 (iPhone; CPU iPhone OS 7_1_2 like Mac OS X) 
AppleWebKit/537.51.2 (KHTML, like Gecko) Mobile/11D257'
-iOS_WebView.4_3:
-  - 'Mozilla/5.0 (iPad; U; CPU OS 4_3_2 like Mac OS X; en-us) 
AppleWebKit/533.17.9 (KHTML, like Gecko) Mobile'
+    # ua_parser: iOS_other.7
+    - 'Mozilla/5.0 (iPhone; CPU iPhone OS 7_1_2 like Mac OS X) 
AppleWebKit/537.51.2 (KHTML, like Gecko) Mobile/11D257'
+
+iOS_WebView.9:
+    - 
'{"browser_major":"9","os_family":"iOS","os_major":"9","device_family":"iPhone8,2","browser_minor":
 "0", "browser_family":"Mobile Safari 
UIWebView","os_minor":"3","wmf_app_version":"-"}'
+
+iOS_other.99:
+    - 
'{"browser_major":"99","os_family":"iOS","os_major":"9","device_family":"iPhone8,1","browser_minor":
 "0", "browser_family":"Facebook","os_minor":"2","wmf_app_version":"-"}'
 
 # Undetected, but here to catch regressions
 Other._:
   - 'Mozilla/5.0 (X11; U; Linux i686; en-US; rv:11.03.16) Gecko/20110302 
Conkeror/0.9.2 (Debian-0.9.2)'
+  - '{"browser_major":"1","browser_minor": "0", 
"os_family":"Other","os_major":"-","device_family":"Other","browser_family":"SeaMonkey","os_minor":"-","wmf_app_version":"-"}'
+  - '{"browser_major":"99","browser_minor": "0", 
"os_family":"Android","os_major":"7","device_family":"XT1650","browser_family":"Facebook","os_minor":"0","wmf_app_version":"-"}'
+  - '{"os_minor": null, "browser_minor": "0", "os_major": null, 
"device_family": "Other", "os_family": "Windows Vista", "wmf_app_version": "-", 
"browser_major": null, "browser_family": "Other"}'

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

Gerrit-MessageType: merged
Gerrit-Change-Id: I85323b69976ee1b132099a9b9e26351a968c9ca7
Gerrit-PatchSet: 23
Gerrit-Project: operations/puppet
Gerrit-Branch: production
Gerrit-Owner: Nuria <[email protected]>
Gerrit-Reviewer: Fdans <[email protected]>
Gerrit-Reviewer: Giuseppe Lavagetto <[email protected]>
Gerrit-Reviewer: Krinkle <[email protected]>
Gerrit-Reviewer: Nuria <[email protected]>
Gerrit-Reviewer: Ottomata <[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