docs: def get_metrics(self, metric_identifiers, from_date, limit=10, group_by="week", **kwargs):
          """
          Retrieves a multiple metrics as efficiently as possible.
  
          :param metric_identifiers: a list of tuples of the form `(unique_identifier, metric_name`) identifying which metrics to retrieve.
          For example [('user:1', 'people_invited',), ('user:2', 'people_invited',), ('user:1', 'comments_posted',), ('user:2', 'comments_posted',)]
          :param from_date: A python date object
          :param limit: The total number of months to retrive starting from ``from_date``
          :param group_by: The type of aggregation to perform on the metric. Choices are: ``day``, ``week`` or ``month``
          """
          results = []
          #validation of types:
          allowed_types = {
              "day": self.get_metric_by_day,
              "week": self.get_metric_by_week,
              "month": self.get_metric_by_month,
          }
          if group_by.lower() not in allowed_types:
              raise Exception("Allowed values for group_by are day, week or month.")
  
          group_by_func = allowed_types[group_by.lower()]
          #pass a connection object so we can pipeline as much as possible
          with self._analytics_backend.map() as conn:
              for unique_identifier, metric in metric_identifiers:
                  results.append(group_by_func(unique_identifier, metric, from_date, limit=limit, connection=conn))
  
          #we have to merge all the metric results afterwards because we are using a custom context processor
          return [
              self._parse_and_process_metrics(series, list_of_metrics) for
              series, list_of_metrics in results]