오픈소스 인사이트
home
오픈소스 기술 동향
home

별도 에이전트 없이, /metrics로 만드는 JBoss EAP(WildFly) 모니터링

7 more properties

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 다운로드 및 압축 해제

•
PHP 공식 사이트에서 Windows용 Non Thread Safe (x64) 압축 파일을 다운로드합니다.
•
원하는 경로(예: 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

📌 PHP for Windows 공식 배포처: https://windows.php.net/download/
📌 AI 코드 생성 지원: https://gemini.google.com/
김성진 프로
에스코어에서 미들웨어 엔지니어로 근무하며, 삼성 그룹사를 비롯한 국내 주요 대기업과 공공기관의 미들웨어 설계 및 기술지원을 담당하고 있습니다