github.com/GuanceCloud/cliutils@v1.1.21/pipeline/ptinput/funcs/fn_addpattern_test.go (about) 1 // Unless explicitly stated otherwise all files in this repository are licensed 2 // under the MIT License. 3 // This product includes software developed at Guance Cloud (https://www.guance.com/). 4 // Copyright 2021-present Guance, Inc. 5 6 package funcs 7 8 import ( 9 "testing" 10 "time" 11 12 "github.com/GuanceCloud/cliutils/pipeline/ptinput" 13 "github.com/GuanceCloud/cliutils/point" 14 "github.com/stretchr/testify/assert" 15 ) 16 17 func TestAddPattern(t *testing.T) { 18 cases := []struct { 19 name, pl, in string 20 outkey string 21 expect interface{} 22 fail bool 23 }{ 24 { 25 name: "pattern: http version (-s)", 26 in: `162.62.81.1 - - [29/Nov/2021:07:30:50 +0000] "POST /?signature=b8d8ea×tamp=1638171049 HTTP/1.1" 200 413 "-" "Mozilla/4.0"`, 27 pl: ` 28 add_pattern("http_version", "[\\d\\.]+") 29 grok(_, "%{IPORHOST:client_ip} %{NOTSPACE} %{NOTSPACE} \\[%{HTTPDATE:time}\\] \"%{DATA} %{GREEDYDATA} HTTP/%{http_version:http_version}\" %{INT:status_code} %{INT:bytes}") 30 cast(http_version, "float") 31 `, 32 outkey: "http_version", 33 expect: 1.1, 34 fail: false, 35 }, 36 { 37 name: "pattern: http version (-d)", 38 in: `162.62.81.1 - - [29/Nov/2021:07:30:50 +0000] "POST /?signature=b8d8ea×tamp=1638171049 HTTP/1.1" 200 413 "-" "Mozilla/4.0"`, 39 pl: ` 40 add_pattern("num", "\\d") 41 add_pattern("http_version", "[%{num}\\.]+") 42 grok(_, "%{IPORHOST:client_ip} %{NOTSPACE} %{NOTSPACE} \\[%{HTTPDATE:time}\\] \"%{DATA} %{GREEDYDATA} HTTP/%{http_version:http_version}\" %{INT:status_code} %{INT:bytes}") 43 cast(http_version, "float") 44 `, 45 outkey: "http_version", 46 expect: 1.1, 47 fail: false, 48 }, 49 { 50 name: "pattern: http version (-o)", 51 in: `162.62.81.1 - - [29/Nov/2021:07:30:50 +0000] "POST /?signature=b8d8ea×tamp=1638171049 HTTP/1.1" 200 413 "-" "Mozilla/4.0"`, 52 pl: ` 53 add_pattern("num", "\\d") 54 add_pattern("http_version", "\\d") 55 add_pattern("http_version", "[%{num}\\.]+") 56 grok(_, "%{IPORHOST:client_ip} %{NOTSPACE} %{NOTSPACE} \\[%{HTTPDATE:time}\\] \"%{DATA} %{GREEDYDATA} HTTP/%{http_version:http_version}[\\.\\d]+\" %{INT:status_code} %{INT:bytes}") 57 cast(http_version, "float") 58 `, 59 outkey: "http_version", 60 expect: float64(1), 61 fail: false, 62 }, 63 { 64 name: "pattern: http version (-fd)", 65 in: `162.62.81.1 - - [29/Nov/2021:07:30:50 +0000] "POST /?signature=b8d8ea×tamp=1638171049 HTTP/1.1" 200 413 "-" "Mozilla/4.0"`, 66 pl: ` 67 add_pattern("_num", "\\d") 68 add_pattern("http_version", "[%{_num}\\.]+") 69 grok(_, "%{IPORHOST:client_ip} %{NOTSPACE} %{NOTSPACE} \\[%{HTTPDATE:time}\\] \"%{DATA} %{GREEDYDATA} HTTP/%{http_version:http_version}\" %{INT:status_code} %{INT:bytes}") 70 cast(http_version, "float") 71 `, 72 outkey: "http_version", 73 expect: float64(1.1), 74 fail: false, 75 }, 76 { 77 name: "pattern: http version (-fu)", 78 in: `162.62.81.1 - - [29/Nov/2021:07:30:50 +0000] "POST /?signature=b8d8ea×tamp=1638171049 HTTP/1.1" 200 413 "-" "Mozilla/4.0"`, 79 pl: ` 80 add_pattern("Num", "\\d") 81 add_pattern("http_version", "[%{Num}\\.]+") 82 grok(_, "%{IPORHOST:client_ip} %{NOTSPACE} %{NOTSPACE} \\[%{HTTPDATE:time}\\] \"%{DATA} %{GREEDYDATA} HTTP/%{http_version:http_version}\" %{INT:status_code} %{INT:bytes}") 83 cast(http_version, "float") 84 `, 85 outkey: "http_version", 86 expect: float64(1.1), 87 fail: false, 88 }, 89 { 90 name: "pattern: http version (-fn)", 91 in: `162.62.81.1 - - [29/Nov/2021:07:30:50 +0000] "POST /?signature=b8d8ea×tamp=1638171049 HTTP/1.1" 200 413 "-" "Mozilla/4.0"`, 92 pl: ` 93 add_pattern("1Num", "\\d") 94 add_pattern("http_version", "[%{1Num}\\.]+") 95 grok(_, "%{IPORHOST:client_ip} %{NOTSPACE} %{NOTSPACE} \\[%{HTTPDATE:time}\\] \"%{DATA} %{GREEDYDATA} HTTP/%{http_version:http_version}\" %{INT:status_code} %{INT:bytes}") 96 cast(http_version, "float") 97 `, 98 outkey: "http_version", 99 expect: float64(1.1), 100 fail: false, 101 }, 102 { 103 name: "pattern: http version (-opm)", // 测试替换部分 global pattern 可被替换 104 in: `162.62.81.1 - - [29/Nov/2021:07:30:50 +0000] "POST /?signature=b8d8ea×tamp=1638171049 HTTP/1.1" 200 413 "-" "Mozilla/4.0"`, 105 pl: ` 106 add_pattern("NUMBER", "\\d") 107 grok(_, "%{IPORHOST:client_ip} %{NOTSPACE} %{NOTSPACE} \\[%{HTTPDATE:time}\\] \"%{DATA} %{GREEDYDATA} HTTP/%{NUMBER:http_version}.*\" %{INT:status_code} %{INT:bytes}") 108 cast(http_version, "float") 109 `, 110 outkey: "http_version", 111 expect: float64(1), 112 fail: false, 113 }, 114 { 115 name: "pattern: http version (-opm2)", 116 in: `162.62.81.1 - - [29/Nov/2021:07:30:50 +0000] "POST /?signature=b8d8ea×tamp=1638171049 HTTP/1.1" 200 413 "-" "Mozilla/4.0"`, 117 pl: ` 118 add_pattern("numb2", "%{NUMBER}") 119 grok(_, "%{IPORHOST:client_ip} %{NOTSPACE} %{NOTSPACE} \\[%{HTTPDATE:time}\\] \"%{DATA} %{GREEDYDATA} HTTP/%{numb2:http_version}.*\" %{INT:status_code} %{INT:bytes}") 120 cast(http_version, "float") 121 `, 122 outkey: "http_version", 123 expect: float64(1.1), 124 fail: false, 125 }, 126 { 127 name: "pattern: http version (-opm3)", 128 in: `162.62.81.1 - - [29/Nov/2021:07:30:50 +0000] "POST /?signature=b8d8ea×tamp=1638171049 HTTP/1.1" 200 413 "-" "Mozilla/4.0"`, 129 pl: ` 130 add_pattern("numb2", "%{NUMBER}") 131 grok(_, "%{IPORHOST:client_ip} %{NOTSPACE} %{NOTSPACE} \\[%{HTTPDATE:time}\\] \"%{DATA} %{GREEDYDATA} HTTP/%{numb2:http_version}.*\" %{INT:status_code} %{INT:bytes}") 132 add_pattern("numb3", "\\d") 133 grok(_, "%{IPORHOST:client_ip} %{NOTSPACE} %{NOTSPACE} \\[%{HTTPDATE:time}\\] \"%{DATA} %{GREEDYDATA} HTTP/%{numb3:http_version_int}.*\" %{INT:status_code} %{INT:bytes}") 134 cast(http_version_int, "float") 135 `, 136 outkey: "http_version_int", 137 expect: float64(1.), 138 fail: false, 139 }, 140 { 141 name: "pattern: http version (-opm4)", 142 in: `162.62.81.1 - - [29/Nov/2021:07:30:50 +0000] "POST /?signature=b8d8ea×tamp=1638171049 HTTP/1.1" 200 413 "-" "Mozilla/4.0"`, 143 pl: ` 144 add_pattern("numb2", "%{NUMBER}") 145 grok(_, "%{IPORHOST:client_ip} %{NOTSPACE} %{NOTSPACE} \\[%{HTTPDATE:time}\\] \"%{DATA} %{GREEDYDATA} HTTP/%{numb2:http_version}.*\" %{INT:status_code} %{INT:bytes}") 146 add_pattern("numb2", "\\d") 147 grok(_, "%{IPORHOST:client_ip} %{NOTSPACE} %{NOTSPACE} \\[%{HTTPDATE:time}\\] \"%{DATA} %{GREEDYDATA} HTTP/%{numb2:http_version_int}.*\" %{INT:status_code} %{INT:bytes}") 148 cast(http_version_int, "float") 149 `, 150 outkey: "http_version_int", 151 expect: float64(1), 152 fail: false, 153 }, 154 } 155 156 for idx, tc := range cases { 157 t.Run(tc.name, func(t *testing.T) { 158 runner, err := NewTestingRunner(tc.pl) 159 if err != nil { 160 if tc.fail { 161 t.Logf("[%d]expect error: %s", idx, err) 162 } else { 163 t.Errorf("[%d] failed: %s", idx, err) 164 } 165 return 166 } 167 168 pt := ptinput.NewPlPoint(point.Logging, "test", nil, map[string]any{"message": tc.in}, time.Now()) 169 errR := runScript(runner, pt) 170 if errR != nil { 171 t.Fatal(errR) 172 } 173 v, _, e := pt.Get(tc.outkey) 174 assert.NoError(t, e) 175 if assert.Equal(t, tc.expect, v) { 176 t.Logf("[%d] PASS", idx) 177 } 178 }) 179 } 180 }