ServletSofaTracerFilter.java

package com.mycim.webapp.filter;

import com.alipay.common.tracer.core.context.trace.SofaTraceContext;
import com.alipay.common.tracer.core.extensions.SpanExtensionFactory;
import com.alipay.common.tracer.core.holder.SofaTraceContextHolder;
import com.alipay.common.tracer.core.span.SofaTracerSpan;
import com.fa.sesa.i18n.Languages;
import com.fa.sesa.threadlocal.LocalContext;
import com.fa.sesa.threadlocal.LocalContextNames;
import com.mycim.framework.utils.lang.StringUtils;
import com.mycim.webapp.secutiry.jwt.JwtUtils;
import org.springframework.stereotype.Component;

import javax.servlet.*;
import javax.servlet.annotation.WebFilter;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;

/**
 * @author Johnson W
 */
@Component
@WebFilter(urlPatterns = "/*", filterName = "tracerFilter")
public class ServletSofaTracerFilter implements Filter {

    private static final String PROCESS_RRN_KEY = "PROCESSRRN";

    private static final String DATA_PERMISSION_KEY = "dataPermissionFlag";

    private static final String CHECK_DATA_PERMISSION_KEY = "checkDataPermission";

    private static final String SPECIAL_ROLE = "SPECIAL_ROLE";

    private static final String IGNORE_PERMISSION = "2";

    private static final String MANUAL="MANUAL";

    @Override
    public void init(FilterConfig filterConfig) throws ServletException {
        // no operation and lazy init
    }

    @Override
    public void doFilter(ServletRequest req, ServletResponse res,
                         FilterChain chain) throws IOException, ServletException {
        HttpServletRequest request = (HttpServletRequest) req;
        HttpServletResponse response = (HttpServletResponse) res;

        SofaTraceContext sofaTraceContext = SofaTraceContextHolder.getSofaTraceContext();
        SofaTracerSpan sofaTracerSpan = sofaTraceContext.getCurrentSpan();

        Long facilityRrn = JwtUtils.getFacilityRrn(request);
        String userId = JwtUtils.getUserId(request);
        String language = JwtUtils.getLanguage(request);
        Long userRrn = JwtUtils.getUserRrn(request);
        // String processRrns = JwtUtils.getProcessRrns(request);
        String dataPermissionFlag = JwtUtils.getDataPermissionFlag(request);
        Boolean specialRole = JwtUtils.getSpecialRoleFlag(request);

        sofaTracerSpan.setBaggageItem(LocalContextNames.USER_RRN_KEY, userRrn == null ? "0" : userRrn.toString());
        sofaTracerSpan.setBaggageItem(LocalContextNames.USER_ID_KEY, userId == null ? "" : userId);
        sofaTracerSpan
                .setBaggageItem(LocalContextNames.FACILITY_RRN_KEY, facilityRrn == null ? "0" : facilityRrn.toString());
        sofaTracerSpan
                .setBaggageItem(LocalContextNames.LANGUAGE_KEY, language == null ? Languages.CN.name() : language);
        sofaTracerSpan.setBaggageItem(PROCESS_RRN_KEY, StringUtils.EMPTY);
        sofaTracerSpan.setBaggageItem(DATA_PERMISSION_KEY, dataPermissionFlag == null ? "" : dataPermissionFlag);
        sofaTracerSpan.setBaggageItem(LocalContextNames.TRANS_MODULE_KEY, MANUAL);
        sofaTracerSpan.setBaggageItem(CHECK_DATA_PERMISSION_KEY, IGNORE_PERMISSION.equals(dataPermissionFlag)?
                Boolean.toString(true) : Boolean.toString(false));
        sofaTracerSpan.setBaggageItem(SPECIAL_ROLE, specialRole != null && specialRole?Boolean.TRUE.toString():Boolean.FALSE.toString());

        try {
            SpanExtensionFactory.logStartedSpan(sofaTracerSpan);
            // filter begin
            chain.doFilter(request, response);
            // filter end
        } finally {
            LocalContext.clear();
        }

    }

    @Override
    public void destroy() {

    }

}