Wavefront output should distinguish between retryable and non-retryable errors (#8404)

This commit is contained in:
Yuxuan 'fishy' Wang 2020-11-13 14:08:05 -08:00 committed by GitHub
parent ca041063d9
commit 18460e1825
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
1 changed files with 22 additions and 1 deletions

View File

@ -173,7 +173,10 @@ func (w *Wavefront) Write(metrics []telegraf.Metric) error {
for _, point := range w.buildMetrics(m) {
err := w.sender.SendMetric(point.Metric, point.Value, point.Timestamp, point.Source, point.Tags)
if err != nil {
return fmt.Errorf("Wavefront sending error: %s", err.Error())
if isRetryable(err) {
return fmt.Errorf("Wavefront sending error: %v", err)
}
w.Log.Errorf("non-retryable error during Wavefront.Write: %v", err)
}
}
}
@ -355,3 +358,21 @@ func init() {
}
})
}
// TODO: Currently there's no canonical way to exhaust all
// retryable/non-retryable errors from wavefront, so this implementation just
// handles known non-retryable errors in a case-by-case basis and assumes all
// other errors are retryable.
// A support ticket has been filed against wavefront to provide a canonical way
// to distinguish between retryable and non-retryable errors (link is not
// public).
func isRetryable(err error) bool {
if err != nil {
// "empty metric name" errors are non-retryable as retry will just keep
// getting the same error again and again.
if strings.Contains(err.Error(), "empty metric name") {
return false
}
}
return true
}