github.com/GuanceCloud/cliutils@v1.1.21/pipeline/ptinput/funcs/funcs_benchmark_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 ) 15 16 /* 17 // 时间解析补充函数 18 func BenchmarkParseDatePattern(b *testing.B) { 19 for n := 0; n < b.N; n++ { 20 if _, err := parseDatePattern("Tue May 18 06:25:05.176170 2021"); err != nil { 21 b.Error(err) 22 } 23 } 24 } 25 26 // dataparse库 27 func BenchmarkDateparseParseIn(b *testing.B) { 28 for n := 0; n < b.N; n++ { 29 if _, err := dateparse.ParseIn("2017-12-29T12:33:33.095243Z", nil); err != nil { 30 b.Error(err) 31 } 32 } 33 } 34 35 // dataparse库 指定时区 36 func BenchmarkDateparseParseInTZ(b *testing.B) { 37 tz, _ := time.LoadLocation("Asia/Shanghai") 38 for n := 0; n < b.N; n++ { 39 if _, err := dateparse.ParseIn("2017-12-29T12:33:33.095243Z", tz); err != nil { 40 b.Error(err) 41 } 42 } 43 } 44 45 // default_time, pipeline 时间解析函数 46 func BenchmarkTimeDefault(b *testing.B) { 47 for n := 0; n < b.N; n++ { 48 p := &Pipeline{ 49 Output: map[string]interface{}{ 50 "time": "2017-12-29T12:33:33.095243Z", 51 }, 52 ast: &parser.Ast{ 53 Functions: []*parser.FuncExpr{ 54 { 55 Name: "default_time", 56 Param: []parser.Node{ 57 &parser.Identifier{Name: "time"}, 58 &parser.StringLiteral{Val: ""}, 59 }, 60 }, 61 }, 62 }, 63 } 64 if _, err := DefaultTime(p, p.ast.Functions[0]); err != nil { 65 b.Error(err) 66 } 67 } 68 } 69 70 // // default_time, pipeline 时间解析函数, 设置时区 71 func BenchmarkTimeDefaultTZ(b *testing.B) { 72 for n := 0; n < b.N; n++ { 73 p := &Pipeline{ 74 Output: map[string]interface{}{ 75 "time": "2017-12-29T12:33:33.095243Z", 76 }, 77 ast: &parser.Ast{ 78 Functions: []*parser.FuncExpr{ 79 { 80 Name: "default_time", 81 Param: []parser.Node{ 82 &parser.Identifier{Name: "time"}, 83 &parser.StringLiteral{Val: "Asia/Shanghai"}, 84 }, 85 }, 86 }, 87 }, 88 } 89 if _, err := DefaultTime(p, p.ast.Functions[0]); err != nil { 90 b.Error(err) 91 } 92 } 93 } 94 95 // add_pattern 函数, pipeline 添加模式 96 func BenchmarkAddPattern(b *testing.B) { 97 for n := 0; n < b.N; n++ { 98 p := &Pipeline{ 99 Output: map[string]interface{}{ 100 "time": "2017-12-29T12:33:33.095243Z", 101 }, 102 ast: &parser.Ast{ 103 Functions: []*parser.FuncExpr{ 104 { 105 Name: "add_pattern", 106 Param: []parser.Node{ 107 &parser.StringLiteral{Val: "time1"}, 108 &parser.StringLiteral{Val: "[\\w:\\.\\+-]+?"}, 109 }, 110 }, 111 }, 112 }, 113 } 114 if _, err := AddPattern(p, p.ast.Functions[0]); err != nil { 115 b.Error(err) 116 } 117 } 118 } 119 120 // default_time_with_fmt, pipeline 根据指定的时间 fmt 解析时间 121 func BenchmarkTimeDefaultWithTfmt(b *testing.B) { 122 for n := 0; n < b.N; n++ { 123 p := &Pipeline{ 124 Output: map[string]interface{}{ 125 "time": "2017-12-29T12:33:33.095243Z", // "2017-12-29T12:33:33.095243Z+0800" 126 }, 127 ast: &parser.Ast{ 128 Functions: []*parser.FuncExpr{ 129 { 130 Name: "default_time_with_fmt", 131 Param: []parser.Node{ 132 &parser.Identifier{Name: "time"}, 133 &parser.StringLiteral{Val: "2006-01-02T15:04:05.000000Z"}, // 2006-01-02T15:04:05.000000Z-0700 134 &parser.StringLiteral{Val: ""}, // "Asia/Shanghai" 135 }, 136 }, 137 }, 138 }, 139 } 140 if _, err := DefaultTimeWithFmt(p, p.ast.Functions[0]); err != nil { 141 b.Error(err) 142 } 143 } 144 } 145 */ 146 147 // default_time 148 func BenchmarkParseLog(b *testing.B) { 149 script := ` 150 add_pattern("date1", "[\\w:\\.\\+-]+?") 151 add_pattern("date2", "[\\w:\\.\\+-]+?") 152 add_pattern("date3", "[\\w:\\.\\+-]+?") 153 add_pattern("date4", "[\\w:\\.\\+-]+?") 154 grok(_, "%{TIMESTAMP_ISO8601:time}\\s+%{INT:thread_id}\\s+%{WORD:operation}\\s+%{GREEDYDATA:raw_query}") 155 cast(thread_id, "int") 156 default_time(time) 157 ` 158 runner, err := NewTestingRunner(script) 159 if err != nil { 160 b.Error(err) 161 } 162 data := `2017-12-29T12:33:33.095243Z 2 Query SELECT TABLE_SCHEMA, TABLE_NAME FROM INFORMATION_SCHEMA.TABLES WHERE CREATE_OPTIONS LIKE '%partitioned%'` 163 164 for n := 0; n < b.N; n++ { 165 pt := ptinput.NewPlPoint( 166 point.Logging, "test", nil, map[string]any{"message": data}, time.Now()) 167 errR := runScript(runner, pt) 168 169 if errR != nil { 170 b.Fatal(errR) 171 } 172 } 173 } 174 175 func BenchmarkParseLog_tz(b *testing.B) { 176 script := ` 177 add_pattern("date1", "(\\d+/\\w+/[\\d:]+ [\\d+-]+)") 178 add_pattern("date2", "[\\w:\\.\\+-]+?") 179 add_pattern("date3", "[\\w:\\.\\+-]+?") 180 add_pattern("date4", "[\\w:\\.\\+-]+?") 181 grok(_, "%{TIMESTAMP_ISO8601:time}\\s+%{IP:ip}\\s+%{INT:thread_id}\\s+") 182 183 grok(_, "%{TIMESTAMP_ISO8601:time}\\s+%{IP:ip}\\s+%{INT:thread_id}\\s+") 184 grok(_, "%{TIMESTAMP_ISO8601:time}\\s+%{IP:ip}\\s+%{INT:thread_id}\\s+") 185 grok(_, "%{TIMESTAMP_ISO8601:time}\\s+%{IP:ip}\\s+%{INT:thread_id}\\s+") 186 187 188 cast(thread_id, "int") 189 default_time(time, "Asia/Shanghai") 190 ` 191 runner, err := NewTestingRunner(script) 192 if err != nil { 193 b.Error(err) 194 } 195 data := `2017-12-29T12:33:33.095243Z 1.1.1.1 2 ` 196 197 for n := 0; n < b.N; n++ { 198 pt := ptinput.NewPlPoint( 199 point.Logging, "test", nil, map[string]any{"message": data}, time.Now()) 200 errR := runScript(runner, pt) 201 202 if errR != nil { 203 b.Fatal(errR) 204 } 205 } 206 } 207 208 func BenchmarkGrok(b *testing.B) { 209 script := ` 210 #grok(_, "%{IPV6:client_ip}") 211 #grok(_, "%{IPV6:client_ip} %{NOTSPACE:http_ident} %{NOTSPACE:http_auth} \\[%{HTTPDATE:time}\\] \"%{DATA:http_method} %{URIPATHPARAM:http_url} HTTP/%{NUMBER:http_version}\" %{INT:status_code} %{INT:bytes}") 212 grok(_, "%{IPORHOST:client_ip} %{NOTSPACE:http_ident} %{NOTSPACE:http_auth} \\[%{HTTPDATE:time}\\] \"%{DATA:http_method} %{GREEDYDATA:http_url} HTTP/%{NUMBER:http_version}\" %{INT:status_code} %{INT:bytes}") 213 ` 214 runner, err := NewTestingRunner(script) 215 if err != nil { 216 b.Error(err) 217 } 218 data := `127.0.0.1 - - [21/Jul/2021:14:14:38 +0800] "GET /?1 HTTP/1.1" 200 2178 "-" "Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.164 Safari/537.36"` 219 // data := `fe80:d::127.0.0.1 - - [21/Jul/2021:14:14:38 +0800] "GET /?1 HTTP/1.1" 200 2178 "-" "Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.164 Safari/537.36"` 220 221 pt := ptinput.NewPlPoint( 222 point.Logging, "test", nil, map[string]any{"message": data}, time.Now()) 223 b.ResetTimer() 224 for n := 0; n < b.N; n++ { 225 errR := runScript(runner, pt) 226 227 if errR != nil { 228 b.Fatal(errR) 229 } 230 } 231 } 232 233 func BenchmarkParseLogNginx(b *testing.B) { 234 script := ` 235 add_pattern("date2", "%{YEAR}[./]%{MONTHNUM}[./]%{MONTHDAY} %{TIME}") 236 237 # access log 238 grok(_, "%{IPORHOST:client_ip} %{NOTSPACE:http_ident} %{NOTSPACE:http_auth} \\[%{HTTPDATE:time}\\] \"%{DATA:http_method} %{GREEDYDATA:http_url} HTTP/%{NUMBER:http_version}\" %{INT:status_code} %{INT:bytes}") 239 240 241 add_pattern("access_common", "%{IPORHOST:client_ip} %{NOTSPACE:http_ident} %{NOTSPACE:http_auth} \\[%{HTTPDATE:time}\\] \"%{DATA:http_method} %{GREEDYDATA:http_url} HTTP/%{NUMBER:http_version}\" %{INT:status_code} %{INT:bytes}") 242 grok(_, '%{access_common} "%{NOTSPACE:referrer}" "%{GREEDYDATA:agent}') 243 user_agent(agent) 244 245 grok(_, "%{date2:time} \\[%{LOGLEVEL:status}\\] %{GREEDYDATA:msg}, client: %{IPORHOST:client_ip}, server: %{IPORHOST:server}, request: \"%{DATA:http_method} %{GREEDYDATA:http_url} HTTP/%{NUMBER:http_version}\", (upstream: \"%{GREEDYDATA:upstream}\", )?host: \"%{IPORHOST:ip_or_host}\"") 246 grok(_, "%{date2:time} \\[%{LOGLEVEL:status}\\] %{GREEDYDATA:msg}, client: %{IPORHOST:client_ip}, server: %{IPORHOST:server}, request: \"%{GREEDYDATA:http_method} %{GREEDYDATA:http_url} HTTP/%{NUMBER:http_version}\", host: \"%{IPORHOST:ip_or_host}\"") 247 grok(_,"%{date2:time} \\[%{LOGLEVEL:status}\\] %{GREEDYDATA:msg}") 248 249 group_in(status, ["warn", "notice"], "warning") 250 group_in(status, ["error", "crit", "alert", "emerg"], "error") 251 252 cast(status_code, "int") 253 cast(bytes, "int") 254 255 group_between(status_code, [200,299], "OK", status) 256 group_between(status_code, [300,399], "notice", status) 257 group_between(status_code, [400,499], "warning", status) 258 group_between(status_code, [500,599], "error", status) 259 260 261 nullif(http_ident, "-") 262 nullif(http_auth, "-") 263 nullif(upstream, "") 264 default_time(time) 265 ` 266 runner, err := NewTestingRunner(script) 267 if err != nil { 268 b.Error(err) 269 } 270 data := `127.0.0.1 - - [21/Jul/2021:14:14:38 +0800] "GET /?1 HTTP/1.1" 200 2178 "-" "Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.164 Safari/537.36"` 271 b.ResetTimer() 272 for n := 0; n < b.N; n++ { 273 pt := ptinput.NewPlPoint( 274 point.Logging, "test", nil, map[string]any{"message": data}, time.Now()) 275 errR := runScript(runner, pt) 276 277 if errR != nil { 278 b.Fatal(errR) 279 } 280 } 281 } 282 283 // default_time_with_fmt 284 func BenchmarkParseLogWithTfmt(b *testing.B) { 285 script := ` 286 add_pattern("date1", "[\\w:\\.\\+-]+?") 287 add_pattern("date2", "[\\w:\\.\\+-]+?") 288 add_pattern("date3", "[\\w:\\.\\+-]+?") 289 add_pattern("date4", "[\\w:\\.\\+-]+?"); grok(_, "%{TIMESTAMP_ISO8601:time}\\s+%{INT:thread_id}\\s+%{WORD:operation}\\s+%{GREEDYDATA:raw_query}") 290 cast(thread_id, "int") 291 default_time_with_fmt(time, "2006-01-02T15:04:05.000000Z") 292 ` 293 // "2006-01-02T15:04:05.000000Z" 294 runner, err := NewTestingRunner(script) 295 if err != nil { 296 b.Error(err) 297 } 298 data := `2021-07-20T12:33:33.095243Z 2 Query SELECT TABLE_SCHEMA, TABLE_NAME FROM INFORMATION_SCHEMA.TABLES WHERE CREATE_OPTIONS LIKE '%partitioned%'` 299 300 for n := 0; n < b.N; n++ { 301 pt := ptinput.NewPlPoint( 302 point.Logging, "test", nil, map[string]any{"message": data}, time.Now()) 303 errR := runScript(runner, pt) 304 305 if errR != nil { 306 b.Fatal(errR) 307 } 308 } 309 } 310 311 // default_time_with_fmt, timezone 312 func BenchmarkParseLogWithTfmt_tz(b *testing.B) { 313 script := ` 314 add_pattern("date1", "[\\w:\\.\\+-]+?") 315 add_pattern("date2", "[\\w:\\.\\+-]+?") 316 add_pattern("date3", "[\\w:\\.\\+-]+?") 317 add_pattern("date4", "[\\w:\\.\\+-]+?") 318 grok(_, "%{TIMESTAMP_ISO8601:time}\\s+%{INT:thread_id}\\s+%{WORD:operation}\\s+%{GREEDYDATA:raw_query}") 319 cast(thread_id, "int") 320 default_time_with_fmt(time, "2006-01-02T15:04:05.000000Z", "Asia/Shanghai") 321 ` 322 // "2006-01-02T15:04:05.000000Z" 323 runner, err := NewTestingRunner(script) 324 if err != nil { 325 b.Error(err) 326 } 327 data := `2021-07-20T12:33:33.095243Z 2 Query SELECT TABLE_SCHEMA, TABLE_NAME FROM INFORMATION_SCHEMA.TABLES WHERE CREATE_OPTIONS LIKE '%partitioned%'` 328 329 for n := 0; n < b.N; n++ { 330 pt := ptinput.NewPlPoint( 331 point.Logging, "test", nil, map[string]any{"message": data}, time.Now()) 332 errR := runScript(runner, pt) 333 334 if errR != nil { 335 b.Fatal(errR) 336 } 337 } 338 } 339 340 func BenchmarkParseLogWithTfmt_NoAddPattern(b *testing.B) { 341 script := ` 342 grok(_, "%{TIMESTAMP_ISO8601:time}\\s+%{INT:thread_id}\\s+%{WORD:operation}\\s+%{GREEDYDATA:raw_query}") 343 cast(thread_id, "int") 344 default_time_with_fmt(time, "2006-01-02T15:04:05.000000Z", "Asia/Shanghai") 345 ` 346 // "2006-01-02T15:04:05.000000Z" 347 runner, err := NewTestingRunner(script) 348 if err != nil { 349 b.Error(err) 350 } 351 data := `2021-07-20T12:33:33.095243Z 2 Query SELECT TABLE_SCHEMA, TABLE_NAME FROM INFORMATION_SCHEMA.TABLES WHERE CREATE_OPTIONS LIKE '%partitioned%'` 352 353 for n := 0; n < b.N; n++ { 354 pt := ptinput.NewPlPoint( 355 point.Logging, "test", nil, map[string]any{"message": data}, time.Now()) 356 errR := runScript(runner, pt) 357 358 if errR != nil { 359 b.Fatal(errR) 360 } 361 } 362 }