Log Analytics 및 KQL 쿼리
서비스의 안정성에 주의를 기울이기 시작하면서 서비스가 얼마나 잘 작동하는지(또는 잘 작동하지 않는지) 추적할 방법이 필요합니다. 종종 서비스의 로그에서 이 정보를 찾을 수 있으므로 해당 로그로 작업할 도구가 필요합니다. Log Analytics는 이러한 목적으로 Azure에서 사용할 도구입니다. 이를 통해 이 데이터를 쿼리하고 신뢰성 작업에 유용한 방식으로 표시할 수 있습니다.
로그 분석 쿼리 프로세스에는 KQL(Kusto 쿼리 언어)로 쿼리를 작성하는 작업이 포함됩니다. 다른 쿼리 언어(예: 대부분의 사람들이 약어로 SQL로 알고 있는 구조적 쿼리 언어)로 작업한 적이 있다면 KQL을 선택하는 데 문제가 없습니다. 아직 해보지 않았더라도 작동 방식을 알게 되면 기본적인 KQL 쿼리를 매우 쉽게 이해할 수 있을 것입니다.
Log Analytics 작동 원리
이것이 어떻게 작동하는지 봅시다. 다음은 Log mAnalytics 작동 방식에 대한 다이어그램입니다.
Log Analytics용 데이터는 다음을 비롯한 다양한 원본m에서 가져옵니다.
- Windows 이벤트 로그
- Linux 시스템의
syslog
- VM에서 실행되는 에이전트
- 사람들이 보내기로 선택한 사용자 지정 로그
- Azure 리소스의 메트릭
- Application Insights의 원격 분석 정보
이 모든 정보는 Log Analytics가 테이블이라고 부르는 것으로 들어옵니다. 각 테이블은 별도의 데이터베이스로 간주할 수 있습니다. 테이블에서 정보를 가져오는 쿼리를 작성하게 됩니다. 이 모듈의 뒷부분에서 보여줄 예제의 경우 주로 "requests"라는 테이블로 작업할 것입니다.
Log Analytics 인터페이스
다음 그래픽은 Log Analytics 인터페이스의 다양한 부분을 보여줍니다.
왼쪽에는 Log Analytics를 사용할 때 길을 잃지 않도록 하는 화면 섹션이 있습니다. 잠재적으로 작업 중인 테이블이 표시되고 섹션을 확장하면 해당 테이블에서 쿼리할 수 있는 필드 목록이 표시됩니다. 필드 또는 테이블 이름 중 하나를 선택하면 쿼리 구성 영역에 복사됩니다.
쿼리 생성 영역은 맨 위에 있습니다. 여기서 쿼리를 지정하고 실행합니다. 쿼리의 일부로 아직 지정하지 않았다면 데이터의 시간 범위를 제공할 수 있습니다. 한 번에 여러 쿼리에 대해 작업하려는 경우 쿼리를 저장하거나 추가 탭을 열 수 있습니다.
페이지 맨 아래에는 유용한 추가 정보가 있습니다. 여기에서 Log Analytics는 이전에 실행한 쿼리를 표시하므로 이전에 이미 지정한 항목으로 돌아가야 하는 경우 유용할 수 있습니다. 예를 들어 쿼리에 대해 작업하고 무언가를 시도한 후 역추적해야 하는 경우입니다.
KQL 쿼리 작성
KQL은 강력한 쿼리 언어입니다. 사용이 얼마나 쉬운지 알 수 있도록 몇 가지 기본 쿼리를 사용하여 간단히 설명하겠습니다. 나중에 일부 고급 기능(일부 기계 학습 기능 포함)을 사용하기 위해 자세히 알고 싶다면 Log Analytics 자습서를 확인하세요.
간단한 KQL 쿼리 작성으로 시작해 보겠습니다. 거의 모든 KQL 쿼리는 쿼리 중인 테이블인 데이터 워본으로 시작합니다. 따라서 "요청" 테이블에서 데이터를 쿼리하는 경우 쿼리 영역에서 다음과 같이 시작합니다.
Requests
KQL 쿼리의 다음 부분은 수행하려는 작업에 테이블을 연결하는 것입니다. 테이블 이름과 명령 사이에 파이프 문자(키보드에서 일반적으로 슬래시 키 위에 있는 세로 막대)를 사용합니다.
다음은 테이블을 정렬하여 찾은 상위 10개 레코드를 반환하는 간단한 쿼리입니다.
Requests
|top 10
다음은 “상위 10개” 대신 사용할 수 있는 다른 일반적인 명령의 몇 가지 예입니다.
상위 10개 대신 임의의 10개 레코드를 보려면(예: 테이블 구조 보기) 다음 명령을 사용할 수 있습니다.
requests |take 10
지난 30분 동안 들어온 레코드를 보려면 다음 쿼리를 사용할 수 있습니다.
requests |where timestamp > ago(30m)
또 다른 일반적인 작업은 데이터가 반환되는 순서를 지정하는 것입니다. 다음은 특정 필드(타임스탬프)를 기준으로 내림차순(예: 가장 최근 데이터 먼저)으로 정렬하는 쿼리의 예입니다.
requests |sort by timestamp desc
SQL과 마찬가지로 여러 조건을 설정하여 반환하려는 레코드를 지정할 수 있습니다. 추가 파이프 문자 및 절을 사용하여 조건을 추가합니다. 파이프 문자는 명령을 구분하기 때문에 첫 번째 명령의 출력이 다음 명령의 입력이 됩니다. 단일 쿼리에 원하는 수의 명령을 포함할 수 있습니다.
다음은 지난 30분 동안의 모든 404 응답 코드 레코드(예: 웹 서비스의 모든 "페이지를 찾을 수 없음" 레코드)를 반환하는 쿼리의 예입니다.
requests
|where timestamp > ago(30m)
|where toint(resultCode) == 404
이 쿼리는 효율성을 최대화하도록 작성되었습니다. 최근 30분 동안의 레코드만 먼저 선택하면 두 번째 절이 검색해야 하는 레코드 수가 크게 줄어듭니다. 이 쿼리를 반대 순서로 작성하면 먼저 데이터에서 처음부터 404를 모두 찾은 다음 대부분을 버리고 마지막 30분 분량만 제공합니다. 여러 조건을 사용하여 쿼리를 작성할 때는 항상 처리 순서를 생각하세요.
안정성 개선에 도움이 되는 이 모듈 뒷부분의 Log Analytics 기능으로 돌아가기 전 마지막 쿼리 예제입니다. 다음은 데이터에 기반한 계산을 보여 주는 쿼리입니다.
requests
|where timestamp > ago(30m)
|summarize count() by name, URL
이 쿼리는 지난 30분 동안 받은 요청의 요약을 반환합니다. 따라서 웹 서비스에서는 URL http://tailwindtraders.com
에 대한 GET index.html
요청이 2,875번 있었다고 알려줄 수 있습니다. 다음 단원에서 사용할 KQL 쿼리에 잘 연결되기 때문에 이 쿼리로 KQL 살펴보기를 일시 중지합니다.