Reputation: 11237
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?
Upvotes: 3
Views: 5267
Reputation: 999
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
}
Upvotes: 1
Reputation: 2300
No, it is currently not possible to get execution id from pubsub triggered events.
You can get the event id from context as Lauren stated but that does not match execution id.
Also, pubsub triggered events do have execution ids. You can see this by using a default logger to log the event id. In stackdriver there will be an attached execution id label and it will not match the event id. We have observed that event id is numeric while execution id is alphanumeric.
Further, if the function is retried, it will keep the same event id but get a different execution id.
This is a recent (undocumented) change but can be easily observed.
Upvotes: 4