

기계 번역으로 제공되는 번역입니다. 제공된 번역과 원본 영어의 내용이 상충하는 경우에는 영어 버전이 우선합니다.

# 메시징 템플릿 사용
<a name="alert-message-templates"></a>

****  
이 설명서 주제는 **Grafana 버전 8.x**를 지원하는 Grafana 워크스페이스를 위해 설계되었습니다.  
Grafana 버전 10.x를 지원하는 Grafana 워크스페이스의 경우 [Grafana 버전 10에서 작업](using-grafana-v10.md) 섹션을 참조하세요.  
Grafana 버전 9.x를 지원하는 Grafana 워크스페이스는 [Grafana 버전 9에서 작업](using-grafana-v9.md) 섹션을 참조하세요.

[연락 지점 작업](alert-contact-points.md)을 통해 전송되는 알림은 *메시징 템플릿*를 사용하여 빌드됩니다. Grafana의 기본 템플릿은 [Go 템플릿 지정 시스템](https://golang.org/pkg/text/template)을 기반으로 합니다. 여기서 일부 필드는 텍스트로 평가되고 다른 필드는 HTML(이스케이핑에 영향을 미칠 수 있음)로 평가됩니다.

대부분의 연락 지점 필드는 템플릿 지정 가능하므로 재사용 가능한 사용자 지정 템플릿을 생성하고 여러 연락 지점에서 사용할 수 있습니다. 이 [템플릿 데이터](#alert-template-data) 주제에서는 템플릿 지정에 사용할 수 있는 변수를 나열합니다.

**템플릿 사용**

템플릿은 메시지를 생성하는 데 사용됩니다. 예를 들어, Slack 알림 메시지를 사용하는 경우 연락 지점의에서제목과 본문을 설정할 수 있습니다. 다음 예제에서는 기본 템플릿을 사용하여 실행 알림 및 해결된 알림 수를 포함하는 제목과 알림 및 해당 상태를 나열하는 본문을 생성하는 방법을 보여줍니다.
+ **제목**:

  ```
  {{ len .Alerts.Firing }} firing, {{ len .Alerts.Resolved }} resolved
  ```
+ **텍스트 본문:** 

  ```
  {{ range .Alerts }}{{ .Status }}: {{ .Labels.alertname }}
  {{end }}
  ```

다음 예제와 같이 사용자 지정 템플릿을 생성할 수 있습니다.
+ **제목**:

  ```
  {{ template "slack.default.title" .}}
  ```
+ **텍스트 본문:** 

  ```
  {{ template "mymessage" .}}
  ```

다음은 샘플 템플릿입니다.

```
{{ define "myalert" }}
  [{{.Status}}] {{ .Labels.alertname }}

  Labels:
  {{ range .Labels.SortedPairs }}
    {{ .Name }}: {{ .Value }}
  {{ end }}

  {{ if gt (len .Annotations) 0 }}
  Annotations:
  {{ range .Annotations.SortedPairs }}
    {{ .Name }}: {{ .Value }}
  {{ end }}
  {{ end }}

  {{ if gt (len .SilenceURL ) 0 }}
    Silence alert: {{ .SilenceURL }}
  {{ end }}
  {{ if gt (len .DashboardURL ) 0 }}
    Go to dashboard: {{ .DashboardURL }}
  {{ end }}
{{ end }}
```

다음 절차에서는 사용자 지정 메시지 템플릿을 생성, 편집 및 삭제하는 방법을 보여줍니다.

**메시지 템플릿을 생성하는 방법**

1. Grafana 콘솔의 Grafana 메뉴에서 **알림**(종 모양) 아이콘을 선택하여 **알림** 페이지를 여세요.

1. **연락 지점**을 선택하세요.

1. **Alertmanager** 드롭다운에서 메시지 템플릿을 생성할 Alertmanager 인스턴스를 선택하세요. 기본값은 Grafana Alertmanager입니다.

1. **템플릿 추가**를 선택하세요.

1. 설명이 포함된 **이름**을 지정하세요.

1. 템플릿의 **콘텐츠**를 추가하세요. 예를 들어 다음과 같습니다.

   ```
   {{ define "mymessage" }}
     {{ range .Alerts }}
       [{{ .Status }}] {{ range .Labels }} {{ .Name }}={{.Value }}{{end}}
     {{ end }}
   {{ end }}
   ```

   콘텐츠 섹션의 `define` 태그는 템플릿 이름을 할당합니다. 이 태그는 선택 사항이며 생략하면 템플릿 이름이 **이름** 필드에서 파생됩니다. 둘 다 지정하면 동일하게 유지하는 것이 가장 좋습니다.

1. **템플릿 저장**을 선택합니다.

**참고**  
알림 메시지 템플릿의 HTML은 텍스트로 렌더링되며 제어 문자가 이스케이프 처리됩니다. Grafana는 결과 알림에서 HTML 렌더링을 지원하지 않습니다.

**메시지 템플릿을 편집하려면 다음과 같이 하십시오.**

1. **알림** 페이지에서 **연락 지점**을 선택하여 연락 시점 목록을 여세요.

1. **템플릿 테이블**에서 편집할 템플릿을 찾고 **편집** 아이콘(펜)을 선택하세요.

1. 변경을 수행하고 **템플릿 저장**을 선택하세요.

**메시지 템플릿을 삭제하려면 다음과 같이 하십시오.**

1. **알림** 페이지에서 **연락 지점**을 선택하여 연락 시점 목록을 여세요.

1. **템플릿 테이블**에서 제거할 템플릿을 찾고 **삭제** 아이콘(휴지통)을 선택하세요.

1. **예, 삭제**를 선택하여 템플릿을 삭제하세요.

**중첩된 템플릿**

다른 템플릿 내에 템플릿을 포함할 수 있습니다.

예를 들어 `define` 키워드를 사용하여 템플릿 조각을 정의할 수 있습니다.

```
{{ define "mytemplate" }}
  {{ len .Alerts.Firing }} firing. {{ len .Alerts.Resolved }} resolved.
{{ end }}
```

그런 다음, `template` 키워드를 사용하여 이 조각 내에 사용자 지정 템플릿을 포함할 수 있습니다. 예제:

```
Alert summary:
{{ template "mytemplate" . }}
```

다음 기본 제공 템플릿 옵션을 사용하여 사용자 지정 템플릿을 포함할 수 있습니다.


| 이름 | 참고 | 
| --- | --- | 
|  `default.title`  |  개요 수준의 상태 정보를 표시합니다.  | 
|  `default.message`  |  실행 알림 및 해결된 알림의 형식이 지정된 요약을 제공합니다.  | 

**사용자 지정 템플릿 예제**

다음은 사용자 지정 템플릿을 사용하는 방법에 대한 예제입니다.

단일 알림을 렌더링하기 위한 템플릿:

```
{{ define "myalert" }}
  [{{.Status}}] {{ .Labels.alertname }}

  Labels:
  {{ range .Labels.SortedPairs }}
    {{ .Name }}: {{ .Value }}
  {{ end }}

  {{ if gt (len .Annotations) 0 }}
  Annotations:
  {{ range .Annotations.SortedPairs }}
    {{ .Name }}: {{ .Value }}
  {{ end }}
  {{ end }}

  {{ if gt (len .SilenceURL ) 0 }}
    Silence alert: {{ .SilenceURL }}
  {{ end }}
  {{ if gt (len .DashboardURL ) 0 }}
    Go to dashboard: {{ .DashboardURL }}
  {{ end }}
{{ end }}
```

전체 알림 메시지를 렌더링하기 위한 템플릿:

```
{{ define "mymessage" }}
  {{ if gt (len .Alerts.Firing) 0 }}
    {{ len .Alerts.Firing }} firing:
    {{ range .Alerts.Firing }} {{ template "myalert" .}} {{ end }}
  {{ end }}
  {{ if gt (len .Alerts.Resolved) 0 }}
    {{ len .Alerts.Resolved }} resolved:
    {{ range .Alerts.Resolved }} {{ template "myalert" .}} {{ end }}
  {{ end }}
{{ end }}
```

## 템플릿 데이터
<a name="alert-template-data"></a>

다음 데이터가 메시지 템플릿에 전달됩니다.


| 이름 | Type | 참고 | 
| --- | --- | --- | 
|  `Receiver`  |  문자열  |  알림이 전송되는 연락 지점 이름.  | 
|  `Status`  |  문자열  |  하나 이상의 알림이 실행 중인 경우 실행이고, 그렇지 않으면 해결됨 상태입니다.  | 
|  `Alerts`  |  Alert  |  이 알림에 포함된 알림 객체 목록(아래 참조).  | 
|  `GroupLabels`  |  KeyValue  |  이러한 알림이 그룹화된 레이블.  | 
|  `CommonLabels`  |  KeyValue  |  이 알림에 포함된 모든 알림에 공통된 레이블.  | 
|  `CommonAnnotations`  |  KeyValue  |  이 알림에 포함된 모든 알림에 공통된 주석.  | 
|  `ExternalURL`  |  문자열  |  알림을 전송한 Grafana로 돌아가는 링크. 외부 Alertmanager를 사용하는 경우 이 Alertmanager로 돌아가는 링크.  | 

`Alerts` 유형은 반환된 알림을 필터링하기 위한 두 가지 함수를 노출합니다.
+ `Alerts.Firing` - 실행 알림 목록을 반환합니다.
+ `Alerts.Resolved` - 해결된 알림 목록을 반환합니다.

**알림(유형)**

알림 유형에는 다음 데이터가 포함됩니다.


| 이름 | Type | 참고 | 
| --- | --- | --- | 
|  Status  |  문자열  |  `firing` 또는 `resolved`  | 
|  레이블  |  KeyValue  |  알림에 연결된 레이블 세트.  | 
|  Annotations  |  KeyValue  |  알림에 연결된 주석 세트.  | 
|  StartsAt  |  time.Time  |  알림 실행이 시작되는 시간.  | 
|  EndsAt  |  time.Time  |  알림의 종료 시간을 알고 있는 경우에만 설정합니다. 그렇지 않으면 마지막 알림이 수신된 이후부터 구성 가능한 제한 시간으로 설정됩니다.  | 
|  GeneratorURL  |  문자열  |  Grafana 또는 외부 Alertmanager에 대한 백 링크.  | 
|  SilenceURL  |  문자열  |  이 알림의 레이블이 미리 채워진 Grafana 무음에 대한 링크. Grafana 관리형 알림에만 적용됩니다.  | 
|  DashboardURL  |  문자열  |  알림 규칙이 하나에 속하는 경우 Grafana 대시보드에 대한 링크. Grafana 관리형 알림에만 적용됩니다.  | 
|  PanelURL  |  문자열  |  알림 규칙이 하나에 속하는 경우 Grafana 대시보드 패널에 대한 링크. Grafana 관리형 알림에만 적용됩니다.  | 
|  지문  |  문자열  |  알림을 식별하는 데 사용할 수 있는 지문.  | 
|  ValueString  |  문자열  |  알림에서 축소된 각 표현식의 레이블과 값을 포함하는 문자열.  | 

**KeyValue 유형**

`KeyValue` 유형은 레이블과 주석을 나타내는 키/값 문자열 페어 세트입니다.

`KeyValue`로 저장된 데이터에 대한 직접 액세스 외에도 데이터를 정렬, 제거 및 변환하는 방법도 있습니다.


| 이름 | 인수 | 반환 | 참고 | 
| --- | --- | --- | --- | 
|  SortedPairs  |    |  키 및 값 문자열 페어의 정렬된 목록  |    | 
|  제거  |  []string  |  KeyValue  |  지정된 키 없이 키/값 맵의 사본을 반환합니다.  | 
|  이름  |    |  []string  |  레이블 이름 목록  | 
|  값  |    |  []string  |  레이블 값 목록  | 



## 템플릿 함수
<a name="alert-template-functions"></a>

템플릿 함수를 사용하여 레이블 및 주석을 처리해 동적 알림을 생성할 수 있습니다. 다음 함수를 사용할 수 있습니다.


| 이름 | 인수 유형 | 반환 타입 | 설명 | 
| --- | --- | --- | --- | 
|  `humanize`  |  숫자 또는 문자열  |  문자열  |  지표 접두사를 사용하여 숫자를 더 읽기 쉬운 형식으로 변환합니다.  | 
|  `humanize1024`  |  숫자 또는 문자열  |  문자열  |  humanize와 비슷하지만 1000이 아닌 1024를 밑으로 사용합니다.  | 
|  `humanizeDuration`  |  숫자 또는 문자열  |  문자열  |  기간(초 단위)을 더 읽기 쉬운 형식으로 변환합니다.  | 
|  `humanizePercentage`  |  숫자 또는 문자열  |  문자열  |  비율 값을 100의 분율로 변환합니다.  | 
|  `humanizeTimestamp`  |  숫자 또는 문자열  |  문자열  |  Unix 타임스탬프(초 단위)를 더 읽기 쉬운 형식으로 변환합니다.  | 
|  `title`  |  문자열  |  문자열  |  strings.Title, 각 단어의 첫 번째 문자를 대문자로 표시합니다.  | 
|  `toUpper`  |  문자열  |  문자열  |  strings.ToUpper, 모든 문자를 대문자로 변환합니다.  | 
|  `toLower`  |  문자열  |  문자열  |  strings.ToLower, 모든 문자를 소문자로 변환합니다.  | 
|  `match`  |  패턴, 텍스트  |  부울  |  regexp.MatchString 고정되지 않은 정규식 일치를 테스트합니다.  | 
|  `reReplaceAll`  |  패턴, 교체, 텍스트  |  문자열  |  Regexp.ReplaceAllString Regexp 대체(고정되지 않음).  | 
|  `graphLink`  |  문자열 - `expr` 및 `datasource` 필드가 있는 JSON 객체  |  문자열  |  지정된 표현식 및 데이터 소스에 대한 탐색의 그래픽 보기 경로를 반환합니다.  | 
|  `tableLink`  |  문자열 - `expr` 및 `datasource` 필드가 있는 JSON 객체  |  문자열  |  지정된 표현식 및 데이터 소스에 대한 탐색의 테이블 형식 보기 경로를 반환합니다.  | 
|  `args`  |  []interface\$1\$1  |  map[string]interface\$1\$1  |  객체 목록을 arg0, arg1과 같은 키가 있는 맵으로 변환합니다. 이 함수를 사용하여 여러 인수를 템플릿에 전달합니다.  | 
|  `externalURL`  |  없음  |  문자열  |  외부 URL을 나타내는 문자열을 반환합니다.  | 
|  `pathPrefix`  |  없음  |  문자열  |  외부 URL의 경로를 반환합니다.  | 

다음 표에는 각 함수 사용 예제가 나와 있습니다.


| 함수 | TemplateString | Input | 예상 | 
| --- | --- | --- | --- | 
|  인간화  |  \$1 humanize \$1value \$1  |  1234567.0  |  1.235M  | 
|  humanize1024  |  \$1 humanize1024 \$1value \$1  |  1048576.0  |  1Mi  | 
|  humanizeDuration  |  \$1 humanizeDuration \$1value \$1  |  899.99  |  14m 59s  | 
|  humanizePercentage  |  \$1 humanizePercentage \$1value \$1  |  0.1234567  |  12.35%  | 
|  humanizeTimestamp  |  \$1 humanizeTimestamp \$1value \$1  |  1435065584.128  |  2015-06-23 13:19:44.128 \$10000 UTC  | 
|  제목  |  \$1 \$1value \$1 title \$1  |  aa bB CC  |  Aa Bb Cc  | 
|  toUpper  |  \$1 \$1value \$1 toUpper \$1  |  aa bB CC  |  AA BB CC  | 
|  toLower  |  \$1 \$1value \$1 toLower \$1  |  aa bB CC  |  aa bb cc  | 
|  match  |  \$1 match "a\$1" \$1labels.instance \$1  |  aa  |  true  | 
|  reReplaceAll  |  \$1\$1 reReplaceAll "localhost:(.\$1)" "my.domain:\$11" \$1labels.instance \$1\$1  |  localhost:3000  |  my.domain:3000  | 
|  graphLink  |  \$1\$1 graphLink "\$1\$1"expr\$1": \$1"up\$1", \$1"datasource\$1": \$1"gdev-prometheus\$1"\$1" \$1\$1  |    |  /explore?left=["now-1h","now","gdev-prometheus",\$1"datasource":"gdev-prometheus","expr":"up","instant":false,"range":true\$1]  | 
|  tableLink  |  \$1\$1 tableLink "\$1\$1"expr\$1":\$1"up\$1", \$1"datasource\$1":\$1"gdev-prometheus\$1"\$1" \$1\$1  |    |  /explore?left=["now-1h","now","gdev-prometheus",\$1"datasource":"gdev-prometheus","expr":"up","instant":true,"range":false\$1]  | 
|  args  |  \$1\$1define "x"\$1\$1\$1\$1.arg0\$1\$1 \$1\$1.arg1\$1\$1\$1\$1end\$1\$1\$1\$1template "x" (args 1 "2")\$1\$1  |    |  1 2  | 
|  externalURL  |  \$1 externalURL \$1  |    |  http://localhost/path/prefix  | 
|  pathPrefix  |  \$1 pathPrefix \$1  |    |  /path/prefix  | 