การเฝ้าระวัง · Monitoring
On this page
แอปไม่มีฐานข้อมูลและสถานะฝั่งเซิร์ฟเวอร์ สิ่งที่ต้องเฝ้าระวังจึงมีไม่มาก: ความพร้อมของหน้า, พฤติกรรมของ /api/plan (AI vs fallback, rate limit) และค่าใช้จ่าย OpenAI
Cloudflare Workers Observability#
wrangler.jsonc เปิด "observability": { "enabled": true, "head_sampling_rate": 1 } (เก็บ log ทุกคำขอ) และ upload_source_maps: true (stack trace อ่านได้) ดูใน Cloudflare Dashboard → Workers & Pages → nvx-stack-builder → Observability / Logs หรือดูสดด้วย:
npx wrangler tail nvx-stack-builder --format json(ต้องมีสิทธิ์ Workers Tail: Read)
โครงสร้าง log ของแอป#
/api/plan เขียน log เป็น JSON บรรทัดเดียว ไม่มี prompt, key หรือ header:
{"at":"api/plan","event":"rate_limited","ray":"8c1f...","limiter":"general","backend":"workers"}
{"at":"api/plan","event":"ai_fallback","ray":"8c1f...","reason":"OpenAI 429 (rate_limit_exceeded): ...","status":429,"keySource":"server"}
{"at":"api/plan","event":"body_read_failed","ray":"8c1f...","name":"TypeError"}และ log จาก subsystem อื่น: [env] ignoring invalid values for: ... (config ผิด), [rate-limit] NVX_PLAN_AI_LIMITER binding failed, using memory fallback (binding มีปัญหา)
สัญญาณที่ควรดูและความหมาย#
| สัญญาณ | อาจหมายถึง | ทำอะไร |
|---|---|---|
ai_fallback + status: 401 |
key ผิด/ถูก revoke | หมุน key (env-secrets.md) |
ai_fallback + status: 429 จาก OpenAI |
โควตา OpenAI หมด | ตรวจ billing/limit ฝั่ง OpenAI |
ai_fallback + timed out บ่อย |
โมเดลช้า หรือ OPENAI_MAX_OUTPUT_TOKENS สูงไป |
ปรับ OPENAI_TIMEOUT_MS / token cap |
ai_fallback + invalid AI output |
โมเดลไม่ทำตาม schema | ตรวจ OPENAI_MODEL, prompt |
rate_limited จำนวนมากจาก ray ต่างกัน |
การใช้ในทางที่ผิด หรือ limit ต่ำไป | พิจารณาปรับ ratelimits (ต้องอนุมัติ) |
[env] ignoring invalid values |
vars ผิดรูปแบบ |
แก้ wrangler.jsonc |
| 5xx จาก Worker | bug หรือ adapter | ดู stack trace, พิจารณา rollback |
ใช้ค่า ray (จาก header cf-ray) เชื่อม log กับคำขอที่ผู้ใช้รายงาน
Synthetic check (แนะนำ)#
ตั้ง cron หรือ uptime monitor ภายนอกให้เรียกทุก 5–15 นาที:
GET /→ 200GET /api/plan→ 200 และ JSON มีserverKeyConfigured- (ไม่ควร POST ใน synthetic check เพราะจะเสีย rate limit และอาจเสียเงิน ถ้าจำเป็นใช้
"mode":"fallback")
ค่าใช้จ่าย#
ดู usage ใน OpenAI dashboard แยกตาม key ของเซิร์ฟเวอร์ ค่าสูงสุดต่อคำขอถูกจำกัดด้วย OPENAI_MAX_OUTPUT_TOKENS รายละเอียดใน rate-limits-cost.md
อ้างอิงโค้ด#
src/app/api/plan/route.ts (log()), src/lib/server/env.ts, src/lib/server/rate-limit.ts
Source: docs/operations/monitoring.md · /docs/operations/monitoring.md