Skip to content
Snippets Groups Projects
Commit 37961ff2 authored by Simon Spinner's avatar Simon Spinner
Browse files

Add filter infrastructure for traces

- Introduce filter package for different types of filters
- Replace constructor calls of Component/Interface/OperationRecord with
a factory
- Implement a factory that uses the filters
parent bb14da1b
No related branches found
No related tags found
No related merge requests found
Showing
with 200 additions and 17 deletions
......@@ -4,11 +4,14 @@ import java.util.Collection;
import java.util.Collections;
public abstract class ComponentRecord {
private final TraceFactory factory;
private final String component;
private String componentClass = null;
public ComponentRecord(String component) {
public ComponentRecord(TraceFactory factory, String component) {
this.component = component;
this.factory = factory;
}
public void setComponentClass(String componentClass) {
......@@ -27,6 +30,10 @@ public abstract class ComponentRecord {
return Collections.emptyList();
}
public TraceFactory getTraceFactory() {
return factory;
}
public abstract InterfaceRecord requireInterface(String interf);
public abstract boolean isFiltered();
......
......@@ -5,10 +5,12 @@ import java.util.Collections;
public abstract class InterfaceRecord {
private final TraceFactory factory;
private final String interf;
private final ComponentRecord component;
public InterfaceRecord(ComponentRecord component, String interf) {
this.factory = component.getTraceFactory();
this.component = component;
this.interf = interf;
}
......@@ -24,6 +26,10 @@ public abstract class InterfaceRecord {
public Collection<OperationRecord> getOperations() {
return Collections.emptyList();
}
public TraceFactory getTraceFactory() {
return factory;
}
public abstract OperationRecord requireOperation(String operation);
......
package tools.descartes.prisma.agent.wildfly.callstack;
public class InvocationGroupRecord {
}
......@@ -4,11 +4,13 @@ import java.util.Collection;
import java.util.Collections;
public abstract class OperationRecord {
private final TraceFactory factory;
private final InterfaceRecord interf;
private final String operation;
public OperationRecord(InterfaceRecord interf, String operation) {
this.factory = interf.getTraceFactory();
this.interf = interf;
this.operation = operation;
}
......@@ -40,6 +42,10 @@ public abstract class OperationRecord {
return Collections.emptyList();
}
public TraceFactory getTraceFactory() {
return factory;
}
public abstract ComponentRecord requireComponent(String component);
public abstract boolean isFiltered();
......
package tools.descartes.prisma.agent.wildfly.callstack;
public interface TraceFactory {
ComponentRecord createComponentRecord(String component);
InterfaceRecord createInterfaceRecord(ComponentRecord component, String interf);
OperationRecord createOperationRecord(InterfaceRecord interf, String operation);
}
......@@ -3,16 +3,20 @@ package tools.descartes.prisma.agent.wildfly.callstack;
import java.util.Collection;
import java.util.concurrent.ConcurrentHashMap;
import tools.descartes.prisma.agent.wildfly.callstack.impl.DefaultComponentRecord;
public class TraceRoot {
private final TraceFactory factory;
private final ConcurrentHashMap<String, ComponentRecord> monitoredComponents = new ConcurrentHashMap<>();
public TraceRoot(TraceFactory factory) {
this.factory = factory;
}
public ComponentRecord requireComponent(String component) {
ComponentRecord record = monitoredComponents.get(component);
if (record == null) {
record = new DefaultComponentRecord(component);
record = factory.createComponentRecord(component);
if (monitoredComponents.putIfAbsent(component, record) != null) {
// a different thread has changed it in the mean time
record = monitoredComponents.get(component);
......
......@@ -6,20 +6,21 @@ import java.util.concurrent.ConcurrentHashMap;
import tools.descartes.prisma.agent.wildfly.callstack.ComponentRecord;
import tools.descartes.prisma.agent.wildfly.callstack.InterfaceRecord;
import tools.descartes.prisma.agent.wildfly.callstack.OperationRecord;
import tools.descartes.prisma.agent.wildfly.callstack.TraceFactory;
import tools.descartes.prisma.agent.wildfly.callstack.TraceVisitor;
public class DefaultComponentRecord extends ComponentRecord {
private final ConcurrentHashMap<String, InterfaceRecord> interfaces = new ConcurrentHashMap<>();
public DefaultComponentRecord(String component) {
super(component);
public DefaultComponentRecord(TraceFactory factory, String component) {
super(factory, component);
}
public InterfaceRecord requireInterface(String interf) {
InterfaceRecord record = interfaces.get(interf);
if (record == null) {
record = new DefaultInterfaceRecord(this, interf);
record = getTraceFactory().createInterfaceRecord(this, interf);
if (interfaces.putIfAbsent(interf, record) != null) {
// a different thread has changed it in the mean time
record = interfaces.get(interf);
......
......@@ -19,7 +19,7 @@ public class DefaultInterfaceRecord extends InterfaceRecord {
public OperationRecord requireOperation(String operation) {
OperationRecord record = operations.get(operation);
if (record == null) {
record = new DefaultOperationRecord(this, operation);
record = getTraceFactory().createOperationRecord(this, operation);
if (operations.putIfAbsent(operation, record) != null) {
// a different thread has changed it in the mean time
record = operations.get(operation);
......
......@@ -4,8 +4,6 @@ import java.util.Collection;
import java.util.concurrent.ConcurrentHashMap;
import java.util.concurrent.atomic.AtomicLong;
import org.eclipse.aether.spi.connector.transport.GetTask;
import tools.descartes.prisma.agent.wildfly.callstack.ComponentRecord;
import tools.descartes.prisma.agent.wildfly.callstack.InterfaceRecord;
import tools.descartes.prisma.agent.wildfly.callstack.OperationRecord;
......@@ -48,7 +46,7 @@ public class DefaultOperationRecord extends OperationRecord {
public ComponentRecord requireComponent(String component) {
ComponentRecord record = requiredComponents.get(component);
if (record == null) {
record = new DefaultComponentRecord(component);
record = getTraceFactory().createComponentRecord(component);
if (requiredComponents.putIfAbsent(component, record) != null) {
// a different thread has changed it in the mean time
record = requiredComponents.get(component);
......
......@@ -3,12 +3,13 @@ package tools.descartes.prisma.agent.wildfly.callstack.impl;
import tools.descartes.prisma.agent.wildfly.callstack.ComponentRecord;
import tools.descartes.prisma.agent.wildfly.callstack.InterfaceRecord;
import tools.descartes.prisma.agent.wildfly.callstack.OperationRecord;
import tools.descartes.prisma.agent.wildfly.callstack.TraceFactory;
import tools.descartes.prisma.agent.wildfly.callstack.TraceVisitor;
public class FilteredComponentRecord extends ComponentRecord {
public FilteredComponentRecord(String component) {
super(component);
public FilteredComponentRecord(TraceFactory factory, String component) {
super(factory, component);
}
@Override
......
......@@ -13,7 +13,7 @@ public class FilteredInterfaceRecord extends InterfaceRecord {
@Override
public OperationRecord requireOperation(String operation) {
return null;
return new FilteredOperationRecord(this, operation);
}
@Override
......
......@@ -13,7 +13,7 @@ public class FilteredOperationRecord extends OperationRecord {
@Override
public ComponentRecord requireComponent(String component) {
return new FilteredComponentRecord(component);
return new FilteredComponentRecord(getTraceFactory(), component);
}
@Override
......
package tools.descartes.prisma.agent.wildfly.filters;
import java.util.regex.Pattern;
public class ComponentFilter {
private final Pattern componentPattern;
public ComponentFilter(String regex) {
this.componentPattern = Pattern.compile(regex);
}
public boolean apply(String component) {
return componentPattern.matcher(component).matches();
}
}
package tools.descartes.prisma.agent.wildfly.filters;
import java.util.LinkedList;
import java.util.List;
import tools.descartes.prisma.agent.wildfly.callstack.ComponentRecord;
import tools.descartes.prisma.agent.wildfly.callstack.InterfaceRecord;
import tools.descartes.prisma.agent.wildfly.callstack.OperationRecord;
import tools.descartes.prisma.agent.wildfly.callstack.TraceFactory;
import tools.descartes.prisma.agent.wildfly.callstack.impl.DefaultComponentRecord;
import tools.descartes.prisma.agent.wildfly.callstack.impl.DefaultInterfaceRecord;
import tools.descartes.prisma.agent.wildfly.callstack.impl.DefaultOperationRecord;
import tools.descartes.prisma.agent.wildfly.callstack.impl.FilteredComponentRecord;
import tools.descartes.prisma.agent.wildfly.callstack.impl.FilteredInterfaceRecord;
import tools.descartes.prisma.agent.wildfly.callstack.impl.FilteredOperationRecord;
public class FilteredTraceFactory implements TraceFactory {
private final List<ComponentFilter> componentFilters = new LinkedList<>();
private final List<InterfaceFilter> interfaceFilters = new LinkedList<>();
private final List<OperationFilter> operationFilters = new LinkedList<>();
public void addFilter(ComponentFilter filter) {
componentFilters.add(filter);
}
public void addFilter(InterfaceFilter filter) {
interfaceFilters.add(filter);
}
public void addFilter(OperationFilter filter) {
operationFilters.add(filter);
}
public ComponentRecord createComponentRecord(String component) {
boolean filtered = false;
for (ComponentFilter filter : componentFilters) {
if (filter.apply(component)) {
filtered = true;
break;
}
}
if (filtered) {
return new FilteredComponentRecord(this, component);
} else {
return new DefaultComponentRecord(this, component);
}
}
public InterfaceRecord createInterfaceRecord(ComponentRecord component, String interf) {
boolean filtered = false;
String componentName = component.getComponentName();
for (InterfaceFilter filter : interfaceFilters) {
if (filter.apply(componentName, interf)) {
filtered = true;
break;
}
}
if (filtered) {
return new FilteredInterfaceRecord(component, interf);
} else {
return new DefaultInterfaceRecord(component, interf);
}
}
public OperationRecord createOperationRecord(InterfaceRecord interf, String operation) {
boolean filtered = false;
String componentName = interf.getComponent().getComponentName();
String interfaceName = interf.getInterfaceName();
for (OperationFilter filter : operationFilters) {
if (filter.apply(componentName, interfaceName, operation)) {
filtered = true;
break;
}
}
if (filtered) {
return new FilteredOperationRecord(interf, operation);
} else {
return new DefaultOperationRecord(interf, operation);
}
}
}
package tools.descartes.prisma.agent.wildfly.filters;
import java.util.regex.Pattern;
public class InterfaceFilter {
private final Pattern componentPattern;
private final Pattern interfacePattern;
public InterfaceFilter(String componentRegex, String interfaceRegex) {
this.componentPattern = Pattern.compile(componentRegex);
this.interfacePattern = Pattern.compile(interfaceRegex);
}
public boolean apply(String component, String interf) {
if (componentPattern.matcher(component).matches()) {
return interfacePattern.matcher(interf).matches();
}
return false;
}
}
package tools.descartes.prisma.agent.wildfly.filters;
import java.util.regex.Pattern;
public class OperationFilter {
private final Pattern componentPattern;
private final Pattern interfacePattern;
private final Pattern operationPattern;
public OperationFilter(String componentRegex, String interfaceRegex, String operationRegex) {
this.componentPattern = Pattern.compile(componentRegex);
this.interfacePattern = Pattern.compile(interfaceRegex);
this.operationPattern = Pattern.compile(operationRegex);
}
public boolean apply(String component, String interf, String operation) {
if (componentPattern.matcher(component).matches()) {
if (interfacePattern.matcher(interf).matches()) {
return operationPattern.matcher(operation).matches();
}
}
return false;
}
}
......@@ -18,6 +18,7 @@ import tools.descartes.prisma.agent.wildfly.callstack.OperationRecord;
import tools.descartes.prisma.agent.wildfly.callstack.TraceRoot;
import tools.descartes.prisma.agent.wildfly.callstack.TraceVisitor;
import tools.descartes.prisma.agent.wildfly.callstack.impl.DefaultComponentRecord;
import tools.descartes.prisma.agent.wildfly.filters.FilteredTraceFactory;
public class MonitoringService implements Service<MonitoringService> {
......@@ -88,7 +89,7 @@ public class MonitoringService implements Service<MonitoringService> {
private static final long WRITE_INTERVAL = 60000;
private final TraceRoot root = new TraceRoot();
private final TraceRoot root = new TraceRoot(new FilteredTraceFactory());
private final ConcurrentHashMap<Long, Long> threads = new ConcurrentHashMap<Long, Long>();
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment