Azure Monitor 쿼리 에디터
Azure Monitor 쿼리 에디터 (Azure Monitor query editor)
Grafana는 Azure Monitor 데이터 소스용 쿼리 에디터를 제공하며, Explore 페이지나 대시보드 패널(패널 오른쪽 위 메뉴 → Edit)에서 접근할 수 있어요. Azure Monitor 데이터 소스는 Azure Monitor Metrics·Logs, Azure Resource Graph, Application Insights Traces에서 데이터를 쿼리할 수 있고, 각 소스는 전용 쿼리 에디터를 가져요.
출처: 문서
본문
핵심 개념 (Key concepts)
| 용어 | 설명 |
|---|---|
| KQL (Kusto Query Language) | Azure Monitor Logs와 Azure Resource Graph에서 쓰는 쿼리 언어. Unix 명령과 유사한 파이프 기반 문법이며 읽기 전용 데이터 탐색에 최적화. SQL을 안다면 SQL to Kusto 치트 시트가 도움 |
| Log Analytics workspace | Azure 리소스, 애플리케이션, 서비스의 로그 데이터를 수집·저장하는 Azure 리소스. KQL로 이 데이터를 쿼리 |
| Application Insights | Azure의 애플리케이션 성능 모니터링(APM) 서비스. 애플리케이션에서 요청·예외·트레이스 같은 텔레메트리를 수집 |
| Metrics vs. Logs | 메트릭은 정기 간격으로 수집되는 경량 숫자 값(예: CPU 비율). 로그는 다양한 스키마를 가진 상세 이벤트 기록(요청 로그, 오류 메시지). 메트릭은 시각적 쿼리 빌더를 사용하고, Logs는 KQL 필요 |
쿼리 에디터 모드 선택
Azure Monitor 데이터 소스의 쿼리 에디터는 쿼리할 Azure 서비스에 따라 네 가지 모드가 있어요: Metrics, Logs, Azure Resource Graph, Traces.
Azure Monitor Metrics 쿼리
Azure Monitor Metrics는 지원 리소스에서 숫자 데이터를 수집하고, 리소스의 상태·사용량을 조사하고 가용성·성능을 최대화하는 데 사용할 수 있어요. 특정 구조로 숫자 데이터만 저장하는 경량 형식으로, 거의 실시간 시나리오를 지원해 문제를 빠르게 감지하는 데 유용해요. 반면 Azure Monitor Logs는 각각 다른 구조를 가진 다양한 데이터 유형을 저장할 수 있어요.
Metrics 쿼리 만들기
Metrics 쿼리를 만들려면 구독, 리소스 그룹, 리소스를 선택하고 메트릭과 집계를 설정하면 돼요. 선택한 메트릭에 관련된 항목에 따라 사용 가능한 옵션이 달라져요. 추가 집계를 적용하거나 차원(dimensions)으로 필터링할 수도 있고, 템플릿 변수로 쿼리를 보강할 수 있어요.
범례 별칭 형식 (Format legend aliases)
Legend Format 필드에서 별칭을 조합해 Metrics의 범례 라벨을 변경할 수 있어요.
| 별칭 패턴 | 설명 |
|---|---|
{{ subscriptionid }} |
구독 ID로 대체 |
{{ subscription }} |
구독 이름으로 대체 |
{{ resourcegroup }} |
리소스 그룹으로 대체 |
{{ namespace }} |
Microsoft.Compute/virtualMachines 같은 리소스 유형/네임스페이스로 대체 |
{{ resourcename }} |
리소스 이름으로 대체 |
{{ metric }} |
"Percentage CPU" 같은 메트릭 이름으로 대체 |
{{ arbitraryDimensionID }} |
지정된 차원의 값으로 대체. 예: {{ blobtype }} → BlockBlob |
{{ dimensionname }} |
(하위 호환용) 첫 번째 차원의 이름으로 대체 |
{{ dimensionvalue }} |
(하위 호환용) 첫 번째 차원의 값으로 대체 |
차원으로 필터링 (Filter with dimensions)
일부 메트릭은 추가 메타데이터를 연결하는 차원(dimensions)이 있어요. 차원은 메트릭의 각 값에 할당되는 키-값 쌍으로 표현되며, Grafana는 차원 값에 따라 메트릭을 표시하고 필터링할 수 있어요. 데이터 소스는 equals, not equals, starts with 연산자를 지원해요.
Azure Monitor Logs 쿼리
Azure Monitor Logs는 지원 리소스에서 로그·성능 데이터를 수집·구성하고, KQL로 많은 데이터 소스를 함께 쿼리할 수 있게 해줘요. Metrics가 단순한 숫자 데이터만 저장하는 반면, Logs는 각각 다른 구조를 가진 다양한 데이터 유형을 저장할 수 있어요. KQL로 Logs 데이터에 대한 복잡한 분석을 수행할 수도 있어요. 데이터 소스는 Log Analytics 워크스페이스에 Basic Logs 테이블이 있으면 그 쿼리도 지원하며, 데이터 소스 구성에서 활성화해야 해요.
Logs 쿼리 빌더 (public preview)
참고: Logs 쿼리 빌더는 공개 미리보기(public preview) 기능이에요. 모든 Grafana 환경에서 활성화되지 않을 수 있어요.
Logs 쿼리 빌더는 KQL을 쓰지 않고 Azure Monitor Logs 쿼리를 만들 수 있는 시각적 인터페이스예요. KQL이 처음이거나 빠르게 쿼리를 만들고 싶은 사용자에게 유용해요. 기능이 활성화되면 Logs 쿼리 에디터에 Builder/Code 토글이 나타나요. 새 쿼리는 기본적으로 Builder 모드이고, 원시 KQL로 만든 기존 쿼리는 Code 모드로 유지돼요. Builder 모드로 전환하면 시간 범위 설정이 자동으로 Dashboard로 바뀌어요(빌더가 시간 필터링을 관리하기 때문). Builder에서 Code로는 언제든 전환할 수 있지만, Code에서 Builder로 전환하면 빌더 인터페이스로 표현할 수 없는 복잡한 쿼리는 보존되지 않을 수 있어요.
Logs 쿼리 만들기
Logs 쿼리는 KQL로 작성해요. 템플릿 변수로 쿼리를 보강할 수 있어요. Basic Logs 쿼리도 만들 수 있어요.
주의: Basic Logs 쿼리는 Azure가 쿼리당 비용을 청구해요. 사용 전에 Azure 가격 문서를 검토하세요.
참고: 시간 범위: 쿼리에 사용되는 시간 범위는 시간 범위 스위치로 변경할 수 있어요. Query 선택은 쿼리 안에 지정된 시간 범위만, Dashboard 선택은 Grafana 대시보드 시간 범위만 사용해요. 쿼리에 시간 범위가 지정되지 않으면 기본 Log Analytics 시간 범위가 적용돼요. 이전의 Intersection 옵션은 Dashboard로 마이그레이션됐어요.
Logs 결과 행 제한
Logs 쿼리가 Logs 결과 형식을 사용하면 Grafana는 브라우저 탭이 크래시되지 않도록 결과를 30,000행으로 잘라내요(로그 시각화가 모든 행을 한 번에 렌더링하기 때문). 잘릴 때 Grafana는 처음 30,000행을 한도에 도달했다는 알림과 함께 반환해요. 이 제한을 제거하려면 Grafana 구성에서 azureMonitorDisableLogLimit 기능 토글을 활성화하세요.
주의: 행 제한을 끄면 매우 큰 결과 집합에서 브라우저 성능이 저하될 수 있어요. 반환 행 수를 줄이려면
summarize로 집계하거나 시간 범위를 좁히는 편이 좋아요.
Logs 쿼리 예시
시간에 따라 변하는 값에는 시계열 쿼리를 사용하며, 보통 Time series 패널 같은 그래프 시각화에 쓰여요. 각 쿼리는 최소한 하나의 datetime 열과 숫자 값 열을 반환해야 하고, datetime 열 기준 오름차순으로 정렬되어야 해요. 숫자가 아닌(datetime 아닌) 열이 하나 이상 있는 쿼리도 만들 수 있는데, Azure는 그 열을 차원으로 간주해 응답에서 라벨이 돼요.
5분 단위로 평균화한 VM CPU 성능을 반환하는 예시:
Perf
// $__timeFilter is a special Grafana macro that filters the results to the time span of the dashboard
| where $__timeFilter(TimeGenerated)
| where CounterName == "% Processor Time"
| summarize avg(CounterValue) by bin(TimeGenerated, 5m), Computer
| order by TimeGenerated asc
시간, Computer, CounterName별로 집계된 개수를 반환하는 예시:
Perf
| where $__timeFilter(TimeGenerated)
| summarize count() by bin(TimeGenerated, 1h), Computer, CounterName
| order by TimeGenerated asc
시간, Computer, CounterName, InstanceName별로 개수와 평균 값을 반환하는 예시:
Perf
| where $__timeFilter(TimeGenerated)
| summarize Samples=count(), ["Avg Value"]=avg(CounterValue)
by bin(TimeGenerated, $__interval), Computer, CounterName, InstanceName
| order by TimeGenerated asc
Table 패널과 함께 테이블 쿼리를 사용하면 열과 행의 목록을 만들 수 있어요. 지정된 여섯 열을 가진 행을 반환하는 예시:
AzureActivity
| where $__timeFilter()
| project TimeGenerated, ResourceGroup, Category, OperationName, ActivityStatus, Caller
| order by TimeGenerated desc
Logs 쿼리에서 매크로 사용하기
쿼리 작성을 돕기 위해 where 절에서 여러 Grafana 매크로를 사용할 수 있어요.
| 매크로 | 설명 |
|---|---|
$__timeFilter() |
결과를 대시보드 시간 범위로 필터링. 예: TimeGenerated >= datetime(2018-06-05T18:09:58.907Z) and TimeGenerated <= datetime(2018-06-05T20:09:58.907Z) |
$__timeFilter(datetimeColumn) |
$__timeFilter()와 같지만 필터링할 커스텀 필드를 지정 |
$__timeFrom() |
대시보드 시간 범위의 시작 반환. 예: datetime(2018-06-05T18:09:58.907Z) |
$__timeTo() |
대시보드 시간 범위의 끝 반환. 예: datetime(2018-06-05T20:09:58.907Z) |
$__escapeMulti($myVar) |
다중 값 템플릿 변수의 불법 문자 이스케이프. $myVar 값이 '\\grafana-vm\Network(eth0)\Total','\\hello!'이면 @'\\grafana-vm\Network(eth0)\Total', @'\\hello!'로 확장. 단일 값 변수는 @'\\$myVar'처럼 인라인 이스케이프 |
$__contains(colName, $myVar) |
다중 값 템플릿 변수 확장. $myVar 값이 'value1','value2'이면 colName in ('value1','value2')로 확장. All 옵션 사용 시 Include All Option 체크 후 Custom all value에 all 입력. $myVar가 all이면 1 == 1로 확장. 옵션이 많은 변수는 큰 "where..in" 절을 피해 성능 향상 |
또한 Grafana는 초 단위 간격을 계산하는 내장 $__interval 매크로가 있어요.
Azure Resource Graph 쿼리
Azure Resource Graph(ARG)는 Azure Resource Management를 확장해 효율적인 리소스 탐색과 구독 집합 전반의 대규모 쿼리를 가능하게 하는 Azure 서비스예요. ARG로 복잡한 필터링으로 리소스를 쿼리하고, 거버넌스 요구 사항에 따라 리소스를 반복적으로 탐색하며, 광대한 클라우드 환경에서 정책 적용의 영향을 평가할 수 있어요.
ARG 쿼리는 KQL 변형으로 작성되지만, 모든 Kusto 언어 기능이 ARG에서 사용 가능한 건 아니에요. ARG 쿼리는 테이블 데이터 형식으로 지정돼요. 자격 증명이 여러 구독에 접근 권한을 준다면 쿼리 전에 여러 구독을 선택할 수 있고, 쿼리 범위를 변경해 디렉터리 단위로도 실행할 수 있어요.
참고: 디렉터리 수준에서 동작하는 일부 쿼리는 구독 수준에서 동작하지 않을 수 있고 그 반대도 마찬가지예요.
Resource Graph 쿼리 예시
리소스 속성으로 결과 정렬 — 선택한 구독의 모든 리소스 중 name, type, location 속성만 반환:
Resources
| project name, type, location
| order by name asc
태그 이름·값으로 복잡한 필터링 — environment 태그 값이 Internal인 리소스 목록 반환:
Resources
| where tags.environment=~'internal'
| project name
속성별로 값 그룹화·집계 — 권장 사항별 healthy, unhealthy, not applicable 리소스 개수 반환:
securityresources
| where type == 'microsoft.security/assessments'
| extend resourceId=id,
recommendationId=name,
resourceType=type,
recommendationName=properties.displayName,
source=properties.resourceDetails.Source,
recommendationState=properties.status.code,
description=properties.metadata.description,
assessmentType=properties.metadata.assessmentType,
remediationDescription=properties.metadata.remediationDescription,
policyDefinitionId=properties.metadata.policyDefinitionId,
implementationEffort=properties.metadata.implementationEffort,
recommendationSeverity=properties.metadata.severity,
category=properties.metadata.categories,
userImpact=properties.metadata.userImpact,
threats=properties.metadata.threats,
portalLink=properties.links.azurePortal
| summarize numberOfResources=count(resourceId) by tostring(recommendationName), tostring(recommendationState)
ARG에는 properties.displayName 같은 중첩 속성이 많으므로, 연산하려면 tostring()으로 문자열로 캐스팅해야 해요.
Resource Graph 쿼리에서 매크로 사용
Logs와 같은 매크로($__timeFilter(), $__timeFilter(datetimeColumn), $__timeFrom(), $__timeTo(), $__escapeMulti($myVar), $__contains(colName, $myVar))를 where 절에서 사용할 수 있어요. ARG의 $__timeFilter()는 Grafana 시간 선택기의 from/to 값으로 timestamp ≥ datetime(...) and timestamp ≤ datetime(...)로 확장돼요.
Application Insights Traces 쿼리
Azure Application Insights는 애플리케이션 성능 모니터링(APM) 기능을 제공하는 서비스로, 메트릭·텔레메트리·트레이스 로깅 데이터를 수집하는 데 사용할 수 있어요. Application Insights는 기본 Log Analytics 워크스페이스에 트레이스 데이터를 저장하고, 애플리케이션 개발자가 필요에 따라 추가 지원 정보를 제공하도록 트레이스를 확장할 수 있어요.
Traces 쿼리를 만들려면 애플리케이션(작업 영역)과 트레이스 형식을 선택하면 돼요. 쿼리를 실행하면 패널/대시보드 시간 범위로 지정된 시간 범위의 모든 트레이스 데이터가 반환돼요. 템플릿 변수로 쿼리를 보강할 수도 있어요.
알림 및 recording rules에 쿼리 사용
모든 Azure Monitor 쿼리 유형(Metrics, Logs, Azure Resource Graph, Traces)은 Grafana Alerting과 recording rules에 사용할 수 있어요.
대규모 Azure 리소스 데이터셋 작업
요청이 허용된 최대 레코드 수를 초과하면 결과가 페이지네이션되고 첫 페이지 결과만 반환돼요. 필터를 사용해 그 값 이하로 반환되는 레코드 수를 줄일 수 있어요.