Add ability to label inputs for logging (#6207)
This commit is contained in:
@@ -6,7 +6,6 @@ import (
|
||||
"encoding/json"
|
||||
"fmt"
|
||||
"io"
|
||||
"log"
|
||||
"net"
|
||||
"net/http"
|
||||
"net/url"
|
||||
@@ -101,12 +100,15 @@ type HTTPConfig struct {
|
||||
|
||||
InfluxUintSupport bool `toml:"influx_uint_support"`
|
||||
Serializer *influx.Serializer
|
||||
log telegraf.Logger
|
||||
}
|
||||
|
||||
type httpClient struct {
|
||||
client *http.Client
|
||||
config HTTPConfig
|
||||
createdDatabases map[string]bool
|
||||
|
||||
log telegraf.Logger
|
||||
}
|
||||
|
||||
func NewHTTPClient(config HTTPConfig) (*httpClient, error) {
|
||||
@@ -174,6 +176,7 @@ func NewHTTPClient(config HTTPConfig) (*httpClient, error) {
|
||||
},
|
||||
createdDatabases: make(map[string]bool),
|
||||
config: config,
|
||||
log: config.log,
|
||||
}
|
||||
return client, nil
|
||||
}
|
||||
@@ -183,6 +186,10 @@ func (c *httpClient) URL() string {
|
||||
return c.config.URL.String()
|
||||
}
|
||||
|
||||
func (c *httpClient) SetLogger(log telegraf.Logger) {
|
||||
c.log = log
|
||||
}
|
||||
|
||||
// Database returns the default database that this client connects too.
|
||||
func (c *httpClient) Database() string {
|
||||
return c.config.Database
|
||||
@@ -262,7 +269,7 @@ func (c *httpClient) Write(ctx context.Context, metrics []telegraf.Metric) error
|
||||
if !c.config.SkipDatabaseCreation && !c.createdDatabases[db] {
|
||||
err := c.CreateDatabase(ctx, db)
|
||||
if err != nil {
|
||||
log.Printf("W! [outputs.influxdb] when writing to [%s]: database %q creation failed: %v",
|
||||
c.log.Warnf("when writing to [%s]: database %q creation failed: %v",
|
||||
c.config.URL, db, err)
|
||||
}
|
||||
}
|
||||
@@ -328,7 +335,7 @@ func (c *httpClient) writeBatch(ctx context.Context, db string, metrics []telegr
|
||||
// discarded for being older than the retention policy. Usually this not
|
||||
// a cause for concern and we don't want to retry.
|
||||
if strings.Contains(desc, errStringPointsBeyondRP) {
|
||||
log.Printf("W! [outputs.influxdb]: when writing to [%s]: received error %v",
|
||||
c.log.Warnf("when writing to [%s]: received error %v",
|
||||
c.URL(), desc)
|
||||
return nil
|
||||
}
|
||||
@@ -337,7 +344,7 @@ func (c *httpClient) writeBatch(ctx context.Context, db string, metrics []telegr
|
||||
// correctable at this point and so the point is dropped instead of
|
||||
// retrying.
|
||||
if strings.Contains(desc, errStringPartialWrite) {
|
||||
log.Printf("E! [outputs.influxdb]: when writing to [%s]: received error %v; discarding points",
|
||||
c.log.Errorf("when writing to [%s]: received error %v; discarding points",
|
||||
c.URL(), desc)
|
||||
return nil
|
||||
}
|
||||
@@ -345,7 +352,7 @@ func (c *httpClient) writeBatch(ctx context.Context, db string, metrics []telegr
|
||||
// This error indicates a bug in either Telegraf line protocol
|
||||
// serialization, retries would not be successful.
|
||||
if strings.Contains(desc, errStringUnableToParse) {
|
||||
log.Printf("E! [outputs.influxdb]: when writing to [%s]: received error %v; discarding points",
|
||||
c.log.Errorf("when writing to [%s]: received error %v; discarding points",
|
||||
c.URL(), desc)
|
||||
return nil
|
||||
}
|
||||
|
||||
@@ -21,6 +21,7 @@ import (
|
||||
"github.com/influxdata/telegraf/internal"
|
||||
"github.com/influxdata/telegraf/metric"
|
||||
"github.com/influxdata/telegraf/plugins/outputs/influxdb"
|
||||
"github.com/influxdata/telegraf/testutil"
|
||||
"github.com/stretchr/testify/require"
|
||||
)
|
||||
|
||||
@@ -471,6 +472,7 @@ func TestHTTP_Write(t *testing.T) {
|
||||
|
||||
client, err := influxdb.NewHTTPClient(tt.config)
|
||||
require.NoError(t, err)
|
||||
client.SetLogger(testutil.Logger{})
|
||||
err = client.Write(ctx, metrics)
|
||||
if tt.errFunc != nil {
|
||||
tt.errFunc(t, err)
|
||||
|
||||
@@ -4,7 +4,6 @@ import (
|
||||
"context"
|
||||
"errors"
|
||||
"fmt"
|
||||
"log"
|
||||
"math/rand"
|
||||
"net/url"
|
||||
"time"
|
||||
@@ -28,6 +27,7 @@ type Client interface {
|
||||
Database() string
|
||||
URL() string
|
||||
Close()
|
||||
SetLogger(telegraf.Logger)
|
||||
}
|
||||
|
||||
// InfluxDB struct is the primary data structure for the plugin
|
||||
@@ -59,6 +59,7 @@ type InfluxDB struct {
|
||||
CreateUDPClientF func(config *UDPConfig) (Client, error)
|
||||
|
||||
serializer *influx.Serializer
|
||||
Log telegraf.Logger
|
||||
}
|
||||
|
||||
var sampleConfig = `
|
||||
@@ -171,6 +172,8 @@ func (i *InfluxDB) Connect() error {
|
||||
return err
|
||||
}
|
||||
|
||||
c.SetLogger(i.Log)
|
||||
|
||||
i.clients = append(i.clients, c)
|
||||
case "http", "https", "unix":
|
||||
c, err := i.httpClient(ctx, parts, proxy)
|
||||
@@ -178,6 +181,8 @@ func (i *InfluxDB) Connect() error {
|
||||
return err
|
||||
}
|
||||
|
||||
c.SetLogger(i.Log)
|
||||
|
||||
i.clients = append(i.clients, c)
|
||||
default:
|
||||
return fmt.Errorf("unsupported scheme [%q]: %q", u, parts.Scheme)
|
||||
@@ -221,13 +226,13 @@ func (i *InfluxDB) Write(metrics []telegraf.Metric) error {
|
||||
if !i.SkipDatabaseCreation {
|
||||
err := client.CreateDatabase(ctx, apiError.Database)
|
||||
if err != nil {
|
||||
log.Printf("E! [outputs.influxdb] when writing to [%s]: database %q not found and failed to recreate",
|
||||
i.Log.Errorf("when writing to [%s]: database %q not found and failed to recreate",
|
||||
client.URL(), apiError.Database)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
log.Printf("E! [outputs.influxdb] when writing to [%s]: %v", client.URL(), err)
|
||||
i.Log.Errorf("when writing to [%s]: %v", client.URL(), err)
|
||||
}
|
||||
|
||||
return errors.New("could not write any address")
|
||||
@@ -281,7 +286,7 @@ func (i *InfluxDB) httpClient(ctx context.Context, url *url.URL, proxy *url.URL)
|
||||
if !i.SkipDatabaseCreation {
|
||||
err = c.CreateDatabase(ctx, c.Database())
|
||||
if err != nil {
|
||||
log.Printf("W! [outputs.influxdb] when writing to [%s]: database %q creation failed: %v",
|
||||
i.Log.Warnf("when writing to [%s]: database %q creation failed: %v",
|
||||
c.URL(), i.Database, err)
|
||||
}
|
||||
}
|
||||
|
||||
@@ -11,6 +11,7 @@ import (
|
||||
"github.com/influxdata/telegraf/internal/tls"
|
||||
"github.com/influxdata/telegraf/metric"
|
||||
"github.com/influxdata/telegraf/plugins/outputs/influxdb"
|
||||
"github.com/influxdata/telegraf/testutil"
|
||||
"github.com/stretchr/testify/require"
|
||||
)
|
||||
|
||||
@@ -20,6 +21,8 @@ type MockClient struct {
|
||||
CreateDatabaseF func(ctx context.Context, database string) error
|
||||
DatabaseF func() string
|
||||
CloseF func()
|
||||
|
||||
log telegraf.Logger
|
||||
}
|
||||
|
||||
func (c *MockClient) URL() string {
|
||||
@@ -42,6 +45,10 @@ func (c *MockClient) Close() {
|
||||
c.CloseF()
|
||||
}
|
||||
|
||||
func (c *MockClient) SetLogger(log telegraf.Logger) {
|
||||
c.log = log
|
||||
}
|
||||
|
||||
func TestDeprecatedURLSupport(t *testing.T) {
|
||||
var actual *influxdb.UDPConfig
|
||||
output := influxdb.InfluxDB{
|
||||
@@ -52,6 +59,9 @@ func TestDeprecatedURLSupport(t *testing.T) {
|
||||
return &MockClient{}, nil
|
||||
},
|
||||
}
|
||||
|
||||
output.Log = testutil.Logger{}
|
||||
|
||||
err := output.Connect()
|
||||
require.NoError(t, err)
|
||||
require.Equal(t, "udp://localhost:8089", actual.URL.String())
|
||||
@@ -72,6 +82,9 @@ func TestDefaultURL(t *testing.T) {
|
||||
}, nil
|
||||
},
|
||||
}
|
||||
|
||||
output.Log = testutil.Logger{}
|
||||
|
||||
err := output.Connect()
|
||||
require.NoError(t, err)
|
||||
require.Equal(t, "http://localhost:8086", actual.URL.String())
|
||||
@@ -89,6 +102,8 @@ func TestConnectUDPConfig(t *testing.T) {
|
||||
return &MockClient{}, nil
|
||||
},
|
||||
}
|
||||
output.Log = testutil.Logger{}
|
||||
|
||||
err := output.Connect()
|
||||
require.NoError(t, err)
|
||||
|
||||
@@ -130,6 +145,9 @@ func TestConnectHTTPConfig(t *testing.T) {
|
||||
}, nil
|
||||
},
|
||||
}
|
||||
|
||||
output.Log = testutil.Logger{}
|
||||
|
||||
err := output.Connect()
|
||||
require.NoError(t, err)
|
||||
|
||||
@@ -153,7 +171,6 @@ func TestConnectHTTPConfig(t *testing.T) {
|
||||
func TestWriteRecreateDatabaseIfDatabaseNotFound(t *testing.T) {
|
||||
output := influxdb.InfluxDB{
|
||||
URLs: []string{"http://localhost:8086"},
|
||||
|
||||
CreateHTTPClientF: func(config *influxdb.HTTPConfig) (influxdb.Client, error) {
|
||||
return &MockClient{
|
||||
DatabaseF: func() string {
|
||||
@@ -173,12 +190,13 @@ func TestWriteRecreateDatabaseIfDatabaseNotFound(t *testing.T) {
|
||||
},
|
||||
URLF: func() string {
|
||||
return "http://localhost:8086"
|
||||
|
||||
},
|
||||
}, nil
|
||||
},
|
||||
}
|
||||
|
||||
output.Log = testutil.Logger{}
|
||||
|
||||
err := output.Connect()
|
||||
require.NoError(t, err)
|
||||
|
||||
|
||||
@@ -5,7 +5,6 @@ import (
|
||||
"bytes"
|
||||
"context"
|
||||
"fmt"
|
||||
"log"
|
||||
"net"
|
||||
"net/url"
|
||||
|
||||
@@ -32,6 +31,7 @@ type UDPConfig struct {
|
||||
URL *url.URL
|
||||
Serializer *influx.Serializer
|
||||
Dialer Dialer
|
||||
Log telegraf.Logger
|
||||
}
|
||||
|
||||
func NewUDPClient(config UDPConfig) (*udpClient, error) {
|
||||
@@ -69,12 +69,18 @@ type udpClient struct {
|
||||
dialer Dialer
|
||||
serializer *influx.Serializer
|
||||
url *url.URL
|
||||
|
||||
log telegraf.Logger
|
||||
}
|
||||
|
||||
func (c *udpClient) URL() string {
|
||||
return c.url.String()
|
||||
}
|
||||
|
||||
func (c *udpClient) SetLogger(log telegraf.Logger) {
|
||||
c.log = log
|
||||
}
|
||||
|
||||
func (c *udpClient) Database() string {
|
||||
return ""
|
||||
}
|
||||
@@ -93,7 +99,7 @@ func (c *udpClient) Write(ctx context.Context, metrics []telegraf.Metric) error
|
||||
if err != nil {
|
||||
// Since we are serializing multiple metrics, don't fail the
|
||||
// entire batch just because of one unserializable metric.
|
||||
log.Printf("E! [outputs.influxdb] when writing to [%s] could not serialize metric: %v",
|
||||
c.log.Errorf("when writing to [%s] could not serialize metric: %v",
|
||||
c.URL(), err)
|
||||
continue
|
||||
}
|
||||
|
||||
@@ -14,6 +14,7 @@ import (
|
||||
"github.com/influxdata/telegraf"
|
||||
"github.com/influxdata/telegraf/metric"
|
||||
"github.com/influxdata/telegraf/plugins/outputs/influxdb"
|
||||
"github.com/influxdata/telegraf/testutil"
|
||||
"github.com/stretchr/testify/require"
|
||||
)
|
||||
|
||||
@@ -78,6 +79,7 @@ func TestUDP_URL(t *testing.T) {
|
||||
}
|
||||
|
||||
client, err := influxdb.NewUDPClient(config)
|
||||
client.SetLogger(testutil.Logger{})
|
||||
require.NoError(t, err)
|
||||
|
||||
require.Equal(t, u.String(), client.URL())
|
||||
@@ -101,6 +103,7 @@ func TestUDP_Simple(t *testing.T) {
|
||||
},
|
||||
}
|
||||
client, err := influxdb.NewUDPClient(config)
|
||||
client.SetLogger(testutil.Logger{})
|
||||
require.NoError(t, err)
|
||||
|
||||
ctx := context.Background()
|
||||
@@ -127,6 +130,7 @@ func TestUDP_DialError(t *testing.T) {
|
||||
},
|
||||
}
|
||||
client, err := influxdb.NewUDPClient(config)
|
||||
client.SetLogger(testutil.Logger{})
|
||||
require.NoError(t, err)
|
||||
|
||||
ctx := context.Background()
|
||||
@@ -156,6 +160,7 @@ func TestUDP_WriteError(t *testing.T) {
|
||||
},
|
||||
}
|
||||
client, err := influxdb.NewUDPClient(config)
|
||||
client.SetLogger(testutil.Logger{})
|
||||
require.NoError(t, err)
|
||||
|
||||
ctx := context.Background()
|
||||
@@ -219,6 +224,7 @@ func TestUDP_ErrorLogging(t *testing.T) {
|
||||
log.SetOutput(&b)
|
||||
|
||||
client, err := influxdb.NewUDPClient(tt.config)
|
||||
client.SetLogger(testutil.Logger{})
|
||||
require.NoError(t, err)
|
||||
|
||||
ctx := context.Background()
|
||||
@@ -262,6 +268,7 @@ func TestUDP_WriteWithRealConn(t *testing.T) {
|
||||
URL: u,
|
||||
}
|
||||
client, err := influxdb.NewUDPClient(config)
|
||||
client.SetLogger(testutil.Logger{})
|
||||
require.NoError(t, err)
|
||||
|
||||
ctx := context.Background()
|
||||
|
||||
Reference in New Issue
Block a user