Skip to content

Instantly share code, notes, and snippets.

@tedsuo
Last active August 7, 2018 20:00
Show Gist options
  • Select an option

  • Save tedsuo/1e99de0d465330526ff2 to your computer and use it in GitHub Desktop.

Select an option

Save tedsuo/1e99de0d465330526ff2 to your computer and use it in GitHub Desktop.
ifrit v2: Cleanup and simplification of boilerplate in main
// Old clunky way of setting up ifrit
package main
import ...
func main() {
logger := newLogger("example-service")
members := grouper.Members{
{"http_server", httpServer},
{"presence", initializeCellPresence(address, serviceClient, executorClient)},
{"bulker", harmonizer.NewBulker(logger, *pollingInterval, *evacuationPollingInterval)},
{"event-consumer", harmonizer.NewEventConsumer(logger, opGenerator, queue)},
{"evacuator", evacuator},
}
if dbgAddr := cf_debug_server.DebugAddress(flag.CommandLine); dbgAddr != "" {
members = append(grouper.Members{
{"debug-server", cf_debug_server.Runner(dbgAddr, reconfigurableSink)},
}, members...)
}
group := grouper.NewOrdered(os.Interrupt, members)
monitor := ifrit.Invoke(sigmon.New(group, os.Interrupt, unix.SIGUSR1))
logger.Info("started", lager.Data{"cell-id": *cellID})
err = <-monitor.Wait()
if err != nil {
logger.Error("exited-with-failure", err)
os.Exit(1)
}
logger.Info("exited")
}
// New hotness
package main
import ...
func main() {
// reusable logging boilerplate
logger := lager.NewLogger("example-service")
// grouper code moved to the ifrit package, signal option removed (always os.Interrupt)
group := ifrit.NewOrderedGroup(ifrit.Members{
// allow nil members that are ignored, like a disabled debug server
ifrit.NewMember("debug-server", cf_debug_server.Runner(dbgAddr, reconfigurableSink)),
ifrit.NewMember("http_server", httpServer),
ifrit.NewMember("presence", initializeCellPresence(address, serviceClient, executorClient)),
ifrit.NewMember("bulker", harmonizer.NewBulker(logger, *pollingInterval)),
ifrit.NewMember("event-consumer", harmonizer.NewEventConsumer(logger, opGenerator, queue)),
ifrit.NewMember("evacuator", evacuator}),
})
// Invoke and Background now take optional list of signals
process := ifrit.Invoke(group, os.Interrupt, unix.SIGUSR1)
logger.Info("started", lager.Data{"cell-id": *cellID})
err := <- process.Wait()
if err != nil {
logger.Error("exited-with-failure", err)
os.Exit(1)
}
logger.Info("exited")
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment