개요
여러 운영 환경에 분산된 EDI Agent들의 동기화 상태를 중앙에서 모니터링하는 AgentMonitor 시스템을 구축했다.
일시적인 네트워크 끊김은 무시하고, 6시간 이상 지속되는 이상 상태에만 알람을 발송하도록 설계해 알림 피로(Alert Fatigue)를 최소화했다.
모니터링 대상
여러 고객사의 운영 환경에 배포된 EDI Agent를 대상으로 한다.
알람 서비스
감지 지표
| 지표 | 설명 |
|---|---|
synchronized state | 동기화 활성화 여부 |
synchronized time | 동기화 시간 지연 여부 |
알람 동작 방식
1시간마다 Agent 상태 확인
↓
6회 연속 (6시간) 이상 감지 시에만 알람 발송
↓
이메일 전송 (일시적 끊김은 무시)
6회 연속 조건을 둔 이유는 네트워크 일시 단절 등 일과성 이슈로 인한 오탐(False Positive)을 방지하기 위함이다.
알람 이메일 형식
제목:
[Agent 동기화 문제] {에이전트 이름}
내용 (동기화 비활성화):
[{ENV} - {AGENT_NAME}] lastAccess 시간이 6회 이상 동일합니다.
내용 (동기화 시간 지연):
[{ENV} - {AGENT_NAME}] 동기화 된 시간이 6회 이상 동일합니다.
핵심 로직
from collections import defaultdict
import boto3
# 환경별 Agent 상태 이력 저장
history = defaultdict(list) # key: (env, agent_name)
def check_agent(env, agent_name, sync_status, sync_time):
key = (env, agent_name)
history[key].append({
'sync_status': sync_status,
'sync_time': sync_time,
})
# 최근 6회만 유지
if len(history[key]) > 6:
history[key].pop(0)
if len(history[key]) < 6:
return # 아직 6회 미만
recent = history[key]
# 동기화 비활성화: lastAccess가 6회 연속 동일
if len(set(r['sync_status'] for r in recent)) == 1 and not recent[-1]['sync_status']:
send_alarm(env, agent_name, 'sync_status')
# 동기화 시간 지연: sync_time이 6회 연속 동일
if len(set(r['sync_time'] for r in recent)) == 1:
send_alarm(env, agent_name, 'sync_time')
def send_alarm(env, agent_name, issue_type):
ses = boto3.client('ses')
if issue_type == 'sync_status':
body = f"[{env} - {agent_name}] lastAccess 시간이 6회 이상 동일합니다."
else:
body = f"[{env} - {agent_name}] 동기화 된 시간이 6회 이상 동일합니다."
ses.send_email(
Source='[sender-email]',
Destination={'ToAddresses': ['[recipient-email]']},
Message={
'Subject': {'Data': f'[Agent 동기화 문제] {agent_name}'},
'Body': {'Text': {'Data': body}}
}
)일일 모니터링 리포트
매일 1회 전체 Agent 상태를 엑셀 파일로 정리해 이메일로 자동 발송한다.
리포트 구성
Sheet 1: Summary (이슈 감지 내역)
| Timestamp | Environment | Agent Name | Issue Type |
|---|---|---|---|
| 2026-03-18 09:00 | [ENV-A] | [AGENT-01] | sync_time |
Sheet 2: Raw Data (전체 상태 기록)
| Timestamp | Environment | Agent Name | Sync Time | Sync Status |
|---|---|---|---|---|
| 2026-03-18 09:00 | [ENV-A] | [AGENT-01] | 2026-03-18 08:55 | true |
엑셀 생성 코드
import openpyxl
from datetime import datetime
def generate_report(summary_data, raw_data):
wb = openpyxl.Workbook()
# Summary 시트
ws_summary = wb.active
ws_summary.title = 'Summary'
ws_summary.append(['Timestamp', 'Environment', 'Agent Name', 'Issue Type'])
for row in summary_data:
ws_summary.append(row)
# Raw Data 시트
ws_raw = wb.create_sheet('Raw Data')
ws_raw.append(['Timestamp', 'Environment', 'Agent Name', 'Sync Time', 'Sync Status'])
for row in raw_data:
ws_raw.append(row)
filename = f"/tmp/agent_report_{datetime.now().strftime('%Y%m%d')}.xlsx"
wb.save(filename)
return filename배포 구성
EC2 (AgentMonitor 상주 프로세스)
├── 1시간 주기 스케줄러 (cron / 내부 스케줄러)
│ ├── Agent API 상태 조회
│ ├── 이상 감지 시 SES 알람 발송
│ └── 상태 기록
│
└── 매일 오전 스케줄러
├── 일일 데이터 집계
├── 엑셀 파일 생성
└── SES 이메일 첨부 발송
배포 환경:
- VPC: 사내 운영 VPC
- 인스턴스: 운영 EC2 서버에 AgentMonitor 프로세스 상주
- 개발 환경 테스트 후 운영 환경 배포
설계 포인트
알림 피로 최소화 1시간 간격으로 확인하되, 6회 연속 이상 감지 시에만 알람을 발송한다. 일시적인 네트워크 끊김으로 인한 오탐을 방지한다.
중앙 집중 모니터링 각 환경에 별도 모니터링을 구성하는 대신, 단일 시스템에서 전체 환경을 통합 관리한다.
일일 리포트 자동화 수동 확인 없이 매일 전체 Agent 상태를 엑셀로 정리해 관련 팀에 자동 발송한다.
정리
이 시스템을 통해 다음을 달성했다.
- 다중 환경 Agent 상태의 중앙 가시성 확보
- 오탐 최소화를 위한 연속 감지 기반 알람 설계
- 일일 리포트 자동화로 운영 팀 모니터링 부담 감소
- 서버 상주 프로세스로 안정적인 상시 모니터링 운영
배운 점
오탐은 알림을 무력화한다. 네트워크가 잠깐 끊겼다고 매번 알리면, 진짜로 멈췄을 때 아무도 보지 않는다. 6회 연속이라는 조건 하나가 이 시스템을 쓸 만하게 만들었다.
반대로 연속 감지는 탐지를 늦춘다. 즉시성과 신뢰도는 맞바꾸는 관계라서, 대상의 성격에 따라 어디에 둘지 정해야 한다. Agent 동기화는 몇 분 늦게 알아도 되는 일이었고, 그래서 신뢰도 쪽으로 기울였다. 반대편 사례가 EC2 StatusCheckFailed 기반 장애 감지로, 여기서는 1분 감지에 전화까지 붙였다.
일일 리포트를 자동화한 것도 같은 맥락이었다. 알림은 이상할 때만 오지만, 리포트는 이상이 없다는 사실을 알려준다. 조용한 게 정상이라서 조용한지, 감지가 죽어서 조용한지는 구분되어야 한다.
이어 읽기
- EC2 StatusCheckFailed 기반 장애 감지 및 자동 복구 알람 시스템: 즉시성을 우선한 반대편 설계
- 통합 모니터링 시스템 구축: AgentMonitor가 전체 체계에서 맡은 영역