Creative Commons License

Microsoft .NET

닷넷!시작하기
닷넷! Ver 2.0~
닷넷!스킬업
웹개발
윈폼개발
실용모듈개발
Tip & Tech
하루 한 문법

Microsoft .NET 개발자들을 위한 공간입니다. 기초강의에서 부터 고급 기술 정보 및 팁등을 다루도록 하겠습니다.

.

웹개발

이제 웹 기반 응용개발 지식은 거의 필수적으로 요구되는 시대입니다. 구체적인 웹 사이트 개발은 아니더라도 거시적인 웹 기반 서비스에 대한 지식 배양을 위해 할 것이 참 많네요 ^^

웹 사이트 모니터링

작성자 : 박종명
최초 작성일 : 2009-11-09 (월요일)
최종 수정일 : 2009-11-09 (월요일)
조회 수 : 4780

웹 사이트의 안정성을 위해 모니터링 솔루션을 만들기도 합니다

사이트의 안정성 확보는 사이트 자체가 오류 없이 서비스 되는 측면도 있지만,
오류가 발생했을 때 적시에 보고되고 정확한 오류 상황을 알려주어 신속히 디버깅되는 환경
갖추어져 있어야 하는 환경적 측면도 있습니다.

즉 모니터링 환경이죠

사이트가 예상한대로 동작하지 않는 상황이 발생하면, 그 즉시 관리자에게 상세한 설명과 함께 통지 되는 환경입니다

필자의 팀에서도, 이와 같은 웹 사이트 모니터링 환경을 나름대로 구축하고 있는데요...

기본 구조는 아래와 같습니다

간략히 설명하자면, 모니터링 에이전트가 일반적인 사용자 입장이 되어
웹 페이지를 주기적으로 호출하며, 그 결과 값을 분석하여 오류가 발생한 것이면, 관리자에게 통보하는 시스템입니다

이는 닷넷의 HttpWebResponse 객체를 이용하여 페이지를 요청하게 되는데, 대략 코드는 아래와 같습니다
----------------------------------------------------------------------------------------------------------------------------------
try
{
        string url = "http://사이트주소/페이지명";
        HttpWebRequest myHttpWebRequest = (HttpWebRequest)WebRequest.Create(url);                          
               
        HttpWebResponse myHttpWebResponse = (HttpWebResponse)myHttpWebRequest.GetResponse();
}
catch (Exception ex)
{
        WebException webException = ex as WebException;
        HttpWebResponse response = (HttpWebResponse) webException.Response;

        string errorMsg = webException.Message; //오류 메세지
        int statusCode = response.StatusCode.GetHashCode(); //http 응답 코드
                
                
        //StatusCode 에 따른 적절한 조치 
        //.............................
}
----------------------------------------------------------------------------------------------------------------------------------

모니터링할 페이지를 호출하게 되며, 그 페이지에 오류가 있으면 Exception이 발생해 catch 로 넘어오게 됩니다
catch 에서는 http 상태코드에 따라 적절한 조치를 하게 됩니다



그러나 보통 서비스 되는 웹 사이트는 오류 내용을 사용자에게 바로 보여주지 않습니다
이는 보안적 이슈도 있는데요,
페이지에 오류가 발생하면 미리 정의된 오류 페이지로 이동(Redirect) 시키는 것이 관례입니다

물론 저희 사이트도 그렇구요. 즉 아래의 구조와 같습니다


이러한 구조에서 모니터링 에이전트는 대상 페이지가 오류가 발생해도 결과적으로 오류페이지로 이동된
결과를 리턴받게 됩니다. 즉 아래와 같은 구조입니다


이렇게 되면, 모니터링 에이전트 입장에서는 대상 페이지가 오류 결과가 아닌,
오류 페이지의 결과를 받게 됩니다. 이때 오류페이지는 당연히 200 OK 가 떨어질 것입니다


