Package com.linkedin.databus.container.request

Source Code of com.linkedin.databus.container.request.RelayContainerStatsRequestProcessor

package com.linkedin.databus.container.request;
/*
*
* Copyright 2013 LinkedIn Corp. All rights reserved
*
* 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.
*
*/
import java.io.IOException;
import java.util.concurrent.ExecutorService;

import org.jboss.netty.handler.codec.http.HttpMethod;

import com.linkedin.databus.container.netty.HttpRelay;
import com.linkedin.databus.core.monitoring.mbean.DbusEventStatsCollectorsPartitioner;
import com.linkedin.databus.core.monitoring.mbean.DbusEventsStatisticsCollector;
import com.linkedin.databus.core.monitoring.mbean.DbusEventsTotalStats;
import com.linkedin.databus.core.monitoring.mbean.StatsCollectors;
import com.linkedin.databus2.core.container.request.ContainerStatsRequestProcessor;
import com.linkedin.databus2.core.container.request.DatabusRequest;
import com.linkedin.databus2.core.container.request.RequestProcessingException;

/**
*
* ContainerStatsRequestProcessor for HTTP Relay
*/
public class RelayContainerStatsRequestProcessor extends ContainerStatsRequestProcessor
{

  private final HttpRelay _relay;

  public RelayContainerStatsRequestProcessor(ExecutorService executorService,
                                             HttpRelay relay)
  {
    super(executorService, relay);
    _relay = relay;
  }

  @Override
  public boolean doProcess(String category, DatabusRequest request) throws IOException,
      RequestProcessingException
  {
    /**
     * If this is a /[in|out]bound/events/psource type query, we will intercept to check if this
     * is a stats request at DB aggregate level.
     *
     * Query Structure:
     *<pre>
     * Partition Level query :
     *    http://<RelayHost>:<RelayPort>/containerStats/inbound/events/psource/<DB>:<Partition>
     * DB Aggregate Level
     *    http://<RelayHost>:<RelayPort>/containerStats/inbound/events/psource/<DB>
     *
     * More documentation found in
     *  https://iwww.corp.linkedin.com/wiki/cf/display/ENGS/Databus+v2.0++Protocol#Databusv2.0Protocol-EventBufferStatistics
     * </pre>
     */
    if (category.startsWith(INBOUND_EVENTS_PSOURCE_PREFIX))
    {
      processStats(_relay.getInBoundStatsCollectors(),
                                       _relay.getDbInboundStatsCollectors(),
                                       INBOUND_EVENTS_PSOURCE_PREFIX, request);
      return true;
    }
    else if (category.startsWith(OUTBOUND_EVENTS_PSOURCE_PREFIX))
    {
      processStats(_relay.getOutBoundStatsCollectors(),
                                       _relay.getDbOutboundStatsCollectors(),
                                       OUTBOUND_EVENTS_PSOURCE_PREFIX, request);
      return true;
    }
    else
    {
      return super.doProcess(category, request);
    }
  }

  private void processStats(StatsCollectors<DbusEventsStatisticsCollector> globalStatsCollector,
                            DbusEventStatsCollectorsPartitioner resourceGroupStatsCollector,
                            String prefix,
                            DatabusRequest request)
      throws IOException, RequestProcessingException
  {
    String reqPathStr = request.getParams().getProperty(DatabusRequest.PATH_PARAM_NAME);
    String reqPathSuffix = reqPathStr.substring(prefix.length());
    // allow DBNAME/partitionid for REST api
    reqPathSuffix = reqPathSuffix.replace('/', ':');

    DbusEventsTotalStats sourceStats = null;
    if (reqPathSuffix.contains(":"))
    {
      // This is a request for a specific partition
      if (null != globalStatsCollector)
      {
        DbusEventsStatisticsCollector s =
            globalStatsCollector.getStatsCollector(reqPathSuffix);
        sourceStats = (s == null) ? null : s.getTotalStats();
      }
    }
    else
    {
      // This is a request at DB aggregate level
      if (null != resourceGroupStatsCollector)
      {
        StatsCollectors<DbusEventsStatisticsCollector> c =
                  resourceGroupStatsCollector.getDBStatsCollector(reqPathSuffix);
        if (null != c)
          sourceStats = c.getStatsCollector().getTotalStats();
      }
    }

    if (null == sourceStats)
    {
      LOG.warn("No Stats for this source=" + request.getName() + ", prefix=" + prefix
          + ", DB/Physical Partition String=" + reqPathSuffix);
      sourceStats = new DbusEventsTotalStats(0, reqPathSuffix, false, false, null);
    }

    writeJsonObjectToResponse(sourceStats, request);

    if (request.getRequestType() == HttpMethod.PUT
        || request.getRequestType() == HttpMethod.POST)
    {
      enableOrResetStatsMBean(sourceStats, request);
    }
  }
}
TOP

Related Classes of com.linkedin.databus.container.request.RelayContainerStatsRequestProcessor

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.