github.com/galamsiva2020/kubernetes-heapster-monitoring@v0.0.0-20210823134957-3c1baa7c1e70/events/sinks/gcl/gcl.go (about) 1 // Copyright 2015 Google Inc. All Rights Reserved. 2 // 3 // Licensed under the Apache License, Version 2.0 (the "License"); 4 // you may not use this file except in compliance with the License. 5 // You may obtain a copy of the License at 6 // 7 // http://www.apache.org/licenses/LICENSE-2.0 8 // 9 // Unless required by applicable law or agreed to in writing, software 10 // distributed under the License is distributed on an "AS IS" BASIS, 11 // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 12 // See the License for the specific language governing permissions and 13 // limitations under the License. 14 15 package gcl 16 17 import ( 18 "encoding/json" 19 "fmt" 20 "net/url" 21 "time" 22 23 gce_util "k8s.io/heapster/common/gce" 24 "k8s.io/heapster/events/core" 25 26 "github.com/golang/glog" 27 "golang.org/x/oauth2" 28 "golang.org/x/oauth2/google" 29 gcl "google.golang.org/api/logging/v2" 30 ) 31 32 const ( 33 monitoredResourceType = "global" 34 logName = "kubernetes.io/events" 35 loggingSeverity = "NOTICE" 36 ) 37 38 type gclSink struct { 39 project string 40 gclService *gcl.Service 41 } 42 43 func (sink *gclSink) ExportEvents(eventBatch *core.EventBatch) { 44 if len(eventBatch.Events) == 0 { 45 glog.V(4).Info("Not events to export") 46 return 47 } 48 glog.V(4).Info("Exporting events") 49 entries := make([]*gcl.LogEntry, len(eventBatch.Events)) 50 for i, event := range eventBatch.Events { 51 evtJson, err := json.Marshal(event) 52 if err != nil { 53 glog.Errorf("Skipping exporting event due to error while marshaling event %v as JSON: %v", event, err) 54 continue 55 } 56 entries[i] = &gcl.LogEntry{ 57 LogName: fmt.Sprintf("projects/%s/logs/%s", sink.project, url.QueryEscape(logName)), 58 Timestamp: event.LastTimestamp.Time.UTC().Format(time.RFC3339), 59 Severity: loggingSeverity, 60 Resource: &gcl.MonitoredResource{Type: monitoredResourceType}, 61 InsertId: string(event.UID), 62 JsonPayload: evtJson, 63 } 64 } 65 req := &gcl.WriteLogEntriesRequest{Entries: entries} 66 if _, err := sink.gclService.Entries.Write(req).Do(); err != nil { 67 glog.Errorf("Error while exporting events to GCL: %v", err) 68 } else { 69 glog.V(4).Infof("Successfully exported %d events", len(entries)) 70 } 71 } 72 73 func (sink *gclSink) Name() string { 74 return "GCL Sink" 75 } 76 77 func (sink *gclSink) Stop() { 78 // nothing needs to be done. 79 } 80 81 func CreateGCLSink(uri *url.URL) (core.EventSink, error) { 82 client, err := google.DefaultClient(oauth2.NoContext, gcl.LoggingWriteScope) 83 if err != nil { 84 return nil, fmt.Errorf("error creating oauth2 client: %v", err) 85 } 86 87 // Create Google Cloud Logging service. 88 gclService, err := gcl.New(client) 89 if err != nil { 90 return nil, fmt.Errorf("error creating GCL service: %v", err) 91 } 92 93 // Detect project ID 94 projectId, err := gce_util.GetProjectId() 95 if err != nil { 96 return nil, fmt.Errorf("error getting GCP project ID: %v", err) 97 } 98 99 sink := &gclSink{project: projectId, gclService: gclService} 100 glog.Info("created GCL sink") 101 return sink, nil 102 }