diff options
Diffstat (limited to 'chromium/tools/metrics/histograms/populate_enums.py')
-rw-r--r-- | chromium/tools/metrics/histograms/populate_enums.py | 72 |
1 files changed, 72 insertions, 0 deletions
diff --git a/chromium/tools/metrics/histograms/populate_enums.py b/chromium/tools/metrics/histograms/populate_enums.py new file mode 100644 index 00000000000..8be71a2e3f9 --- /dev/null +++ b/chromium/tools/metrics/histograms/populate_enums.py @@ -0,0 +1,72 @@ +# Copyright 2017 The Chromium Authors. All rights reserved. +# Use of this source code is governed by a BSD-style license that can be +# found in the LICENSE file. + +"""Functions for populating enums with ukm events.""" + +from collections import namedtuple +import os +import sys +import xml.dom.minidom + +import extract_histograms + +sys.path.append(os.path.join(os.path.dirname(__file__), '..', 'ukm')) +import codegen + + +EventDetails = namedtuple("EventDetails", "name hash is_obsolete") + + +def _GetEventDetails(event): + """Returns a simple struct containing the event details. + + Args: + event: An event. + + Returns: + A struct containing the event name, name hash, and whether the event is + obsolete. + """ + name = event.getAttribute('name') + # The value is UKM event name hash truncated to 31 bits. This is recorded in + # https://cs.chromium.org/chromium/src/components/ukm/ukm_recorder_impl.cc?rcl=728ad079d8e52ada4e321fb4f53713e4f0588072&l=114 + hash = codegen.HashName(name) & 0x7fffffff + is_obsolete = event.getElementsByTagName('obsolete') + return EventDetails(name=name, hash=hash, is_obsolete=is_obsolete) + + +def PopulateEnumWithUkmEvents(doc, enum, ukm_events): + """Populates the enum node with a list of ukm events. + + Args: + doc: The document to create the node in. + enum: The enum node needed to be populated. + ukm_events: A list of ukm event nodes. + """ + event_details = [_GetEventDetails(event) for event in ukm_events] + event_details.sort(key=lambda event: event.hash) + + for event in event_details: + node = doc.createElement('int') + node.attributes['value'] = str(event.hash) + label = event.name + # If the event is obsolete, mark it in the int's label. + if event.is_obsolete: + label += ' (Obsolete)' + node.attributes['label'] = label + enum.appendChild(node) + + +def PopulateEnumsWithUkmEvents(doc, enums, ukm_events): + """Populates enum nodes in the enums with a list of ukm events + + Args: + doc: The document to create the node in. + enums: The enums node to be iterated. + ukm_events: A list of ukm event nodes. + """ + for enum in extract_histograms.IterElementsWithTag(enums, 'enum', 1): + # We only special case 'UkmEventNameHash' currently. + if enum.getAttribute('name') == 'UkmEventNameHash': + PopulateEnumWithUkmEvents(doc, enum, ukm_events) |