// Returns an implementation of a Google Cloud Logging (GCL) sink. func new() (sink_api.ExternalSink, error) { // TODO: Retry OnGCE call for ~15 seconds before declaring failure. time.Sleep(3 * time.Second) // Only support GCE for now. if !metadata.OnGCE() { return nil, fmt.Errorf("The Google Cloud Logging (GCL) sink failed to start: this process must be running on Google Compute Engine (GCE)") } // Detect project ID projectId, err := metadata.ProjectID() if err != nil { return nil, err } glog.Infof("Project ID for GCL sink is: %q\r\n", projectId) // Check for required auth scopes err = gce.VerifyAuthScope(GCLAuthScope) if err != nil { return nil, err } impl := &gclSink{ projectId: projectId, httpClient: &http.Client{}, } // Get an initial token. err = impl.refreshToken() if err != nil { return nil, err } return impl, nil }
// Returns a thread-compatible implementation of GCM interactions. func NewCore() (*GcmCore, error) { // TODO: Retry OnGCE call for ~15 seconds before declaring failure. time.Sleep(3 * time.Second) // Only support GCE for now. if !metadata.OnGCE() { return nil, fmt.Errorf("the GCM sink is currently only supported on GCE") } // Detect project. project, err := metadata.ProjectID() if err != nil { return nil, err } // Check required service accounts err = gce.VerifyAuthScope(GCLAuthScope) if err != nil { return nil, err } core := &GcmCore{ project: project, exportedMetrics: make(map[string]metricDescriptor), lastValue: gcstore.New(time.Hour), } // Get an initial token. err = core.refreshToken() if err != nil { return nil, err } if err := core.listMetrics(); err != nil { return nil, err } return core, nil }