English {#english}
Store per-node CPU, memory, disk, and tenant count in D1 server_metrics for AI placement (decidePlacement). Path: node agent/cron → Control Plane POST /internal/server-metrics → D1. Ref: intelligent-automation-implementation-plan §3.4, tenant-provisioning-flow §B.1. Full details: see Korean section below.
한국어 {#korean}
서버 메트릭 수집 (server_metrics → D1)
목적: 노드별 CPU·메모리·디스크·테넌트 수를 D1 server_metrics에 저장하여 AI 배치(decidePlacement)에서 사용.
참조: intelligent-automation-implementation-plan §3.4, tenant-provisioning-flow §B.1.
수집 경로
- 노드 에이전트/Cron → Control Plane
POST /internal/server-metrics→ D1server_metrics - 주기: 1~5분 권장.
엔드포인트
POST /internal/server-metrics
-
인증:
Authorization: Bearer <INTERNAL_API_KEY>(Control Plane과 동일) -
Body (JSON):
필드 필수 타입 설명 node_id 예 string D1 nodes.node_id(노드 식별자)cpu_pct 아니오 number CPU 사용률 0~100 memory_pct 아니오 number 메모리 사용률 0~100 disk_pct 아니오 number 디스크 사용률 0~100 tenant_count 아니오 number 해당 노드의 테넌트 수 (기본 0) -
응답:
200+{ "ok": true }
노드에서 푸시하는 방법
각 노드(또는 중앙 수집기)에서 주기적으로 메트릭을 수집한 뒤 Control Plane에 POST.
예: cron + curl (Linux 노드)
# /etc/cron.d/prego-metrics (매 5분)*/5 * * * * root /usr/local/bin/prego-push-metrics.sh/usr/local/bin/prego-push-metrics.sh 예시:
#!/bin/bashNODE_ID="node-01" # nodes.node_id와 일치CONTROL_PLANE_URL="https://prego-control-plane.workers.dev"INTERNAL_API_KEY="..."
# CPU, memory, disk (Linux)CPU=$(top -bn1 | sed -n '3p' | awk '{print $2}' | tr -d '%')MEM=$(free | awk '/Mem:/{printf "%.1f", $3/$2*100}')DISK=$(df / | awk 'NR==2{printf "%.1f", $3/$2*100}')TENANT_COUNT=0 # 실제로는 Frappe/DB에서 사이트 수 조회
curl -sS -X POST "${CONTROL_PLANE_URL}/internal/server-metrics" \ -H "Authorization: Bearer ${INTERNAL_API_KEY}" \ -H "Content-Type: application/json" \ -d "{\"node_id\":\"${NODE_ID}\",\"cpu_pct\":${CPU},\"memory_pct\":${MEM},\"disk_pct\":${DISK},\"tenant_count\":${TENANT_COUNT}}"NODE_ID는 D1nodes테이블에 등록된node_id와 동일해야 함.INTERNAL_API_KEY는 Control Plane Worker에 설정한 값과 동일하게 보관(시크릿).
대안: Hetzner API
Hetzner Cloud API로 서버 메트릭을 가져와 같은 엔드포인트로 푸시하는 스크립트나 별도 Worker를 둘 수 있음. 이 경우 nodes 테이블에 Hetzner server id 매핑이 있으면 노드별로 요청 후 D1에 쓰거나, 동일한 POST /internal/server-metrics를 호출하면 됨.