Package com.dianping.cat.consumer.metric

Source Code of com.dianping.cat.consumer.metric.MetricConfigManager

package com.dianping.cat.consumer.metric;

import java.io.IOException;
import java.util.ArrayList;
import java.util.Collection;
import java.util.Collections;
import java.util.Comparator;
import java.util.Date;
import java.util.HashSet;
import java.util.List;
import java.util.Map;
import java.util.Map.Entry;
import java.util.Set;

import org.codehaus.plexus.personality.plexus.lifecycle.phase.Initializable;
import org.codehaus.plexus.personality.plexus.lifecycle.phase.InitializationException;
import org.unidal.dal.jdbc.DalException;
import org.unidal.dal.jdbc.DalNotFoundException;
import org.unidal.helper.Files;
import org.unidal.lookup.annotation.Inject;
import org.unidal.lookup.util.StringUtils;
import org.xml.sax.SAXException;

import com.dianping.cat.Cat;
import com.dianping.cat.advanced.metric.config.entity.MetricConfig;
import com.dianping.cat.advanced.metric.config.entity.MetricItemConfig;
import com.dianping.cat.advanced.metric.config.entity.Tag;
import com.dianping.cat.advanced.metric.config.transform.DefaultSaxParser;
import com.dianping.cat.consumer.company.model.entity.ProductLine;
import com.dianping.cat.consumer.metric.MetricAnalyzer.ConfigItem;
import com.dianping.cat.core.config.Config;
import com.dianping.cat.core.config.ConfigDao;
import com.dianping.cat.core.config.ConfigEntity;

public class MetricConfigManager implements Initializable {

  @Inject
  protected ConfigDao m_configDao;

  @Inject
  private ProductLineConfigManager m_productLineConfigManager;

  private int m_configId;

  private MetricConfig m_metricConfig;

  private long m_modifyTime;

  private static final String CONFIG_NAME = "metricConfig";

  public static final String DEFAULT_TAG = "业务大盘";

  public String buildMetricKey(String domain, String type, String metricKey) {
    return domain + ":" + type + ":" + metricKey;
  }

  public boolean deleteDomainConfig(String key) {
    getMetricConfig().removeMetricItemConfig(key);
    return storeConfig();
  }

  private void deleteUnusedConfig() {
    try {
      Map<String, MetricItemConfig> configs = m_metricConfig.getMetricItemConfigs();
      List<String> unused = new ArrayList<String>();

      for (MetricItemConfig config : configs.values()) {
        String domain = config.getDomain();
        String productLine = m_productLineConfigManager.queryProductLineByDomain(domain);
        ProductLine product = m_productLineConfigManager.queryProductLine(productLine);

        if (product == null || !product.isMetricDashboard()) {
          unused.add(config.getId());
        }
      }
      for (String id : unused) {
        m_metricConfig.removeMetricItemConfig(id);
      }
      storeConfig();
    } catch (Exception e) {
      e.printStackTrace();
    }
  }

  public MetricConfig getMetricConfig() {
    synchronized (this) {
      return m_metricConfig;
    }
  }

  @Override
  public void initialize() throws InitializationException {
    try {
      Config config = m_configDao.findByName(CONFIG_NAME, ConfigEntity.READSET_FULL);
      String content = config.getContent();

      m_configId = config.getId();
      m_metricConfig = DefaultSaxParser.parse(content);
      m_modifyTime = config.getModifyDate().getTime();
    } catch (DalNotFoundException e) {
      try {
        String content = Files.forIO().readFrom(
              this.getClass().getResourceAsStream("/config/default-metric-config.xml"), "utf-8");
        Config config = m_configDao.createLocal();

        config.setName(CONFIG_NAME);
        config.setContent(content);
        m_configDao.insert(config);

        m_configId = config.getId();
        m_metricConfig = DefaultSaxParser.parse(content);
        m_modifyTime = new Date().getTime();
      } catch (Exception ex) {
        Cat.logError(ex);
      }
    } catch (Exception e) {
      Cat.logError(e);
    }
    if (m_metricConfig == null) {
      m_metricConfig = new MetricConfig();
    }

    deleteUnusedConfig();
  }

