1. 들어가며
시스템 모니터링이 필요할 때는 상용 APM(Jennifer, WhaTap 등)이나 오픈소스 도구(Scouter, Prometheus + Grafana)를 도입하는 것이 일반적입니다. 하지만 서버 1~4대 규모의 소규모 시스템에서는 고가의 라이선스나 별도의 모니터링 인프라가 리소스와 비용 면에서 부담이 되는 경우가 많습니다.
이번 글에서는 복잡한 인프라나 에이전트 설치 없이, WildFly 내장 Metrics 기능과 개인 윈도우 PC(IIS + PowerShell + PHP), 그리고 AI 코딩 어시스턴트만으로 만든 가벼운 실시간 모니터링 대시보드를 소개합니다. 운영자가 출근 후 접속해 서버의 현재 상태를 한눈에 확인하는 용도로, 추가 비용 없이 구성할 수 있는 방법입니다.
2. WildFly Metrics 개요 및 엔드포인트 확인
WildFly는 Metrics 서브시스템을 내장하고 있어, 별도의 에이전트 설치 없이 관리 인터페이스의 /metrics 경로를 호출하는 것만으로 서버의 실시간 상태를 Prometheus 호환 텍스트 포맷으로 확인할 수 있습니다.
(본 글은 JBoss EAP 8.1(WildFly 35 기반) 환경에서 테스트했으며, 버전에 따라 지표명이 다를 수 있습니다. 관리 인터페이스 접근과 /metrics 활성화 설정은 사전에 확인이 필요합니다.)
아래와 같이 curl 명령 한 줄로 서버 리소스 정보를 바로 확인할 수 있습니다.
$ curl 172.21.133.112:19990/metrics
# HELP base_cpu_processCpuLoad Displays the "recent cpu usage" for the Java Virtual Machine process.
# TYPE base_cpu_processCpuLoad gauge
base_cpu_processCpuLoad 9.551098376313276E-4
# HELP base_memory_usedHeap_bytes Displays the amount of used memory.
# TYPE base_memory_usedHeap_bytes gauge
base_memory_usedHeap_bytes 5.98863744E8
# HELP base_memory_maxHeap_bytes Displays the maximum amount of memory in bytes that can be used for memory management.
# TYPE base_memory_maxHeap_bytes gauge
base_memory_maxHeap_bytes 1.073741824E9
# HELP jboss_io_busy_task_thread_count An estimate of busy threads in the task worker thread pool
# TYPE jboss_io_busy_task_thread_count gauge
jboss_io_busy_task_thread_count{worker="default"} 0.0
# HELP jboss_io_max_pool_size The maximum number of threads allowed in the worker task thread pool
# TYPE jboss_io_max_pool_size gauge
jboss_io_max_pool_size{worker="default"} 150.0
# HELP jboss_datasources_pool_active_count The active count
# TYPE jboss_datasources_pool_active_count gauge
jboss_datasources_pool_active_count{data_source="ExampleDS"} 10.0
# HELP jboss_undertow_active_sessions Number of active sessions
# TYPE jboss_undertow_active_sessions gauge
jboss_undertow_active_sessions{deployment="ROOT.war",subdeployment="ROOT.war"} 0.0
...
Plain Text
복사
대시보드 구성을 위한 핵심 지표 선별
한 번의 호출로 다수 메트릭이 출력되므로, 실제 시스템 운영에 직결되는 핵심 지표를 선별하여 수집합니다.
•
CPU 및 시스템 부하: base_cpu_processCpuLoad(JVM 프로세스 부하) 및 base_cpu_systemLoadAverage
•
JVM 힙 메모리: base_memory_usedHeap_bytes(사용량) 대비 base_memory_maxHeap_bytes(최대 크기)
•
스레드 및 I/O 워커: base_thread_count(전체 스레드 수) 및 jboss_io_busy_task_thread_count(활성 워커 스레드)
•
DB 커넥션 풀: ActiveCount, InUseCount, MaxUsedCount를 통한 풀 고갈 위험 감지
•
애플리케이션 세션: deployment 라벨 기반 활성 세션(active), 누적 생성/만료 건수
3. 모니터링 아키텍처 및 파일 구성
별도의 전용 모니터링 서버를 두지 않고, 로컬 윈도우 PC의 내장 IIS 웹 서버와 PowerShell 스크립트만으로 경량 파이프라인을 구성했습니다.
전체 데이터 흐름
1.
start.bat이 백그라운드에서 collect.bat 구동
2.
collect.bat이 주기적(기본 3초)으로 collect.ps1 실행
3.
collect.ps1이 각 대상 WildFly의 /metrics를 호출해 파싱 후 data/metrics_{인스턴스ID}_{yyyyMMdd}.txt 파일에 JSON 레코드로 append 저장
4.
브라우저의 index.html(Chart.js)이 텍스트 데이터를 주기적으로 fetch하여 차트 렌더링
5.
사용자가 화면에서 설정 변경 시 config_api.php를 통해 config.json을 원자적(Atomic)으로 갱신
주요 구성 파일 목록 (C:\inetpub\wwwroot)
파일명 | 설명 |
index.html | Chart.js 기반 실시간 대시보드 및 설정 관리 UI |
config.json | 모니터링 대상 인스턴스 IP/포트, 수집 지표 on/off, 커스텀 지표 정의 |
config_api.php | 웹 UI에서 config.json을 안전하게 조회(GET) 및 갱신(POST)하는 FastCGI API |
collect.ps1 | Prometheus 텍스트 파싱 및 JSON 변환 핵심 수집 스크립트 |
collect.bat | collect.ps1을 지정한 주기(기본 3초)로 무한 반복 실행하는 배치 스크립트 |
start.bat | collect.bat을 백그라운드 프로세스로 띄워 수집을 시작하는 스크립트 |
stop.bat | 실행 중인 collect.bat/collect.ps1 프로세스를 찾아 안전하게 종료하는 스크립트 |
4. 윈도우 IIS 환경 구성 및 FastCGI(PHP) 연동
웹 화면에서 모니터링 대상을 동적으로 제어하기 위해 윈도우 기본 웹 서버(IIS)에 PHP 처리기를 연결합니다.
Step 1. PHP 다운로드 및 압축 해제
•
•
원하는 경로(예: C:\php)에 압축을 해제합니다.
Step 2. IIS 및 CGI 기능 활성화
윈도우 **[제어판] → [프로그램] → [Windows 기능 켜기/끄기]**에서 아래 항목을 활성화합니다.
•
인터넷 정보 서비스 (IIS)
•
World Wide Web 서비스 → 응용 프로그램 개발 기능 → CGI (필수 체크!)
주의: CGI 항목이 활성화되지 않으면 IIS에서 FastCGI 모듈 매핑을 등록할 수 없습니다.Step 3. IIS FastCGI 처리기 매핑 등록
1.
IIS 관리자 실행 후 사이트를 선택합니다.
2.
처리기 매핑으로 진입한 뒤, 우측 작업 영역에서 모듈 매핑 추가를 클릭합니다.
3.
아래 설정값을 입력하고 적용합니다.
•
요청 경로: *.php
•
모듈: FastCgiModule
•
실행 파일: C:\php\php-cgi.exe
5. PowerShell 수집 스크립트 구현 핵심 노하우
단순 HTTP 호출을 넘어 실제 운영 환경에서 안정적으로 동작하도록 collect.ps1에 반영한 핵심 로직입니다.
① Content-Type 비표준 응답 처리 (UTF-8 인코딩)
WildFly Metrics 엔드포인트의 반환 헤더 특성으로 인해 PowerShell Invoke-WebRequest가 응답을 문자열이 아닌 Byte 배열로 수신하는 현상이 발생할 수 있습니다. 수집값이 null로 저장되는 문제를 방지하기 위해 항상 UTF-8 문자열 변환을 강제합니다.
② DB 커넥션 풀 동적 라벨 탐지
데이터소스 이름을 스크립트에 하드코딩하지 않고, 라벨(data_source, pool)을 기준으로 정규식 파싱을 수행하여 ActiveCount, InUseCount, MaxUsedCount를 자동 수집합니다. 신규 DB 풀이 추가되어도 코드 수정이 필요 없습니다.
③ Custom Metrics 그룹화 지원
config.json에 group_by와 fields를 명시하면, 특정 애플리케이션(deployment)별 세션 지표 등을 유연하게 묶어서 수집할 수 있습니다.
수집 데이터 레코드 구조 예시 (data/metrics_inst4_20260907.txt)
{
"ts": 1788739959,
"instance": "inst4",
"heap_used": 726877592,
"heap_max": 1073741824,
"process_cpu_load": 0.00021499211695571161,
"thread_busy_total": 0,
"datasource": {
"ExampleDS": {
"ActiveCount": 10,
"AvailableCount": 10,
"InUseCount": 0,
"MaxUsedCount": 2
}
},
"custom": {
"sessions": {
"ROOT.war": {
"active": 0,
"created_total": 11872
}
}
}
}
Plain Text
복사
6. 실시간 모니터링 대시보드 UI 기능
index.html은 가벼운 Chart.js 라이브러리를 활용해 수집된 텍스트 로그를 실시간 시각화합니다.
•
실시간 리소스 추이 차트: Heap Memory, CPU 사용률, Busy Thread 수를 인스턴스별 라인 차트로 표출 (상단 인스턴스 칩으로 특정 서버 필터링 가능)
•
DB 커넥션 풀 막대 게이지: InUse / Max 비율을 게이지 바 형태로 시각화하며, 임계치(70% 주황색, 85% 빨간색) 초과 시 자동 하이라이트
•
앱별 세션 테이블: 배포된 war 단위 활성/생성/만료 세션 수 현황 제공
•
무중단 설정 제어 탭: 모니터링 대상 인스턴스 목록(최대 12대) 및 지표 on/off를 UI에서 수정하면 백엔드 배치 재시작 없이 즉시 반영
7. 대시보드 적용 화면
① 메인 대시보드 화면
Heap/CPU/Thread 추이 그래프와 함께, 커넥션 풀 상태를 막대 게이지로, 앱별 세션 현황을 표로 한눈에 확인할 수 있습니다.
② 실시간 설정 변경
별도의 재배포나 서비스 재시작 없이, 웹 화면에서 모니터링 대상 인스턴스와 수집할 항목 체크박스를 바로 수정하고 즉시 적용할 수 있습니다.
③ 자유로운 디자인 커스터마이징
수집·저장 로직과 화면 표시 로직이 분리되어 있어, index.html 소스 코드만 원하는 대로 수정하면 다크 모드, 레이아웃 변경 등 대시보드 디자인을 자유롭게 바꿀 수 있습니다.
8. 마치며
WildFly 내장 Metrics 서브시스템을 활용하면 별도의 인프라 투자 없이도 소규모 환경에 맞는 실시간 모니터링 화면을 만들 수 있습니다.
느린 쿼리 추적이나 트랜잭션 프로파일링 같은 심층 APM 기능까지 대체하기는 어렵습니다. 다만 JVM 리소스 부족, 스레드 병목, DB 커넥션 풀 고갈처럼 운영 중 가장 먼저 확인하게 되는 기본 지표를 점검하기에는 충분했습니다.
이 구성은 상시 알림형 시스템이 아니라, 운영자가 접속해 현재 상태를 확인하는 용도에 적합합니다. 필요하다면 임계치 도달 시 Slack/이메일 알림이나 JMX 기반 스레드 덤프 생성 기능을 덧붙여 확장할 수 있습니다.
제품에 이미 내장된 기능을 AI 코딩 어시스턴로 가볍게 연결하는 것만으로도 업무에 쓸 만한 도구를 만들 수 있었습니다. 새로운 도구를 도입하기 전에, 사용 중인 제품에 내장된 기능을 먼저 살펴보고 AI를 활용해 효율적으로 쓸 수 있는 방법을 찾아보시길 권합니다.
Reference
WildFly Metrics 참고 문서: https://docs.wildfly.org/wildfly-proposals/microprofile/WFLY-11529_subsystem_metrics.html김성진 프로
에스코어에서 미들웨어 엔지니어로 근무하며, 삼성 그룹사를 비롯한 국내 주요 대기업과 공공기관의 미들웨어 설계 및 기술지원을 담당하고 있습니다








