본문 바로가기

APM/Jennifer

[Jennifer5] 어플리케이션 이름에 쿼리스트링 값 추가 가이드 (URL+parameter값)

정말 불가피한 상황이 아니라면

url_additional_request_keys 옵션 사용은 지양하도록 하자.

 

해당 옵션 적용으로 인한 업무 영향도가 너무나 크다.

옵션 가이드에서 해당 옵션 사용으로 인한 위험도를 경고하고 있으며,

여러 issue 글에서도 사용을 지양할 것을 경고하고 있다.

 

Jennifer5 에서는 이를 대체할 만한 use_service_naming_by_query_string 옵션이 있으니

해당 옵션을 사용하자.

 

단순히 업무 구분만이 필요한 상황이라면,

Jennifer4 에서는 tx_naming을 (https://docs.jennifersoft.com/4.5manual#2e91ccdf3d8c59ba)

Jennifer5 에서는 "애플리케이션 이름 - 설정된 이름에 추가" 옵션을 활용하는 방법도 있다.

 


 

#. 참고

use_service_naming_by_query_string 옵션 관련

 - JJC-5196 (Comment 참고)

 - JJC-2168 (Comment 참고)

 - Jennifer4 에는 없는 옵션

 - Jennifer5 옵션 가이드 : (에이전트 고급옵션 가이드 설명 참고)

 


 

url_additional_request_keys 옵션 관련

 - 해당 옵션 적용으로 인한 문제상황 : JJC-5196, JJB-658, JJB-2964, JJB-2696

 - 관련 문서 : https://docs.oracle.com/javaee/7/api/javax/servlet/ServletRequest.html#getParameter-java.lang.String-

 - Jennifer4 옵션 가이드 : https://docs.jennifersoft.com/4.5manual#e4ce691fc0eb1c32

 - Jennifer5 옵션 가이드 : (에이전트 고급옵션 가이드 설명 참고)

 


 

request_set_character_encoding 옵션 관련

 - url_additional_request_keys 옵션으로 인해 한글 인코딩 깨지는 현상 :  JJC-5196, JJC-2157

 - 한글 인코딩이 깨지는 이유 : JJC-988, JJB-1503

 - Jennifer4 옵션 가이드 : https://docs.jennifersoft.com/4.5manual#e4ce691fc0eb1c32

 - Jennifer5 옵션 가이드 : (에이전트 고급옵션 가이드 설명 참고)

 


 

ignore_url_post_request_parsing_prefix 옵션 관련

 - JJC-5113 (Comment에 오류가 있음. POST request 방식에 한해 적용 되는 로직이 아님. JJC-2168 참고할 것.)

 - JJC-5196

 - Jennifer4 옵션 가이드 : https://docs.jennifersoft.com/4.5manual#497bc6492e5ed0cf

 - Jennifer5 옵션 가이드 : (에이전트 고급옵션 가이드 설명 참고)

 


 

#. 주의사항

Jennifer Server 5.6.0.25 / Agent 5.6.0.14 버전 기준

url_additional_request_keys 옵션과 ignore_url_post_request_parsing_prefix 옵션 설정 시

에이전트 설정 복사 기능을 절대 사용하지 말 것!

옵션이 정상적으로 복사되지 않는 버그가 있다.

아무리 에이전트 갯수가 많더라도, 일일이 수동으로 옵션을 설정해주어야 한다.

 

해당 두 옵션에 여러 값을 설정할 시에는 개행문자로 구분하는데,

에이전트 설정 복사를 사용하면 agent 옵션 config 파일에 개행문자 대신 콤마(,) 가 작성되어 발생하는 버그.

 


 

#. url_additional_request_keys 옵션

기본적으로 웹 어플리케이션은 URL로 서비스를 구분하지만,

URL 만으로는 서비스 구분이 어려운 경우가 있다.

이러한 경우 각 URL의 parameter 값으로 서비스를 구분할 수 있다.

 

모니터링 되는 어플리케이션 URL에 parameter 값이 포함되어 있을 경우,

해당 parameter 값을 포함하여 어플리케이션명을 보다 구체적으로 저장하여 구분지을 수 있다.

 

 

URL 예시)

아래와 같은 URL 호출 시

/iec/miAction.do?svcId=*****&formId=*****

Jennifer 상에서 어플리케이션명에 svcId 및 formId 값이 포함되어 기록된다.

 

옵션 적용 예시)

어플리케이션 이름에 포함하고자 하는 parameter 값을 지정한다.

해당 parameter 값을 포함하는 URL에 한해 어플리케이션명에 parameter 값이 포함된다.

여러 개의 parameter를 등록할 경우, 개행문자로 구분짓는다.

 


 

#. request_set_character_encoding, ignore_url_post_request_parsing_prefix 옵션

url_additional_request_keys 옵션은

Jennifer 측에서 원하는 파라미터 값을 지정하고 (svcId, formId)

소스 내부에 개입하여 값을 얻어오는 방식으로 구현된다.

(소스 내부에서 제니퍼 서블릿 구현체가 request.getParameter() + request.getInputStream() 메소드 호출)

 

request 객체에 Jennifer가 개입함으로 인해 POST request URL 에서 문제가 발생할 수 있다.

문제 발생 유형은 아래 두 가지가 있다.

 


 

01. 한글 인코딩 깨지는 현상 (request_set_character_encoding 옵션)

request를 제니퍼 에이전트에서 setCharacter 보다 먼저 꺼내게되면 

파일 인코딩 관련하여 문제가 발생한다.

 

request_set_character_encoding 옵션을 사용하면

제니퍼 측에서 setCharacterEncoding 메소드를 호출하게 되어 해결 된다.

 

WAS가 서비스 되고 있는 OS의 인코딩 값이 아닌, 소스 내부적으로 사용하는 Charset 을 확인하여

Jennifer 측과 맞춰준다.

 

 


 

02. 서비스 호출 시 NULL값 return 되는 현상 (ignore_url_post_request_parsing_prefix 옵션)

url_additional_request_keys 옵션 구현을 위해

소스 내부에서 제니퍼 서블릿 구현체가 request.getParameter() + request.getInputStream() 메소드를 호출한다.

 

문제는, request.getInputStream() 은 한 번만 핸들링 가능하다는 점이다.

Jennifer 측에서 맨 앞 단에서 getInputStream 으로 파라미터 값들을 전부 가져가버리면,

그 후에 소스 내부적으로 getInputStream을 호출하여도 이미 데이터가 존재하지 않으므로

NULL 값이 return 되는 문제가 발생한다.

 

(해당 문제 관련 제니퍼소프트 측 Comment)

 

Jennifer 내부적으로 url_additional_request_keys 옵션 구현을 위해

request.getInputStream() 메소드를 반드시 사용해야 한다고 한다.

따라서 소스 내부적으로 request.getInputStream() 을 사용하지 않도록 코드를 변경해야 한다.

(고객 입장에서는 당연히 납득하기 힘들 것)

 

혹은, ignore_url_post_request_parsing_prefix 옵션을 사용하여

문제가 발생하는 URL 에 대해서

Jennifer 측에서 request.getParameter() + request.getInputStream() 메소드를 호출하지 않도록

예외처리를 하는 것이 가능하다.

 

하지만, 문제가 발생할 때 마다

ignore_url_post_request_parsing_prefix 옵션에 URL을 무한정 추가할 수는 없다.

문제가 발생한 후에 조치를 하게 되므로 서비스 운영 상 올바르지 않다.

 

(이름이 변경되기전 원래 애플리케이션명을 등록해야 한다.)

 


 

#. use_service_naming_by_query_string 옵션

url_additional_request_keys 옵션에 파라미터 값이 설정되어 있는 상태에서

ignore_url_post_request_parsing_prefix 옵션에 설정된 URL 을 X-View에서 확인했을 시

어플리케이션 이름이 여전히 URL+parameter 형식으로 나온다.

이러한 경우에는  request.getQueryString() 값으로 대신해 설정 되기 때문이다.

(javax.servlet.http.HttpServletRequest.getQueryString() 메소드의 리턴 값)

 

use_service_naming_by_query_string 옵션을 사용하면

다이렉트로 getQueryString() 값을 이용해 서비스 이름을 설정할 수 있다.

소스 내부에 개입하는 대신 QueryString (쿼리스트링) 값을 그대로 가져올 뿐이므로

업무에 영향을 미칠 우려가 훨씬 적다.

 

원하는 파라미터 값만 지정할 수 있는 url_additional_request_keys 옵션과는 달리

use_service_naming_by_query_string 옵션은 쿼리스트링 상의 모든 값을 얻어오므로

Jennifer 상에서의 서비스 이름이 불필요하게 길어질 우려가 있기는 하다.

 

하지만 업무 서비스에 끼칠 영향도를 고려하면

use_service_naming_by_query_string 옵션을 사용하는 것이 훨씬 올바르다 할 수 있다.