blob: 82fb900519f106a5bbaba2a7ebab0e1bda84aeec [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.geode.internal.cache.tier.sockets;
import org.apache.geode.StatisticDescriptor;
import org.apache.geode.Statistics;
import org.apache.geode.StatisticsFactory;
import org.apache.geode.StatisticsType;
import org.apache.geode.StatisticsTypeFactory;
import org.apache.geode.annotations.Immutable;
import org.apache.geode.distributed.internal.DistributionStats;
import org.apache.geode.internal.statistics.StatisticsTypeFactoryImpl;
/**
* Class <code>CacheClientProxyStats</code> tracks GemFire statistics related to a
* {@link CacheClientProxy}. These statistics are related to cache server client notifications for
* each client.
*
*
* @since GemFire 4.2
*/
public class CacheClientProxyStats implements MessageStats {
/** The <code>StatisticsType</code> of the statistics */
@Immutable
private static final StatisticsType _type;
/** Name of the messages received statistic */
private static final String MESSAGES_RECEIVED = "messagesReceived";
/** Name of the messages queued statistic */
private static final String MESSAGES_QUEUED = "messagesQueued";
/** Name of the messages not queued because originator statistic */
private static final String MESSAGES_NOT_QUEUED_ORIGINATOR = "messagesNotQueuedOriginator";
/** Name of the messages not queued because not interested statistic */
private static final String MESSAGES_NOT_QUEUED_NOT_INTERESTED = "messagesNotQueuedNotInterested";
/** Name of the messages failed to be queued statistic */
private static final String MESSAGES_FAILED_QUEUED = "messagesFailedQueued";
/** Name of the message queue size statistic */
private static final String MESSAGE_QUEUE_SIZE = "messageQueueSize";
/** Name of the messages removed statistic */
private static final String MESSAGES_PROCESSED = "messagesProcessed";
/** Name of the message processing time statistic */
private static final String MESSAGE_PROCESSING_TIME = "messageProcessingTime";
/** Name of the delta messages sent statistic */
private static final String DELTA_MESSAGES_SENT = "deltaMessagesSent";
/** Name of the delta full messages sent statistic */
private static final String DELTA_FULL_MESSAGES_SENT = "deltaFullMessagesSent";
/** Name of the CQ count statistic */
private static final String CQ_COUNT = "cqCount";
/** Id of the messages received statistic */
private static final int _messagesReceivedId;
/** Id of the messages queued statistic */
private static final int _messagesQueuedId;
/** Id of the messages not queued because originator statistic */
private static final int _messagesNotQueuedOriginatorId;
/** Id of the messages not queued because not interested statistic */
private static final int _messagesNotQueuedNotInterestedId;
/** Id of the messages failed to be queued statistic */
private static final int _messagesFailedQueuedId;
/** Id of the message queue size statistic */
private static final int _messageQueueSizeId;
/** Id of the messages removed statistic */
private static final int _messagesProcessedId;
/** Id of the message processing time statistic */
private static final int _messageProcessingTimeId;
/** Id of the prepared delta messages statistic */
private static final int _deltaMessagesSentId;
/** Id of the prepared delta messages statistic */
private static final int _deltaFullMessagesSentId;
/** Id of the CQ count statistic */
private static final int _cqCountId;
private static final int _sentBytesId;
/**
* Static initializer to create and initialize the <code>StatisticsType</code>
*/
static {
String statName = "CacheClientProxyStatistics";
StatisticsTypeFactory f = StatisticsTypeFactoryImpl.singleton();
_type = f.createType(statName, statName, new StatisticDescriptor[] {
f.createIntCounter(MESSAGES_RECEIVED, "Number of client messages received.", "operations"),
f.createIntCounter(MESSAGES_QUEUED, "Number of client messages added to the message queue.",
"operations"),
f.createIntCounter(MESSAGES_FAILED_QUEUED,
"Number of client messages attempted but failed to be added to the message queue.",
"operations"),
f.createIntCounter(MESSAGES_NOT_QUEUED_ORIGINATOR,
"Number of client messages received but not added to the message queue because the receiving proxy represents the client originating the message.",
"operations"),
f.createIntCounter(MESSAGES_NOT_QUEUED_NOT_INTERESTED,
"Number of client messages received but not added to the message queue because the client represented by the receiving proxy was not interested in the message's key.",
"operations"),
f.createIntGauge(MESSAGE_QUEUE_SIZE, "Size of the message queue.", "operations"),
f.createIntCounter(MESSAGES_PROCESSED,
"Number of client messages removed from the message queue and sent.", "operations"),
f.createLongCounter(MESSAGE_PROCESSING_TIME,
"Total time spent sending messages to clients.", "nanoseconds"),
f.createIntCounter(DELTA_MESSAGES_SENT,
"Number of client messages containing only delta bytes dispatched to the client.",
"operations"),
f.createIntCounter(DELTA_FULL_MESSAGES_SENT,
"Number of client messages dispatched in reponse to failed delta at client.",
"operations"),
f.createLongCounter(CQ_COUNT, "Number of CQs on the client.", "operations"),
f.createLongCounter("sentBytes", "Total number of bytes sent to client.", "bytes"),});
// Initialize id fields
_messagesReceivedId = _type.nameToId(MESSAGES_RECEIVED);
_messagesQueuedId = _type.nameToId(MESSAGES_QUEUED);
_messagesNotQueuedOriginatorId = _type.nameToId(MESSAGES_NOT_QUEUED_ORIGINATOR);
_messagesNotQueuedNotInterestedId = _type.nameToId(MESSAGES_NOT_QUEUED_NOT_INTERESTED);
_messagesFailedQueuedId = _type.nameToId(MESSAGES_FAILED_QUEUED);
_messageQueueSizeId = _type.nameToId(MESSAGE_QUEUE_SIZE);
_messagesProcessedId = _type.nameToId(MESSAGES_PROCESSED);
_messageProcessingTimeId = _type.nameToId(MESSAGE_PROCESSING_TIME);
_deltaMessagesSentId = _type.nameToId(DELTA_MESSAGES_SENT);
_deltaFullMessagesSentId = _type.nameToId(DELTA_FULL_MESSAGES_SENT);
_cqCountId = _type.nameToId(CQ_COUNT);
_sentBytesId = _type.nameToId("sentBytes");
}
////////////////////// Instance Fields //////////////////////
/** The <code>Statistics</code> instance to which most behavior is delegated */
private final Statistics _stats;
/////////////////////// Constructors ///////////////////////
/**
* Constructor.
*
* @param factory The <code>StatisticsFactory</code> which creates the <code>Statistics</code>
* instance
* @param name The name of the <code>Statistics</code>
*/
public CacheClientProxyStats(StatisticsFactory factory, String name) {
this._stats = factory.createAtomicStatistics(_type, "cacheClientProxyStats-" + name);
}
///////////////////// Instance Methods /////////////////////
/**
* Closes the <code>CacheClientProxyStats</code>.
*/
public void close() {
this._stats.close();
}
/**
* Returns the current value of the "messagesReceived" stat.
*
* @return the current value of the "messagesReceived" stat
*/
public int getMessagesReceived() {
return this._stats.getInt(_messagesReceivedId);
}
/**
* Returns the current value of the "messagesQueued" stat.
*
* @return the current value of the "messagesQueued" stat
*/
public int getMessagesQueued() {
return this._stats.getInt(_messagesQueuedId);
}
/**
* Returns the current value of the "messagesNotQueuedOriginator" stat.
*
* @return the current value of the "messagesNotQueuedOriginator" stat
*/
public int getMessagesNotQueuedOriginator() {
return this._stats.getInt(_messagesNotQueuedOriginatorId);
}
/**
* Returns the current value of the "messagesNotQueuedNotInterested" stat.
*
* @return the current value of the "messagesNotQueuedNotInterested" stat
*/
public int getMessagesNotQueuedNotInterested() {
return this._stats.getInt(_messagesNotQueuedNotInterestedId);
}
/**
* Returns the current value of the "messagesFailedQueued" stat.
*
* @return the current value of the "messagesFailedQueued" stat
*/
public int getMessagesFailedQueued() {
return this._stats.getInt(_messagesFailedQueuedId);
}
/**
* Returns the current value of the "messageQueueSize" stat.
*
* @return the current value of the "messageQueueSize" stat
*/
public int getMessageQueueSize() {
return this._stats.getInt(_messageQueueSizeId);
}
/**
* Returns the current value of the messagesProcessed" stat.
*
* @return the current value of the messagesProcessed" stat
*/
public int getMessagesProcessed() {
return this._stats.getInt(_messagesProcessedId);
}
/**
* Returns the current value of the "messageProcessingTime" stat.
*
* @return the current value of the "messageProcessingTime" stat
*/
public long getMessageProcessingTime() {
return this._stats.getLong(_messageProcessingTimeId);
}
/**
* Returns the current value of the "deltaMessagesSent" stat.
*
* @return the current value of the "deltaMessagesSent" stat
*/
public int getDeltaMessagesSent() {
return this._stats.getInt(_deltaMessagesSentId);
}
/**
* Returns the current value of the "deltaFullMessagesSent" stat.
*
* @return the current value of the "deltaFullMessagesSent" stat
*/
public int getDeltaFullMessagesSent() {
return this._stats.getInt(_deltaFullMessagesSentId);
}
/**
* Returns the current value of the "cqCount" stat.
*
* @return the current value of the "cqCount" stat
*/
public int getCqCount() {
return this._stats.getInt(_cqCountId);
}
/**
* Increments the "messagesReceived" stat.
*/
public void incMessagesReceived() {
this._stats.incInt(_messagesReceivedId, 1);
}
/**
* Increments the "messagesQueued" stat.
*/
public void incMessagesQueued() {
this._stats.incInt(_messagesQueuedId, 1);
}
/**
* Increments the "messagesNotQueuedOriginator" stat.
*/
public void incMessagesNotQueuedOriginator() {
this._stats.incInt(_messagesNotQueuedOriginatorId, 1);
}
/**
* Increments the "messagesNotQueuedNotInterested" stat.
*/
public void incMessagesNotQueuedNotInterested() {
this._stats.incInt(_messagesNotQueuedNotInterestedId, 1);
}
/**
* Increments the "messagesFailedQueued" stat.
*/
public void incMessagesFailedQueued() {
this._stats.incInt(_messagesFailedQueuedId, 1);
}
/**
* Increments the "cqCount" stat.
*/
public void incCqCount() {
this._stats.incInt(_cqCountId, 1);
}
/**
* Decrements the "cqCount" stat.
*/
public void decCqCount() {
this._stats.incInt(_cqCountId, -1);
}
/**
* Sets the "messageQueueSize" stat.
*
* @param size The size of the queue
*/
public void setQueueSize(int size) {
this._stats.setInt(_messageQueueSizeId, size);
}
/**
* Returns the current time (ns).
*
* @return the current time (ns)
*/
public long startTime() {
return DistributionStats.getStatTime();
}
/**
* Increments the "messagesProcessed" and "messageProcessingTime" stats.
*
* @param start The start of the message (which is decremented from the current time to determine
* the message processing time).
*/
public void endMessage(long start) {
long ts = DistributionStats.getStatTime();
// Increment number of notifications
this._stats.incInt(_messagesProcessedId, 1);
// Increment notification time
long elapsed = ts - start;
this._stats.incLong(_messageProcessingTimeId, elapsed);
}
/**
* Increments the "deltaMessagesSent" stats.
*/
public void incDeltaMessagesSent() {
this._stats.incInt(_deltaMessagesSentId, 1);
}
/**
* Increments the "deltaFullMessagesSent" stats.
*/
public void incDeltaFullMessagesSent() {
this._stats.incInt(_deltaFullMessagesSentId, 1);
}
@Override
public void incReceivedBytes(long v) {
// noop since we never receive
}
@Override
public void incSentBytes(long v) {
this._stats.incLong(_sentBytesId, v);
}
@Override
public void incMessagesBeingReceived(int bytes) {
// noop since we never receive
}
@Override
public void decMessagesBeingReceived(int bytes) {
// noop since we never receive
}
}