diff --git a/docs/integration_guide.md b/docs/integration_guide.md index 2ec8fd8..9ae5948 100644 --- a/docs/integration_guide.md +++ b/docs/integration_guide.md @@ -636,23 +636,21 @@ jobs: | `CreateContainerConfigError` | 容器配置错误 | | `RunContainerError` | 容器启动失败 | -### 接入方式:添加 Pod label 映射 +### 接入方式:自动映射 -K8s Monitor CronJob 已在集群中运行,每 5 分钟扫描一次。新项目接入只需在 `k8s-monitor/monitor.py` 的 `APP_TO_PROJECT` 字典中添加映射: +K8s Monitor CronJob 已在集群中运行,每 5 分钟扫描一次。Monitor 启动时会从 Log Center API(`GET /api/v1/projects`)动态拉取项目列表,自动生成 app label -> project_id 的映射。 -```python -# k8s-monitor/monitor.py -APP_TO_PROJECT = { - "rtc-backend": "rtc_backend", # Pod 的 app label -> project_id - "rtc-backend-dev": "rtc_backend", - "rtc-web": "rtc_web", - "rtc-web-dev": "rtc_web", - "log-center-api": "log_center_api", - "log-center-web": "log_center_web", - # 新项目在此添加映射 - "your-app": "your_project_id", -} -``` +**映射规则**:`project_id` 中的下划线替换为短横线作为 app label,同时生成 `-dev` 后缀变体。 + +| project_id | 自动生成的 app label | +|---|---| +| `rtc_backend` | `rtc-backend`, `rtc-backend-dev` | +| `rtc_web` | `rtc-web`, `rtc-web-dev` | +| `log_center_api` | `log-center-api`, `log-center-api-dev` | + +**新项目接入 K8s 监控只需两步**: +1. 在步骤 1 中完成项目注册(确保项目出现在 Log Center 项目列表中) +2. K8s Deployment 的 `app` label 使用 `project_id` 的短横线形式 确保你的 K8s Deployment 有 `app` label: diff --git a/k8s-monitor/monitor.py b/k8s-monitor/monitor.py index 4e13a43..6454fa2 100644 --- a/k8s-monitor/monitor.py +++ b/k8s-monitor/monitor.py @@ -22,19 +22,38 @@ ABNORMAL_STATES = { "RunContainerError", } -# Pod label app -> project_id 映射 -APP_TO_PROJECT = { - "rtc-backend": "rtc_backend", - "rtc-backend-dev": "rtc_backend", - "rtc-web": "rtc_web", - "rtc-web-dev": "rtc_web", - "log-center-api": "log_center", - "log-center-web": "log_center", -} - logging.basicConfig(level=logging.INFO, format="%(asctime)s [%(levelname)s] %(message)s") logger = logging.getLogger(__name__) +# 动态映射表,启动时从 API 加载 +APP_TO_PROJECT: dict[str, str] = {} + + +def load_project_mapping(): + """从 Log Center API 拉取项目列表,自动生成 app label -> project_id 映射。 + + 映射规则:project_id 中的下划线替换为短横线作为 app label, + 同时生成 -dev 后缀的变体用于开发环境。 + 例如 project_id="rtc_backend" -> app labels: "rtc-backend", "rtc-backend-dev" + """ + try: + resp = requests.get(f"{LOG_CENTER_URL}/api/v1/projects", timeout=10) + resp.raise_for_status() + projects = resp.json().get("projects", []) + + mapping = {} + for project in projects: + pid = project["project_id"] + # project_id 下划线转短横线作为 app label + app_label = pid.replace("_", "-") + mapping[app_label] = pid + mapping[f"{app_label}-dev"] = pid + + APP_TO_PROJECT.update(mapping) + logger.info(f"从 API 加载了 {len(projects)} 个项目,生成 {len(mapping)} 条映射") + except Exception as e: + logger.warning(f"从 API 加载项目映射失败: {e},将使用 app label 原值作为 project_id") + def get_project_id(pod_labels: dict) -> str: app_name = pod_labels.get("app", "unknown") @@ -132,6 +151,9 @@ def report_error(error: dict, logs: str): def main(): + # 从 Log Center API 动态加载项目映射 + load_project_mapping() + try: config.load_incluster_config() except config.ConfigException: