<SYSTEM_TASK:>
Solve the following problem using Python, implementing the functions described below, one line at a time
<END_TASK>
<USER_TASK:>
Description:
 def select_metrics(self, *args, **kwargs):
 """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. """

        new_query = copy.deepcopy(self)
        new_query._filter.select_metrics(*args, **kwargs)
        return new_query