개요
여러 운영 환경에 분산된 EDI Agent들의 동기화 상태를 중앙에서 모니터링하는 AgentMonitor 시스템을 구축했습니다.
일시적인 네트워크 끊김은 무시하고, 6시간 이상 지속되는 이상 상태에만 알람을 발송하도록 설계해 알림 피로(Alert Fatigue)를 최소화했습니다.
모니터링 대상
다수의 운영 환경(CONNECT, FNS, 물류 서비스 등)에 배포된 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 상태의 중앙 가시성 확보
- 오탐 최소화를 위한 연속 감지 기반 알람 설계
- 일일 리포트 자동화로 운영 팀 모니터링 부담 감소
- 서버 상주 프로세스로 안정적인 상시 모니터링 운영