# RWA Infrastructure - 可观测性与服务治理

可插拔的基础设施组件，支持按需启用，不影响现有微服务代码。

## 架构概览

```
                     ┌─────────────────────────────────────────────────────┐
                     │                    Grafana                          │
                     │          (统一可视化仪表盘 :3030)                     │
                     └───────┬─────────────┬─────────────┬─────────────────┘
                             │             │             │
              ┌──────────────▼──┐  ┌───────▼───────┐  ┌──▼──────────────┐
              │   Prometheus    │  │     Loki      │  │     Jaeger      │
              │   (指标 :9090)   │  │  (日志 :3100)  │  │  (追踪 :16686)  │
              └────────┬────────┘  └───────┬───────┘  └────────┬────────┘
                       │                   │                    │
                       │            ┌──────▼───────┐            │
                       │            │   Promtail   │            │
                       │            │  (日志收集)   │            │
                       │            └──────┬───────┘            │
                       │                   │                    │
    ┌──────────────────▼───────────────────▼────────────────────▼────────┐
    │                                                                     │
    │                         RWA 微服务集群                               │
    │   ┌──────────┐ ┌──────────┐ ┌──────────┐ ┌──────────┐ ┌──────────┐ │
    │   │ identity │ │  wallet  │ │   mpc    │ │  reward  │ │ presence │ │
    │   └──────────┘ └──────────┘ └──────────┘ └──────────┘ └──────────┘ │
    │                              ...                                    │
    └─────────────────────────────────┬───────────────────────────────────┘
                                      │
                             ┌────────▼────────┐
                             │     Consul      │
                             │ (服务发现 :8500) │
                             └─────────────────┘
```

## 快速开始

### 1. 启动所有组件

```bash
cd infrastructure
./deploy.sh up
```

### 2. 按需启动

```bash
# 只启动服务发现
./deploy.sh up consul

# 启动日志系统
./deploy.sh up loki grafana

# 启动追踪系统
./deploy.sh up jaeger grafana

# 启动监控系统
./deploy.sh up prometheus grafana
```

### 3. 访问地址

| 服务 | 地址 | 用途 |
|------|------|------|
| Consul | http://localhost:8500 | 服务发现 & 配置中心 |
| Jaeger | http://localhost:16686 | 链路追踪 UI |
| Grafana | http://localhost:3030 | 统一仪表盘 |
| Prometheus | http://localhost:9090 | 指标查询 |
| Loki | http://localhost:3100 | 日志 API |
| **Sentry** | http://localhost:9000 | **崩溃收集 & 错误追踪** |

## 组件说明

### Consul - 服务发现与配置中心

**功能：**
- 服务注册与发现
- 健康检查
- KV 配置存储
- 多数据中心支持

**配置文件：**
- `consul/config/services.json` - 服务注册定义
- `consul/config/kv-defaults.json` - 默认 KV 配置

**使用示例：**
```bash
# 查看已注册服务
curl http://localhost:8500/v1/catalog/services

# 读取配置
curl http://localhost:8500/v1/kv/rwa/config/global/log_level?raw

# 更新配置
curl -X PUT -d 'debug' http://localhost:8500/v1/kv/rwa/config/global/log_level
```

### Jaeger - 分布式链路追踪

**功能：**
- 请求链路追踪
- 性能瓶颈分析
- 服务依赖可视化
- 错误定位

**接入方式（NestJS）：**
```typescript
// 安装依赖
npm install @opentelemetry/sdk-node @opentelemetry/exporter-jaeger

// 在 main.ts 中初始化
import { NodeSDK } from '@opentelemetry/sdk-node';
import { JaegerExporter } from '@opentelemetry/exporter-jaeger';

const sdk = new NodeSDK({
  traceExporter: new JaegerExporter({
    endpoint: 'http://jaeger:14268/api/traces',
  }),
  serviceName: 'identity-service',
});
sdk.start();
```

### Loki + Promtail - 日志聚合

**功能：**
- 自动收集 Docker 容器日志
- 日志标签化与索引
- LogQL 查询
- 与 Grafana 深度集成

**日志查询示例（Grafana）：**
```logql
# 查看所有错误日志
{job="rwa-backend"} |~ "error|Error|ERROR"

# 按服务筛选
{service="identity-service"} | json | level="error"

# 查看特定 trace
{trace_id="abc123"}
```

