public Set<Argument> getArguments(ServerWebExchange request, String namespace, String service) {
		RateLimitProto.RateLimit rateLimitRule = serviceRuleManager.getServiceRateLimitRule(namespace, service);
		if (rateLimitRule == null) {
			return Collections.emptySet();
		}
		List<RateLimitProto.Rule> rules = rateLimitRule.getRulesList();
		if (CollectionUtils.isEmpty(rules)) {
			return Collections.emptySet();
		}
		return rules.stream()
				.flatMap(rule -> rule.getArgumentsList().stream())
				.map(matchArgument -> {
					String matchKey = matchArgument.getKey();
					Argument argument = null;
					switch (matchArgument.getType()) {
					case CUSTOM:
						argument = StringUtils.isBlank(matchKey) ? null :
								Argument.buildCustom(matchKey, Optional.ofNullable(getCustomResolvedLabels(request).get(matchKey)).orElse(StringUtils.EMPTY));
						break;
					case METHOD:
						argument = Argument.buildMethod(request.getRequest().getMethodValue());
						break;
					case HEADER:
						argument = StringUtils.isBlank(matchKey) ? null :
								Argument.buildHeader(matchKey, Optional.ofNullable(request.getRequest().getHeaders().getFirst(matchKey)).orElse(StringUtils.EMPTY));
						break;
					case QUERY:
						argument = StringUtils.isBlank(matchKey) ? null :
								Argument.buildQuery(matchKey, Optional.ofNullable(request.getRequest().getQueryParams().getFirst(matchKey)).orElse(StringUtils.EMPTY));
						break;
					case CALLER_SERVICE:
						String sourceServiceNamespace = MetadataContextHolder.getDisposableMetadata(DEFAULT_METADATA_SOURCE_SERVICE_NAMESPACE, true).orElse(StringUtils.EMPTY);
						String sourceServiceName = MetadataContextHolder.getDisposableMetadata(DEFAULT_METADATA_SOURCE_SERVICE_NAME, true).orElse(StringUtils.EMPTY);
						if (!StringUtils.isEmpty(sourceServiceNamespace) && !StringUtils.isEmpty(sourceServiceName)) {
							argument = Argument.buildCallerService(sourceServiceNamespace, sourceServiceName);
						}
						break;
					case CALLER_IP:
						InetSocketAddress remoteAddress = request.getRequest().getRemoteAddress();
						argument = Argument.buildCallerIP(remoteAddress != null ? remoteAddress.getAddress().getHostAddress() : StringUtils.EMPTY);
						break;
					default:
						break;
					}
					return argument;
				}).filter(Objects::nonNull).collect(Collectors.toSet());
	}
@Test
	public void testGetRuleArguments() {
		// Mock request
		MetadataContext.LOCAL_SERVICE = "Test";
		// Mock request
		MockServerHttpRequest request = MockServerHttpRequest.get("http://127.0.0.1:8080/test")
				.remoteAddress(new InetSocketAddress("127.0.0.1", 8080))
				.header("xxx", "xxx")
				.queryParam("yyy", "yyy")
				.build();
		ServerWebExchange exchange = MockServerWebExchange.from(request);
		MetadataContext metadataContext = new MetadataContext();
		metadataContext.setUpstreamDisposableMetadata(new HashMap<String, String>() {{
			put(DEFAULT_METADATA_SOURCE_SERVICE_NAMESPACE, MetadataContext.LOCAL_NAMESPACE);
			put(DEFAULT_METADATA_SOURCE_SERVICE_NAME, MetadataContext.LOCAL_SERVICE);
		}});
		MetadataContextHolder.set(metadataContext);
		Set<Argument> arguments = rateLimitRuleArgumentReactiveResolver1.getArguments(exchange, MetadataContext.LOCAL_NAMESPACE, MetadataContext.LOCAL_SERVICE);
		Set<Argument> exceptRes = new HashSet<>();
		exceptRes.add(Argument.buildMethod("GET"));
		exceptRes.add(Argument.buildHeader("xxx", "xxx"));
		exceptRes.add(Argument.buildQuery("yyy", "yyy"));
		exceptRes.add(Argument.buildCallerIP("127.0.0.1"));
		exceptRes.add(Argument.buildCustom("xxx", "xxx"));
		exceptRes.add(Argument.buildCallerService(MetadataContext.LOCAL_NAMESPACE, MetadataContext.LOCAL_SERVICE));
		assertThat(arguments).isEqualTo(exceptRes);

		rateLimitRuleArgumentReactiveResolver2.getArguments(exchange, MetadataContext.LOCAL_NAMESPACE, MetadataContext.LOCAL_SERVICE);
		rateLimitRuleArgumentReactiveResolver3.getArguments(exchange, MetadataContext.LOCAL_NAMESPACE, MetadataContext.LOCAL_SERVICE);
		rateLimitRuleArgumentReactiveResolver4.getArguments(exchange, MetadataContext.LOCAL_NAMESPACE, MetadataContext.LOCAL_SERVICE);
	}