use of org.iobserve.common.record.ExtendedAfterOperationEvent in project iobserve-analysis by research-iobserve.
the class SessionAndTraceRegistrationFilterForJPetstore method doFilter.
/**
* Register thread-local session and trace information, executes the given {@link FilterChain}
* and unregisters the session/trace information. If configured, the execution of this filter is
* also logged to the {@link IMonitoringController}. This method returns immediately if
* monitoring is not enabled.
*
* @param request
* The request.
* @param response
* The response.
* @param chain
* The filter chain to be used.
*
* @throws IOException
* on io errors
* @throws ServletException
* on servlet errors
*/
@Override
public void doFilter(final ServletRequest request, final ServletResponse response, final FilterChain chain) throws IOException, ServletException {
if (SessionAndTraceRegistrationFilterForJPetstore.CTRLINST.isMonitoringEnabled()) {
// if (CTRLINST.isProbeActivated(this.filterOperationSignatureString)) {
String operationSignature;
final String componentSignature;
final String method;
final String path;
final String sessionId;
final List<CallInformation> callInformations = new ArrayList<>();
String query = null;
String[] queryParameters = null;
if (request instanceof HttpServletRequest) {
final HttpServletRequest httpRequest = (HttpServletRequest) request;
method = httpRequest.getMethod();
final String requestPath = httpRequest.getRequestURI().replace('/', '.').substring(1);
// remove sessionId from request Path
path = requestPath.contains(";") ? requestPath.substring(0, requestPath.indexOf(";")) : requestPath;
sessionId = httpRequest.getSession().getId();
query = httpRequest.getQueryString();
if (query == null) {
query = "";
} else {
queryParameters = this.andPattern.split(query);
}
} else {
method = "POST";
path = request.getServletContext().getContextPath().replace('/', '.').substring(1);
sessionId = "<no session>";
query = "";
}
final String trimmedPath = path;
TraceMetadata trace = SessionAndTraceRegistrationFilterForJPetstore.TRACEREGISTRY.getTrace();
final boolean newTrace = trace == null;
if (newTrace) {
SessionRegistry.INSTANCE.storeThreadLocalSessionId(sessionId);
trace = SessionAndTraceRegistrationFilterForJPetstore.TRACEREGISTRY.registerTrace();
SessionAndTraceRegistrationFilterForJPetstore.CTRLINST.newMonitoringRecord(trace);
}
if ("GET".equals(method)) {
if (queryParameters != null) {
// pattern ="jpetstore\\.actions\\."
operationSignature = trimmedPath + "." + this.equalsPattern.matcher(queryParameters[0]).replaceAll("") + "()";
// is operation called with parameters
if (queryParameters.length > 1) {
// then add the parameters as call informations
for (int i = 1; i < queryParameters.length; i++) {
final String[] queryParameterSplit = this.equalsPattern.split(queryParameters[i]);
callInformations.add(new CallInformation(queryParameterSplit[i], SessionAndTraceRegistrationFilterForJPetstore.INFORMATION_VALUE));
}
}
// pattern = "\\.action\\."
operationSignature = this.removeActionOfOperationPattern.matcher(operationSignature).replaceAll("");
} else {
// pattern = "\\w*\\.actions\\."
if (this.isActionPattern.matcher(trimmedPath).matches()) {
SessionAndTraceRegistrationFilterForJPetstore.LOGGER.debug("ACTION");
// pattern ="jpetstore\\.actions\\."
operationSignature = trimmedPath + "()";
// pattern = "\\.action\\("
operationSignature = this.removeActionOfIndexPattern.matcher(operationSignature).replaceAll(".index(");
// pattern "\\w*\\.images\\."
} else if (this.isImagePattern.matcher(trimmedPath).matches()) {
SessionAndTraceRegistrationFilterForJPetstore.LOGGER.debug("IMAGE");
operationSignature = trimmedPath;
} else {
SessionAndTraceRegistrationFilterForJPetstore.LOGGER.debug("ELSE");
operationSignature = trimmedPath + "()";
}
}
} else if ("POST".equals(method)) {
operationSignature = trimmedPath + "()";
// matches "(\\w*\\.)*Account\\..*" ?
if (this.isAccountPattern.matcher(operationSignature).matches()) {
// post on the account is always a login
// pattern = "\\.action\\("
operationSignature = this.removeActionOfIndexPattern.matcher(operationSignature).replaceAll(".login(");
} else if (this.isCatalogPattern.matcher(operationSignature).matches()) {
// post on the account is always a login
// pattern = "\\.action\\("
operationSignature = this.removeActionOfIndexPattern.matcher(operationSignature).replaceAll(".search(");
}
// pattern = "\\.action\\."
operationSignature = this.removeActionOfIndexPattern.matcher(operationSignature).replaceAll(".index(");
} else {
chain.doFilter(request, response);
return;
}
componentSignature = this.pathStrucPattern.matcher(operationSignature).replaceAll("");
SessionAndTraceRegistrationFilterForJPetstore.LOGGER.info(operationSignature);
final long traceId = trace.getTraceId();
try {
// mapps Object to String
final ObjectMapper objectMapper = new ObjectMapper();
SessionAndTraceRegistrationFilterForJPetstore.CTRLINST.newMonitoringRecord(new BeforeOperationEvent(SessionAndTraceRegistrationFilterForJPetstore.TIMESOURCE.getTime(), traceId, trace.getNextOrderId(), operationSignature, componentSignature));
chain.doFilter(request, response);
SessionAndTraceRegistrationFilterForJPetstore.CTRLINST.newMonitoringRecord(new ExtendedAfterOperationEvent(SessionAndTraceRegistrationFilterForJPetstore.TIMESOURCE.getTime(), traceId, trace.getNextOrderId(), operationSignature, componentSignature, objectMapper.writeValueAsString(callInformations)));
} catch (final Throwable th) {
// NOPMD NOCS (catch throw is ok here)
SessionAndTraceRegistrationFilterForJPetstore.CTRLINST.newMonitoringRecord(new AfterOperationFailedEvent(SessionAndTraceRegistrationFilterForJPetstore.TIMESOURCE.getTime(), traceId, trace.getNextOrderId(), operationSignature, componentSignature, th.toString()));
throw new ServletException(th);
} finally {
// is this correct?
SessionAndTraceRegistrationFilterForJPetstore.SESSION_REGISTRY.unsetThreadLocalSessionId();
// Reset the thread-local trace information
if (newTrace) {
// close the trace
SessionAndTraceRegistrationFilterForJPetstore.TRACEREGISTRY.unregisterTrace();
}
}
// } else {
// chain.doFilter(request, response);
// return;
// }
} else {
chain.doFilter(request, response);
}
}
use of org.iobserve.common.record.ExtendedAfterOperationEvent in project iobserve-analysis by research-iobserve.
the class SessionAndTraceRegistrationFilterForJPetstoreAttributeCoding method doFilter.
/**
* Register thread-local session and trace information, executes the given {@link FilterChain}
* and unregisters the session/trace information. If configured, the execution of this filter is
* also logged to the {@link IMonitoringController}. This method returns immediately if
* monitoring is not enabled.
*
* @param request
* The request.
* @param response
* The response.
* @param chain
* The filter chain to be used.
*
* @throws IOException
* on io errors
* @throws ServletException
* on servlet errors
*/
@Override
public void doFilter(final ServletRequest request, final ServletResponse response, final FilterChain chain) throws IOException, ServletException {
if (SessionAndTraceRegistrationFilterForJPetstoreAttributeCoding.CTRLINST.isMonitoringEnabled()) {
// if (CTRLINST.isProbeActivated(this.filterOperationSignatureString)) {
String operationSignature;
final String componentSignature;
final String method;
final String path;
final String sessionId;
final List<CallInformation> callInformations = new ArrayList<>();
String query = null;
String[] queryParameters = null;
if (request instanceof HttpServletRequest) {
final HttpServletRequest httpRequest = (HttpServletRequest) request;
method = httpRequest.getMethod();
final String requestPath = httpRequest.getRequestURI().replace('/', '.').substring(1);
// remove sessionId from request Path
path = requestPath.contains(";") ? requestPath.substring(0, requestPath.indexOf(";")) : requestPath;
sessionId = httpRequest.getSession().getId();
query = httpRequest.getQueryString();
if (query == null) {
query = "";
} else {
queryParameters = query.split("&");
}
} else {
method = "POST";
path = request.getServletContext().getContextPath().replace('/', '.').substring(1);
sessionId = "<no session>";
query = "";
}
final String trimmedPath = path.replaceAll("\\.[A-Za-z0-9]*$", "");
// final int lastComponentSignatureIndex = trimmedPath.lastIndexOf("actions.");
// lastComponentSignatureIndex < 0 ?
componentSignature = "jpetstore.actions";
// trimmedPath: trimmedPath.substring(0,
// lastComponentSignatureIndex - 1);
TraceMetadata trace = SessionAndTraceRegistrationFilterForJPetstoreAttributeCoding.TRACEREGISTRY.getTrace();
final boolean newTrace = trace == null;
if (newTrace) {
SessionRegistry.INSTANCE.storeThreadLocalSessionId(sessionId);
trace = SessionAndTraceRegistrationFilterForJPetstoreAttributeCoding.TRACEREGISTRY.registerTrace();
SessionAndTraceRegistrationFilterForJPetstoreAttributeCoding.CTRLINST.newMonitoringRecord(trace);
}
if ("GET".equals(method)) {
if (queryParameters != null && queryParameters.length == 2) {
operationSignature = trimmedPath.replaceAll("jpetstore\\.actions\\.", "") + "." + queryParameters[0].replace("=", "") + // "("
"()";
// +
// queryParameters[0]
// +
// ")";
final String[] queryParameterSplit = queryParameters[1].split("=");
final Long code = SessionAndTraceRegistrationFilterForJPetstoreAttributeCoding.codes.containsKey(queryParameterSplit[1]) ? SessionAndTraceRegistrationFilterForJPetstoreAttributeCoding.codes.get(queryParameterSplit[1]).longValue() : -100L;
callInformations.add(new CallInformation(queryParameterSplit[0], code));
} else {
operationSignature = trimmedPath.replaceAll("jpetstore\\.actions\\.", "") + "(" + query.replace(';', ':') + ")";
}
operationSignature = operationSignature.replaceAll("\\.action\\(", "(");
operationSignature = operationSignature.replaceAll("action\\.", "");
} else if ("POST".equals(method)) {
operationSignature = trimmedPath.replaceAll("jpetstore\\.actions\\.", "") + "()";
operationSignature = operationSignature.replaceAll("\\.action\\(", "(");
operationSignature = operationSignature.replaceAll("action\\.", "");
} else {
chain.doFilter(request, response);
return;
}
final long traceId = trace.getTraceId();
try {
// mapps Object to String
final ObjectMapper objectMapper = new ObjectMapper();
SessionAndTraceRegistrationFilterForJPetstoreAttributeCoding.CTRLINST.newMonitoringRecord(new BeforeOperationEvent(SessionAndTraceRegistrationFilterForJPetstoreAttributeCoding.TIMESOURCE.getTime(), traceId, trace.getNextOrderId(), operationSignature, componentSignature));
chain.doFilter(request, response);
SessionAndTraceRegistrationFilterForJPetstoreAttributeCoding.CTRLINST.newMonitoringRecord(new ExtendedAfterOperationEvent(SessionAndTraceRegistrationFilterForJPetstoreAttributeCoding.TIMESOURCE.getTime(), traceId, trace.getNextOrderId(), operationSignature, componentSignature, objectMapper.writeValueAsString(callInformations)));
} catch (final Throwable th) {
// NOPMD NOCS (catch throw is ok here)
SessionAndTraceRegistrationFilterForJPetstoreAttributeCoding.CTRLINST.newMonitoringRecord(new AfterOperationFailedEvent(SessionAndTraceRegistrationFilterForJPetstoreAttributeCoding.TIMESOURCE.getTime(), traceId, trace.getNextOrderId(), operationSignature, componentSignature, th.toString()));
throw new ServletException(th);
} finally {
// is this correct?
SessionAndTraceRegistrationFilterForJPetstoreAttributeCoding.SESSION_REGISTRY.unsetThreadLocalSessionId();
// Reset the thread-local trace information
if (newTrace) {
// close the trace
SessionAndTraceRegistrationFilterForJPetstoreAttributeCoding.TRACEREGISTRY.unregisterTrace();
}
}
// } else {
// chain.doFilter(request, response);
// return;
// }
} else {
chain.doFilter(request, response);
}
}
Aggregations