我们在 Laravel 应用程序中使用 Google Analytics 核心报告 API v3 已有 2 年多了。 多年来,我们进行了一些优化,但我们的设置一直是相同的,并且现在已经运行了相当长的一段时间。
本月早些时候开始发生一些奇怪的事情,很少有请求需要大约 4 分钟才能完成。我能找到的第一个事件发生在 12 月 6 日。
起初我没有多想,以为我们达到了某种极限,但问题仍然存在,并且越来越频繁地出现。
所以在过去的几天里,我一直在寻找问题的根源,但我一点也不知道为什么会这样。开发人员控制台中没有达到限制的迹象。
我花了一些时间来找出当我连续快速调用 API 时有多少响应缓慢,14 次调用中有 4 次花费了 240.3 到 240.5 秒。我已经打印了调用的结果,并且只调用了 1 个特定 View 以查看在 1 个请求中发送大量数据是否不是问题。 该 View 当天没有数据,因此所有请求都返回 0 行,所有指标的总数为 0。没有附加错误消息。
开发者控制台另有说明,它表示在过去一小时内没有请求超过 300 毫秒:
这是在我们的服务器和本地环境中发生的,所以我认为它与 nginx/internet 问题无关。
我很确定我的代码没有问题,这确实与限制有关,但我还是添加了它。此方法提取我们存储在数据库中的所有 View ,并对 API 进行 3 次调用以提取多个指标,这不能在 1 个请求中完成,因为您不能一次请求超过 10 个指标。
public function getExternal()
{
$this->logInfo("Retrieving reports");
$views = $this->getLinkedViews();
$i = 1;
foreach ($views as $view) {
try {
$params= array('dimensions' => 'ga:campaign, ga:source, ga:medium, ga:date' );
$start = microtime(true);
$response = $this->analytics->data_ga->get(
'ga:' . $view->datasource_id,
$this->startDate,
$this->endDate,
'ga:users, ga:sessions, ga:bounceRate, ga:avgSessionDuration, ga:goal1Completions , ga:goal2Completions , ga:goal3Completions , ga:goal4Completions',
$params
);
var_dump('call time: ' . (microtime(true) - $start));
$data = $response->getRows();
if ($data != null) {
$this->rawData[$view->datasource_id. '.1'] = $data;
}
$response = $this->analytics->data_ga->get(
'ga:' . $view->datasource_id,
$this->startDate,
$this->endDate,
'ga:goal5Completions , ga:goal6Completions , ga:goal7Completions , ga:goal8Completions , ga:goal9Completions , ga:goal10Completions , ga:goal11Completions , ga:goal12Completions',
$params
);
$data = $response->getRows();
if ($data != null) {
$this->rawData[$view->datasource_id. '.2'] = $data;
}
$response = $this->analytics->data_ga->get(
'ga:' . $view->datasource_id,
$this->startDate,
$this->endDate,
'ga:goal13Completions , ga:goal14Completions , ga:goal15Completions , ga:goal16Completions , ga:goal17Completions , ga:goal18Completions , ga:goal19Completions , ga:goal20Completions',
$params
);
$data = $response->getRows();
if ($data != null) {
$this->rawData[$view->datasource_id. '.3'] = $data;
}
$this->logInfo($view->name . ' metrics retrieved'. "(" .$i . " - " . count($views). ")", $view->datasource_id);
$i++;
} catch (\Google_Service_Exception $gse) {
dd($gse);
$this->logError($gse->getMessage(), isset($view->datasource_id) ? $view->datasource_id : null, $this->formatErrorCode($gse->getCode()));
} catch (\Throwable $t){
dd($t);
$this->logError($t, isset($view->datasource_id) ? $view->datasource_id: null, $this->formatErrorCode('000001'));
}
最佳答案
我联系了谷歌,得到的回复如下:
团队已经意识到这个问题,目前仍在努力解决这个问题。目前,我会推荐以下建议以缓解此问题:
• 通过缩小范围(例如维度、列、日期范围、过滤器等)来简化查询的复杂性;见this page了解是什么驱动了复杂性
• 实现指数back-off
编辑:
Google 已经修复了这个问题,我们不得不实现上述建议,因为我们似乎比错误发生之前更容易受到限制。
关于google-analytics-api - Google Analytics 核心报告 API v3 需要 4 分钟响应,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/65439328/