【问题标题】:Why do I keep getting "Quota exceededfor quota group 'AnalyticsDefaultGroup' and limit 'USER-100s'" Errors?为什么我不断收到“配额组 'AnalyticsDefaultGroup' 超出配额并限制 'USER-100s'”错误?
【发布时间】:2020-06-25 07:47:55
【问题描述】:

我目前正在管理两个 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)

这一点都不优雅,也不利于维护(如集成测试)。此外,它非常耗费时间和资源,因为循环有时可能会无限期地运行。这只能是短期的解决方法。

这尤其令人沮丧,因为相同的实现适用于第一个帐户,它发出更多请求,但对第二个帐户失败。

如果您知道任何解决方案,我会很高兴知道。

托比干杯

【问题讨论】:

    标签: google-analytics-api


    【解决方案1】:

    我知道这个问题已经有一段时间了,但让我试着帮助你。 :)

    有 3 个标准请求限制:

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

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

    配额组“AnalyticsDefaultGroup”是指您的 API 项目,用户配额包含在此限制中。

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

    因此,您必须处理一些要点,以防止出现这些错误:

    • 在每个请求中包含带有唯一字符串的quotaUser
    • 每秒保留 1 个请求

    根据您的代码,我假设您使用的是默认的 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 个以下。

    我希望我能帮上忙。 :)

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-08-20
      • 1970-01-01
      • 2021-03-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-04-24
      相关资源
      最近更新 更多