code: def select_metrics(self, *args, **kwargs):
          
          new_query = copy.deepcopy(self)
          new_query._filter.select_metrics(*args, **kwargs)
          return new_query
docs: Copy the query and add filtering by metric labels.
  
          Examples::
  
              query = query.select_metrics(instance_name='myinstance')
              query = query.select_metrics(instance_name_prefix='mycluster-')
  
          A keyword argument ``<label>=<value>`` ordinarily generates a filter
          expression of the form::
  
              metric.label.<label> = "<value>"
  
          However, by adding ``"_prefix"`` or ``"_suffix"`` to the keyword,
          you can specify a partial match.
  
          ``<label>_prefix=<value>`` generates::
  
              metric.label.<label> = starts_with("<value>")
  
          ``<label>_suffix=<value>`` generates::
  
              metric.label.<label> = ends_with("<value>")
  
          If the label's value type is ``INT64``, a similar notation can be
          used to express inequalities:
  
          ``<label>_less=<value>`` generates::
  
              metric.label.<label> < <value>
  
          ``<label>_lessequal=<value>`` generates::
  
              metric.label.<label> <= <value>
  
          ``<label>_greater=<value>`` generates::
  
              metric.label.<label> > <value>
  
          ``<label>_greaterequal=<value>`` generates::
  
              metric.label.<label> >= <value>
  
          :type args: tuple
          :param args: Raw filter expression strings to include in the
              conjunction. If just one is provided and no keyword arguments
              are provided, it can be a disjunction.
  
          :type kwargs: dict
          :param kwargs: Label filters to include in the conjunction as
              described above.
  
          :rtype: :class:`Query`
          :returns: The new query object.