본문으로 건너뛰기

시스템 아키텍처

FlowKat APM은 에이전트(수집), 서버(저장/분석), 대시보드(시각화) 세 계층으로 구성됩니다. 고객 서버에 설치된 경량 에이전트가 성능 데이터를 수집하고, FlowKat 서버가 저장, 분석, 시각화를 담당합니다.


전체 구조


계층별 구성

1계층: 에이전트 (데이터 수집)

에이전트는 모니터링 대상 서버에 설치되어 성능 데이터를 수집합니다. 바이트코드 계측(Bytecode Instrumentation) 방식으로 애플리케이션 코드를 수정하지 않고 트랜잭션 정보를 추출합니다.

에이전트대상 환경수집 데이터
Java AgentJava 8 이상 애플리케이션트랜잭션, SQL, API 호출, 메서드 프로파일
Java Agent (6/7)Java 6/7 레거시 환경트랜잭션 기본 데이터
Host Agent물리 서버, VMCPU, 메모리, 디스크 I/O, 네트워크
Container AgentKubernetes, Docker컨테이너 리소스, Pod 상태

에이전트 특징:

  • CPU 오버헤드 3% 미만의 경량 설계
  • 수집 서버 연결 실패 시에도 애플리케이션 성능에 영향 없음
  • 단일 TCP 연결로 데이터 전송 (V3 TLV 프로토콜)
  • 자동 재연결 (지수 백오프 + 지터)

2계층: 서버 (저장/분석)

수집 서버는 에이전트로부터 데이터를 수신하여 저장하고, API 서버와 대시보드 서버가 분석 및 조회를 처리합니다.

서비스역할기술 스택
수집 서버에이전트 데이터 수신, 메트릭 집계 저장Java 8, TCP/HTTP
API 서버수집 데이터 REST API 제공Java 8, REST
대시보드 서버메타데이터 관리, 사용자 설정Java 8, Spring Boot, H2 DB
TX-Mining API트랜잭션 장기 보관 및 분석Spring Boot 3.x, JDK 17
PostgreSQL트랜잭션 데이터 정규화 저장PostgreSQL 16, pgvector, pg_partman
Valkey실시간 집계 캐시Valkey 9.0 (Redis 호환)

3계층: 대시보드 (시각화)

웹 기반 대시보드에서 수집된 데이터를 실시간으로 시각화합니다. Next.js 기반 SPA로 구축되어 있으며, WebSocket과 폴링 방식의 실시간 데이터 갱신을 지원합니다.


데이터 흐름

에이전트가 수집한 데이터는 다음 경로를 따라 사용자에게 전달됩니다.

데이터 유형별 처리

데이터 유형수집 주기저장 위치용도
트랜잭션 (XLog)트랜잭션 완료 즉시내장 DB + PostgreSQL실시간 추적, 장기 분석
메트릭 (Counter)5초 간격내장 DB (5분 집계)대시보드 실시간 차트
텍스트 (SQL, 메서드명 등)최초 등장 시 1회메모리 캐시해시 기반 중복 제거

배포 방식

FlowKat은 Docker Compose 기반으로 배포됩니다. 릴리즈 번들 하나에 Docker 이미지, 에이전트, 설정 파일, 관리 스크립트가 모두 포함되어 있어, 폐쇄망 환경에서도 별도의 인터넷 연결 없이 설치할 수 있습니다.

지원 환경

환경특징주요 설정
Production운영 환경, 호스트 네트워크 모드최소 7GB 메모리, HTTPS 권장
Aircap (폐쇄망)인터넷 미연결 환경릴리즈 번들 오프라인 설치
Development개발/테스트 환경브릿지 네트워크, 최소 3GB 메모리
Demo시연 환경경량 설정, 최소 1.5GB 메모리

네트워크 요구사항

외부에 개방이 필요한 포트는 두 개뿐입니다.

포트용도방향
6100 (TCP)에이전트 데이터 수집에이전트 서버 -> FlowKat 서버
6300 (TCP)웹 UI 접속사용자 PC -> FlowKat 서버

나머지 서비스 간 통신은 Docker 내부 네트워크에서 처리되므로 추가 방화벽 설정이 필요 없습니다.


확장성

에이전트 확장

모니터링 대상 서버가 늘어나면 에이전트를 추가 설치합니다. 수집 서버 한 대로 수백 개 에이전트의 데이터를 처리할 수 있으며, 서버 자원에 따라 JVM 힙 설정을 조정하여 처리 용량을 늘릴 수 있습니다.

데이터 보존

트랜잭션 익스플로러(TX-Mining)의 PostgreSQL은 pg_partman을 이용한 날짜별 파티션 관리를 지원합니다. 보존 기간을 설정하면 오래된 데이터가 자동으로 정리되어, 스토리지를 효율적으로 사용하면서도 필요한 기간의 데이터를 보관할 수 있습니다.