in glean_parser/translate.py [0:0]
def transform_metrics(objects):
"""
Transform the object model from one that represents the YAML definitions
to one that reflects the type specifics needed by code generators.
e.g. This will transform a `rate` to be a `numerator` if its denominator is
external.
"""
counters = {}
numerators_by_denominator: Dict[str, Any] = {}
for category_name, category_val in objects.items():
if category_name == "tags":
continue
for metric in category_val.values():
fqmn = metric.identifier()
if getattr(metric, "type", None) == "counter":
counters[fqmn] = metric
denominator_name = getattr(metric, "denominator_metric", None)
if denominator_name:
metric.type = "numerator"
numerators_by_denominator.setdefault(denominator_name, [])
numerators_by_denominator[denominator_name].append(metric)
for denominator_name, numerators in numerators_by_denominator.items():
if denominator_name not in counters:
raise ValueError(
f"No `counter` named {denominator_name} found to be used as"
"denominator for {numerators}",
)
counters[denominator_name].__class__ = metrics.Denominator
counters[denominator_name].type = "denominator"
counters[denominator_name].numerators = numerators