/** * Licensed to the Apache Software Foundation (ASF) under one * or more contributor license agreements. See the NOTICE file * distributed with this work for additional information * regarding copyright ownership. The ASF licenses this file * to you under the Apache License, Version 2.0 (the * "License"); you may not use this file except in compliance * with the License. You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package org.apache.zookeeper.server; import java.net.Inet6Address; import java.net.InetAddress; import java.net.InetSocketAddress; import java.util.Arrays; import java.util.Date; import javax.management.ObjectName; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.apache.zookeeper.jmx.MBeanRegistry; import org.apache.zookeeper.jmx.ZKMBeanInfo; /** * Implementation of connection MBean interface. */ public class ConnectionBean implements ConnectionMXBean, ZKMBeanInfo { private static final Logger LOG = LoggerFactory.getLogger(ConnectionBean.class); private final ServerCnxn connection; private final Stats stats; private final ZooKeeperServer zk; private final String remoteIP; private final long sessionId; public ConnectionBean(ServerCnxn connection,ZooKeeperServer zk){ this.connection = connection; this.stats = connection; this.zk = zk; InetSocketAddress sockAddr = connection.getRemoteSocketAddress(); if (sockAddr == null) { remoteIP = "Unknown"; } else { InetAddress addr = sockAddr.getAddress(); if (addr instanceof Inet6Address) { remoteIP = ObjectName.quote(addr.getHostAddress()); } else { remoteIP = addr.getHostAddress(); } } sessionId = connection.getSessionId(); } public String getSessionId() { return "0x" + Long.toHexString(sessionId); } public String getSourceIP() { InetSocketAddress sockAddr = connection.getRemoteSocketAddress(); if (sockAddr == null) { return null; } return sockAddr.getAddress().getHostAddress() + ":" + sockAddr.getPort(); } public String getName() { return MBeanRegistry.getInstance().makeFullPath("Connections", remoteIP, getSessionId()); } public boolean isHidden() { return false; } public String[] getEphemeralNodes() { if(zk.getZKDatabase() !=null){ String[] res = zk.getZKDatabase().getEphemerals(sessionId) .toArray(new String[0]); Arrays.sort(res); return res; } return null; } public String getStartedTime() { return stats.getEstablished().toString(); } public void terminateSession() { try { zk.closeSession(sessionId); } catch (Exception e) { LOG.warn("Unable to closeSession() for session: 0x" + getSessionId(), e); } } public void terminateConnection() { connection.sendCloseSession(); } public void resetCounters() { stats.resetStats(); } @Override public String toString() { return "ConnectionBean{ClientIP=" + ObjectName.quote(getSourceIP()) + ",SessionId=0x" + getSessionId() + "}"; } public long getOutstandingRequests() { return stats.getOutstandingRequests(); } public long getPacketsReceived() { return stats.getPacketsReceived(); } public long getPacketsSent() { return stats.getPacketsSent(); } public int getSessionTimeout() { return connection.getSessionTimeout(); } public long getMinLatency() { return stats.getMinLatency(); } public long getAvgLatency() { return stats.getAvgLatency(); } public long getMaxLatency() { return stats.getMaxLatency(); } public String getLastOperation() { return stats.getLastOperation(); } public String getLastCxid() { return "0x" + Long.toHexString(stats.getLastCxid()); } public String getLastZxid() { return "0x" + Long.toHexString(stats.getLastZxid()); } public String getLastResponseTime() { return new Date(stats.getLastResponseTime()).toString(); } public long getLastLatency() { return stats.getLastLatency(); } }