|
| 1 | +# Laravel OpenTelemetry Project - Cursor Rules |
| 2 | + |
| 3 | +这套 Cursor rule 适用于 Laravel OpenTelemetry 项目的所有编程任务,要求工程师以高级工程师的视角,严格按照流程执行任务,确保代码改动精准、高效,且不会引入问题或不必要的复杂性。 |
| 4 | + |
| 5 | +## 核心目标 |
| 6 | + |
| 7 | +确保代码改动精准、高效,且不会引入问题或不必要的复杂性,特别关注 OpenTelemetry 性能监控和 FrankenPHP Worker 模式的特殊需求。 |
| 8 | + |
| 9 | +## 规则的五个关键步骤 |
| 10 | + |
| 11 | +### 1. 明确任务范围 |
| 12 | +- 在写代码前,先分析任务,明确目标 |
| 13 | +- 制定清晰的计划,列出需要修改的函数、模块或组件,并说明原因 |
| 14 | +- 特别关注是否涉及 OpenTelemetry 追踪、FrankenPHP Worker 模式或内存管理 |
| 15 | +- 只有在计划清晰且经过深思熟虑后,才开始写代码 |
| 16 | + |
| 17 | +### 2. 精准定位代码修改点 |
| 18 | +- 确定需要修改的具体文件和代码行 |
| 19 | +- 避免无关文件的改动,若涉及多个文件,需明确说明每个文件的改动理由 |
| 20 | +- 除非任务明确要求,否则不创建新抽象或重构代码 |
| 21 | +- 特别注意 Watcher、Hook 和 Support 类的职责边界 |
| 22 | + |
| 23 | +### 3. 最小化、隔离化的代码改动 |
| 24 | +- 只编写任务直接所需的代码 |
| 25 | +- 避免添加不必要的日志、注释、测试、待办事项或错误处理 |
| 26 | +- 不要进行"顺手"的额外修改,确保新代码不干扰现有功能 |
| 27 | +- 特别注意不要破坏 OpenTelemetry 的 span 生命周期管理 |
| 28 | + |
| 29 | +### 4. 严格检查代码 |
| 30 | +- 检查代码的正确性、是否符合任务范围,以及是否会引发副作用 |
| 31 | +- 确保代码与现有代码风格一致,防止破坏已有功能 |
| 32 | +- 评估改动是否会影响下游系统 |
| 33 | +- 特别关注内存泄漏和性能影响 |
| 34 | + |
| 35 | +### 5. 清晰交付成果 |
| 36 | +- 总结改动的具体内容和原因 |
| 37 | +- 列出所有修改的文件及其具体变更 |
| 38 | +- 说明任何假设或潜在风险,供他人审查 |
| 39 | +- 特别说明对 OpenTelemetry 追踪和 FrankenPHP Worker 模式的影响 |
| 40 | + |
| 41 | +## 核心原则 |
| 42 | + |
| 43 | +- **不即兴发挥**:严格按照任务要求执行,不随意创新 |
| 44 | +- **不过度设计**:避免复杂化,只做必要的工作 |
| 45 | +- **不偏离规则**:始终遵循这套流程,确保代码安全、可靠 |
| 46 | + |
| 47 | +## 项目特定编码规范 |
| 48 | + |
| 49 | +### PHP 代码规范 |
| 50 | +- 必须使用 `<?php` 标签开头 |
| 51 | +- 必须在每个文件开头添加 `declare(strict_types=1);` |
| 52 | +- 使用 PSR-4 自动加载标准 |
| 53 | +- 遵循 Laravel Pint 代码风格规范 |
| 54 | + |
| 55 | +### 命名约定 |
| 56 | +- 类名使用 PascalCase:`FrankenPhpWorkerWatcher` |
| 57 | +- 方法名使用 camelCase:`onRequestStart()` |
| 58 | +- 常量使用 SCREAMING_SNAKE_CASE:`OTEL_RESPONSE_TRACE_HEADER_NAME` |
| 59 | +- 配置键使用 snake_case:`response_trace_header_name` |
| 60 | + |
| 61 | +### OpenTelemetry 特定规范 |
| 62 | +- Span 名称使用 dot.notation:`frankenphp.worker.request_start` |
| 63 | +- 属性名使用标准前缀:`frankenphp.worker.`, `http.`, `db.` |
| 64 | +- 敏感信息必须过滤:使用 `***` 替代敏感值 |
| 65 | +- 始终正确管理 span 生命周期:确保 `startSpan()` 后有对应的 `end()` |
| 66 | + |
| 67 | +### FrankenPHP Worker 模式规范 |
| 68 | +- Worker 模式检测:使用标准的 `isFrankenPhpWorkerMode()` 方法 |
| 69 | +- 内存管理:关注内存增长,超过阈值时记录警告 |
| 70 | +- 状态清理:在请求间正确清理 OpenTelemetry 上下文 |
| 71 | +- 错误处理:使用 `error_log()` 记录清理错误,避免影响正常请求 |
| 72 | + |
| 73 | +### 配置管理 |
| 74 | +- 环境变量使用 `OTEL_` 前缀 |
| 75 | +- 配置文件使用 `config/otel.php` |
| 76 | +- 支持通过环境变量覆盖默认配置 |
| 77 | +- 提供合理的默认值 |
| 78 | + |
| 79 | +### 错误处理 |
| 80 | +- 使用 try-catch 包装可能失败的 OpenTelemetry 操作 |
| 81 | +- 静默处理追踪相关错误,不影响业务逻辑 |
| 82 | +- 使用 `error_log()` 记录重要错误信息 |
| 83 | +- 避免在追踪代码中抛出异常 |
| 84 | + |
| 85 | +### 性能考虑 |
| 86 | +- 最小化追踪代码的性能开销 |
| 87 | +- 使用条件检查避免不必要的操作 |
| 88 | +- 在 worker 模式下特别注意内存使用 |
| 89 | +- 合理使用垃圾回收机制 |
| 90 | + |
| 91 | +### 测试要求 |
| 92 | +- 为新功能编写单元测试 |
| 93 | +- 使用 Orchestra Testbench 进行 Laravel 集成测试 |
| 94 | +- 测试文件放在对应的 `tests/` 目录结构中 |
| 95 | +- 确保测试覆盖错误处理路径 |
| 96 | + |
| 97 | +## 代码注释规范 |
| 98 | + |
| 99 | +- **代码注释必须使用英文** |
| 100 | +- 类和方法使用 PHPDoc 格式注释 |
| 101 | +- 复杂逻辑添加行内注释说明 |
| 102 | +- 公共 API 必须有完整的文档注释 |
| 103 | + |
| 104 | +## 文件结构约定 |
| 105 | + |
| 106 | +``` |
| 107 | +src/ |
| 108 | +├── Console/Commands/ # Artisan 命令 |
| 109 | +├── Facades/ # Laravel Facades |
| 110 | +├── Hooks/ # OpenTelemetry Hooks (框架级拦截) |
| 111 | +├── Support/ # 支持类和工具 |
| 112 | +├── Traits/ # 可复用的 Traits |
| 113 | +├── Watchers/ # 应用级监听器 |
| 114 | +└── *.php # 核心服务类 |
| 115 | +``` |
| 116 | + |
| 117 | +## 依赖管理 |
| 118 | +- 核心依赖:OpenTelemetry PHP SDK |
| 119 | +- Laravel 框架:支持 10.0+, 11.0+, 12.0+ |
| 120 | +- PHP 版本:最低 8.4 |
| 121 | +- 必须扩展:ext-opentelemetry |
| 122 | + |
| 123 | +## 安全考虑 |
| 124 | +- 过滤敏感信息:Cookie, Authorization, API Key |
| 125 | +- 使用白名单机制控制记录的 HTTP 头 |
| 126 | +- 避免在追踪数据中暴露用户隐私信息 |
| 127 | +- 正确处理跨请求的状态清理 |
| 128 | + |
| 129 | +## 向后兼容性 |
| 130 | +- 保持配置文件结构的稳定性 |
| 131 | +- 避免破坏现有的 Watcher 和 Hook 接口 |
| 132 | +- 新功能使用 Feature Flag 控制 |
| 133 | +- 遵循语义化版本管理 |
| 134 | + |
| 135 | +记住:严格遵循这些规则,确保每次代码改动都是必要的、安全的和高效的。 |
0 commit comments