def METHOD_NAME(
    names: t.List[str], time_period: MetricTimePeriod
) -> t.Dict[str, CountMetricWithGraph]:
    """
    Given a time period and a set of metric names, gets the sum of the metric
    over the period and a graphable list of timestamps and values.
    The graph data always contains the start and end time stamps with None values
    to make graphing easier.
    """
    result = {}
    start_time = _start_time(time_period).replace(second=0, microsecond=0, tzinfo=None)
    end_time = datetime.now().replace(second=0, microsecond=0, tzinfo=None)
    for metric_name in names:
        stats = _get_cloudwatch_client().get_metric_statistics(
            Namespace=METRICS_NAMESPACE,
            MetricName=f"{metric_name}-count",
            Statistics=["Sum"],
            StartTime=start_time,
            EndTime=end_time,
            Period=_period(time_period),
        )["Datapoints"]
        total = int(functools.reduce(lambda acc, s: acc + s["Sum"], stats, 0))
        graph_data: t.List[t.Tuple[datetime, t.Optional[int]]] = [
            # Removing tzinfo because you can't work with timezone aware
            # datetime objects and timezone unaware timedelta objects. Either
            # way, eventually, these get decomposed to an epoch value, so this
            # will not hurt.
            # `_pad_with_None_values` expects timezone unaware objects.
            (s["Timestamp"].replace(tzinfo=None), int(s["Sum"]))
            for s in stats
        ]
        graph_data.sort(key=lambda t: t[0])  # Sort by timestamp
        graph_data = _pad_with_None_values(graph_data, start_time, end_time)
        result[metric_name] = CountMetricWithGraph(total, graph_data)
    return result