즉 위 코드에서 catch로 넘어가지 않게 되는 것이죠.
대상 페이지는 오류가 발생했지만, 이동된 오류페이지는 정상 수행되었기 때문에 모니터링 에이전트 입장에서는
해당 요청은 성공한 것처럼 보입니다

이럴 경우, HttpWebRequest 객체의 AllowAutoRedirect 를 false 로 하면 자동 Redirect 되지 않게 할 수 있습니다
AllowAutoRedirect 속성은 서버의 리다리렉트를 자동으로 따를지에 대한 설정값입니다
----------------------------------------------------------------------------------------------------------------------------------
try
{
        string url = "http://사이트주소/페이지명";
        HttpWebRequest myHttpWebRequest = (HttpWebRequest)WebRequest.Create(url);   
        myHttpWebRequest.AllowAutoRedirect = false;                       
               
        HttpWebResponse myHttpWebResponse = (HttpWebResponse)myHttpWebRequest.GetResponse();
}
catch (Exception ex)
{
        WebException webException = ex as WebException;
        HttpWebResponse response = (HttpWebResponse) webException.Response;

        string errorMsg = webException.Message; //오류 메세지
        int statusCode = response.StatusCode.GetHashCode(); //http 응답 코드
                
                
        //StatusCode 에 따른 적절한 조치 
        //.............................
}
----------------------------------------------------------------------------------------------------------------------------------

이렇게 하면,
서버에서 오류페이지로 이동하더라도, 모니터링 에이전트는 해당 페이지에서 요청을 그칠 수 있게 됩니다


여기서 또 하나 집고 넘어갈 것이 있는데요..
바로 HTTP 응답코드 입니다

int statusCode = response.StatusCode.GetHashCode(); 

이 코드는 해당 페이지의 HTTP 응답코드를 가져오는 것입니다
즉 서버오류가 발생하면 500 코드가 반환됩니다. 즉 상세한 오류 정보는 알 수 없다는 것입니다
(위 코드에서는 302, 페이지 이동, 결과가 반환됩니다)

따라서 대상 페이지에 오류가 발생하면 어떤 오류가 발생했는지 상세한 정보를 알수 있도록 코드를 수정하겠습니다
----------------------------------------------------------------------------------------------------------------------------------
try
{
        string url = "http://사이트주소/페이지명";
        HttpWebRequest myHttpWebRequest = (HttpWebRequest)WebRequest.Create(url);   
        myHttpWebRequest.AllowAutoRedirect = false;                       
               
        HttpWebResponse myHttpWebResponse = (HttpWebResponse)myHttpWebRequest.GetResponse();
}
catch (Exception ex)
{
        //필요하면 뭔가 하세요....
        throw ex; //오류를 다시 넘깁니다.
}
----------------------------------------------------------------------------------------------------------------------------------

그리고 전역적인 Global.asax 파일에서 Error 이벤트를 등록합니다

void Application_Error(object sender, EventArgs e)

     // 처리되지 않은 오류가 발생할 때 실행되는 코드입니다.
     Exception ex = Server.GetLastError();
     Response.AppendHeader("error", Server.UrlEncode(ex.InnerException.Message));        
}

즉, 대상 페이지에 오류가 발생하면 이를 전역적인 오류 이벤트에서 캐치하여
http 헤더 값에 상세한 오류 내용을 덧붙여 응답하는 것이 키포인트 입니다

이렇게 하면, 모니터링 에이전트는 상태코드와 함께 헤더를 분석함으로써 구체적인 오류 내용을 관리자에게
통보할 수 있게 됩니다

지금까지의 내용을 구조화 하면 아래와 같습니다


참고로,
상세한 오류 정보를 일반 사용자에게 노출하는 것은 (보안상) 좋지 않습니다
따라서 모니터링 에이전트의 호출일 경우에만, 오류 내용을 헤더에 추가하는 로직이 필요할 것입니다

이름
비밀번호
홈페이지
EO <- 왼쪽의 문자를 오른쪽 박스에 똑같이 입력해 주세요