/* * Copyright 2016 Naver Corp. * * 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 com.navercorp.pinpoint.web.dao.hbase.stat; import com.navercorp.pinpoint.common.hbase.HBaseAdminTemplate; import com.navercorp.pinpoint.common.hbase.HBaseTables; import com.navercorp.pinpoint.common.server.bo.stat.ActiveTraceBo; import com.navercorp.pinpoint.common.server.bo.stat.AgentStatDataPoint; import com.navercorp.pinpoint.common.server.bo.stat.CpuLoadBo; import com.navercorp.pinpoint.common.server.bo.stat.DataSourceListBo; import com.navercorp.pinpoint.common.server.bo.stat.JvmGcBo; import com.navercorp.pinpoint.common.server.bo.stat.JvmGcDetailedBo; import com.navercorp.pinpoint.common.server.bo.stat.ResponseTimeBo; import com.navercorp.pinpoint.common.server.bo.stat.TransactionBo; import com.navercorp.pinpoint.web.dao.hbase.stat.compatibility.HbaseAgentStatDualReadDao; import com.navercorp.pinpoint.web.dao.stat.ActiveTraceDao; import com.navercorp.pinpoint.web.dao.stat.AgentStatDao; import com.navercorp.pinpoint.web.dao.stat.CpuLoadDao; import com.navercorp.pinpoint.web.dao.stat.DataSourceDao; import com.navercorp.pinpoint.web.dao.stat.JvmGcDao; import com.navercorp.pinpoint.web.dao.stat.JvmGcDetailedDao; import com.navercorp.pinpoint.web.dao.stat.ResponseTimeDao; import com.navercorp.pinpoint.web.dao.stat.TransactionDao; import org.apache.hadoop.hbase.TableName; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.beans.factory.FactoryBean; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Qualifier; import org.springframework.beans.factory.annotation.Value; import org.springframework.stereotype.Repository; /** * @author HyunGil Jeong */ abstract class AgentStatDaoFactory<T extends AgentStatDataPoint, D extends AgentStatDao<T>> { private final Logger logger = LoggerFactory.getLogger(this.getClass()); protected D v1; protected D v2; @Autowired private HBaseAdminTemplate adminTemplate; @Value("#{pinpointWebProps['web.stat.format.compatibility.version'] ?: 'v2'}") private String mode = "v2"; D getDao() throws Exception { logger.info("AgentStatDao Compatibility {}", mode); final TableName v1TableName = HBaseTables.AGENT_STAT; final TableName v2TableName = HBaseTables.AGENT_STAT_VER2; if (mode.equalsIgnoreCase("v2")) { if (this.adminTemplate.tableExists(v2TableName)) { return v2; } else { logger.error("AgentStatDao configured for v2, but {} table does not exist", v2TableName); throw new IllegalStateException(v2TableName + " table does not exist"); } } else if (mode.equalsIgnoreCase("compatibilityMode")) { boolean v1TableExists = this.adminTemplate.tableExists(v1TableName); boolean v2TableExists = this.adminTemplate.tableExists(v2TableName); if (v1TableExists && v2TableExists) { return getCompatibilityDao(this.v1, this.v2); } else { logger.error("AgentStatDao configured for compatibilityMode, but {} and {} tables do not exist", v1TableName, v2TableName); throw new IllegalStateException(v1TableName + ", " + v2TableName + " tables do not exist"); } } else { throw new IllegalStateException("Unknown AgentStatDao configuration : " + mode); } } abstract D getCompatibilityDao(D v1, D v2); @Repository("jvmGcDaoFactory") public static class JvmGcDaoFactory extends AgentStatDaoFactory<JvmGcBo, JvmGcDao> implements FactoryBean<JvmGcDao> { @Autowired public void setV1(@Qualifier("jvmGcDaoV1") JvmGcDao v1) { this.v1 = v1; } @Autowired public void setV2(@Qualifier("jvmGcDaoV2") JvmGcDao v2) { this.v2 = v2; } @Override public JvmGcDao getObject() throws Exception { return super.getDao(); } @Override public Class<?> getObjectType() { return JvmGcDao.class; } @Override public boolean isSingleton() { return true; } @Override JvmGcDao getCompatibilityDao(JvmGcDao v1, JvmGcDao v2) { return new HbaseAgentStatDualReadDao.JvmGcDualReadDao(v2, v1); } } @Repository("jvmGcDetailedDaoFactory") public static class JvmGcDetailedDaoFactory extends AgentStatDaoFactory<JvmGcDetailedBo, JvmGcDetailedDao> implements FactoryBean<JvmGcDetailedDao> { @Autowired public void setV1(@Qualifier("jvmGcDetailedDaoV1") JvmGcDetailedDao v1) { this.v1 = v1; } @Autowired public void setV2(@Qualifier("jvmGcDetailedDaoV2") JvmGcDetailedDao v2) { this.v2 = v2; } @Override public JvmGcDetailedDao getObject() throws Exception { return super.getDao(); } @Override public Class<?> getObjectType() { return JvmGcDetailedDao.class; } @Override public boolean isSingleton() { return true; } @Override JvmGcDetailedDao getCompatibilityDao(JvmGcDetailedDao v1, JvmGcDetailedDao v2) { return new HbaseAgentStatDualReadDao.JvmGcDetailedDualReadDao(v2, v1); } } @Repository("cpuLoadDaoFactory") public static class CpuLoadDaoFactory extends AgentStatDaoFactory<CpuLoadBo, CpuLoadDao> implements FactoryBean<CpuLoadDao> { @Autowired public void setV1(@Qualifier("cpuLoadDaoV1") CpuLoadDao v1) { this.v1 = v1; } @Autowired public void setV2(@Qualifier("cpuLoadDaoV2") CpuLoadDao v2) { this.v2 = v2; } @Override public CpuLoadDao getObject() throws Exception { return super.getDao(); } @Override public Class<?> getObjectType() { return CpuLoadDao.class; } @Override public boolean isSingleton() { return true; } @Override CpuLoadDao getCompatibilityDao(CpuLoadDao v1, CpuLoadDao v2) { return new HbaseAgentStatDualReadDao.CpuLoadDualReadDao(v2, v1); } } @Repository("transactionDaoFactory") public static class TransactionDaoFactory extends AgentStatDaoFactory<TransactionBo, TransactionDao> implements FactoryBean<TransactionDao> { @Autowired public void setV1(@Qualifier("transactionDaoV1") TransactionDao v1) { this.v1 = v1; } @Autowired public void setV2(@Qualifier("transactionDaoV2") TransactionDao v2) { this.v2 = v2; } @Override public TransactionDao getObject() throws Exception { return super.getDao(); } @Override public Class<?> getObjectType() { return TransactionDao.class; } @Override public boolean isSingleton() { return true; } @Override TransactionDao getCompatibilityDao(TransactionDao v1, TransactionDao v2) { return new HbaseAgentStatDualReadDao.TransactionDualReadDao(v2, v1); } } @Repository("activeTraceDaoFactory") public static class ActiveTraceDaoFactory extends AgentStatDaoFactory<ActiveTraceBo, ActiveTraceDao> implements FactoryBean<ActiveTraceDao> { @Autowired public void setV1(@Qualifier("activeTraceDaoV1") ActiveTraceDao v1) { this.v1 = v1; } @Autowired public void setV2(@Qualifier("activeTraceDaoV2") ActiveTraceDao v2) { this.v2 = v2; } @Override public ActiveTraceDao getObject() throws Exception { return super.getDao(); } @Override public Class<?> getObjectType() { return ActiveTraceDao.class; } @Override public boolean isSingleton() { return true; } @Override ActiveTraceDao getCompatibilityDao(ActiveTraceDao v1, ActiveTraceDao v2) { return new HbaseAgentStatDualReadDao.ActiveTraceDualReadDao(v2, v1); } } @Repository("dataSourceDaoFactory") public static class DataSourceDaoFactory extends AgentStatDaoFactory<DataSourceListBo, DataSourceDao> implements FactoryBean<DataSourceDao> { @Autowired public void setV1(@Qualifier("dataSourceDaoV1") DataSourceDao v1) { this.v1 = v1; } @Autowired public void setV2(@Qualifier("dataSourceDaoV2") DataSourceDao v2) { this.v2 = v2; } @Override public DataSourceDao getObject() throws Exception { return super.getDao(); } @Override public Class<?> getObjectType() { return DataSourceDao.class; } @Override public boolean isSingleton() { return true; } @Override DataSourceDao getCompatibilityDao(DataSourceDao v1, DataSourceDao v2) { return new HbaseAgentStatDualReadDao.DataSourceDualReadDao(v2, v1); } } @Repository("responseTimeDaoFactory") public static class ResponseTimeDaoFactory extends AgentStatDaoFactory<ResponseTimeBo, ResponseTimeDao> implements FactoryBean<ResponseTimeDao> { @Autowired public void setV1(@Qualifier("responseTimeDaoV1") ResponseTimeDao v1) { this.v1 = v1; } @Autowired public void setV2(@Qualifier("responseTimeDaoV2") ResponseTimeDao v2) { this.v2 = v2; } @Override public ResponseTimeDao getObject() throws Exception { return super.getDao(); } @Override public Class<?> getObjectType() { return ResponseTimeDao.class; } @Override public boolean isSingleton() { return true; } @Override ResponseTimeDao getCompatibilityDao(ResponseTimeDao v1, ResponseTimeDao v2) { return new HbaseAgentStatDualReadDao.ResponseTimeDualReadDao(v2, v1); } } }