October 7, 2016

모니터링

완벽한 모니터링을 구축하기 위해서 자빅스의 아이템과 트리거를 세분화하고 있다. 어떤 아이템은 UserParameter를 통해서, 또 다른 것들은 External scripts, 그리고 트리거의 &(and)를 통해서 복합적인 상태를 모니터링 중이다.

모니터링의 조건을 세우는 것은 크게 어렵지 않다. 단지 모니터링 순간 정상이 아닐 경우에 에러를 던져주면 모니터링이라고 볼 수 있겠다. 그러나 정말 어려운 것은 “비정상"의 판단이다. 순간적인 상태를 가지고 "정상"인가, "비정상인가"를 판단하기가 매우 어렵다는 뜻이다. 만약 정상 상황에서 비정상이라 판단하여 알람을 발생시켰을 경우, 빈번한 알람으로 인한 피로감이 커질 것이고, 알람 자체에 무관심하게 되어 결과적으로는 빠른 대응을 불가능하게 만들 것이다.

정상과 비정상을 어떻게 판단할 수 있을까? 예를 들어 HTTP 200의 상태를 모니터링하는 아이템을 만들고, 200이외 응답이 발생했을 경우 알람을 발생시키는 트리거를 만들었다고 가정하자. 10번의 모니터링 결과 중 가장 최근의 응답이 200이 아니라면 이것을 알람으로 발생시켜야 할까? 당연히 그것은 아닐 것이다. 그 응답은 아직 서버의 문제라고 판단할 수 없다. 단순한 네트워크 순단일 수도 있기 때문이다. 따라서 알람 발생의 트리거는 다음과 같이 지정할 수 있다.

  • webserver.count(5m, 200)} < 3

5분동안의 모니터링 결과 중에서 값이 200인 것이 3개 미만일 경우 에러를 발생시키는 식이다. 만약 모니터링을 60초마다 한 번씩 했을 경우 다음과 같은 상황에서 모니터링 알람이 발생한다.

  • 200, 200, 500, 500, 500

이는 얼핏 보면 합리적인 것으로 보인다. 오탐이 쉽게 발생하지 않기 때문이다. 하지만 다음과 같은 상황에서는 어떨까?

  • 200, 200, 500, 200, 200, 500, 200, 200, 500, 200, 200, 500….

무언가 에러가 계속 발생하는데, 위 트리거에 해당되지 않아 알람이 발생하지 않는다. 유저는 요청 중에 지속적으로 에러가 발생하고는 있지만, 관리자는 알람을 받지 못하는 상황이다.

이를 해결하기 위해 트리거를 다음과 같이 변경한다면?

  • webserver.count(5m, 200)} < 3 | webserver.count(10m, 200) < 7

10분 동안의 200응답 결과가 7개 미만일 경우도 알람이 발생하게 된다. 그렇다면 이것으로 해결이 된 것일까? 하지만 이렇게 되면 위와 같은 모니터링 결과에서는 문제 발생 후 최소 7분 이후에나 알람을 전송받게 된다는 문제가 있다. 또한 이것도 500이 중간중간 조건에 해당되지 않게 상황에서는 마찬가지로 무용지물이 될 것이다. 이 말이 무슨 뜻이냐 하면, 모니터링 관련 조건을 만들 때에는 모든 사람을 만족하도록 하기가 쉽지 않다는 뜻이다.(=누구나 조건을 세운 사람을 욕한다는 뜻이다)

따라서 모니터링은 단순한 하나의 조건으로만 판단하면 안될 것이다. 반드시 여러 가지의 조건을 엮어, 정말 확실한 상황에서 알람이 오도록 설정해야 한다. 하지만 이것이 정말 힘들다. 무슨 방법을 쓰더라도 정확한 알람을 받도록 설정하는 것은 정말로 쉽지 않다.

그렇기 떄문에 완벽한 모니터링을 위해 이런 문제가 발생하는 것을 이해하고 모니터링 알람에만 의존하지 않는 것 또한 필요하다.