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