  public boolean insertIfNotExist(String domain, String type, String metricKey, ConfigItem item) {
    String key = buildMetricKey(domain, type, metricKey);
    MetricItemConfig config = m_metricConfig.findMetricItemConfig(key);

    if (config != null) {
      return true;
    } else {
      config = new MetricItemConfig();

      config.setId(key);
      config.setDomain(domain);
      config.setType(type);
      config.setMetricKey(metricKey);
      config.setTitle(item.getTitle());
      config.setShowAvg(item.isShowAvg());
      config.setShowCount(item.isShowCount());
      config.setShowSum(item.isShowSum());
      return insertMetricItemConfig(config);
    }
  }

  public boolean insertMetricItemConfig(MetricItemConfig config) {
    getMetricConfig().addMetricItemConfig(config);

    return storeConfig();
  }

  public MetricItemConfig queryMetricItemConfig(String id) {
    return getMetricConfig().findMetricItemConfig(id);
  }

  public List<MetricItemConfig> queryMetricItemConfigs(Collection<String> domains) {
    List<MetricItemConfig> configs = new ArrayList<MetricItemConfig>();
    Map<String, MetricItemConfig> metricConfig = getMetricConfig().getMetricItemConfigs();

    for (Entry<String, MetricItemConfig> entry : metricConfig.entrySet()) {
      MetricItemConfig item = entry.getValue();

      if (domains.contains(item.getDomain())) {
        configs.add(item);
      }
    }
    Collections.sort(configs, new Comparator<MetricItemConfig>() {

      @Override
      public int compare(MetricItemConfig m1, MetricItemConfig m2) {
        return (int) ((m1.getViewOrder() - m2.getViewOrder()) * 100);
      }
    });
    return configs;
  }

  public List<MetricItemConfig> queryMetricItemConfigs(String tag) {
    List<MetricItemConfig> metricItemConfigs = new ArrayList<MetricItemConfig>();

    try {
      Collection<MetricItemConfig> configs = getMetricConfig().getMetricItemConfigs().values();

      for (MetricItemConfig metricItemConfig : configs) {
        for (Tag itemTag : metricItemConfig.getTags()) {
          String tagName = itemTag.getName();

          if (tag.equals(tagName)) {
            metricItemConfigs.add(metricItemConfig);
            break;
          }
        }
      }
    } catch (Exception ex) {
      Cat.logError(ex);
    }
    return metricItemConfigs;
  }

  public List<String> queryTags() {
    Set<String> tags = new HashSet<String>();
    try {
      Collection<MetricItemConfig> configs = getMetricConfig().getMetricItemConfigs().values();

      for (MetricItemConfig metricItemConfig : configs) {
        for (Tag tag : metricItemConfig.getTags()) {
          String tagName = tag.getName();
          if (!StringUtils.isEmpty(tagName)) {
            tags.add(tagName);
          }
        }
      }
    } catch (Exception ex) {
      Cat.logError(ex);
    }
    List<String> result = new ArrayList<String>(tags);
    Collections.sort(result, new Comparator<String>() {

      @Override
      public int compare(String o1, String o2) {
        if (o1.equals(DEFAULT_TAG)) {
          return -1;
        }
        if (o2.endsWith(DEFAULT_TAG)) {
          return 1;
        }
        return o1.compareTo(o2);
      }
    });

    return result;
  }

  public void refreshMetricConfig() throws DalException, SAXException, IOException {
    Config config = m_configDao.findByName(CONFIG_NAME, ConfigEntity.READSET_FULL);
    long modifyTime = config.getModifyDate().getTime();

    synchronized (this) {
      if (modifyTime > m_modifyTime) {
        String content = config.getContent();
        MetricConfig metricConfig = DefaultSaxParser.parse(content);

        m_metricConfig = metricConfig;
        m_modifyTime = modifyTime;
      }
    }
  }

  private boolean storeConfig() {
    synchronized (this) {
      try {
        Config config = m_configDao.createLocal();

        config.setId(m_configId);
        config.setKeyId(m_configId);
        config.setName(CONFIG_NAME);
        config.setContent(getMetricConfig().toString());
        m_configDao.updateByPK(config, ConfigEntity.UPDATESET_FULL);
      } catch (Exception e) {
        Cat.logError(e);
        return false;
      }
    }
    return true;
  }

}
TOP

Related Classes of com.dianping.cat.consumer.metric.MetricConfigManager

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.