알림 API
엔드포인트: /api/alerts/
알림은 하나의 에피소드마다 한 행으로 남으며, 열려 있거나 해제된 상태로 존재합니다. 콘솔이 같은 행을 어떻게 보여주는지는 알림 이력을 참고하세요. 이 API는 알림 자체에 대해서는 읽기 전용입니다. 목록 조회, 상세 조회, 확인 처리는 할 수 있지만, 알림을 만들거나 수정하거나 삭제하는 기능은 없습니다. 모든 알림은 플랫폼이 스스로 발생시키고 해제합니다.
경고 규칙 API와 달리 이 엔드포인트 자체는 Metrics 확장 기능에 좌우되지 않습니다. 오프라인 알림과 보안 알림은 확장 기능 상태와 무관하게 항상 접근할 수 있습니다. 예외는 확장 기능에 속한 규칙(기본 제공되는 코어 디스크 사용률 규칙을 제외한 나머지)이 발생시킨 메트릭 알림으로, Metrics 확장 기능이 꺼져 있는 동안에는 목록에서 빠지고 상세 조회와 acknowledge도 404를 반환합니다.
목록
알림 목록 조회
알림 목록을 페이지네이션하여 가져옵니다. resolved를 지정하지 않으면 열려 있는 알림만 반환합니다. 해제된 이력을 보려면 resolved=true를 지정하세요.
요청
GET /api/alerts/쿼리 파라미터
| 파라미터 | 타입 | 설명 |
|---|---|---|
alert_type | string | 알림 유형으로 필터링: metric_threshold, server_disconnected, unauthorized_access, insecure_port_open, system_error, unknown_device, device_network_moved, system_user_conflict, agent_upgrade_failed |
severity | string | 심각도로 필터링 (critical, warning, info) |
server | string (UUID) | 서버로 필터링 |
server_name | string | 서버 이름으로 필터링(대소문자 구분 없는 부분 일치) |
rule | string (UUID) | 이 알림을 발생시킨 경고 규칙으로 필터링(메트릭 알림에만 해당) |
resolved | boolean | 해제 상태. 지정하지 않으면 열려 있는 알림만 반환합니다. true면 해제된 이력을 반환하고, false는 기본값을 명시적으로 지정하는 것과 같습니다 |
acknowledged | boolean | 내가 이 알림을 확인했는지 여부. checked와 dismissed 둘 다 확인한 것으로 셉니다 |
dismissed | boolean | 내가 이 알림을 명시적으로 무시(dismiss)했는지 여부. acknowledged보다 좁은 조건입니다 |
added_at__gte / added_at__lte | datetime | 이 시각 이후 / 이전에 발생한 알림만 |
search | string | 제목, 설명, 서버 이름을 대상으로 검색 |
ordering | string | 정렬 순서. acknowledged, added_at, updated_at, severity 중에서 지정. 기본값: acknowledged,-added_at |
page | integer | 페이지 번호 |
page_size | integer | 페이지당 결과 수 (기본값: 15, 최대: 100) |
응답
{
"count": 1,
"current": 1,
"next": null,
"previous": null,
"last": 1,
"results": [
{
"id": "9a1c0b62-9f3a-4a3d-8a1e-2b0f2c6d5e41",
"alert_type": "metric_threshold",
"server": {
"id": "7c5e2a41-6b90-4c33-a7d8-0e5f1b2c3d44",
"name": "web-01",
"os": "ubuntu",
"platform": "linux",
"is_connected": true,
"is_deleted": false
},
"severity": "warning",
"title": "CPU usage 92% ≥ 80% for 5 minutes",
"description": "CPU usage has stayed at or above 80% since 12:00.",
"dedup_key": "metric:cpu-usage:",
"device": "",
"rule": { "id": "4f2b18d0-5c77-4a0b-9d2e-1f7a3c9b4e05", "name": "cpu-high" },
"condition": "threshold",
"is_acknowledged": false,
"action_type": null,
"added_at": "2026-09-01T12:00:00Z",
"updated_at": "2026-09-01T12:04:00Z",
"resolved_at": null,
"resolution_cause": "",
"deliveries": [
{
"edge": "raised",
"channel": "email",
"state": "sent",
"recipients": 3,
"at": "2026-09-01T12:02:00Z"
},
{
"edge": "raised",
"channel": "slack_channel",
"state": "sent",
"recipients": null,
"at": "2026-09-01T12:02:00Z"
}
]
}
]
}| 필드 | 설명 |
|---|---|
id | 알림 ID |
alert_type | 위 alert_type 파라미터에 나온 값 중 하나 |
server | 알림이 발생한 서버: id, name, os, platform, is_connected, is_deleted |
severity | critical, warning, info 중 하나 |
title / description | 알림의 제목과 상세 설명. 번역이 있으면 내 언어로 표시됩니다 |
dedup_key | (서버, 알림 유형) 안에서 이 알림의 대상을 식별하는 값으로, 같은 조건이 반복되면 새로 만들지 않고 이 행을 갱신합니다. 중복 처리를 하지 않는 알림 유형은 비어 있습니다 |
device | 이 알림이 특정 디스크나 파티션, 네트워크 인터페이스로 범위가 좁혀져 있으면 그 값입니다. 서버 전체를 대상으로 하는 알림이면 비어 있습니다 |
rule | 이 알림을 발생시킨 경고 규칙으로, {id, name} 형태입니다. 규칙이 없는 알림(메트릭 알림만 규칙을 가짐)이거나 규칙이 이미 삭제됐다면 null입니다 |
condition | 이 알림이 규칙의 어느 조건에 해당하는지: threshold 또는 no_data. 규칙이 없는 알림은 비어 있습니다 |
is_acknowledged | 내가 이 알림을 확인했는지 여부. checked와 dismissed 둘 다 확인한 것으로 셉니다 |
action_type | 내가 어떤 방식으로 확인했는지: checked 또는 dismissed. 아직 확인하지 않았다면 null입니다 |
added_at | 이 알림(이 에피소드)이 처음 발생한 시각 |
updated_at | 이 행이 마지막으로 갱신된 시각입니다. 조건이 계속 유지되면 새 에피소드를 만드는 대신 같은 행을 갱신하므로, 새 알림이 발생하지 않아도 이 값은 바뀔 수 있습니다 |
resolved_at | 이 알림이 해제된 것으로 관측된 시각입니다. 아직 열려 있으면 null입니다. 해제된 행은 이 시각으로부터 30일 뒤 삭제됩니다 |
resolution_cause | 이 알림이 해제된 이유로, 해제를 처리한 앱이 정한 값을 씁니다. 메트릭 알림의 값은 알림 이력에 나온 해제 사유 목록을 참고하세요. 다른 알림 유형은 각자의 값을 씁니다. 알림이 아직 열려 있거나 이 필드가 생기기 전에 해제됐다면 비어 있습니다 |
deliveries | 이 에피소드의 발생과 해제가 실제로 무엇을 전달했는지, 엣지와 채널별로 한 항목씩 담습니다. 아래에서 그 형태를 설명합니다. 인터럽트를 전혀 보내지 않는 알림 유형은 빈 배열입니다 |
deliveries[].edge | raised 또는 resolved |
deliveries[].channel | 전송된 채널: email, push, slack_channel 중 하나입니다. 채널을 지정하지 않는 항목(아무것도 보내지 않은 발생을 나타내는 항목)은 null입니다 |
deliveries[].state | sent(전송됨), failed(해당 채널로 발송을 시도했지만 실패함, 이메일 발송 오류이거나 재시도까지 실패한 Slack 게시. 같은 엣지·채널 쌍에 sent 행이 있으면 그 행이 우선함), held(아직 보류 중), resolved_in_hold(보류가 끝나기 전에 조건이 해소되어 발생과 해제 모두 보내지 않음), suppressed(규칙 자체의 전달 설정으로 채널이 제한됨), unrecorded(발송 대상으로 넘겼지만 전달 기록이 남지 않음, 예를 들어 대상 전원 음소거, 받을 사람이 없는 경우, 설치가 사라져 건너뛴 Slack 게시) 중 하나입니다 |
deliveries[].recipients | 이 채널이 전달한, failed라면 전달하지 못한 인원 수입니다. 채널 하나를 대상으로 게시하는 Slack 채널 게시는 null이고, 아무것도 보내지 않은 항목도 null입니다 |
deliveries[].at | 이 엣지와 채널에서 가장 먼저 전송된 시각입니다. failed라면 가장 이른 시도 시각입니다(이메일은 발송 시점, Slack은 재시도까지 끝나고 포기한 시점). unrecorded는 발생이 발송 대상으로 지정된 시각인 알림의 notified_at을 씁니다. held, resolved_in_hold, suppressed는 null입니다 |
메일 워커 안에서 SMTP 단계를 지난 뒤에 실패한 경우는 여기서 보이지 않고 여전히 sent로 남습니다. 이 필드는 최종 수신함 도착 여부가 아니라 발송자가 확인할 수 있는 범위까지만 알려줍니다.
필요한 스코프: alert:read
예시
curl -X GET "https://your-workspace.ap1.alpacon.io/api/alerts/?resolved=true&severity=critical" \
-H "Authorization: token=\"alpat-xxxxxxxxxxxxxxxxxx\""오류 코드
| 상태 | 오류 코드 | 설명 |
|---|---|---|
| 400 | alert_already_acknowledged | 이미 이 알림을 확인 처리함 |
| 401 | UNAUTHORIZED | 유효하지 않거나 누락된 인증 정보 |
| 403 | FORBIDDEN | 권한 부족 |
| 404 | NOT_FOUND | 알림을 찾을 수 없거나, 확장 기능에 속한 규칙의 메트릭 알림인데 Metrics 확장 기능이 꺼져 있음 |