public CompletionStage apply()

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);
    }