개요
AWS ALB(Application Load Balancer)의 TargetConnectionErrorCount
지표를 Zabbix에서 모니터링하던 중, 이상하게도 해당 값이 계속 1로 기록되며 Zabbix의 문제(Problem) 상태가 해제되지 않는 현상이 발생했습니다.
본 글에서는 이 현상의 원인을 분석하고, 전처리 설정을 조정하여 문제를 해결한 과정을 공유합니다.
문제 상황
Zabbix에서 CloudWatch를 통해 ALB의 TargetConnectionErrorCount
지표를 수집하고 있었는데,
다음과 같은 이상 현상이 있었습니다:
- Zabbix의 히스토리에는 값이 계속 1로 유지
- ALB는 분명히 문제 없이 동작 중인데도 Zabbix 대시보드에는 ‘Current Problem’이 계속 남아 있음
- 실제로 CloudWatch 콘솔에서 확인해보니 최근 값은 존재하지 않음 (즉, 오류 없음)
원인 분석
Zabbix에서는 CloudWatch Metric Math 결과에서 다음과 같은 JSONPath를 사용하여 값을 추출하고 있었습니다:
$.[?(@.Label == "TargetConnectionErrorCount")].Values.first().first()
이 JSONPath는 Label
이 "TargetConnectionErrorCount"
인 Metric 항목의 Values
배열에서 첫 번째 값을 가져오는 식입니다. 문제는 지표 값이 존재하지 않을 경우 Values: []
로 들어오기 때문에, 추출 자체가 실패한다는 점이었습니다.
이런 상황에서 Zabbix의 기본 동작은 다음과 같습니다:
- 전처리 실패 시 이전 값을 계속 유지
- 따라서 이전에 수집한
1
이라는 값이 그대로 유지되며, 문제 상태가 계속 이어짐
해결 방법
Zabbix에서 전처리 설정을 다음과 같이 변경하였습니다:
전처리(Preprocessing)
1. JSONPath: $.[?(@.Label == "TargetConnectionErrorCount")].Values.first().first()
→ 실패 시 사용자 정의 값 사용: 0
즉, 전처리 실패 시 기본값을 0으로 간주하도록 설정한 것입니다.
그 결과:
- CloudWatch에서 값이 없는 경우에도 Zabbix가
0
으로 인식 - 트리거 조건
{item.last() > 0}
이 false로 평가됨 - 문제 상태 자동 해제
- 대시보드에서 해당 이슈 사라짐 ✅
결론 및 교훈
CloudWatch를 통해 수집되는 지표는 값이 없을 경우, 실제로는 정상 상태임에도
Zabbix에서는 전처리 실패 → 이전 값 유지 → 문제 지속이라는 형태로 오탐이 발생할 수 있습니다.
이를 방지하려면:
- 전처리 단계에서 실패 시 기본값 지정(0 등)은 꼭 설정할 것
.first()
vs.last()
와 같이 JSONPath 선택에도 신중할 것nodata()
,change()
조건도 필요에 따라 트리거에 활용할 것
마무리
이번 경험은 Zabbix와 AWS CloudWatch를 연동할 때 정상 상태를 어떻게 인식할지에 대한 중요한 교훈을 줬습니다.
작은 전처리 설정 하나가 모니터링 시스템의 신뢰성에 큰 영향을 줄 수 있다는 점, 꼭 기억하시길 바랍니다.