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 MIIFWDCCA0CgAwIBAgIRAMWnlYEx52Vws2b3EzexW+UwDQYJKoZIhvcNAQELBQAw 121 IDEeMBwGA1UEAxMVUHJvbXRhaWwgVGVzdCBSb290IENBMB4XDTIyMDYyOTA4MTQy 122 NFoXDTQyMDYyOTA4MTQyNFowKzEpMCcGA1UEAxMgUHJvbXRhaWwgVGVzdCBTZXJ2 123 ZXIgQ2VydGlmaWNhdGUwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQCo 124 8+m8sVjG2tvRqzFWD6XRwvWIV/7nOHhuL7ygdouTJ5MKjpKHSudOXOoxHw9aNA4u 125 zmExqlSD4RVnwb2R/nXoqO1Ae5VavkNngeDw5Uk/RacqF4WFCnmFNxh523iA4ifo 126 ZxmVhQoE1t3O4kMrygK2SEpSTY58PfuqLfd7ZyHDEmpu9pYfuQQCqKLOsVQS5mqY 127 g7gyKQQLq0D4beCsSuih09PskMiG29uh/qCdSmDDR++j42xP/fwXVGm3nsOMLjQf 128 1DFlZFqmQS42Da1KtnKzz+SVDSHihyRKiZ0KAyyDHYdKToFO/zYlCgFGw86o4VGu 129 HKbolE6oPrBnqdXyIf9cON4RdnoTrChG4E6yq4LN8XoNRloePjoGQ9huoqwGie3m 130 c06Pnj2eV4oCJwdLarKZqZzdJnanx+ctObAGGGjjV1ocNGFc2EMBpTFVpy20Kqd/ 131 E7t2yeGU6wJhzMNtvyFHhcOY+7PRTuvrUzbK1McFU/6NKBn4ioW2XBU8CjPEKGNx 132 itIZWnxppqkt2EemZEB+L1QpNtNlFmSYLqPm+j1134os3I3s+kkawiSjBcpqgzDf 133 stt64LiO/ULXDfPexbzE+mggQ3GsQ+b5v2O4KTQ4A4ilI48+0Qn3YxqfaVJmusGE 134 +Jkpo/Fnt3OCJaYBqsSzK5dIzF9TJhsOb+f5NGBJEQIDAQABo4GBMH8wDgYDVR0P 135 AQH/BAQDAgWgMB0GA1UdJQQWMBQGCCsGAQUFBwMBBggrBgEFBQcDAjAMBgNVHRMB 136 Af8EAjAAMB8GA1UdIwQYMBaAFFBj1+WwOdP8rb95R7kOmWena3RfMB8GA1UdEQQY 137 MBaCFHByb210YWlsLmV4YW1wbGUuY29tMA0GCSqGSIb3DQEBCwUAA4ICAQApSDHl 138 IECz4Ix+6zZqNU0DgulYTXcHKtnXEKRJVTULbKy/mWzE5ZAgVV0rpRLHbRg0fWYh 139 4tjd5X/Pedf4OtnpV6ekkvBf+QCKAmDiWN9rKhjdVoTFw0+wavQv1yzz8++2HenR 140 rgq7wWuwg0hB9/KKOWW09ZuBynjB7aeoWHztIbD+/cugMlzqDX8hODRl3OaEAwM3 141 PBpYEqFSuPBNrCK5Y0tGgzZDdsxrDYcX5CjJdrgwtZ1kFOT8J2VE+2Sqc7KMCPFl 142 LQmmtIcwjljNABf5d2L978tISFtwRoZVxrsTODqLLF8l6B7JUQdCpmoM+549E0cS 143 bpTj4FVftJwEpElMFMVw/Uh5pA7hOLGAK3YYqBx6fbEGHn+WmwLA5Io7tbBSKUX/ 144 hNlOFupAU3Q/OawqlmSPRflqKIg4b8TgSVlafJOFmvKg0WLGVuLtl65g9eNQVht9 145 KLlPPCPbpYKXpXya42eFazxEepOeaCkchOUB+x4tmAZ44NJTMR+UmiGLGCjdQTpU 146 m892bbGtLA0hGhYGrMsI546Xd8PjNI117CARrDpk57E1V+CsAO6ZTOPLgI4q976L 147 kWYB12V1t/BNtGyChdmfIYBqvTYAGk9hbqG80SjmcZtPu5JIEvIXCyaYXiWmEs2l 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 MIIFNTCCAx2gAwIBAgIQWzE3b7oUqYGe2UvYWJBnyDANBgkqhkiG9w0BAQsFADAg 209 MR4wHAYDVQQDExVQcm9tdGFpbCBUZXN0IFJvb3QgQ0EwHhcNMjIwNjI5MDgxNDI0 210 WhcNNDIwNjI5MDgxNDI0WjArMSkwJwYDVQQDEyBQcm9tdGFpbCBUZXN0IENsaWVu 211 dCBDZXJ0aWZpY2F0ZTCCAiIwDQYJKoZIhvcNAQEBBQADggIPADCCAgoCggIBALcQ 212 KhIIL7EZLIDWPMIkT5cJdPRavs5/LO50isCVs2z+PTA4mIkj2NEk8qFqgc3+1LUh 213 SV/NQ3p0LikSx9M6g1oBJbqQ7W6BcCzzUOHb4QlGoa2DXXGONPdO3AJxTTDNU6Li 214 xT5ESTbuDe56JDw3x2V0pxOzCUSuTMa1mvHnIojVn/8qHOZB0l4o9c44oHGJDUGh 215 o1wAc3UXGMLsd6IEYsHzLyG6kG7ayqToFftI/rkpEK8tCWMbclewh22c0OCXejEZ 216 pS9mz2decoIG7NnkqrRwUj+RPNlKJgBJ2USYimbQZHmdZWNb+vP/HFXs1Eq0sin+ 217 5HrRnzuB6yCwQlqvR7Db3buENEXG2OcglGmO/1mBfB4nW7JKFAvIqBBtHDRmBCYr 218 YS9htPiZte8Mfak3RncxLLccEzo1CNqtW9BLfryGH3l+6LR0yZkw+C95RZ9Wni4T 219 e5hy5yX8SW3z4AUb3ZYbFROW4sW/sSsh8VucZoa4OXw981OB4ZGrtJnncvc1KE5Q 220 BBF+bRZKdMQhzwb7pZq31kZjH0So53Ntyf4S6VHgUOTs8xorPSjnP85BKnnm7XsG 221 W/zP+kGCyjOCu4WIrNvSlIguF4KcVZulWbMljVCU0TwKNbxBm5SZrTXPoJeyRtE6 222 ai+fHPoMjJvwUaLYQUkzTpfdGg8OCV3NX/LvbCuVAgMBAAGjYDBeMA4GA1UdDwEB 223 /wQEAwIFoDAdBgNVHSUEFjAUBggrBgEFBQcDAQYIKwYBBQUHAwIwDAYDVR0TAQH/ 224 BAIwADAfBgNVHSMEGDAWgBRQY9flsDnT/K2/eUe5Dplnp2t0XzANBgkqhkiG9w0B 225 AQsFAAOCAgEAxJvDifKqK6EQrN5VPL68IPORu1VK17HeSJ2xLScL3Hh7vulPs9Nf 226 HLixcOhixsYhgurFZ3M3K05tT0EKy1K7WLJzJEhPccAkbz+d2oIeghksq2l75u20 227 t2o1X8rgT+/7d/j+VBur/+igQdwvylo+wgGNosX8VmjyQrZBWIHvDTyzrvODFbZa 228 JYf3DfgLSF5tr4e/HNLhynUD9G40CmRLQh7PkojrMXMyeqqWpBPzDBlZgvH2QMK8 229 K9S8KUuaZhGUTLQmkR3NP/bx1V/Ks1/BtpmdIchQ42w+Uu2PM/pmuZsnX7bK0tzd 230 zCFjgSIxifN8BKdcKMEngo+MwYy/Fj3vzy4qXxtOCbnzB+A/ziLiJV3Tsdwm+nPO 231 xZFcXXfnCMoNF0ouv2/WAbUrKLTZXL712MZ14JT79TkKxWZ49AUHSiGfm1I45iky 232 xgcn4FVgJpsCheRqL+gecNDyq+4VdwlWuFAuqMI4UBUbWwyAntOL1iiyENGA1ygo 233 OVuQq9M0bh93d5U+Ct79CsL4LLaoRrvBGJ6WnO8PKTTLqfFC3T8ySCtVGZiLoSqn 234 fJ1uhxhK8YSYhod+81/nkpJuF1xRg1t2kXgvUxPR9jzf96QaZ/94oryEH3zr59Rb 235 wmOulo1MN6yRdGzWiJ8sZ8VXUuh0xBCUiwrpo++Dda2s0bF0YzJGI6E= 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 }