# Prometheus Docker 镜像配置

## 环境变量配置

### PROMETHEUS_BASE_PATH

设置 Prometheus 配置和数据的基础路径。

**默认值**: `/private/argus/metric/prometheus`

**用途**:
- 配置文件存储路径: `${PROMETHEUS_BASE_PATH}/prometheus.yml`
- 规则文件路径: `${PROMETHEUS_BASE_PATH}/rules/*.yml`
- 监控目标文件路径: `${PROMETHEUS_BASE_PATH}/targets/`

## 目录结构

容器启动后会在 `${PROMETHEUS_BASE_PATH}` 下创建以下目录结构：

```
${PROMETHEUS_BASE_PATH}/
├── prometheus.yml          # 主配置文件
├── rules/                  # 告警规则目录
│   └── *.yml
└── targets/                # 监控目标目录
    ├── node_exporter.json
    └── dcgm_exporter.json
```

## 动态配置

- **规则文件**: 在 `rules/` 目录下添加 `.yml` 文件即可自动加载
- **监控目标**: 修改 `targets/` 目录下的 JSON 文件即可动态更新监控目标
- **主配置**: 修改 `prometheus.yml` 后可通过 Prometheus 的 `/-/reload` 端点重新加载配置

## 权限管理

### 默认路径权限
- 默认路径 `/private/argus/metric/prometheus` 在 Dockerfile 中已设置正确的权限
- nobody 用户（UID: 2133, GID: 2015）拥有完全读写权限

### 自定义路径权限
- 当使用自定义 `PROMETHEUS_BASE_PATH` 时，启动脚本会自动创建目录并设置权限
- 确保 nobody 用户对自定义路径有读写权限

### 挂载卷注意事项
1. **主机目录权限**: 确保挂载的主机目录对 nobody 用户（UID: 2133）可写
2. **SELinux**: 如果使用 SELinux，可能需要设置适当的上下文
3. **Docker 用户映射**: 确保容器内的 nobody 用户与主机用户权限匹配

## 故障排除

### 权限问题
如果遇到权限错误，可以检查：
```bash
# 检查目录权限
ls -la /path/to/prometheus/data

# 检查用户映射
id nobody

# 手动修复权限
chown -R 2133:2015 /path/to/prometheus/data
chmod -R 755 /path/to/prometheus/data
```

## 动态 Targets 配置

### 配置流程

1. **节点资源清单**: `nodes.json` 包含所有监控节点的基本信息
   ```json
   [
     {
       "node_id": "A1",
       "user_id": "user01", 
       "ip": "1.2.3.4",
       "hostname": "dev-node-1",
       "labels": ["production", "us-west-1"]
     }
   ]
   ```

2. **Exporter 配置**: `exporter_config.json` 定义各类型 exporter 的端口和标签模板
   - 支持 dcgm (GPU监控) 和 node (系统监控) 两种类型
   - 配置端口映射和标签模板规则

3. **自动拆分生成**: `update_targets.py` 脚本根据节点清单自动生成对应的 targets 文件
   - 读取 `nodes.json` 获取节点信息
   - 按 exporter 类型拆分生成 `targets/*_exporter.json`
   - 应用标签模板，生成完整的监控目标配置

4. **热加载机制**: 
   - 脚本支持守护进程模式，定期检查 `nodes.json` 变化
   - 文件内容变化时自动重新生成 targets 配置
   - Prometheus 自动发现并重新加载新的监控目标

### 使用方式

```bash
# 单次更新（注意用户权限，此方法用于测试，但生成文件是 root 权限）
python3 update_targets.py --config nodes.json --targets-dir targets/

# 守护进程模式， 该进程托管于supervisor
python3 update_targets.py --daemon --check-interval 30
```

## 注意事项

1. 确保挂载的目录有适当的读写权限
2. 配置文件会在容器启动时自动生成，无需手动创建
3. 可以通过修改环境变量 `PROMETHEUS_BASE_PATH` 来改变所有相关路径，无需重新构建镜像
4. 自定义路径的目录会在启动时自动创建并设置权限
5. `nodes.json` 文件变化后，targets 配置会自动更新，无需手动干预
