【问题标题】:Get execution ID for Google Cloud Functions triggered from PubSub event获取从 PubSub 事件触发的 Google Cloud Functions 的执行 ID
【发布时间】:2019-05-15 15:21:36
【问题描述】:

对于从 HTTP 触发的 Google Cloud Functions,可以通过检查 HTTP 请求的标头 ("Function-Execution-Id") 来检索执行 ID:

package p

import (
    "fmt"
    "net/http"
)

func F(w http.ResponseWriter, r *http.Request) {
    executionID := r.Header.Get("Function-Execution-Id")
    fmt.Println(executionID)
}

但是,对于由 PubSub 事件触发的 GCF,我找不到如何检索此执行 ID:

package p

import (
    "context"
)

type PubSubMessage struct {
    Data []byte `json:"data"`
}

func F(ctx context.Context, m PubSubMessage) error {
    executionID := "" // ???
    fmt.Println(executionID)
    return nil
}

我查看了PubSubMessage (https://cloud.google.com/pubsub/docs/reference/rest/v1/PubsubMessage),但它只包含data + 一个空的attributes 映射。

我还检查了执行 ID 是否在上下文处理的 metadata 中。但是,根据我的测试和文档 (https://godoc.org/cloud.google.com/go/functions/metadata#FromContext),只有 EventIDTimestampEventTypeResource 存在。

如何检索由 PubSub 事件触发的 GCF 函数的执行 ID?

【问题讨论】:

  • 是否有关于Function-Execution-Id 请求标头的文档?经过大量搜索,我没有找到任何有关它的文档。

标签: go google-cloud-functions google-cloud-pubsub


【解决方案1】:

不,目前无法从 pubsub 触发的事件中获取执行 ID。

您可以像 Lauren 所说的那样从上下文中获取事件 ID,但这与执行 ID 不匹配。

此外,发布订阅触发的事件确实具有执行 ID。您可以通过使用默认记录器记录事件 ID 来查看这一点。在 stackdriver 中会有一个附加的执行 ID 标签,它与事件 ID 不匹配。我们观察到事件 id 是数字,而执行 id 是字母数字。

进一步,如果函数被重试,它将保持相同的事件ID,但得到不同的执行ID。

这是最近的(未记录的)更改,但很容易观察到。

【讨论】:

    【解决方案2】:

    编辑:这似乎不再准确。请参阅 ProGirlXOXO 的其他答案。

    Pub/Sub 触发的事件没有执行 ID;相反,它在上下文元数据中包含一个 EventID,这是事件的唯一 ID。

    您可以通过以下方式访问EventID

    import (
        "context"
        "log"
        "cloud.google.com/go/functions/metadata"
    )
    
    func F(ctx context.Context, m PubSubMessage) error {
        ctxMetadata, err := metadata.FromContext(ctx)
        if err != nil {
            log.Fatal(err);
        }
        log.Println("EventID: " + ctxMetadata.EventID)
        return nil
    }
    

    【讨论】:

    • 感谢您的回答。但是,EventID 与 Cloud Function 的执行 ID 不同,正如我们在 Stackdriver 中看到的那样(任何日志条目的标签 execution_id)。这是我尝试检索的特定执行 ID(同样包含在 HTTP 函数的 Function-Execution-Id 标头中)。在 PubSub 触发的函数中真的不可能吗?
    • 你是对的,Pub/Sub 触发的事件实际上在日志条目中有 execution_id 标签。请注意,Pub/Sub 触发的事件 execution_id 与 HTTP 请求触发的 execution_id 格式不同。上下文元数据中的EventIDexecution_id 标签匹配。
    • EventID 与 Stackdriver 日志中的 execution_id 标签不同,我已使用您添加的确切代码对其进行了检查,并通过发送来自 Testing 控制台中的选项卡。它们的格式不同:EventID 是 UUID,而 Stackdriver 日志中的 execution_id(在日志条目的 labels 字段中)是一串字母数字字符(在我的情况下为 12 个字符,但似乎因项目而异)。无论如何,这些不是相同的 ID。它们有某种关联吗?这个 execution_id 是如何被 Cloud Function 添加到 Stackdriver 日志上的?
    • 我明白了;我尝试直接在 PubSub 主题上发送消息(not 通过控制台中的 Testing 选项卡),它会生成 - 正如你所说 - EventID与 Stackdriver 日志上的 execution_id 标签匹配。看起来从控制台测试云功能有神秘的结果。我很好奇,你知道为什么我从 Testing 选项卡发送事件时会出现这种行为吗?也许这是因为它没有向源 PubSub 主题发送真正的消息?无论如何,它有效,感谢您的帮助。
    • 请标记此答案不再准确。 PubSub 触发的云函数获取事件 ID,但该 ID 与执行 ID 不匹配。事件 ID 是数字,而执行 ID 是字母数字。事件 ID 被唯一地分配给由 pubsub 触发的云函数。如果必须重试该事件,它会保留相同的事件 ID,但执行 ID 会更改。
    猜你喜欢
    • 2021-05-25
    • 2021-08-05
    • 1970-01-01
    • 2019-10-05
    • 2021-02-04
    • 2021-11-09
    • 2021-09-01
    • 2018-03-27
    • 2021-10-06
    相关资源
    最近更新 更多