blob: ee4806998d35de5551c48498f83c3019bea90726 [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.uima.aae.jmx.monitor;
import java.text.DecimalFormat;
import java.text.NumberFormat;
import org.apache.uima.UIMAFramework;
import org.apache.uima.aae.UIMAEE_Constants;
import org.apache.uima.util.Level;
/**
* This class implements {@link JmxMonitorListener} interface. It provides basic formatting for
* UIMA-AS service metrics. All metrics are formatted and logged into a uima log if one is defined.
* Otherwise, the output is dumped to stdout.
*
*
*/
public class BasicUimaJmxMonitorListener implements JmxMonitorListener {
private static final Class CLASS_NAME = JmxMonitorListener.class;
private int maxNameLength = 0;
/**
* Constructor
*
* @param aMaxNameLength
* - the longest name of the UIMA-AS service. This is use to pad other names so that the
* output is easier to read.
*
*/
public BasicUimaJmxMonitorListener(int aMaxNameLength) {
maxNameLength = aMaxNameLength;
}
/**
* Callback method called by the JmxMonitor after each checkpoint.
*
* @param sampleTime
* - last checkpoint time
* @param metrics
* - an array of ServiceMetrics objects, each holding metrics for a specific UIMA AS
* service.
*/
public void onNewMetrics(long sampleTime, ServiceMetrics[] metrics) {
for (ServiceMetrics serviceMetrics : metrics) {
// Log metrics including shadow CAS pool metric for remote CAS multiplier. Filter out the top
// level service
if (serviceMetrics.isCasMultiplier() && serviceMetrics.isServiceRemote()
&& !serviceMetrics.isTopLevelService()) {
if (UIMAFramework.getLogger(CLASS_NAME).isLoggable(Level.INFO)) {
UIMAFramework.getLogger(CLASS_NAME).logrb(
Level.INFO,
CLASS_NAME.getName(),
"run",
UIMAEE_Constants.JMS_LOG_RESOURCE_BUNDLE,
"UIMAEE_service_idle_time_shadow_cas_pool_INFO",
new Object[] { format((double) sampleTime / 1000000),
padName(serviceMetrics.getServiceName()), serviceMetrics.isCasMultiplier(),
serviceMetrics.isServiceRemote(), format(serviceMetrics.getIdleTime()),
serviceMetrics.getProcessCount(), serviceMetrics.getInputQueueDepth(),
serviceMetrics.getReplyQueueDepth(),
format(serviceMetrics.getShadowCasPoolWaitTime()),
format(serviceMetrics.getAnalysisTime()),
serviceMetrics.getProcessThreadCount(),
serviceMetrics.getCmFreeCasInstanceCount(),
serviceMetrics.getSvcFreeCasInstanceCount() });
}
} else {
if (UIMAFramework.getLogger(CLASS_NAME).isLoggable(Level.INFO)) {
UIMAFramework.getLogger(CLASS_NAME).logrb(
Level.INFO,
CLASS_NAME.getName(),
"run",
UIMAEE_Constants.JMS_LOG_RESOURCE_BUNDLE,
"UIMAEE_service_idle_time_cas_pool_INFO",
new Object[] { format((double) sampleTime / 1000000),
padName(serviceMetrics.getServiceName()), serviceMetrics.isCasMultiplier(),
serviceMetrics.isServiceRemote(), format(serviceMetrics.getIdleTime()),
serviceMetrics.getProcessCount(), serviceMetrics.getInputQueueDepth(),
serviceMetrics.getReplyQueueDepth(),
format(serviceMetrics.getCasPoolWaitTime()),
format(serviceMetrics.getAnalysisTime()),
serviceMetrics.getProcessThreadCount(),
serviceMetrics.getCmFreeCasInstanceCount(),
serviceMetrics.getSvcFreeCasInstanceCount() });
}
}
}
// Log group delimiter to make it easier to see metrics for this interval
onNewSamplingInterval();
}
public void onNewSamplingInterval() {
if (UIMAFramework.getLogger(CLASS_NAME).isLoggable(Level.INFO)) {
UIMAFramework.getLogger(CLASS_NAME).logrb(Level.INFO, CLASS_NAME.getName(), "run",
UIMAEE_Constants.JMS_LOG_RESOURCE_BUNDLE, "UIMAEE_marker_INFO", new Object[] {});
}
}
private String format(double value) {
NumberFormat formatter = new DecimalFormat();
formatter.setMinimumFractionDigits(0);
formatter.setMaximumFractionDigits(0);
return formatter.format(value);
}
private String format2(double value) {
NumberFormat formatter = new DecimalFormat("0.00");
return formatter.format(value);
}
private String padName(String aName) {
StringBuffer name = new StringBuffer(aName);
if (aName.length() < maxNameLength) {
for (int i = aName.length(); i < maxNameLength; i++) {
name.append(' ');
}
}
return name.toString();
}
}