【问题标题】:expected google.protobuf.Duration got str预期 google.protobuf.Duration 得到了 str
【发布时间】:2021-09-01 12:42:40
【问题描述】:

我正在尝试使用 Cloud Functions 创建警报。我将以下测试警报 json 直接插入到我的代码中:

alert_policy = {"conditions":[{"condition_absent":{"duration":900s,"filter":"metric.label.state=\"blocked\" AND metric.type=\"agent.googleapis.com/processes/count_by_state\"  AND resource.type=\"gce_instance\""},"displayName":"Test_two"}],"displayName":"test","combiner":"OR"}

由于duration 值,我无法使我的函数工作。我尝试以字符串、整数、带 s 的字符串的形式传递,但总是出错:

TypeError: Parameter to MergeFrom() must be instance of same class: expected google.protobuf.Duration got str.TypeError: Parameter to MergeFrom() must be instance of same class: expected google.protobuf.Duration got int.

我应该如何传递这个值?

【问题讨论】:

    标签: python google-cloud-monitoring protocol-buffers


    【解决方案1】:

    见:MetricAbsence

    它需要是一个字符串"900s"(可能)。

    Google(越来越多地?)在其 API 中公开底层 Protobuf 类型,这些可能会令人困惑。在这种情况下,底层类型Duration 是谷歌所谓的Well-Known Types 之一。具有讽刺意味的是,它们通常不那么出名;-)

    Google 的APIs Explorer 是此类诊断的绝佳工具。它是详尽的和最新的:

    示例

    在这种情况下,我从一个 Python 字典开始,json.dumps 将其转换为字符串,然后 from_json 它创建一个 monitoring_v3.AlertPolicy create_alert_policy 所需的monitoring_v3.AlertPolicy

    import json
    import os
    
    from google.cloud import monitoring_v3
    
    
    PROJECT = os.environ["PROJECT"]
    
    client = monitoring_v3.AlertPolicyServiceClient()
    
    name = "projects/{project}".format(project=PROJECT)
    
    filter = "..."
    
    j = {
        "displayName": "test",
        "conditions": [{
            "displayName": "test",
            "condition_absent": {
                "filter": filter,
                "duration": "900s",
            },
        }],
        "combiner": "OR"
    }
    
    policy = monitoring_v3.AlertPolicy.from_json(json.dumps(j))
    
    resp = client.create_alert_policy(name=name,alert_policy=policy)
    
    print(resp)
    

    然后:

    gcloud alpha monitoring policies list \
    --project=${PROJECT} \
    --format="value(displayName)"
    
    test
    

    【讨论】:

    • 嗨@DazWilkin 我确实尝试过“900s”并且我确实尝试过 APIs Explorer。 API Explorer 中没有 python,它适用于“900s”,但不适用于我的云功能。我有错误expected google.protobuf.Duration got str.
    • 添加示例
    • 好的,所以我错过了 from_json 方法;非常感谢。
    • 这是一团糟。我们正在为 Airflow 使用 Google Dataproc 运算符,他们需要字典。然而,这个方法把它变成了Message,所以我们现在不能从 Airflow 触发我们的集群。 ??‍♂️
    • 找到了解决方案。该方法接受字典或ClusterConfig。您可以使用构造函数轻松地将Message 转换为ClusterConfig
    猜你喜欢
    • 2017-01-19
    • 2021-10-14
    • 1970-01-01
    • 2019-08-03
    • 2020-07-21
    • 1970-01-01
    • 2022-08-12
    • 1970-01-01
    相关资源
    最近更新 更多