'모니터링'에 해당되는 글 1건

  1. 2007.06.18 모니터링 스크립트 만들기. with perl by 하루하루

오늘은 코드 이야기좀 하겠습니다.  일종의 삽질기 입니다...;;
고수분들이 보시면 황당한 해법일 수도 있겠으나, 나름 고민한 최선의 방법 이네요. 크흑.
더 좋은 방법을 알고 계시면 트랙백 달아주세요....


어떤 데몬의 모니터링 스크립트를 만들다 보면 다음과 같은 문제점에 봉착할때가 있습니다.

해당 데몬이 제 역할을 수행하고 있는지를 확인하는데 사용하는 tool 로써 'monitorTool' 이라는게 있다면 보통 다음과 같이 실행을 시켜 보겠지요

[]# monitorTool example.co.kr


그럼 결과는 보통 3가지로 나타나게 됩니다.

1. OK
2. FAIL
3. WAIT

해당 툴을 가지고 모니터(상태 체크) 스크립트를 짤때 문제가 되는것은 3번 입니다. 시간이 중요한 상태체크에서 WAIT 가 걸려 버리면, 보통 일정 TIMEOUT을 주고 해당 시간이 지나서 리턴이 되게 되면 FAIL 로 처리하게 됩니다.

이게 보통의 로직이죠. 그런데, perl 과 같은 스크립트에서 다른 바이너리 명령어를 써서 모니터링을 할때는 이런 처리를 하기가 쉽지 않네요.

왜냐하면 보통 외부 프로그램을 실행 시킬때는 exec()  , system() , open() 함수로 실행을 하기 때문이지요.  이때  메인 스크립트에서 TIMEOUT 을 줄수 있는 방법은 없습니다. ( 혹시 아시는분 트랙백....혹은. 댓글.... 부탁 드려요..) 그래서 저는 c로  monitorTool를 실행할 컨테이너를 하나 만들었습니다. c 에서는 쓰레드로 빼서, TIMEOUT을 줄 수 있으니 가능 하더군요.

perl 스크립트 에서..

...
open(FH, "./runMonitorTool $REMOTE_HOSTNAME |");
my $ret = <FH>;
...

이런식으로 하면,  runMonitorTool 이라는 c 프로그램이 찍는 output 메세지 들을 FH 에서 받을 수가 있습니다. 따라서, C 프로그램에서 상태에따라 다른 값을 넘겨주면 좀더 세세한 제어가 가능해 지겠죠.

TIMEOUT 문제는 해결된거 같은데 아직 문제는 남아 있습니다.
monitorTool 이 사용자에게 알려주는 정보는 해당 시스템이 괜찮다 아니다를 메세지를 찍어서 보여주게 된다고 가정을 하면, 지금까지 한 프로그램은 큰 오류가 있습니다. WAIT에 걸리지 않고, 장애시 바로 리턴하게 되면 이때도 장애로 인식하지 않는것이죠. TIMEOUT에 걸리지 않았으니까요.

이 문제를 해결하기 위해서는 monitorTool 이 뿌려대는 메세지를 파싱해서 장애 판단을 해야 합니다. 하지만, C 에서 외부 프로그램을 실행하고, 그 외부 프로그램이 실행하면서 뿌려대는 메세지를 받을수가 없더군요. ( 이것또한 방법을 아시는 분은 저에게 트랙백이나.. 댓글을...쿨럭..;;;; ) 하지만, 프로그램이 실행후 끝나는 종료 코드는 얻어 올수 있지요.

그래서, 마지막으로 monitorTool 을 실행시킬 perl 코드를 짭니다. -_-;;; perlRunMonitor.pl 을 만듭니다. 이넘은 무슨 짓을 하냐면 단순히 monitorTool 을 실행시키고 메세지를 받아서 파싱하여 장애 판단후 종료 코드를 주어서 종료합니다.

이를테면 다음과 같죠

#!/usr/bin/perl

.....
open (FH , "monitorTool server |");
my $statusOK = 0;

while(my $ret = <FH>) {
        if( $ret =~ /I am OK/g ){
                $statusOK =1;
                break;
        }
}

close FH;

if( $statusOK == 0 ){
        exit 1;
}

이렇게 되면, 지정된 OK  문자열이 파싱될경우를 제외하고는 종료코드 1을 리턴하게 됩니다. 지정된 OK 문자열이 파싱될경우에는 정상 종료를 하게 되지요.
그럼 C 에서는 종료 코드를 얻어와서 그에 맞게 처리해 주고, TIMEOUT 이 나면 이것또한 에러처리를 해주게 됩니다.

그럼 정리를 해보면 다음과 같습니다.

PERL Main Script  -> C Run Container -> Perl Run Script


아 삽질이군여. 좀더 좋은 방법을 아시면 알려주세요오오오....

Posted by 하루하루