diff --git a/redis/redis-console/src/main/java/com/ctrip/xpipe/redis/console/proxy/impl/AbstractTunnelSocketStatsAnalyzer.java b/redis/redis-console/src/main/java/com/ctrip/xpipe/redis/console/proxy/impl/AbstractTunnelSocketStatsAnalyzer.java index f218d9d308..0370dfa352 100644 --- a/redis/redis-console/src/main/java/com/ctrip/xpipe/redis/console/proxy/impl/AbstractTunnelSocketStatsAnalyzer.java +++ b/redis/redis-console/src/main/java/com/ctrip/xpipe/redis/console/proxy/impl/AbstractTunnelSocketStatsAnalyzer.java @@ -134,13 +134,25 @@ private MetricData getFrontendMetric(MetricData metric, DefaultTunnelInfo info, private void setSrcDstHostPorts(MetricData metric, SocketStatsResult socketStatsResult, boolean isFrontend) { metric.addTag(METRIC_TAG_SOCKET_TYPE, isFrontend ? METRIC_TAG_SOCKET_TYPE_FRONTEND : METRIC_TAG_SOCKET_TYPE_BACKEND); String[] splits = socketStatsResult.getResult().get(0).split(SOCKET_STATS_SPLITTER); - if (splits.length < 5) return; + if (splits.length < 5) { + setHostPortEmptyTag(metric, PREFIX_DST); + setHostPortEmptyTag(metric, PREFIX_SRC); + return; + } String[] localSplits = splits[3].split(HOST_SPLITTER); - if (localSplits.length >= 5) setHostPortTag(metric, localSplits[3], Integer.valueOf(localSplits[4]), isFrontend ? PREFIX_DST : PREFIX_SRC); + if (localSplits.length >= 5) { + setHostPortTag(metric, localSplits[3], Integer.valueOf(localSplits[4]), isFrontend ? PREFIX_DST : PREFIX_SRC); + } else { + setHostPortEmptyTag(metric, isFrontend ? PREFIX_DST : PREFIX_SRC); + } String[] remoteSplits = splits[4].split(HOST_SPLITTER); - if (remoteSplits.length >= 5) setHostPortTag(metric, remoteSplits[3], Integer.valueOf(remoteSplits[4]), isFrontend ? PREFIX_SRC : PREFIX_DST); + if (remoteSplits.length >= 5) { + setHostPortTag(metric, remoteSplits[3], Integer.valueOf(remoteSplits[4]), isFrontend ? PREFIX_SRC : PREFIX_DST); + } else { + setHostPortEmptyTag(metric, isFrontend ? PREFIX_SRC : PREFIX_DST); + } } private void setHostPortTag(MetricData metric, String host, int port, String prefix) { @@ -148,6 +160,11 @@ private void setHostPortTag(MetricData metric, String host, int port, String pre metric.addTag(prefix + "PortReminder", String.valueOf(port % THOUSAND)); } + private void setHostPortEmptyTag(MetricData metric, String prefix) { + metric.addTag(prefix + "HostPort", "_"); + metric.addTag(prefix + "PortReminder", "_"); + } + private MetricData getMetricTemplate(DefaultTunnelInfo info, String clusterId, String shardId) { ProxyModel proxyModel = info.getProxyModel(); return new MetricData(getType(), proxyModel.getDcName(), clusterId, shardId); diff --git a/redis/redis-console/src/test/java/com/ctrip/xpipe/redis/console/proxy/impl/DefaultTunnelSocketStatsAnalyzerManagerTest.java b/redis/redis-console/src/test/java/com/ctrip/xpipe/redis/console/proxy/impl/DefaultTunnelSocketStatsAnalyzerManagerTest.java index 3c196a272d..d92b678d93 100644 --- a/redis/redis-console/src/test/java/com/ctrip/xpipe/redis/console/proxy/impl/DefaultTunnelSocketStatsAnalyzerManagerTest.java +++ b/redis/redis-console/src/test/java/com/ctrip/xpipe/redis/console/proxy/impl/DefaultTunnelSocketStatsAnalyzerManagerTest.java @@ -8,10 +8,12 @@ import com.ctrip.xpipe.redis.core.proxy.monitor.TunnelSocketStatsResult; import com.ctrip.xpipe.redis.core.proxy.monitor.TunnelStatsResult; import com.google.common.collect.Lists; +import org.junit.Assert; import org.junit.Test; import org.springframework.beans.factory.annotation.Autowired; import java.util.List; +import java.util.Map; public class DefaultTunnelSocketStatsAnalyzerManagerTest extends AbstractConsoleIntegrationTest { @@ -34,6 +36,36 @@ public void testAnalyze() { } } + @Test + public void testAnalyzeTags() { + List result = manager.analyze(new DefaultProxyChain("FRA-AWS", "cluster", "shard", "sharb", Lists.newArrayList( + tunnelInfo3() + ))); + int index = 1; + + List requireTags = Lists.newArrayList("srcPortReminder", "srcHostPort", "dstHostPort", "dstPortReminder"); + for(TunnelSocketStatsAnalyzer.FrontendAndBackendMetrics metric : result) { + + logger.info("tunnel-{}", index++); + logger.info("frontend:"); + logger.info("{}: {}", metric.getFrontend().getMetricType(), metric.getFrontend().getValue()); + Map frontendTags = metric.getFrontend().getTags(); + for(String tag : requireTags) { + Assert.assertTrue(frontendTags.containsKey(tag)); + } + + logger.info("backend:"); + logger.info("{}: {}", metric.getBackend().getMetricType(), metric.getBackend().getValue()); + Map backendTags = metric.getBackend().getTags(); + for(String tag : requireTags) { + Assert.assertTrue(backendTags.containsKey(tag)); + } + + } + } + + + private DefaultTunnelInfo tunnelInfo1() { DefaultTunnelInfo info = new DefaultTunnelInfo(new ProxyModel().setDcName("oy").setHostPort(HostPort.fromString("10.2.131.201:47082")), "10.2.131.242:55306-R(10.2.131.200:53868)-L(10.2.131.201:47082)->R(10.2.73.170:6389)-TCP://10.2.73.170:6389"); @@ -53,4 +85,16 @@ private DefaultTunnelInfo tunnelInfo2() { info.setTunnelStatsResult(new TunnelStatsResult(info.getTunnelId(), "established", System.currentTimeMillis(), System.currentTimeMillis(), HostPort.fromString("10.2.131.201:47082"), HostPort.fromString("10.2.131.201:47082"))); return info; } + + private DefaultTunnelInfo tunnelInfo3() { + DefaultTunnelInfo info = new DefaultTunnelInfo(new ProxyModel().setDcName("fra-aws").setHostPort(new HostPort("10.2.131.200", 53868)), + "10.2.131.242:55306-R(10.2.131.242:55306)-L(10.2.131.200:53868)->R(10.2.131.201:443-TCP://10.2.73.170:6389"); + info.setTunnelSocketStatsResult(new TunnelSocketStatsResult(info.getTunnelId(), + new SocketStatsResult(Lists.newArrayList("ESTAB 0 285 ", "skmem:(r0,rb374400,t0,tb130560,f1251,w2845,o0,bl0) bbr wscale:10,10 rto:459 rtt:258.008/0.348 ato:40 mss:1460 cwnd:11 send 498.0Kbps unacked:2 retrans:0/3119 rcv_rtt:517020 rcv_space:40824")), + new SocketStatsResult(Lists.newArrayList("ESTAB 0 0 ::ffff:10.28.81.65:36190 ::ffff:10.28.97.195:5379 ", "skmem:(r0,rb566888,t0,tb130560,f4096,w0,o0,bl0) bbr wscale:7,10 rto:203 rtt:2.043/3.712 ato:87 mss:1448 cwnd:11 send 62.4Mbps rcv_rtt:1 rcv_space:57729")))); + info.setTunnelStatsResult(new TunnelStatsResult(info.getTunnelId(), "established", System.currentTimeMillis(), System.currentTimeMillis(), HostPort.fromString("10.2.131.201:47082"), HostPort.fromString("10.2.131.201:47082"))); + return info; + } + + } \ No newline at end of file