Fix gzip support in socket_listener with tcp sockets (#7446)

This commit is contained in:
Daniel Nelson
2020-05-04 16:26:05 -07:00
committed by GitHub
parent f351e6a68f
commit d16485e1a3
4 changed files with 113 additions and 24 deletions

View File

@@ -111,7 +111,12 @@ func (ssl *streamSocketListener) read(c net.Conn) {
defer ssl.removeConnection(c)
defer c.Close()
scnr := bufio.NewScanner(c)
decoder, err := internal.NewStreamContentDecoder(ssl.ContentEncoding, c)
if err != nil {
ssl.Log.Error("Read error: %v", err)
}
scnr := bufio.NewScanner(decoder)
for {
if ssl.ReadTimeout != nil && ssl.ReadTimeout.Duration > 0 {
c.SetReadDeadline(time.Now().Add(ssl.ReadTimeout.Duration))
@@ -120,11 +125,7 @@ func (ssl *streamSocketListener) read(c net.Conn) {
break
}
body, err := ssl.decoder.Decode(scnr.Bytes())
if err != nil {
ssl.Log.Errorf("Unable to decode incoming line: %s", err.Error())
continue
}
body := scnr.Bytes()
metrics, err := ssl.Parse(body)
if err != nil {
@@ -149,6 +150,7 @@ func (ssl *streamSocketListener) read(c net.Conn) {
type packetSocketListener struct {
net.PacketConn
*SocketListener
decoder internal.ContentDecoder
}
func (psl *packetSocketListener) listen() {
@@ -196,7 +198,6 @@ type SocketListener struct {
parsers.Parser
telegraf.Accumulator
io.Closer
decoder internal.ContentDecoder
}
func (sl *SocketListener) Description() string {
@@ -283,12 +284,6 @@ func (sl *SocketListener) Start(acc telegraf.Accumulator) error {
protocol := spl[0]
addr := spl[1]
var err error
sl.decoder, err = internal.NewContentDecoder(sl.ContentEncoding)
if err != nil {
return err
}
if protocol == "unix" || protocol == "unixpacket" || protocol == "unixgram" {
// no good way of testing for "file does not exist".
// Instead just ignore error and blow up when we try to listen, which will
@@ -298,16 +293,12 @@ func (sl *SocketListener) Start(acc telegraf.Accumulator) error {
switch protocol {
case "tcp", "tcp4", "tcp6", "unix", "unixpacket":
var (
err error
l net.Listener
)
tlsCfg, err := sl.ServerConfig.TLSConfig()
if err != nil {
return err
}
var l net.Listener
if tlsCfg == nil {
l, err = net.Listen(protocol, addr)
} else {
@@ -344,6 +335,11 @@ func (sl *SocketListener) Start(acc telegraf.Accumulator) error {
ssl.listen()
}()
case "udp", "udp4", "udp6", "ip", "ip4", "ip6", "unixgram":
decoder, err := internal.NewContentDecoder(sl.ContentEncoding)
if err != nil {
return err
}
pc, err := udpListen(protocol, addr)
if err != nil {
return err
@@ -373,6 +369,7 @@ func (sl *SocketListener) Start(acc telegraf.Accumulator) error {
psl := &packetSocketListener{
PacketConn: pc,
SocketListener: sl,
decoder: decoder,
}
sl.Closer = psl

View File

@@ -222,7 +222,7 @@ func TestSocketListenerDecode_udp(t *testing.T) {
func testSocketListener(t *testing.T, sl *SocketListener, client net.Conn) {
mstr12 := []byte("test,foo=bar v=1i 123456789\ntest,foo=baz v=2i 123456790\n")
mstr3 := []byte("test,foo=zab v=3i 123456791")
mstr3 := []byte("test,foo=zab v=3i 123456791\n")
if sl.ContentEncoding == "gzip" {
encoder, err := internal.NewContentEncoder(sl.ContentEncoding)
@@ -238,10 +238,6 @@ func testSocketListener(t *testing.T, sl *SocketListener, client net.Conn) {
client.Write(mstr12)
client.Write(mstr3)
if client.LocalAddr().Network() != "udp" {
// stream connection. needs trailing newline to terminate mstr3
client.Write([]byte{'\n'})
}
acc := sl.Accumulator.(*testutil.Accumulator)