func initEventProcessing(mdConn *amqp.Connection, numWorkers int, errCh chan error) error { err := qproc.ProcessQueue(mdConn, "grafana_events", "topic", "eventQueue", "EVENT.#", true, false, false, errCh, processEvent, numWorkers) if err != nil { return err } return nil }
func main() { if setting.Config.ExpvarAddr != "" { go func() { err := http.ListenAndServe(setting.Config.ExpvarAddr, nil) if err != nil { fmt.Println("Error starting expvar http listener:", err.Error()) os.Exit(1) } }() } // First fire up a queue to consume metric def events mdConn, err := amqp.Dial(setting.Config.RabbitMQURL) if err != nil { logger.Criticalf(err.Error()) os.Exit(1) } defer mdConn.Close() logger.Debugf("connected") done := make(chan error, 1) var numCPU int if setting.Config.NumWorkers != 0 { numCPU = setting.Config.NumWorkers } else { numCPU = runtime.NumCPU() } err = qproc.ProcessQueue(mdConn, "metrics", "topic", "", "metrics.*", false, true, true, done, processMetricDefEvent, numCPU) if err != nil { logger.Criticalf(err.Error()) os.Exit(1) } err = qproc.ProcessQueue(mdConn, "metricResults", "x-consistent-hash", "", "10", false, true, true, done, processMetrics, numCPU) if err != nil { logger.Criticalf(err.Error()) os.Exit(1) } err = initEventProcessing(mdConn, numCPU, done) if err != nil { logger.Criticalf(err.Error()) os.Exit(1) } // Signal handling. If SIGQUIT is received, print out the current // stack. Otherwise if SIGINT or SIGTERM are received clean up and exit // in an orderly fashion. go func() { sigs := make(chan os.Signal, 1) signal.Notify(sigs, syscall.SIGQUIT, os.Interrupt, syscall.SIGTERM) buf := make([]byte, 1<<20) for sig := range sigs { if sig == syscall.SIGQUIT { // print out the current stack on SIGQUIT runtime.Stack(buf, true) log.Printf("=== received SIGQUIT ===\n*** goroutine dump...\n%s\n*** end\n", buf) } else { // finish our existing work, clean up, and exit // in an orderly fashion logger.Infof("Closing rabbitmq connection") cerr := mdConn.Close() if cerr != nil { logger.Errorf("Received error closing rabbitmq connection: %s", cerr.Error()) } logger.Infof("Closing processing buffer channel") close(bufCh) } } }() // this channel returns when one of the workers exits. err = <-done logger.Criticalf("all done!", err) if err != nil { logger.Criticalf("Had an error, aiiieeee! '%s'", err.Error()) } }