# 告警同步功能使用说明

## 功能概述

告警同步功能会自动将您的VWED任务微服务中产生的WARNING及以上级别的日志同步到主系统，实现统一的告警管理。

## 核心特性

- **自动同步**: 无需修改现有业务代码，所有WARNING及以上级别的日志会自动同步
- **异步处理**: 采用异步队列，不影响业务性能
- **智能分类**: 根据logger名称自动分类告警类型（系统/机器人/任务）
- **错误重试**: 支持配置重试次数和延迟
- **灵活配置**: 支持开关控制和详细参数配置

## 告警级别映射

| Python日志级别 | 主系统告警级别 | 说明 |
|---------------|---------------|------|
| logging.WARNING | 2 (警告) | 需要关注但不影响系统运行 |
| logging.ERROR | 3 (错误) | 影响功能但系统可继续运行 |
| logging.CRITICAL | 4 (严重) | 严重错误，需要立即处理 |
| logging.INFO | - | 不同步（信息级别） |

## 告警类型自动识别

系统会根据logger名称自动识别告警类型：

| Logger名称包含关键词 | 告警类型 | 主系统type值 |
|-------------------|---------|-------------|
| task, execution, scheduler, template | 任务告警 | 3 |
| robot, vehicle, amr | 机器人告警 | 2 |
| 其他 | 系统告警 | 1 |

## 配置说明

在`config/settings.py`中的相关配置项：

```python
# 告警同步配置
ALERT_SYNC_ENABLED: bool = True                    # 是否启用告警同步
ALERT_SYNC_HOST: str = "192.168.189.97"           # 主系统IP
ALERT_SYNC_PORT: int = 8080                       # 主系统端口
ALERT_SYNC_API_PATH: str = "/warning"             # 告警API路径
ALERT_SYNC_TIMEOUT: int = 10                      # 请求超时时间（秒）
ALERT_SYNC_RETRY_COUNT: int = 3                   # 重试次数
ALERT_SYNC_RETRY_DELAY: int = 1                   # 重试延迟（秒）
ALERT_SYNC_BATCH_SIZE: int = 10                   # 批量发送大小
ALERT_SYNC_QUEUE_SIZE: int = 1000                 # 队列大小
ALERT_SYNC_MIN_LEVEL: str = "WARNING"             # 最小告警级别
```

### 环境变量配置

也可以通过环境变量配置：

```bash
export ALERT_SYNC_ENABLED=true
export ALERT_SYNC_HOST=192.168.189.97
export ALERT_SYNC_PORT=8080
export ALERT_SYNC_TIMEOUT=10
```

## 使用方法

### 1. 基本使用

直接使用现有的日志记录方式，系统会自动同步：

```python
from utils.logger import get_logger

logger = get_logger("services.task_service")

# 这些日志会自动同步到主系统
logger.warning("任务执行超时")
logger.error("任务执行失败")
logger.critical("任务调度器严重错误")

# 这些日志不会同步
logger.info("任务开始执行")
logger.debug("调试信息")
```

### 2. 异常处理

使用exception方法记录异常，会包含更详细的信息：

```python
try:
    # 业务逻辑
    result = some_risky_operation()
except Exception as e:
    logger.exception("操作失败")  # 会自动同步并包含异常堆栈
```

### 3. 不同模块的告警

```python
# 任务相关告警
task_logger = get_logger("services.task_execution")
task_logger.error("任务执行失败")  # 会被标记为任务告警(type=3)

# 机器人相关告警
robot_logger = get_logger("services.robot_scheduler")
robot_logger.warning("机器人电池电量低")  # 会被标记为机器人告警(type=2)

# 系统相关告警
system_logger = get_logger("database.connection")
system_logger.error("数据库连接失败")  # 会被标记为系统告警(type=1)
```

## 自动处理的场景

以下场景的错误会自动记录日志并同步：

1. **HTTP错误**: 4xx和5xx HTTP状态码
2. **参数验证错误**: FastAPI参数验证失败
3. **未捕获异常**: 全局异常处理器捕获的异常
4. **业务逻辑错误**: 您在代码中主动记录的WARNING及以上级别日志

## 同步到主系统的数据格式

发送到主系统的数据格式如下：

```json
{
    "type": 3,                           // 告警类型: 1-系统, 2-机器人, 3-任务
    "level": 2,                          // 告警级别: 2-警告, 3-错误, 4-严重
    "code": 5678,                        // 4位告警码（5400-9999范围，自动生成）
    "name": "TASK_SERVICE_WARNING",      // 告警名称（自动生成）
    "description": "任务执行超时 [文件: task_service.py:123] [函数: execute_task()]",
    "solution": "请检查相关日志文件获取详细的异常堆栈信息，并根据异常类型进行排查"  // 可选
}
```

## 测试功能

运行测试脚本验证功能：

```bash
cd scripts
python test_alert_sync.py
```

测试脚本会：
- 发送不同类型和级别的告警
- 验证INFO级别不会同步
- 显示服务状态信息

## 故障排查

### 1. 检查配置

```python
from utils.alert_sync import get_alert_sync_service
service = get_alert_sync_service()

print(f"启用状态: {service.enabled}")
print(f"同步URL: {service.sync_url}")
print(f"队列大小: {service.alert_queue.qsize()}")
```

### 2. 查看日志

告警同步的错误信息会输出到控制台，查看是否有网络或配置问题。

### 3. 临时禁用

如果需要临时禁用告警同步：

```bash
export ALERT_SYNC_ENABLED=false
```

或在配置文件中设置：

```python
ALERT_SYNC_ENABLED: bool = False
```

## 性能影响

- **内存占用**: 队列最大1000个待发送告警，每个告警约1KB
- **网络开销**: 异步发送，不阻塞业务逻辑
- **CPU占用**: 后台线程处理，对主业务影响极小

## 注意事项

1. **网络依赖**: 需要确保微服务能够访问主系统的告警接口
2. **队列满载**: 如果队列满载，新的告警会被丢弃
3. **重试机制**: 发送失败会自动重试，但最终失败的告警会丢失
4. **日志循环**: 告警同步本身的错误不会触发新的告警，避免无限循环

## 最佳实践

1. **合理使用日志级别**: 只有真正需要关注的问题才使用WARNING及以上级别
2. **提供有用信息**: 在日志消息中包含足够的上下文信息
3. **监控队列状态**: 定期检查队列大小，避免积压
4. **测试网络连通**: 部署前测试到主系统的网络连通性 