jvmguard 소개: 자동 프로덕션 프로파일링
JProfiler를 만든 팀이 새로운 오픈 소스 도구를 선보입니다. jvmguard는 여러분의 회사가 프로덕션에서 JVM을 프로파일링하도록 도와줍니다.
프로덕션에서의 프로파일링은 위험하지만, 문제를 이해할 수 있는 유일한 방법인 경우가 많습니다. jvmguard를 사용하면 프로파일링 캡처가 승인 및 감사를 거치며, 사람, 자동 트리거, AI 에이전트 중 무엇이든 시작할 수 있습니다.
jvmguard는 JProfiler와 함께 작동하지만 이 통합에만 국한되지 않습니다. JFR 스냅샷, HPROF 힙 덤프, 스레드 덤프도 기록하므로 다른 도구로 분석할 수 있습니다. jvmguard의 기본 아이디어는 경량 신호는 항상 활성화되어 있고, 심층 캡처는 특정 조건에서만 수행된다는 것입니다.


프로덕션 프로파일링의 문제점
프로덕션에서 무언가 느릴 때, 필요한 데이터는 문제가 발생하는 머신에 있습니다. 대부분의 조직에서 개발자는 프로덕션 호스트에 대한 SSH 접근 권한이 없으므로 jcmd를 사용한 간단한 힙 덤프조차 개발자가 스스로 수행할 수 없습니다. 완전한 프로파일러를 연결하는 것은 보통 애초에 불가능한데, 제어할 수 없는 오버헤드를 더할 수 있는 네이티브 프로파일링 에이전트를 로드하기 때문입니다.
APM 도구와 지속형 프로파일러는 이 문제에 도움이 되지 않습니다. 이들은 모든 JVM에 대한 대시보드, 트레이스, 알림 같은 광범위한 모니터링 데이터를 기록합니다. 하지만 심층 분석을 위한 프로파일링 스냅샷은 기록할 수 없습니다.
경량 신호, 심층 캡처
jvmguard는 웹 UI를 갖춘 서버와 모니터링되는 각 JVM 내부에서 실행되는 Java 에이전트로 구성됩니다. 에이전트는 순수 Java로 작성되어 Java 8 이상에서 작동하며, 트랜잭션으로 명시적으로 정의한 메서드만 인스트루먼트합니다. 표준 운영 중에는 경량 데이터만 수집합니다:
- 힙, CPU, 스레드, GC 같은 내장 텔레메트리
- 선택한 MBean 또는 어노테이션을 지정한 여러분의 메서드에서 수집되는 텔레메트리
- 여러분이 구성한 트랜잭션


심층 캡처는 기본적으로 기록되지 않습니다. 네 가지 종류가 있으며 요청이 있을 때만 실행됩니다:
- 제한된 기간의 JFR 기록
- HPROF 형식의 힙 덤프
- 스레드 덤프
- JProfiler 스냅샷
연결된 모든 JVM에 대해 웹 UI에서 캡처를 수동으로 시작할 수 있습니다. 결과는 jvmguard 수신함에 저장되며, 권한이 부여된 사용자가 다운로드할 수 있습니다.
트리거를 통한 자동 캡처
트리거는 VM 그룹에 구성되며 이벤트 발생 빈도에 반응합니다. 트리거에는 세 가지 종류가 있습니다:
- 임계값 트리거는 텔레메트리가 설정된 경계를 너무 자주 초과할 때 발동합니다
- 정책 트리거는 너무 많은 트랜잭션이 느리거나, 매우 느리거나, 기한이 초과되었거나, 오류로 종료될 때 발동합니다
- 연결 트리거는 연결된 JVM 수가 최소값 미만으로 떨어질 때 발동합니다
트리거가 발동하면 jvmguard는 구성 가능한 액션 목록을 실행합니다. 데이터 수집 액션은 JFR이나 JProfiler 스냅샷을 기록하거나, 영향을 받는 JVM에서 힙 덤프나 스레드 덤프를 생성합니다. 알림 액션은 jvmguard 수신함에 기록하거나, 이메일을 보내거나, 웹훅을 호출합니다.
전형적인 설정은 느린 트랜잭션이 너무 많을 때 발동하여 JFR 스냅샷을 기록하는 정책 트리거입니다.


