개발 이슈

[APM] v2.contextRequestURL.Headers: invalid input for HTTPHeader 에러

hanrabong 2025. 6. 30. 23:15

배경

운영 환경에서 에러가 발생하여 opensearch로 로그를 확인해야 했다. 에러가 발생하였기에 error 문구가 들어있는 로그들을 확인하려고 보았는데, APM 관련된 에러 로그들이 많이 쌓여있는 것을 확인했다. 당연히 APM 관련 로그로 인해 원하는 로그 보기가 불편하였다. 왜 해당 에러 로그들이 쌓이고 있는지 그리고 어떻게 하면 해결할 수 있을지에 대해 고민하였다.

 

APM

간단하게 말하면, APM은 Application Performance Monitoring으로 애플리케이션의 성능을 실시간으로 수집하고 분석하여 대시보드 형태로 시각화해 주는 도구이다.  API 호출 시, 백엔드에서 처리하는 전체 흐름을 추적 및 기록하여, 어디서 시간이 오래 걸렸는지, 어떤 부분에서 병목이 있는지를 쉽게 확인할 수 있다.

 

에러 및 해결

 로그 상으로 다음과 같은 에러가 발생하였다. 매 요청마다 apm 서버로 로그를 쌓고 있어, 해당 에러가 거의 도배되고 있었다.

ERROR elasticapm.transport [-] Failed to submit message: 'HTTP 400: {"accepted":32,"errors":[{"message":"decode error: data read error: v2.transactionRoot.Transaction: v2.transaction.Context: v2.context.Request: v2.contextRequest.URL: v2.contextRequestURL.Headers: invalid input for HTTPHeader:

 

 에러를 보면 HTTPHeader에 invalid input 값이 있어서 decoding하는데 실패했다는 에러이다. 또한 APM 서버에서 400 에러를 발생시켜서 정확한 정보가 저장이 안 되고 있을 가능성이 크다.(얼른 고쳐야 했다....)

해당 에러가 발생한 이유를 확인해보았는데, request나 response header 값에  공백, 특수문자, null 등이 있는 경우 발생한다고 한다. 나의 경우는 헤더 특정 속성 값에 null이 있어서 발생하고 있었다. 근본적으로 해결하기 위해서는 header 속성에 null 값이 들어가지 않도록 처리를 해줘야 한다. 해당 서비스 구조를 보면 f/e의 요청이 바로 b/e로 오는 것이 아닌 중간 wrapper 등을 거치고 있는데 해당 wrapper에서 header에 특정 속상을 추가할 때 null값이 들어가는 경우가 있었다. 해당 구조 자체를 변경할 수가 없어 apm의 속성을 이용하여 해결하려고 하였다.

 

 APM의 속성 중 `ELASTIC_APM_CAPTURE_HEADERS` 라는 속성이 있다. 해당 속성은 request, response header에 대한 정보를 수집해서 APM 서버에 보낼지 말지 결정하는 설정이다. 해당 설정은 default 값이 true여서 해당 값을 false로 수정하였다.

 

마치며...

 개발/검증 환경도 APM error가 동일하게 발생하고 있어 먼저 적용하여 확인해 보니 더 이상 APM HTTPHeader error가 발생하지 않는 것을 확인할 수 있었다. 운영 쪽도 로그를 좀 더 수월하게 볼 수 있게 다음 소스 반영 할 때 얼른 적용하고 싶다. 
해당 에러가 발생하였을 때 설정 문제인 것으로 확인할 수 있었지만, k8s의 deployment yaml에 env 값을 찾아서 수정하는 데 꽤 시간이 걸리곤 했다. 서비스 구조가 좀 더 커지고 세분화됨에 따라서 요청 하나하나를 처리할 때 주의해야 하는 점과 전반적인 구조를 이해하고 있어야 에러가 발생했을 때도 원인을 빠르게 찾을 수 있다는 것을 깨달았다.

 

참고자료

https://github.com/elastic/apm-agent-python/issues/2134

 

Flask 400 decode error with HTTPHeader <nil> value · Issue #2134 · elastic/apm-agent-python

Describe the bug: Flask transaction data are not gathered due to 400 decode error with HTTPHeader value Dependency and metric data are gathered and shown on dashboard but transaction data are rejec...

github.com

https://www.elastic.co/docs/reference/apm/agents/python/configuration#config-capture-headers

 

Configuration | APM Python agent

To adapt the Elastic APM agent to your needs, configure it using environment variables or framework-specific configuration. You can either configure the...

www.elastic.co

'개발 이슈' 카테고리의 다른 글

[Python] WSGI 그리고 WebOb  (0) 2024.12.03