템플릿 예제
템플릿 예제 (Template examples)
Prometheus의 알림 라벨과 어노테이션, 그리고 서빙되는 콘솔 페이지에서 템플릿을 사용할 수 있어요. 템플릿은 로컬 데이터베이스에 대해 쿼리를 실행하고, 데이터를 순회하며, 조건을 쓰고, 데이터를 포맷하는 등의 일을 할 수 있어요. Prometheus 템플릿 언어는 Go 템플릿 시스템을 기반으로 해요.
이 문서는 단순한 알림 필드 템플릿부터 반복(iteration), 콘솔 URL 파라미터 사용, 재사용 가능한 템플릿 정의까지 실제 예제를 통해 템플릿 사용법을 보여 드려요. 코드와 템플릿 표현식은 그대로 두고, 설명을 한국어로 풀어드릴게요.
출처: 문서
본문
Prometheus는 알림의 어노테이션과 라벨, 그리고 서빙되는 콘솔 페이지에서 템플릿을 지원해요. 템플릿은 로컬 데이터베이스에 대해 쿼리를 실행하고, 데이터를 순회하며, 조건을 사용하고, 데이터를 포맷하는 등의 능력을 가져요. Prometheus 템플릿 언어는 Go 템플릿 시스템을 기반으로 해요.
단순한 알림 필드 템플릿 (Simple alert field templates)
alert: InstanceDown
expr: up == 0
for: 5m
labels:
severity: page
annotations:
summary: "Instance {{$labels.instance}} down"
description: "{{$labels.instance}} of job {{$labels.job}} has been down for more than 5 minutes."
알림 필드 템플릿은 발화하는 각 알림에 대해 모든 규칙 반복에서 실행되므로, 쿼리와 템플릿을 가볍게 유지하세요. 알림에 대해 더 복잡한 템플릿이 필요하다면 콘솔에 링크하는 것을 권장해요.
단순한 반복 (Simple iteration)
이것은 인스턴스 목록과 각각이 up인지 여부를 표시해요:
{{ range query "up" }}
{{ .Labels.instance }} {{ .Value }}
{{ end }}
특수 . 변수는 각 루프 반복에 대해 현재 샘플의 값을 담아요.
값 하나 표시 (Display one value)
{{ with query "some_metric{instance='someinstance'}" }}
{{ . | first | value | humanize }}
{{ end }}
Go와 Go의 템플릿 언어는 둘 다 강타입(strongly typed)이므로, 실행 오류를 피하려면 샘플이 반환됐는지 확인해야 해요. 예를 들어 스크랩이나 규칙 평가가 아직 실행되지 않았거나, 호스트가 다운됐을 때 그런 일이 생길 수 있어요.
포함된 prom_query_drilldown 템플릿은 이것을 처리하고, 결과를 포맷하며, 표현식 브라우저에 링크할 수 있게 해 줘요.
콘솔 URL 파라미터 사용 (Using console URL parameters)
{{ with printf "node_memory_MemTotal{job='node',instance='%s'}" .Params.instance | query }}
{{ . | first | value | humanize1024 }}B
{{ end }}
console.html?instance=hostname으로 접근하면 .Params.instance가 hostname으로 평가돼요.
고급 반복 (Advanced iteration)
{{ range printf "node_network_receive_bytes{job='node',instance='%s',device!='lo'}" .Params.instance | query | sortByLabel "device"}}
{{ .Labels.device }}
Received
{{ with printf "rate(node_network_receive_bytes{job='node',instance='%s',device='%s'}[5m])" .Labels.instance .Labels.device | query }}{{ . | first | value | humanize }}B/s{{end}}
Transmitted
{{ with printf "rate(node_network_transmit_bytes{job='node',instance='%s',device='%s'}[5m])" .Labels.instance .Labels.device | query }}{{ . | first | value | humanize }}B/s{{end}}
{{ end }}
여기서는 모든 네트워크 장치를 순회하며 각각의 네트워크 트래픽을 표시해요.
range 액션이 변수를 지정하지 않으므로, .가 이제 루프 변수가 되어 루프 안에서는 .Params.instance를 사용할 수 없어요.
재사용 가능한 템플릿 정의 (Defining reusable templates)
Prometheus는 재사용할 수 있는 템플릿 정의를 지원해요. 이것은 콘솔 라이브러리 지원과 결합할 때 특히 강력해서, 콘솔 간에 템플릿을 공유할 수 있어요.
{{/* Define the template */}}
{{define "myTemplate"}}
do something
{{end}}
{{/* Use the template */}}
{{template "myTemplate"}}
템플릿은 인자 하나로 제한돼요. args 함수를 사용하면 여러 인자를 감쌀 수 있어요.
{{define "myMultiArgTemplate"}}
First argument: {{.arg0}}
Second argument: {{.arg1}}
{{end}}
{{template "myMultiArgTemplate" (args 1 2)}}
더 알아보기 (Learn more)
- 알림 규칙 (Alerting rules) — 어노테이션 템플릿 기초
- 템플릿 참고 (Template reference) — 모든 템플릿 함수와 변수
- 콘솔 템플릿 — 콘솔 라이브러리 공유
- 표현식 브라우저 — 쿼리 결과 확인하기