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/keys | API 키 |
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 401 | API 키 불일치 | passwd.sh PP_CEP_API_KEY |
| 콘솔 로그인 거부 | PP_CEP_WEB_PASSWORD 비어 있음 | 웹 화면 로그인 계정 |
관련 문서
- CEP 섹션 — 개요 · EQL · 백엔드 · 이벤트 타입 · 운영 · 한계
- 데이터레이크 개요
- CEP 콘솔 (7401)
- CEP 클라이언트