알림 템플릿 언어

알림 템플릿 언어 (Alerting template language)

알림 템플릿(notification templates)과 알림 규칙 템플릿(alert rule templates, 예: annotations, labels)은 모두 Go 템플릿 언어인 text/template을 사용해요. range, if, and, index, eq 등 같은 키워드·함수·비교 연산자를 공유해요.

출처: 문서

본문

알림 템플릿과 알림 규칙 템플릿(annotations, labels 등)은 모두 Go 템플릿 언어 text/template을 사용해요.

두 템플릿 유형 모두 Go 템플릿 언어의 같은 키워드, 함수, 비교 연산자(range, if, and, index, eq 등)를 사용할 수 있어요.

다만 알림(notifications)과 알림 규칙(alert rules)이 별개의 컨텍스트에서 동작하기 때문에 일부 추가 변수와 함수는 알림 템플릿이나 알림 규칙 템플릿 중 하나에서만 사용할 수 있다는 점을 기억해야 해요. 다음을 참고하세요:

이 문서는 알림 템플릿과 알림 규칙 템플릿 모두에서 사용할 수 있는 Go 템플릿 언어의 함수와 연산자 개요를 제공해요.

출력 (Print)

무언가의 값을 출력하려면 {{}}를 사용해요. 변수의 값, 변수의 필드, 함수의 결과, 또는 dot의 값을 출력할 수 있어요.

{{ $values }}
{{ $values.A.Value }}
{{ humanize 1000.0 }}
{{ .Alerts }}

Dot

text/template에는 점(.)으로 쓰는 특별한 커서인 dot이 있어요. 이 커서를 템플릿에서 사용된 위치에 따라 값이 변하는 변수로 생각할 수 있어요.

알림 템플릿의 시작에서 dot(.)은 Notification Data를 가리켜요.

{{ .Alerts }}

annotation 및 label 템플릿에서 dot(.)은 모든 알림 데이터로 초기화돼요. 알림 라벨과 쿼리 값에 직접 접근하려면 $labels와 $values 변수를 사용하는 것을 권장해요.

Note

dot(.)은 range, with에서 사용하거나 다른 템플릿에서 사용하는 템플릿을 작성할 때 다른 것을 가리킬 수 있어요.

If

템플릿에서 if 문을 사용할 수 있어요. 예를 들어 변수가 비어 있을 때 Variable empty를 출력할 수 있어요:

{{ if $element }}
Element value: {{$element}}
{{ else }}
Element is empty
{{ end }}

With

withif 문과 비슷하지만, if와 달리 with 안의 표현식 값을 가리키도록 dot(.)을 업데이트해요:

{{ with $array }}
There are {{ len . }} item(s)
{{ else }}
There are no alerts
{{ end }}

Range

range는 배열 또는 맵을 순회하며, dot(.)이 배열의 현재 요소로 설정돼요:

{{ range $array }}
{{ .itemPropertyName }}
{{ end }}

선택적으로 else로 빈 객체를 처리할 수 있어요:

{{ range $array }}
  {{ .itemPropertyName }}
{{ else }}
  Empty array
{{ end }}

range 시작 부분에서 인덱스와 값 변수를 정의해 각 항목의 인덱스를 얻을 수도 있어요:

{{ $num_items := len $array }}
{{ range $index, $item := $array }}
This is item {{ $index }} out of {{ $num_items }}
{{ end }}

추가로 {{break}}로 남은 반복을 중지하거나, {{continue}}로 현재 반복을 중지하고 다음으로 계속할 수 있어요.

함수 (Functions)

text/template에서 사용 가능한 전역 함수는:

함수 설명
and 첫 번째 빈 인자 또는 마지막 인자를 반환해 인자의 boolean AND를 반환
call 함수여야 하는 첫 번째 인자를 나머지 인자를 파라미터로 호출한 결과 반환
html 인자의 텍스트 표현에 해당하는 이스케이프된 HTML 반환
index 첫 번째 인자를 다음 인자들로 인덱싱한 결과 반환. 예: {{ index $labels "instance" }}$labels 맵 변수의 instance 키를 반환
slice 첫 번째 인자를 나머지 인자로 슬라이싱한 결과 반환
js 인자의 텍스트 표현에 해당하는 이스케이프된 JavaScript 반환
len 인자의 정수 길이 반환. 예: {{ len $array }}
not 단일 인자의 boolean 부정 반환
or 첫 번째 비어 있지 않은 인자 또는 마지막 인자를 반환해 인자의 boolean OR 반환
print fmt.Sprint의 별칭
printf fmt.Sprintf의 별칭
println fmt.Sprintln의 별칭
urlquery URL 쿼리에 포함하기에 적합한 형태로 인자의 텍스트 표현의 이스케이프 값 반환

자세한 내용은 text/template의 함수 공식 문서를 참고해요.

비교 연산자 (Comparison operators)

text/template에서는 boolean 비교 연산자도 사용할 수 있어요:

함수 설명
eq arg1 == arg2의 boolean 진리값 반환
ne arg1 != arg2의 boolean 진리값 반환
lt arg1 < arg2의 boolean 진리값 반환
le arg1 <= arg2의 boolean 진리값 반환
gt arg1 > arg2의 boolean 진리값 반환
ge arg1 >= arg2의 boolean 진리값 반환

변수 (Variables)

text/template의 변수는 템플릿 내에서 생성해야 해요. 예를 들어 dot(.)의 현재 값으로 변수를 만들고 문자열이나 다른 객체를 변수에 할당할 수 있어요:

{{ $variable := . }}
{{ $variable := "This is a test" }}
{{ $variable }}

이 템플릿은 다음을 출력해요:

This is a test

템플릿 (Templates)

다른 템플릿에서 또는 같은 템플릿 안에서 실행할 수 있는 재사용 가능한 템플릿을 만들 수 있어요.

define과 큰따옴표 안의 템플릿 이름으로 템플릿을 정의해요:

{{ define "print_labels" }}
{{ end }}

__subject, __text_values_list, __text_alert_list, default.title, default.message 같은 기본 템플릿을 포함해 다른 템플릿과 같은 이름으로 템플릿을 정의해서는 안 돼요. 기본 템플릿이나 다른 알림 템플릿의 템플릿과 같은 이름으로 템플릿을 만들면 Grafana가 둘 중 아무거나 사용할 수 있어요. Grafana는 같은 이름의 템플릿이 두 개 이상 있어도 막지 않고 오류 메시지도 표시하지 않아요.

템플릿 실행 (Execute templates)

정의된 템플릿은 template, 큰따옴표 안의 템플릿 이름, 그리고 템플릿에 전달할 커서를 사용해 실행할 수 있어요:

{{ template "print_labels" . }}

템플릿 안에서 dot는 템플릿에 전달된 값을 가리켜요.

예를 들어 템플릿에 절정(firing) 알림 목록이 전달되면 dot는 그 절정 알림 목록을 가리켜요:

{{ template "print_alerts" .Alerts }}

템플릿에 알림의 정렬된 라벨이 전달되면 dot는 정렬된 라벨 목록을 가리켜요:

{{ template "print_labels" .SortedLabels }}

이것은 재사용 가능한 템플릿을 작성할 때 유용해요. 예를 들어 모든 알림을 출력하려면 다음을 작성해요:

{{ template "print_alerts" .Alerts }}

그런 다음 절정 알림만 출력하려면 이렇게 쓸 수 있어요:

{{ template "print_alerts" .Alerts.Firing }}

.Alerts.Alerts.Firing이 모두 알림 목록이기 때문에 이 작업이 작동해요.

{{ define "print_alerts" }}
{{ range . }}
{{ template "print_labels" .SortedLabels }}
{{ end }}
{{ end }}

Note

알림 템플릿처럼 라벨과 annotations에 대한 독립적이고 재사용 가능한 템플릿을 만들 수는 없어요. 알림 규칙 템플릿에서는 각 템플릿을 라벨 또는 annotation 필드 안에 인라인으로 작성해야 해요.

주석 (Comments)

{{/**/}}로 주석을 추가할 수 있어요:

{{/* This is a comment */}}

줄 바꿈을 피하려면 다음을 사용해요:

{{- /* This is a comment with no leading or trailing line breaks */ -}}

들여쓰기 (Indentation)

템플릿을 더 읽기 쉽게 만들기 위해 탭과 공백, 줄 바꿈을 사용한 들여쓰기를 사용할 수 있어요:

{{ range .Alerts }}
  {{ range .Labels.SortedPairs }}
    {{ .Name }} = {{ .Value }}
  {{ end }}
{{ end }}

하지만 템플릿의 들여쓰기는 텍스트에도 나타나요.

공백과 줄 바꿈 제거 (Remove spaces and line breaks)

text/template에서 {{--}}를 사용해 시작·끝 공백과 줄 바꿈을 제거해요.

예를 들어 템플릿을 더 읽기 쉽게 만들기 위해 들여쓰기와 줄 바꿈을 사용할 때:

{{ range .Alerts }}
  {{ range .Labels.SortedPairs }}
    {{ .Name }} = {{ .Value }}
  {{ end }}
{{ end }}

들여쓰기와 줄 바꿈은 텍스트에도 나타나요:

    alertname = "Test"

    grafana_folder = "Test alerts"

각 range 시작 부분에서 }}-}}로 바꿔 텍스트에서 들여쓰기와 줄 바꿈을 제거할 수 있어요:

{{ range .Alerts -}}
  {{ range .Labels.SortedPairs -}}
    {{ .Name }} = {{ .Value }}
  {{ end }}
{{ end }}

템플릿의 들여쓰기와 줄 바꿈이 이제 텍스트에 없어요:

alertname = "Test"
grafana_folder = "Test alerts"

더 알아보기 (Learn more)