← 목록으로AWS

EDI Agent 중앙 모니터링 시스템 구축 (AgentMonitor)

다중 환경의 EDI Agent 동기화 상태를 중앙에서 모니터링하고, 이상 감지 시 알람 및 일일 리포트를 자동 발송하는 시스템 구축

AWSMonitoringPythonAutomation
2024-08-20

개요

여러 운영 환경에 분산된 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 (이슈 감지 내역)

TimestampEnvironmentAgent NameIssue Type
2026-03-18 09:00[ENV-A][AGENT-01]sync_time

Sheet 2 — Raw Data (전체 상태 기록)

TimestampEnvironmentAgent NameSync TimeSync Status
2026-03-18 09:00[ENV-A][AGENT-01]2026-03-18 08:55true

엑셀 생성 코드

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 상태의 중앙 가시성 확보
  • 오탐 최소화를 위한 연속 감지 기반 알람 설계
  • 일일 리포트 자동화로 운영 팀 모니터링 부담 감소
  • 서버 상주 프로세스로 안정적인 상시 모니터링 운영