package org.stagemonitor.tracing.anonymization;
import org.stagemonitor.tracing.TracingPlugin;
import org.stagemonitor.tracing.utils.IPAnonymizationUtils;
import org.stagemonitor.tracing.utils.SpanUtils;
import org.stagemonitor.tracing.wrapper.AbstractSpanEventListener;
import org.stagemonitor.tracing.wrapper.SpanEventListener;
import org.stagemonitor.tracing.wrapper.SpanEventListenerFactory;
import org.stagemonitor.tracing.wrapper.SpanWrapper;
import org.stagemonitor.util.StringUtils;
import io.opentracing.tag.Tags;
public class AnonymizingSpanEventListener extends AbstractSpanEventListener {
private final TracingPlugin tracingPlugin;
public String username;
public String ip;
private final boolean pseudonymizeUserNames;
private final boolean anonymizeIPs;
private final boolean active;
public AnonymizingSpanEventListener(TracingPlugin tracingPlugin) {
this.tracingPlugin = tracingPlugin;
pseudonymizeUserNames = tracingPlugin.isPseudonymizeUserNames();
anonymizeIPs = tracingPlugin.isAnonymizeIPs();
active = anonymizeIPs || pseudonymizeUserNames;
}
@Override
public String onSetTag(String key, String value) {
if (!active) {
return super.onSetTag(key, value);
}
if (SpanUtils.USERNAME.equals(key)) {
username = value;
} else if (SpanUtils.IPV4_STRING.equals(key)) {
ip = value;
} else if (Tags.PEER_HOST_IPV6.getKey().equals(key)) {
ip = value;
}
return value;
}
@Override
public void onFinish(SpanWrapper spanWrapper, String operationName, long durationNanos) {
if (!active) {
return;
}
String hashedUserName = username;
if (pseudonymizeUserNames) {
hashedUserName = StringUtils.sha1Hash(username);
spanWrapper.getDelegate().setTag(SpanUtils.USERNAME, hashedUserName);
}
final boolean disclose = tracingPlugin.getDiscloseUsers().contains(hashedUserName);
if (disclose) {
spanWrapper.getDelegate().setTag("username_disclosed", username);
}
if (anonymizeIPs && ip != null && !disclose) {
SpanUtils.setClientIp(spanWrapper, IPAnonymizationUtils.anonymize(ip));
}
}
public static class MySpanEventListenerFactory implements SpanEventListenerFactory {
private final TracingPlugin tracingPlugin;
public MySpanEventListenerFactory(TracingPlugin tracingPlugin) {
this.tracingPlugin = tracingPlugin;
}
@Override
public SpanEventListener create() {
return new AnonymizingSpanEventListener(tracingPlugin);
}
}
}