// publish is used to publish events using the configured protocol client. // It provides general error handling and back off support used on failed // send attempts. To be used by PublishEvent and PublishEvents. // The send callback will try to progress sending traffic and returns kind of // progress made in ok or resetFail. If ok is set to true, send finished // processing events. If ok is false but resetFail is set, send was partially // successful. If send was partially successful, the fail counter is reset thus up // to maxAttempts send attempts without any progress might be executed. func (s *Mode) publish( signaler op.Signaler, opts outputs.Options, send func() (ok bool, resetFail bool), ) error { fails := 0 var err error guaranteed := opts.Guaranteed || s.maxAttempts == 0 for !s.closed && (guaranteed || fails < s.maxAttempts) { ok := false resetFail := false if err := s.connect(); err != nil { logp.Err("Connecting error publishing events (retrying): %s", err) goto sendFail } ok, resetFail = send() if !ok { s.closeClient() goto sendFail } debugf("send completed") s.backoff.Reset() op.SigCompleted(signaler) return nil sendFail: debugf("send fail") fails++ if resetFail { debugf("reset fails") s.backoff.Reset() fails = 0 } s.backoff.Wait() if !guaranteed && (s.maxAttempts > 0 && fails == s.maxAttempts) { // max number of attempts reached debugf("max number of attempts reached") break } } debugf("messages dropped") mode.Dropped(1) op.SigFailed(signaler, err) return nil }
// dropping is called when a message is dropped. It updates the // relevant counters and sends a failed signal. func dropping(msg eventsMessage) { debugf("messages dropped") mode.Dropped(1) op.SigFailed(msg.signaler, nil) }