blob: e0aa0c862cf5273ed454a62138255d831878a502 [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.activemq.management;
import javax.jms.Destination;
import javax.jms.MessageConsumer;
import javax.jms.MessageProducer;
import javax.jms.Session;
import org.apache.activemq.util.IndentPrinter;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
/**
* Statistics for a JMS endpoint, typically a MessageProducer or MessageConsumer
* but this class can also be used to represent statistics on a
* {@link Destination} as well.
*
*
*/
public class JMSEndpointStatsImpl extends StatsImpl {
private static final Logger LOG = LoggerFactory.getLogger(JMSEndpointStatsImpl.class);
protected CountStatisticImpl messageCount;
protected CountStatisticImpl pendingMessageCount;
protected CountStatisticImpl expiredMessageCount;
protected TimeStatisticImpl messageWaitTime;
protected TimeStatisticImpl messageRateTime;
/**
* This constructor is used to create statistics for a
* {@link MessageProducer} or {@link MessageConsumer} as it passes in a
* {@link Session} parent statistic.
*
* @param sessionStats
*/
public JMSEndpointStatsImpl(JMSSessionStatsImpl sessionStats) {
this();
setParent(messageCount, sessionStats.getMessageCount());
setParent(pendingMessageCount, sessionStats.getPendingMessageCount());
setParent(expiredMessageCount, sessionStats.getExpiredMessageCount());
setParent(messageWaitTime, sessionStats.getMessageWaitTime());
setParent(messageRateTime, sessionStats.getMessageRateTime());
}
/**
* This constructor is typically used to create a statistics object for a
* {@link Destination}
*/
public JMSEndpointStatsImpl() {
this(new CountStatisticImpl("messageCount", "Number of messages processed"), new CountStatisticImpl("pendingMessageCount", "Number of pending messages"),
new CountStatisticImpl("expiredMessageCount", "Number of expired messages"),
new TimeStatisticImpl("messageWaitTime", "Time spent by a message before being delivered"), new TimeStatisticImpl("messageRateTime",
"Time taken to process a message (thoughtput rate)"));
}
public JMSEndpointStatsImpl(CountStatisticImpl messageCount, CountStatisticImpl pendingMessageCount, CountStatisticImpl expiredMessageCount, TimeStatisticImpl messageWaitTime,
TimeStatisticImpl messageRateTime) {
this.messageCount = messageCount;
this.pendingMessageCount = pendingMessageCount;
this.expiredMessageCount = expiredMessageCount;
this.messageWaitTime = messageWaitTime;
this.messageRateTime = messageRateTime;
// lets add named stats
addStatistic("messageCount", messageCount);
addStatistic("pendingMessageCount", pendingMessageCount);
addStatistic("expiredMessageCount", expiredMessageCount);
addStatistic("messageWaitTime", messageWaitTime);
addStatistic("messageRateTime", messageRateTime);
}
public synchronized void reset() {
super.reset();
messageCount.reset();
messageRateTime.reset();
pendingMessageCount.reset();
expiredMessageCount.reset();
messageWaitTime.reset();
}
public CountStatisticImpl getMessageCount() {
return messageCount;
}
public CountStatisticImpl getPendingMessageCount() {
return pendingMessageCount;
}
public CountStatisticImpl getExpiredMessageCount() {
return expiredMessageCount;
}
public TimeStatisticImpl getMessageRateTime() {
return messageRateTime;
}
public TimeStatisticImpl getMessageWaitTime() {
return messageWaitTime;
}
public String toString() {
StringBuffer buffer = new StringBuffer();
buffer.append(messageCount);
buffer.append(" ");
buffer.append(messageRateTime);
buffer.append(" ");
buffer.append(pendingMessageCount);
buffer.append(" ");
buffer.append(expiredMessageCount);
buffer.append(" ");
buffer.append(messageWaitTime);
return buffer.toString();
}
public void onMessage() {
if (enabled) {
long start = messageCount.getLastSampleTime();
messageCount.increment();
long end = messageCount.getLastSampleTime();
messageRateTime.addTime(end - start);
}
}
@Override
public void setEnabled(boolean enabled) {
super.setEnabled(enabled);
messageCount.setEnabled(enabled);
messageRateTime.setEnabled(enabled);
pendingMessageCount.setEnabled(enabled);
expiredMessageCount.setEnabled(enabled);
messageWaitTime.setEnabled(enabled);
}
public void dump(IndentPrinter out) {
out.printIndent();
out.println(messageCount);
out.printIndent();
out.println(messageRateTime);
out.printIndent();
out.println(pendingMessageCount);
out.printIndent();
out.println(messageRateTime);
out.printIndent();
out.println(expiredMessageCount);
out.printIndent();
out.println(messageWaitTime);
}
// Implementation methods
// -------------------------------------------------------------------------
protected void setParent(CountStatisticImpl child, CountStatisticImpl parent) {
if (child instanceof CountStatisticImpl && parent instanceof CountStatisticImpl) {
CountStatisticImpl c = (CountStatisticImpl)child;
c.setParent((CountStatisticImpl)parent);
} else {
LOG.warn("Cannot associate endpoint counters with session level counters as they are not both CountStatisticImpl clases. Endpoint: " + child + " session: " + parent);
}
}
protected void setParent(TimeStatisticImpl child, TimeStatisticImpl parent) {
if (child instanceof TimeStatisticImpl && parent instanceof TimeStatisticImpl) {
TimeStatisticImpl c = (TimeStatisticImpl)child;
c.setParent((TimeStatisticImpl)parent);
} else {
LOG.warn("Cannot associate endpoint counters with session level counters as they are not both TimeStatisticImpl clases. Endpoint: " + child + " session: " + parent);
}
}
}