/* * 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.axis2.transport.base; import org.apache.axis2.context.MessageContext; import java.util.Map; import java.util.Collections; import java.util.HashMap; /** * Collects metrics related to a transport that has metrics support enabled */ public class MetricsCollector { public static final int LEVEL_NONE = 0; public static final int LEVEL_TRANSPORT = 1; public static final int LEVEL_FULL = 2; private static final Long ONE = (long) 1; /** By default, full metrics collection is enabled */ private int level = LEVEL_FULL; private long messagesReceived; private long faultsReceiving; private long timeoutsReceiving; private long bytesReceived; private long minSizeReceived; private long maxSizeReceived; private double avgSizeReceived; private long messagesSent; private long faultsSending; private long timeoutsSending; private long bytesSent; private long minSizeSent; private long maxSizeSent; private double avgSizeSent; private final Map<Integer, Long> responseCodeTable = Collections.synchronizedMap(new HashMap<Integer, Long>()); private long lastResetTime = System.currentTimeMillis(); public void reset() { messagesReceived = 0; faultsReceiving = 0; timeoutsReceiving = 0; bytesReceived = 0; minSizeReceived = 0; maxSizeReceived = 0; avgSizeReceived = 0; messagesSent = 0; faultsSending = 0; timeoutsSending = 0; bytesSent = 0; minSizeSent = 0; maxSizeSent = 0; avgSizeSent = 0; responseCodeTable.clear(); lastResetTime = System.currentTimeMillis(); } public int getLevel() { return level; } public void setLevel(int level) { this.level = level; } public long getLastResetTime() { return lastResetTime; } public long getMessagesReceived() { return messagesReceived; } public long getFaultsReceiving() { return faultsReceiving; } public long getTimeoutsReceiving() { return timeoutsReceiving; } public long getBytesReceived() { return bytesReceived; } /** * Get the number of messages sent. This metrics is incremented after a * message has been completely and successfully put on the wire. * * @return the number of messages sent */ public long getMessagesSent() { return messagesSent; } public long getFaultsSending() { return faultsSending; } public long getTimeoutsSending() { return timeoutsSending; } public long getBytesSent() { return bytesSent; } public long getMinSizeReceived() { return minSizeReceived; } public long getMaxSizeReceived() { return maxSizeReceived; } public long getMinSizeSent() { return minSizeSent; } public long getMaxSizeSent() { return maxSizeSent; } public double getAvgSizeReceived() { return avgSizeReceived; } public double getAvgSizeSent() { return avgSizeSent; } public Map<Integer, Long> getResponseCodeTable() { return responseCodeTable; } public synchronized void incrementMessagesReceived() { messagesReceived++; } public synchronized void incrementFaultsReceiving() { faultsReceiving++; } public synchronized void incrementTimeoutsReceiving() { timeoutsReceiving++; } public synchronized void incrementBytesReceived(long size) { bytesReceived += size; } public synchronized void incrementMessagesSent() { messagesSent++; } public synchronized void incrementFaultsSending() { faultsSending++; } public synchronized void incrementTimeoutsSending() { timeoutsSending++; } public synchronized void incrementBytesSent(long size) { bytesSent += size; } public synchronized void notifyReceivedMessageSize(long size) { if (minSizeReceived == 0 || size < minSizeReceived) { minSizeReceived = size; } if (size > maxSizeReceived) { maxSizeReceived = size; } avgSizeReceived = (avgSizeReceived == 0 ? size : (avgSizeReceived + size) / 2); } public synchronized void notifySentMessageSize(long size) { if (minSizeSent == 0 || size < minSizeSent) { minSizeSent = size; } if (size > maxSizeSent) { maxSizeSent = size; } avgSizeSent = (avgSizeSent == 0 ? size : (avgSizeSent + size) / 2); } public void reportResponseCode(int respCode) { synchronized(responseCodeTable) { Object o = responseCodeTable.get(respCode); if (o == null) { responseCodeTable.put(respCode, ONE); } else { responseCodeTable.put(respCode, (Long) o + 1); } } } // --- enhanced methods --- private MessageLevelMetricsCollector getMsgLevelMetrics(MessageContext mc) { if (mc != null && level == LEVEL_FULL) { return (MessageLevelMetricsCollector) mc.getProperty(BaseConstants.METRICS_COLLECTOR); } return null; } public void incrementMessagesReceived(MessageContext mc) { incrementMessagesReceived(); MessageLevelMetricsCollector m = getMsgLevelMetrics(mc); if (m != null) { m.incrementMessagesReceived(); } } public void incrementFaultsReceiving(int errorCode, MessageContext mc) { incrementFaultsReceiving(); MessageLevelMetricsCollector m = getMsgLevelMetrics(mc); if (m != null) { m.incrementFaultsReceiving(errorCode); } } public void incrementTimeoutsReceiving(MessageContext mc) { incrementTimeoutsReceiving(); MessageLevelMetricsCollector m = getMsgLevelMetrics(mc); if (m != null) { m.incrementTimeoutsReceiving(); } } public void incrementBytesReceived(MessageContext mc, long size) { incrementBytesReceived(size); MessageLevelMetricsCollector m = getMsgLevelMetrics(mc); if (m != null) { m.incrementBytesReceived(size); } } public void incrementMessagesSent(MessageContext mc) { incrementMessagesSent(); MessageLevelMetricsCollector m = getMsgLevelMetrics(mc); if (m != null) { m.incrementMessagesSent(); } } public void incrementFaultsSending(int errorCode, MessageContext mc) { incrementFaultsSending(); MessageLevelMetricsCollector m = getMsgLevelMetrics(mc); if (m != null) { m.incrementFaultsSending(errorCode); } } public void incrementTimeoutsSending(MessageContext mc) { incrementTimeoutsSending(); MessageLevelMetricsCollector m = getMsgLevelMetrics(mc); if (m != null) { m.incrementTimeoutsSending(); } } public void incrementBytesSent(MessageContext mc, long size) { incrementBytesSent(size); MessageLevelMetricsCollector m = getMsgLevelMetrics(mc); if (m != null) { m.incrementBytesSent(size); } } public void notifyReceivedMessageSize(MessageContext mc, long size) { notifyReceivedMessageSize(size); MessageLevelMetricsCollector m = getMsgLevelMetrics(mc); if (m != null) { m.notifyReceivedMessageSize(size); } } public void notifySentMessageSize(MessageContext mc, long size) { notifySentMessageSize(size); MessageLevelMetricsCollector m = getMsgLevelMetrics(mc); if (m != null) { m.notifySentMessageSize(size); } } public void reportResponseCode(MessageContext mc, int respCode) { reportResponseCode(respCode); MessageLevelMetricsCollector m = getMsgLevelMetrics(mc); if (m != null) { m.reportResponseCode(respCode); } } }