티스토리 뷰

프로젝트를 진행해보면서 DB Connection과 쿼리로 인한 메모리 및 CPU 사용량이 비정상적인 경우를 종종 볼 수 있었습니다. 이 부분을 어떻게 관리하면 좋을까 고민하던 중 slow query라는 것을 알게되었고 또 그 쿼리로그를 슬랙으로 보낼 수 있다는 것을 알게 되어 여러 블로그를 참조하며 작성하였습니다.

 

slowquery란?

slowquery 는 클라이언트의 요청을 받아 응답하는 과정에서 오래 걸리는 query에 대한 log를 의미합니다.

특정 작업이 오래 걸린다면 log를 통해 원인을 파악할 수 있으니 slow query를 사용하면 분석이 가능할 것이라 생각합니다.

 

 

어떻게 슬랙으로 보낼까요?

전체 구조는 다음과 같습니다.


1.AWS RDS 설정

모니터링할 인스턴스의 slow query를 설정

 

해당 Parameter 체크 후 Edit Parameter 선택!

네 가지 옵션을 설정.

  • slow_query_log = 1 (기본값 0 또는 로깅 없음)
  • long_query_time = 1 (1초 넘게 실행되는 쿼리 로그)
  • log_output = FILE
  • slow_query_log_file = slow query log를 저장할 경로와 이름

해당 파라미터 그룹이 할당된 RDS 인스턴스에 5초 이상 소요된 query는 로그에 남습니다.

(파라미터 그룹 설정 후 인스턴스를 수동으로 재부팅해야 반영됨!)

 

📌 설정확인 쿼리 

  • SHOW VARIABLES LIKE 'slow_query_%'
  • SHOW VARIABLES LIKE 'long_query_%'

 

6초 걸리는 query를 실제로 써서 로그에 남는 지 확인해보겠습니다.

실제로 log 가 기록되는 것을 확인할 수 있습니다.

 

log를 매번 AWS 에서 확인하기엔 불편합니다. Slack으로 query 알람을 보내 관리해봅시다.

 

slow query를 AWS CloudWatch에 저장하는데, 이 부분은 RDS 인스턴스 설정 '로그 내보내기' 에서 설정할 수 있습니다.

저는 RDS 인스턴스에 대해 누가 어떤 query를 날렸는지 추후에 관리하기 위해 slow query 이외의 로그 또한 추후에 관리하고 싶어서 체크하였습니다. slow query 로그만 체크하셔도 상관없습니다.

 

설정을 저장하고 "CloudWatch 서비스 -> 로그 그룹 -> slowquery 항목을 선택" 하여 로그를 확인합니다.


2. Slack

이 부분은 이동욱님의 블로그를 참고하여 직접 따라하며 겪은 내용을 적었습니다.

 

📌 해야할 리스트

1. Slack Web Hook 설정
2. CloudWatch Log 데이터 파싱 해줄 lambda 함수생성
3. CloudWatch slowquery 만든 lambda 구독
4. Slack 알람 확인

 

2-1. Slack WebHook 설정

"Incoming Webhooks" 혹은 "수신 웹후크"라는 앱을 "slack에 추가" 버튼을 눌러 추가합니다.

 

그 후 앱 설정에서 개인 취향에 맞게 이름과 이미지를 설정하시고 저장합니다.

 

 

설정한 WebHook API 가 잘 동작하는 지 웹후크 URL 가지고 PostMan 으로 확인합니다.

 

1. Headers에 Content-type: application/json을 등록합니다.

 

2. 보낼 메세지를 아래와 같이 Body -> raw 로 가서 아래와 같이 JSON 데이터를 만듭니다.

 

 

3. Slack GoGo!!!!

 

정상적으로 동작하는 것을 확인할 수 있습니다.

 


2-2 CloudWatch Log 데이터 파싱 해줄 lambda 함수 생성

 

람다 함수 생성해줍니다.

따로 설정해놓은 역할이 없기떄문에 "기본 Lambda 권한을 가진 새 역할 생성" 을 체크 후 생성하였습니다.

 

 

Mysql 테스트 로그를 람다 함수 테스트용으로 만듭니다.

 

Mysql 쿼리 로그는 아래와 같은 형식으로 전달합니다.

mysql Log

이동욱님의 블로그에선 PostgreSQL 로 진행하여 Mysql 은 어떻게 해야할지 곤란했었지만 어렵게 생각할 필요없이 위의 Log를 기존 메시지 포맷에서 logEvents.[].message 에 mysql 로그를 넣어주면 됩니다.

 

 {"messageType": "DATA_MESSAGE","owner": "123456789123","logGroup": "testLogGroup","logStream": "testLogStream","subscriptionFilters": ["testFilter"],"logEvents":[{"id":"eventId1","timestamp":1440442987000,"message":"# Time: 2022-04-25T03:26:50.887380Z # User@Host: admin[admin] @  [123.123.123.123]  Id:    19 # Query_time: 2.000317  Lock_time: 0.000000 Rows_sent: 1  Rows_examined: 1 SET timestamp=1650857208; select sleep(2);"}]}

 

 

아래는 람다 함수 Test 데이터로 위 Json을 gzip으로 압축한 모습입니다.

{
  "awslogs": {
    "data": "H4sIAAAAAAAACk1PbWvCMBD+K0f2ZQOVJG1tjQwU1jnBfdjafVkp0tlDyvpGEudE/O+7Vh0eJOR5yT13cGQVGpNtMT60yBSwp3k8X7+GUTRfhGzAmn2NuuOFdFxv7AcTehBfNtuFbnZtJ1k0dnXFvRRZjVl1o12IATO7L7PRRWuLpn4uSovakC3pfWfM0r5F+IO1JS05siJnimGHl7mgHragmW1WUbhwXe66chL4nPPBdRey30FMLgWSSznk7lB6MXeUHCuPj4LAdwL+CXfwYVDPXhpjFWR5VdRJf6cwA0hoz9HNSQGWuQIqMaGfbzvUh3U3CWWMKNwRPsCq2XxfSN6RVPDe7M3a0PAKBJwR/mYUg9ROQBTG8L/Qoxh7PPB8yYMpGCxxY8GUiO29fJiyU3r6A0i3ZFiwAQAA"
  }
}

 

데이터 파싱을 실행시킬 코드가 입력된 Lambda 함수작성하고 Test 해줍니다.

(추후 slack 메세지에 맞게 가공 후 webhook으로 알람을 보내는 코드 또한 필요)

 

 

세부 정보에서 결과를 볼 수 있고 CloudWatch에서 /aws/lambda/ 이동해서 해당하는 로그를 볼 수 있습니다.


2-3. CloudWatch slowquery 람다 구독

 

CloudWatch 에서 RDS Slowquery 그룹을 위에서 만들어준 lambda 함수에 구독합니다.


2-4. Slack 알람 확인

RDS slowquery를 슬랙으로 알람해주는 람다 함수에 구독을 했습니다. 잘 동작하는지 확인합니다.

 

 

 slowquery를 1초, 람다함수엔 3초로 설정하여 1초이상의 로그들은 CloudWatch에 다 저장하게 두고 3초이상의 쿼리만 슬랙알람으로 오게 됩니다.

 

 

 

 

 

참고

https://jojoldu.tistory.com/570

 

반응형
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2025/01   »
1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30 31
글 보관함