# Health Check 测试说明

## 测试文件说明

### 1. API 测试 (`healthcheck_test.go`)

测试 Health Check 的 CRUD API 接口。

```bash
# 运行短测试（不使用外部依赖）
go test -short ./pkg/api/healthcheck/...

# 运行完整的集成测试（需要 Docker 和数据库）
go test -v ./pkg/api/healthcheck/...
```

### 2. Job 测试 (`job_test.go`)

测试 Health Check Job 的执行逻辑。

```bash
# 运行短测试
go test -short ./pkg/task_manager/task/healthcheck/...

# 运行完整的集成测试
go test -v ./pkg/task_manager/task/healthcheck/...
```

### 3. 外部 Endpoint 集成测试 (`endpoint_integration_test.go`)

直接测试 `http://jumpserver-alb-ec2-1371391278.us-west-2.elb.amazonaws.com:81/healthcheck/sql` 接口。

```bash
# 使用 integration tag 运行集成测试
go test -tags=integration -v ./pkg/task_manager/task/healthcheck/... -run TestIntegrationHealthCheckEndpoint

# 测试不同的参数变体
go test -tags=integration -v ./pkg/task_manager/task/healthcheck/... -run TestIntegrationHealthCheckEndpointVariations
```

### 4. Scanner 测试 (`scanner_test.go`)

测试 Health Check Scanner 的扫描逻辑。

```bash
go test -short ./pkg/task_manager/task/healthcheck/...
```

## 命令行测试工具

位于 `tools/healthcheck_tester/main.go`。

**注意：此工具必须使用 `-o11y` 参数启用 ClusterURLsResolver 来获取集群 URLs，不再支持手动拼接 URLs。**

### 使用方法

```bash
# 使用 ClusterURLsResolver 获取 URLs（推荐）
go run tools/healthcheck_tester/main.go \
  -o11y \
  -o11y-endpoint="https://o11y-endpoint" \
  -o11y-client-id="your-client-id" \
  -o11y-secret="your-secret" \
  -cluster-id="your-cluster-id" \
  -v

# 查看详细请求和响应
go run tools/healthcheck_tester/main.go -o11y -o11y-endpoint="..." -v

# 测试 serverless 集群
go run tools/healthcheck_tester/main.go \
  -o11y \
  -o11y-endpoint="https://o11y-endpoint" \
  -cluster-id="your-serverless-cluster" \
  -deploy-type="serverless" \
  -v
```

### 参数说明

| 参数 | 说明 | 默认值 |
|------|------|--------|
| `-endpoint` | Health check 接口地址 | `http://jumpserver-alb-ec2-1371391278.us-west-2.elb.amazonaws.com:81/healthcheck/sql` |
| `-cluster-id` | 集群 ID | `1379661944646413035` |
| `-report-id` | 报告 ID（留空则自动生成） | 自动生成 UUID |
| `-deploy-type` | 部署类型 (dedicated/premium/ng-host) | `dedicated` |
| `-project-id` | 项目 ID | `1372813089454526833` |
| `-provider` | 云服务提供商 | `aws` |
| `-region` | 区域 | `us-west-2` |
| `-tenant-id` | 租户 ID | `1372813089209213994` |
| `-topn` | Top N 值 | `3` |
| `-v` | 显示详细输出 | `false` |
| `-o11y` | 启用 o11y client 使用 ClusterURLsResolver | `false` |
| `-o11y-endpoint` | O11y endpoint（启用 o11y 时必填） | `""` |
| `-o11y-client-id` | O11y client ID | `""` |
| `-o11y-secret` | O11y client secret | `""` |

## curl 示例

