diff options
Diffstat (limited to 'dom/base/usecounters.py')
-rw-r--r-- | dom/base/usecounters.py | 71 |
1 files changed, 71 insertions, 0 deletions
diff --git a/dom/base/usecounters.py b/dom/base/usecounters.py new file mode 100644 index 000000000..b93f02f80 --- /dev/null +++ b/dom/base/usecounters.py @@ -0,0 +1,71 @@ +# This Source Code Form is subject to the terms of the Mozilla Public +# License, v. 2.0. If a copy of the MPL was not distributed with this +# file, You can obtain one at http://mozilla.org/MPL/2.0/. + +import buildconfig +import collections +import re +import StringIO +import sys + +def read_conf(conf_filename): + # Can't read/write from a single StringIO, so make a new one for reading. + stream = open(conf_filename, 'rU') + + def parse_counters(stream): + for line_num, line in enumerate(stream): + line = line.rstrip('\n') + if not line or line.startswith('//'): + # empty line or comment + continue + m = re.match(r'method ([A-Za-z0-9]+)\.([A-Za-z0-9]+)$', line) + if m: + interface_name, method_name = m.groups() + yield { 'type': 'method', + 'interface_name': interface_name, + 'method_name': method_name } + continue + m = re.match(r'attribute ([A-Za-z0-9]+)\.([A-Za-z0-9]+)$', line) + if m: + interface_name, attribute_name = m.groups() + yield { 'type': 'attribute', + 'interface_name': interface_name, + 'attribute_name': attribute_name } + continue + m = re.match(r'property ([A-Za-z0-9]+)$', line) + if m: + property_name = m.group(1) + yield { 'type': 'property', + 'property_name': property_name } + continue + raise ValueError('error parsing %s at line %d' % (conf_filename, line_num)) + + return parse_counters(stream) + +def generate_histograms(filename): + # The mapping for use counters to telemetry histograms depends on the + # ordering of items in the dictionary. + items = collections.OrderedDict() + for counter in read_conf(filename): + def append_counter(name, desc): + items[name] = { 'expires_in_version': 'never', + 'kind' : 'boolean', + 'description': desc } + + def append_counters(name, desc): + append_counter('USE_COUNTER2_%s_DOCUMENT' % name, 'Whether a document %s' % desc) + append_counter('USE_COUNTER2_%s_PAGE' % name, 'Whether a page %s' % desc) + + if counter['type'] == 'method': + method = '%s.%s' % (counter['interface_name'], counter['method_name']) + append_counters(method.replace('.', '_').upper(), 'called %s' % method) + elif counter['type'] == 'attribute': + attr = '%s.%s' % (counter['interface_name'], counter['attribute_name']) + counter_name = attr.replace('.', '_').upper() + append_counters('%s_getter' % counter_name, 'got %s' % attr) + append_counters('%s_setter' % counter_name, 'set %s' % attr) + elif counter['type'] == 'property': + prop = counter['property_name'] + append_counters('PROPERTY_%s' % prop.replace('-', '_').upper(), "used the '%s' property" % prop) + + return items |