/* * 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.web.dao.SampledAgentStatDao; import com.navercorp.pinpoint.web.dao.hbase.stat.compatibility.HbaseSampledAgentStatDualReadDao; import com.navercorp.pinpoint.web.dao.stat.SampledActiveTraceDao; import com.navercorp.pinpoint.web.dao.stat.SampledCpuLoadDao; import com.navercorp.pinpoint.web.dao.stat.SampledDataSourceDao; import com.navercorp.pinpoint.web.dao.stat.SampledJvmGcDao; import com.navercorp.pinpoint.web.dao.stat.SampledJvmGcDetailedDao; import com.navercorp.pinpoint.web.dao.stat.SampledResponseTimeDao; import com.navercorp.pinpoint.web.dao.stat.SampledTransactionDao; import com.navercorp.pinpoint.web.vo.stat.SampledActiveTrace; import com.navercorp.pinpoint.web.vo.stat.SampledAgentStatDataPoint; import com.navercorp.pinpoint.web.vo.stat.SampledCpuLoad; import com.navercorp.pinpoint.web.vo.stat.SampledDataSourceList; import com.navercorp.pinpoint.web.vo.stat.SampledJvmGc; import com.navercorp.pinpoint.web.vo.stat.SampledJvmGcDetailed; import com.navercorp.pinpoint.web.vo.stat.SampledResponseTime; import com.navercorp.pinpoint.web.vo.stat.SampledTransaction; 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 SampledAgentStatDaoFactory<S extends SampledAgentStatDataPoint, D extends SampledAgentStatDao<S>> { 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("SampledAgentStatDao 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("SampledAgentStatDao 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("SampledAgentStatDao 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 SampledAgentStatDao configuration : " + mode); } } abstract D getCompatibilityDao(D v1, D v2); @Repository("sampledJvmGcDaoFactory") public static class SampledJvmGcDaoFactory extends SampledAgentStatDaoFactory<SampledJvmGc, SampledJvmGcDao> implements FactoryBean<SampledJvmGcDao> { @Autowired public void setV1(@Qualifier("sampledJvmGcDaoV1") SampledJvmGcDao v1) { this.v1 = v1; } @Autowired public void setV2(@Qualifier("sampledJvmGcDaoV2") SampledJvmGcDao v2) { this.v2 = v2; } @Override public SampledJvmGcDao getObject() throws Exception { return super.getDao(); } @Override public Class<?> getObjectType() { return SampledJvmGcDao.class; } @Override public boolean isSingleton() { return true; } @Override SampledJvmGcDao getCompatibilityDao(SampledJvmGcDao v1, SampledJvmGcDao v2) { return new HbaseSampledAgentStatDualReadDao.SampledJvmGcDualReadDao(v2, v1); } } @Repository("sampledJvmGcDetailedDaoFactory") public static class SampledJvmGcDetailedDaoFactory extends SampledAgentStatDaoFactory<SampledJvmGcDetailed, SampledJvmGcDetailedDao> implements FactoryBean<SampledJvmGcDetailedDao> { @Autowired public void setV1(@Qualifier("sampledJvmGcDetailedDaoV1") SampledJvmGcDetailedDao v1) { this.v1 = v1; } @Autowired public void setV2(@Qualifier("sampledJvmGcDetailedDaoV2") SampledJvmGcDetailedDao v2) { this.v2 = v2; } @Override public SampledJvmGcDetailedDao getObject() throws Exception { return super.getDao(); } @Override public Class<?> getObjectType() { return SampledJvmGcDetailedDao.class; } @Override public boolean isSingleton() { return true; } @Override SampledJvmGcDetailedDao getCompatibilityDao(SampledJvmGcDetailedDao v1, SampledJvmGcDetailedDao v2) { return new HbaseSampledAgentStatDualReadDao.SampledJvmGcDetailedDualReadDao(v2, v1); } } @Repository("sampledCpuLoadDaoFactory") public static class SampledCpuLoadDaoFactory extends SampledAgentStatDaoFactory<SampledCpuLoad, SampledCpuLoadDao> implements FactoryBean<SampledCpuLoadDao> { @Autowired public void setV1(@Qualifier("sampledCpuLoadDaoV1") SampledCpuLoadDao v1) { this.v1 = v1; } @Autowired public void setV2(@Qualifier("sampledCpuLoadDaoV2") SampledCpuLoadDao v2) { this.v2 = v2; } @Override public SampledCpuLoadDao getObject() throws Exception { return super.getDao(); } @Override public Class<?> getObjectType() { return SampledCpuLoadDao.class; } @Override public boolean isSingleton() { return true; } @Override SampledCpuLoadDao getCompatibilityDao(SampledCpuLoadDao v1, SampledCpuLoadDao v2) { return new HbaseSampledAgentStatDualReadDao.SampledCpuLoadDualReadDao(v2, v1); } } @Repository("sampledTransactionDaoFactory") public static class SampledTransactionDaoFactory extends SampledAgentStatDaoFactory<SampledTransaction, SampledTransactionDao> implements FactoryBean<SampledTransactionDao> { @Autowired public void setV1(@Qualifier("sampledTransactionDaoV1") SampledTransactionDao v1) { this.v1 = v1; } @Autowired public void setV2(@Qualifier("sampledTransactionDaoV2") SampledTransactionDao v2) { this.v2 = v2; } @Override public SampledTransactionDao getObject() throws Exception { return super.getDao(); } @Override public Class<?> getObjectType() { return SampledTransactionDao.class; } @Override public boolean isSingleton() { return true; } @Override SampledTransactionDao getCompatibilityDao(SampledTransactionDao v1, SampledTransactionDao v2) { return new HbaseSampledAgentStatDualReadDao.SampledTransactionDualReadDao(v2, v1); } } @Repository("sampledActiveTraceDaoFactory") public static class SampledActiveTraceDaoFactory extends SampledAgentStatDaoFactory<SampledActiveTrace, SampledActiveTraceDao> implements FactoryBean<SampledActiveTraceDao> { @Autowired public void setV1(@Qualifier("sampledActiveTraceDaoV1") SampledActiveTraceDao v1) { this.v1 = v1; } @Autowired public void setV2(@Qualifier("sampledActiveTraceDaoV2") SampledActiveTraceDao v2) { this.v2 = v2; } @Override public SampledActiveTraceDao getObject() throws Exception { return super.getDao(); } @Override public Class<?> getObjectType() { return SampledActiveTraceDao.class; } @Override public boolean isSingleton() { return true; } @Override SampledActiveTraceDao getCompatibilityDao(SampledActiveTraceDao v1, SampledActiveTraceDao v2) { return new HbaseSampledAgentStatDualReadDao.SampledActiveTraceDualReadDao(v2, v1); } } @Repository("sampledDataSourceDaoFactory") public static class SampledDataSourceDaoFactory extends SampledAgentStatDaoFactory<SampledDataSourceList, SampledDataSourceDao> implements FactoryBean<SampledDataSourceDao> { @Autowired public void setV1(@Qualifier("sampledDataSourceDaoV1") SampledDataSourceDao v1) { this.v1 = v1; } @Autowired public void setV2(@Qualifier("sampledDataSourceDaoV2") SampledDataSourceDao v2) { this.v2 = v2; } @Override public SampledDataSourceDao getObject() throws Exception { return super.getDao(); } @Override public Class<?> getObjectType() { return SampledDataSourceDao.class; } @Override public boolean isSingleton() { return true; } @Override SampledDataSourceDao getCompatibilityDao(SampledDataSourceDao v1, SampledDataSourceDao v2) { return new HbaseSampledAgentStatDualReadDao.SampledDataSourceDualReadDao(v2, v1); } } @Repository("sampledResponseTimeDaoFactory") public static class SampledResponseTimeDaoFactory extends SampledAgentStatDaoFactory<SampledResponseTime, SampledResponseTimeDao> implements FactoryBean<SampledResponseTimeDao> { @Autowired public void setV1(@Qualifier("sampledResponseTimeDaoV1") SampledResponseTimeDao v1) { this.v1 = v1; } @Autowired public void setV2(@Qualifier("sampledResponseTimeDaoV2") SampledResponseTimeDao v2) { this.v2 = v2; } @Override public SampledResponseTimeDao getObject() throws Exception { return super.getDao(); } @Override public Class<?> getObjectType() { return SampledResponseTimeDao.class; } @Override public boolean isSingleton() { return true; } @Override SampledResponseTimeDao getCompatibilityDao(SampledResponseTimeDao v1, SampledResponseTimeDao v2) { return new HbaseSampledAgentStatDualReadDao.SampledResponseTimeDualReadDao(v2, v1); } } }