multi-service-debug
2
总安装量
2
周安装量
#66487
全站排名
安装命令
npx skills add https://github.com/dseirz-rgb/worker --skill multi-service-debug
Agent 安装分布
opencode
2
gemini-cli
2
antigravity
2
claude-code
2
github-copilot
2
codex
2
Skill 文档
Multi-Service Debug (夿å¡è°è¯)
ð æ ¸å¿ç念: åå¸å¼ç³»ç»è°è¯éè¦å ¨å±è§è§ãåç¹æ¥å¿ä¸å¤ï¼å¿ é¡»å ³è夿塿¥å¿æè½å®ä½æ ¹å ã
ð´ 第ä¸ååï¼å ç»è°ç¨é¾ï¼åçæ¥å¿
è°è¯åå¸å¼é®é¢å¿ é¡»å çæ¸ æå¡è°ç¨å ³ç³»ï¼
â é误æè·¯: "æ¥éäºï¼ççè¿ä¸ªæå¡çæ¥å¿"
â
æ£ç¡®æè·¯: "æ¥éäºï¼å
ç»åºè¯·æ±ç»è¿åªäºæå¡ï¼åéä¸ªæ£æ¥"
â é误æè·¯: "è¿ä¸ªæå¡æ²¡é®é¢ï¼è¯å®æ¯é£ä¸ªæå¡çé®é¢"
â
æ£ç¡®æè·¯: "å
ç¡®è®¤è¯·æ±æ¯å¦æ£ç¡®å°è¾¾ï¼å夿æ¯åªä¸ªç¯èåºé®é¢"
è°è¯ä¼å 级: ç½ç»è¿éæ§ > è¯·æ±æ ¼å¼ > æå¡é»è¾ > èµæºéå¶
When to Use This Skill
ä½¿ç¨æ¤æè½å½ä½ éè¦ï¼
- ææ¥è·¨æå¡è°ç¨å¤±è´¥çé®é¢
- èååæå¤ä¸ªæå¡çæ¥å¿
- è°è¯æå¡é´éä¿¡ï¼HTTP/WebSocketï¼
- å®ä½ç产ç¯å¢çæ§è½ç¶é¢
- ææ¥è¶ æ¶ãè¿æ¥å¤±è´¥çç½ç»é®é¢
- éªè¯æå¡å¥åº·ç¶æ
Not For / Boundaries
æ¤æè½ä¸éç¨äºï¼
- åæå¡å é¨çä¸å¡é»è¾è°è¯
- å端 UI 渲æé®é¢
- æ°æ®åºæ¥è¯¢ä¼åï¼åè performance-optimization skillï¼
Quick Reference
ðï¸ é¡¹ç®æå¡æ¶æ
âââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââ
â ç¨æ·æµè§å¨ â
âââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââ
â
â¼
âââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââ
â Vercel (å端 + API) â
â âââââââââââââââââââ âââââââââââââââââââââââââââââââââââââââ â
â â React SPA â â Serverless Functions (/api/*) â â
â â (client/) â â - /api/health â â
â â â â - /api/chat â â
â â â â - /api/documents â â
â â â â - /api/unified-intelligence/* â â
â âââââââââââââââââââ âââââââââââââââââââââââââââââââââââââââ â
âââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââ
â
âââââââââââââââââ¼ââââââââââââââââ
â¼ â¼ â¼
âââââââââââââââââââââ âââââââââââââââââââââ âââââââââââââââââââââ
â LightRAG â â Voice Service â â Quant Service â
â (Cloud Run) â â (Cloud Run) â â (Cloud Run) â
â â â â â â
â Port: 9621 â â Port: 8080 â â Port: 6900 â
â Python/FastAPI â â Python/LiveKit â â Python/FastAPI â
âââââââââââââââââââââ âââââââââââââââââââââ âââââââââââââââââââââ
ð æå¡ç«¯ç¹éæ¥
| æå¡ | æ¬å°ç«¯å£ | ç产 URL | å¥åº·æ£æ¥ |
|---|---|---|---|
| Vercel API | 3000 | https://your-app.vercel.app |
/api/health |
| LightRAG | 9621 | lightrag-service-xxx-uc.a.run.app |
/health |
| Voice | 8080 | voice-service-xxx-uc.a.run.app |
/health |
| Quant | 6900 | quant-service-xxx-uc.a.run.app |
/health |
ð å¿«éè¯æå½ä»¤
# 1. æ£æ¥æææå¡å¥åº·ç¶æ
curl -s https://your-app.vercel.app/api/health | jq
curl -s https://lightrag-service-xxx-uc.a.run.app/health | jq
curl -s https://voice-service-xxx-uc.a.run.app/health | jq
curl -s https://quant-service-xxx-uc.a.run.app/health | jq
# 2. æ¥ç GCP æå¡æ¥å¿
gcloud logging read "resource.type=cloud_run_revision" --limit=50 --format=json | jq
# 3. æ¥çç¹å®æå¡æ¥å¿
gcloud logging read "resource.labels.service_name=lightrag-service" --limit=20
夿å¡è°è¯å·¥ä½æµ
Phase 1: é®é¢å®ä½
1. 确认é®é¢ç°è±¡ï¼é误信æ¯ãHTTP ç¶æç ï¼
2. ç»åºè¯·æ±è°ç¨é¾
3. ç¡®å®é®é¢åçå¨åªä¸ªæå¡ä¹é´
4. æ¶éç¸å
³æ¶é´ç¹çæ¥å¿
Phase 2: æ¥å¿èå
# 设置æ¶é´èå´ï¼é®é¢åçåå 5 åéï¼
START_TIME="2025-01-01T10:00:00Z"
END_TIME="2025-01-01T10:10:00Z"
# èåææ Cloud Run æå¡æ¥å¿
gcloud logging read \
"resource.type=cloud_run_revision AND timestamp>=\"$START_TIME\" AND timestamp<=\"$END_TIME\"" \
--format="table(timestamp,resource.labels.service_name,textPayload)" \
--order=asc
Phase 3: å ³èåæ
1. ææ¶é´æåºæææ¥å¿
2. æ¾å°è¯·æ±å
¥å£æ¥å¿
3. è¿½è¸ªè¯·æ± IDï¼å¦ææï¼
4. æ¾å°é误åçç¹
5. åæä¸ä¸ææ¥å¿
Phase 4: éªè¯ä¿®å¤
1. æ¬å°å¤ç°é®é¢
2. åºç¨ä¿®å¤
3. æ¬å°éªè¯
4. é¨ç½²å°ç产
5. ç产éªè¯
æ¥å¿èååæ
ð GCP Cloud Run æ¥å¿æ¥è¯¢
# æ¥çæææå¡çé误æ¥å¿
gcloud logging read \
"resource.type=cloud_run_revision AND severity>=ERROR" \
--limit=50 \
--format="table(timestamp,resource.labels.service_name,textPayload)"
# æ¥çç¹å®æå¡çè¯¦ç»æ¥å¿
gcloud logging read \
"resource.labels.service_name=lightrag-service" \
--limit=100 \
--format=json | jq '.[] | {time: .timestamp, msg: .textPayload}'
# æå
³é®è¯æç´¢æ¥å¿
gcloud logging read \
"resource.type=cloud_run_revision AND textPayload:\"error\"" \
--limit=50
ð Vercel æ¥å¿æ¥è¯¢
# æ¥çæè¿é¨ç½²çæ¥å¿
vercel logs <deployment-url> --follow
# æ¥ç彿°æ§è¡æ¥å¿
vercel logs <deployment-url> --output=raw | grep -i error
ð æ¥å¿å ³èæå·§
// å¨è¯·æ±ä¸æ·»å trace ID
const traceId = crypto.randomUUID();
// ä¼ éç»ä¸æ¸¸æå¡
fetch(LIGHTRAG_URL, {
headers: {
'X-Trace-ID': traceId,
'X-Request-Time': new Date().toISOString(),
}
});
// 卿¥å¿ä¸å
å« trace ID
console.log(`[${traceId}] Processing request...`);
æå¡é´éä¿¡è°è¯
ð HTTP è°ç¨è°è¯
# æµè¯ Vercel -> LightRAG éä¿¡
curl -v -X POST https://lightrag-service-xxx-uc.a.run.app/query \
-H "Content-Type: application/json" \
-d '{"query": "test"}'
# æ£æ¥ååºæ¶é´
curl -w "@curl-format.txt" -s -o /dev/null \
https://lightrag-service-xxx-uc.a.run.app/health
# curl-format.txt å
容:
# time_namelookup: %{time_namelookup}s\n
# time_connect: %{time_connect}s\n
# time_appconnect: %{time_appconnect}s\n
# time_pretransfer: %{time_pretransfer}s\n
# time_redirect: %{time_redirect}s\n
# time_starttransfer: %{time_starttransfer}s\n
# time_total: %{time_total}s\n
ð WebSocket è°è¯ (Voice Service)
# ä½¿ç¨ websocat æµè¯ WebSocket è¿æ¥
websocat wss://voice-service-xxx-uc.a.run.app/ws
# æä½¿ç¨ wscat
npx wscat -c wss://voice-service-xxx-uc.a.run.app/ws
ð 常è§éä¿¡é®é¢
| é®é¢ | çç¶ | ææ¥æ¹å |
|---|---|---|
| è¿æ¥è¶ æ¶ | ETIMEDOUT |
æ£æ¥ç½ç»ãé²ç«å¢ãæå¡æ¯å¦è¿è¡ |
| è¿æ¥æç» | ECONNREFUSED |
æ£æ¥ç«¯å£ãæå¡ç¶æ |
| SSL é误 | CERT_* |
æ£æ¥è¯ä¹¦é ç½® |
| 502 Bad Gateway | 䏿¸¸æå¡é误 | æ£æ¥ç®æ æå¡æ¥å¿ |
| 503 Service Unavailable | æå¡è¿è½½ | æ£æ¥èµæºéå¶ãæ©å®¹ |
| CORS é误 | è·¨å被æç» | æ£æ¥ CORS é ç½® |
常è§é®é¢ææ¥
ð´ é®é¢ 1: Vercel API è°ç¨ Cloud Run è¶ æ¶
çç¶: API è¿å 504 Gateway Timeout
ææ¥æ¥éª¤:
# 1. æ£æ¥ Cloud Run æå¡ç¶æ
gcloud run services describe lightrag-service --region=us-central1
# 2. æ£æ¥æå¡æ¥å¿
gcloud logging read "resource.labels.service_name=lightrag-service" --limit=20
# 3. æ£æ¥å·å¯å¨æ¶é´
# 妿æå¡é¿æ¶é´æªè®¿é®ï¼å¯è½éè¦é¢ç
# 4. æ£æ¥ Vercel 彿°è¶
æ¶é
ç½®
# vercel.json ä¸ç maxDuration 设置
è§£å³æ¹æ¡:
- å¢å Vercel 彿°è¶ æ¶æ¶é´
- 设置 Cloud Run æå°å®ä¾æ°é¿å å·å¯å¨
- ä¼åæå¡å¯å¨æ¶é´
ð´ é®é¢ 2: æå¡é´è®¤è¯å¤±è´¥
çç¶: è¿å 401 Unauthorized æ 403 Forbidden
ææ¥æ¥éª¤:
# 1. æ£æ¥æå¡æ¯å¦éè¦è®¤è¯
gcloud run services describe <service> --format="yaml(spec.template.metadata.annotations)"
# 2. æ£æ¥ IAM æé
gcloud run services get-iam-policy <service>
# 3. æ£æ¥è¯·æ±å¤´ä¸ç认è¯ä¿¡æ¯
curl -v -H "Authorization: Bearer $TOKEN" https://service-url/endpoint
è§£å³æ¹æ¡:
- é ç½®æå¡å 许æªè®¤è¯è®¿é®ï¼å ¬å¼æå¡ï¼
- æé ç½®æ£ç¡®çæå¡è´¦å·å IAM æé
ð´ é®é¢ 3: ç¯å¢åéä¸ä¸è´
çç¶: æ¬å°æ£å¸¸ï¼ç产æ¥é
ææ¥æ¥éª¤:
# 1. æ£æ¥ Vercel ç¯å¢åé
vercel env ls
# 2. æ£æ¥ Cloud Run ç¯å¢åé
gcloud run services describe <service> \
--format="yaml(spec.template.spec.containers[0].env)"
# 3. å¯¹æ¯æ¬å° .env æä»¶
cat .env | grep -E "^[A-Z]"
è§£å³æ¹æ¡:
- 忥ææç¯å¢åé
- ä½¿ç¨ Secret Manager ç®¡çææé ç½®
ð´ é®é¢ 4: å å/CPU ä¸è¶³
çç¶: æå¡é¢ç¹éå¯ãOOM é误
ææ¥æ¥éª¤:
# 1. æ¥çèµæºä½¿ç¨æ
åµ
gcloud run services describe <service> \
--format="yaml(spec.template.spec.containers[0].resources)"
# 2. æ¥ç OOM æ¥å¿
gcloud logging read \
"resource.labels.service_name=<service> AND textPayload:\"OOM\""
# 3. æ¥ç GCP Console Metrics
# Cloud Run > æå¡ > Metrics > Memory utilization
è§£å³æ¹æ¡:
- å¢å å åé ç½®
- ä¼å代ç åå°å å使ç¨
- æ·»å å åçæ§åè¦
è°è¯å·¥å ·æ¨è
ð ï¸ å½ä»¤è¡å·¥å ·
| å·¥å · | ç¨é | å®è£ |
|---|---|---|
gcloud |
GCP æå¡ç®¡ç | brew install google-cloud-sdk |
vercel |
Vercel é¨ç½²ç®¡ç | npm i -g vercel |
jq |
JSON å¤ç | brew install jq |
websocat |
WebSocket è°è¯ | brew install websocat |
httpie |
HTTP è°è¯ | brew install httpie |
ð ï¸ æµè§å¨å·¥å ·
- Network 颿¿: æ¥ç请æ±/ååºè¯¦æ
- Console 颿¿: æ¥çå端æ¥å¿
- Application 颿¿: æ¥çåå¨ãCookie
ð ï¸ çæ§å·¥å ·
- GCP Cloud Monitoring: æå¡ææ ãåè¦
- Vercel Analytics: å端æ§è½ã彿°æ§è¡
- Sentry: é误追踪ï¼å¦å·²éæï¼
Examples
Example 1: ææ¥ LightRAG æ¥è¯¢å¤±è´¥
åºæ¯: ç¨æ·æ¥åææ¡£æç´¢åè½è¿åé误
Steps:
# 1. 确认é®é¢ - æ£æ¥ Vercel API æ¥å¿
vercel logs <deployment-url> | grep -i lightrag
# 2. æ£æ¥ LightRAG æå¡ç¶æ
curl -s https://lightrag-service-xxx-uc.a.run.app/health | jq
# 3. æ¥ç LightRAG æå¡æ¥å¿
gcloud logging read "resource.labels.service_name=lightrag-service" --limit=20
# 4. æ¬å°å¤ç°
curl -X POST http://localhost:9621/query \
-H "Content-Type: application/json" \
-d '{"query": "test query"}'
# 5. ä¿®å¤å¹¶éªè¯
# ... ä¿®å¤ä»£ç ...
# éæ°é¨ç½²åéªè¯
Example 2: ææ¥ Voice æå¡ WebSocket æè¿
åºæ¯: è¯é³å¯¹è¯é¢ç¹æå¼
Steps:
# 1. æ£æ¥ WebSocket è¿æ¥
websocat wss://voice-service-xxx-uc.a.run.app/ws
# 2. æ¥çæå¡æ¥å¿
gcloud logging read \
"resource.labels.service_name=voice-service AND textPayload:\"disconnect\"" \
--limit=50
# 3. æ£æ¥èµæºéå¶
gcloud run services describe voice-service \
--format="yaml(spec.template.spec.containers[0].resources)"
# 4. æ£æ¥å¹¶åè¿æ¥æ°
# GCP Console > Cloud Run > voice-service > Metrics
Example 3: å ¨é¾è·¯æ§è½åæ
åºæ¯: ç¨æ·åé¦é¡µé¢å è½½æ ¢
Steps:
# 1. æµéåæå¡ååºæ¶é´
for service in "vercel-app" "lightrag-service" "quant-service"; do
echo "Testing $service..."
curl -w "Total: %{time_total}s\n" -s -o /dev/null \
"https://$service-xxx.run.app/health"
done
# 2. åææ
¢è¯·æ±
gcloud logging read \
"resource.type=cloud_run_revision AND httpRequest.latency>\"1s\"" \
--limit=20
# 3. æ£æ¥æ°æ®åºæ¥è¯¢æ¶é´
# æ¥ç Supabase Dashboard > Database > Query Performance
References
references/service-map.md: æå¡ä¾èµå ³ç³»å¾ã端å£åç«¯ç¹æ¸ åreferences/log-queries.md: å¸¸ç¨æ¥å¿æ¥è¯¢å½ä»¤éåreferences/troubleshooting-checklist.md: æ éææ¥æ£æ¥æ¸ å
Maintenance
- Sources: GCP Cloud Run ææ¡£, Vercel ææ¡£, 项ç®å®è·µç»éª
- Last Updated: 2025-01-01
- Known Limits:
- æ¥å¿æ¥è¯¢ä¾èµ
gcloudCLI è®¤è¯ - æäºè°è¯éè¦ç¸åºç GCP/Vercel è®¿é®æé
- æ¥å¿æ¥è¯¢ä¾èµ