diff --git a/gaelog.go b/gaelog.go index 312d629..f4e697e 100644 --- a/gaelog.go +++ b/gaelog.go @@ -7,6 +7,7 @@ import ( "net/http" "os" "strings" + "sync" "time" "cloud.google.com/go/compute/metadata" @@ -31,6 +32,22 @@ const ( traceContextHeaderName = "X-Cloud-Trace-Context" ) +var ( + metadataOnce sync.Once + + metadataProjectID string + metadataProjectIDErr error +) + +// projectIDFromMetadataService fetches the project ID from the metadata server, +// memoizing the result for use on all but the first call. +func projectIDFromMetadataService() (string, error) { + metadataOnce.Do(func() { + metadataProjectID, metadataProjectIDErr = metadata.ProjectID() + }) + return metadataProjectID, metadataProjectIDErr +} + func traceID(projectID, trace string) string { return fmt.Sprintf("projects/%s/traces/%s", projectID, trace) } @@ -64,7 +81,7 @@ func newServiceInfo() (serviceInfo, error) { } // Try the metadata service for the project ID. - crProjectID, err := metadata.ProjectID() + crProjectID, err := projectIDFromMetadataService() if err != nil { return serviceInfo{}, err }