blob: 050e682beb29cf72acc0ef9903dc27ac48c58f68 [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 java.util.HashMap;
import java.util.List;
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 SingleLineUimaJmxMonitorListener implements JmxMonitorListener {
private static final Class CLASS_NAME = JmxMonitorListener.class;
private boolean firsttime = true;
private double lastSampleTime = 0;
private double period;
/**
* 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 SingleLineUimaJmxMonitorListener() {
}
/**
* 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) {
String items;
if (firsttime) {
firsttime = false;
items = "\t Timestamp";
for (ServiceMetrics serviceMetrics : metrics) {
String srvName = serviceMetrics.getServiceName();
srvName = srvName.substring(0, srvName.indexOf("_Service Performance"));
if (serviceMetrics.isTopLevelService()) {
srvName = "(S)" + srvName;
} else if (serviceMetrics.isServiceRemote()) {
srvName = "(R)" + srvName;
}
items = items + "\t" + srvName + "-CPU";
items = items + "\t" + srvName + "-Idle";
items = items + "\t" + srvName + "-CASes";
items = items + "\t" + srvName + "-InQ";
if (!serviceMetrics.isTopLevelService()) {
items = items + "\t" + srvName + "-RepQ";
}
if (serviceMetrics.isTopLevelService()
|| (serviceMetrics.isCasMultiplier() && serviceMetrics.isServiceRemote())) {
items = items + "\t" + srvName + "-CPW";
}
if (serviceMetrics.isCasMultiplier() && !serviceMetrics.isServiceRemote()) {
items = items + "\t" + srvName + "-CmFreeCP";
}
if (serviceMetrics.isTopLevelService()) {
items = items + "\t" + srvName + "-SvcFreeCP";
}
}
UIMAFramework.getLogger(CLASS_NAME).log(Level.INFO, items);
}
items = "\t";
items = items + format(sampleTime / 1000000000.0);
period = (sampleTime - lastSampleTime) / 1000000.0;
lastSampleTime = sampleTime;
for (ServiceMetrics serviceMetrics : metrics) {
items = items + "\t" + format(serviceMetrics.getAnalysisTime() / period);
items = items + "\t" + format(serviceMetrics.getIdleTime() / period);
items = items + "\t" + serviceMetrics.getProcessCount();
items = items + "\t" + serviceMetrics.getInputQueueDepth();
if (!serviceMetrics.isTopLevelService()) {
items = items + "\t" + serviceMetrics.getReplyQueueDepth();
}
if (serviceMetrics.isTopLevelService()) {
items = items + "\t" + format(serviceMetrics.getCasPoolWaitTime() / period);
} else if (serviceMetrics.isCasMultiplier()) {
if (serviceMetrics.isServiceRemote()) {
items = items + "\t" + format(serviceMetrics.getShadowCasPoolWaitTime() / period);
} else {
items = items + "\t" + serviceMetrics.getCmFreeCasInstanceCount();
}
}
if (serviceMetrics.isTopLevelService()) {
items = items + "\t" + serviceMetrics.getSvcFreeCasInstanceCount();
}
}
if (UIMAFramework.getLogger(CLASS_NAME).isLoggable(Level.INFO)) {
UIMAFramework.getLogger(CLASS_NAME).log(Level.INFO, items);
}
}
private String format(double value) {
NumberFormat formatter = new DecimalFormat();
// formatter.setRoundingMode(java.math.RoundingMode.UP);
// formatter.setMinimumFractionDigits(0);
// formatter.setMaximumFractionDigits(0);
return formatter.format(value);
}
}