# pg_flight_simulator
**Repository Path**: shenyuflying/pg_flight_simulator
## Basic Information
- **Project Name**: pg_flight_simulator
- **Description**: postgresql flight simulator
- **Primary Language**: Unknown
- **License**: Not specified
- **Default Branch**: master
- **Homepage**: None
- **GVP Project**: No
## Statistics
- **Stars**: 3
- **Forks**: 5
- **Created**: 2025-12-19
- **Last Updated**: 2026-01-26
## Categories & Tags
**Categories**: Uncategorized
**Tags**: None
## README
# PostgreSQL 飞行模拟器
## 项目概述
PostgreSQL 飞行模拟器是一个基于 Flask 的交互式 Web 应用程序,旨在帮助用户通过模拟真实的 PostgreSQL 数据库环境,学习和实践数据库故障诊断、性能优化和日常运维技能。该模拟器提供了多种预定义场景,模拟数据库常见问题(如配置不匹配、连接限制、缺少索引、表膨胀等),用户可以在安全的环境中练习故障排查和解决方法。




## 核心功能
### 1. 交互式终端模拟
- 提供逼真的 PostgreSQL 命令行界面
- 支持常用的 psql 命令(如 SELECT、EXPLAIN、VACUUM 等)
- 模拟数据库响应和错误信息
### 2. 多场景支持
- 预定义多种数据库故障和性能问题场景
- 支持动态切换和重置场景
- 可扩展的场景配置系统
### 3. 智能评估系统
- 对用户的操作和解决方案进行实时评估
- 提供详细的评分和反馈
- 支持获取提示和建议
### 4. 监控指标追踪
- 实时监控用户操作历史和命令执行情况
- 提供16个核心监控指标(CPU使用率、内存使用率、磁盘空间、网络流量、TPS、QPS、平均响应时间、活动会话数、当前连接数、空闲事务数、慢查询数、锁等待数、长事务数、WAL速率、复制延迟、缓存命中率)
- 支持查看详细的执行日志
### 5. Token使用统计
- 实时统计大模型API交互的token使用情况
- 记录prompt_tokens、completion_tokens、total_tokens等指标
- 支持查看详细的文本内容和请求次数
- 提供重置统计数据功能
### 6. 活跃会话监控
- 模拟PostgreSQL的pg_stat_activity视图
- 展示数据库活跃会话的详细信息(PID、用户名、状态、查询等)
- 支持会话数据的刷新和过滤
- 提供会话历史记录功能
### 7. 灵活的配置选项
- 支持自定义大模型 API 配置
- 可调整终端和上下文参数
- 支持多种大模型提供商
- 支持在Web界面动态配置模型名称
## 环境要求
- Python 3.7 及以上版本
- pip 包管理器
- 网络连接(用于访问大模型 API)
## 安装步骤
### 1. 克隆项目
```bash
git clone <项目仓库地址>
cd pg_flight_simulator2
```
### 2. 安装依赖
```bash
pip install -r requirements.txt
```
### 3. 启动应用
```bash
python app.py
```
应用将在 `http://localhost:5000` 上启动。
## 详细使用指南
### 1. 访问应用
在浏览器中打开 `http://localhost:5000`,您将看到应用的主界面。
### 2. 选择场景
1. 配置大模型API参数
2. 在界面左侧的场景列表中选择一个场景
3. 点击"开始演练"按钮
### 3. 执行命令
在终端模拟器中输入PostgreSQL命令,例如:
```sql
SELECT * FROM employees WHERE department_id = 10;
EXPLAIN ANALYZE SELECT * FROM orders WHERE order_date > '2023-01-01';
VACUUM ANALYZE customers;
```
### 4. 获取提示
如果您遇到困难,可以点击"获取提示"按钮,系统会提供相关的解决建议。
### 5. 评估演练
完成故障排查后,点击"评估演练"按钮,系统会对您的表现进行评分并提供详细反馈。
### 6. 重置场景
点击"重置场景"按钮可以重新开始当前场景或切换到其他场景。
## 配置说明
### 1. 主要配置文件
项目的主要配置文件是 `config.py`,包含以下配置项:
```python
# SiliconFlow大模型API配置
OPENAI_API_KEY = "your-siliconflow-api-key-here" # 大模型API密钥
OPENAI_BASE_URL = "https://api.siliconflow.cn/v1" # 大模型API基础URL
# 终端模拟器配置
TERMINAL_PROMPT = "$ " # 终端提示符
DEFAULT_CONTEXT_SIZE = 100 # 默认上下文保留的命令数
# 项目配置
DEBUG = True # 调试模式
PORT = 5000 # 服务端口
```
**注意:** 模型名称(MODEL_NAME)不再在配置文件中设置,而是通过Web界面动态输入,以支持灵活切换不同的大模型。
### 2. Web界面配置
应用启动后,用户可以在Web界面中配置以下参数:
- **API密钥:** 大模型服务的API密钥
- **API基础URL:** 大模型服务的API地址
- **模型名称:** 要使用的大模型名称(如 gpt-3.5-turbo、gpt-4 等)
这些配置会覆盖config.py中的默认值,并在会话中生效。
### 3. 场景配置
场景文件位于 `scenarios/` 目录下,每个场景是一个 Markdown 文件。
### 4. 自定义场景
您可以通过创建新的 Markdown 文件来自定义场景:
1. 在 `scenarios/` 目录下创建新的 `.md` 文件
2. 模仿missing_index.md的内容编写场景内容
3. 重启应用后,新场景将自动加载到场景列表中
您也可以使用大模型+提示词来定义新场景,可以参考如下提示词:
1. 以missing_index.md作为标准模板进行创建,确保格式和所要包含的内容结构保持一致
2. 故障场景难度设定为简单级别,定位步骤控制在3步以内,恢复步骤控制在2步以内,故障原理需简洁易懂,可通过基础数据库知识解释
3. 每个故障场景必须能够通过已支持的16个监控指标清晰反映出故障定位前后的变化,需明确指出关键指标及其变化趋势
4. 所有场景仅包含数据库侧的定位方法和恢复措施,不得涉及任何业务侧的调整或恢复操作,符合纯数据库演练的性质
5. 确保场景具备可重复性和可操作性,能够在标准测试环境中稳定复现
## 核心模块说明
### 1. app.py
主应用程序入口,负责处理 HTTP 请求和路由管理。
### 2. scenario_manager.py
场景管理器,负责加载、解析和管理所有预定义场景。
### 3. context_manager.py
上下文管理器,维护用户会话状态和命令执行上下文。
### 4. monitoring_manager.py
监控管理器,记录和分析用户操作历史和演练数据,提供16个核心监控指标。
### 5. terminal_simulator.py
终端模拟器,模拟 PostgreSQL 命令行环境和响应。
### 6. token_counter.py
Token计数器,用于统计大模型API交互过程中的token使用情况,包括prompt_tokens、completion_tokens、total_tokens等。
### 7. token_stats_api.py
Token统计API模块,提供RESTful API接口用于获取和重置token统计数据。
### 8. pg_stat_activity.py
PostgreSQL活跃会话管理模块,模拟pg_stat_activity视图功能,生成和管理数据库活跃会话数据。
### 9. blueprints/token_stats.py
Flask蓝图,用于注册token统计相关的API路由。
## 数据结构架构图
### 1. 整体数据流架构
```mermaid
graph TB
subgraph "前端界面"
A[用户界面]
end
subgraph "Flask应用层"
B[app.py
路由处理]
C[token_stats_api.py
Token统计API]
end
subgraph "业务逻辑层"
D[ContextManager
上下文管理]
E[ScenarioManager
场景管理]
F[MonitoringManager
监控管理]
G[TerminalSimulator
终端模拟]
end
subgraph "数据统计层"
H[TokenCounter
Token计数]
I[PGStatActivity
活跃会话]
end
subgraph "外部服务"
J[大模型API]
end
A --> B
B --> C
B --> D
B --> E
B --> F
B --> G
D --> G
D --> F
E --> D
F --> J
G --> J
G --> H
F --> H
C --> H
I --> F
```
### 2. ContextManager数据结构
```mermaid
classDiagram
class ContextManager {
- dict user_contexts
+ get_user_context(user_id)
+ set_scenario(user_id, scenario_id, prompt, api_config)
+ set_scenarios(user_id, scenario_ids, prompts, api_config)
+ execute_command(user_id, command)
+ reset_context(user_id, api_config)
+ evaluate_drill(user_id)
+ get_hint(user_id)
}
class UserContext {
+ str scenario_id
+ str scenario_prompt
+ TerminalSimulator terminal
+ dict api_config
}
class TerminalSimulator {
- OpenAI client
- list context_history
- str scenario_context
- str model_name
- bool api_config_valid
+ execute_command(command)
+ _build_context(command)
+ _update_context(command, output)
}
ContextManager "1" --> "*" UserContext : manages
UserContext "1" --> "1" TerminalSimulator : contains
```
### 3. MonitoringManager数据结构
```mermaid
classDiagram
class MonitoringManager {
- str api_key
- str base_url
- str model_name
- OpenAI client
- dict user_contexts
- dict current_metrics
+ set_model_api_config(api_key, base_url, model_name)
+ set_scenario_context(user_id, scenario_info)
+ add_command_history(user_id, command, response)
+ get_monitoring_metrics(user_id)
+ _fetch_metrics_from_model(scenario_info, command_history)
}
class UserContext {
- dict scenario_info
- list command_history
- float last_updated
}
class CommandHistory {
- str command
- str response
- float timestamp
}
class Metrics {
- float cpuUsage
- float memoryUsage
- float diskSpace
- float networkTraffic
- float tps
- float qps
- float avgResponseTime
- int activeSessions
- int currentConnections
- int idleTransactions
- int slowQueries
- int lockWaits
- int longTransactions
- float walRate
- float replicationDelay
- float cacheHitRatio
}
MonitoringManager "1" --> "*" UserContext : manages
UserContext "1" --> "*" CommandHistory : contains
MonitoringManager "1" --> "1" Metrics : tracks
```
### 4. TokenCounter数据结构
```mermaid
classDiagram
class TokenCounter {
- int prompt_tokens
- int completion_tokens
- int total_tokens
- int request_count
- list prompt_texts
- list completion_texts
- list total_texts
+ reset_counts()
+ update_counts(response, prompt_text, completion_text)
+ get_stats()
+ get_summary()
+ get_texts(type)
}
class TextPair {
- str prompt
- str completion
}
class TokenStats {
- int prompt_tokens
- int completion_tokens
- int total_tokens
- int request_count
}
TokenCounter "1" --> "*" TextPair : stores
TokenCounter "1" --> "1" TokenStats : provides
```
### 5. PGStatActivity数据结构
```mermaid
classDiagram
class PGStatActivity {
- list sessions
- list session_history
+ generate_random_session(session_id)
+ generate_sample_sessions(count)
+ get_sessions(filter_by)
+ refresh_sessions()
+ to_json(sessions)
}
class Session {
- int pid
- str usename
- str application_name
- str client_addr
- str xact_start
- str query_start
- float elapsed
- str wait_event_type
- str wait_event
- str state
- str query
- str backend_type
}
PGStatActivity "1" --> "*" Session : manages
```
### 6. ScenarioManager数据结构
```mermaid
classDiagram
class ScenarioManager {
- str scenarios_dir
- list scenarios
+ _load_scenarios()
+ _parse_scenario_file(file_path)
+ get_all_scenarios()
+ get_scenario_by_id(scenario_id)
+ reload_scenarios()
}
class Scenario {
- str id
- str name
- str description
- str prompt_template
- str file_path
}
ScenarioManager "1" --> "*" Scenario : manages
```
### 7. 模块间交互关系
```mermaid
graph LR
subgraph "用户请求"
A[HTTP请求]
end
subgraph "路由层"
B[app.py]
end
subgraph "业务层"
C[ContextManager]
D[MonitoringManager]
E[ScenarioManager]
end
subgraph "工具层"
F[TerminalSimulator]
G[TokenCounter]
H[PGStatActivity]
end
subgraph "外部API"
I[大模型API]
end
A --> B
B --> C
B --> D
B --> E
C --> E
C --> F
D --> G
D --> H
F --> I
D --> I
F -.-> G
D -.-> G
```
## 预定义场景
项目提供了以下预定义场景:
### 1. 配置不匹配 (configuration_mismatch)
模拟数据库配置参数不匹配导致的性能问题。
### 2. 连接限制 (connection_limit)
模拟数据库连接数达到上限导致的连接失败问题。
### 3. 缺少索引 (missing_index)
模拟因缺少适当索引导致的查询性能低下问题。
### 4. 表膨胀 (table_bloat)
模拟表和索引膨胀导致的存储空间浪费和性能下降问题。
## 常见问题解答 (FAQ)
### 1. 应用启动失败,提示缺少模块
**问题:** 启动应用时出现 `ModuleNotFoundError: No module named 'flask'` 或类似错误。
**解决方法:** 确保已正确安装所有依赖:
```bash
pip install -r requirements.txt
```
### 2. 执行命令无响应
**问题:** 在终端输入命令后没有响应。
**解决方法:**
- 检查大模型 API 密钥是否正确配置
- 确保网络连接正常
- 检查浏览器控制台是否有错误信息
### 4. 如何添加自定义场景?
**解决方法:**
- 在 `scenarios/` 目录下创建新的 Markdown 文件
- 按照预定义场景的格式编写内容
- 重启应用后,新场景将自动加载
### 5. 支持哪些大模型提供商?
**答案:** 理论上支持所有兼容 OpenAI API 格式的大模型提供商,包括但不限于:
- SiliconFlow
- OpenAI
## 开发说明
### 代码结构
```
pg_flight_simulator2/
├── blueprints/ # Flask蓝图目录
│ └── token_stats.py # Token统计API蓝图
├── scenarios/ # 场景配置文件目录
│ ├── configuration_mismatch.md
│ ├── connection_limit.md
│ ├── missing_index.md
│ └── table_bloat.md
├── static/ # 静态资源文件
│ ├── css/ # CSS样式文件
│ │ ├── base.css
│ │ ├── buttons.css
│ │ ├── forms.css
│ │ ├── header.css
│ │ ├── layout.css
│ │ ├── monitoring.css
│ │ ├── panel.css
│ │ ├── responsive.css
│ │ ├── scenarios.css
│ │ ├── sessions.css
│ │ ├── terminal.css
│ │ └── variables.css
│ └── js/ # JavaScript文件
│ ├── apiConfig.js
│ ├── buttons.js
│ ├── command.js
│ ├── config.js
│ ├── drill.js
│ ├── monitoring.js
│ ├── pg_stat_activity.js
│ ├── scenarios.js
│ ├── test_api_connection.js
│ ├── tokenStats.js
│ └── utils.js
├── templates/ # HTML模板文件
│ └── index.html
├── app.py # 主应用程序
├── config.py # 配置文件
├── context_manager.py # 上下文管理
├── monitoring_manager.py # 监控管理
├── scenario_manager.py # 场景管理
├── terminal_simulator.py # 终端模拟
├── token_counter.py # Token计数器
├── token_stats_api.py # Token统计API
├── pg_stat_activity.py # 活跃会话管理
├── requirements.txt # 依赖列表
├── README.md # 项目文档
└── TODO.md # 待办事项
```
## 贡献指南
我们欢迎社区贡献,包括但不限于:
1. 修复 bug 和优化性能
2. 添加新的场景和功能
3. 改进文档和用户界面
4. 提供使用案例和教程
### 贡献步骤
1. Fork 项目仓库
2. 创建新的特性分支
3. 提交代码变更
4. 运行测试确保没有问题
5. 创建 Pull Request
---
感谢您使用 PostgreSQL 飞行模拟器!通过不断练习,您将成为一名更出色的 PostgreSQL 数据库管理员。