제니퍼는 자바 애플리케이션에서 발생하는 예외(Exception)를 감지하고 자바 애플리케이션 상태를 분석하여 적절한 경보(Alert)를 발령한다. 경보는 심각(Critical), 에러(Error), 경고(Warning) 등으로 구분되는데, 사용자는 제니퍼 사용자 인터페이스를 통해서 실시간으로 경보 발령을 확인하고 과거 경보 내역을 분석할 수 있다.
경보와 예외의 이해
예외는 제니퍼 에이전트를 설치한 자바 애플리케이션이 트랜잭션을 처리하는 과정에서 java.lang.Throwable이 발생하거나, 응답 시간이 지연되는 것과 같은 특정 상태가 될 때 발생된다. 반면 경보는 제니퍼 서버가 제니퍼 에이전트로부터 수집한 다양한 성능 데이터를 분석하여 도출해내는 것이다.
제니퍼 서버가 발령하는 경보는 자바 애플리케이션에서 발생한 예외 및 다양한 성능 데이터를 근거로 한다.
제니퍼에서 예외와 경보를 이해하기 위해서는 어떠한 방식으로 이들이 발생하거나 생성되는지를 이해해야 한다.
애플리케이션 예외와 경보
모든 경보는 제니퍼 에이전트가 아닌 제니퍼 서버가 발령한다. 즉, 예외를 포함해 제니퍼 에이전트로부터 수집한 성능 데이터를 기반으로 제니퍼 서버가 경보를 발령한다.
제니퍼 에이전트는 매 트랜잭션마다 트랜잭션 성능 데이터를 제니퍼 서버에 전송하는데 트랜잭션 수행 도중에 예외가 발생하면, 트랜잭션 성능 데이터에 예외 코드를 포함시켜 전송한다.
트랜잭션 성능 데이터는 전송 빈도가 높기 때문에 작은 양의 데이터만을 제니퍼 서버에 전송해야 한다. 따라서 제니퍼 에이전트는 하나의 트랜잭션에서 발생한 예외 숫자와 상관없이, 하나의 예외 코드만을 트랜잭션 성능 데이터에 포함시켜서 제니퍼 서버에 전송한다. 즉, 하나의 트랜잭션에서 두 개 이상의 예외가 발생해도, 제니퍼 서버는 제니퍼 에이전트로부터 전송받은 하나의 예외만을 경보로 발령한다.
그러나 제니퍼 서버가 10분마다 수집하는 예외 현황 통계 데이터에는 하나의 트랜잭션에서 발생한 모든 예외가 포함된다.
예를 들어, 트랜잭션을 처리하는 과정에서 DB 연결에 실패하면 제니퍼 에이전트는 이를 ERROR_JDBC_CONNECTION_FAIL 예외로 감지한다. 그런데 애플리케이션 코드에서 DB 연결 실패에 대한 예외 처리를 하지 않았으면 서비스 시작점에서 또 다시 예외가 발생하고, 제니퍼 에이전트는 이를 ERROR_UNCAUGHT_EXCEPTION 예외로 감지한다. 그러면 제니퍼 에이전트는 트랜잭션 성능 데이터에 ERROR_UNCAUGHT_EXCEPTION 예외 코드만을 포함하여 제니퍼 서버에 전송한다. 그러나 10분마다 제니퍼 서버가 수집하는 예외 현황 통계 데이터에는 ERROR_JDBC_CONNECTION_FAIL 예외와ERROR_UNCAUGHT_EXCEPTION 예외가 모두 포함된다.
즉, 제니퍼 서버는 해당 트랜잭션에서 ERROR_UNCAUGHT_EXCEPTION 예외가 발생했다고 인지하고, ERROR_UNCAUGHT_EXCEPTION 경보를 발령한다. 그리고 ERROR_JDBC_CONNECTION_FAIL 예외와 ERROR_UNCAUGHT_EXCEPTION 예외는 [실시간 모니터링 | 애플리케이션] 메뉴에서 확인할 수 있다.
예외 유형과 경보 유형은 동일한 코드를 사용한다.
트랜잭션에서 복수의 예외가 발생하는 경우와 경보 발령
앞에서 설명한 것처럼 하나의 트랜잭션에서 여러 개의 예외가 발생하면 그 중 하나의 예외만 제니퍼 서버로 전송되고, 제니퍼 서버는 이를 경보로 발령한다. 여러 개의 예외 중에서 제니퍼 서버로 전송할 예외를 결정하는 기준은 다음과 같다.
우선 먼저 발생한 예외가 제니퍼 서버로 전달된다. 예를 들어, 외부 트랜잭션 처리 과정에서 응답이 지연되어 WARNING_TX_BAD_RESPONSE 예외가 발생한 후에, SQL 처리 과정에서 응답이 지연되어 WARNING_JDBC_BAD_RESPONSE 예외가 발생하면 WARNING_TX_BAD_RESPONSE 예외가 제니퍼 서버에 전송된다.
단, 트랜잭션이 끝나는 시점에 다음과 같은 예외가 발생하면 다른 예외에 우선하여 해당 예외를 제니퍼 서버에 전달한다.
ERROR_RECURRSIVE_CALL
ERROR_UNCAUGHT_EXCEPTION
ERROR_HTTP_IO_EXCEPTION
ERROR_OUTOFMEMORY
ERROR_UNKNOWN_ERROR
ERROR_PLC_REJECTED
실시간 성능 데이터와 경보
제니퍼 에이전트는 1초마다 응답 시간, 업무 처리량, 동시단말 사용자 수 등과 같은 성능 데이터를 제니퍼 서버에 전송한다. 그러면 제니퍼 서버는 이 정보를 기반으로 다양한 경보를 발령한다. 예를 들어, CPU 사용률이 높으면 제니퍼 서버는 WARNING_SYSTEM_CPU_HIGH 경보를 발령한다.
사용자 정의 경보
제니퍼 서버가 아닌 제니퍼 에이전트나 REMON 등에서 직접 경보를 발령하여 제니퍼 서버에 전송할 수도 있다. 이렇게 발령하는 경보 유형은 주로 USER_DEFINED_FATAL,USER_DEFINED_ERROR, USER_DEFINED_WARNING, 그리고 USER_DEFINED_MESSAGE 등이다.
ExtraAgent와 같은 제니퍼 에이전트 어뎁터 혹은 REMON의 AlertFilter 필터를 이용해서 사용자 정의 경보를 발령할 수 있다. 자세한 사항은 [ExtraAgent 어뎁터]와 [ALERT]를 참조한다.
ExtraAgent에서 1초 동안 버퍼링 할 수 있는 최대 경고 개수를 제니퍼 에이전트의 max_num_of_direct_alert 옵션으로 설정할 수 있다.기본 값은 10이다. 1초 동안 설정된 값 이상의 사용자 정의 경보가 제니퍼 에이전트에서 발생하면 마지막 10개만 제니퍼 서버로 전달된다.
max_num_of_direct_alert = 10
경보 제어
특정 경보가 발령되지 않도록 제어할 수 있다. 즉 애플리케이션에서 특정 예외가 발생해도, 제니퍼 서버가 이를 경보로 발령하지 않도록 제어할 수 있다.
이는 발령된 경보 데이터를 다른 애플리케이션과 연동하는 것과는 다른 개념이다.
이를 위해서는 경보 발령과 다른 애플리케이션과의 경보 데이터 연동을 구분해야 한다. 경보 데이터 연동과 관련한 자세한 사항은 [경보 데이터 연동(343 페이지)]을 참조한다.
경보 발령 - 제니퍼 서버가 Alert 모듈을 통해서 경보를 발령한다.
경보 데이터 연동 - 제니퍼 서버가 SMS 모듈을 통해서 발령한 경보 데이터를 다른 애플리케이션에 전송한다.
경보 발령이나 경보 데이터 연동에 대한 제어는 [Congigure | Alert]메뉴에서 설정한다.
각 셀을 클릭하면 각 에이전트별로 경보를 제어할 수 있다. 또한 주요 임계값들도 설정된다.
경보와 예외 유형
제니퍼는 경보 유형을 심각(Critical), 에러(Error), 경고(Warning) 등 3 가지로 분류한다.
심각(Critical)
심각(Critical)으로 분류되는 경보 유형은 다음과 같다.
- ERROR_SYSTEM_DOWN
제니퍼 서버는 CPU 사용률을 모니터링하는 WMOND 프로세스가 정지하면 이 경보를 발령한다.
이 경보는 제니퍼 에이전트와는 관련이 없다
- ERROR_PROCESS_DOWN
제니퍼 서버는 애플리케이션이 다운되면 이 경보를 발령한다. 제니퍼 서버는 임계치(기본값은 8초)를 초과한 후에도 제니퍼 에이전트로부터 데이터를 받지 못하면, 해당 제니퍼 에이전트의 기동 여부를 체크하기 위해서 TCP 연결을 시도한다. 이 TCP 연결 시도가 실패하면 제니퍼 서버는 해당 제니퍼 에이전트를 설치한 애플리케이션이 정지된 것으로 간주한다.
애플리케이션이 정지되지 않았음에도 해당 애플리케이션이 장시간의 가비지 콜렉션을 수행하는 경우에는, 제니퍼 에이전트가 제니퍼 서버로 데이터를 보내지 못하고 제니퍼 서버의 TCP 연결 시도 역시 실패할 수 있다. 따라서 이 경우에도 ERROR_PROCESS_DOWN 경보가 발령될 수 있다.
임계치는 제니퍼 서버의 agent_death_detection_time 옵션을 통해서 설정한다. 단위는 밀리 세컨드이다.
agent_death_detection_time = 8000
이 경보와 상관없이 자바 애플리케이션이 정상적인 Shutdown 명령이 아닌 java.lang.System 클래스의 exit 메소드 호출과 같은 방법으로 종료되면 제니퍼 에이전트 로그 파일에 관련 내용이 기록된다. 로그 메시지는 다음과 같다.
20081024/150638:[B012] System.exit() detected. 20081024/150638:[B013] But it would be abnormal System.exit() on Servlet/JSP. at java.lang.Runtime.exit(Runtime.java:90) at java.lang.System.exit(System.java:906) at org.apache.jsp.exit_jsp._jspService(exit_jsp.java:45) at org.apache.jasper.runtime.HttpJspBase( ...
[B013] 코드는 서블릿이나 JSP가 수행되는 과정에서 java.lang.System 클래스의 exit 메소드가 호출되었다는 경고 번호이다. 스택트레이스를 통해서 애플리케이션 이름을 확인할 수 있다.
- ERROR_OUTOFMEMORY
제니퍼 서버는 자바 애플리케이션에서는 java.lang.OutOfMemoryError, 닷넷 애플리케이션에서는 System.OutOfMemoryException 예외가 발생하면 이 경보를 발령한다.
제니퍼 서버는 애플리케이션의 5 초 동안의 평균 서비스 처리률(Service Rate) 대비 PLC에 의한 부하량 제어률(Service Reject Rate)의 비율이 임계치를 초과하는 경우에 이 경보를 발령한다. 제니퍼 서버의 high_rate_reject_alert_limit 옵션을 통해서 임계치를 설정한다. 기본 값은 50이고 단위는 퍼센트이다.
high_rate_reject_alert_limit = 50
- ERROR_HIGH_RATE_FAIL
제니퍼 서버는 애플리케이션의 5 초 동안의 평균 서비스 처리율(Service Rate) 대비 실패율(Failed Rate)의 비율이 임계치를 넘은 경우에 이 경보를 발령한다. 제니퍼 서버의 high_rate_failed_alert_limit 옵션을 통해서 임계치를 설정한다. 기본 값은 50이고 단위는 퍼센트이다.
high_rate_failed_alert_limit = 50
- ERROR_SERVICE_QUEUING
제니퍼 서버는 애플리케이션의 5 초 동안의 평균 액티브 서비스 개수가 임계치를 초과하면 이 경보를 발령한다. 임계치는 제니퍼 서버의 active_service_alert_limit 옵션을 통해서 설정한다. 기본 값은 70이다.
active_service_alert_limit = 70
- ERROR_SYSTEM_CPU_HIGH_LONGTIME
제니퍼 서버는 30 초 동안의 평균 시스템 CPU 사용률이 임계치를 초과하면 이 경보를 발령한다. 제니퍼 서버의 sys_cpu_alert_limit 옵션을 통해서 임계치를 설정한다. 기본값은 95이고 단위는 퍼센트이다.
sys_cpu_alert_limit = 95
- ERROR_PROCESS_CPU_HIGH_LONGTIME
제니퍼 서버는 30 초 동안의 평균 프로세스 CPU 사용률이 임계치를 초과하면 이 경보를 발령한다. 기본 값은 90이고 단위는 퍼센트이다.
process_cpu_alert_limit = 90
- USER_DEFINED_FATAL
사용자가 REMON을 통해서 발령할 수 있는 심각 유형의 사용자 정의 경보이다.
에러(Error)
에러(Error)로 분류되는 경보 유형은 다음과 같다.
- ERROR_HTTP_IO_EXCEPTION
제니퍼 서버는 자바 애플리케이션에서 java.io.IOException, 닷넷 애플리케이션에서 System.IO.IOException 타입에 해당하는 예외가 발생하면 이 경보를 발령한다. 예를 들어, 사용자가 서비스를 요청하고 결과를 받기 전에 웹 브라우저를 닫는 경우가 이에 해당한다.
- ERROR_UNCAUGHT_EXCEPTION
제니퍼 서버는 자바 애플리케이션에서 다른 경보 유형에 해당하지 않는 java.lang.Exception, 닷넷 애플리케이션에서 System.Exception 타입의 예외가 발생하면이 경보를 발령한다.
애플리케이션 시작점까지 전달된 예외만 이 경보에 해당한다. 만약 애플리케이션 처리과정에서 발생한 예외를 catch 문을 통해서 처리했다면 이 경보가 발령되지 않는다.
- ERROR_RECURRSIVE_CALL
제니퍼 서버는 애플리케이션에서 임계치를 초과하여 다른 서블릿/JSP/ASPX를 계속 호출하면 이 경보를 발령한다. 제니퍼 에이전트의 recurrsive_call_max_count 옵션을 통해서 임계치를 설정한다.
[에이전트옵션] 기본 값은 50000이다.
recurrsive_call_max_count = 50000
서블릿 혹은 JSP가 다른 서블릿 혹은 JSP를 호출한다는 것은 자바 코드 상에서 javax.servelt.RequestDispatcher 객체의 forward 혹은 include 메소드를 호출하는 것을 의미한다.
이 경보의 원인을 파악하기 위해서 제니퍼 에이전트 로그 파일에 관련 스택트레이스를 기록하려면, 제니퍼 에이전트의 recurrsive_call_trace 옵션을 true로 지정한다.
[에이전트옵션] 기본 값은 false이다.
recurrsive_call_trace = true
기본적으로 제니퍼 에이전트 로그 파일에 기록되는 스택트레이스 글자수를 10,000자로 제한한다. 제니퍼 에이전트의 recurrsive_call_trace_size 옵션을 통해서 글자 수를 설정할 수 있다.
recurrsive_call_trace_size = 10000
- ERROR_PLC_REJECTED
제니퍼 서버는 자바 애플리케이션에서 PLC에 의해서 요청이 거절되면 이 경보를 발령한다.
- ERROR_DB_CONNECTION_FAIL
제니퍼 서버는 애플리케이션에서 DB 연결 객체를 얻지 못하면(데이터베이스 연결에 실패 하는 경우) 이 경보를 발령한다.
- ERROR_MAYBE_BUSY_PROCESS
제니퍼 서버는 임계치(기본 값은 8초)를 초과한 후에도 제니퍼 에이전트로부터 데이터를 받지 못하면, 해당 제니퍼 에이전트의 기동 여부를 체크하기 위해 TCP 연결을 시도한다. TCP 연결 시도가 성공하면 제니퍼 에이전트를 설치한 애플리케이션에서 데이터를 받지못한 시간 동안 가비지 콜렉션이 수행된 것으로 간주한다.
제니퍼 에이전트가 제니퍼 서버로 데이터를 전송하지 못하는데는 가비지 콜렉션 수행 이외의 다른 이유가 있을 수 있다. 따라서 이 경보를 100% 가비지 콜렉션에 의한 지연 현상으로 받아들여서는 안된다.
제니퍼 서버의 agent_death_detection_time 옵션을 통해서 임계치를 설정한다. 기본 값은 8000이고 단위는 밀리 세컨드이다.
agent_death_detection_time = 8000
- ERROR_UNKNOWN_ERROR
제니퍼 서버는 애플리케이션에서 다른 경보 유형에 해당하지 않는 java.lang.Error 타입의 예외가 발생하면 이 경보를 발령한다. 애플리케이션 시작점까지 전달된 예외만이 이 경보에 해당한다. 만약 애플리케이션 처리 과정에서 발생한 예외를 catch 문을 통해서 처리했다면 이 경보가 발령되지 않는다.
- USER_DEFINED_ERROR
사용자가 REMON을 통해서 발령할 수 있는 에러 유형의 사용자 정의 경보이다.
- ERROR_LOGICAL_PROCESS
제니퍼 서버는 ALSB(AquaLogic Service Bus) 혹은 WLI(WebLogic Integration) 등에서 논리적 에러가 발생한 경우에 이 경보를 발령한다.
경고(Warning)
경고(Warning)로 분류되는 경보 유형은 다음과 같다.
- WARNING_DB_CONN_UNCLOSED
제니퍼 서버는 애플리케이션에서 DB연결 객체를 사용한 후에 close 메소드를 호출하지 않으면 이 경보를 발령한다.
- WARNING_JDBC_STMT_UNCLOSED
제니퍼 서버는 자바 애플리케이션에서 java.sql.Statement 객체를 사용한 후에 close 메소드를 호출하지 않으면 이 경보를 발령한다..
- WARNING_JDBC_PSTMT_UNCLOSED
제니퍼 서버는 자바 애플리케이션에서 java.sql.PreparedStatement 객체를 사용한 후에 close 메소드를 호출하지 않으면 이 경보를 발령한다.
- WARNING_JDBC_CSTMT_UNCLOSED
제니퍼 서버는 자바 애플리케이션에서 java.sql.CallableStatement 객체를 사용한 후에 close 메소드를 호출하지 않으면 이 경보가 발령한다.
- WARNING_JDBC_RS_UNCLOSED
제니퍼 서버는 자바 애플리케이션에서 java.sql.ResultSet 객체를 사용한 후에 close 메소드를 호출하지 않으면 이 경보를 발령한다.
DB 연결 자원 미반환 경보 java.sql.Connection, java.sql.Statement, java.sql.ResultSet 객체 등을 DB 연결 자원이라고 한다. 제니퍼 서버는 이 객체들을 사용한 후에 해당 객체의 close 메소드를 호출하지 않으면 DB 연결 자원 미반환 경보를 발령한다. 자바 환경에서는 자원 미반환 경보가 실제보다 지연되어 발령된다.
- WARNING_DB_TOOMANY_FETCH
제니퍼 서버는 자바 애플리케이션에서 동일한 java.sql.ResultSet 객체에 대해서 임계치를 초과하여 패치(Fatch)를 하면 이 경보를 발령한다.
자바 환경에서 페치는 java.sql.ResultSet 객체의 next 메소드를 호출하는 것을 의미하고 닷넷 환경에서 페치는 System.Data.IDataReader 객체의 Read 메서드를 호출하는 것을 의미한다.
[자바] 제니퍼 에이전트의 jdbc_resultset_warning_fetch_count 옵션을 통해서 임계치를 설정한다. 기본 값은 5000이다.
jdbc_resultset_warning_fetch_count = 5000
- WARNING_JDBC_STMT_EXCEPTION
제니퍼 서버는 자바 애플리케이션에서 java.sql.Statement 객체의 execute, executeBatch, executeQuery, executeUpdate 등의 메소드를 통해서 쿼리를 수행하다가 java.sql.SQLException 예외가 발생하면 이 경보를 발령한다.
- WARNING_JDBC_PSTMT_EXCEPTION
제니퍼 서버는 자바 애플리케이션에서 java.sql.PreparedStatement 객체의 execute, executeBatch, executeQuery, executeUpdate 등의 메소드를 통해 쿼리를 수행하다가 java.sql.SQLException 예외가 발생하면 이 경보를 발령한다.
- WARNING_DB_BAD_RESPONSE
제니퍼 서버는 애플리케이션에서 SQL 수행 시간이 임계치를 초과하면 이 경보를 발령한다. 제니퍼 에이전트의 sql_bad_responsetime 옵션을 통해서 임계치를 설정한다. 기본 값 20000이고 단위는 밀리 세컨드이다.
sql_bad_responsetime = 20000
- WARNING_TX_CALL_EXCEPTION
제니퍼 서버는 자바 애플리케이션에서 외부 트랜잭션을 수행하다가 예외가 발생하면 이 경보를 발령한다.
- WARNING_TX_BAD_RESPONSE
제니퍼 서버는 자바 애플리케이션에서 외부 트랜잭션 수행 시간이 임계치를 초과하면 이 경보를 발령한다. 제니퍼 에이전트의 tx_bad_responsetime 옵션을 통해서 임계치를 설정한다. 기본 값은 10000이고 단위는 밀리 세컨드이다.
tx_bad_responsetime = 10000
- WARNING_APP_BAD_RESPONSE
제니퍼 서버는 애플리케이션에서 애플리케이션 트랜잭션 수행 시간이 임계치를 초과하면 이 경보를 발령한다. 제니퍼 에이전트의 app_bad_responsetime 옵션을 통해서 임계치를 설정한다. 기본 값은 10000이고 단위는 밀리 세컨드이다.
app_bad_responsetime = 10000
- WARNING_DB_UN_COMMIT_ROLLBACK
제니퍼 서버는 자바 애플리케이션에서 JDBC 트랜잭션을 시작(false를 파라미터로 java.sql.Connection 객체의 setAutoCommit 메소드를 호출)하고 java.sql.Statement 객체의 execute, executeBatch, executeUpdate 등의 메소드를 호출한 후에, 명시적으로 JDBC 트랜잭션을 종료(java.sql.Connection 객체의 rollback 혹은 commit 메소드를 호출)하지 않으면 이 경보를 발령한다.
그런데 java.sql.Statement 객체의 exeucte 메소드를 통해 SELECT 문을 수행하는 경우에는 이 경보가 실제 상황을 올바르게 설명하지 못한다. 이 경우에는 제니퍼 에이전트의 ignore_rollback_uncommited_error 옵션을 통해서 발령되지 않도록 설정할 수 있다.
ignore_rollback_uncommited_error = true
장기적으로는 SELECT 문이 exeucteQuery 메소드로 처리되도록 해당 소스 코드를 수정하는 것을 권장한다.
- WARNING_DUMMY_HTTPSESSION_CREATED
다음과 같이 JSP의 page 속성 중에 session을 명시적으로 false로 지정하지 않으면 JSP 수정 과정에서 javax.servlet.http.HttpSession 객체가 만들어진다.
<%@ page session="false" %>
- WARNING_DB_CONN_ILLEGAL_ACCESS
제니퍼 서버는 애플리케이션에서 2개 이상의 쓰레드가 동시에 동일한 DB연결 객체를 사용하면 이 경보를 발령한다.
- WARNING_ORACLE_XMLTYPE_UNCLOSED
제니퍼 서버는 애플리케이션에서 오라클 데이터베이스를 사용하면서 oracle.xdb.XMLType 객체의 close 메소드를 호출하지 않으면 이 경보를 발령한다.
- USER_DEFINED_WARNING
사용자가 REMON을 통해서 발령할 수 있는 경고 유형의 사용자 정의 경보이다.
- WARNING_CUSTOM_RUNTIME_EXCEPTION
Custom Trace 어뎁터를 이용해서 로직에서 발생한 java.lang.RuntimeException을 처리한 경우에 발령되는 경보이다.
- WARNING_CUSTOM_EXCEPTION
Custom Trace 어뎁터를 이용해서 로직에서 발생한 java.lang.Exception을 처리한 경우에 발령되는 경보이다.
- WARNING_CUSTOM_THROWABLE
Custom Trace 어뎁터를 이용해서 로직에서 발생한 java.lang.Throwable을 처리한 경우에 발령되는 경보이다.
- WARNING_RESOURCE_LEAK
제니퍼 서버는 사용자 정의 리소스 릭이 발생한 경우에 이 경보를 발령한다.
- WARNING_JVM_HEAP_MEM_HIGH
제니퍼 서버는 애플리케이션이 동작하는 시스템의 임의의 기간 동안의 평균 힙 메모리 사용률이 임계치를 초과하면 이 경보를 발령한다. 제니퍼 서버의 jvm_heap_warning_limit 옵션을 통해서 임계치를 설정한다. 기본 값은 95이고 단위는 퍼센트이다.
jvm_heap_warning_limit = 95
그리고 임의의 기간은 제니퍼 서버의 jvm_heap_check_time 옵션으로 설정한다. 기본 값은 300이고 단위는 초이다.
jvm_heap_check_time = 300
그리고 이 경보가 발령되는 간격은 제니퍼 서버의 jvm_heap_warning_interval 옵션으로 설정한다. 기본 값은 3600이고 단위는 초이다.
jvm_heap_warning_interval = 3600
- WARNING_SYSTEM_CPU_HIGH
제니퍼 서버는 자바 애플리케이션이 동작하는 시스템의 30 초 동안의 평균 시스템 CPU 사용률이 임계치를 초과하면 이 경보를 발령한다. 제니퍼 서버의 sys_cpu_warning_limit 옵션을 통해서 임계치를 설정한다. 기본 값은 80이고 단위는 퍼센트이다.
sys_cpu_warning_limit = 80
ERROR_SYSTEM_CPU_HIGH_LONGTIME 경보가 우선한다.
- WARNING_PROCESS_CPU_HIGH
제니퍼 서버는 애플리케이션의 30 초 동안의 평균 프로세스 CPU 사용률이 임계치(기본값은 70 %)를 초과하면 이 경보를 발령한다. 제니퍼 에이전트의 process_cpu_warning_limit 옵션을 통해서 임계치를 설정한다. 기본 값은 70이고 단위는 퍼센트이다.
process_cpu_warning_limit = 700
ERROR_PROCESS_CPU_HIGH_LONGTIME 경보가 우선한다.
알림 메세지
- SYSTEM_MESSAGE
제니퍼 서버가 제니퍼 에이전트의 기동과 같은 상황을 알릴 때 사용하는 경보이다.
- USER_DEFINED_MESSAGE
제니퍼 에이전트나 REMON에서 사용할 수 있는 사용자 정의 경보 유형에 해당하는 알림 메시지 경보이다.
경보와 예외 데이터의 저장
경보와 예외 데이터는 성능 데이터베이스에 저장된다. 경보는 ALERT_01~31 테이블에 저장되고 예외는 ERRORS_10M_01~31 테이블에 저장된다. 그러나 해당 테이블들에 경보와 예외 데이터가 저장되는 방식에는 차이가 있다.
모든 예외는 경보에 포함되기 때문에 ALERT_01~31 테이블에는 예외 정보도 저장된다.
우선 ALERT_01~31 테이블에는 모든 경보가 저장된다. 예를 들어,ERROR_SERVICE_QUEUING 유형의 경보가 1건, WARNING_JDBC_STMT_EXCEPTION 유형의 경보가 2건이 발생하면 ALERT_01~31 테이블에는 3건의 경보 데이터가 저장된다.
그러나 ERRORS_10M_01~31 테이블에는 10분 구간을 기준으로 동일 예외에 대해서 1건만이 저장되고 CNT 칼럼에는 발생 건수가 저장된다. 따라서 위의 예에서 WARNING_JDBC_STMT_EXCEPTION 예외가 동일 10분 구간에서 발생했다면 ERRORS_10M_01~31 테이블에는 1건만이 저장되고 CNT 칼럼에는 2가 발생 건수로 저장된다.
경보와 예외 조회
제니퍼 사용자 인터페이스를 통해서 경보와 예외를 감지하고 분석하는 방법을 설명한다.
경보 차트와 보드 영역
제니퍼 대시보드 하단에 있는 경보 차트에 경보 내역이 실시간으로 표시된다.
경보 차트에는 차트 영역에 표시할 수 있는 개수의 경보 내역만이 나타난다. 그래서 상세내역은 경보 차트의 [관련 내용 보기] 버튼을 클릭하면 나타나는 경보 팝업 창에서 확인한다.
경보 차트에 있는 경보 내역을 지우려면 다음과 같이 한다.
경보 차트안으로 마우스 커서를 이동시킨 후에 오른쪽 버튼을 클릭한다.
컨텍스트 메뉴에서 [지우기] 메뉴를 선택한다.
경보 차트에서 경보 내역을 지워도 실제 경보 내역은 삭제되지 않고 성능 데이터베이스에 기록된다.
경보가 발생하면 오른쪽에 숨겨져 있던 보드 영역이 나타난다. 사용자는 보드 영역의 실시간 경보 내역을 통해서 금일 발생한 심각, 에러, 경고 유형의 발생 건수를 확인할 수 있다. 그러나 보드 영역만으로는 어떤 경보가 발생했는지를 확인할 수는 없다. 발생한 경보의 상세 내역은 보드 영역에서 [경보 내역 보기] 버튼을 클릭하면 나타나는 경보 내역 팝업창에서 확인한다.
경보 내역 팝업 창
경보 내역 팝업 창은 3개의 탭으로 구성되어 있다.
경보 내역 탭 | 설명 |
---|---|
금일 경보 내역 | 금일 발생한 모든 경보 내역을 보여준다. |
최근 경보 내역 | 최근 발생한 경보 내역을 보여준다. 경보가 발생한 시간과 상관없이 심각, 에러, 경고 유형별로 150개까지의 경보 내역을 보여준다. |
경보 내역 조회 | 과거에 발생한 모든 경보 내역을 검색할 수 있다. |
금일 경보 내역
경보 유형을 기준으로 금일 발생한 경보를 보여준다. 이 탭을 통해서 특정 경보 유형이 금일 몇 건 발생했는지 확인할 수 있다.
초기화 링크 - 특정 경보 유형의 [초기화] 링크를 클릭하면 해당 경보 유형의 금일 발생건수가 0이 되고 해당 경보 유형이 금일 경보 내역 목록에서 제거된다.
초기화 링크를 클릭해도 실제 경보 내역은 삭제되지 않고 성능 데이터베이스에 기록된다. 그리고 초기화 링크를 클릭하면 보드 영역의 실시간 경보 내역도 초기화된다. 따라서 이 경우에는 경보 내역 조회 탭에서 조회한 내용과 화면에 나타나는 내역 사이에 불일치가 발생한다.
최근 경보 내역
최근 발생한 경보 내역을 심각, 에러, 경고, 메시지 유형 별로 150 건까지 보여준다. 금일 경보 내역이 특정 경보 유형의 금일 발생 건수를 보여준다면, 최근 경보 내역은 개별 경보내역을 모두 보여준다.
초기화 링크 - [초기화] 링크를 클릭하면 심각, 에러, 경고 유형 중에서 현재 보고 있는 유형의 최근 경보 내역이 제거된다.
내용 - 해당 경보가 발생한 애플리케이션 이름이나 관련 내용을 보여준다.
초기화 링크를 클릭해도 실제 경보 내역은 삭제되지 않고 성능 데이터베이스에 기록된다.
경보 내역 조회
과거에 발생한 경보 내역을 조회할 수 있다. 과거는 최근 10분 구간 이전을 의미한다.
검색 조건은 다음과 같다.
검색조건 | 설명 |
---|---|
에이전트 | 상단 제니퍼 에이전트 목록에서 특정 제니퍼 에이전트를 선택한다. 모든 제니퍼 에이전트에 대해서 검색을 하려면 [모두]를 선택한다. |
날짜 | 조회할 경보가 발생한 날짜를 입력한다. |
시간 | 조회할 경보가 발생한 시간을 분단위까지 입력한다. |
유형 | 심각, 에러, 경고 등의 경보 유형을 선택한다. |
이름 | 조회할 경보 유형 이름을 입력한다. |
메시지 | 조회할 경보 메시지를 입력한다. |
최대 크기 | 검색 결과로 반환되는 경보 내역의 최대 건수를 입력한다. 기본은 50개이다. |
실시간 애플리케이션 목록
[실시간 모니터링 | 애플리케이션] 메뉴를 통해서 최근 10분 구간에서 발생한 예외 내역을 확인할 수 있다.
이 목록에는 경보가 아닌 애플리케이션 트랜잭션 처리시에 발생한 예외만이 표시된다.
통계 분석 애플리케이션 목록
[통계 분석 | 애플리케이션] 메뉴를 통해서 과거에 발생한 예외 내역을 확인할 수 있다. 과거는 최근 10분 구간 이전을 의미한다.
이 목록에는 경보가 아닌 애플리케이션 트랜잭션 처리시에 발생한 예외만이 표시된다.
X-View 차트
예외가 발생한 애플리케이션 트랜잭션은 X-View 차트에 붉은 색 계열로 표시된다.
DB 자원 미반환과 관련한 예외는 X-View 차트에 붉은 색으로 표시되지 않는다.
경보 데이터 연동
제니퍼 서버는 SMS 어뎁터로 경보 내용을 다른 애플리케이션에 전달할 수 있다.
경보 데이터 연동을 위한 기본 설정
SMS 어뎁터가 경보 데이터 연동을 담당하는데, SMS 어뎁터 구현 클래스는 제니퍼 서버의 sms_adapter_class_name 옵션으로 설정한다.
sms_adapter_class_name = com.javaservice.jennifer.server.SMSExample
두 개 이상의 SMS 어뎁터를 사용하려면 세미콜론[;]을 구분자로 구분하여, SMS 어뎁터를 제니퍼 서버의 sms_adapter_class_name 옵션으로 설정한다.
sms_adapter_class_name = com.javaservice.jennifer.server.SMSExample;com.javaservice.jennifer.server.AlertToLogFile
새로운 SMS 어뎁터를 개발하는 방법은 경보데이터 연동을 참조한다.
그리고 짧은 시간에 제니퍼 서버가 많은 경보를 발령하면, SMS 어뎁터가 빈번하게 해당 경보를 다른 애플리케이션에게 전송한다. 이렇게 동일한 경보를 중복해서 전송하는 것을 방지하려면, 제니퍼 서버의 sms_alert_minimal_interval 옵션을 이용해서 동일한 경보 유형에 대한 SMS 전송 간격을 조정해준다. 기본 값은 1000이고 단위는 밀리 세컨드이다.
sms_alert_minimal_interval = 1000
그리고 SMS 어뎁터가 특정 경보 유형에 대해서만 다른 애플리케이션에 전송하도록 설정할 수 있다. SMS 어뎁터로 전송하기를 원하는 경보 유형을 이름으로 사용하고 그 값을 true로 해서 제니퍼 서버의 옵션으로 지정하면 된다.
예를 들어, ERROR_PLC_REJECTED 경보 유형이 발생할 때 이를 SMS 어뎁터로 다른 애플리케이션으로 전송하려면 제니퍼 서버에 다음 옵션을 추가한다.
ERROR_PLC_REJECTED = true
기본적으로 SMS 어뎁터가 다른 애플리케이션으로 전송하도록 설정된 경보 유형은 다음과 같다.
ERROR_JVM_DOWN
ERROR_OUTOFMEMORY
ERROR_HIGH_RATE_REJECT
ERROR_SERVICE_QUEUING
USER_DEFINED_FATAL
SYSTEM_MESSAGE
USER_DEFINED_MESSAGE
제니퍼가 제공하는 SMS 어뎁터
제니퍼가 기본적으로 제공하는 SMS 어뎁터에 대해서 설명한다. 새로운 SMS 어뎁터를 개발하는 방법은 경보데이터 연동을 참조한다.
경보 로깅
com.javaservice.jennifer.server.AlertToLogFile SMS 어뎁터는 경보를 제니퍼 서버 로그 파일에 기록한다.
우선 제니퍼 서버의 sms_adapter_class_name 옵션으로 이 SMS 어뎁터를 설정한다.
sms_adapter_class_name = com.javaservice.jennifer.server.AlertToLogFile
제니퍼 서버 로그 파일에 기록되는 로그 메시지 포멧은 다음과 같다
ALERT:SERVER_DOWN:W11:20060323/123350:000 ALERT:ERR_SYSTEM_CPU:W11:20060323/123350:000:96.6%
메일 전송
com.javaservice.jennifer.server.AlertMail SMS 어뎁터는 경보를 메일로 전송한다. 우선 제니퍼 서버의 sms_adapter_class_name 옵션으로 이 SMS 어뎁터를 설정한다.
sms_adapter_class_name = com.javaservice.jennifer.server.AlertMail
그리고 default_sms로 시작하는 옵션들로 메일을 발송할 메일 서버 정보를 설정한다.
default_sms.mail.smtp.host = jennifersoft.com default_sms.mail.smtp.port = 25 default_sms.emailToList = tech@jennifersoft.com,admin@jennifersoft.com default_sms.emailFrom = tech@jennifersoft.com
그리고 메일 전송을 위한 자바 라이브러리 activation.jar 파일과 mail.jar 파일을 JENNIFER_HOME/server/common/lib 디렉토리에 복사한다.
AlertMail SMS 어뎁터는 메일 서버가 SMTP Relay를 허용하는 경우에만 사용할 수 있다.
SNMP TRAP
com.javaservice.jennifer.server.SnmpTrap SMS 어뎁터는 경보를 SNMP Trap을 이용하여 전송한다.
다음 설명은 SNMP TRAP을 이해하고 있다고 가정한다.
우선 제니퍼 서버의 sms_adapter_class_name 옵션으로 이 SMS 어뎁터를 설정한다.
sms_adapter_class_name = com.javaservice.jennifer.server.SnmpTrap
그리고 snmp_trap으로 시작하는 옵션들로 SNMP TRAP 정보를 지정한다.
# Private Enterprise Number(PEN) for JenniferSoft is 27767. snmp_trap_oid = 1.3.6.1.4.1.27767.1.1 snmp_trap_target_address = 127.0.0.1/162 snmp_trap_target_community = public
테스트를 위해서 JENNIFER_HOME/server/doc/snmp-trap/trapview.bat를 실행하면 제니퍼 서버가 전송하는 Trap 메세지를 콘솔에서 확인할 수 있다. 관련 메시지는 다음과 같다.
TRAP[requestID=506943247, errorStatus=Success(0), errorIndex=0, VBS[1.3.6.1.4.1. 27767.1.1 = 10:46:19,E,UNCAUGHT,T11,UNCAUGHT EXCEPTION]] TRAP[requestID=942904425, errorStatus=Success(0), errorIndex=0, VBS[1.3.6.1.4.1. 27767.1.1 = 10:46:21,E,UNCAUGHT,T11,UNCAUGHT EXCEPTION]] TRAP[requestID=270685152, errorStatus=Success(0), errorIndex=0, VBS[1.3.6.1.4.1. 27767.1.1 = 10:46:27,E,UNCAUGHT,T11,UNCAUGHT EXCEPTION]] TRAP[requestID=1772678772, errorStatus=Success(0), errorIndex=0, VBS[1.3.6.1.4.1 .27767.1.1 = 10:46:27,E,UNCAUGHT,T11,UNCAUGHT EXCEPTION]] TRAP[requestID=1562294832, errorStatus=Success(0), errorIndex=0,VBS[1.3.6.1.4.1 .27767.1.1 = 10:46:27,E,UNCAUGHT,T11,UNCAUGHT EXCEPTION]]
단문 서비스
경보를 단문 서비스로 전송하려면 외부의 SMS 서비스를 사용해야 한다. 제니퍼 라이센스에 외부 SMS 서비스에 대한 사용 권한이 포함되어 있지는 않다. 따라서 경보를 단문 서비스로 전송하려면 외부 SMS 서비스 제공 업체와 사용 계약을 체결하고, 해당 SMS 서비스 업체가 제공하는 API를 기반으로 SMS 어뎁터를 개발해야 한다.
공지기능
공지 기능은 제니퍼 4.5에 새로 추가된 기능이다. 시스템 관리자는 제니퍼의 “공지”기능을 통해서 주요 정보를 제니퍼 화면을 보고 있는 사람들에게 공지 할수 있다.
메세지를 추가하기 위해서는 간단하게 [Add]버튼을 클릭하고 추가한다 혹은 기존 메세지를 수정할 수 있다.
수정된 내용은 [Apply] 버튼을 클릭함으로써 모두에게 전파된다.
Auto Notice
경보 내용을 자동으로 사용자에게 공지하는 기능을 자동공지(AutoNotice)라 한다.
자동 공지는 sms Adapter를 등록함으로써 사용할 수 있다.
sms_adapter_class_name = com.javaservice.jennifer.server.AutoNotice
공지기능 제거
이전 버전 처럼 공지기능을 사용하지 않으려면 제니퍼 서버 옵션에 다음과 같이 설정한다
ui_dashboard_notice=True