JProfiler와의 통합
가장 깊이 있는 분석은 JProfiler 스냅샷에서 나옵니다. 이를 위해 서버는 다운로드 사이트에서 일치하는 JProfiler 에이전트 패키지를 다운로드하여 에이전트로 전송합니다. 이것이 서버가 자체 판단으로 외부에 연결하는 유일한 경우이며, 에어갭(air-gapped) 서버에서는 패키지를 직접 캐시 디렉터리에 미리 복사해 둘 수 있습니다.
JProfiler 에이전트는 실행 중인 JVM에 필요할 때 로드되며 샘플링으로 CPU 데이터를 기록하므로 프로덕션에서 오버헤드가 낮게 유지됩니다. JProfiler 기록 액션에서 JDBC, JPA, HTTP, gRPC, Kafka, LLM 호출 같은 필요한 서브시스템을 선택할 수 있습니다. JVMTI 에이전트는 일단 로드되면 JVM을 재시작하기 전까지 언로드할 수 없지만, 유휴 상태에서의 오버헤드는 1% 미만입니다.
AI 에이전트
jvmguard에는 MCP 서버가 포함되어 있습니다. 코딩 에이전트는 사람이 웹 UI에서 할 수 있는 것과 동일한 작업을 수행할 수 있습니다. 사용 가능한 JVM을 찾고, 텔레메트리와 트랜잭션을 읽고, 프로파일링 스냅샷을 캡처하고, 결과를 가져옵니다.
AI 에이전트에게 프로덕션 JVM에 대한 접근 권한을 부여하려면 엄격한 제한이 필요합니다. jvmguard는 서버 전체 읽기 전용 모드, 허용되는 캡처 유형을 제어하는 그룹별 가드레일, 빈도 제한과 쿨다운, 모든 에이전트 작업에 대한 SIEM 호환 감사 기록을 제공합니다.
jvmguard MCP 서버와 JProfiler MCP 서버는 하나의 루프를 형성합니다. jvmguard가 프로덕션에서 스냅샷을 캡처하고, AI 에이전트가 JProfiler로 이를 분석합니다.
프로덕션에서의 안전성
프로덕션에서 프로파일링을 안전하게 만들기 위해 jvmguard는 다음과 같은 여러 기능을 제공합니다:
- 기본 작업 중 제어되는 극도로 낮은 오버헤드.
- Admin, Profiler, Viewer의 세 가지 접근 수준이 하나의 서버를 여러 팀으로 나누어 사용할 수 있게 합니다. 사용자는 로컬 계정, LDAP 또는 SSO로 인증하며, 2단계 인증이 기본적으로 활성화되어 있습니다.
- 에이전트 연결은 TLS로 암호화하고 상호 인증할 수 있습니다.
- 전체 감사 로그가 모든 프로파일링 작업을 기록합니다. 누가, 언제, 무엇을 했는지입니다.
- 외부 자동 보고(phone home)가 없습니다. 에이전트는 여러분의 서버에 연결되며, 기록된 모든 데이터는 여러분의 네트워크 안에 머무릅니다. 수집기, 내장 H2 데이터베이스, 웹 UI는 단일 프로세스에서 실행되며 에어갭 환경에서도 작동합니다.
시작하기
이것은 jvmguard의 첫 번째 릴리스입니다. Windows, macOS, Linux용 설치 프로그램이 다운로드 페이지에서 제공되며, 문서도 웹 사이트에서 이용할 수 있습니다.
설치 후에는 헤더의 "Add VMs" 버튼을 사용하여 각 JVM의 시작 명령에 추가할 -javaagent 옵션을 생성합니다.
소스 코드는 GitHub에 있습니다. jvmguard가 유용하다고 생각되면 GitHub에서 스타를 눌러 다른 사람들이 이 프로젝트를 찾는 데 도움을 주세요.