func (sink *WebsocketSink) Run(inputChan <-chan *logmessage.Message) { sink.logger.Debugf("Websocket Sink %s: Running for appId [%s]", sink.clientAddress, sink.appId) buffer := sinks.RunTruncatingBuffer(inputChan, sink.wsMessageBufferSize, sink.logger) for { sink.logger.Debugf("Websocket Sink %s: Waiting for activity", sink.clientAddress) message, ok := <-buffer.GetOutputChannel() if !ok { sink.logger.Debugf("Websocket Sink %s: Closed listener channel detected. Closing websocket", sink.clientAddress) return } sink.logger.Debugf("Websocket Sink %s: Got %d bytes. Sending data", sink.clientAddress, message.GetRawMessageLength()) err := sink.ws.WriteMessage(gorilla.BinaryMessage, message.GetRawMessage()) if err != nil { sink.logger.Debugf("Websocket Sink %s: Error when trying to send data to sink %s. Requesting close. Err: %v", sink.clientAddress, err) return } sink.logger.Debugf("Websocket Sink %s: Successfully sent data", sink.clientAddress) atomic.AddUint64(&sink.sentMessageCount, 1) atomic.AddUint64(&sink.sentByteCount, uint64(message.GetRawMessageLength())) } }
func (s *SyslogSink) Run(inputChan <-chan *logmessage.Message) { s.logger.Infof("Syslog Sink %s: Running.", s.drainUrl) defer s.logger.Errorf("Syslog Sink %s: Stopped. This should never happen", s.drainUrl) backoffStrategy := retrystrategy.NewExponentialRetryStrategy() numberOfTries := 0 buffer := sinks.RunTruncatingBuffer(inputChan, 100, s.logger) timer := time.NewTimer(backoffStrategy(numberOfTries)) defer timer.Stop() for { s.logger.Debugf("Syslog Sink %s: Starting loop. Current backoff: %v", s.drainUrl, backoffStrategy(numberOfTries)) timer.Reset(backoffStrategy(numberOfTries)) select { case <-s.disconnectChannel: return case <-timer.C: } if !s.syslogWriter.IsConnected() { s.logger.Debugf("Syslog Sink %s: Not connected. Trying to connect.", s.drainUrl) err := s.syslogWriter.Connect() if err != nil { errorMsg := fmt.Sprintf("Syslog Sink %s: Error when dialing out. Backing off for %v. Err: %v", s.drainUrl, backoffStrategy(numberOfTries+1), err) numberOfTries++ s.logger.Warnf(errorMsg) logMessage, err := logmessage.GenerateMessage(logmessage.LogMessage_ERR, errorMsg, s.appId, "LGR") if err == nil { s.errorChannel <- logMessage } else { s.logger.Warnf("Error marshalling message: %v", err) } continue } s.logger.Infof("Syslog Sink %s: successfully connected.", s.drainUrl) s.syslogWriter.SetConnected(true) numberOfTries = 0 defer s.syslogWriter.Close() } s.logger.Debugf("Syslog Sink %s: Waiting for activity\n", s.drainUrl) message, ok := <-buffer.GetOutputChannel() if !ok { s.logger.Debugf("Syslog Sink %s: Closed listener channel detected. Closing.\n", s.drainUrl) return } s.logger.Debugf("Syslog Sink %s: Got %d bytes. Sending data\n", s.drainUrl, message.GetRawMessageLength()) var err error switch message.GetLogMessage().GetMessageType() { case logmessage.LogMessage_OUT: _, err = s.syslogWriter.WriteStdout(message.GetLogMessage().GetMessage(), message.GetLogMessage().GetSourceName(), message.GetLogMessage().GetSourceId(), *message.GetLogMessage().Timestamp) case logmessage.LogMessage_ERR: _, err = s.syslogWriter.WriteStderr(message.GetLogMessage().GetMessage(), message.GetLogMessage().GetSourceName(), message.GetLogMessage().GetSourceId(), *message.GetLogMessage().Timestamp) } if err != nil { s.logger.Debugf("Syslog Sink %s: Error when trying to send data to sink. Backing off. Err: %v\n", s.drainUrl, err) numberOfTries++ s.syslogWriter.SetConnected(false) } else { s.logger.Debugf("Syslog Sink %s: Successfully sent data\n", s.drainUrl) numberOfTries = 0 atomic.AddUint64(s.sentMessageCount, 1) atomic.AddUint64(s.sentByteCount, uint64(message.GetRawMessageLength())) } } }