summaryrefslogtreecommitdiff
path: root/chromium/tools/metrics/histograms/populate_enums.py
diff options
context:
space:
mode:
Diffstat (limited to 'chromium/tools/metrics/histograms/populate_enums.py')
-rw-r--r--chromium/tools/metrics/histograms/populate_enums.py72
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)