This repository has been archived by the owner on May 7, 2023. It is now read-only.
/
appengine.go
86 lines (74 loc) · 1.75 KB
/
appengine.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
package log
import (
"context"
"fmt"
"net/http"
"os"
"strings"
"cloud.google.com/go/logging"
"google.golang.org/api/option"
"google.golang.org/genproto/googleapis/api/monitoredres"
)
var projectID = os.Getenv("GOOGLE_CLOUD_PROJECT")
var serviceID = os.Getenv("GAE_SERVICE")
var versionID = os.Getenv("GAE_VERSION")
func init() {
if os.Getenv("USING_APPENGINE") != "" {
client, err := logging.NewClient(
context.Background(),
os.Getenv("GOOGLE_CLOUD_PROJECT"),
option.WithCredentialsFile("appengine.json"),
)
if err != nil {
panic(err)
}
logger := client.Logger(
"stderr",
logging.CommonResource(&monitoredres.MonitoredResource{
Type: "gae_app",
Labels: map[string]string{
"project_id": projectID,
"module_id": serviceID,
"version_id": versionID,
},
}),
)
Log = &AppEngineLogger{
client: client,
logger: logger,
}
}
}
type AppEngineLogger struct {
client *logging.Client
logger *logging.Logger
r *http.Request
}
func getTrace(r *http.Request) string {
if r == nil {
return ""
}
traceID := strings.SplitN(r.Header.Get("X-Cloud-Trace-Context"), "/", 2)[0]
return fmt.Sprintf("projects/%s/traces/%s", projectID, traceID)
}
func (ael *AppEngineLogger) Infof(format string, args ...interface{}) {
ael.logger.Log(logging.Entry{
Payload: fmt.Sprintf(format, args...),
Severity: logging.Info,
Trace: getTrace(ael.r),
})
}
func (ael *AppEngineLogger) Errorf(format string, args ...interface{}) {
ael.logger.Log(logging.Entry{
Payload: fmt.Sprintf(format, args...),
Severity: logging.Error,
Trace: getTrace(ael.r),
})
}
func (ael *AppEngineLogger) WithRequest(r *http.Request) Logger {
return &AppEngineLogger{
client: ael.client,
logger: ael.logger,
r: r,
}
}