func (l *LogMessageUnmarshaller) Start(errorChan chan<- error) { defer close(l.outgoingMessages) for messageBytes := range l.incomingBytes { message, err := logmessage.ParseEnvelope(messageBytes, l.secret) if err != nil { errorChan <- err continue } l.outgoingMessages <- message } }
func (l *LogMessageUnmarshaller) Start(errorChan chan<- error) { defer close(l.outgoingMessages) cfcomponent.Logger.Debug("LogMessageUnmarshaller: Starting") for messageBytes := range l.incomingBytes { cfcomponent.Logger.Debug("LogMessageUnmarshaller: Parsing a message") message, err := logmessage.ParseEnvelope(messageBytes, l.secret) if err != nil { cfcomponent.Logger.Debugf("LogMessageUnmarshaller: Error while parsing a message %s", err) errorChan <- err continue } l.outgoingMessages <- message cfcomponent.Logger.Debug("LogMessageUnmarshaller: Sent a message") } }
func UnmarshallerMaker(secret string) func([]byte) (*logmessage.Message, error) { return func(data []byte) (*logmessage.Message, error) { return logmessage.ParseEnvelope(data, secret) } }
func main() { seed := time.Now().UnixNano() rand.Seed(seed) flag.Parse() if *version { fmt.Printf("version: %s\ngitSha: %s\nsourceUrl: https://github.com/cloudfoundry/loggregator/tree/%s\n\n", versionNumber, gitSha, gitSha) return } runtime.GOMAXPROCS(runtime.NumCPU()) config, logger := parseConfig(logLevel, configFile, logFilePath) err := config.validate(logger) if err != nil { panic(err) } agentListener := agentlistener.NewAgentListener(fmt.Sprintf("0.0.0.0:%d", config.IncomingPort), logger) incomingLogChan := agentListener.Start() sinkManager := sinkserver.NewSinkManager(config.MaxRetainedLogMessages, config.SkipCertVerify, config.BlackListIps, logger) go sinkManager.Start() unmarshaller := func(data []byte) (*logmessage.Message, error) { return logmessage.ParseEnvelope(data, config.SharedSecret) } messageChannelLength := 2048 messageRouter := sinkserver.NewMessageRouter(incomingLogChan, unmarshaller, sinkManager, messageChannelLength, logger) apiEndpoint := fmt.Sprintf("0.0.0.0:%d", config.OutgoingPort) keepAliveInterval := 30 * time.Second websocketServer := sinkserver.NewWebsocketServer(apiEndpoint, sinkManager, keepAliveInterval, config.WSMessageBufferSize, logger) cfc, err := cfcomponent.NewComponent( logger, "LoggregatorServer", config.Index, &LoggregatorServerHealthMonitor{}, config.VarzPort, []string{config.VarzUser, config.VarzPass}, []instrumentation.Instrumentable{agentListener, sinkManager, messageRouter}, ) if err != nil { panic(err) } cr := collectorregistrar.NewCollectorRegistrar(config.MbusClient, logger) err = cr.RegisterWithCollector(cfc) if err != nil { logger.Warnf("Unable to register with collector. Err: %v.", err) } go func() { err := cfc.StartMonitoringEndpoints() if err != nil { panic(err) } }() go messageRouter.Start() go websocketServer.Start() killChan := make(chan os.Signal) signal.Notify(killChan, os.Kill) for { select { case <-cfcomponent.RegisterGoRoutineDumpSignalChannel(): cfcomponent.DumpGoRoutine() case <-killChan: break } } }
func main() { seed := time.Now().UnixNano() rand.Seed(seed) flag.Parse() if *version { fmt.Printf("version: %s\ngitSha: %s\nsourceUrl: https://github.com/cloudfoundry/loggregator/tree/%s\n\n", versionNumber, gitSha, gitSha) return } runtime.GOMAXPROCS(runtime.NumCPU()) config := &Config{IncomingPort: 3456, OutgoingPort: 8080} err := cfcomponent.ReadConfigInto(config, *configFile) if err != nil { panic(err) } logger := cfcomponent.NewLogger(*logLevel, *logFilePath, "loggregator", config.Config) logger.Info("Startup: Setting up the loggregator server") err = config.validate(logger) if err != nil { panic(err) } listener := agentlistener.NewAgentListener(fmt.Sprintf("0.0.0.0:%d", config.IncomingPort), logger) incomingData := listener.Start() messageRouter := sinkserver.NewMessageRouter(config.MaxRetainedLogMessages, logger) unmarshaller := func(data []byte) (*logmessage.Message, error) { return logmessage.ParseEnvelope(data, config.SharedSecret) } httpServer := sinkserver.NewHttpServer(messageRouter, 30*time.Second, unmarshaller, logger) cfc, err := cfcomponent.NewComponent( logger, "LoggregatorServer", config.Index, &LoggregatorServerHealthMonitor{}, config.VarzPort, []string{config.VarzUser, config.VarzPass}, []instrumentation.Instrumentable{listener, messageRouter}, ) if err != nil { panic(err) } cr := collectorregistrar.NewCollectorRegistrar(config.MbusClient, logger) err = cr.RegisterWithCollector(cfc) if err != nil { logger.Warnf("Unable to register with collector. Err: %v.", err) } go func() { err := cfc.StartMonitoringEndpoints() if err != nil { panic(err) } }() go messageRouter.Start() go httpServer.Start(incomingData, fmt.Sprintf("0.0.0.0:%d", config.OutgoingPort)) killChan := make(chan os.Signal) signal.Notify(killChan, os.Kill) for { select { case <-cfcomponent.RegisterGoRoutineDumpSignalChannel(): cfcomponent.DumpGoRoutine() case <-killChan: break } } }