github.com/yankunsam/loki/v2@v2.6.3-0.20220817130409-389df5235c27/clients/pkg/promtail/targets/syslog/syslogtarget_test.go (about)

     1  package syslog
     2  
     3  import (
     4  	"crypto/tls"
     5  	"crypto/x509"
     6  	"fmt"
     7  	"io"
     8  	"io/ioutil"
     9  	"net"
    10  	"os"
    11  	"testing"
    12  	"time"
    13  	"unicode/utf8"
    14  
    15  	"github.com/go-kit/log"
    16  	"github.com/influxdata/go-syslog/v3"
    17  	promconfig "github.com/prometheus/common/config"
    18  	"github.com/prometheus/common/model"
    19  	"github.com/prometheus/prometheus/model/relabel"
    20  	"github.com/stretchr/testify/require"
    21  	"gopkg.in/yaml.v2"
    22  
    23  	"github.com/grafana/loki/clients/pkg/promtail/client/fake"
    24  	"github.com/grafana/loki/clients/pkg/promtail/scrapeconfig"
    25  	"github.com/grafana/loki/clients/pkg/promtail/targets/syslog/syslogparser"
    26  )
    27  
    28  var (
    29  	caCert = []byte(`
    30  -----BEGIN CERTIFICATE-----
    31  MIIFDTCCAvWgAwIBAgIRAL3YFsDcKtnEWCzE0qafwlQwDQYJKoZIhvcNAQELBQAw
    32  IDEeMBwGA1UEAxMVUHJvbXRhaWwgVGVzdCBSb290IENBMB4XDTIyMDYyOTA4MTQy
    33  MFoXDTQyMDYyOTA4MTQyMFowIDEeMBwGA1UEAxMVUHJvbXRhaWwgVGVzdCBSb290
    34  IENBMIICIjANBgkqhkiG9w0BAQEFAAOCAg8AMIICCgKCAgEA1wHnEwW3Gc1Q3v4F
    35  BgFL9N2rayHA7yFqViEwG8AiliaCnnN5VaAN29tpWMgr9sLpve5Ka8iCO8xnIxsM
    36  5rtlSvLlFW0SInXyJsBT6NyqHrk2GZBhscgT+Qb9ouSYjil4UFRADAAEhBZPVisO
    37  ZQiELKPS+BxyRL15QhMB7k7u1z0GRzlrG7CcopzrYM+4JLGE+2nXnoy7MSjdNduH
    38  w4sWwI66hD192Lpkh83HZneONXiZhJdEJOHHJ8G+rYwuZRAlnLs82y+OROIozuKV
    39  yFhWMk+BUGgkeftmAzIiUAneKwKugqz9QExVPo1imGAsiVHdprTTPn/34ZNpsDR7
    40  MXwzitVqvu/pa3BYDha7RTpeCdVPFqDs8BPFgcAleM75QQcnPtbUD/apJHUQ5D5q
    41  8c2U/2hTtcTMZIMCscoBBpx98bSOS9ojIJSGYKCdBj6rqnAFNYasayVCN5c5pPIw
    42  Mj7HUww4gKXVKMvNDnjaXqFBEgEjSv5cquZ993C8gVGHLiMnq/Bj5k9SeOD0gTKD
    43  /uLuLhKiMI6sOJQrYW5W0P3tTNcYGUeS0hBZW2Mo6PM+BimfzstZhsdFQnjzMEld
    44  I5elwqWKysEvxXIvLnGLVWXJ6s0Pyr6J0ASmxpjskQEcPgaOxkRVwNzC18eSq3Ey
    45  zUEWoyHiDedB4CCIq6nXY01FC5MCAwEAAaNCMEAwDgYDVR0PAQH/BAQDAgKkMA8G
    46  A1UdEwEB/wQFMAMBAf8wHQYDVR0OBBYEFFBj1+WwOdP8rb95R7kOmWena3RfMA0G
    47  CSqGSIb3DQEBCwUAA4ICAQDQtOpfNPrv+V8ObOb+pie//UfTReOwXtBZgTxMu1Bi
    48  uYIiFEveQ18HGAeIhbVm8wLjtfPkoJlZKzdCcMqSmLt0LZQNs13IQ8M+YuXeu5pX
    49  PJOu0WrbdQHW5JMnPxwKMk5T2axbrX9dYW9gvr8sh5OlnNTx88fY1vMBsnNLVZT+
    50  kC7Daf0zT0Go6VxBk6KRtfpoVCy/aYgwbJ1u5W61eYtXC4ezrpoLINo7zVs7Tob8
    51  iIxJMQ/iEk/7BbIgVh9z8lNeexdjXCqm8952pPhkGONneCESTxJjgYqXyhlV0ict
    52  OP+CiMHl5yf6+eklfXU78Jmkh/46XBqu7JV8lt8xbbSJ4AITWxi3csxC/Xztyu/g
    53  H5nS2gAmpAbTjHq7lGicFScBuR3g0o3+64KN3XhVXN1KFrTlsGSOxyPE657p2xNw
    54  tAAQs9IEBIPVqMInOGue6LbHTzCzW8hMClfu0CwPXiMY5DWKif7O9kzxnb9HdmAl
    55  gnDn+9OzTw7oAW1UyVTSbzYy0Tw1ioYR7U77Z+Gcst2+mIuWp7BFNkaX5mPaacCT
    56  GLnXoZk8UU0ph5/uBfZL3dNsJKeXlnCMAXACdLicnMC19g6P/dKqRZcI2w7kTPtF
    57  2GlKMYjeKDuAUc9VeGzDc6PAX4oqF8XPfP5Mie4nrtpYnL0zKV1RcUS1yX1TC24O
    58  ig==
    59  -----END CERTIFICATE-----
    60  `)
    61  
    62  	// Unused, but can be useful to (re)generate some certificates
    63  	// nolint:deadcode,unused,varcheck
    64  	caKey = []byte(`
    65  -----BEGIN RSA PRIVATE KEY-----
    66  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
   115  -----END RSA PRIVATE KEY-----
   116  `)
   117  
   118  	serverCert = []byte(`
   119  -----BEGIN CERTIFICATE-----
   120  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
   148  j1ieRNjgNYyG/7wJmilCsnpjbWza85/JzxE1cA==
   149  -----END CERTIFICATE-----
   150  `)
   151  
   152  	serverKey = []byte(`
   153  -----BEGIN RSA PRIVATE KEY-----
   154  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
   203  -----END RSA PRIVATE KEY-----
   204  `)
   205  
   206  	clientCert = []byte(`
   207  -----BEGIN CERTIFICATE-----
   208  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
   236  -----END CERTIFICATE-----
   237  `)
   238  	clientKey = []byte(`
   239  -----BEGIN RSA PRIVATE KEY-----
   240  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
   289  -----END RSA PRIVATE KEY-----
   290  `)
   291  )
   292  
   293  type formatFunc func(string) string
   294  
   295  var (
   296  	fmtOctetCounting = func(s string) string { return fmt.Sprintf("%d %s", len(s), s) }
   297  	fmtNewline       = func(s string) string { return s + "\n" }
   298  )
   299  
   300  func Benchmark_SyslogTarget(b *testing.B) {
   301  	for _, tt := range []struct {
   302  		name       string
   303  		protocol   string
   304  		formatFunc formatFunc
   305  	}{
   306  		{"tcp", protocolTCP, fmtOctetCounting},
   307  		{"udp", protocolUDP, fmtOctetCounting},
   308  	} {
   309  		tt := tt
   310  		b.Run(tt.name, func(b *testing.B) {
   311  			client := fake.New(func() {})
   312  
   313  			metrics := NewMetrics(nil)
   314  			tgt, _ := NewSyslogTarget(metrics, log.NewNopLogger(), client, []*relabel.Config{}, &scrapeconfig.SyslogTargetConfig{
   315  				ListenAddress:       "127.0.0.1:0",
   316  				ListenProtocol:      tt.protocol,
   317  				LabelStructuredData: true,
   318  				Labels: model.LabelSet{
   319  					"test": "syslog_target",
   320  				},
   321  			})
   322  			b.Cleanup(func() {
   323  				require.NoError(b, tgt.Stop())
   324  			})
   325  			require.Eventually(b, tgt.Ready, time.Second, 10*time.Millisecond)
   326  
   327  			addr := tgt.ListenAddress().String()
   328  
   329  			messages := []string{
   330  				`<165>1 2022-04-08T22:14:10.001Z host1 app - id1 [custom@32473 exkey="1"] An application event log entry...`,
   331  				`<165>1 2022-04-08T22:14:11.002Z host2 app - id2 [custom@32473 exkey="1"] An application event log entry...`,
   332  				`<165>1 2022-04-08T22:14:12.003Z host1 app - id3 [custom@32473 exkey="1"] An application event log entry...`,
   333  				`<165>1 2022-04-08T22:14:13.004Z host2 app - id4 [custom@32473 exkey="1"] An application event log entry...`,
   334  				`<165>1 2022-04-08T22:14:14.005Z host1 app - id5 [custom@32473 exkey="1"] An application event log entry...`,
   335  				`<165>1 2022-04-08T22:14:15.002Z host2 app - id6 [custom@32473 exkey="1"] An application event log entry...`,
   336  				`<165>1 2022-04-08T22:14:16.003Z host1 app - id7 [custom@32473 exkey="1"] An application event log entry...`,
   337  				`<165>1 2022-04-08T22:14:17.004Z host2 app - id8 [custom@32473 exkey="1"] An application event log entry...`,
   338  				`<165>1 2022-04-08T22:14:18.005Z host1 app - id9 [custom@32473 exkey="1"] An application event log entry...`,
   339  				`<165>1 2022-04-08T22:14:19.001Z host2 app - id10 [custom@32473 exkey="1"] An application event log entry...`,
   340  			}
   341  
   342  			b.ReportAllocs()
   343  			b.ResetTimer()
   344  
   345  			c, _ := net.Dial(tt.protocol, addr)
   346  			for n := 0; n < b.N; n++ {
   347  				_ = writeMessagesToStream(c, messages, tt.formatFunc)
   348  			}
   349  			c.Close()
   350  
   351  			require.Eventuallyf(b, func() bool {
   352  				return len(client.Received()) == len(messages)*b.N
   353  			}, 15*time.Second, time.Second, "expected: %d got:%d", len(messages)*b.N, len(client.Received()))
   354  
   355  		})
   356  	}
   357  }
   358  
   359  func TestSyslogTarget(t *testing.T) {
   360  	for _, tt := range []struct {
   361  		name     string
   362  		protocol string
   363  		fmtFunc  formatFunc
   364  	}{
   365  		{"tpc newline separated", protocolTCP, fmtNewline},
   366  		{"tpc octetcounting", protocolTCP, fmtOctetCounting},
   367  		{"udp newline separated", protocolUDP, fmtNewline},
   368  		{"udp octetcounting", protocolUDP, fmtOctetCounting},
   369  	} {
   370  		tt := tt
   371  		t.Run(tt.name, func(t *testing.T) {
   372  			w := log.NewSyncWriter(os.Stderr)
   373  			logger := log.NewLogfmtLogger(w)
   374  			client := fake.New(func() {})
   375  
   376  			metrics := NewMetrics(nil)
   377  			tgt, err := NewSyslogTarget(metrics, logger, client, relabelConfig(t), &scrapeconfig.SyslogTargetConfig{
   378  				MaxMessageLength:    1 << 12, // explicitly not use default value
   379  				ListenAddress:       "127.0.0.1:0",
   380  				ListenProtocol:      tt.protocol,
   381  				LabelStructuredData: true,
   382  				Labels: model.LabelSet{
   383  					"test": "syslog_target",
   384  				},
   385  			})
   386  			require.NoError(t, err)
   387  
   388  			require.Eventually(t, tgt.Ready, time.Second, 10*time.Millisecond)
   389  
   390  			addr := tgt.ListenAddress().String()
   391  			c, err := net.Dial(tt.protocol, addr)
   392  			require.NoError(t, err)
   393  
   394  			messages := []string{
   395  				`<165>1 2018-10-11T22:14:15.003Z host5 e - id1 [custom@32473 exkey="1"] An application event log entry...`,
   396  				`<165>1 2018-10-11T22:14:15.005Z host5 e - id2 [custom@32473 exkey="2"] An application event log entry...`,
   397  				`<165>1 2018-10-11T22:14:15.007Z host5 e - id3 [custom@32473 exkey="3"] An application event log entry...`,
   398  			}
   399  
   400  			err = writeMessagesToStream(c, messages, tt.fmtFunc)
   401  			require.NoError(t, err)
   402  			require.NoError(t, c.Close())
   403  
   404  			if tt.protocol == protocolUDP {
   405  				time.Sleep(time.Second)
   406  				require.NoError(t, tgt.Stop())
   407  			} else {
   408  				defer func() {
   409  					require.NoError(t, tgt.Stop())
   410  				}()
   411  			}
   412  
   413  			require.Eventuallyf(t, func() bool {
   414  				return len(client.Received()) == len(messages)
   415  			}, time.Second, 10*time.Millisecond, "Expected to receive %d messages.", len(messages))
   416  
   417  			labels := make([]model.LabelSet, 0, len(messages))
   418  			for _, entry := range client.Received() {
   419  				labels = append(labels, entry.Labels)
   420  			}
   421  			// we only check if one of the received entries contain the wanted label set
   422  			// because UDP does not guarantee the order of the messages
   423  			require.Contains(t, labels, model.LabelSet{
   424  				"test": "syslog_target",
   425  
   426  				"severity": "notice",
   427  				"facility": "local4",
   428  				"hostname": "host5",
   429  				"app_name": "e",
   430  				"msg_id":   "id1",
   431  
   432  				"sd_custom_exkey": "1",
   433  			})
   434  			require.Equal(t, "An application event log entry...", client.Received()[0].Line)
   435  
   436  			require.NotZero(t, client.Received()[0].Timestamp)
   437  		})
   438  	}
   439  }
   440  
   441  func relabelConfig(t *testing.T) []*relabel.Config {
   442  	relabelCfg := `
   443  - source_labels: ['__syslog_message_severity']
   444    target_label: 'severity'
   445  - source_labels: ['__syslog_message_facility']
   446    target_label: 'facility'
   447  - source_labels: ['__syslog_message_hostname']
   448    target_label: 'hostname'
   449  - source_labels: ['__syslog_message_app_name']
   450    target_label: 'app_name'
   451  - source_labels: ['__syslog_message_proc_id']
   452    target_label: 'proc_id'
   453  - source_labels: ['__syslog_message_msg_id']
   454    target_label: 'msg_id'
   455  - source_labels: ['__syslog_message_sd_custom_32473_exkey']
   456    target_label: 'sd_custom_exkey'
   457  `
   458  
   459  	var relabels []*relabel.Config
   460  	err := yaml.Unmarshal([]byte(relabelCfg), &relabels)
   461  	require.NoError(t, err)
   462  
   463  	return relabels
   464  }
   465  
   466  func writeMessagesToStream(w io.Writer, messages []string, formatter formatFunc) error {
   467  	for _, msg := range messages {
   468  		_, err := fmt.Fprint(w, formatter(msg))
   469  		if err != nil {
   470  			return err
   471  		}
   472  	}
   473  	return nil
   474  }
   475  
   476  func TestSyslogTarget_RFC5424Messages(t *testing.T) {
   477  	for _, tt := range []struct {
   478  		name     string
   479  		protocol string
   480  		fmtFunc  formatFunc
   481  	}{
   482  		{"tpc newline separated", protocolTCP, fmtNewline},
   483  		{"tpc octetcounting", protocolTCP, fmtOctetCounting},
   484  	} {
   485  		tt := tt
   486  		t.Run(tt.name, func(t *testing.T) {
   487  			w := log.NewSyncWriter(os.Stderr)
   488  			logger := log.NewLogfmtLogger(w)
   489  			client := fake.New(func() {})
   490  
   491  			metrics := NewMetrics(nil)
   492  			tgt, err := NewSyslogTarget(metrics, logger, client, []*relabel.Config{}, &scrapeconfig.SyslogTargetConfig{
   493  				ListenAddress:       "127.0.0.1:0",
   494  				ListenProtocol:      tt.protocol,
   495  				LabelStructuredData: true,
   496  				Labels: model.LabelSet{
   497  					"test": "syslog_target",
   498  				},
   499  				UseRFC5424Message: true,
   500  			})
   501  			require.NoError(t, err)
   502  			require.Eventually(t, tgt.Ready, time.Second, 10*time.Millisecond)
   503  			defer func() {
   504  				require.NoError(t, tgt.Stop())
   505  			}()
   506  
   507  			addr := tgt.ListenAddress().String()
   508  			c, err := net.Dial(tt.protocol, addr)
   509  			require.NoError(t, err)
   510  
   511  			messages := []string{
   512  				`<165>1 2018-10-11T22:14:15.003Z host5 e - id1 [custom@32473 exkey="1"] An application event log entry...`,
   513  				`<165>1 2018-10-11T22:14:15.005Z host5 e - id2 [custom@32473 exkey="2"] An application event log entry...`,
   514  				`<165>1 2018-10-11T22:14:15.007Z host5 e - id3 [custom@32473 exkey="3"] An application event log entry...`,
   515  			}
   516  
   517  			err = writeMessagesToStream(c, messages, tt.fmtFunc)
   518  			require.NoError(t, err)
   519  			require.NoError(t, c.Close())
   520  
   521  			require.Eventuallyf(t, func() bool {
   522  				return len(client.Received()) == len(messages)
   523  			}, time.Second, time.Millisecond, "Expected to receive %d messages, got %d.", len(messages), len(client.Received()))
   524  
   525  			for i := range messages {
   526  				require.Equal(t, model.LabelSet{
   527  					"test": "syslog_target",
   528  				}, client.Received()[i].Labels)
   529  				require.Contains(t, messages, client.Received()[i].Line)
   530  				require.NotZero(t, client.Received()[i].Timestamp)
   531  			}
   532  		})
   533  	}
   534  }
   535  
   536  func TestSyslogTarget_TLSConfigWithoutServerCertificate(t *testing.T) {
   537  	w := log.NewSyncWriter(os.Stderr)
   538  	logger := log.NewLogfmtLogger(w)
   539  	client := fake.New(func() {})
   540  
   541  	metrics := NewMetrics(nil)
   542  	_, err := NewSyslogTarget(metrics, logger, client, relabelConfig(t), &scrapeconfig.SyslogTargetConfig{
   543  		ListenAddress: "127.0.0.1:0",
   544  		TLSConfig: promconfig.TLSConfig{
   545  			KeyFile: "foo",
   546  		},
   547  	})
   548  	require.Error(t, err, "error setting up syslog target: certificate and key files are required")
   549  }
   550  
   551  func TestSyslogTarget_TLSConfigWithoutServerKey(t *testing.T) {
   552  	w := log.NewSyncWriter(os.Stderr)
   553  	logger := log.NewLogfmtLogger(w)
   554  	client := fake.New(func() {})
   555  
   556  	metrics := NewMetrics(nil)
   557  	_, err := NewSyslogTarget(metrics, logger, client, relabelConfig(t), &scrapeconfig.SyslogTargetConfig{
   558  		ListenAddress: "127.0.0.1:0",
   559  		TLSConfig: promconfig.TLSConfig{
   560  			CertFile: "foo",
   561  		},
   562  	})
   563  	require.Error(t, err, "error setting up syslog target: certificate and key files are required")
   564  }
   565  
   566  func TestSyslogTarget_TLSConfig(t *testing.T) {
   567  	t.Run("NewlineSeparatedMessages", func(t *testing.T) {
   568  		testSyslogTargetWithTLS(t, fmtNewline)
   569  	})
   570  	t.Run("OctetCounting", func(t *testing.T) {
   571  		testSyslogTargetWithTLS(t, fmtOctetCounting)
   572  	})
   573  }
   574  
   575  func testSyslogTargetWithTLS(t *testing.T, fmtFunc formatFunc) {
   576  	caCertPool := x509.NewCertPool()
   577  	caCertPool.AppendCertsFromPEM(caCert)
   578  
   579  	serverCertFile, err := createTempFile(serverCert)
   580  	if err != nil {
   581  		t.Fatalf("Unable to create server certificate temporary file: %s", err)
   582  	}
   583  	defer os.Remove(serverCertFile.Name())
   584  
   585  	serverKeyFile, err := createTempFile(serverKey)
   586  	if err != nil {
   587  		t.Fatalf("Unable to create server key temporary file: %s", err)
   588  	}
   589  	defer os.Remove(serverKeyFile.Name())
   590  
   591  	w := log.NewSyncWriter(os.Stderr)
   592  	logger := log.NewLogfmtLogger(w)
   593  	client := fake.New(func() {})
   594  
   595  	metrics := NewMetrics(nil)
   596  	tgt, err := NewSyslogTarget(metrics, logger, client, relabelConfig(t), &scrapeconfig.SyslogTargetConfig{
   597  		ListenAddress:       "127.0.0.1:0",
   598  		LabelStructuredData: true,
   599  		Labels: model.LabelSet{
   600  			"test": "syslog_target",
   601  		},
   602  		TLSConfig: promconfig.TLSConfig{
   603  			CertFile: serverCertFile.Name(),
   604  			KeyFile:  serverKeyFile.Name(),
   605  		},
   606  	})
   607  	require.NoError(t, err)
   608  	defer func() {
   609  		require.NoError(t, tgt.Stop())
   610  	}()
   611  
   612  	tlsConfig := tls.Config{
   613  		RootCAs:    caCertPool,
   614  		ServerName: "promtail.example.com",
   615  	}
   616  
   617  	addr := tgt.ListenAddress().String()
   618  	c, err := tls.Dial("tcp", addr, &tlsConfig)
   619  	require.NoError(t, err)
   620  
   621  	validMessages := []string{
   622  		`<165>1 2018-10-11T22:14:15.003Z host5 e - id1 [custom@32473 exkey="1"] An application event log entry...`,
   623  		`<165>1 2018-10-11T22:14:15.005Z host5 e - id2 [custom@32473 exkey="2"] An application event log entry...`,
   624  		`<165>1 2018-10-11T22:14:15.007Z host5 e - id3 [custom@32473 exkey="3"] An application event log entry...`,
   625  	}
   626  	// Messages that are malformed but still valid.
   627  	// This causes error messages being written, but the parser does not stop and close the connection.
   628  	malformeddMessages := []string{
   629  		`<165>1    -   An application event log entry...`,
   630  		`<165>1 2018-10-11T22:14:15.007Z host5 e -   An application event log entry...`,
   631  	}
   632  	messages := append(malformeddMessages, validMessages...)
   633  
   634  	err = writeMessagesToStream(c, messages, fmtFunc)
   635  	require.NoError(t, err)
   636  	require.NoError(t, c.Close())
   637  
   638  	require.Eventuallyf(t, func() bool {
   639  		return len(client.Received()) == len(validMessages)
   640  	}, time.Second, time.Millisecond, "Expected to receive %d messages, got %d.", len(validMessages), len(client.Received()))
   641  
   642  	require.Equal(t, model.LabelSet{
   643  		"test": "syslog_target",
   644  
   645  		"severity": "notice",
   646  		"facility": "local4",
   647  		"hostname": "host5",
   648  		"app_name": "e",
   649  		"msg_id":   "id1",
   650  
   651  		"sd_custom_exkey": "1",
   652  	}, client.Received()[0].Labels)
   653  	require.Equal(t, "An application event log entry...", client.Received()[0].Line)
   654  
   655  	require.NotZero(t, client.Received()[0].Timestamp)
   656  }
   657  
   658  func createTempFile(data []byte) (*os.File, error) {
   659  	tmpFile, err := ioutil.TempFile("", "")
   660  	if err != nil {
   661  		return nil, fmt.Errorf("failed to create temporary file: %s", err)
   662  	}
   663  
   664  	if _, err := tmpFile.Write(data); err != nil {
   665  		return nil, fmt.Errorf("failed to write data to temporary file: %s", err)
   666  	}
   667  
   668  	if err := tmpFile.Close(); err != nil {
   669  		return nil, err
   670  	}
   671  
   672  	return tmpFile, nil
   673  }
   674  
   675  func TestSyslogTarget_TLSConfigVerifyClientCertificate(t *testing.T) {
   676  	t.Run("NewlineSeparatedMessages", func(t *testing.T) {
   677  		testSyslogTargetWithTLSVerifyClientCertificate(t, fmtNewline)
   678  	})
   679  	t.Run("OctetCounting", func(t *testing.T) {
   680  		testSyslogTargetWithTLSVerifyClientCertificate(t, fmtOctetCounting)
   681  	})
   682  }
   683  
   684  func testSyslogTargetWithTLSVerifyClientCertificate(t *testing.T, fmtFunc formatFunc) {
   685  	caCertFile, err := createTempFile(caCert)
   686  	if err != nil {
   687  		t.Fatalf("Unable to create CA certificate temporary file: %s", err)
   688  	}
   689  	defer os.Remove(caCertFile.Name())
   690  
   691  	caCertPool := x509.NewCertPool()
   692  	caCertPool.AppendCertsFromPEM(caCert)
   693  
   694  	serverCertFile, err := createTempFile(serverCert)
   695  	if err != nil {
   696  		t.Fatalf("Unable to create server certificate temporary file: %s", err)
   697  	}
   698  	defer os.Remove(serverCertFile.Name())
   699  
   700  	serverKeyFile, err := createTempFile(serverKey)
   701  	if err != nil {
   702  		t.Fatalf("Unable to create server key temporary file: %s", err)
   703  	}
   704  	defer os.Remove(serverKeyFile.Name())
   705  
   706  	clientCertFile, err := createTempFile(clientCert)
   707  	if err != nil {
   708  		t.Fatalf("Unable to create client certificate temporary file: %s", err)
   709  	}
   710  	defer os.Remove(clientCertFile.Name())
   711  
   712  	clientKeyFile, err := createTempFile(clientKey)
   713  	if err != nil {
   714  		t.Fatalf("Unable to create client key temporary file: %s", err)
   715  	}
   716  	defer os.Remove(clientKeyFile.Name())
   717  
   718  	clientCerts, err := tls.LoadX509KeyPair(clientCertFile.Name(), clientKeyFile.Name())
   719  	if err != nil {
   720  		t.Fatalf("Unable to load client certificate or key: %s", err)
   721  	}
   722  
   723  	w := log.NewSyncWriter(os.Stderr)
   724  	logger := log.NewLogfmtLogger(w)
   725  	client := fake.New(func() {})
   726  
   727  	metrics := NewMetrics(nil)
   728  	tgt, err := NewSyslogTarget(metrics, logger, client, relabelConfig(t), &scrapeconfig.SyslogTargetConfig{
   729  		ListenAddress:       "127.0.0.1:0",
   730  		LabelStructuredData: true,
   731  		Labels: model.LabelSet{
   732  			"test": "syslog_target",
   733  		},
   734  		TLSConfig: promconfig.TLSConfig{
   735  			CAFile:   caCertFile.Name(),
   736  			CertFile: serverCertFile.Name(),
   737  			KeyFile:  serverKeyFile.Name(),
   738  		},
   739  	})
   740  	require.NoError(t, err)
   741  	defer func() {
   742  		require.NoError(t, tgt.Stop())
   743  	}()
   744  
   745  	tlsConfig := tls.Config{
   746  		RootCAs:    caCertPool,
   747  		ServerName: "promtail.example.com",
   748  	}
   749  
   750  	addr := tgt.ListenAddress().String()
   751  
   752  	t.Run("WithoutClientCertificate", func(t *testing.T) {
   753  		c, err := tls.Dial("tcp", addr, &tlsConfig)
   754  		require.NoError(t, err)
   755  
   756  		err = c.SetDeadline(time.Now().Add(time.Second))
   757  		require.NoError(t, err)
   758  
   759  		buf := make([]byte, 1)
   760  		_, err = c.Read(buf)
   761  		require.EqualError(t, err, "remote error: tls: bad certificate")
   762  	})
   763  
   764  	t.Run("WithClientCertificate", func(t *testing.T) {
   765  		tlsConfig.Certificates = []tls.Certificate{clientCerts}
   766  		c, err := tls.Dial("tcp", addr, &tlsConfig)
   767  		require.NoError(t, err)
   768  
   769  		messages := []string{
   770  			`<165>1 2018-10-11T22:14:15.003Z host5 e - id1 [custom@32473 exkey="1"] An application event log entry...`,
   771  			`<165>1 2018-10-11T22:14:15.005Z host5 e - id2 [custom@32473 exkey="2"] An application event log entry...`,
   772  			`<165>1 2018-10-11T22:14:15.007Z host5 e - id3 [custom@32473 exkey="3"] An application event log entry...`,
   773  		}
   774  
   775  		err = writeMessagesToStream(c, messages, fmtFunc)
   776  		require.NoError(t, err)
   777  		require.NoError(t, c.Close())
   778  
   779  		require.Eventuallyf(t, func() bool {
   780  			return len(client.Received()) == len(messages)
   781  		}, time.Second, time.Millisecond, "Expected to receive %d messages, got %d.", len(messages), len(client.Received()))
   782  
   783  		require.Equal(t, model.LabelSet{
   784  			"test": "syslog_target",
   785  
   786  			"severity": "notice",
   787  			"facility": "local4",
   788  			"hostname": "host5",
   789  			"app_name": "e",
   790  			"msg_id":   "id1",
   791  
   792  			"sd_custom_exkey": "1",
   793  		}, client.Received()[0].Labels)
   794  		require.Equal(t, "An application event log entry...", client.Received()[0].Line)
   795  
   796  		require.NotZero(t, client.Received()[0].Timestamp)
   797  	})
   798  }
   799  
   800  func TestSyslogTarget_InvalidData(t *testing.T) {
   801  	w := log.NewSyncWriter(os.Stderr)
   802  	logger := log.NewLogfmtLogger(w)
   803  	client := fake.New(func() {})
   804  	metrics := NewMetrics(nil)
   805  
   806  	tgt, err := NewSyslogTarget(metrics, logger, client, relabelConfig(t), &scrapeconfig.SyslogTargetConfig{
   807  		ListenAddress: "127.0.0.1:0",
   808  	})
   809  	require.NoError(t, err)
   810  	defer func() {
   811  		require.NoError(t, tgt.Stop())
   812  	}()
   813  
   814  	addr := tgt.ListenAddress().String()
   815  	c, err := net.Dial("tcp", addr)
   816  	require.NoError(t, err)
   817  	defer c.Close()
   818  
   819  	_, err = fmt.Fprint(c, "xxx")
   820  	require.NoError(t, err)
   821  
   822  	// syslog target should immediately close the connection if sent invalid data
   823  	err = c.SetDeadline(time.Now().Add(time.Second))
   824  	require.NoError(t, err)
   825  
   826  	buf := make([]byte, 1)
   827  	_, err = c.Read(buf)
   828  	require.EqualError(t, err, "EOF")
   829  }
   830  
   831  func TestSyslogTarget_NonUTF8Message(t *testing.T) {
   832  	w := log.NewSyncWriter(os.Stderr)
   833  	logger := log.NewLogfmtLogger(w)
   834  	client := fake.New(func() {})
   835  	metrics := NewMetrics(nil)
   836  
   837  	tgt, err := NewSyslogTarget(metrics, logger, client, relabelConfig(t), &scrapeconfig.SyslogTargetConfig{
   838  		ListenAddress: "127.0.0.1:0",
   839  	})
   840  	require.NoError(t, err)
   841  	defer func() {
   842  		require.NoError(t, tgt.Stop())
   843  	}()
   844  
   845  	addr := tgt.ListenAddress().String()
   846  	c, err := net.Dial("tcp", addr)
   847  	require.NoError(t, err)
   848  
   849  	msg1 := "Some non utf8 \xF8\xF7\xE3\xE4 characters"
   850  	require.False(t, utf8.ValidString(msg1), "msg must no be valid utf8")
   851  	msg2 := "\xF8 other \xF7\xE3\xE4 characters \xE3"
   852  	require.False(t, utf8.ValidString(msg2), "msg must no be valid utf8")
   853  
   854  	err = writeMessagesToStream(c, []string{
   855  		"<165>1 - - - - - - " + msg1,
   856  		"<123>1 - - - - - - " + msg2,
   857  	}, fmtOctetCounting)
   858  	require.NoError(t, err)
   859  	require.NoError(t, c.Close())
   860  
   861  	require.Eventuallyf(t, func() bool {
   862  		return len(client.Received()) == 2
   863  	}, time.Second, time.Millisecond, "Expected to receive 2 messages, got %d.", len(client.Received()))
   864  
   865  	require.Equal(t, msg1, client.Received()[0].Line)
   866  	require.Equal(t, msg2, client.Received()[1].Line)
   867  }
   868  
   869  func TestSyslogTarget_IdleTimeout(t *testing.T) {
   870  	w := log.NewSyncWriter(os.Stderr)
   871  	logger := log.NewLogfmtLogger(w)
   872  	client := fake.New(func() {})
   873  	metrics := NewMetrics(nil)
   874  
   875  	tgt, err := NewSyslogTarget(metrics, logger, client, relabelConfig(t), &scrapeconfig.SyslogTargetConfig{
   876  		ListenAddress: "127.0.0.1:0",
   877  		IdleTimeout:   time.Millisecond,
   878  	})
   879  	require.NoError(t, err)
   880  	defer func() {
   881  		require.NoError(t, tgt.Stop())
   882  	}()
   883  
   884  	addr := tgt.ListenAddress().String()
   885  	c, err := net.Dial("tcp", addr)
   886  	require.NoError(t, err)
   887  	defer c.Close()
   888  
   889  	// connection should be closed before the higher timeout
   890  	// from SetDeadline fires
   891  	err = c.SetDeadline(time.Now().Add(time.Second))
   892  	require.NoError(t, err)
   893  
   894  	buf := make([]byte, 1)
   895  	_, err = c.Read(buf)
   896  	require.EqualError(t, err, "EOF")
   897  }
   898  
   899  func TestParseStream_WithAsyncPipe(t *testing.T) {
   900  	lines := [3]string{
   901  		"<165>1 2018-10-11T22:14:15.003Z host5 e - id1 [custom@32473 exkey=\"1\"] An application event log entry...\n",
   902  		"<165>1 2018-10-11T22:14:15.005Z host5 e - id2 [custom@32473 exkey=\"2\"] An application event log entry...\n",
   903  		"<165>1 2018-10-11T22:14:15.007Z host5 e - id3 [custom@32473 exkey=\"3\"] An application event log entry...\n",
   904  	}
   905  
   906  	addr := &net.UDPAddr{IP: net.IP{127, 0, 0, 1}, Port: 1514}
   907  	pipe := NewConnPipe(addr)
   908  	go func() {
   909  		for _, line := range lines {
   910  			_, _ = pipe.Write([]byte(line))
   911  		}
   912  		pipe.Close()
   913  	}()
   914  
   915  	results := make([]*syslog.Result, 0)
   916  	cb := func(res *syslog.Result) {
   917  		results = append(results, res)
   918  	}
   919  
   920  	err := syslogparser.ParseStream(pipe, cb, defaultMaxMessageLength)
   921  	require.NoError(t, err)
   922  	require.Equal(t, 3, len(results))
   923  }