diff --git a/plugins/inputs/dovecot/dovecot.go b/plugins/inputs/dovecot/dovecot.go index ab5067534..fbc3b7905 100644 --- a/plugins/inputs/dovecot/dovecot.go +++ b/plugins/inputs/dovecot/dovecot.go @@ -93,7 +93,7 @@ func (d *Dovecot) gatherServer(addr string, acc telegraf.Accumulator, qtype stri c, err := net.DialTimeout(proto, addr, defaultTimeout) if err != nil { - return fmt.Errorf("enable to connect to dovecot server '%s': %s", addr, err) + return fmt.Errorf("unable to connect to dovecot server '%s': %s", addr, err) } defer c.Close() @@ -113,7 +113,12 @@ func (d *Dovecot) gatherServer(addr string, acc telegraf.Accumulator, qtype stri } var buf bytes.Buffer if _, err := io.Copy(&buf, c); err != nil { - return fmt.Errorf("copying message failed for dovecot server '%s': %s", addr, err) + // We need to accept the timeout here as reading from the connection will only terminate on EOF + // or on a timeout to happen. As EOF for TCP connections will only be sent on connection closing, + // the only way to get the whole message is to wait for the timeout to happen. + if nerr, ok := err.(net.Error); !ok || !nerr.Timeout() { + return fmt.Errorf("copying message failed for dovecot server '%s': %s", addr, err) + } } var host string