// Path: common/src/main/java/com/xqbase/metric/common/Metric.java
// public class Metric {
// 	private static ConcurrentMap<MetricKey, MetricValue>
// 			map = new ConcurrentHashMap<>();
// 
// 	private static void put(MetricKey key, double value) {
// 		MetricValue current;
// 		do {
// 			current = map.get(key);
// 		} while (current == null ? map.putIfAbsent(key, new MetricValue(value)) != null :
// 				!map.replace(key, current, new MetricValue(current, value)));
// 	}
// 
// 	public static void put(String name, double value, Map<String, String> tagMap) {
// 		put(new MetricKey(name, tagMap), value);
// 	}
// 
// 	public static void put(String name, double value, String... tagPairs) {
// 		put(new MetricKey(name, tagPairs), value);
// 	}
// 
// 	public static List<MetricEntry> removeAll() {
// 		List<MetricEntry> metrics = new ArrayList<>();
// 		List<MetricKey> keys = new ArrayList<>(map.keySet());
// 		for (MetricKey key : keys) {
// 			MetricValue value = map.remove(key);
// 			if (value != null) {
// 				metrics.add(new MetricEntry(key, value));
// 			}
// 		}
// 		return metrics;
// 	}
// }
// 
// Path: common/src/main/java/com/xqbase/metric/common/MetricKey.java
// public class MetricKey {
// 	public static void putTagMap(Map<String, String> tagMap,
// 			String... tagPairs) {
// 		for (int i = 0; i < tagPairs.length - 1; i += 2) {
// 			String key = tagPairs[i];
// 			String value = tagPairs[i + 1];
// 			if (key != null && value != null) {
// 				tagMap.put(key, value);
// 			}
// 		}
// 	}
// 
// 	private String name;
// 	private Map<String, String> tagMap;
// 
// 	public MetricKey(String name, Map<String, String> tagMap) {
// 		this.name = name;
// 		this.tagMap = tagMap;
// 	}
// 
// 	public MetricKey(String name, String... tagPairs) {
// 		this.name = name;
// 		tagMap = new HashMap<>();
// 		putTagMap(tagMap, tagPairs);
// 	}
// 
// 	public String getName() {
// 		return name;
// 	}
// 
// 	public Map<String, String> getTagMap() {
// 		return tagMap;
// 	}
// 
// 	@Override
// 	public boolean equals(Object obj) {
// 		MetricKey metricKey = (MetricKey) obj;
// 		return metricKey.name.equals(name) && metricKey.tagMap.equals(tagMap);
// 	}
// 
// 	@Override
// 	public int hashCode() {
// 		return name.hashCode() + tagMap.hashCode();
// 	}
// }


import java.io.IOException;
import java.net.InetSocketAddress;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.concurrent.ScheduledThreadPoolExecutor;
import java.util.concurrent.TimeUnit;
import java.util.concurrent.atomic.AtomicInteger;
import javax.servlet.Filter;
import javax.servlet.FilterChain;
import javax.servlet.FilterConfig;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import com.xqbase.metric.common.Metric;
import com.xqbase.metric.common.MetricKey;

package com.xqbase.metric.client;




public class MetricFilter implements Filter {
	private static AtomicInteger count = new AtomicInteger(0);
	private static ManagementMonitor monitor;
	private static ScheduledThreadPoolExecutor timer;

	static AtomicInteger connections = new AtomicInteger(0);

	private FilterConfig conf;
	private String requestTime;

	Map<String, String> tagMap;

	protected String getAddresses() {
		return conf.getInitParameter("addresses");
	}

	protected String getPrefix() {
		return conf.getInitParameter("prefix");
	}

	protected String getTags() {
		return conf.getInitParameter("tags");
	}

