in apm-sniffer/apm-sdk-plugin/play-2.x-plugin/src/main/java/org/apache/skywalking/apm/plugin/play/v2x/TracingFilter.java [54:96]
public CompletionStage<Result> apply(Function<Http.RequestHeader, CompletionStage<Result>> next,
Http.RequestHeader request) {
HandlerDef def = null;
try {
def = request.attrs().get(Router.Attrs.HANDLER_DEF);
} catch (Throwable t) {
// ignore get HandlerDef exception
}
if (Objects.nonNull(def)) {
final ContextCarrier carrier = new ContextCarrier();
CarrierItem items = carrier.items();
while (items.hasNext()) {
items = items.next();
Optional<String> value = request.getHeaders().get(items.getHeadKey());
if (value.isPresent()) {
items.setHeadValue(value.get());
}
}
final String operationName = routePattern.matcher(def.path()).replaceAll("{$1}");
final AbstractSpan span = ContextManager.createEntrySpan(operationName, carrier);
final String url = request.host() + request.uri();
Tags.URL.set(span, url);
Tags.HTTP.METHOD.set(span, request.method());
span.setComponent(ComponentsDefine.PLAY);
SpanLayer.asHttp(span);
span.prepareForAsync();
CompletionStage<Result> stage = next.apply(request).thenApply(result -> {
Tags.HTTP_RESPONSE_STATUS_CODE.set(span, result.status());
if (result.status() >= 400) {
span.errorOccurred();
}
try {
span.asyncFinish();
} catch (Throwable t) {
ContextManager.activeSpan().log(t);
}
return result;
});
ContextManager.stopSpan(span);
return stage;
}
return next.apply(request);
}