# 5. Tracing & Observability

Toàn bộ quá trình Dual-Agent được trace qua **Langfuse** — platform observability chuyên dụng cho LLM.

## Metrics theo dõi

| Metric | Mô tả | Ngưỡng tốt |
|---|---|---|
| `classifier_ms` | Thời gian Classifier xử lý | < 1500ms |
| `stylist_ms` | Thời gian Stylist xử lý | < 2000ms |
| `tool_ms` | Thời gian ProductSearchEngine chạy | < 500ms |
| `total_ms` | Tổng thời gian end-to-end | < 4000ms |
| `stage` | Mode hiện tại của khách | BROWSE → RETENTION |
| `tool_called` | Classifier có gọi Tool không | true/false |
| `token_in` | Số token input | Monitor cost |
| `token_out` | Số token output | Monitor cost |

## Cách đọc Trace trong Langfuse

```
Trace: lead_agent_v2
├── Span: classifier_node (1200ms)
│   ├── Generation: classifier_llm_call
│   │   └── Output: ClassifierOutput { tool_name: "lead_search_tool", ... }
│   └── Event: stage_transition (IDENTIFYING → CONSIDERING)
├── Span: tool_execution (450ms)
│   ├── Event: cascading_tier_1 (0 results)
│   ├── Event: cascading_tier_2 (3 results)
│   └── Event: stock_check (2 in_stock, 1 out_of_stock)
└── Span: stylist_node (1800ms)
    ├── Generation: stylist_llm_call
    │   └── Output: StylistOutput { ai_response: "Dạ anh ơi...", ... }
    └── Event: insight_updated
```

## Dashboard Metrics

Tạo dashboard Langfuse theo dõi:

| Panel | Query | Mục đích |
|---|---|---|
| **Conversion Rate** | `stage = CLOSING` / total sessions | Tỷ lệ khách đến bước chốt |
| **Early Exit Rate** | `early_exit = true` / total | Bao nhiêu % tin nhắn không cần search |
| **Avg Latency** | avg(`total_ms`) | Tốc độ phản hồi trung bình |
| **Tool Error Rate** | `tool_error = true` / total | Tỷ lệ lỗi ProductSearchEngine |
| **Token Cost / Day** | sum(`token_in` + `token_out`) * price | Chi phí LLM hàng ngày |

File tham chiếu: `graph.py` — các dòng `langfuse.trace()`, `controller.py` — metric logging
