# Email Consumer Kafka 投递与日志验证实验手册

## 1. 实验目标

验证 `email-task` consumer 是否能正常消费 Kafka 消息，并在日志中打印消费内容。

本实验同时给出两种验证方式：

1. `kubectl logs` 直接查看 Pod 日志
2. Grafana + Loki 查看聚合日志

---

## 2. 实验前提

### 2.1 需要满足的运行状态

```bash
kubectl -n juwan get pods -l app=email-task
kubectl -n kafka get pods
kubectl -n monitoring get pods
```

预期：

- `email-task` 至少 1 个 Pod 为 `Running`
- Kafka 集群有可用 broker（如 `my-cluster-kafka-pool-0`）
- `loki/promtail/grafana` 为 `Running`（若需要 Loki 验证）

### 2.2 本次实验使用的关键配置

来自 `app/email/mq/etc/email.yaml`：

- Broker: `my-cluster-kafka-bootstrap.kafka.svc.cluster.local:9092`
- Topic: `email-task`
- Group: `email-consumer-group`

---

## 3. 实验步骤（详细）

## 步骤 1：确认 Topic 存在

### 目的

避免消息投递到不存在的 Topic，导致消费端无数据。

### 指令

```bash
kubectl -n kafka exec my-cluster-kafka-pool-0 -- \
  /opt/kafka/bin/kafka-topics.sh \
  --bootstrap-server my-cluster-kafka-bootstrap:9092 \
  --list
```

### 预期结果

输出中包含：

- `email-task`

---

## 步骤 2：投递一条最小测试消息（纯文本）

### 目的

先验证链路通路（producer -> kafka -> consumer）是否正常，不引入 JSON 转义复杂度。

### 指令

```bash
kubectl -n kafka exec my-cluster-kafka-pool-0 -- /bin/bash -lc \
"printf 'test-email-message\\n' | \
/opt/kafka/bin/kafka-console-producer.sh \
--bootstrap-server my-cluster-kafka-bootstrap:9092 \
--topic email-task"
```

### 预期结果

命令正常返回（通常无额外输出）。

---

## 步骤 3：查看 consumer 日志（kubectl 直查）

### 目的

确认 consumer 实际收到消息并执行日志打印。

### 指令（回看最近日志）

```bash
kubectl -n juwan logs -l app=email-task --tail=120
```

### 指令（实时追踪）

```bash
kubectl -n juwan logs -l app=email-task -f --since=10m
```

### 预期日志示例

```text
Consume get message key: , value: test-email-message
```

说明：

- key 为空是正常的（本次 producer 未设置 key）
- value 为投递内容，说明消费链路正常

---

## 步骤 4：投递业务消息（验证码 JSON）

### 目的

模拟真实业务 payload，验证 consumer 对业务消息格式的处理。

### 指令

```bash
kubectl -n kafka exec my-cluster-kafka-pool-0 -- /bin/bash -lc "cat <<'EOF' | \
/opt/kafka/bin/kafka-console-producer.sh \
--bootstrap-server my-cluster-kafka-bootstrap:9092 \
--topic email-task
{\"type\":\"verification_code\",\"email\":\"test@example.com\",\"code\":\"123456\",\"scene\":\"login\",\"expired_minutes\":5}
EOF"
```

### 预期结果

- producer 正常返回
- `email-task` 日志可看到包含 JSON 的消费日志

---

## 步骤 5：投递业务消息（活动通知 JSON）

### 目的

验证另一类业务消息（活动通知）通路。

### 指令

```bash
kubectl -n kafka exec my-cluster-kafka-pool-0 -- /bin/bash -lc "cat <<'EOF' | \
/opt/kafka/bin/kafka-console-producer.sh \
--bootstrap-server my-cluster-kafka-bootstrap:9092 \
--topic email-task
{\"type\":\"activity_notice\",\"email\":\"test@example.com\",\"title\":\"春季活动\",\"content\":\"满100减20\",\"activity_id\":\"A20260225\"}
EOF"
```

### 预期结果

- producer 正常返回
- consumer 日志出现活动消息内容

---

## 步骤 6：使用 Loki/Grafana 验证（可选）

### 目的

确认日志采集链路（Promtail -> Loki -> Grafana）正常，便于后续线上排查。

### 6.1 打开 Grafana

```bash
kubectl port-forward -n monitoring svc/grafana 3000:3000
```

浏览器：`http://localhost:3000`

### 6.2 在 Explore 中查询

使用 Loki 数据源，输入：

```logql
{job="kubernetes-pods", namespace="juwan", app="email-task"} |= "Consume get message"
```

若没有结果：

1. 把时间范围调大到 `Last 6 hours`/`Last 24 hours`
2. 放宽查询条件：

```logql
{job="kubernetes-pods", namespace="juwan", pod=~"email-task-.*"}
```

---

## 4. 一键复现实验命令（顺序执行）

```bash
# 1) 查看 topic
kubectl -n kafka exec my-cluster-kafka-pool-0 -- /opt/kafka/bin/kafka-topics.sh --bootstrap-server my-cluster-kafka-bootstrap:9092 --list

# 2) 发测试消息
kubectl -n kafka exec my-cluster-kafka-pool-0 -- /bin/bash -lc "printf 'test-email-message\\n' | /opt/kafka/bin/kafka-console-producer.sh --bootstrap-server my-cluster-kafka-bootstrap:9092 --topic email-task"

# 3) 看 consumer 日志
kubectl -n juwan logs -l app=email-task --tail=120
```

---

## 5. 常见问题与处理

### 问题 1：发消息命令报引号/EOF错误

现象：`unexpected EOF while looking for matching`。

原因：Shell 引号转义不正确。

处理：

- 先用纯文本消息验证链路
- JSON 使用 here-doc（`cat <<'EOF'`）方式，避免转义混乱

### 问题 2：发了消息但 consumer 无日志

排查顺序：

1. `email-task` 是否 Running
2. Topic 是否正确（`email-task`）
3. consumer group 是否一致（`email-consumer-group`）
4. 查看 Pod 实时日志（`-f`）
5. 若只看 Loki，请放大时间窗口并放宽标签条件

### 问题 3：Loki 查不到但 kubectl logs 能看到

说明业务正常，问题在日志采集查询链路：

- 检查 Promtail target 是否 ready
- 检查 Loki 查询标签/时间范围
- 参考 `docs/loki-log-troubleshooting.md`

---

## 6. 实验结论判定标准

满足以下任一即可判定消费链路可用：

1. `kubectl logs` 出现：`Consume get message ...`
2. Grafana Loki 查询出现对应消费日志

若两者都出现，说明：

- Kafka 投递正常
- Consumer 消费正常
- 日志采集与检索链路正常

---

## 7. 关联文档

- Loki 使用：`docs/loki-usage-guide.md`
- Loki 排错：`docs/loki-log-troubleshooting.md`
- Email 部署排错：`docs/email-task-deployment-troubleshooting.md`
