private List<Service> queryServiceTraffic(MatcherSetResult parseResult, String layer, int limitNum) throws IllegalExpressionException {
        if (StringUtil.isBlank(layer)) {
            throw new IllegalExpressionException("label {layer} should not be empty.");
        }
        List<Service> result = new ArrayList<>();
        MatcherSetResult.NameMatcher matcher = parseResult.getNameMatcher();
        if (matcher != null) {
            String serviceName = matcher.getMatchString();
            if (matcher.getMatchOp() == PromQLParser.EQ) {
                Service service = metadataQuery.findService(serviceName).join();
                if (service != null) {
                    result.add(service);
                }
            } else if (matcher.getMatchOp() == PromQLParser.NEQ) {
                List<Service> services = metadataQuery.listServices(layer).join();
                services.stream().filter(s -> !s.getName().equals(serviceName)).limit(limitNum).forEach(result::add);
            } else if (matcher.getMatchOp() == PromQLParser.RM) {
                List<Service> services = metadataQuery.listServices(layer).join();
                services.stream().filter(s -> s.getName().matches(serviceName)).limit(limitNum).forEach(result::add);
            } else if (matcher.getMatchOp() == PromQLParser.NRM) {
                List<Service> services = metadataQuery.listServices(layer).join();
                services.stream().filter(s -> !s.getName().matches(serviceName)).limit(limitNum).forEach(result::add);
            }
        } else {
            List<Service> services = metadataQuery.listServices(
                parseResult.getLabelMap().get(LabelName.LAYER.getLabel())).join();
            services.stream().limit(limitNum).forEach(result::add);
        }
        return result;
    }
OAP adopt time step by start/end,
reserve step/timeout param to keep consistent with API protocol.
oap-server/server-query-plugin/promql-plugin/src/main/java/org/apache/skywalking/oap/query/promql/handler/PromQLApiHandler.java