package rocks.inspectit.server.instrumentation.config; import java.util.ArrayList; import java.util.Collection; import java.util.Collections; import org.apache.commons.collections.CollectionUtils; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Component; import rocks.inspectit.shared.all.instrumentation.config.impl.AgentConfig; import rocks.inspectit.shared.all.instrumentation.config.impl.ExceptionSensorTypeConfig; import rocks.inspectit.shared.all.instrumentation.config.impl.JmxAttributeDescriptor; import rocks.inspectit.shared.all.instrumentation.config.impl.JmxSensorTypeConfig; import rocks.inspectit.shared.all.instrumentation.config.impl.MethodSensorTypeConfig; import rocks.inspectit.shared.all.instrumentation.config.impl.PlatformSensorTypeConfig; import rocks.inspectit.shared.all.instrumentation.config.impl.StrategyConfig; import rocks.inspectit.shared.all.pattern.IMatchPattern; import rocks.inspectit.shared.all.pattern.PatternFactory; import rocks.inspectit.shared.cs.ci.Environment; import rocks.inspectit.shared.cs.ci.exclude.ExcludeRule; import rocks.inspectit.shared.cs.ci.sensor.exception.IExceptionSensorConfig; import rocks.inspectit.shared.cs.ci.sensor.jmx.JmxSensorConfig; import rocks.inspectit.shared.cs.ci.sensor.method.IMethodSensorConfig; import rocks.inspectit.shared.cs.ci.sensor.method.special.impl.ClassLoadingDelegationSensorConfig; import rocks.inspectit.shared.cs.ci.sensor.method.special.impl.MBeanServerInterceptorSensorConfig; import rocks.inspectit.shared.cs.ci.sensor.platform.IPlatformSensorConfig; import rocks.inspectit.shared.cs.ci.strategy.IStrategyConfig; import rocks.inspectit.shared.cs.cmr.service.IRegistrationService; /** * Configuration creator is responsible for creating the {@link AgentConfig} from the * {@link Environment}. * * @author Ivan Senic */ @Component public class ConfigurationCreator { /** * Registration service used. */ @Autowired private IRegistrationService registrationService; /** * {@link ConfigurationResolver}. */ @Autowired private ConfigurationResolver configurationResolver; /** * Returns proper configuration for the agent with the correctly set IDs for the agent and * sensors. * * @param environment * Defined {@link Environment} for the agent keep all configuration properties. * @param platformId * Id of the agent to create configuration for. * @return {@link AgentConfig}. */ public AgentConfig environmentToConfiguration(Environment environment, long platformId) { AgentConfig agentConfiguration = new AgentConfig(); agentConfiguration.setPlatformId(platformId); // then all platform sensors if (CollectionUtils.isNotEmpty(environment.getPlatformSensorConfigs())) { Collection<PlatformSensorTypeConfig> platformSensorTypeConfigs = new ArrayList<>(); for (IPlatformSensorConfig platformSensorConfig : environment.getPlatformSensorConfigs()) { if (platformSensorConfig.isActive()) { platformSensorTypeConfigs.add(getPlatformSensorTypeConfig(platformId, platformSensorConfig)); } } agentConfiguration.setPlatformSensorTypeConfigs(platformSensorTypeConfigs); } else { agentConfiguration.setPlatformSensorTypeConfigs(Collections.<PlatformSensorTypeConfig> emptyList()); } // then all method sensors if (CollectionUtils.isNotEmpty(environment.getMethodSensorConfigs())) { Collection<MethodSensorTypeConfig> methodSensorTypeConfigs = new ArrayList<>(); for (IMethodSensorConfig methodSensorConfig : environment.getMethodSensorConfigs()) { methodSensorTypeConfigs.add(getMethodSensorTypeConfig(platformId, methodSensorConfig)); } agentConfiguration.setMethodSensorTypeConfigs(methodSensorTypeConfigs); } else { agentConfiguration.setMethodSensorTypeConfigs(Collections.<MethodSensorTypeConfig> emptyList()); } IExceptionSensorConfig exceptionSensorConfig = environment.getExceptionSensorConfig(); if (null != exceptionSensorConfig) { agentConfiguration.setExceptionSensorTypeConfig(getExceptionSensorTypeConfig(platformId, exceptionSensorConfig)); } JmxSensorConfig jmxSensorConfig = environment.getJmxSensorConfig(); if ((null != jmxSensorConfig) && jmxSensorConfig.isActive()) { agentConfiguration.setJmxSensorTypeConfig(getJmxSensorTypeConfig(platformId, jmxSensorConfig)); } // then all special sensors Collection<MethodSensorTypeConfig> specialMethodSensorTypeConfigs = new ArrayList<>(0); if (environment.isClassLoadingDelegation()) { specialMethodSensorTypeConfigs.add(getMethodSensorTypeConfig(platformId, ClassLoadingDelegationSensorConfig.INSTANCE)); } if ((null != jmxSensorConfig) && jmxSensorConfig.isActive()) { specialMethodSensorTypeConfigs.add(getMethodSensorTypeConfig(platformId, MBeanServerInterceptorSensorConfig.INSTANCE)); } agentConfiguration.setSpecialMethodSensorTypeConfigs(specialMethodSensorTypeConfigs); // buffer strategy IStrategyConfig bufferStrategyConfig = environment.getBufferStrategyConfig(); agentConfiguration.setBufferStrategyConfig(new StrategyConfig(bufferStrategyConfig.getClassName(), bufferStrategyConfig.getSettings())); // sending strategy IStrategyConfig sendingStrategyConfig = environment.getSendingStrategyConfig(); agentConfiguration.setSendingStrategyConfig(new StrategyConfig(sendingStrategyConfig.getClassName(), sendingStrategyConfig.getSettings())); // retransformation strategy agentConfiguration.setRetransformationStrategy(environment.getRetransformationStrategy()); // exclude classes Collection<ExcludeRule> excludeRules = configurationResolver.getAllExcludeRules(environment); if (CollectionUtils.isNotEmpty(excludeRules)) { Collection<IMatchPattern> excludeClassesPatterns = new ArrayList<>(); for (ExcludeRule excludeRule : excludeRules) { excludeClassesPatterns.add(PatternFactory.getPattern(excludeRule.getClassName())); } agentConfiguration.setExcludeClassesPatterns(excludeClassesPatterns); } else { agentConfiguration.setExcludeClassesPatterns(Collections.<IMatchPattern> emptyList()); } // set configuration info agentConfiguration.setConfigurationInfo(configurationResolver.getConfigurationInfo(environment)); return agentConfiguration; } /** * Creates the agent based {@link PlatformSensorTypeConfig} with correctly registered ID. * * @param platformId * ID of the agent. * @param platformSensorConfig * {@link IPlatformSensorConfig} defined in the {@link Environment}. * @return {@link PlatformSensorTypeConfig}. */ private PlatformSensorTypeConfig getPlatformSensorTypeConfig(long platformId, IPlatformSensorConfig platformSensorConfig) { long id = registrationService.registerPlatformSensorTypeIdent(platformId, platformSensorConfig.getClassName()); PlatformSensorTypeConfig platformSensorTypeConfig = new PlatformSensorTypeConfig(); platformSensorTypeConfig.setId(id); platformSensorTypeConfig.setClassName(platformSensorConfig.getClassName()); platformSensorTypeConfig.setParameters(platformSensorConfig.getParameters()); return platformSensorTypeConfig; } /** * Creates the agent based {@link MethodSensorTypeConfig} with correctly registered ID. * * @param platformId * ID of the agent. * @param methodSensorConfig * {@link IMethodSensorConfig} defined in the {@link Environment}. * @return {@link MethodSensorTypeConfig}. */ private MethodSensorTypeConfig getMethodSensorTypeConfig(long platformId, IMethodSensorConfig methodSensorConfig) { long id = registrationService.registerMethodSensorTypeIdent(platformId, methodSensorConfig.getClassName(), methodSensorConfig.getParameters()); MethodSensorTypeConfig methodSensorTypeConfig = new MethodSensorTypeConfig(); methodSensorTypeConfig.setId(id); methodSensorTypeConfig.setClassName(methodSensorConfig.getClassName()); methodSensorTypeConfig.setParameters(methodSensorConfig.getParameters()); methodSensorTypeConfig.setName(methodSensorConfig.getName()); methodSensorTypeConfig.setPriority(methodSensorConfig.getPriority()); return methodSensorTypeConfig; } /** * Creates the agent based {@link ExceptionSensorTypeConfig} with correctly registered ID. * * @param platformId * ID of the agent. * @param exceptionSensorConfig * {@link IExceptionSensorConfig} defined in the {@link Environment}. * @return {@link ExceptionSensorTypeConfig}. */ private ExceptionSensorTypeConfig getExceptionSensorTypeConfig(long platformId, IExceptionSensorConfig exceptionSensorConfig) { long id = registrationService.registerMethodSensorTypeIdent(platformId, exceptionSensorConfig.getClassName(), exceptionSensorConfig.getParameters()); ExceptionSensorTypeConfig exceptionSensorTypeConfig = new ExceptionSensorTypeConfig(); exceptionSensorTypeConfig.setId(id); exceptionSensorTypeConfig.setClassName(exceptionSensorConfig.getClassName()); exceptionSensorTypeConfig.setParameters(exceptionSensorConfig.getParameters()); exceptionSensorTypeConfig.setName(exceptionSensorConfig.getName()); exceptionSensorTypeConfig.setEnhanced(exceptionSensorConfig.isEnhanced()); return exceptionSensorTypeConfig; } /** * Creates the agent based {@link JmxAttributeDescriptor} with correctly registered ID. * * @param platformId * ID of the agent. * @param jmxSensorConfig * {@link JmxAttributeDescriptor} defined in the {@link Environment}. * @return {@link JmxSensorTypeConfig}. */ private JmxSensorTypeConfig getJmxSensorTypeConfig(long platformId, JmxSensorConfig jmxSensorConfig) { long id = registrationService.registerJmxSensorTypeIdent(platformId, jmxSensorConfig.getClassName()); JmxSensorTypeConfig jmxSensorTypeConfig = new JmxSensorTypeConfig(); jmxSensorTypeConfig.setId(id); jmxSensorTypeConfig.setClassName(jmxSensorConfig.getClassName()); jmxSensorTypeConfig.setParameters(jmxSensorConfig.getParameters()); return jmxSensorTypeConfig; } }