如何使用Guzzle拉取Atera Restful API全量告警数据并存入MongoDB
解决方案
Atera告警接口的单页20条返回限制是服务端强制规则,不存在可绕过的请求参数,无法实现全量数据一次性拉取,你可以通过循环分页拉取的方式收集全量数据,参考实现逻辑如下:
实现思路
- 初始请求第一页数据
- 每次请求后判断返回的
nextLink是否为空,不为空则继续请求下一页 - 把每页返回的
items数组合并到总结果集中 - 所有页拉取完成后统一写入MongoDB,数据量较大时也可以边拉边写避免内存占用过高
代码示例
<?php use GuzzleHttp\Client; $client = new Client(); // 初始化总数据集 $allAlerts = []; // 初始请求地址 $requestUri = 'https://app.atera.com/api/v3/alerts'; $header = [ 'headers' => [ 'X-Api-Key' => '你的实际API密钥' ], // 配置超时时间避免接口无响应卡住 'timeout' => 30.0 ]; do { $res = $client->get($requestUri, $header); $data = json_decode($res->getBody()->getContents(), true); // 合并当前页的告警数据 if (!empty($data['items'])) { $allAlerts = array_merge($allAlerts, $data['items']); // 数据量过大时可以直接在这里写入MongoDB,不需要存到总数组 // 示例:$mongoCollection->insertMany($data['items']); } // 处理下一页地址的实体字符转义 $nextLink = str_replace('&', '&', $data['nextLink'] ?? ''); $requestUri = $nextLink; // 按需添加请求延迟,避免触发API限流规则 usleep(500000); // 0.5秒延迟,可根据实际情况调整 } while (!empty($requestUri)); // 拉取完成后批量写入MongoDB(如果没有边拉边写的话) // $mongoCollection->insertMany($allAlerts); echo "共拉取到" . count($allAlerts) . "条告警数据"; ?>
注意事项
- 可以在拉取过程中记录当前页码,出现异常中断后可以从断点继续拉取,不需要重新拉取全量
- 超过6000条数据不建议全部存在PHP数组中,优先选择边拉边写的方式,避免超出PHP内存上限
内容的提问来源于stack exchange,提问作者Mark Johnson
相关产品推荐
相关产品推荐

