// Returns a thread-compatible implementation of GCM interactions. func NewCore() (*GcmCore, error) { token, err := gce.NewAuthTokenProvider(GCMAuthScope) if err != nil { return nil, err } // Detect project. project, err := metadata.ProjectID() if err != nil { return nil, err } core := &GcmCore{ token: token, project: project, exportedMetrics: make(map[string]metricDescriptor), lastValue: gcstore.New(time.Hour), } // Wait for an initial token. _, err = core.token.WaitForToken() if err != nil { return nil, err } if err := core.listMetrics(); err != nil { return nil, err } return core, 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 }