Add ability to label inputs for logging (#6207)

This commit is contained in:
Greg
2019-08-21 17:49:07 -06:00
committed by Daniel Nelson
parent bc52592c87
commit 5c8d0e3ac9
22 changed files with 475 additions and 103 deletions

View File

@@ -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
}

View File

@@ -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)

View File

@@ -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)
}
}

View File

@@ -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)

View File

@@ -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
}

View File

@@ -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()