# O11Y OLAP collector

独立的 Go 采集服务。它启动后会立即执行一次 O11Y OLAP 导出，随后在每个小时
的 05、15、25、35、45、55 分执行，下载 CSV 中的
`serverless_cluster_id`，并写入 TiDB。该目录不依赖 workspace 中的其他
package。

## 配置

将 `.env.example` 复制为未提交的 `.env`，并填入：

- `GITHUB_TOKEN`：用于 O11Y 认证的 GitHub PAT。
- `DB_DSN`：启用 TLS、连接到已存在 bootstrap 库的 MySQL/TiDB DSN（例如
  `/test`）；账号需要拥有 `CREATE DATABASE` 权限。
- `FEISHU_WEBHOOK`：失败告警的 Feishu 机器人 webhook；留空时仅记录日志。

程序不会自动加载 `.env`。本地运行时先导出变量：

```sh
set -a
. ./.env
set +a
```

O11Y 认证与 OLAP 地址、AWS provider/region、组织 ID、每小时 05/15/25/35/45/55
分定时调度和查询
窗口、1 分钟请求超时均固定在 `main.go`。

程序启动时会执行 `CREATE DATABASE IF NOT EXISTS manus`。数据库账号还需要能够
在 `manus` 库中创建和更新以下表：

```sql
CREATE TABLE manus.active_cluster_ids (
  cluster_id VARCHAR(255) NOT NULL,
  created_at DATETIME(6) NOT NULL,
  updated_at DATETIME(6) NOT NULL,
  update_count BIGINT UNSIGNED NOT NULL DEFAULT 1,
  PRIMARY KEY (cluster_id)
);

CREATE TABLE manus.active_cluster_task_runs (
  id BIGINT UNSIGNED NOT NULL AUTO_INCREMENT PRIMARY KEY,
  scheduled_at DATETIME(6) NOT NULL,
  started_at DATETIME(6) NOT NULL,
  finished_at DATETIME(6) NULL,
  status VARCHAR(16) NOT NULL,
  cluster_count INT UNSIGNED NOT NULL DEFAULT 0,
  error_message TEXT NULL
);
```

## 运行

```sh
go run .
```

启动后会立即采集一次，随后在每个小时的 05、15、25、35、45、55 分重复。
任一步失败会记录日志，并在配置
`FEISHU_WEBHOOK` 时发送告警；单次失败不会停止后续轮询。每次任务的计划、
开始和结束时间、执行状态、集群数量及错误信息均写入
`manus.active_cluster_task_runs`。若相邻两次任务开始时间相距至少 20 分钟，
将视为漏跑并发送 Feishu 告警。

`manus.active_cluster_ids.update_count` 用来统计 cluster 被写入表的累计次数：
首次插入时为 `1`，之后每次采集再次命中该 cluster 都会在 upsert 时自增 `1`。
程序启动时会自动执行兼容旧表结构的 `ALTER TABLE ... ADD COLUMN IF NOT EXISTS`
迁移。

## EC2 部署

推荐使用 `systemd` 管理进程，这样实例上只会有一个名为
`manus_active_cluster_monitor` 的服务，
并且进程退出后会自动拉起。

部署文件：

- `deploy/manus_active_cluster_monitor.service`
- `deploy/install.sh`

当前部署方式按如下目录和编译命令约定：

```sh
cd /home/yansu/manus_active_cluster_monitor
go build -o manus_active_cluster_monitor main.go
```

在 EC2 上执行：

```sh
cd /home/yansu/manus_active_cluster_monitor
sudo bash ./deploy/install.sh
```

安装脚本会：

- 使用当前目录作为 `WorkingDirectory`
- 按约定编译二进制 `manus_active_cluster_monitor`
- 使用当前目录下的 `.env` 作为 `systemd` 的 `EnvironmentFile`
- 安装并启用 `systemd` 服务 `manus_active_cluster_monitor.service`

首次安装后，先编辑环境变量文件：

```sh
vi /home/yansu/manus_active_cluster_monitor/.env
```

填好 `GITHUB_TOKEN`、`DB_DSN` 和可选的 `FEISHU_WEBHOOK` 后启动或重启：

```sh
sudo systemctl restart manus_active_cluster_monitor
sudo systemctl status manus_active_cluster_monitor --no-pager
```

查看日志：

```sh
sudo journalctl -u manus_active_cluster_monitor -f
```

## 安全

不要将 PAT、数据库密码、签名下载 URL 或 webhook 提交到仓库。生产环境应使用
Secret 管理服务；原始 API 文档中出现过的凭据应撤销并轮换。
