운영
CEP 는 pd 의 cep 서비스 하나입니다 — API · 콘솔 · 엔진이 같은 프로세스에 있습니다.
| 항목 | 값 |
|---|---|
| 포트 | 7400 (HTTP) · 7401 (TLS) |
pd 서비스 | cep — MASTER 만 |
| 설정 | plantpulse-cep.properties (렌더됩니다) |
| 룰 · 이벤트 타입 | PostgreSQL datalake DB |
| 입력 · 출력 | Valkey |
docker exec plantpulse-datalake pd status cep
docker exec plantpulse-datalake pd restart cep
docker exec plantpulse-datalake pd logs --lines 200 cep
어느 백엔드로 떴나 — 로그 한 줄이 답입니다
CEP input path: aster.
ingest.rate_1m 은 증거가 아닙니다어느 엔진으로 떴든 유입량은 오릅니다. 「돌고 있다」와 「무엇이 돌고 있다」는 다른 질문입니다.
백엔드를 고르는 법과 전환 순서는 백엔드에 있습니다.
등록 결과 읽기
문장은 등록되고, 등록에는 결과가 있습니다.
curl -fsS -H "X-API-Key: ${PP_CEP_API_KEY}" http://127.0.0.1:7400/api/v1/eql/registration
| 결과 | 뜻 |
|---|---|
| ACTIVE | 부팅한 백엔드가 받았고 돌고 있습니다 |
| REJECTED | 저장은 됐지만 돌지 않습니다. 어느 구성 때문인지 토큰이 함께 있습니다 |
REJECTED 는 «결함» 이 아니라 목록입니다그 수가 0 이어야 정상인 것이 아닙니다. 거절된 문장은 다음에 무엇을 할지의 입력입니다 — 구성을 빼고 다시 쓰거나, 백엔드를 바꾸거나, 그 기능을 요청하거나.
중요한 것은 조용하지 않다는 점입니다. 거절은 저장되고, 이름이 있고, 조회됩니다.
이식성은 따로 묻습니다.
curl -fsS -H "X-API-Key: ${PP_CEP_API_KEY}" http://127.0.0.1:7400/api/v1/eql/portability
주요 API
| 경로 | 하는 일 |
|---|---|
POST /api/v1/eql/deploy | 문장 등록 |
POST /api/v1/eql/validate | 판정만 |
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 — 엔진 · 캐시 · 스키마 |
서버가 문장마다 매치와 출력을 세고 위 두 엔드포인트가 냅니다. 어느 백엔드로 부팅해도 같습니다.
문장별 CPU · 벽시계 시간은 내지 않습니다 — 못 재는 값을 0 으로 내면 「빠르다」로 읽힙니다.
룰의 정본 — 의도는 DB, 사실은 엔진
| 질문 | 정본 |
|---|---|
| 「어떤 룰이 있어야 하나」 | cep_statement (datalake DB) |
| 「어떤 룰이 돌고 있나」 | 부팅한 엔진 자신 |
CREATE TABLE IF NOT EXISTS cep_statement (
statement_name VARCHAR(200) NOT NULL,
eql TEXT NOT NULL,
updated_at_ms BIGINT NOT NULL DEFAULT 0,
updated_by VARCHAR(64) NOT NULL DEFAULT '',
CONSTRAINT cep_statement_pkey PRIMARY KEY (statement_name)
);
한 문장이 한 행이고, 등록이 쓰고 해제가 지웁니다.
CEP 는 규칙 엔진이지 자산 관리가 아닙니다. 그래서 «무엇을 돌려야 하나» 를 자기 표에 적습니다.
enabled 컬럼이 없는 것은 의도입니다멈추라는 신호는 행이 없는 것 하나뿐이고, 그것이 해제가 만드는 상태입니다. 언제나 참일 수밖에 없는 컬럼은 있지도 않은 스위치처럼 읽힙니다.
statement_name 이 기본키인 것도 그렇습니다 — 같은 이름이 본문 둘을 갖는 상황을 해소하지 않고 거부합니다.
updated_at_ms · updated_by 는 코드가 읽지 않습니다 — 장애 중에 psql 앞에 앉은 사람을 위한 것입니다.
표 셋(cep_statement · cep_event_type · cep_api_key)은 CEP 가 기동할 때 스스로 만듭니다. 전부 «있으면 그대로 두는» 형태라 값이 든 설치에도 그대로 적용됩니다.
입력 — Valkey 스트림
| 설정 | 기본값 |
|---|---|
| 스트림 접두사 | PP:CEP-IN-STREAM |
| 샤드 수 | 16 (cep.stream.shard_count) |
| 한 번에 읽는 건수 | 1000 |
| TLS | 꺼짐 — 값은 cache.ssl.enabled 에서 옵니다 |
tls 기본값이 «꺼짐» 인 것은 실측 결과입니다플랫폼 Valkey 설정에 TLS 포트 선언이 없고 평문으로 서비스합니다.
🔴 이 값이 틀리면 시끄럽게 실패하지 않습니다. 평문 서버에 TLS 로 붙었다가 핸드셰이크 타임아웃으로 죽는데, 그것은 설정 문제가 아니라 네트워크 장애처럼 읽힙니다.
실패·정체된 이벤트는 데드레터로 보존합니다 — 조용한 폐기로 되돌리지 마십시오.
출력 — 문장마다 토픽 하나
결과는 문장 이름마다 하나인 Valkey 토픽으로 나갑니다.
- 구독자가 0이면 로그만 남습니다. 발행은 구독자 없이도 성공하므로, 거기가 결과가 조용히 사라지는 자리입니다.
- 재배포할 때는 컨슈머를 멈춘 뒤 레지스트리를 비웁니다. 순서가 반대면 재배포마다 데드레터가 쌓입니다.
시간대
| 층 | 값 | 무엇이 정하나 |
|---|---|---|
| 와이어 | epoch ms | 시간대 없음. 어떤 PP_TZ 에서도 같은 수 |
| 창 경계 | 문장 > PP_TZ > 거절 | WINDOW TUMBLING … AT TIME ZONE |
등록 응답에 실제로 쓰인 시간대와 그 출처가 함께 나옵니다 — 「어느 자정이었나」를 나중에 되물을 수 있어야 하기 때문입니다.
추측해서 고르지 않습니다. 조용히 고른 시간대는 배포 호스트마다 다른 답을 만듭니다.
설정 값
| 키 | 기본값 | 무엇 |
|---|---|---|
cep.backend | aster | 백엔드 — aster · flink. 설정하지 않으면 aster 로 뜹니다. 그 밖의 값(esper · siddhi 같은 옛 값 포함)은 이름을 대며 부팅이 멈춥니다 |
cep.mode | native | portable 이면 기준 백엔드(Aster CEP)에게도 묻습니다 |
cep.stream.shard_count | 16 | 입력 샤드 |
cep.consumer.thread_count | 16 | 컨슈머 스레드 |
cep.api.max_eql_text_length | 100000 | 문장 길이 상한 |
cep.storage.ttl_seconds | 864000 (10일) | 운영 지표 보존 |
cep.api.key | 관리 API 의 X-API-Key | |
cep.web.user · cep.web.password | 콘솔 로그인 — 비면 콘솔만 닫힙니다 |
값을 바꾸는 절차는 설정 바꾸는 법, 키 회전은 비밀번호 · API 키 바꾸기입니다.
정본은 배포가 렌더하는 템플릿입니다.