본문

테크
webhook 알림 이용한 자동화

작성일 2024년 06월 28일

와탭 알림에서 제공하는 webhook 기능의 경우 단순히 다른 메신저로 알림을 받는 것뿐 아니라

다양한 프로그램과 연동하여 자동화에 사용할 수도 있습니다.

 

시나리오

a사 서버들은 디스크에 zfs 를 구성한 서버입니다.

 

최근 해당 서버들에서 자주 일어나는 현상은 갑자기 i/o wait 지표가 급증하여 서버에 지연이 발생하는 현상이 하루에도 몇 번씩 발생하는 현상이 확인되었습니다. 해당 서버 담당자는 이 현상이 zfs의 모듈 중 하나인 zed 때문에 발생하는 현상이며 zed 프로세스를 재시작 시 서버가 정상적으로 돌아온다는 것을 확인하였습니다. 해당 내용 확인 후 담당자는 i/o wait 발생할 때마다 어떤 서버인지 찾은 후 서버 접속, 재기동을 진행하다 보니 반복 작업이 아닌 자동화가 가능할지에 대한 고민이 시작되었습니다.

 

해결 방안

시나리오 상황에서 어떻게 하면 자동화가 쉬울지 생각을 하다 젠킨스에서 webhook 을 수신받은 후 젠킨스 서버가 알림이 발생한 서버에서 명령을 실행하는 방법을 생각하였습니다.

 

알림 설정

먼저 메트릭스 알림에서 임계치를 지정하여 알림을 설정합니다. 이번 예시에는 ServerBase 카테고리의 cpu_iowait 지표를 이용하겠습니다.

다음으로 알림 수신받을 3rd 파티 플러그인을 설정합니다. 알림 수신은 수신 태그를 통해 다른 알림을 받지 못하게 설정하며 젠킨스에게 webhook을 전달할 알림 수신 설정은 webhook json 타입으로 설정하였습니다.

 

   

{
"pcode":1234,
"projectName":"Sample project",
"time":1577840400000,
"oid":1234567890, 
"oname":"WAS-01"//Optional,
"title":"Alert Title",
"message":"Sample warning message"//Optional,
"level":"Warning", 
"status":"on", 
"metricName":"cpu"//Optional, 
"metricValue":"99.99"//Optional, 
"metricThreshold":"90"//Optional" 
}

   

 

 

webhook json의 경우 위와 같은 형식을 설정한 주소로 전송합니다. 작업을 하던 중 한가지 고민이 생깁니다.

 

“어떻게 알림이 발생한 서버를 전달하지?”

 

webhook으로 전달되는 값을 보니 어떤 서버인지 구분할 수 있는 구분자가 없다는 것을 알았습니다. 이때는 이벤트 메시지를 사용할 수 있습니다.

 

Untitled (20).png

 

메트릭스 알림 설정에서는 알림 메세지에 메트릭스 데이터의 태그 정보를 포함할 수 있습니다. 이를 이용하여 다음과 같이 ${host_ip} 로 설정하면 메트릭스 지표에 있는 태그 중 하나인 host_ip 를 메세지로 보낼 수 있게 됩니다. 이렇게 설정 시 위에서 설정한 webhook json 의 "message" 키값으로 ip 가 전달되게 됩니다. 

 

이후 설정한 알림과 등록된 webhook 에 이벤트 태그를 달아 다른 모니터링 알림에는 알림을 전송하지 않도록 해줍니다.

 

 

Untitled (21).png


젠킨스 설정

젠킨스에 접속하여 잡을 생성해줍니다. 이후 젠킨스에서 webhook trigger를 통해 다음과 같이 설정을 진행합니다.

 

Untitled (22).png

 

위와 같이 설정 시 webhook을 통해 전달받은 message를 젠킨스에서 사용 가능한 변수인 MESSAGE로 사용할 수 있습니다.

설정한 변수를 이용한다면 재기동 스크립트는 다음과 같이 간단히 작성할 수 있습니다.

 

ssh $MESSAGE sudo systemctl restart zed

 

이제 자동화를 위한 준비가 끝났습니다.

 

 

webhook 주소 등록

 

Untitled (23).png

 

젠킨스의 webhook trigger 설명을 보면 token 값 지정 후 http://JENKINS_URL/generic-webhook-trigger/invoke 로 웹훅을 설정하면 값을 받는다고 적혀있습니다.

 

위 사진과 같이 저는 ZED_RESTART라고 지정하였고 젠킨스 주소의 경우 jenkins.example.com 이라 가정하겠습니다. 이때 호출 jenkins webhook url 은 다음과 같습니다.

 

https://jenkins.example.com/generic-webhook-trigger/invoke?token=ZED_RESTART

해당 주소를 서드파티 플러그인의 Webhook JSON 에 기입합니다.

 

Untitled (24).png

 

등록 후 아래 사진과 같이 수신 태그 등록, 수신 태그 미설정 알림 받기 off 설정 시 i/o wait 알림만을 수신하여 젠킨스에게 전달하게 됩니다.

 

Untitled (25).png

 

결론

 

Webhook 의 경우 다양한 프로그램과 연동이 가능합니다.

webhook body 값을 사용하는 서비스와 맞춘다면 알림 발생 시 이슈트래커에 자동 이슈 등록, 위 시나리오와 같이 운영 자동화 등 사용할 수 있는 기능은 무궁무진합니다.

정규석[email protected]
DevOps TeamDevOps Engineer

지금 바로
와탭을 경험해 보세요.