/*
* Copyright (c) 2016, WSO2 Inc. (http://www.wso2.org) All Rights Reserved.
* <p/>
* WSO2 Inc. 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
* <p/>
* http://www.apache.org/licenses/LICENSE-2.0
* <p/>
* 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.wso2.carbon.das.messageflow.data.publisher.observer.jmx;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.apache.synapse.aspects.flow.statistics.publishing.PublishingEvent;
import org.apache.synapse.aspects.flow.statistics.publishing.PublishingFlow;
import org.apache.synapse.commons.jmx.MBeanRegistrar;
import org.wso2.carbon.das.messageflow.data.publisher.observer.MessageFlowObserver;
import org.wso2.carbon.das.messageflow.data.publisher.observer.TenantInformation;
import org.wso2.carbon.das.messageflow.data.publisher.observer.jmx.data.StatisticCollectionViewMXBean;
import org.wso2.carbon.das.messageflow.data.publisher.observer.jmx.data.StatisticsCompositeObject;
import org.apache.synapse.aspects.flow.statistics.util.StatisticsConstants;
import org.wso2.carbon.das.messageflow.data.publisher.observer.jmx.data.SummeryStatisticObject;
import java.util.HashMap;
import java.util.Map;
/**
* Publish statistics data for JMX monitoring.
*/
public class JMXMediationFlowObserver implements StatisticCollectionViewMXBean, MessageFlowObserver, TenantInformation {
private static final Log log = LogFactory.getLog(JMXMediationFlowObserver.class);
public static final String MBEAN_CATEGORY = "Mediation Flow Statistic View";
public static final String MBEAN_ID = "MediationFlowStatisticView_";
private int tenantId = -1234;
private final Map<String, SummeryStatisticObject> proxyStatistics = new HashMap<>();
private final Map<String, SummeryStatisticObject> apiStatistics = new HashMap<>();
private final Map<String, SummeryStatisticObject> sequenceStatistics = new HashMap<>();
private final Map<String, SummeryStatisticObject> inboundEndpointStatistics = new HashMap<>();
private final Map<String, SummeryStatisticObject> endpointStatistics = new HashMap<>();
public JMXMediationFlowObserver(int tenantId) {
this.tenantId = tenantId;
MBeanRegistrar.getInstance().registerMBean(this, MBEAN_CATEGORY, MBEAN_ID + this.tenantId);
}
@Override
public void resetAPIStatistics() {
apiStatistics.clear();
}
@Override
public void resetProxyStatistics() {
proxyStatistics.clear();
}
@Override
public void resetSequenceStatistics() {
sequenceStatistics.clear();
}
@Override
public void resetInboundEndpointStatistics() {
inboundEndpointStatistics.clear();
}
@Override
public void resetEndpointStatistics() {
endpointStatistics.clear();
}
@Override
public void resetAllStatistics() {
resetAPIStatistics();
resetProxyStatistics();
resetSequenceStatistics();
resetInboundEndpointStatistics();
resetEndpointStatistics();
}
@Override
public StatisticsCompositeObject getProxyServiceJmxStatistics(String proxyName) {
SummeryStatisticObject statisticsObject = proxyStatistics.get(proxyName);
if (statisticsObject != null) {
return statisticsObject.getJmxObject();
}
return new StatisticsCompositeObject();
}
@Override
public StatisticsCompositeObject getSequenceJmxStatistics(String sequenceName) {
SummeryStatisticObject statisticsObject = sequenceStatistics.get(sequenceName);
if (statisticsObject != null) {
return statisticsObject.getJmxObject();
}
return new StatisticsCompositeObject();
}
@Override
public StatisticsCompositeObject getApiJmxStatistics(String apiName) {
SummeryStatisticObject statisticsObject = apiStatistics.get(apiName);
if (statisticsObject != null) {
return statisticsObject.getJmxObject();
}
return new StatisticsCompositeObject();
}
@Override
public StatisticsCompositeObject getInboundEndpointJmxStatistics(String inboundEndpointName) {
SummeryStatisticObject statisticsObject = inboundEndpointStatistics.get(inboundEndpointName);
if (statisticsObject != null) {
return statisticsObject.getJmxObject();
}
return new StatisticsCompositeObject();
}
@Override
public StatisticsCompositeObject getEndpointJmxStatistics(String endpointName) {
SummeryStatisticObject statisticsObject = endpointStatistics.get(endpointName);
if (statisticsObject != null) {
return statisticsObject.getJmxObject();
}
return new StatisticsCompositeObject();
}
@Override
public void destroy() {
MBeanRegistrar.getInstance().unRegisterMBean("Mediation Flow Statistic View", "MediationFlowStatisticView");
}
@Override
public void updateStatistics(PublishingFlow snapshot) {
for (PublishingEvent event : snapshot.getEvents()) {
String componentType = event.getComponentType();
//Mediator is the most common component type, therefore checking it first and ignoring will save time
if (!StatisticsConstants.FLOW_STATISTICS_MEDIATOR.equals(componentType)) {
if (StatisticsConstants.FLOW_STATISTICS_ENDPOINT.equals(componentType)) {
SummeryStatisticObject statisticObject = endpointStatistics.get(event.getComponentName());
if (statisticObject == null) {
endpointStatistics.put(event.getComponentName(), new SummeryStatisticObject(event));
} else {
statisticObject.updateStatistics(event);
}
} else if (StatisticsConstants.FLOW_STATISTICS_SEQUENCE.equals(componentType)) {
SummeryStatisticObject statisticObject = sequenceStatistics.get(event.getComponentName());
if (statisticObject == null) {
sequenceStatistics.put(event.getComponentName(), new SummeryStatisticObject(event));
} else {
statisticObject.updateStatistics(event);
}
} else if (StatisticsConstants.FLOW_STATISTICS_PROXYSERVICE.equals(componentType)) {
SummeryStatisticObject statisticObject = proxyStatistics.get(event.getComponentName());
if (statisticObject == null) {
proxyStatistics.put(event.getComponentName(), new SummeryStatisticObject(event));
} else {
statisticObject.updateStatistics(event);
}
} else if (StatisticsConstants.FLOW_STATISTICS_API.equals(componentType)) {
SummeryStatisticObject statisticObject = apiStatistics.get(event.getComponentName());
if (statisticObject == null) {
apiStatistics.put(event.getComponentName(), new SummeryStatisticObject(event));
} else {
statisticObject.updateStatistics(event);
}
} else if (StatisticsConstants.FLOW_STATISTICS_INBOUNDENDPOINT.equals(componentType)) {
SummeryStatisticObject statisticObject = inboundEndpointStatistics.get(event.getComponentName());
if (statisticObject == null) {
inboundEndpointStatistics.put(event.getComponentName(), new SummeryStatisticObject(event));
} else {
statisticObject.updateStatistics(event);
}
}
}
}
}
@Override
public int getTenantId() {
return tenantId;
}
@Override
public void setTenantId(int i) {
tenantId = i;
}
}