programing

스프링 부트 액추에이터의 트레이스에 JSON 응답 바디를 포함하는 방법은?

css3 2023. 9. 12. 20:10

스프링 부트 액추에이터의 트레이스에 JSON 응답 바디를 포함하는 방법은?

스프링 부트 액추에이터의Trace입력/출력 HTTP 파라미터, 헤더, 사용자 등을 잘 캡처합니다.HTTP 응답의 본문도 캡처할 수 있도록 확장하고 싶습니다. 이렇게 하면 웹 계층에서 들어오고 나가는 내용을 전체적으로 볼 수 있습니다.지금 보니까.TraceProperties, 응답 본문 캡처를 구성할 방법이 없는 것 같습니다.응답 본문이 어떤 캐릭터 스트림을 보내도 망치지 않고 캡처할 수 있는 "안전한" 방법이 있을까요?

최근에 Spring Boot Actuator의 커스터마이징에 대한 블로그 글을 올렸습니다.trace엔드포인트와 액츄에이터 게임을 하면서 저는 좀 놀랐습니다.response body추적할 수 있는 속성 중 하나가 아닙니다.

이 기능이 필요할 것 같아서 로그백 덕분에 빠른 해결책을 생각해 냈습니다.

응답의 출력 스트림을 복제하기 위해 저는 TeeHttpServletResponseTeeServletOutputStream을 너무 많이 검토하지 않고 복사하여 사용하였습니다.

그리고 블로그 포스트에서 설명한 것처럼 다음과 같이 확장되었습니다.

@Component
public class RequestTraceFilter extends WebRequestTraceFilter {

    RequestTraceFilter(TraceRepository repository, TraceProperties properties) {
        super(repository, properties);
    }

    @Override
    protected void doFilterInternal(HttpServletRequest request, HttpServletResponse response, FilterChain filterChain) throws ServletException, IOException {
        TeeHttpServletResponse teeResponse = new TeeHttpServletResponse(response);

        filterChain.doFilter(request, teeResponse);

        teeResponse.finish();

        request.setAttribute("responseBody", teeResponse.getOutputBuffer());

        super.doFilterInternal(request, teeResponse, filterChain);
    }

    @Override
    protected Map<String, Object> getTrace(HttpServletRequest request) {
        Map<String, Object> trace = super.getTrace(request);

        byte[] outputBuffer = (byte[]) request.getAttribute("responseBody");

        if (outputBuffer != null) {
            trace.put("responseBody", new String(outputBuffer));
        }

        return trace;
    }
}

이제, 당신은 볼 수 있습니다.responseBodyJSON에서trace엔드포인트 서비스.

스프링 유지 관리자 중 한 명으로부터:

요청 및 응답 본문을 추적하는 일이 처음부터 지원된 적이 없습니다.요청이 POST된 양식 데이터인 경우 전체 요청 본문을 읽어야 하므로 매개 변수 추적 지원이 중단되었습니다.

https://github.com/spring-projects/spring-boot/issues/12953

webflux reactive stack을 사용하면 스프링-클라우드-게이트웨이를 사용하여 http request 및 response body를 캡처하여 액츄에이터에 주입할 수 있습니다.httptrace사용자 정의 HttpTraceWebFilter를 정의합니다.

https://gist.github.com/gberche-orange/06c26477a313df9d19d20a4e115f079f 에서 관련 코드 전체 보기

이를 위해서는 상당한 양의 중복이 필요하며, springboot 팀이 이러한 중복을 줄이는 데 도움이 되기를 바랍니다. 관련 https://github.com/spring-projects/spring-boot/issues/23907 을 참조하십시오.

언급URL : https://stackoverflow.com/questions/35848802/how-to-include-json-response-body-in-spring-boot-actuators-trace