Package org.wso2.carbon.bam.data.publisher.servicestats.modules

Source Code of org.wso2.carbon.bam.data.publisher.servicestats.modules.StatisticsHandler

/*
* Copyright 2004,2005 The Apache Software Foundation.
*
* Licensed 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.wso2.carbon.bam.data.publisher.servicestats.modules;

import org.apache.axis2.AxisFault;
import org.apache.axis2.context.MessageContext;
import org.apache.axis2.engine.AxisConfiguration;
import org.apache.axis2.handlers.AbstractHandler;
import org.apache.axis2.wsdl.WSDLConstants;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.wso2.carbon.bam.data.publisher.servicestats.PublisherUtils;
import org.wso2.carbon.bam.data.publisher.servicestats.config.EventingConfigData;
import org.wso2.carbon.bam.data.publisher.servicestats.data.CountData;
import org.wso2.carbon.bam.data.publisher.servicestats.data.OperationStatisticData;
import org.wso2.carbon.bam.data.publisher.servicestats.data.ServiceStatisticData;
import org.wso2.carbon.bam.data.publisher.servicestats.data.StatisticData;
import org.wso2.carbon.bam.data.publisher.servicestats.internal.StatisticsServiceComponent;
import org.wso2.carbon.core.multitenancy.SuperTenantCarbonContext;
import org.wso2.carbon.statistics.services.SystemStatisticsUtil;
import org.wso2.carbon.statistics.services.util.OperationStatistics;
import org.wso2.carbon.statistics.services.util.ServiceStatistics;
import org.wso2.carbon.statistics.services.util.SystemStatistics;

import java.util.ArrayList;
import java.util.Collection;


public class StatisticsHandler extends AbstractHandler {
    private static Log log = LogFactory.getLog(StatisticsHandler.class);

    @Override
    public InvocationResponse invoke(MessageContext msgContext) throws AxisFault {

        try {

            CountData countData = StatisticsServiceComponent.getCountData();
            SystemStatisticsUtil systemStatisticsUtil = StatisticsServiceComponent.getSystemStatisticsUtil();
            EventingConfigData eventingConfigData = StatisticsServiceComponent.getServiceStatisticsPublisherAdmin()
                    .getEventingConfigData();

            if (eventingConfigData != null && eventingConfigData.eventingEnabled()
                    && eventingConfigData.getSystemRequestCountThreshold() > 0) {
                SystemStatistics systemStatistics = systemStatisticsUtil.getSystemStatistics(msgContext
                        .getConfigurationContext().getAxisConfiguration());

                if (msgContext.getAxisOperation() != null) {
                    OperationStatistics operationStatistics = systemStatisticsUtil.getOperationStatistics(
                            msgContext.getAxisOperation());
                    if (operationStatistics.getRequestCount() == 0) {
                        return InvocationResponse.CONTINUE;
                    }
                }//In very rare cases msgContext.getAxisOperation() becomes null, then we can't get statistics.
                else {
                    return InvocationResponse.CONTINUE;
                }

                Collection<ServiceStatisticData> latestServiceStats = updateAndGetLatestServiceStatistics(
                        systemStatisticsUtil,
                        countData,
                        msgContext);
                Collection<OperationStatisticData> latestOperationStats = updateAndGetLatestOperationStatistics(
                        systemStatisticsUtil,
                        countData,
                        msgContext);

                int lastCount = countData.getSystemCount();
                // Current hit count for system
                int currentCount = systemStatistics.getRequestCount();


                if (currentCount - lastCount > eventingConfigData.getSystemRequestCountThreshold()) {

                    countData.setSystemCount(currentCount);

                    getStatisticAndPublish(msgContext, systemStatistics, latestServiceStats, latestOperationStats);
                }

            }

        } catch (Throwable ignore) {
            log.error("Error at StatisticsHandler. " +
                    "But continuing message processing for message id: " +
                    msgContext.getMessageID(), ignore);
        }

        return InvocationResponse.CONTINUE;
    }

    private void getStatisticAndPublish(MessageContext msgContext, SystemStatistics systemStatistics,
                                        Collection<ServiceStatisticData> latestServiceStats,
                                        Collection<OperationStatisticData> latestOperationStats) {
        StatisticData statisticData = new StatisticData();
        statisticData.setMsgCtxOfStatData(msgContext);
        statisticData.setSystemStatistics(systemStatistics);
        statisticData.setOperationStatisticsList(latestOperationStats);
        statisticData.setServiceStatisticsList(latestServiceStats);
        try {
            PublisherUtils.publishEvent(statisticData);
        } catch (Exception e) {
            log.error("StatisticsHandler - Unable to send event for message" + " message id: " +
                    msgContext.getMessageID(), e);
        }
    }


    private Collection<ServiceStatisticData> updateAndGetLatestServiceStatistics(SystemStatisticsUtil systemStatisticsUtil, CountData countData,
                                                                                 MessageContext msgContext) throws AxisFault {
        AxisConfiguration axisConfig = msgContext.getConfigurationContext().getAxisConfiguration();
        int tenantID = SuperTenantCarbonContext.getCurrentContext(axisConfig).getTenantId();

        String serviceName = msgContext.getAxisService().getName();

        ServiceStatistics serviceStatistics = systemStatisticsUtil.getServiceStatistics(msgContext.getAxisService());

        ServiceStatisticData serviceStatisticData = new ServiceStatisticData();
        serviceStatisticData.setServiceStatistics(serviceStatistics);
        serviceStatisticData.setServiceName(serviceName);
        serviceStatisticData.setTenantId(tenantID);
        //This flag is used to identify which services has updated from last triggered event.
        serviceStatisticData.setUpdateFlag(true);


        //TODO:need to synchronized the copy part
        Collection<ServiceStatisticData> newCollection = new ArrayList<ServiceStatisticData>();
        countData.setServiceStats(serviceName, serviceStatisticData);
        //Keep a copy otherwise data will change later
        newCollection.addAll(countData.getAllLatestServiceStatistics());
        return newCollection;
    }

    private Collection<OperationStatisticData> updateAndGetLatestOperationStatistics(SystemStatisticsUtil systemStatisticsUtil, CountData countData,
                                                                                     MessageContext msgContext) throws AxisFault {

        AxisConfiguration axisConfig = msgContext.getConfigurationContext().getAxisConfiguration();
        int tenantID = SuperTenantCarbonContext.getCurrentContext(axisConfig).getTenantId();

        String operationName = msgContext.getAxisService().getName() + "-"
                + msgContext.getAxisOperation().getName().getLocalPart();
        OperationStatistics operationStatistics = systemStatisticsUtil.getOperationStatistics(msgContext.getAxisOperation());

        OperationStatisticData operationStatisticData = new OperationStatisticData();
        operationStatisticData.setOperationStatistics(operationStatistics);
        operationStatisticData.setTenantId(tenantID);
        operationStatisticData.setServiceName(msgContext.getAxisService().getName());
        operationStatisticData.setOperationName(msgContext.getAxisOperation().getName().getLocalPart());
        operationStatisticData.setUpdateFlag(true);
        //TODO:need to synchronized the copy part
        Collection<OperationStatisticData> newCollection = new ArrayList<OperationStatisticData>();

        countData.setOperationStats(operationName, operationStatisticData);
        //Keep a copy otherwise data will change later
        newCollection.addAll(countData.getAllLatestOperationStatistics());
        return newCollection;
    }
}
TOP

Related Classes of org.wso2.carbon.bam.data.publisher.servicestats.modules.StatisticsHandler

TOP
Copyright © 2018 www.massapi.com. All rights reserved.
All source code are property of their respective owners. Java is a trademark of Sun Microsystems, Inc and owned by ORACLE Inc. Contact coftware#gmail.com.