From 8d2b1e8dc1899685657ccb99d72327dd29d8978e Mon Sep 17 00:00:00 2001 From: Mya Date: Wed, 28 Jul 2021 14:55:23 -0600 Subject: [PATCH] Fix metrics reported as written but not actually written (#9526) --- plugins/outputs/influxdb/http_test.go | 17 +++++++++++++++++ plugins/outputs/influxdb/influxdb.go | 24 ++++++++++++++---------- 2 files changed, 31 insertions(+), 10 deletions(-) diff --git a/plugins/outputs/influxdb/http_test.go b/plugins/outputs/influxdb/http_test.go index 39ac2b108..e19d8d2e5 100644 --- a/plugins/outputs/influxdb/http_test.go +++ b/plugins/outputs/influxdb/http_test.go @@ -1077,6 +1077,19 @@ func TestDBRPTagsCreateDatabaseCalledOnDatabaseNotFound(t *testing.T) { handlers := &MockHandlerChain{ handlers: []http.HandlerFunc{ + func(w http.ResponseWriter, r *http.Request) { + switch r.URL.Path { + case "/query": + if r.FormValue("q") != `CREATE DATABASE "telegraf"` { + w.WriteHeader(http.StatusInternalServerError) + return + } + w.WriteHeader(http.StatusForbidden) + w.Write([]byte(`{"results": [{"error": "error authorizing query"}]}`)) + default: + w.WriteHeader(http.StatusInternalServerError) + } + }, func(w http.ResponseWriter, r *http.Request) { switch r.URL.Path { case "/write": @@ -1133,8 +1146,12 @@ func TestDBRPTagsCreateDatabaseCalledOnDatabaseNotFound(t *testing.T) { err = output.Connect() require.NoError(t, err) + + // this write fails, but we're expecting it to drop the metrics and not retry, so no error. err = output.Write(metrics) require.NoError(t, err) + + // expects write to succeed err = output.Write(metrics) require.NoError(t, err) diff --git a/plugins/outputs/influxdb/influxdb.go b/plugins/outputs/influxdb/influxdb.go index 36b38a9c9..1ea39a5e5 100644 --- a/plugins/outputs/influxdb/influxdb.go +++ b/plugins/outputs/influxdb/influxdb.go @@ -1,3 +1,4 @@ +//nolint package influxdb import ( @@ -224,17 +225,20 @@ func (i *InfluxDB) Write(metrics []telegraf.Metric) error { switch apiError := err.(type) { case *DatabaseNotFoundError: - if !i.SkipDatabaseCreation { - allErrorsAreDatabaseNotFoundErrors = false - err := client.CreateDatabase(ctx, apiError.Database) - if err != nil { - i.Log.Errorf("When writing to [%s]: database %q not found and failed to recreate", - client.URL(), apiError.Database) - } else { - // try another client, if all clients fail with this error, do not return error - continue - } + if i.SkipDatabaseCreation { + continue } + // retry control + // error so the write is retried + err := client.CreateDatabase(ctx, apiError.Database) + if err != nil { + i.Log.Errorf("When writing to [%s]: database %q not found and failed to recreate", + client.URL(), apiError.Database) + } else { + return errors.New("database created; retry write") + } + default: + allErrorsAreDatabaseNotFoundErrors = false } }