웹훅 알림 설정
웹훅 알림 설정 (Configure webhook notifications)
연락처 포인트의 webhook 통합을 사용해 내 시스템으로 알림을 보낼 수 있어요. 알림이 트리거되면 알림 세부 정보와 추가 데이터를 담은 JSON 요청을 webhook 엔드포인트로 보냅니다. 이 통합은 시스템에 알림을 통합하는 유연한 방법이에요.
출처: 문서
본문
webhook 통합은 시스템에 알림을 통합하는 유연한 방법입니다. 알림이 트리거되면 알림 세부 정보와 추가 데이터가 담긴 JSON 요청을 webhook 엔드포인트로 보냅니다.
연락처 포인트용 webhook 구성
- Alerts & IRM → Alerting → Notification configuration 으로 이동한 다음 Contact points 탭을 선택합니다.
- + Add contact point → 이름 입력 → Integration 목록에서 Webhook 선택.
- URL 필드에 Webhook URL을 붙여넣습니다.
- (선택) 추가 설정 구성.
- Save contact point 클릭.
연락처 포인트 테스트·알림 활성화 방법은 Configure contact points 문서를 참고하세요.
Webhook 설정 (Webhook settings)
| 옵션 | 설명 |
|---|---|
| URL | Webhook URL. 이 필드는 Grafana Cloud에서 수정이 보호(protected) 됨 |
주의: URL은 보안 필드가 아니에요. 일반 텍스트로 저장되며 연락처 포인트를 다시 읽을 때 마스킹되지 않습니다. 토큰·비밀번호 같은 시크릿을 URL에 포함하는 것은 본인 책임입니다. webhook 엔드포인트에 인증하려면 선택 설정의 authorization 필드(예: Basic Authentication 또는 Authorization 요청 헤더)를 사용하세요. 이 필드들은 안전하게 저장되고 읽을 때 마스킹됩니다.
선택 설정 (Optional settings)
| 옵션 | 설명 |
|---|---|
| HTTP Method | 사용할 HTTP 메서드: POST 또는 PUT |
| Basic Authentication Username | HTTP Basic Authentication용 사용자명 |
| Basic Authentication Password | HTTP Basic Authentication용 비밀번호 |
| Authentication Header Scheme | Authorization 요청 헤더의 스킴. 기본값 Bearer |
| Authentication Header Credentials | Authorization 요청 헤더의 자격 증명 |
| Extra Headers | 요청에 포함할 추가 HTTP 헤더. 기본 Content-Type: application/json 헤더를 재정의해 요청 페이로드의 다른 content type 지정 가능 |
| Max Alerts | 알림에 포함할 최대 알림 수. 이 한도를 초과하는 알림은 무시됨. 0 은 무제한 |
| TLS | CA 인증서, 클라이언트 인증서, 클라이언트 키를 포함한 TLS 구성 옵션 |
| HMAC Signature | HMAC 서명 구성 옵션 |
참고: HTTP Basic Authentication 또는 Authorization 요청 헤더 중 하나만 구성할 수 있어요 — 둘 다는 안 됩니다.
HMAC 서명 (HMAC signature)
HMAC 서명으로 웹훅 알림을 보호해 요청의 신뢰성과 무결성을 검증할 수 있어요. 활성화하면 Grafana가 공유 시크릿으로 HMAC-SHA256을 사용해 웹훅 페이로드에 서명합니다.
| 옵션 | 설명 |
|---|---|
| Secret | HMAC 서명 생성에 사용되는 공유 시크릿 키 |
| Header | 서명이 설정될 HTTP 헤더. 기본값 X-Grafana-Alerting-Signature |
| Timestamp Header | 서명 계산에 타임스탬프를 포함할 선택적 헤더. 지정하면 Grafana가 이 헤더에 Unix 타임스탬프를 설정하고 HMAC 계산에 포함해 재생(replay) 공격을 방지 |
HMAC 서명 구성 시 Grafana는 시크릿 키로 HMAC-SHA256 서명을 생성합니다. 타임스탬프 헤더가 지정되면 Unix 타임스탬프가 서명 계산에 포함됩니다. 서명은 다음과 같이 계산됩니다:
HMAC(timestamp + ":" + body)
타임스탬프는 지정된 헤더로 전송됩니다. 타임스탬프 헤더가 없으면 서명은 요청 본문만으로 계산됩니다. 서명은 지정된 서명 헤더에 hex 인코딩 문자열로 전송됩니다.
요청 검증 (Validate a request):
- 헤더에서 서명 추출(기본
X-Grafana-Alerting-Signature). - 타임스탬프 헤더를 구성했다면 타임스탬프 값을 추출해 재생 공격 방지를 위해 최근 것인지 확인.
- 예상 서명 계산: 공유 시크릿으로 HMAC-SHA256 해시 생성 → 타임스탬프를 사용한다면 요청 본문 앞에 콜론(
:)이 포함된 타임스탬프 포함 → 원시 요청 본문 해시 → 결과를 hex 문자열로 변환. - 계산된 서명을 요청 헤더의 것과 비교.
템플릿을 사용한 선택 설정 (Optional settings using templates)
JSON 페이로드에 커스텀 데이터를 포함하려면 다음 설정을 사용합니다. 두 옵션 모두 알림 템플릿 지원.
| 옵션 | 설명 |
|---|---|
| Title | JSON 페이로드의 title 필드에 문자열로 값을 전송. 알림 템플릿 지원 |
| Message | JSON 페이로드의 message 필드에 문자열로 값을 전송. 알림 템플릿 지원 |
| Custom Payload | 기본 페이로드 형식을 커스텀 템플릿으로 대체(선택) |
선택 알림 설정 (Optional notification settings):
| 옵션 | 설명 |
|---|---|
| Disable resolved message | 알림이 해결될 때 알림 전송을 방지하려면 활성화 |
기본 JSON 페이로드 (Default JSON payload)
두 개의 발화 알림이 포함된 웹훅 알림 페이로드 예시:
{
"receiver": "My Super Webhook",
"status": "firing",
"orgId": 1,
"alerts": [
{
"status": "firing",
"labels": { "alertname": "High memory usage", "team": "blue", "zone": "us-1" },
"annotations": { "description": "The system has high memory usage", "runbook_url": "https://myrunbook.com/runbook/1234", "summary": "This alert was triggered for zone us-1" },
"startsAt": "2021-10-12T09:51:03.157076+02:00",
"endsAt": "0001-01-01T00:00:00Z",
"generatorURL": "https://play.grafana.org/alerting/1afz29v7z/edit",
"fingerprint": "c6eadffa33fcdf37",
"silenceURL": "https://play.grafana.org/alerting/silence/new?alertmanager=grafana&matchers=alertname%3DT2%2Cteam%3Dblue%2Czone%3Dus-1",
"dashboardURL": "",
"panelURL": "",
"values": { "B": 44.23943737541908, "C": 1 }
},
{
"status": "firing",
"labels": { "alertname": "High CPU usage", "team": "blue", "zone": "eu-1" },
"annotations": { "description": "The system has high CPU usage", "runbook_url": "https://myrunbook.com/runbook/1234", "summary": "This alert was triggered for zone eu-1" },
"startsAt": "2021-10-12T09:56:03.157076+02:00",
"endsAt": "0001-01-01T00:00:00Z",
"generatorURL": "https://play.grafana.org/alerting/d1rdpdv7k/edit",
"fingerprint": "bc97ff14869b13e3",
"silenceURL": "https://play.grafana.org/alerting/silence/new?alertmanager=grafana&matchers=alertname%3DT1%2Cteam%3Dblue%2Czone%3Deu-1",
"dashboardURL": "",
"panelURL": "",
"values": { "B": 44.23943737541908, "C": 1 }
}
],
"groupLabels": {},
"commonLabels": { "team": "blue" },
"commonAnnotations": {},
"externalURL": "https://play.grafana.org/",
"version": "1",
"groupKey": "{}:{}",
"truncatedAlerts": 0,
"title": "[FIRING:2] (blue)",
"state": "alerting",
"message": "**Firing**\n\nLabels:\n - alertname = T2 ..."
}
Body: 웹훅 알림의 JSON 페이로드는 다음 key-value 쌍을 포함합니다:
| 키 | 타입 | 설명 |
|---|---|---|
receiver |
string | 연락처 포인트 이름 |
status |
string | 알림의 현재 상태, firing 또는 resolved |
orgId |
number | 페이로드와 관련된 조직 ID |
alerts |
array | 트리거 중인 알림 |
groupLabels |
object | 그룹화에 사용되는 라벨 맵 |
commonLabels |
object | 모든 알람이 공통으로 가지는 라벨 맵 |
commonAnnotations |
object | 모든 알람이 공통으로 가지는 주석 맵 |
externalURL |
string | 이 웹훅을 보내는 Grafana 인스턴스의 외부 URL |
version |
string | 페이로드 구조 버전 |
groupKey |
string | 그룹화에 사용되는 키 |
truncatedAlerts |
number | 잘린(truncated) 알림 수 |
state |
string | 알림 그룹의 상태(alerting 또는 ok) |
다음 key-value 쌍도 JSON 페이로드에 포함되며 웹훅 설정의 알림 템플릿으로 구성할 수 있어요: title(string, 커스텀 제목), message(string, 커스텀 메시지).
Alert 객체: alerts 필드가 제공하는 알림 그룹에 포함된 알림을 나타냅니다.
| 키 | 타입 | 설명 |
|---|---|---|
status |
string | 현재 상태(firing/resolved) |
labels |
object | 이 알림의 라벨 맵 |
annotations |
object | 이 알림의 주석 맵 |
startsAt |
string | 알림 시작 시간 |
endsAt |
string | 알림 종료 시간, 미해결 시 기본 0001-01-01T00:00:00Z |
values |
object | 현재 상태를 트리거한 값 |
generatorURL |
string | Grafana UI의 알림 규칙 URL |
fingerprint |
string | 라벨 fingerprint, 같은 라벨의 알람은 같은 fingerprint |
silenceURL |
string | 알림 규칙을 침묵시키는 URL |
dashboardURL |
string | Dashboard UID 주석이 있으면 Grafana Dashboard 링크 |
panelURL |
string | Panel ID 주석이 있으면 패널 링크 |
imageURL |
string | 이 알림을 만든 규칙에 할당된 패널 스크린샷 URL |
Custom Payload: 이 옵션은 템플릿으로 웹훅 페이로드를 완전히 커스터마이즈합니다. 웹훅 요청의 구조·내용을 완전히 제어할 수 있어요.
| 옵션 | 설명 |
|---|---|
| Payload Template | 웹훅 페이로드의 구조를 정의하는 알림 템플릿 |
| Payload Variables | .Vars.<variable_name> 아래 템플릿에서 사용 가능한 추가 변수를 정의하는 key-value 쌍 |
참고: Custom Payload를 사용하면 Title 과 Message 필드는 무시됩니다(전체 페이로드 구조가 템플릿에 의해 결정). Custom Payload는 Grafana Cloud에서 아직 일반 제공(generally available) 되지 않았어요.
변수를 포함한 커스텀 페이로드 템플릿 예:
{
"alert_name": "{{ .CommonLabels.alertname }}",
"status": "{{ .Status }}",
"environment": "{{ .Vars.environment }}",
"custom_field": "{{ .Vars.custom_field }}"
}
JSON 템플릿 함수: 커스텀 페이로드 생성 시 유효한 JSON 구조를 만드는 데 도움이 되는 여러 템플릿 함수를 사용할 수 있어요. 사전(coll.Dict), 배열(coll.Slice, coll.Append) 생성, JSON 문자열·객체 간 변환(data.ToJSON, data.JSON) 등이 있습니다. 자세한 내용은 알림 템플릿 함수를 참고하세요.
JSON 헬퍼 함수 사용 예:
{{ define "webhook.custom.payload" -}}
{{ coll.Dict
"receiver" .Receiver
"status" .Status
"alerts" (tmpl.Exec "webhook.custom.simple_alerts" .Alerts | data.JSON)
"groupLabels" .GroupLabels
"commonLabels" .CommonLabels
"commonAnnotations" .CommonAnnotations
"externalURL" .ExternalURL
"version" "1"
"orgId" (index .Alerts 0).OrgID
"truncatedAlerts" .TruncatedAlerts
"groupKey" .GroupKey
"state" (tmpl.Inline "{{ if eq .Status \"resolved\" }}ok{{ else }}alerting{{ end }}" . )
"allVariables" .Vars
"title" (tmpl.Exec "default.title" . )
"message" (tmpl.Exec "default.message" . )
| data.ToJSONPretty " "}}
{{- end }}
{{ define "webhook.custom.simple_alerts" -}}
{{- $alerts := coll.Slice -}}
{{- range . -}}
{{ $alerts = coll.Append (coll.Dict
"status" .Status
"labels" .Labels
"startsAt" .StartsAt
"endsAt" .EndsAt
) $alerts}}
{{- end -}}
{{- $alerts | data.ToJSON -}}
{{- end }}