	protected boolean isFrag() {
		return "true".equals(conf.getInitParameter("frag"));
	}


// Path: common/src/main/java/com/xqbase/metric/common/Metric.java
// public class Metric {
// 	private static ConcurrentMap<MetricKey, MetricValue>
// 			map = new ConcurrentHashMap<>();
// 
// 	private static void put(MetricKey key, double value) {
// 		MetricValue current;
// 		do {
// 			current = map.get(key);
// 		} while (current == null ? map.putIfAbsent(key, new MetricValue(value)) != null :
// 				!map.replace(key, current, new MetricValue(current, value)));
// 	}
// 
// 	public static void put(String name, double value, Map<String, String> tagMap) {
// 		put(new MetricKey(name, tagMap), value);
// 	}
// 
// 	public static void put(String name, double value, String... tagPairs) {
// 		put(new MetricKey(name, tagPairs), value);
// 	}
// 
// 	public static List<MetricEntry> removeAll() {
// 		List<MetricEntry> metrics = new ArrayList<>();
// 		List<MetricKey> keys = new ArrayList<>(map.keySet());
// 		for (MetricKey key : keys) {
// 			MetricValue value = map.remove(key);
// 			if (value != null) {
// 				metrics.add(new MetricEntry(key, value));
// 			}
// 		}
// 		return metrics;
// 	}
// }
// 
// Path: common/src/main/java/com/xqbase/metric/common/MetricKey.java
// public class MetricKey {
// 	public static void putTagMap(Map<String, String> tagMap,
// 			String... tagPairs) {
// 		for (int i = 0; i < tagPairs.length - 1; i += 2) {
// 			String key = tagPairs[i];
// 			String value = tagPairs[i + 1];
// 			if (key != null && value != null) {
// 				tagMap.put(key, value);
// 			}
// 		}
// 	}
// 
// 	private String name;
// 	private Map<String, String> tagMap;
// 
// 	public MetricKey(String name, Map<String, String> tagMap) {
// 		this.name = name;
// 		this.tagMap = tagMap;
// 	}
// 
// 	public MetricKey(String name, String... tagPairs) {
// 		this.name = name;
// 		tagMap = new HashMap<>();
// 		putTagMap(tagMap, tagPairs);
// 	}
// 
// 	public String getName() {
// 		return name;
// 	}
// 
// 	public Map<String, String> getTagMap() {
// 		return tagMap;
// 	}
// 
// 	@Override
// 	public boolean equals(Object obj) {
// 		MetricKey metricKey = (MetricKey) obj;
// 		return metricKey.name.equals(name) && metricKey.tagMap.equals(tagMap);
// 	}
// 
// 	@Override
// 	public int hashCode() {
// 		return name.hashCode() + tagMap.hashCode();
// 	}
// }


// Path: client-jdk17/src/main/java/com/xqbase/metric/client/MetricFilter.java
import java.io.IOException;
import java.net.InetSocketAddress;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.concurrent.ScheduledThreadPoolExecutor;
import java.util.concurrent.TimeUnit;
import java.util.concurrent.atomic.AtomicInteger;
import javax.servlet.Filter;
import javax.servlet.FilterChain;
import javax.servlet.FilterConfig;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import com.xqbase.metric.common.Metric;
import com.xqbase.metric.common.MetricKey;

package com.xqbase.metric.client;




public class MetricFilter implements Filter {
	private static AtomicInteger count = new AtomicInteger(0);
	private static ManagementMonitor monitor;
	private static ScheduledThreadPoolExecutor timer;

	static AtomicInteger connections = new AtomicInteger(0);

	private FilterConfig conf;
	private String requestTime;

	Map<String, String> tagMap;

	protected String getAddresses() {
		return conf.getInitParameter("addresses");
	}

	protected String getPrefix() {
		return conf.getInitParameter("prefix");
	}

	protected String getTags() {
		return conf.getInitParameter("tags");
	}

	protected boolean isFrag() {
		return "true".equals(conf.getInitParameter("frag"));
	}


	protected String truncatePath(String path) {
