파이썬 + 슬랙으로 에러 통계 데일리 요약 받아보기
안녕하세요 원티드랩 QA팀 김명관입니다.
전에 서비스의 헬스체크를 하는 스크립트를 만들어 Google Sheet에 기록하고, Looker Studio로 차트를 만들어 서비스 에러 통계를 확인하는 방법에 대해서 소개해 드린 적이 있습니다. (https://chance-doe.tistory.com/9) 에러 통계 차트를 만든 뒤 몇가지 개선하고 싶은 문제들이 생겼어요. 일단, 이 차트를 많은 분들께서 참고하셨으면 했지만 몇 명만 보게 된다는 문제가 있었습니다. 그리고 저는 매일 아침 해당 페이지에 접속해 어제 에러 통계는 어땠는지 확인하곤 하는데요 이것이 생각보다 귀찮았다는 문제였죠.. 😅 그래서 매일 아침 9시에 슬랙으로 주요 서비스들의 어제자 에러 통계를 보내주는 스크립트를 작성하게 되었는데요 그 과정을 정리해 보았습니다!
요구사항
머릿속으로 어렴풋이 '이런 기능이 있으면 좋겠다.' 싶은 간단한 요구사항을 정리했습니다.
1. 파이썬으로 어제 날짜의 에러 통계 데이터를 Google Sheet에서 읽어온다.
2. 읽어온 데이터를 정리하여 슬랙 메시지로 발송한다.
3. 월~금요일 아침 9시에 해당 스크립트를 실행한다.
기능 구현하기
1. 파이썬으로 어제 날짜의 에러 통계 데이터를 Google Sheet에서 읽어온다.
에러 통계 데이터는 이미 Google Sheet에 잔뜩 가지고 있으니 Python과 gspread 모듈을 이용하여 하루 전의 row 데이터를 읽어오도록 구현했습니다. gspread 모듈의 .row_valeus(행번호) 메소드를 이용하면 해당 행에 입력되어있는 데이터를 모두 가져올 수 있습니다. 가져온 데이터를 그대로 슬랙에 보낼 메시지로 만들기 위해 데이터를 약간 가공했습니다. 특히 행에서 가져온 데이터 중 첫번째 값은 사이트 명이라 글자 수가 모두 다릅니다. 그냥 가져와서 데이터로 이용한다면 사이트명 별 글자 수 차이로 인해 정렬이 맞지 않는 문제가 발생합니다. 이 문제는 모니터링 하는 사이트 중 이름이 가장 긴 곳의 글자수에서 현재 참조하는 사이트 명의 글자수를 빼고 나머지 부분을 모두 공백(' ')으로 채워 중앙정렬 시켜주었습니다.
for sheet_cnt in range(len(sheet_name_list)):
worksheet = doc.worksheet(sheet_name_list[sheet_cnt])
result_list = worksheet.row_values(3)
padding = ' '
result_list[0] = (f'{sheet_name_list[sheet_cnt]:{padding}^{max_length}}')
message_contents.add_row(result_list)
result_list.clear()
2. 읽어온 데이터를 정리하여 슬랙 메시지로 발송한다.
전에 이미 슬랙 메시지를 원티드랩 슬랙에 발송하는 함수를 만들어 두어 해당 함수를 재활용 했습니다. 발송할 메시지의 내용만 새로 만들었는데요, 머리에 잘 정리되지 않아 메모장에 먼저 수동으로 작성해 그것을 구현하는 방식으로 진행했습니다. 발송하고 싶은 내용은 이랬습니다.
사이트명과 에러 발생 데이터는 Google Sheet에서 읽어오는 대로 메시지로 추가하고 있으니 타이틀, 날짜, 에러 종류를 별도로 추가하였습니다. 내용을 구현하고 테스트로 발송한 메시지는 아래와 같은 모습이었습니다.
막상 메시지를 받아보니 사이트 명에 따라 데이터가 들쑥날쑥 하니 알아보기 어려웠고 모니터링 하는 에러 종류(300, 400, 500, timeout, error)들과 발생 데이터의 정렬도 맞지 않아 굉장히 보기 좋지 않았습니다. 데이터를 테이블 형태로 만들어 슬랙으로 발송해야겠다는 생각을 하게되었습니다.
2-a. 읽어온 데이터를 테이블로 정리하여 슬랙 메시지로 발송한다.
파이썬의 데이터를 테이블로 출력하는 방법중에 당장 알고있는 방법은 Pandas라는 모듈을 이용하는 방법이었습니다. 하지만 데이터를 파이썬 내에서만 사용하는 것이 아니라 문자열 형태로써 슬랙 메시지로 발송해야 했기 때문에 또다른 방법을 찾아보았고 Prettytable이라는 모듈을 이용하게 되었습니다. Prettytable 모듈로 구현하여 발송한 메시지는 이렇게 보여집니다.
헤더와 데이터도 정렬되었고 사이트명의 글자 수에도 영향을 받지 않도록 표로 구현하여 메시지를 보낼 수 있게 되었습니다.
3. 월~금요일 아침 9시에 해당 스크립트를 실행한다.
QA팀에서 실행중인 대부분의 스크립트는 Jenkins를 이용해 스케줄을 걸어둔 상태입니다. 따라서 해당 스크립트도 월~금요일 아침 9시마다 실행하도록 스케줄을 걸어두었습니다. Jenkins에서 스케줄을 걸어둘 때 Crontab이라는 문법을 이용하는데 영 익숙해 지지 않네요..ㅎ
매일 09시 00분 월~금요일에 반복하는 스케줄은 아래와 같이 걸어두었습니다.(혹시 틀렸다면 댓글 부탁드려요)
0 09 * * 1-5 (매일 09시 00분 월~금요일)
마무리
이미 다 가지고 있는 데이터와 모듈을 활용한 스크립트였기에 생각보다 되게 금방 만든 스크립트였습니다. 에러 통계 데이터를 슬랙에 발송해주는 스크립트를 만들고 싶었던건 꽤 오래되었는데 업무도 바쁘고 개인적인 스케줄도 꽉 찬 1~2월을 보내느라 뒤늦게나마 완성하게 되었네요. 😅 어쨌든 이렇게 제가 개선하고 싶었던 두가지 문제를 해결할 수 있었습니다. 하루 전 에러 통계를 메시지로 팀 채널에 발송해 팀원 모두가 데이터를 볼 수 있는 장치를 마련했고, 저 또한 매일 에러 통계 페이지에 들어가는 귀찮음을 덜어냈습니다. 🫡
저도 개발자는 아니지만 개발자가 아니더라도 코딩을 할 줄 알고 내 업무를 도와줄 코드를 만들 수 있다는 것은 너무 좋은 일이라고 생각합니다. 우리가 직접 하는 일 중에는 코딩을 통해 자동화 할 수 있는 일들이 의외로 많이 있거든요. 어쩌면 나의 시간들, 동료의 시간들을 많이 벌어 줄 수 있는 기회가 될 수 있습니다. 물론 본 업무가 소홀해지지 않아야겠죠 ㅎㅎ..
끝! 감사합니다!