Issue
For Google Cloud Functions triggered from HTTP, it is possible to retrieve the execution id by inspecting the headers of the HTTP request ("Function-Execution-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)
}
However, for GCF triggered by PubSub events, I can’t find how to retrieve this execution 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
}
I have looked into the PubSubMessage
(https://cloud.google.com/pubsub/docs/reference/rest/v1/PubsubMessage), but it only contains data
+ an empty attributes
map.
I have also checked if execution ID is in the metadata
handled by the context. However, from my tests, and the docs (https://godoc.org/cloud.google.com/go/functions/metadata#FromContext), only EventID
, Timestamp
, EventType
and Resource
are present.
How can I retrieve the execution id of a GCF function triggered by a PubSub event?
Solution
EDIT: This appears to no longer be accurate. See the other answer from ProGirlXOXO.
A Pub/Sub-triggered event does not have an execution ID; instead it has an EventID
contained in the context metadata, which is a unique ID for the event.
You can access the EventID
as follows:
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
}
Answered By – Lauren
Answer Checked By – Marilyn (GoLangFix Volunteer)