func (s *WorkerTestSuite) RunWorker(job *qan.Job) string { w := qan.NewSlowLogWorker(s.logger, "qan-worker-1") result, _ := w.Run(job) // Write the result as formatted JSON to a file... tmpFilename := fmt.Sprintf("/tmp/pct-test.%d", os.Getpid()) test.WriteData(result, tmpFilename) return tmpFilename }
func (s *ManagerTestSuite) TestStartService(t *C) { /** * Create and start manager. */ m := qan.NewManager(s.logger, &mysql.RealConnectionFactory{}, s.clock, s.iterFactory, s.workerFactory, s.spool, s.im) t.Assert(m, NotNil) // Create the qan config. tmpFile := fmt.Sprintf("/tmp/qan_test.TestStartService.%d", os.Getpid()) defer func() { os.Remove(tmpFile) }() config := &qan.Config{ ServiceInstance: s.mysqlInstance, Start: []mysql.Query{ mysql.Query{Set: "SET GLOBAL slow_query_log=OFF"}, mysql.Query{Set: "SET GLOBAL long_query_time=0.123"}, mysql.Query{Set: "SET GLOBAL slow_query_log=ON"}, }, Stop: []mysql.Query{ mysql.Query{Set: "SET GLOBAL slow_query_log=OFF"}, mysql.Query{Set: "SET GLOBAL long_query_time=10"}, }, Interval: 300, // 5 min MaxSlowLogSize: 1073741824, // 1 GiB RemoveOldSlowLogs: true, ExampleQueries: true, MaxWorkers: 2, WorkerRunTime: 600, // 10 min } // Create the StartService cmd which contains the qan config. now := time.Now() qanConfig, _ := json.Marshal(config) cmd := &proto.Cmd{ User: "******", Ts: now, AgentUuid: "123", Service: "agent", Cmd: "StartService", Data: qanConfig, } // Have the service manager start the qa service reply := m.Handle(cmd) // It should start without error. t.Assert(reply.Error, Equals, "") // It should write the config to disk. data, err := ioutil.ReadFile(pct.Basedir.ConfigFile("qan")) t.Check(err, IsNil) gotConfig := &qan.Config{} err = json.Unmarshal(data, gotConfig) t.Check(err, IsNil) if same, diff := test.IsDeeply(gotConfig, config); !same { test.Dump(gotConfig) t.Error(diff) } // And status should be "Running" and "Idle". test.WaitStatus(1, m, "qan-log-parser", "Idle (0 of 2 running)") status := m.Status() t.Check(status["qan"], Equals, "Running") t.Check(status["qan-log-parser"], Equals, "Idle (0 of 2 running)") // It should have enabled the slow log. slowLog := s.realmysql.GetGlobalVarNumber("slow_query_log") t.Assert(slowLog, Equals, float64(1)) longQueryTime := s.realmysql.GetGlobalVarNumber("long_query_time") t.Assert(longQueryTime, Equals, 0.123) // Starting an already started service should result in a ServiceIsRunningError. reply = m.Handle(cmd) t.Check(reply.Error, Not(Equals), "") // It should add a tickChan for the interval iter. t.Check(s.clock.Added, HasLen, 1) t.Check(s.clock.Removed, HasLen, 0) /** * Have manager run a worker, parse, and send data. */ interv := &qan.Interval{ Filename: testlog.Sample + "slow001.log", StartOffset: 0, EndOffset: 524, StartTime: now, StopTime: now, } s.intervalChan <- interv v := test.WaitData(s.dataChan) t.Assert(v, HasLen, 1) report := v[0].(*qan.Report) result := &qan.Result{ StopOffset: report.StopOffset, Global: report.Global, Classes: report.Class, } test.WriteData(result, tmpFile) t.Check(tmpFile, testlog.FileEquals, sample+"slow001.json") /** * Send StopService cmd to stop qan/qan-log-parser. */ now = time.Now() cmd = &proto.Cmd{ User: "******", Ts: now, AgentUuid: "123", Service: "agent", Cmd: "StopService", } // Have the service manager start the qa service reply = m.Handle(cmd) // It should start without error. t.Assert(reply.Error, Equals, "") // It should disable the slow log. slowLog = s.realmysql.GetGlobalVarNumber("slow_query_log") t.Assert(slowLog, Equals, float64(0)) longQueryTime = s.realmysql.GetGlobalVarNumber("long_query_time") t.Assert(longQueryTime, Equals, 10.0) // It should remove the tickChan (and not have added others). t.Check(s.clock.Added, HasLen, 1) t.Check(s.clock.Removed, HasLen, 1) // qan still running, but qan-log-parser stopped. test.WaitStatus(1, m, "qan-log-parser", "Stopped") status = m.Status() t.Check(status["qan"], Equals, "Running") t.Check(status["qan-log-parser"], Equals, "Stopped") }