Skip to Content
Infra & DevOpsWSO2 CEP 기반 실시간 데이터 콜렉터(Collector) REST API 설계 및 쿼리 샘플
☁️ Infra & DevOps2017년 4월 24일

WSO2 CEP 기반 실시간 데이터 콜렉터(Collector) REST API 설계 및 쿼리 샘플

#cep#rest-api#collector#monitoring#flamingo

과거 재직하던 회사에서 개발한 빅데이터 모니터링 플랫폼의 핵심 경쟁력 중 하나는 수백 대의 장비에서 초당 수만 건씩 쏟아져 들어오는 JMX 및 시스템 메트릭 데이터를 “실시간(Real-time)“으로 처리하여 알람을 울려주는 아키텍처였습니다.

이를 구현하기 위해 앞서 발행한 글(WSO2 CEP와 스트리밍 연산)에서 설명한 바와 같이, 데몬의 중추에 CEP(Complex Event Processing) 엔진을 박아두었습니다.

가장 큰 기술적 고민은 “사용자가 UI 창에서 ‘CPU 90% 이상 1분 유지 시 알람’ 규칙을 새롭게 생성했을 때, 자바로 돌아가는 수집기(Collector) 데몬 프로세스를 껐다 켜지 않고 어떻게 저 새로운 규칙을 라이브 엔진 메모리에 주입할 것인가?” 였습니다. 이 문제를 해결하기 위해 Collector 데몬 자체에 경량 웹서버(Embedded 웹 엔진) 모듈을 띄워, 외부 스프링 UI 서버의 지시를 수신하는 전용 REST API 라우터를 뚫었습니다.


1. CEP Dynamic Rule Injection REST API

플랫폼 마스터 UI 서버는 이 엔드포인트를 찔러 스트리밍 쿼리를 실시간으로 Post 하거나 쓸모없는 알람 규칙을 Delete 날리는 구조로 통제력을 확보했습니다.

API 통신 목적URI 엔드포인트METHODPARAM PayloadRESPONSE
전체 룰 목록 조회/api/cep_ruleGET-메모리에 로딩된 전체 CEP 쿼리 이름 리스트 배열
단일 룰 텍스트 조회/api/cep_rule/{id}GET-특정 ID 룰의 Siddhi QL 원문 텍스트 반환
신규 스트리밍 룰 주입/api/cep_rule/POSTRule JSON메모리 파싱이 완료된 룰 객체 메타데이터
기존 룰 강제 회수/api/cep_rule/{id}DELETE-200 OK (엔진에서 스레드 드랍됨)

2. 실전 CEP 쿼리 (Siddhi QL) 아키텍처 구조

아래는 실제로 UI에서 위 API를 통해 주입(POST)되어, 호스트들의 하둡 YARN 리소스매니저(ResourceManager) 지표를 1분 단위로 슬라이딩 윈도우(Sliding Window) 캡처하여 최대/최소 낙폭을 계산하는 스트리밍 쿼리문입니다. 데이터베이스(RDB)의 SQL 문법과 매우 흡사하지만 [window.time] 이라는 시계열 개념이 들어간 것이 가장 큰 특징입니다.

sql
/* 1. 스트림의 입출력을 정의할 데이터 메타 골격 (스키마 정의) */ @Import('METRIC:1.0.0') define stream input ( meta_SERVERTIME long, meta_COLLECT_TIME long, meta_METRIC_NAME string, meta_HOSTNAME string, meta_APP_ID string, correlation_METRICS double ); @Export('ALERT:1.0.0') define stream output ( meta_COLLECT_TIME long, meta_HOSTNAME string, meta_APP_ID string, meta_METRIC_NAME string, correlation_METRIC double ); /* 2. 본 쿼리: 실시간 데이터 버스에서 지나가는 강물을 퍼 올려서 필터링 (Where 절 역할) */ from input#window.time(1 min)[meta_APP_ID=='collector.yarn.resourceManager.YarnClusterMetrics'] /* 3. 메모리에 체류시킨 1분 치 데이터 배열의 Max/Min 차분 집계 연산 처리 */ select max(meta_COLLECT_TIME) as meta_COLLECT_TIME, meta_HOSTNAME, meta_APP_ID, 'accumulate_aggregation' as meta_METRIC_NAME, (max(correlation_METRICS) - min(correlation_METRICS)) / count(*) as correlation_METRIC group by meta_HOSTNAME, meta_APP_ID having correlation_METRIC > 0 /* 4. 조건에 걸러진 놈들만 붉은 사이렌을 울리기 위해 Output 배출 파이프라인으로 전송 */ insert into output;

이 고도화된 실시간 윈도우 쿼리 인젝터 설계 덕분에, 하둡 장비가 500대 가까이 증설되는 빅데이터 금융권 프로젝트 환경에서도 디스크 I/O 없이 CPU와 Memory 단에서 이상 징후 알람을 원활하게 토해낼 수 있었습니다.

Last updated on