public Set<String> getExpressionLabelKeys(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();
		}

		Set<String> expressionLabels = new HashSet<>();
		for (RateLimitProto.Rule rule : rules) {
			Map<String, ModelProto.MatchString> labels = rule.getLabelsMap();
			if (CollectionUtils.isEmpty(labels)) {
				return Collections.emptySet();
			}
			for (String key : labels.keySet()) {
				if (ExpressionLabelUtils.isExpressionLabel(key)) {
					expressionLabels.add(key);
				}
			}
		}
		return expressionLabels;
	}
@Test
	public void testGetExpressionLabelKeys() {
		// rateLimitRule == null
		String serviceName = "TestApp1";
		Set<String> labelKeys = rateLimitRuleLabelResolver.getExpressionLabelKeys(null, serviceName);
		assertThat(labelKeys).isEmpty();

		// CollectionUtils.isEmpty(rules)
		serviceName = "TestApp2";
		labelKeys = rateLimitRuleLabelResolver.getExpressionLabelKeys(null, serviceName);
		assertThat(labelKeys).isEmpty();

		// CollectionUtils.isEmpty(labels)
		serviceName = "TestApp3";
		labelKeys = rateLimitRuleLabelResolver.getExpressionLabelKeys(null, serviceName);
		assertThat(labelKeys).isEmpty();

		// Has labels
		serviceName = "TestApp4";
		labelKeys = rateLimitRuleLabelResolver.getExpressionLabelKeys(null, serviceName);
		assertThat(labelKeys).isNotEmpty();
		assertThat(labelKeys).contains("${http.method}");
	}