package rocks.inspectit.server.instrumentation.config.applier;
import rocks.inspectit.shared.all.instrumentation.classcache.ClassType;
import rocks.inspectit.shared.all.instrumentation.classcache.MethodType;
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.MethodInstrumentationConfig;
import rocks.inspectit.shared.all.instrumentation.config.impl.SensorInstrumentationPoint;
import rocks.inspectit.shared.cs.ci.Environment;
import rocks.inspectit.shared.cs.ci.assignment.AbstractClassSensorAssignment;
import rocks.inspectit.shared.cs.ci.assignment.impl.ExceptionSensorAssignment;
import rocks.inspectit.shared.cs.cmr.service.IRegistrationService;
/**
* Instrumentation applier for the {@link ExceptionSensorAssignment}.
*
* @author Ivan Senic
*
*/
public class ExceptionSensorInstrumentationApplier extends AbstractSensorInstrumentationApplier {
/**
* {@link ExceptionSensorAssignment} that defines instrumentation configuration.
*/
private final ExceptionSensorAssignment exceptionSensorAssignment;
/**
* Default constructor.
*
* @param exceptionSensorAssignment
* {@link ExceptionSensorAssignment} that defines instrumentation configuration.
* @param environment
* Environment belonging to the assignment.
* @param registrationService
* Registration service needed for registration of the IDs.
*/
public ExceptionSensorInstrumentationApplier(ExceptionSensorAssignment exceptionSensorAssignment, Environment environment, IRegistrationService registrationService) {
super(environment, registrationService);
this.exceptionSensorAssignment = exceptionSensorAssignment;
}
/**
* {@inheritDoc}
*/
@Override
public AbstractClassSensorAssignment<?> getSensorAssignment() {
return exceptionSensorAssignment;
}
/**
* {@inheritDoc}
*/
@Override
protected boolean matches(ClassType classType) {
return classType.isException() && getClassSensorAssignmentFilter().matches(exceptionSensorAssignment, classType);
}
/**
* {@inheritDoc}
*/
@Override
protected boolean matches(MethodType methodType) {
// only real constructors, exclude static constructors here directly
return MethodType.Character.CONSTRUCTOR.equals(methodType.getMethodCharacter());
}
/**
* {@inheritDoc}
*/
@Override
protected void applyAssignment(AgentConfig agentConfiguration, MethodType methodType, MethodInstrumentationConfig methodInstrumentationConfig) {
SensorInstrumentationPoint sensorInstrumentationPoint = getOrCreateSensorInstrumentationPoint(agentConfiguration, methodType, methodInstrumentationConfig);
applyAssignment(agentConfiguration, sensorInstrumentationPoint);
}
/**
* {@inheritDoc}
*/
protected void applyAssignment(AgentConfig agentConfiguration, SensorInstrumentationPoint sensorInstrumentationPoint) {
// there can be only one exception sensor so I just take the id
ExceptionSensorTypeConfig exceptionSensorTypeConfig = agentConfiguration.getExceptionSensorTypeConfig();
long sensorId = exceptionSensorTypeConfig.getId();
// set to rsc
sensorInstrumentationPoint.addSensorId(sensorId, exceptionSensorTypeConfig.getPriority());
// add all settings
sensorInstrumentationPoint.addSettings(exceptionSensorAssignment.getSettings());
}
}