зеркало из https://github.com/mozilla/gecko-dev.git
90 строки
3.3 KiB
Python
90 строки
3.3 KiB
Python
# 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 collections
|
|
import re
|
|
|
|
|
|
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"custom ([A-Za-z0-9_]+) (.*)$", line)
|
|
if m:
|
|
name, desc = m.groups()
|
|
yield {"type": "custom", "name": name, "desc": desc}
|
|
continue
|
|
raise ValueError(
|
|
"error parsing %s at line %d" % (conf_filename, line_num + 1)
|
|
)
|
|
|
|
return parse_counters(stream)
|
|
|
|
|
|
def generate_histograms(filename, is_for_worker=False):
|
|
# The mapping for use counters to telemetry histograms depends on the
|
|
# ordering of items in the dictionary.
|
|
|
|
# The ordering of the ending for workers depends on the WorkerType defined
|
|
# in WorkerPrivate.h.
|
|
endings = (
|
|
["DEDICATED_WORKER", "SHARED_WORKER", "SERVICE_WORKER"]
|
|
if is_for_worker
|
|
else ["DOCUMENT", "PAGE"]
|
|
)
|
|
|
|
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):
|
|
for ending in endings:
|
|
append_counter(
|
|
"USE_COUNTER2_%s_%s" % (name, ending),
|
|
"Whether a %s %s" % (ending.replace("_", " ").lower(), 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"] == "custom":
|
|
append_counters(counter["name"].upper(), counter["desc"])
|
|
|
|
return items
|