blob: f41aaa53fa032078fcfb46f8662644925b306720 [file] [log] [blame]
/**
* 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 org.apache.zookeeper.common.Time;
import java.util.concurrent.atomic.AtomicLong;
/**
* Basic Server Statistics
*/
public class ServerStats {
private long packetsSent;
private long packetsReceived;
private long maxLatency;
private long minLatency = Long.MAX_VALUE;
private long totalLatency = 0;
private long count = 0;
private AtomicLong fsyncThresholdExceedCount = new AtomicLong(0);
private final Provider provider;
public interface Provider {
public long getOutstandingRequests();
public long getLastProcessedZxid();
public String getState();
public int getNumAliveConnections();
}
public ServerStats(Provider provider) {
this.provider = provider;
}
// getters
synchronized public long getMinLatency() {
return minLatency == Long.MAX_VALUE ? 0 : minLatency;
}
synchronized public long getAvgLatency() {
if (count != 0) {
return totalLatency / count;
}
return 0;
}
synchronized public long getMaxLatency() {
return maxLatency;
}
public long getOutstandingRequests() {
return provider.getOutstandingRequests();
}
public long getLastProcessedZxid(){
return provider.getLastProcessedZxid();
}
synchronized public long getPacketsReceived() {
return packetsReceived;
}
synchronized public long getPacketsSent() {
return packetsSent;
}
public String getServerState() {
return provider.getState();
}
/** The number of client connections alive to this server */
public int getNumAliveClientConnections() {
return provider.getNumAliveConnections();
}
@Override
public String toString(){
StringBuilder sb = new StringBuilder();
sb.append("Latency min/avg/max: " + getMinLatency() + "/"
+ getAvgLatency() + "/" + getMaxLatency() + "\n");
sb.append("Received: " + getPacketsReceived() + "\n");
sb.append("Sent: " + getPacketsSent() + "\n");
sb.append("Connections: " + getNumAliveClientConnections() + "\n");
if (provider != null) {
sb.append("Outstanding: " + getOutstandingRequests() + "\n");
sb.append("Zxid: 0x"+ Long.toHexString(getLastProcessedZxid())+ "\n");
}
sb.append("Mode: " + getServerState() + "\n");
return sb.toString();
}
public long getFsyncThresholdExceedCount() {
return fsyncThresholdExceedCount.get();
}
public void incrementFsyncThresholdExceedCount() {
fsyncThresholdExceedCount.incrementAndGet();
}
public void resetFsyncThresholdExceedCount() {
fsyncThresholdExceedCount.set(0);
}
// mutators
synchronized void updateLatency(long requestCreateTime) {
long latency = Time.currentElapsedTime() - requestCreateTime;
totalLatency += latency;
count++;
if (latency < minLatency) {
minLatency = latency;
}
if (latency > maxLatency) {
maxLatency = latency;
}
}
synchronized public void resetLatency(){
totalLatency = 0;
count = 0;
maxLatency = 0;
minLatency = Long.MAX_VALUE;
}
synchronized public void resetMaxLatency(){
maxLatency = getMinLatency();
}
synchronized public void incrementPacketsReceived() {
packetsReceived++;
}
synchronized public void incrementPacketsSent() {
packetsSent++;
}
synchronized public void resetRequestCounters(){
packetsReceived = 0;
packetsSent = 0;
}
synchronized public void reset() {
resetLatency();
resetRequestCounters();
}
}