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  }