Get a list of all series matching the given criteria.

        **Note:** for the key argument, the filter will return the *union* of
        those values.  For the tag and attr arguments, the filter will return
        the *intersection* of those values.

        :param keys: filter by one or more series keys
        :type keys: list or string
        :param tags: filter by one or more tags
        :type tags: list or string
        :param dict attrs: filter by one or more key-value attributes
        :rtype: :class:`tempodb.protocol.cursor.SeriesCursor` with an
                iterator over :class:`tempodb.protocol.objects.Series`
                objects

def list_series(self, keys=None, tags=None, attrs=None,
                    limit=1000):
        """Get a list of all series matching the given criteria.

        **Note:** for the key argument, the filter will return the *union* of
        those values.  For the tag and attr arguments, the filter will return
        the *intersection* of those values.

        :param keys: filter by one or more series keys
        :type keys: list or string
        :param tags: filter by one or more tags
        :type tags: list or string
        :param dict attrs: filter by one or more key-value attributes
        :rtype: :class:`tempodb.protocol.cursor.SeriesCursor` with an
                iterator over :class:`tempodb.protocol.objects.Series`
                objects"""

        params = {
            'key': keys,
            'tag': tags,
            'attr': attrs,
            'limit': limit
        }
        url_args = endpoint.make_url_args(params)
        url = '?'.join([endpoint.SERIES_ENDPOINT, url_args])
        resp = self.session.get(url)
        return resp