节点在线、应用在线、配置在线使用令牌查询
大石头 authored at 2021-12-16 19:49:30
10.19 KiB
Stardust
# 星尘监控 PHP SDK 适用于 PHP 7.4+,提供星尘 APM 监控和配置中心的接入能力。 ## 功能特性 - ✅ **APM 监控**:应用性能追踪、调用链分析、错误监控 - ✅ **配置中心**:集中配置管理、配置热更新、多环境支持 - ✅ **零依赖**:仅依赖 PHP 内置的 cURL 和 JSON 扩展 - ✅ **轻量级**:核心代码约 500 行,易于集成和维护 - ✅ **易于使用**:简洁的 API,几行代码即可完成接入 ## 依赖要求 - PHP 7.4+ - cURL 扩展(通常默认安装) - JSON 扩展(通常默认安装) ## 快速开始 ### APM 监控 ```php require_once 'src/StardustTracer.php'; // 初始化追踪器 $tracer = new StardustTracer('http://star.example.com:6600', 'MyPHPApp', 'MySecret'); $tracer->login(); // 创建追踪片段 $span = $tracer->newSpan('业务操作'); $span->tag = '参数信息'; try { // 执行业务逻辑 doSomething(); } catch (Exception $e) { $span->setError($e); } finally { $span->finish(); } // 请求结束时上报(自动调用,也可手动调用) $tracer->flush(); ``` ### 配置中心 ```php require_once 'src/StardustConfig.php'; // 初始化配置客户端 $config = new StardustConfig('http://star.example.com:6600', 'MyPHPApp', '', 'dev'); $config->login(); // 获取所有配置 $configs = $config->getAll(); // 获取单个配置项 $dbHost = $config->get('database.host', 'localhost'); $dbPort = $config->get('database.port', 3306); // 检查配置更新 if ($config->hasNewVersion()) { echo "有新版本配置等待发布\n"; } ``` ## 文件说明 ``` SDK/PHP/ ├── src/ │ ├── StardustTracer.php # APM 监控核心类 │ └── StardustConfig.php # 配置中心客户端 ├── examples/ │ ├── apm_basic.php # APM 基础使用示例 │ ├── config_basic.php # 配置中心使用示例 │ ├── laravel_middleware.php # Laravel 中间件集成 │ └── swoole_server.php # Swoole 常驻进程示例 └── README.md # 本文件 ``` ## 核心类说明 ### StardustTracer - APM 追踪器 #### 构造函数 ```php public function __construct( string $server, // 星尘服务器地址 string $appId, // 应用标识 string $secret = '', // 应用密钥 bool $autoShutdown = true // 是否自动注册关闭函数上报 ) ``` #### 主要方法 | 方法 | 说明 | |------|------| | `login(): bool` | 登录获取令牌 | | `ping(): bool` | 心跳保活,刷新令牌 | | `newSpan(string $name, string $parentId = ''): StardustSpan` | 创建追踪片段 | | `flush(): bool` | 上报数据到监控中心 | | `setDebug(bool $debug): void` | 设置调试模式 | ### StardustSpan - 追踪片段 #### 属性 | 属性 | 类型 | 说明 | |------|------|------| | `$id` | string | 片段ID | | `$parentId` | string | 父片段ID | | `$traceId` | string | 追踪ID | | `$startTime` | int | 开始时间(毫秒) | | `$endTime` | int | 结束时间(毫秒) | | `$tag` | string | 标签信息 | | `$error` | string | 错误信息 | #### 方法 | 方法 | 说明 | |------|------| | `setError($error): void` | 设置错误信息 | | `finish(): void` | 完成追踪片段 | ### StardustConfig - 配置中心客户端 #### 构造函数 ```php public function __construct( string $server, // 星尘服务器地址 string $appId, // 应用标识 string $secret = '', // 应用密钥 string $scope = '' // 作用域(dev/test/prod) ) ``` #### 主要方法 | 方法 | 说明 | |------|------| | `login(): bool` | 登录获取令牌 | | `getAll(bool $force = false): ?array` | 获取所有配置 | | `get(string $key, $default = null)` | 获取单个配置项 | | `getVersion(): int` | 获取当前配置版本 | | `hasNewVersion(): bool` | 检查是否有新版本 | | `setScope(string $scope): void` | 设置作用域 | | `setDebug(bool $debug): void` | 设置调试模式 | ## 使用场景 ### 场景1:PHP-FPM / Apache mod_php 标准的请求-响应模式,每次请求独立: ```php // 初始化(启用自动关闭函数) $tracer = new StardustTracer($server, $appId, $secret, true); $tracer->login(); // 创建追踪 $span = $tracer->newSpan('处理请求'); // ... 业务逻辑 $span->finish(); // 请求结束时自动上报(通过 register_shutdown_function) ``` ### 场景2:Laravel / Symfony 框架 通过中间件集成: ```php // 参考 examples/laravel_middleware.php class StardustMiddleware { public function handle(Request $request, Closure $next) { $span = $tracer->newSpan($request->path()); try { return $next($request); } finally { $span->finish(); $tracer->flush(); } } } ``` ### 场景3:Swoole / Workerman 常驻进程 需要定时上报和心跳: ```php // 初始化(禁用自动关闭函数) $tracer = new StardustTracer($server, $appId, $secret, false); $tracer->login(); // 定时上报(每60秒) Swoole\Timer::tick(60000, function () use ($tracer) { $tracer->flush(); }); // 定时心跳(每30秒) Swoole\Timer::tick(30000, function () use ($tracer) { $tracer->ping(); }); // 请求处理 $http->on('request', function ($request, $response) use ($tracer) { $span = $tracer->newSpan('处理请求'); // ... 业务逻辑 $span->finish(); // 不要在每个请求结束时调用 flush,由定时器统一上报 }); ``` ## 配置中心使用 ### 基本用法 ```php $config = new StardustConfig($server, $appId, $secret, 'prod'); $config->login(); // 首次加载 $configs = $config->getAll(); // 应用配置 $dbConfig = [ 'host' => $config->get('database.host', 'localhost'), 'port' => $config->get('database.port', 3306), 'name' => $config->get('database.name', 'app'), ]; ``` ### 配置热更新(轮询模式) ```php // 定时检查配置更新 while (true) { $oldVersion = $config->getVersion(); $configs = $config->getAll(); $newVersion = $config->getVersion(); if ($newVersion > $oldVersion) { echo "配置已更新,重新加载...\n"; // 重新初始化应用配置 reloadAppConfig($configs); } sleep(30); // 每30秒检查一次 } ``` ## 高级特性 ### 嵌套追踪 ```php // 父操作 $parentSpan = $tracer->newSpan('处理订单'); $parentSpan->tag = 'orderId=12345'; // 子操作1 $childSpan1 = $tracer->newSpan('验证库存', $parentSpan->id); // ... 业务逻辑 $childSpan1->finish(); // 子操作2 $childSpan2 = $tracer->newSpan('扣减库存', $parentSpan->id); // ... 业务逻辑 $childSpan2->finish(); $parentSpan->finish(); ``` ### 错误处理 ```php $span = $tracer->newSpan('数据库操作'); try { // 业务逻辑 $result = $db->query($sql); } catch (PDOException $e) { // 记录异常 $span->setError($e); // 可以继续抛出或处理 throw $e; } finally { $span->finish(); } ``` ### 自定义标签 ```php $span = $tracer->newSpan('API调用'); // 设置详细标签信息 $span->tag = json_encode([ 'method' => 'POST', 'url' => 'https://api.example.com/users', 'params' => ['name' => 'John', 'age' => 30], ]); // ... 业务逻辑 $span->finish(); ``` ### 调试模式 ```php // 开启调试模式,输出详细日志到 error_log $tracer->setDebug(true); $config->setDebug(true); // 所有 HTTP 请求和响应都会记录到日志 ``` ## 性能优化 ### 1. 合理设置采样率 星尘服务器会返回采样配置,SDK 会自动应用: - `Period`: 采样周期(秒) - `MaxSamples`: 正常请求最大采样数 - `MaxErrors`: 错误请求最大采样数 ### 2. 使用 GZIP 压缩 数据量超过 1KB 时,SDK 会自动使用 GZIP 压缩: ```php // 自动判断: // - 数据 <= 1KB:使用 /Trace/Report // - 数据 > 1KB:使用 /Trace/ReportRaw(GZIP 压缩) $tracer->flush(); ``` ### 3. 批量上报 在常驻进程模式下,使用定时器批量上报,而不是每个请求都上报: ```php // ✅ 推荐:定时批量上报 Swoole\Timer::tick(60000, fn() => $tracer->flush()); // ❌ 不推荐:每个请求都上报 $http->on('request', function ($req, $res) use ($tracer) { $span = $tracer->newSpan('request'); $span->finish(); $tracer->flush(); // 性能开销大 }); ``` ## 故障排查 ### 1. 登录失败 ```php // 检查服务器地址和应用信息 $tracer = new StardustTracer('http://star.example.com:6600', 'MyApp', 'secret'); $tracer->setDebug(true); // 开启调试 if (!$tracer->login()) { // 查看 error_log 中的详细错误信息 // 常见问题: // - 服务器地址不正确 // - 应用不存在 // - 密钥错误 // - 网络不通 } ``` ### 2. 数据未上报 ```php // 确保调用了 flush() $span->finish(); $tracer->flush(); // 必须调用 // 或者依赖自动关闭函数(仅适用于 PHP-FPM 模式) $tracer = new StardustTracer($server, $appId, $secret, true); ``` ### 3. 令牌过期 ```php // SDK 会自动刷新令牌,提前 5 分钟刷新 // 如果遇到问题,可以手动调用: $tracer->login(); // 重新登录 $tracer->ping(); // 刷新令牌 ``` ## 示例代码 完整示例请查看 `examples/` 目录: - `apm_basic.php` - APM 基础使用 - `config_basic.php` - 配置中心使用 - `laravel_middleware.php` - Laravel 中间件集成 - `swoole_server.php` - Swoole 常驻进程 运行示例: ```bash # APM 基础示例 php examples/apm_basic.php # 配置中心示例 php examples/config_basic.php # Swoole 服务器示例(需要安装 Swoole 扩展) php examples/swoole_server.php ``` ## 注意事项 1. **令牌管理**:SDK 会自动管理令牌的获取和刷新,提前 5 分钟自动刷新 2. **错误处理**:所有网络请求都有超时和错误处理,不会阻塞业务逻辑 3. **内存占用**:追踪数据在内存中缓存,定期上报后释放 4. **并发安全**:在 PHP-FPM 模式下每个请求独立,无并发问题;Swoole 模式需注意共享状态 ## 相关链接 - 星尘项目主页:https://github.com/NewLifeX/Stardust - 在线演示:http://star.newlifex.com - 完整文档:https://newlifex.com ## 许可证 MIT License ## 支持 如有问题或建议,请提交 Issue:https://github.com/NewLifeX/Stardust/issues