본문으로 건너뛰기

plantpulse-cep (복합 이벤트 처리)

역할​

Complex Event Processing 계층입니다. 여러 이벤트의 시간적 · 논리적 패턴을 실시간으로 감지해 알람 · Flow 트리거 · 자동화를 수행합니다. 규칙은 EQL(PlantPulse CEP SQL) 로 씁니다.

항목값
모듈명plantpulse-cep
설치 경로/opt/kopens/plantpulse-platform/plantpulse-cep/
포트7400 (HTTP) · 7401 (TLS)
실행 엔진부팅 시 하나 — Aster CEP(cep.backend=aster, 설정하지 않아도 같음)
pd 서비스cep — MASTER 만
API 인증X-API-Key: <PP_CEP_API_KEY>
콘솔 로그인PP_CEP_WEB_USER / PP_CEP_WEB_PASSWORD — 비어 있으면 콘솔만 닫힙니다
언어 · 백엔드 · 운영 · 한계는 전용 섹션에 있습니다

이 페이지는 모듈과 파일을 다룹니다. 문장을 쓰는 법과 돌리는 법은 CEP 섹션을 보십시오.

사용 예시​

"알람이 떴는데 30분 동안 해제가 안 오면 미해제로 올린다"

SELECT a.machineId AS machine
FROM pattern [every a=AlarmEvent -> not ClearEvent for 30 min]

구성​

API · 콘솔 · 엔진이 같은 프로세스에 있습니다. 도는 엔진은 부팅 시 고른 하나뿐입니다.

디렉토리 구조​

plantpulse-cep/
├── config/plantpulse-cep.properties # 생성물 ← plantpulse-datalake-cli 의 템플릿
├── bin/start.sh
├── logs/
└── server/ # 내장 Tomcat — webapps/ROOT.war · logs/catalina.<날짜>.log

주요 설정​

# 백엔드 — 부팅 시 하나. 미설정이면 이전 것을 그대로 유지한다
cep.backend=aster
#cep.mode=native # native | portable

# 이벤트 입력 (Valkey 스트림)
cache.host=${PP_REDIS_HOST}
cache.port=${PP_REDIS_PORT}
cache.password=${PP_REDIS_PASSWORD}
cache.ssl.enabled=false
cep.stream.shard_count=16
cep.consumer.thread_count=16

# 룰 · 이벤트 타입 레지스트리 (PostgreSQL datalake DB — CEP 가 표를 스스로 만든다)
jdbc.datalake.url=jdbc:postgresql://${PP_POSTGRES_HOST}:${PP_POSTGRES_PORT}/datalake
jdbc.datalake.username=${PP_DATALAKE_DB_USER}
jdbc.datalake.password=${PP_DATALAKE_DB_PASSWORD}

# 운영 지표 (Cassandra)
storage.host=${PP_CASSANDRA_HOST}
storage.keyspace=${PP_KEYSPACE}
cep.storage.ttl_seconds=864000 # 10일

# 인증
cep.api.key=${PP_CEP_API_KEY}
cep.web.user=${PP_CEP_WEB_USER}
cep.web.password=${PP_CEP_WEB_PASSWORD}
cep.api.max_eql_text_length=100000
cep.flink.* 는 Flink 로 부팅했을 때만 뜻이 있습니다

같은 파일에 cep.flink.reconciler.enabled · cep.flink.router.enabled 가 남아 있습니다. 다른 백엔드로 부팅하면 무시되고 로그에 이름이 한 번 찍힙니다.

켜 둔 채 다른 백엔드로 띄워 같은 문장이 두 엔진에서 돌고 결과가 두 번 발행된 적이 있습니다 → 백엔드

값을 바꾸는 절차는 설정 바꾸는 법, API 키 회전은 비밀번호 · API 키 바꾸기입니다.

주요 API​

경로하는 일
POST /api/v1/eql/deploy문장 등록
POST /api/v1/eql/validate판정만 — SUPPORTED / UNSUPPORTED / UNPARSEABLE
DELETE /api/v1/eql/undeploy/{id}등록 해제
GET /api/v1/eql/registration등록 결과 표 (ACTIVE / REJECTED)
GET /api/v1/eql/portability이식성
GET /api/v1/eql/metrics/snapshot · /metrics/engine문장별 매치율 · 출력율, 엔진 지표
GET·POST·PUT·DELETE /api/v1/event-types이벤트 타입 등록
GET·POST·DELETE /api/v1/keysAPI 키
GET /api/health익명 readiness — 엔진 · 캐시 · 스키마

운영 명령​

docker exec plantpulse-datalake pd status cep
docker exec plantpulse-datalake pd restart cep
docker exec plantpulse-datalake pd logs --lines 200 cep

# 어느 백엔드로 떴나 — 판정 지표는 로그 한 줄이다
docker exec plantpulse-datalake sh -c 'grep "CEP input path" ... | tail -1'

curl -fsS http://127.0.0.1:7400/api/health

자주 발생하는 문제​

증상원인조치
등록이 REJECTED 로 남는다부팅한 백엔드가 그 구성을 못 받는다거부 토큰 에서 그 한 줄을 찾습니다
등록이 400 으로 거부미등록 이벤트 타입이벤트 타입 등록
CEP 가 아예 안 뜬다cep.backend 오타 또는 그 런타임이 없는 WAR로그가 이름을 댑니다. 폴백이 없습니다
결과가 아무 데도 안 온다구독자가 0로그의 no subscriber
같은 결과가 두 번 온다cep.flink.* 스위치가 켜진 채 다른 백엔드로 부팅백엔드
헬스가 DEGRADED, 사유에 표 이름CEP 소유 표가 없다DB 접속(jdbc.datalake.*)을 보고 재기동 — 기동 때 스스로 만듭니다
API 401API 키 불일치passwd.sh PP_CEP_API_KEY
콘솔 로그인 거부PP_CEP_WEB_PASSWORD 비어 있음웹 화면 로그인 계정

관련 문서​