티스토리 뷰
프로젝트를 진행해보면서 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 쿼리 로그는 아래와 같은 형식으로 전달합니다.
이동욱님의 블로그에선 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
'인프라 > AWS' 카테고리의 다른 글
AWS S3 URL 다운로드 제한을 IP로 할 수 있을까? (1) | 2023.03.26 |
---|---|
AWS Lambda로 RDS 와 외부 인터넷 접근하기 (0) | 2023.02.24 |
[AWS] Billing 에 관하여.. (0) | 2022.05.17 |
[AWS] AWS CLI로 Amazon S3 다뤄보기 (1) | 2022.02.09 |
[AWS] ec2 - http 웹서버 만들어보기 (1) | 2022.02.08 |
- Total
- Today
- Yesterday
- tcp
- 계층
- aws
- 초보
- lambda
- Spring Boot
- s3
- rds
- dto
- Docker
- 스위치
- 개발
- 자바
- osi7계층
- spring
- 회고
- ec2
- 프로토콜
- SpringBoot
- 라우팅
- 프로그래머스
- .NET
- 3Way Handshake
- 라우터
- 개발자
- 네트워크
- java
- 알고리즘
- 삽질
- 회고록
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |