-
Notifications
You must be signed in to change notification settings - Fork 6
/
Copy pathmain.go
97 lines (78 loc) · 2.57 KB
/
main.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
87
88
89
90
91
92
93
94
95
96
97
package main
import (
"context"
"fmt"
"net/http"
"strings"
"cloud.google.com/go/logging"
"github.com/direktiv/direktiv-apps/pkg/direktivapps"
"github.com/direktiv/direktiv-apps/pkg/validator"
"google.golang.org/api/option"
)
type GCPLogging struct {
ServiceAccountKey string `json:"serviceAccountKey" validate:"required"`
Message string `json:"message" validate:"required"`
ProjectID string `json:"project-id" validate:"required"`
LogName string `json:"log-name" validate:"required"`
LogLevel string `json:"log-level"`
}
const code = "com.gcplog.error"
var severityList = []string{"Default", "Debug", "Info", "Notice", "Warning", "Error", "Critical", "Alert", "Emergency"}
func main() {
direktivapps.StartServer(GCPLog)
}
func GCPLog(w http.ResponseWriter, r *http.Request) {
obj := new(GCPLogging)
aid, err := direktivapps.Unmarshal(obj, r)
if err != nil {
direktivapps.RespondWithError(w, code, err.Error())
return
}
// Validate Input
v := validator.CreateValidator()
if missingFields := v.ValidateRequired(obj); len(missingFields) > 0 {
for _, mf := range missingFields {
direktivapps.LogDouble(aid, fmt.Sprintf("Input Error: %s is required\n", mf))
}
direktivapps.RespondWithError(w, code, fmt.Sprintf("Invalid input: Fields [%s] are required", strings.Join(missingFields, ",")))
return
}
var validLevel bool
// Set default severity level
if obj.LogLevel == "" {
obj.LogLevel = severityList[0]
validLevel = true
}
// Check Severity is valid
for i := range severityList {
if obj.LogLevel == severityList[i] || validLevel {
validLevel = true
break
}
}
if !validLevel {
direktivapps.RespondWithError(w, code, fmt.Sprintf("log-level: '%s' is not valid. VAlID Levels: %s", obj.LogLevel, strings.Join(severityList, ", ")))
return
}
// Create GCP Client
ctx := context.Background()
client, err := logging.NewClient(ctx, obj.ProjectID, option.WithCredentialsJSON([]byte(obj.ServiceAccountKey)))
if err != nil {
direktivapps.RespondWithError(w, code, fmt.Sprintf("GCP Client Error: %v", err))
return
}
defer client.Close()
// Create GCP Logger
logger := client.Logger(obj.LogName)
// Set Logger Severity
targetLogger := logger.StandardLogger(logging.ParseSeverity(obj.LogLevel))
targetLogger.Println(obj.Message)
direktivapps.LogDouble(aid, "Writing Log Message to gcp")
// Flush Logger
if err := logger.Flush(); err != nil {
direktivapps.RespondWithError(w, code, fmt.Sprintf("GCP Logger Error: %v", err))
return
}
// Write empty to notified its finished
direktivapps.Respond(w, []byte{})
}