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 }