func (f *Factory) Make(service string, instanceId uint, data []byte) (sysconfig.Monitor, error) { var monitor sysconfig.Monitor switch service { case "mysql": // Load the MySQL instance info (DSN, name, etc.). mysqlIt := &proto.MySQLInstance{} if err := f.ir.Get(service, instanceId, mysqlIt); err != nil { return nil, err } // Parse the MySQL sysconfig config. config := &mysql.Config{} if err := json.Unmarshal(data, config); err != nil { return nil, err } // The user-friendly name of the service, e.g. sysconfig-mysql-db101: alias := "sysconfig-mysql-" + mysqlIt.Hostname // Make a MySQL sysconfig monitor. monitor = mysql.NewMonitor( alias, config, pct.NewLogger(f.logChan, alias), mysqlConn.NewConnection(mysqlIt.DSN), ) default: return nil, errors.New("Unknown sysconfig monitor type: " + service) } return monitor, nil }
func (s *TestSuite) TestStartCollectStop(t *C) { // Create the monitor. config := &mysql.Config{ Config: sysconfig.Config{ ServiceInstance: proto.ServiceInstance{ Service: "mysql", InstanceId: 1, }, }, } m := mysql.NewMonitor(s.name, config, s.logger, mysqlConn.NewConnection(dsn)) if m == nil { t.Fatal("Make new mysql.Monitor") } // Start the monitor. err := m.Start(s.tickChan, s.reportChan) if err != nil { t.Fatalf("Start monitor without error, got %s", err) } // monitor=Ready once it has successfully connected to MySQL. This may // take a few seconds (hopefully < 5) on a slow test machine. if ok := test.WaitStatusPrefix(5, m, s.name, "Idle"); !ok { t.Fatal("Monitor is ready") } // Send tick to make the monitor collect. now := time.Now().UTC() s.tickChan <- now got := test.WaitSystemConfig(s.reportChan, 1) if len(got) == 0 { t.Fatal("Got a sysconfig after tick") } c := got[0] if c.Ts != now.Unix() { t.Error("Report.Ts set to %s; got %s", now.Unix(), c.Ts) } if len(c.Settings) < 100 { t.Fatal("Collect > 100 vars; got %+v", c.Settings) } haveWaitTimeout := false val := "" for _, s := range c.Settings { if s[0] == "wait_timeout" { haveWaitTimeout = true val = s[1] } } if !haveWaitTimeout { t.Logf("%+v\n", c) t.Error("Got wait_timeout") } if val == "" { t.Error("wait_timeout has value") } /** * Stop the monitor. */ m.Stop() if ok := test.WaitStatus(5, m, s.name, "Stopped"); !ok { t.Fatal("Monitor has stopped") } }