/*
* Jopr Management Platform
* Copyright (C) 2005-2012 Red Hat, Inc.
* All rights reserved.
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License, version 2, as
* published by the Free Software Foundation, and/or the GNU Lesser
* General Public License, version 2.1, also as published by the Free
* Software Foundation.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License and the GNU Lesser General Public License
* for more details.
*
* You should have received a copy of the GNU General Public License
* and the GNU Lesser General Public License along with this program;
* if not, write to the Free Software Foundation, Inc.,
* 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
*/
package org.rhq.plugins.jbossas;
import java.util.Set;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.mc4j.ems.connection.bean.EmsBean;
import org.mc4j.ems.connection.bean.attribute.EmsAttribute;
import org.rhq.core.domain.configuration.Configuration;
import org.rhq.core.domain.measurement.DataType;
import org.rhq.core.domain.measurement.MeasurementDataNumeric;
import org.rhq.core.domain.measurement.MeasurementDataTrait;
import org.rhq.core.domain.measurement.MeasurementReport;
import org.rhq.core.domain.measurement.MeasurementScheduleRequest;
import org.rhq.plugins.jmx.MBeanResourceComponent;
/**
* RHQ plugin component for representing Tomcat connectors. Much of the functionality is left to the super class,
* however the metrics required special handling.
*
* @author Jason Dobies
*/
public class JBossASTomcatConnectorComponent extends MBeanResourceComponent<JBossASTomcatServerComponent> {
// Constants --------------------------------------------
/**
* Plugin property name for the address the connector is bound to.
*/
public static final String PROPERTY_ADDRESS = "address";
/**
* Plugin property name for the port the connector is listening on.
*/
public static final String PROPERTY_PORT = "port";
/**
* Plugin property name for the schema the connector is processing. Possible values are http (also for https), jk
* (JBoss 3.2.x, 4.0.x), and ajp (JBoss 4.2.x and EAP)
*/
public static final String PROPERTY_SCHEMA = "schema";
/**
* A Dash character is needed to separate the parts of the GlobalRequestProcessorName
*/
public static final String PROPERTY_DASH = "-";
private final Log log = LogFactory.getLog(this.getClass());
// MBeanResourceComponent Overridden Methods --------------------------------------------
@Override
public void getValues(MeasurementReport report, Set<MeasurementScheduleRequest> requests) {
JBossASTomcatServerComponent parentTomcatComponent = getResourceContext().getParentResourceComponent();
parentTomcatComponent.getEmsConnection(); // reload the EMS connection
for (MeasurementScheduleRequest request : requests) {
String name = request.getName();
name = getAttributeName(name);
String beanName = name.substring(0, name.lastIndexOf(':'));
String attributeName = name.substring(name.lastIndexOf(':') + 1);
try {
// Bean is cached by EMS, so no problem with getting the bean from the connection on each call
EmsBean eBean = loadBean(beanName);
if (eBean == null) {
log.warn("Bean " + beanName + " not found, skipping ...");
continue;
}
EmsAttribute attribute = eBean.getAttribute(attributeName);
Object valueObject = attribute.refresh();
if (valueObject != null) {
if (request.getDataType() == DataType.TRAIT) {
report.addData(new MeasurementDataTrait(request, valueObject.toString()));
} else { // numeric
report.addData(new MeasurementDataNumeric(request, ((Number)valueObject).doubleValue()));
}
}
} catch (Exception e) {
log.error("Failed to obtain measurement [" + name + "].", e);
}
}
}
/**
* Get the real name of the passed property for a concrete connector. The actual object name will begin with:
* jboss.web:name=xxx-y.y.y.y-ppppp with xxx being the schema, y.y.y.y the address and ppppp the port. We need to
* substitute in the address and port of this particular connector before the value can be read. In the plugin
* descriptor, these are written as {schema}, {address} and {port} respectively, so we can replace on those. Worse:
* if its an 'old' embedded tomcat (JBoss 3.2, 4.0) it does not have the address in the object name.
*/
@Override
protected String getAttributeName(String property) {
String theProperty = property;
Configuration pluginConfiguration = getResourceContext().getPluginConfiguration();
String address = pluginConfiguration.getSimpleValue(PROPERTY_ADDRESS, "");
String port = pluginConfiguration.getSimpleValue(PROPERTY_PORT, "");
String schema = pluginConfiguration.getSimpleValue(PROPERTY_SCHEMA, "");
String dash = pluginConfiguration.getSimpleValue(PROPERTY_DASH, "");
theProperty = theProperty.replace("%address%", address);
theProperty = theProperty.replace("%port%", port);
theProperty = theProperty.replace("%schema%", schema);
theProperty = theProperty.replace("%dash%", dash);
if (log.isDebugEnabled()) {
log.debug("Finding metrics for [" + theProperty + "]...");
}
return theProperty;
}
}