为什么为什么不断收到“超出配额组'AnalyticsDefaultGroup'的配额并限制'USER-100s'”错误?

时间:2019-10-16 16:29:54

标签: google-analytics-api

我目前正在管理两个Google Analytics(分析)管理帐户,每个帐户都有许多客户端和view_id。任务是通过Google Analytics(分析)Reporting API(v4)请求客户端数据,并每天通过Airflow DAG结构将其存储到SQL后端。

对于第一个帐户,一切正常。 就在最近,我在数据请求例程中添加了第二个帐户。 问题是,即使两个帐户都设置为相同的“ USER-100s”配额限制,对于新添加的帐户,我仍然会收到此错误消息:

googleapiclient.errors.HttpError: <HttpError 429 when requesting https://analyticsreporting.googleapis.com/v4/reports:batchGet?alt=json returned "Quota exceeded for quota group 'AnalyticsDefaultGroup' and limit 'USER-100s' of service 'analyticsreporting.googleapis.com' for consumer 'project_number:XXXXXXXXXXXX'.">

我已经按照Google官方准则(https://developers.google.com/analytics/devguides/config/mgmt/v3/limits-quotas)的建议,将配额限制“ User-100s”从100设置为最大1000。

我还检查了Google API控制台和项目编号的请求数量,但到目前为止,我从未超过每100秒1000个请求(请参阅请求历史记录帐户2),而第一个帐户始终有效(请参阅请求历史记录)帐户1)。仍然出现上述错误。

我还可以排除第二个帐户的客户仅拥有更多数据的可能性。

request history account 1

request history account 2

我现在陷入了try-except循环,该循环一直在请求,直到最终成功查询数据为止,例如

success = False
data = None
while not success:
    try:
        data = query_data() # trying to receive data from the API
        if data:
            success = True
    except HttpError as e:
        print(e)

这一点都不完美,并且对维护(例如集成测试)不利。另外,由于循环有时可能无限期地运行,因此这非常耗时且占用大量资源。只能在短时间内解决。

这尤其令人沮丧,因为第一个帐户使用相同的实现,发出了更多请求,而第二个帐户失败了。

如果您对此有任何解决方案,我将非常高兴知道。

干杯托比

1 个答案:

答案 0 :(得分:3)

我知道这个问题已经存在了一段时间,但是让我尝试帮助您。 :)

有3个标准请求限制:

    每个项目每天
  • 5万
  • 每个项目每100秒
  • 2k
  • 每用户每100秒100个

如您在图像中显示的(https://i.stack.imgur.com/Tp76P.png

配额组“ AnalyticsDefaultGroup”是指您的API项目,并且该配额中包含用户配额。

根据您的描述,您正在达到用户配额,通常是在您的请求中未提供userIPquotaUser时发生的。

因此,要防止这些错误,您需要处理一些要点:

  • 在每个请求中,在quotaUser中包含唯一字符串;
  • 每秒保持1个请求

根据您的代码,我假设您使用的是默认的Python Python Google API客户端(https://github.com/googleapis/google-api-python-client),它没有全局方法来定义quotaUser

包括quotaUser

analytics.reports().batchGet(
    body={
        'reportRequests': [{
            'viewId': 'your_view_id',
            'dateRanges': [{'startDate': '2020-01-01', 'endDate': 'today'}],
            'pageSize': '1000',
            'pageToken': pageToken,
            'metrics': [],
            'dimensions': []
        }]
    },
    quotaUser='my-user-1'
).execute()

这将使您向该用户请求的Google API注册(使用100个用户限制中的1个),而不是整个项目。

每秒限制1个请求

如果您打算提出很多请求,建议您使用以下命令在每个请求之间添加一个延迟时间:

time.sleep(1)

在对API提出请求之后。这样一来,您可以每100秒保持100个以下的请求。

我希望能有所帮助。 :)