### Prometheus - 指标监控

**功能：**
- 指标收集
- 告警规则
- PromQL 查询

**告警规则：**
- `prometheus/rules/rwa-alerts.yml` - 预定义告警规则

### Grafana - 统一可视化

**预置仪表盘：**
- RWA Services Overview - 服务概览
- Kong Dashboard - API 网关监控
- Presence Dashboard - 用户在线状态

**数据源：**
- Prometheus (指标)
- Loki (日志)
- Jaeger (追踪)

### Sentry - 崩溃收集与错误追踪 (独立部署)

**功能：**
- 崩溃收集 (Flutter + Android/iOS 原生层)
- 错误追踪与堆栈符号化
- 设备兼容性分析
- 性能监控
- Session Replay

**部署方式：**

Sentry 是独立部署的服务，位于 `sentry/` 目录:

```bash
cd sentry

# 首次安装 (创建管理员账号)
./deploy.sh init

# 启动服务
./deploy.sh up
```

**系统要求：**
- 最低 4GB 内存，推荐 8GB+
- 约 20GB 磁盘空间

详细文档请参考: [sentry/README.md](sentry/README.md)

## 目录结构

```
infrastructure/
├── docker-compose.yml          # 主编排文件
├── deploy.sh                   # 部署脚本
├── .env.example                # 环境变量模板
├── README.md                   # 本文档
│
├── consul/
│   └── config/
│       ├── services.json       # 服务注册
│       └── kv-defaults.json    # KV 默认配置
│
├── jaeger/                     # Jaeger 配置 (使用默认)
│
├── loki/
│   ├── loki-config.yml         # Loki 配置
│   └── promtail-config.yml     # Promtail 配置
│
├── prometheus/
│   ├── prometheus.yml          # Prometheus 配置
│   └── rules/
│       └── rwa-alerts.yml      # 告警规则
│
├── grafana/
│   └── provisioning/
│       ├── datasources/
│       │   └── datasources.yml # 数据源配置
│       └── dashboards/
│           ├── dashboards.yml  # 仪表盘配置
│           └── rwa-services-overview.json
│
└── sentry/                     # 崩溃收集 (独立部署)
    ├── docker-compose.yml      # Sentry 编排
    ├── deploy.sh               # 部署脚本
    ├── sentry.conf.py          # Sentry 配置
    └── README.md               # 详细文档
```

## 常用命令

```bash
# 启动
./deploy.sh up                    # 启动所有
./deploy.sh up consul jaeger      # 启动指定组件

# 管理
./deploy.sh status                # 查看状态
./deploy.sh health                # 健康检查
./deploy.sh logs grafana          # 查看日志
./deploy.sh restart               # 重启

# 停止
./deploy.sh down                  # 停止所有
```

## 与现有服务集成

这些组件是**完全可选的**，不需要修改现有微服务代码即可获得以下能力：

| 能力 | 无需改代码 | 需要少量改动 |
|------|-----------|-------------|
| 服务健康监控 | ✅ Consul 健康检查 | - |
| 日志聚合 | ✅ Docker 日志自动收集 | - |
| 基础指标 | ✅ Kong Prometheus 插件 | - |
| 详细指标 | - | 添加 Prometheus 中间件 |
| 链路追踪 | - | 添加 OpenTelemetry SDK |
| 动态配置 | - | 集成 Consul KV |
| **崩溃收集** | - | **集成 sentry_flutter SDK** |

## 扩展配置

### 添加告警通知

编辑 `prometheus/prometheus.yml`，配置 Alertmanager：

```yaml
alerting:
  alertmanagers:
    - static_configs:
        - targets: ['alertmanager:9093']
```

### 添加更多服务到 Consul

编辑 `consul/config/services.json`，添加新服务定义。

### 自定义 Grafana 仪表盘

将 JSON 文件放入 `grafana/provisioning/dashboards/` 目录即可自动加载。

## 生产环境建议

1. **持久化存储**：当前使用 Docker volumes，生产环境建议使用外部存储
2. **高可用**：Consul 建议 3-5 节点集群
3. **安全**：配置 TLS 和访问控制
4. **资源限制**：添加 Docker 资源限制配置
