AWS

AWS LogInsight 를 통해 RDS 하루마다 발생하는 SlowQuery 개수 검색하기

dev_roach 2022. 5. 23. 22:05
728x90

AWS LogInsight Query 를 사용하다보면 이런 생각이 문득든다.

@message field 안에 들어있는 메세지들을 어떻게 분리하여 검색조건으로 사용할 수 있을까? 혹은 @message 안에 텍스트들을 내가 특별하게 변수로 활용할 수 있을까? AWS LogInsight Query 를 공부해보거나 많이 사용해봤다면 알수도 있겠지만 이런 방법에 대해 설명해보려고 한다. 이제 어떻게 @message 내부를 검색의 조건으로 사용할 수 있는지 알아보도록 하자

예시

위의 사진을 보라 @message 본문의 내용들이다. 밑에 SELECT * FROM 뭐시기와 같은 field 도 적혀있다. 다만 보안상 쿼리는 보여줄 수 없어서 적지 않았지만 생김새는 RDS 의 slowQuery log 를 생각하면 된다. 그것과 같은 것이다.

목적

우리는 여기서 Query_time 이 30초 이상인 결과물을 검색하고 싶다. 하지만 LogInsight 를 가볍게 사용해봤다면 보통 Field 에 적혀있는 Field 들로는 Filter 가 가능하나 안에 있는 본문을 검색조건으로 사용하는 방법을 모를것이다. 

 

\

예를 들면 위의 사진에서는 대부분 생각할 수 있는 가짓수가 요정도 일 것이다.

| filter @message like '..'
| fitler @ingestionTime like '..'
| filter @log like '..'
| filter @logstream like '..'

하지만 @message 본문의 내용들도 쿼리로 활용이 가능하다. 아래 사진에서 우리의 목표는 Query_time 30초 이상인 쿼리를 구하는 것이라고 해보자.

해결방법

우리는 Query_time 이 30초 이상인 부분을 구해야 하므로 AWS Loginsight 에서 이용되는 Query 의 문법중 하나인 parse 를 이용할 것이다. parse 는 명령은 메시지 로그 형식에서 값을 추출하고 임시 필드 생성이 가능하다. 따라서 우리는 message 에서 Query_time 을 임시 필드로 생성시킬 것이다. parse 는 보통 정규식을 이용한다.

fields @timestamp, slowAboutCreate
| parse @message "Query_time: * Lock_time: *" as @queryInfo
| filter @queryInfo >= 30
| stats count(*) as slowAboutCreate by bin(1d)

위와 같이 작성하면 @queryInfo 에 Query_time 의 값이 담기게 된다.

이제 우리는 하루마다 발생하는 SlowQuery 의 개수를 구할 수 있게 되었다. 만약 정말 @queryInfo 의 동작여부를 눈으로 확인하고 싶다면 아래와 같이 쿼리를 작성하여 확인해봐도 된다.

fields @queryInfo
| parse @message "Query_time: * Lock_time: *" as @queryInfo
| filter @queryInfo >= 30

728x90

'AWS' 카테고리의 다른 글

AWS Target Group Health Check 경로 설정  (0) 2022.06.05
AutoScailing Group 만들어보기  (0) 2022.05.18
[AWS] MFA 인증 제거하기  (0) 2022.01.05