forked from mirrors/gecko-dev
Bug 1896732 - Introducing mach gifft to generate Glean metric definitions for named Legacy probes r=TravisLong
Currently only supports events. Differential Revision: https://phabricator.services.mozilla.com/D210690
This commit is contained in:
parent
d9ab1cd36a
commit
96db3322cd
2 changed files with 172 additions and 0 deletions
|
|
@ -113,6 +113,9 @@ MACH_COMMANDS = {
|
||||||
"generate-test-certs": MachCommandReference(
|
"generate-test-certs": MachCommandReference(
|
||||||
"security/manager/tools/mach_commands.py"
|
"security/manager/tools/mach_commands.py"
|
||||||
),
|
),
|
||||||
|
"gifft": MachCommandReference(
|
||||||
|
"toolkit/components/telemetry/build_scripts/mach_commands.py"
|
||||||
|
),
|
||||||
"gradle": MachCommandReference("mobile/android/mach_commands.py"),
|
"gradle": MachCommandReference("mobile/android/mach_commands.py"),
|
||||||
"gradle-install": MachCommandReference("mobile/android/mach_commands.py"),
|
"gradle-install": MachCommandReference("mobile/android/mach_commands.py"),
|
||||||
"gtest": MachCommandReference(
|
"gtest": MachCommandReference(
|
||||||
|
|
|
||||||
169
toolkit/components/telemetry/build_scripts/mach_commands.py
Normal file
169
toolkit/components/telemetry/build_scripts/mach_commands.py
Normal file
|
|
@ -0,0 +1,169 @@
|
||||||
|
# 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/.
|
||||||
|
|
||||||
|
from mach.decorators import Command, CommandArgument
|
||||||
|
|
||||||
|
TODO_FILL_DESCRIPTION = "TODO: Fill in this description. You _can_ use **markdown**."
|
||||||
|
GENERATED_BY_DESCRIPTION = (
|
||||||
|
"This event was generated to correspond to the Legacy Telemetry event {}."
|
||||||
|
)
|
||||||
|
DESCRIPTION_INDENT = " "
|
||||||
|
LIST_INDENT = " - "
|
||||||
|
BUG_URL_TEMPLATE = "https://bugzil.la/{}"
|
||||||
|
|
||||||
|
GLEAN_EVENT_TEMPLATE = """
|
||||||
|
{category}:
|
||||||
|
{name}:
|
||||||
|
type: event
|
||||||
|
description: >
|
||||||
|
{multiline_description}
|
||||||
|
bugs: {bugs_alias}{bugs_list}
|
||||||
|
data_reviews: {data_alias}{bugs_list}
|
||||||
|
notification_emails:
|
||||||
|
{emails_list}
|
||||||
|
expires: {expiry}
|
||||||
|
extra_keys: {extra_alias}{extra_keys}
|
||||||
|
telemetry_mirror: {legacy_enum}
|
||||||
|
""".strip(
|
||||||
|
"\n"
|
||||||
|
)
|
||||||
|
|
||||||
|
EXTRA_KEY_DESCRIPTION_INDENT = DESCRIPTION_INDENT + " "
|
||||||
|
VALUE_EXTRA_DESCRIPTION = "The `value` of the event. Mirrors to the Legacy Telemetry event's `value` parameter."
|
||||||
|
EXTRA_KEY_TEMPLATE = """
|
||||||
|
{name}:
|
||||||
|
description: >
|
||||||
|
{description}
|
||||||
|
type: string
|
||||||
|
""".strip(
|
||||||
|
"\n"
|
||||||
|
)
|
||||||
|
|
||||||
|
|
||||||
|
@Command(
|
||||||
|
"gifft",
|
||||||
|
category="misc",
|
||||||
|
description="Generate a Glean metric definition for a given Legacy Telemetry probe. Only supports Events.",
|
||||||
|
)
|
||||||
|
@CommandArgument(
|
||||||
|
"telemetry_probe_name", help="Telemetry probe name (e.g. readermode.view)"
|
||||||
|
)
|
||||||
|
def mach_gifft(command_context, telemetry_probe_name):
|
||||||
|
from os import path
|
||||||
|
|
||||||
|
telemetrydir = path.join(
|
||||||
|
command_context.topsrcdir, "toolkit", "components", "telemetry"
|
||||||
|
)
|
||||||
|
|
||||||
|
import itertools
|
||||||
|
import sys
|
||||||
|
|
||||||
|
sys.path.append(path.join(telemetrydir, "build_scripts"))
|
||||||
|
import textwrap
|
||||||
|
|
||||||
|
from mozparsers import parse_events
|
||||||
|
|
||||||
|
events = parse_events.load_events(path.join(telemetrydir, "Events.yaml"), True)
|
||||||
|
for e in events:
|
||||||
|
if e.category + "." + e.name == telemetry_probe_name:
|
||||||
|
# There are four levels of identification in Legacy Telemetry event
|
||||||
|
# definitions: category, name/family, method, and object.
|
||||||
|
# If not present, the `method` property will supply the name/family.
|
||||||
|
# GIFFT will mirror to a specific identified C++ enum, which means
|
||||||
|
# we need to generate Glean events for every combination of method
|
||||||
|
# and object.
|
||||||
|
category = e.category
|
||||||
|
bugs_alias = data_alias = extra_alias = ""
|
||||||
|
for m, o in itertools.product(e.methods, e.objects):
|
||||||
|
legacy_name = category + "." + m + "#" + o
|
||||||
|
name = m + "_" + o
|
||||||
|
description = e._definition.get("description", TODO_FILL_DESCRIPTION)
|
||||||
|
multiline_description = textwrap.fill(
|
||||||
|
description,
|
||||||
|
width=80 - len(DESCRIPTION_INDENT),
|
||||||
|
initial_indent=DESCRIPTION_INDENT,
|
||||||
|
subsequent_indent=DESCRIPTION_INDENT,
|
||||||
|
)
|
||||||
|
multiline_description += "\n"
|
||||||
|
multiline_description += textwrap.fill(
|
||||||
|
GENERATED_BY_DESCRIPTION.format(legacy_name),
|
||||||
|
width=80 - len(DESCRIPTION_INDENT),
|
||||||
|
initial_indent=DESCRIPTION_INDENT,
|
||||||
|
subsequent_indent=DESCRIPTION_INDENT,
|
||||||
|
)
|
||||||
|
|
||||||
|
if bugs_alias:
|
||||||
|
bugs_list = ""
|
||||||
|
else:
|
||||||
|
bugs_alias = f"{category}_{m}_bugs"
|
||||||
|
data_alias = f"{category}_{m}_data_reviews"
|
||||||
|
bugs_list = "\n" + textwrap.indent(
|
||||||
|
"\n".join(
|
||||||
|
map(
|
||||||
|
lambda b: BUG_URL_TEMPLATE.format(b),
|
||||||
|
e._definition.get("bug_numbers", []),
|
||||||
|
)
|
||||||
|
),
|
||||||
|
LIST_INDENT,
|
||||||
|
)
|
||||||
|
emails_list = textwrap.indent(
|
||||||
|
"\n".join(e._definition.get("notification_emails", [])), LIST_INDENT
|
||||||
|
)
|
||||||
|
|
||||||
|
# expiry_version is a string like `"123.0a1"` or `"never"`,
|
||||||
|
# but Glean wants a number like `123` or `never`.
|
||||||
|
expiry = e.expiry_version.strip('"').split(".")[0]
|
||||||
|
|
||||||
|
if extra_alias:
|
||||||
|
extra_keys = ""
|
||||||
|
else:
|
||||||
|
extra_alias = f"{category}_{m}_extra"
|
||||||
|
multiline_extra_description = textwrap.fill(
|
||||||
|
VALUE_EXTRA_DESCRIPTION,
|
||||||
|
width=80 - len(EXTRA_KEY_DESCRIPTION_INDENT),
|
||||||
|
initial_indent=EXTRA_KEY_DESCRIPTION_INDENT,
|
||||||
|
subsequent_indent=EXTRA_KEY_DESCRIPTION_INDENT,
|
||||||
|
)
|
||||||
|
extra_keys = "\n" + EXTRA_KEY_TEMPLATE.format(
|
||||||
|
name="value", description=multiline_extra_description
|
||||||
|
)
|
||||||
|
for key_name, key_description in e._definition.get(
|
||||||
|
"extra_keys", {}
|
||||||
|
).items():
|
||||||
|
extra_keys += "\n"
|
||||||
|
extra_keys += EXTRA_KEY_TEMPLATE.format(
|
||||||
|
name=key_name,
|
||||||
|
description=textwrap.indent(
|
||||||
|
key_description, EXTRA_KEY_DESCRIPTION_INDENT
|
||||||
|
),
|
||||||
|
)
|
||||||
|
|
||||||
|
legacy_enum = (
|
||||||
|
parse_events.convert_to_cpp_identifier(category, ".") + "_"
|
||||||
|
)
|
||||||
|
legacy_enum += parse_events.convert_to_cpp_identifier(m, "_") + "_"
|
||||||
|
legacy_enum += parse_events.convert_to_cpp_identifier(o, "_")
|
||||||
|
|
||||||
|
print(
|
||||||
|
GLEAN_EVENT_TEMPLATE.format(
|
||||||
|
category=category,
|
||||||
|
name=name,
|
||||||
|
multiline_description=multiline_description,
|
||||||
|
bugs_alias=(
|
||||||
|
f"&{bugs_alias}" if bugs_list else f"*{bugs_alias}"
|
||||||
|
),
|
||||||
|
bugs_list=bugs_list,
|
||||||
|
data_alias=(
|
||||||
|
f"&{data_alias}" if bugs_list else f"*{data_alias}"
|
||||||
|
),
|
||||||
|
emails_list=emails_list,
|
||||||
|
expiry=expiry,
|
||||||
|
extra_alias=(
|
||||||
|
f"&{extra_alias}" if extra_keys else f"*{extra_alias}"
|
||||||
|
),
|
||||||
|
extra_keys=extra_keys,
|
||||||
|
legacy_enum=legacy_enum,
|
||||||
|
)
|
||||||
|
)
|
||||||
|
print() # We want a newline between event definitions.
|
||||||
Loading…
Reference in a new issue