github.com/timstclair/heapster@v0.20.0-alpha1/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 "k8s.io/heapster/events/core" 23 24 "github.com/golang/glog" 25 "golang.org/x/oauth2" 26 "golang.org/x/oauth2/google" 27 gcl "google.golang.org/api/logging/v2beta1" 28 gce "google.golang.org/cloud/compute/metadata" 29 ) 30 31 const ( 32 monitoredResourceType = "global" 33 logName = "kubernetes.io/events" 34 loggingSeverity = "NOTICE" 35 ) 36 37 type gclSink struct { 38 project string 39 gclService *gcl.Service 40 } 41 42 func (sink *gclSink) ExportEvents(eventBatch *core.EventBatch) { 43 if len(eventBatch.Events) == 0 { 44 glog.V(4).Info("Not events to export") 45 return 46 } 47 glog.V(4).Info("Exporting events") 48 entries := make([]*gcl.LogEntry, len(eventBatch.Events)) 49 for i, event := range eventBatch.Events { 50 entries[i] = &gcl.LogEntry{ 51 LogName: fmt.Sprintf("projects/%s/logs/%s", sink.project, url.QueryEscape(logName)), 52 Timestamp: event.LastTimestamp.Time.UTC().Format(time.RFC3339), 53 Severity: loggingSeverity, 54 Resource: &gcl.MonitoredResource{Type: monitoredResourceType}, 55 InsertId: string(event.UID), 56 JsonPayload: *event, 57 } 58 } 59 req := &gcl.WriteLogEntriesRequest{Entries: entries} 60 if _, err := sink.gclService.Entries.Write(req).Do(); err != nil { 61 glog.Errorf("Error while exporting events to GCL: %v", err) 62 } else { 63 glog.V(4).Infof("Sucessfully exported %d events", len(entries)) 64 } 65 } 66 67 func (sink *gclSink) Name() string { 68 return "GCL Sink" 69 } 70 71 func (sink *gclSink) Stop() { 72 // nothing needs to be done. 73 } 74 75 func CreateGCLSink(uri *url.URL) (core.EventSink, error) { 76 // Detect project ID 77 projectId, err := gce.ProjectID() 78 if err != nil { 79 return nil, err 80 } 81 82 // Create Google Cloud Logging service. 83 client := oauth2.NewClient(oauth2.NoContext, google.ComputeTokenSource("")) 84 gclService, err := gcl.New(client) 85 if err != nil { 86 return nil, err 87 } 88 89 sink := &gclSink{project: projectId, gclService: gclService} 90 glog.Info("created GCL sink") 91 return sink, nil 92 }