github.com/GuanceCloud/cliutils@v1.1.21/pipeline/pl_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 pipeline
     7  
     8  import (
     9  	"testing"
    10  
    11  	"github.com/GuanceCloud/cliutils/pipeline/ptinput/funcs"
    12  	"github.com/GuanceCloud/cliutils/point"
    13  	"github.com/GuanceCloud/platypus/pkg/engine"
    14  	"github.com/influxdata/influxdb1-client/models"
    15  	"github.com/stretchr/testify/assert"
    16  
    17  	"github.com/GuanceCloud/cliutils/pipeline/manager"
    18  	"github.com/GuanceCloud/cliutils/pipeline/ptinput"
    19  )
    20  
    21  var scheckTestPointData = []byte(`0144-crontab,category=system,host=localhost.localdomain,level=warn,` +
    22  	`title=crontab定时任务被修改,version=1.0.8 message="crontab定时任务被修改, /var/spool/cron change, /var/spool/cron/lastrun:CHMOD 1 " 1655109001580849308
    23  0200-listening-ports-add,category=system,host=localhost.localdomain,level=warn,title=主机新端口被打开,version=1.0.8 message="端口被打开,60719(udp) 4735/chrome " 1655114699648826594
    24  `)
    25  
    26  var scheckTestPointDataWithoutTagCategory = []byte(`0144-crontab,host=localhost.localdomain,level=warn,` +
    27  	`title=crontab定时任务被修改,version=1.0.8 message="crontab定时任务被修改, /var/spool/cron change, /var/spool/cron/lastrun:CHMOD 1 " 1655109001580849308
    28  0200-listening-ports-add,host=localhost.localdomain,level=warn,title=主机新端口被打开,version=1.0.8 message="端口被打开,60719(udp) 4735/chrome " 1655114699648826594
    29  `)
    30  
    31  var rumTestPointData = []byte(`error,app_id=appid01,t2=tag2 f1=1.0,f2=2i,f3="abc"
    32  action,app_id=appid01,t1=tag1,t2=tag2 f1=1.0,f2=2i,f3="abc"`)
    33  
    34  var rumTestPointDataWithoutAppID = []byte(`error,t2=tag2 f1=1.0,f2=2i,f3="abc"
    35  action,t1=tag1,t2=tag2 f1=1.0,f2=2i,f3="abc"`)
    36  
    37  func TestSCriptName(t *testing.T) {
    38  	kvs := point.NewTags(map[string]string{"service": "svc_name"})
    39  	kvs = append(kvs, point.NewKVs(map[string]interface{}{"message@json": "a"})...)
    40  	pt := point.NewPointV2("m_name",
    41  		kvs, point.DefaultLoggingOptions()...)
    42  
    43  	name, ok := manager.ScriptName(nil, point.Tracing, pt, nil)
    44  	assert.Equal(t, true, ok)
    45  	assert.Equal(t, "svc_name.p", name)
    46  
    47  	name, ok = manager.ScriptName(nil, point.Tracing, pt, map[string]string{"c": "d"})
    48  	assert.Equal(t, true, ok)
    49  	assert.Equal(t, "svc_name.p", name)
    50  
    51  	_, ok = manager.ScriptName(nil, point.Tracing, pt, map[string]string{"svc_name": "-"})
    52  	assert.Equal(t, false, ok)
    53  
    54  	name, ok = manager.ScriptName(nil, point.Profiling, pt, map[string]string{"svc_name": "def.p"})
    55  	assert.Equal(t, true, ok)
    56  	assert.Equal(t, "def.p", name)
    57  
    58  	pt = point.NewPointV2("m_name",
    59  		point.NewKVs(map[string]interface{}{"message@json": "a"}),
    60  		point.CommonLoggingOptions()...)
    61  	_, ok = manager.ScriptName(nil, point.Tracing, pt,
    62  		map[string]string{"m_name": "def.p"})
    63  	assert.Equal(t, false, ok)
    64  
    65  	name, ok = manager.ScriptName(nil, point.Metric, pt, map[string]string{"abc": "def.p"})
    66  	assert.Equal(t, true, ok)
    67  	assert.Equal(t, "m_name.p", name)
    68  
    69  	name, ok = manager.ScriptName(nil, point.Metric, pt, map[string]string{"m_name": "def.p"})
    70  	assert.Equal(t, true, ok)
    71  	assert.Equal(t, "def.p", name)
    72  
    73  	_, ok = manager.ScriptName(nil, point.Metric, pt, map[string]string{"m_name": "-"})
    74  	assert.Equal(t, false, ok)
    75  
    76  	_, ok = manager.ScriptName(nil, point.Metric, pt, map[string]string{"m_name": "-"})
    77  	assert.Equal(t, false, ok)
    78  
    79  	pts, err := models.ParsePoints(scheckTestPointData)
    80  	if err != nil {
    81  		t.Fatal(err)
    82  	}
    83  
    84  	ptSc := pts[0]
    85  	kvs = point.NewTags(ptSc.Tags().Map())
    86  	f, _ := ptSc.Fields()
    87  	kvs = append(kvs, point.NewKVs(f)...)
    88  	pt = point.NewPointV2(string(ptSc.Name()), kvs, point.CommonLoggingOptions()...)
    89  	name, ok = manager.ScriptName(nil, point.Security, pt, nil)
    90  	assert.Equal(t, true, ok)
    91  	assert.Equal(t, "system.p", name)
    92  
    93  	pts, err = models.ParsePoints(scheckTestPointDataWithoutTagCategory)
    94  	if err != nil {
    95  		t.Fatal(err)
    96  	}
    97  	ptSc = pts[0]
    98  	kvs = point.NewTags(ptSc.Tags().Map())
    99  	f, _ = ptSc.Fields()
   100  	kvs = append(kvs, point.NewKVs(f)...)
   101  	pt = point.NewPointV2(string(ptSc.Name()), kvs, point.CommonLoggingOptions()...)
   102  
   103  	_, ok = manager.ScriptName(nil, point.Security, pt, nil)
   104  	assert.Equal(t, false, ok)
   105  
   106  	pts, err = models.ParsePoints(rumTestPointData)
   107  	if err != nil {
   108  		t.Fatal(err)
   109  	}
   110  	ptSc = pts[0]
   111  	kvs = point.NewTags(ptSc.Tags().Map())
   112  	f, _ = ptSc.Fields()
   113  	kvs = append(kvs, point.NewKVs(f)...)
   114  	pt = point.NewPointV2(string(ptSc.Name()), kvs, point.CommonLoggingOptions()...)
   115  
   116  	name, ok = manager.ScriptName(nil, point.RUM, pt, nil)
   117  	assert.Equal(t, true, ok)
   118  	assert.Equal(t, "appid01_error.p", name)
   119  
   120  	pts, err = models.ParsePoints(rumTestPointDataWithoutAppID)
   121  	if err != nil {
   122  		t.Fatal(err)
   123  	}
   124  	ptSc = pts[0]
   125  	kvs = point.NewTags(ptSc.Tags().Map())
   126  	f, _ = ptSc.Fields()
   127  	kvs = append(kvs, point.NewKVs(f)...)
   128  	pt = point.NewPointV2(string(ptSc.Name()), kvs, point.CommonLoggingOptions()...)
   129  	_, ok = manager.ScriptName(nil, point.RUM, pt, nil)
   130  	assert.Equal(t, false, ok)
   131  }
   132  
   133  const (
   134  	sJsonData = `
   135  	{
   136  		"tcpSeq": "71234234923",
   137  		"language": "C",
   138  		"channel": "26",
   139  		"check_bit": "dSa-aoHjw7b42-dcCE2Sc-aULcaeZav",
   140  		"cid": "2139-02102-213-122341-1190",
   141  		"address": "application/a.out_func_a_64475d386d3:0xfe21023",
   142  		"time": 1681508212100,
   143  		"sub_source": "N",
   144  		"id": 508,
   145  		"status": "ok",
   146  		"cost": 101020 
   147  	}
   148  `
   149  
   150  	sNginx = `192.168.158.20 - - [19/Jun/2021:04:04:58 +0000] "POST /baxrrrrqc.php?daxd=a%20&d=1 HTTP/1.1" 404 118 ` +
   151  		`"-" "Mozilla/5.0 (Macintosh; U; Intel Mac OS X 10.6;` +
   152  		` fr; rv:1.9.2.8) Gecko/20100722 Firefox/3.6.8"`
   153  
   154  	sJson1 = `
   155  data = load_json(_)
   156  add_key(tcpSeq, data["tcpSeq"])
   157  add_key(language, data["language"])
   158  add_key(channel, data["channel"])
   159  add_key(check_bit, data["check_bit"])
   160  add_key(cid, data["cid"])
   161  add_key(address, data["address"])
   162  add_key(time, data["time"])
   163  add_key(sub_source, data["sub_source"])
   164  add_key(id, data["id"])
   165  add_key(status, data["status"])
   166  add_key(cost, data["cost"])
   167  `
   168  	sJson2 = `
   169  json(_, tcpSeq, tcpSeq)
   170  json(_, language, language)
   171  json(_, channel, channel)
   172  json(_, check_bit, check_bit)
   173  json(_, cid, cid)
   174  json(_, address, address)
   175  json(_, time, time)
   176  json(_, sub_source, sub_source)
   177  json(_, id, id)
   178  json(_, status, status)
   179  json(_, cost, cost)
   180  `
   181  
   182  	sGrok1 = `
   183  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}")
   184  
   185  cast(status_code, "int")
   186  cast(bytes, "int")
   187  
   188  default_time(time)
   189  `
   190  
   191  	sGrok2 = `
   192  grok(_, "%{NOTSPACE: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}")
   193  
   194  cast(status_code, "int")
   195  cast(bytes, "int")
   196  
   197  default_time(time)
   198  `
   199  )
   200  
   201  func BenchmarkScript(b *testing.B) {
   202  	// json 性能 基准/优化
   203  	b.Run("load_json()", func(b *testing.B) {
   204  		kvs := point.NewTags(map[string]string{"host": "ss"})
   205  		kvs = append(kvs, point.NewKVs(map[string]interface{}{
   206  			"message": sJsonData,
   207  		})...)
   208  		pt := point.NewPointV2("test", kvs, point.DefaultLoggingOptions()...)
   209  
   210  		s, _ := engine.ParseScript(map[string]string{"s": sJson1}, funcs.FuncsMap, funcs.FuncsCheckMap)
   211  		sp := s["s"]
   212  		if sp == nil {
   213  			b.Fatal("script == nil")
   214  		}
   215  		for i := 0; i < b.N; i++ {
   216  			p := ptinput.WrapPoint(point.Logging, pt)
   217  			if err := sp.Run(p, nil); err != nil {
   218  				b.Fatal(err)
   219  			}
   220  		}
   221  	})
   222  
   223  	b.Run("json()", func(b *testing.B) {
   224  		kvs := point.NewTags(map[string]string{"host": "ss"})
   225  		kvs = append(kvs, point.NewKVs(map[string]interface{}{
   226  			"message": sJsonData,
   227  		})...)
   228  		pt := point.NewPointV2("test", kvs, point.DefaultLoggingOptions()...)
   229  
   230  		s, _ := engine.ParseScript(map[string]string{"s": sJson2}, funcs.FuncsMap, funcs.FuncsCheckMap)
   231  		sp := s["s"]
   232  		if sp == nil {
   233  			b.Fatal("script == nil")
   234  		}
   235  		for i := 0; i < b.N; i++ {
   236  			p := ptinput.WrapPoint(point.Logging, pt)
   237  			if err := sp.Run(p, nil); err != nil {
   238  				b.Fatal(err)
   239  			}
   240  		}
   241  	})
   242  
   243  	// grok 性能 基准/优化
   244  	b.Run("grok_p1", func(b *testing.B) {
   245  		kvs := point.NewTags(map[string]string{"host": "ss"})
   246  		kvs = append(kvs, point.NewKVs(map[string]interface{}{
   247  			"message": sJsonData,
   248  		})...)
   249  		pt := point.NewPointV2("test", kvs, point.DefaultLoggingOptions()...)
   250  
   251  		s, _ := engine.ParseScript(map[string]string{"s": sGrok1}, funcs.FuncsMap, funcs.FuncsCheckMap)
   252  		sp := s["s"]
   253  		if sp == nil {
   254  			b.Fatal("script == nil")
   255  		}
   256  		for i := 0; i < b.N; i++ {
   257  			p := ptinput.WrapPoint(point.Logging, pt)
   258  			if err := sp.Run(p, nil); err != nil {
   259  				b.Fatal(err)
   260  			}
   261  		}
   262  	})
   263  
   264  	b.Run("grok_p2", func(b *testing.B) {
   265  		kvs := point.NewTags(map[string]string{"host": "ss"})
   266  		kvs = append(kvs, point.NewKVs(map[string]interface{}{
   267  			"message": sNginx,
   268  		})...)
   269  		pt := point.NewPointV2("test", kvs, point.DefaultLoggingOptions()...)
   270  
   271  		s, _ := engine.ParseScript(map[string]string{"s": sGrok2}, funcs.FuncsMap, funcs.FuncsCheckMap)
   272  		sp := s["s"]
   273  		if sp == nil {
   274  			b.Fatal("script == nil")
   275  		}
   276  		for i := 0; i < b.N; i++ {
   277  			p := ptinput.WrapPoint(point.Logging, pt)
   278  			if err := sp.Run(p, nil); err != nil {
   279  				b.Fatal(err)
   280  			}
   281  		}
   282  	})
   283  
   284  	b.Run("grok_p3", func(b *testing.B) {
   285  		kvs := point.NewTags(map[string]string{"host": "ss"})
   286  		kvs = append(kvs, point.NewKVs(map[string]interface{}{
   287  			"message": sNginx,
   288  		})...)
   289  		pt := point.NewPointV2("test", kvs, point.DefaultLoggingOptions()...)
   290  
   291  		s, _ := manager.NewScripts(map[string]string{"s": sGrok2}, nil, "", point.Logging)
   292  
   293  		sp := s["s"]
   294  		if sp == nil {
   295  			b.Fatal("script == nil")
   296  		}
   297  		for i := 0; i < b.N; i++ {
   298  			p := ptinput.WrapPoint(point.Logging, pt)
   299  			if err := sp.Run(p, nil, &manager.Option{}); err != nil {
   300  				b.Fatal(err)
   301  			}
   302  		}
   303  	})
   304  }