AsyncHttpClient ClientStats源码流程解读
作者:codecraft
这篇文章主要为大家介绍了AsyncHttpClient ClientStats源码流程解读,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
序
本文主要研究一下AsyncHttpClient的ClientStats
ClientStats
org/asynchttpclient/ClientStats.java
/** * A record class representing the state of an (@link org.asynchttpclient.AsyncHttpClient). */ public class ClientStats { private final Map<String, HostStats> statsPerHost; public ClientStats(Map<String, HostStats> statsPerHost) { this.statsPerHost = Collections.unmodifiableMap(statsPerHost); } /** * @return A map from hostname to statistics on that host's connections. * The returned map is unmodifiable. */ public Map<String, HostStats> getStatsPerHost() { return statsPerHost; } /** * @return The sum of {@link #getTotalActiveConnectionCount()} and {@link #getTotalIdleConnectionCount()}, * a long representing the total number of connections in the connection pool. */ public long getTotalConnectionCount() { return statsPerHost .values() .stream() .mapToLong(HostStats::getHostConnectionCount) .sum(); } /** * @return A long representing the number of active connections in the connection pool. */ public long getTotalActiveConnectionCount() { return statsPerHost .values() .stream() .mapToLong(HostStats::getHostActiveConnectionCount) .sum(); } /** * @return A long representing the number of idle connections in the connection pool. */ public long getTotalIdleConnectionCount() { return statsPerHost .values() .stream() .mapToLong(HostStats::getHostIdleConnectionCount) .sum(); } @Override public String toString() { return "There are " + getTotalConnectionCount() + " total connections, " + getTotalActiveConnectionCount() + " are active and " + getTotalIdleConnectionCount() + " are idle."; } @Override public boolean equals(final Object o) { if (this == o) return true; if (o == null || getClass() != o.getClass()) return false; final ClientStats that = (ClientStats) o; return Objects.equals(statsPerHost, that.statsPerHost); } @Override public int hashCode() { return Objects.hashCode(statsPerHost); } }
ClientStats通过Map<String, HostStats>维护了每个host对应的统计;它提供了getStatsPerHost、getTotalConnectionCount、getTotalActiveConnectionCount、getTotalIdleConnectionCount方法
HostStats
org/asynchttpclient/HostStats.java
/** * A record class representing the status of connections to some host. */ public class HostStats { private final long activeConnectionCount; private final long idleConnectionCount; public HostStats(long activeConnectionCount, long idleConnectionCount) { this.activeConnectionCount = activeConnectionCount; this.idleConnectionCount = idleConnectionCount; } /** * @return The sum of {@link #getHostActiveConnectionCount()} and {@link #getHostIdleConnectionCount()}, * a long representing the total number of connections to this host. */ public long getHostConnectionCount() { return activeConnectionCount + idleConnectionCount; } /** * @return A long representing the number of active connections to the host. */ public long getHostActiveConnectionCount() { return activeConnectionCount; } /** * @return A long representing the number of idle connections in the connection pool. */ public long getHostIdleConnectionCount() { return idleConnectionCount; } @Override public String toString() { return "There are " + getHostConnectionCount() + " total connections, " + getHostActiveConnectionCount() + " are active and " + getHostIdleConnectionCount() + " are idle."; } @Override public boolean equals(final Object o) { if (this == o) return true; if (o == null || getClass() != o.getClass()) return false; final HostStats hostStats = (HostStats) o; return activeConnectionCount == hostStats.activeConnectionCount && idleConnectionCount == hostStats.idleConnectionCount; } @Override public int hashCode() { return Objects.hash(activeConnectionCount, idleConnectionCount); } }
HostStats定义了activeConnectionCount、idleConnectionCount属性
getClientStats
org/asynchttpclient/netty/channel/ChannelManager.java
public ClientStats getClientStats() { Map<String, Long> totalConnectionsPerHost = openChannels.stream().map(Channel::remoteAddress).filter(a -> a.getClass() == InetSocketAddress.class) .map(a -> (InetSocketAddress) a).map(InetSocketAddress::getHostName).collect(Collectors.groupingBy(Function.identity(), Collectors.counting())); Map<String, Long> idleConnectionsPerHost = channelPool.getIdleChannelCountPerHost(); Map<String, HostStats> statsPerHost = totalConnectionsPerHost.entrySet().stream().collect(Collectors.toMap(Entry::getKey, entry -> { final long totalConnectionCount = entry.getValue(); final long idleConnectionCount = idleConnectionsPerHost.getOrDefault(entry.getKey(), 0L); final long activeConnectionCount = totalConnectionCount - idleConnectionCount; return new HostStats(activeConnectionCount, idleConnectionCount); })); return new ClientStats(statsPerHost); }
ChannelManager提供了getClientStats方法,它从openChannels获取totalConnectionsPerHost,从channelPool.getIdleChannelCountPerHost()获取idleConnectionCount,然后创建HostStats,最后返回ClientStats
小结
AsyncHttpClient提供了ClientStats用于获取连接的统计信息,可按host维度,统计activeConnectionCount、idleConnectionCount,也可汇总查看totalConnectionCount、totalActiveConnectionCount、totalIdleConnectionCount。它可以从ChannelManager获取。对于使用micrometer的可以使用这个作为数据源进行适配。
以上就是AsyncHttpClient ClientStats源码流程解读的详细内容,更多关于AsyncHttpClient ClientStats的资料请关注脚本之家其它相关文章!