/*
* JBoss, Home of Professional Open Source
* Copyright 2012-2013 Red Hat Inc. and/or its affiliates and other contributors
* as indicated by the @author tags. All rights reserved.
* See the copyright.txt in the distribution for a
* full listing of individual contributors.
*
* This copyrighted material is made available to anyone wishing to use,
* modify, copy, or redistribute it subject to the terms and conditions
* of the GNU Lesser General Public License, v. 2.1.
* This program is distributed in the hope that it will be useful, but WITHOUT A
* WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A
* PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details.
* You should have received a copy of the GNU Lesser General Public License,
* v.2.1 along with this distribution; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston,
* MA 02110-1301, USA.
*/
package org.infinispan.server.endpoint.subsystem;
import java.util.EnumSet;
import java.util.HashMap;
import java.util.Map;
import org.jboss.as.controller.AbstractRuntimeOnlyHandler;
import org.jboss.as.controller.AttributeDefinition;
import org.jboss.as.controller.OperationContext;
import org.jboss.as.controller.OperationFailedException;
import org.jboss.as.controller.SimpleAttributeDefinitionBuilder;
import org.jboss.as.controller.descriptions.ModelDescriptionConstants;
import org.jboss.as.controller.registry.ManagementResourceRegistration;
import org.jboss.dmr.ModelNode;
import org.jboss.dmr.ModelType;
import org.jboss.msc.service.ServiceController;
public class ProtocolServerMetricsHandler extends AbstractRuntimeOnlyHandler {
final String name;
public enum ProtocolServerMetrics {
BYTES_READ(new SimpleAttributeDefinitionBuilder(MetricKeys.BYTES_READ, ModelType.LONG, true).setStorageRuntime().build()),
BYTES_WRITTEN(new SimpleAttributeDefinitionBuilder(MetricKeys.BYTES_WRITTEN, ModelType.LONG, true).setStorageRuntime().build());
private static final Map<String, ProtocolServerMetrics> MAP = new HashMap<String, ProtocolServerMetrics>();
static {
for (ProtocolServerMetrics stat : EnumSet.allOf(ProtocolServerMetrics.class)) {
MAP.put(stat.toString(), stat);
}
}
final AttributeDefinition definition;
private ProtocolServerMetrics(final AttributeDefinition definition) {
this.definition = definition;
}
@Override
public final String toString() {
return definition.getName();
}
public static ProtocolServerMetrics getStat(final String stringForm) {
return MAP.get(stringForm);
}
}
protected ProtocolServerMetricsHandler(final String name) {
this.name = name;
}
@Override
protected void executeRuntimeStep(OperationContext context, ModelNode operation) throws OperationFailedException {
final String attrName = operation.require(ModelDescriptionConstants.NAME).asString();
ProtocolServerMetrics metric = ProtocolServerMetrics.getStat(attrName);
if (metric == null) {
context.getFailureDescription().set(String.format("Unknown metric %s", attrName));
} else {
final ServiceController<?> controller = context.getServiceRegistry(false)
.getService(EndpointUtils.getServiceName(operation, name));
ProtocolServerService service = (ProtocolServerService) controller.getService();
ModelNode result = new ModelNode();
switch (metric) {
case BYTES_READ:
result.set(service.getTransport().getTotalBytesRead());
break;
case BYTES_WRITTEN:
result.set(service.getTransport().getTotalBytesWritten());
break;
}
context.getResult().set(result);
}
context.stepCompleted();
}
protected static void registerMetrics(final ManagementResourceRegistration resourceRegistration, final String name) {
ProtocolServerMetricsHandler handler = new ProtocolServerMetricsHandler(name);
for (ProtocolServerMetrics metric : ProtocolServerMetrics.values()) {
resourceRegistration.registerMetric(metric.definition, handler);
}
}
}