从python命令行调用google api时出错

问题描述

我对python非常陌生。我正在尝试通过 google cloud shell 的python命令行调用google Monitoring API。我正在使用python 2.7。在此之前,我已经安装了

from googleapiclient.discovery import build

service = build('monitoring','v3',cache_discovery=True)
timeseries = service.projects().timeSeries().list(
            name="my-project",filter="metric.type=compute.googleapis.com/instance/cpu/utilization"
            aggregation_alignmentPeriod=86400s,# aggregation_crossSeriesReducer=api_args["crossSeriesReducer"],aggregation_perSeriesAligner="ALIGN_MEAN",aggregation_groupByFields="metric.labels.key",interval_endTime="2020-08-23T17:30:04.707Z",interval_startTime="2020-08-22T17:30:05.603000Z",pageSize=100
        ).execute()

这是用于调用Google监控API的代码

service = build('monitoring',cache_discovery=True)

我在python命令行以及执行此行时传递适当的值

>>>from googleapiclient.discovery import build
>>> service = build('monitoring',cache_discovery=True)
Traceback (most recent call last):
  File "<stdin>",line 1,in <module>
  File "/home/mugham/.local/lib/python2.7/site-packages/googleapiclient/_helpers.py",line 134,in positional_wrapper
    return wrapped(*args,**kwargs)
  File "/home/mugham/.local/lib/python2.7/site-packages/googleapiclient/discovery.py",line 282,in build
    adc_key_path=adc_key_path,File "/home/mugham/.local/lib/python2.7/site-packages/googleapiclient/_helpers.py",line 489,in build_from_document
    credentials = _auth.default_credentials()
  File "/home/mugham/.local/lib/python2.7/site-packages/googleapiclient/_auth.py",line 44,in default_credentials
    credentials,_ = google.auth.default()
  File "/usr/local/lib/python2.7/dist-packages/google/auth/_default.py",line 338,in default
    credentials,project_id = checker()
  File "/usr/local/lib/python2.7/dist-packages/google/auth/_default.py",line 208,in _get_gae_credentials
    project_id = app_engine.get_project_id()
  File "/usr/local/lib/python2.7/dist-packages/google/auth/app_engine.py",line 77,in get_project_id
    return app_identity.get_application_id()
  File "/usr/lib/google-cloud-sdk/platform/google_appengine/google/appengine/api/app_identity/app_identity.py",line 455,in get_application_id
    _,domain_name,display_app_id = _ParseFullAppId(full_app_id)
  File "/usr/lib/google-cloud-sdk/platform/google_appengine/google/appengine/api/app_identity/app_identity.py",line 436,in _ParseFullAppId
    psep = app_id.find(_PARTITION_SEParaTOR)
AttributeError: 'nonetype' object has no attribute 'find'

我得到以下错误

mydomain.com/somejourney/?app=AppA

我不知道为什么会这样,有人可以帮助我吗?谢谢

解决方法

我一直在Google Cloud Shell中进行此操作,因此我认为这无需传递 GOOGLE_APPLICATION_CREDENTIALS 就可以了,因为我已经为其他API(如计算引擎)完成了此操作,但看来我需要从服务帐户创建一个密钥,该密钥具有通过此命令调用此监控api 的权限,

gcloud iam服务帐户密钥创建--iam-帐户输出密钥

完成此操作后,我必须将该值导出到有效的 GOOGLE_APPLICATION_CREDENTIALS 中的环境文件中。