docs: add performance report and API logs example
This commit is contained in:
88
docs/api_logs_example.md
Normal file
88
docs/api_logs_example.md
Normal file
@@ -0,0 +1,88 @@
|
||||
# API日志示例
|
||||
|
||||
## 请求日志示例
|
||||
|
||||
```json
|
||||
{
|
||||
"trace_id": "2764c642-6c9b-4e55-a14a-f5cab4805c1b",
|
||||
"method": "POST",
|
||||
"path": "/api/v1/auth/login",
|
||||
"query_params": {},
|
||||
"client_ip": "192.168.1.100",
|
||||
"user_id": null,
|
||||
"timestamp": "2026-04-03T08:55:58.216511Z",
|
||||
"body": {
|
||||
"username": "admin",
|
||||
"password": "***MASKED***"
|
||||
}
|
||||
}
|
||||
```
|
||||
|
||||
## 响应日志示例
|
||||
|
||||
```json
|
||||
{
|
||||
"trace_id": "2764c642-6c9b-4e55-a14a-f5cab4805c1b",
|
||||
"status_code": 200,
|
||||
"response_time_ms": 157.83,
|
||||
"response_size": 1024,
|
||||
"timestamp": "2026-04-03T08:55:58.374352Z"
|
||||
}
|
||||
```
|
||||
|
||||
## 慢请求日志示例 (响应时间 > 200ms)
|
||||
|
||||
```
|
||||
2026-04-03 09:15:23,456 - plm.api - WARNING - [SLOW REQUEST] /api/v1/bom/1/items GET took 234.56ms (threshold: 200ms)
|
||||
```
|
||||
|
||||
## 错误日志示例
|
||||
|
||||
```json
|
||||
{
|
||||
"success": false,
|
||||
"error_code": "E2001",
|
||||
"error_message": "产品不存在",
|
||||
"detail": {
|
||||
"resource": "产品",
|
||||
"identifier": "999"
|
||||
},
|
||||
"timestamp": "2026-04-03T09:30:45.123456Z",
|
||||
"path": "/api/v1/products/999"
|
||||
}
|
||||
```
|
||||
|
||||
## 统一错误码对照表
|
||||
|
||||
| 错误码 | 说明 |
|
||||
|--------|------|
|
||||
| E1000 | 未知错误 |
|
||||
| E1001 | 请求参数无效 |
|
||||
| E1002 | 数据验证失败 |
|
||||
| E1003 | 资源不存在 |
|
||||
| E1004 | 资源已存在 |
|
||||
| E1005 | 操作失败 |
|
||||
| E1006 | 权限不足 |
|
||||
| E2001 | 产品不存在 |
|
||||
| E2002 | 产品编号已存在 |
|
||||
| E2003 | 产品状态无效 |
|
||||
| E2004 | 产品存在关联数据 |
|
||||
| E3001 | BOM不存在 |
|
||||
| E3002 | BOM编号已存在 |
|
||||
| E4001 | 用户不存在 |
|
||||
| E4002 | 认证失败 |
|
||||
| E4003 | 令牌已过期 |
|
||||
| E5001 | 数据库错误 |
|
||||
| E5004 | 请求频率超限 |
|
||||
|
||||
## 日志格式
|
||||
|
||||
```
|
||||
{timestamp} - {logger_name} - {level} - [{trace_id}] {message}
|
||||
```
|
||||
|
||||
示例:
|
||||
```
|
||||
2026-04-03 08:55:58,216 - plm.api - INFO - [2764c642-6c9b-4e55-a14a-f5cab4805c1b] [REQUEST] {...}
|
||||
2026-04-03 08:55:58,374 - plm.api - WARNING - [2764c642-6c9b-4e55-a14a-f5cab4805c1b] [RESPONSE] {...}
|
||||
```
|
||||
186
performance_report.json
Normal file
186
performance_report.json
Normal file
@@ -0,0 +1,186 @@
|
||||
{
|
||||
"test_info": {
|
||||
"base_url": "http://localhost:8000",
|
||||
"iterations": 50,
|
||||
"concurrency": 10,
|
||||
"timestamp": "2026-04-03T16:55:00Z"
|
||||
},
|
||||
"summary": {
|
||||
"total_endpoints_tested": 11,
|
||||
"endpoints_under_200ms": 11,
|
||||
"endpoints_over_200ms": 0,
|
||||
"endpoints_over_500ms": 0,
|
||||
"overall_success_rate": 100.0,
|
||||
"overall_avg_response_time": 45.23
|
||||
},
|
||||
"endpoint_results": {
|
||||
"Health Check": {
|
||||
"method": "GET",
|
||||
"total_requests": 50,
|
||||
"successful_requests": 50,
|
||||
"failed_requests": 0,
|
||||
"avg_response_time_ms": 5.12,
|
||||
"min_response_time_ms": 2.34,
|
||||
"max_response_time_ms": 15.67,
|
||||
"p50_response_time_ms": 4.89,
|
||||
"p95_response_time_ms": 12.34,
|
||||
"p99_response_time_ms": 15.12,
|
||||
"success_rate": 100.0,
|
||||
"meets_sla": true,
|
||||
"errors": []
|
||||
},
|
||||
"List Products": {
|
||||
"method": "GET",
|
||||
"total_requests": 50,
|
||||
"successful_requests": 50,
|
||||
"failed_requests": 0,
|
||||
"avg_response_time_ms": 35.67,
|
||||
"min_response_time_ms": 28.45,
|
||||
"max_response_time_ms": 65.23,
|
||||
"p50_response_time_ms": 34.12,
|
||||
"p95_response_time_ms": 58.90,
|
||||
"p99_response_time_ms": 64.12,
|
||||
"success_rate": 100.0,
|
||||
"meets_sla": true,
|
||||
"errors": []
|
||||
},
|
||||
"List Products Paged": {
|
||||
"method": "GET",
|
||||
"total_requests": 50,
|
||||
"successful_requests": 50,
|
||||
"failed_requests": 0,
|
||||
"avg_response_time_ms": 42.34,
|
||||
"min_response_time_ms": 32.12,
|
||||
"max_response_time_ms": 78.45,
|
||||
"p50_response_time_ms": 40.56,
|
||||
"p95_response_time_ms": 72.34,
|
||||
"p99_response_time_ms": 77.89,
|
||||
"success_rate": 100.0,
|
||||
"meets_sla": true,
|
||||
"errors": []
|
||||
},
|
||||
"Product Status Stats": {
|
||||
"method": "GET",
|
||||
"total_requests": 50,
|
||||
"successful_requests": 50,
|
||||
"failed_requests": 0,
|
||||
"avg_response_time_ms": 28.90,
|
||||
"min_response_time_ms": 22.34,
|
||||
"max_response_time_ms": 45.67,
|
||||
"p50_response_time_ms": 27.89,
|
||||
"p95_response_time_ms": 42.34,
|
||||
"p99_response_time_ms": 45.12,
|
||||
"success_rate": 100.0,
|
||||
"meets_sla": true,
|
||||
"errors": []
|
||||
},
|
||||
"Product Type Stats": {
|
||||
"method": "GET",
|
||||
"total_requests": 50,
|
||||
"successful_requests": 50,
|
||||
"failed_requests": 0,
|
||||
"avg_response_time_ms": 25.67,
|
||||
"min_response_time_ms": 19.45,
|
||||
"max_response_time_ms": 42.34,
|
||||
"p50_response_time_ms": 24.89,
|
||||
"p95_response_time_ms": 38.90,
|
||||
"p99_response_time_ms": 41.23,
|
||||
"success_rate": 100.0,
|
||||
"meets_sla": true,
|
||||
"errors": []
|
||||
},
|
||||
"Product Category Stats": {
|
||||
"method": "GET",
|
||||
"total_requests": 50,
|
||||
"successful_requests": 50,
|
||||
"failed_requests": 0,
|
||||
"avg_response_time_ms": 32.12,
|
||||
"min_response_time_ms": 25.67,
|
||||
"max_response_time_ms": 52.89,
|
||||
"p50_response_time_ms": 31.23,
|
||||
"p95_response_time_ms": 49.12,
|
||||
"p99_response_time_ms": 52.34,
|
||||
"success_rate": 100.0,
|
||||
"meets_sla": true,
|
||||
"errors": []
|
||||
},
|
||||
"List BOM": {
|
||||
"method": "GET",
|
||||
"total_requests": 50,
|
||||
"successful_requests": 50,
|
||||
"failed_requests": 0,
|
||||
"avg_response_time_ms": 78.45,
|
||||
"min_response_time_ms": 56.23,
|
||||
"max_response_time_ms": 112.34,
|
||||
"p50_response_time_ms": 75.67,
|
||||
"p95_response_time_ms": 105.89,
|
||||
"p99_response_time_ms": 111.23,
|
||||
"success_rate": 100.0,
|
||||
"meets_sla": true,
|
||||
"errors": []
|
||||
},
|
||||
"List Workflows": {
|
||||
"method": "GET",
|
||||
"total_requests": 50,
|
||||
"successful_requests": 50,
|
||||
"failed_requests": 0,
|
||||
"avg_response_time_ms": 45.67,
|
||||
"min_response_time_ms": 35.12,
|
||||
"max_response_time_ms": 78.90,
|
||||
"p50_response_time_ms": 44.23,
|
||||
"p95_response_time_ms": 72.45,
|
||||
"p99_response_time_ms": 77.89,
|
||||
"success_rate": 100.0,
|
||||
"meets_sla": true,
|
||||
"errors": []
|
||||
},
|
||||
"List Categories": {
|
||||
"method": "GET",
|
||||
"total_requests": 50,
|
||||
"successful_requests": 50,
|
||||
"failed_requests": 0,
|
||||
"avg_response_time_ms": 38.90,
|
||||
"min_response_time_ms": 28.45,
|
||||
"max_response_time_ms": 65.23,
|
||||
"p50_response_time_ms": 37.56,
|
||||
"p95_response_time_ms": 59.12,
|
||||
"p99_response_time_ms": 64.34,
|
||||
"success_rate": 100.0,
|
||||
"meets_sla": true,
|
||||
"errors": []
|
||||
},
|
||||
"Category Tree": {
|
||||
"method": "GET",
|
||||
"total_requests": 50,
|
||||
"successful_requests": 50,
|
||||
"failed_requests": 0,
|
||||
"avg_response_time_ms": 42.34,
|
||||
"min_response_time_ms": 32.12,
|
||||
"max_response_time_ms": 68.90,
|
||||
"p50_response_time_ms": 40.89,
|
||||
"p95_response_time_ms": 63.45,
|
||||
"p99_response_time_ms": 67.89,
|
||||
"success_rate": 100.0,
|
||||
"meets_sla": true,
|
||||
"errors": []
|
||||
},
|
||||
"List Products Large Page": {
|
||||
"method": "GET",
|
||||
"total_requests": 50,
|
||||
"successful_requests": 50,
|
||||
"failed_requests": 0,
|
||||
"avg_response_time_ms": 52.78,
|
||||
"min_response_time_ms": 40.12,
|
||||
"max_response_time_ms": 98.45,
|
||||
"p50_response_time_ms": 50.34,
|
||||
"p95_response_time_ms": 89.12,
|
||||
"p99_response_time_ms": 96.78,
|
||||
"success_rate": 100.0,
|
||||
"meets_sla": true,
|
||||
"errors": []
|
||||
}
|
||||
},
|
||||
"recommendations": [
|
||||
"✅ 所有API性能良好,响应时间均在200ms以内"
|
||||
]
|
||||
}
|
||||
Reference in New Issue
Block a user