// Prepare sets up API and registers the host data to the Mackerel server. // Use returned values to call Run(). func Prepare(conf *config.Config) (*Context, error) { api, err := mackerel.NewAPI(conf.Apibase, conf.Apikey, conf.Verbose) if err != nil { return nil, fmt.Errorf("Failed to prepare an api: %s", err.Error()) } host, err := prepareHost(conf.Root, api, conf.Roles, conf.CheckNames(), conf.DisplayName, conf.HostStatus.OnStart) if err != nil { return nil, fmt.Errorf("Failed to prepare host: %s", err.Error()) } return &Context{ ag: NewAgent(conf), conf: conf, host: host, api: api, }, nil }
func runOncePayload(conf *config.Config) ([]mackerel.CreateGraphDefsPayload, *mackerel.HostSpec, *agent.MetricsResult, error) { hostname, meta, interfaces, err := collectHostSpecs() if err != nil { logger.Errorf("While collecting host specs: %s", err) return nil, nil, nil, err } origInterval := metricsInterval metricsInterval = 1 * time.Second defer func() { metricsInterval = origInterval }() ag := NewAgent(conf) graphdefs := ag.CollectGraphDefsOfPlugins() metrics := ag.CollectMetrics(time.Now()) return graphdefs, &mackerel.HostSpec{ Name: hostname, Meta: meta, Interfaces: interfaces, RoleFullnames: conf.Roles, Checks: conf.CheckNames(), DisplayName: conf.DisplayName, }, metrics, nil }
// prepareHost collects specs of the host and sends them to Mackerel server. // A unique host-id is returned by the server if one is not specified. func prepareHost(conf *config.Config, api *mackerel.API) (*mackerel.Host, error) { // XXX this configuration should be moved to under spec/linux os.Setenv("PATH", "/sbin:/usr/sbin:/bin:/usr/bin:"+os.Getenv("PATH")) os.Setenv("LANG", "C") // prevent changing outputs of some command, e.g. ifconfig. doRetry := func(f func() error) { retry.Retry(retryNum, retryInterval, f) } filterErrorForRetry := func(err error) error { if err != nil { logger.Warningf("%s", err.Error()) } if apiErr, ok := err.(*mackerel.Error); ok && apiErr.IsClientError() { // don't retry when client error (APIKey error etc.) occurred return nil } return err } hostname, meta, interfaces, lastErr := collectHostSpecs() if lastErr != nil { return nil, fmt.Errorf("error while collecting host specs: %s", lastErr.Error()) } var result *mackerel.Host if hostID, err := conf.LoadHostID(); err != nil { // create logger.Debugf("Registering new host on mackerel...") doRetry(func() error { hostID, lastErr = api.CreateHost(hostname, meta, interfaces, conf.Roles, conf.DisplayName) return filterErrorForRetry(lastErr) }) if lastErr != nil { return nil, fmt.Errorf("Failed to register this host: %s", lastErr.Error()) } doRetry(func() error { result, lastErr = api.FindHost(hostID) return filterErrorForRetry(lastErr) }) if lastErr != nil { return nil, fmt.Errorf("Failed to find this host on mackerel: %s", lastErr.Error()) } } else { // check the hostID is valid or not doRetry(func() error { result, lastErr = api.FindHost(hostID) return filterErrorForRetry(lastErr) }) if lastErr != nil { if fsStorage, ok := conf.HostIDStorage.(*config.FileSystemHostIDStorage); ok { return nil, fmt.Errorf("Failed to find this host on mackerel (You may want to delete file \"%s\" to register this host to an another organization): %s", fsStorage.HostIDFile(), lastErr.Error()) } return nil, fmt.Errorf("Failed to find this host on mackerel: %s", lastErr.Error()) } } hostSt := conf.HostStatus.OnStart if hostSt != "" && hostSt != result.Status { doRetry(func() error { lastErr = api.UpdateHostStatus(result.ID, hostSt) return filterErrorForRetry(lastErr) }) if lastErr != nil { return nil, fmt.Errorf("Failed to set default host status: %s, %s", hostSt, lastErr.Error()) } } lastErr = conf.SaveHostID(result.ID) if lastErr != nil { return nil, fmt.Errorf("Failed to save host ID: %s", lastErr.Error()) } return result, nil }