```bash
# 直接使用 curl 测试
curl -s -X POST \
  "http://jumpserver-alb-ec2-1371391278.us-west-2.elb.amazonaws.com:81/healthcheck/sql" \
  -w "\nHTTP Status: %{http_code}\n" \
  -H "Content-Type: application/json" \
  -d '{
      "clusterId": "1379661944646413035",
      "reportId": "12343",
      "deployType": "dedicated",
      "projectId": "1372813089454526833",
      "provider": "aws",
      "region": "us-west-2",
      "tenantId": "1372813089209213994",
      "timeRangeA": {
        "start": "2025-11-12T02:57:33Z",
        "end": "2025-11-13T02:57:33Z"
      },
      "timeRangeB": {
        "start": "2025-11-12T02:57:33Z",
        "end": "2025-11-13T02:57:33Z"
      },
      "clusterUrls": {
        "clusterMetricsUrl": "https://www.ds.us-west-2.aws.observability.tidbcloud.com/internal/metrics/035cc75b-4ecb-41c9-9fca-adba50adb2f9/api/v1/",
        "dataPlaneMetricsUrl": "https://www.ds.us-west-2.aws.observability.tidbcloud.com/internal/metrics/ef59de6c-c00b-4238-a975-38cc24bf0699/api/v1/",
        "slowQueryS3Url": "s3://o11y-prod-shared-us-west-2/deltalake/1372813089209213994/035cc75b-4ecb-41c9-9fca-adba50adb2f9/slowlogs"
      },
      "topN": 3,
      "digestDiffKeys": [
        "slowQueryCountDiff"
      ]
    }'
```

## 注意事项

1. **网络访问**: 测试外部 endpoint 需要能够访问 jumpserver 地址
2. **超时设置**: 默认超时为 30-60 秒，可根据网络情况调整
3. **响应保存**: 成功的响应会自动保存到 `healthcheck_response_{reportId}.json` 文件
4. **S3 结果**: 巡检结果会保存到 `s3://delicated-healthcheck/healthcheck-report/{clusterId}_{reportId}_{name}.json`

## S3 报告内容获取

当调用 **Get Health Check Result** API (`GET /compute-engine/{oid}/{cid}/healthcheck/result/{uuid}`) 时：

- 如果巡检状态为 `success` 且 `reportId` 不为空，系统会直接返回 S3 上的原始报告内容
- 返回的是 S3 文件的原始 JSON 内容，不是包装后的结构
- S3 路径格式：`healthcheck-report/{clusterId}_{reportId}_{name}.json`
- Bucket 名称：`delicated-healthcheck`

### 示例响应

```json
{
  "sqlCheckResults": [
    {
      "digest": "abc123",
      "slowQueryCountDiff": 10
    }
  ]
}
```

### 错误情况

- 如果巡检状态不是 `success`，返回 `400 Bad Request`
- 如果 `reportId` 为空，返回 `404 Not Found`
- 如果 S3 读取失败（如配置错误或报告不存在），返回 `500 Internal Server Error`

## ClusterURLsResolver 集成

代码已集成 `pkg/o11y/urls/urls.go` 中的 `ClusterURLsResolver` 来获取集群 URLs：

### 使用方法

```go
// 在 task_manager main.go 中初始化
import (
    "github.com/pingcap-inc/clinic/pkg/o11y"
    "github.com/pingcap-inc/clinic/pkg/task_manager/task/healthcheck"
)

if cfg.EnableO11yCanary {
    o11yCli, err := o11y.New(...)
    healthCheckScanner := healthcheck.NewScannerService(
        healthcheck.WithO11yClient(o11yCli),
    )
}
```

### URL 解析流程

1. 如果 `ClusterURLsResolver` 可用且启用，使用其 `Resolve()` 方法获取真实的集群 URLs
2. 如果 `ClusterURLsResolver` 不可用或解析失败，回退到手动构造的 URL 格式
3. 手动构造的 URL 格式与 `ClusterURLsResolver` 生成的格式一致

### 支持的部署类型

- **Dedicated**: 标准专用集群
- **Premium**: 高级版集群（使用 multitenant 路径）
- **NG-Host**: NextGen 托管集群

### 命令行工具 URL 配置

```bash
# 使用自动生成的 URLs（ClusterURLsResolver 风格）
go run tools/healthcheck_tester/main.go -use-resolver

# 手动指定 URLs
go run tools/healthcheck_tester/main.go \
  -cluster-metrics-url="https://..." \
  -dataplane-metrics-url="https://..." \
  -slowquery-s3-url="s3://..."
