def transform_metrics()

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