package org.stagemonitor.tracing;
import com.uber.jaeger.context.TracingUtils;
import org.stagemonitor.configuration.ConfigurationRegistry;
import org.stagemonitor.tracing.utils.SpanUtils;
import java.util.LinkedHashMap;
import java.util.Map;
import io.opentracing.Span;
import io.opentracing.Tracer;
import io.opentracing.tag.Tags;
public class MonitoredMethodRequest extends MonitoredRequest {
private final String methodSignature;
private final MethodExecution methodExecution;
private final Map<String, String> safeParameters;
private final TracingPlugin tracingPlugin;
public MonitoredMethodRequest(ConfigurationRegistry configuration, String methodSignature, MethodExecution methodExecution) {
this(configuration, methodSignature, methodExecution, null);
}
public MonitoredMethodRequest(ConfigurationRegistry configuration, String methodSignature, MethodExecution methodExecution, Map<String, Object> parameters) {
this.tracingPlugin = configuration.getConfig(TracingPlugin.class);
this.methodSignature = methodSignature;
this.methodExecution = methodExecution;
this.safeParameters = getSafeParameterMap(parameters);
}
private Map<String, String> getSafeParameterMap(Map<String, Object> parameters) {
if (parameters == null) {
return null;
}
Map<String, String> params = new LinkedHashMap<String, String>();
for (Map.Entry<String, Object> entry : parameters.entrySet()) {
String valueAsString;
try {
valueAsString = String.valueOf(entry.getValue());
}
catch (Exception e) {
valueAsString = "[unavailable (" + e.getMessage() + ")]";
}
params.put(entry.getKey(), valueAsString);
}
return TracingPlugin.getSafeParameterMap(params, tracingPlugin.getConfidentialParameters());
}
@Override
public Span createSpan() {
final Tracer tracer = tracingPlugin.getTracer();
final Span span;
if (!TracingUtils.getTraceContext().isEmpty()) {
span = tracer.buildSpan(methodSignature)
.asChildOf(TracingUtils.getTraceContext().getCurrentSpan())
.withTag(Tags.SPAN_KIND.getKey(), Tags.SPAN_KIND_SERVER)
.start();
} else {
span = tracer.buildSpan(methodSignature)
.withTag(Tags.SPAN_KIND.getKey(), Tags.SPAN_KIND_SERVER)
.start();
}
SpanUtils.setParameters(span, safeParameters);
span.setTag(SpanUtils.OPERATION_TYPE, "method_invocation");
return span;
}
@Override
public void execute() throws Exception {
methodExecution.execute();
}
public interface MethodExecution {
void execute() throws Exception;
}
}