github.com/aclisp/heapster@v0.19.2-0.20160613100040-51756f899a96/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 "fmt" 19 "net/url" 20 "time" 21 22 gce_util "k8s.io/heapster/common/gce" 23 "k8s.io/heapster/events/core" 24 25 "github.com/golang/glog" 26 "golang.org/x/oauth2" 27 "golang.org/x/oauth2/google" 28 gcl "google.golang.org/api/logging/v2beta1" 29 gce "google.golang.org/cloud/compute/metadata" 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 entries[i] = &gcl.LogEntry{ 52 LogName: fmt.Sprintf("projects/%s/logs/%s", sink.project, url.QueryEscape(logName)), 53 Timestamp: event.LastTimestamp.Time.UTC().Format(time.RFC3339), 54 Severity: loggingSeverity, 55 Resource: &gcl.MonitoredResource{Type: monitoredResourceType}, 56 InsertId: string(event.UID), 57 JsonPayload: *event, 58 } 59 } 60 req := &gcl.WriteLogEntriesRequest{Entries: entries} 61 if _, err := sink.gclService.Entries.Write(req).Do(); err != nil { 62 glog.Errorf("Error while exporting events to GCL: %v", err) 63 } else { 64 glog.V(4).Infof("Sucessfully exported %d events", len(entries)) 65 } 66 } 67 68 func (sink *gclSink) Name() string { 69 return "GCL Sink" 70 } 71 72 func (sink *gclSink) Stop() { 73 // nothing needs to be done. 74 } 75 76 func CreateGCLSink(uri *url.URL) (core.EventSink, error) { 77 if err := gce_util.EnsureOnGCE(); err != nil { 78 return nil, err 79 } 80 81 // Detect project ID 82 projectId, err := gce.ProjectID() 83 if err != nil { 84 return nil, err 85 } 86 87 // Create Google Cloud Logging service. 88 client := oauth2.NewClient(oauth2.NoContext, google.ComputeTokenSource("")) 89 gclService, err := gcl.New(client) 90 if err != nil { 91 return nil, err 92 } 93 94 sink := &gclSink{project: projectId, gclService: gclService} 95 glog.Info("created GCL sink") 96 return sink, nil 97 }