From 7a82ecd1d0789ba2103cf3c5e16dc8971cdd9006 Mon Sep 17 00:00:00 2001 From: budougumi0617 Date: Tue, 12 Jan 2021 00:32:43 +0900 Subject: [PATCH 1/3] :white_check_mark: confirm to skip if there is nrseg:ignore in function/method document --- process.go | 1 - process_test.go | 57 ++++++++++++++++++++++++++++++++++++++++++++++++- 2 files changed, 56 insertions(+), 2 deletions(-) diff --git a/process.go b/process.go index 36d14b9..7372395 100644 --- a/process.go +++ b/process.go @@ -37,7 +37,6 @@ func Process(filename string, src []byte) ([]byte, error) { ast.Inspect(f, func(n ast.Node) bool { if fd, ok := n.(*ast.FuncDecl); ok { if fd.Body != nil { - // TODO: no append if exist calling statement of newrelic.FromContext. // TODO: skip if comment go:nrsegignore in function/method comment. sn := genSegName(fd.Name.Name) vn, t := parseParams(fd.Type) diff --git a/process_test.go b/process_test.go index adc44b4..ef2ef90 100644 --- a/process_test.go +++ b/process_test.go @@ -15,7 +15,7 @@ func TestProcess(t *testing.T) { name, src, want string }{ { - name: "basicProcess", + name: "BasicProcess", src: `package main import ( @@ -76,6 +76,61 @@ func SampleHandler(w http.ResponseWriter, req *http.Request) { // comment 1 fmt.Fprintf(w, "Hello, %q", req.URL.Path) } +`, + }, + { + name: "SkipIfIgnoreComment", + src: `package main + +import ( + "context" + "fmt" + "net/http" +) + +type S struct{} + +func (s *S) SampleMethod(ctx context.Context) { + fmt.Println("Hello, playground") +} + +// SampleFunc is sample function. +// nrseg:ignore it does not be needed to insert segment in this function. +func SampleFunc(ctx context.Context) { + fmt.Println("Hello, playground") +} + +func SampleHandler(w http.ResponseWriter, req *http.Request) { + fmt.Fprintf(w, "Hello, %q", req.URL.Path) +} +`, + want: `package main + +import ( + "context" + "fmt" + "net/http" + + "github.com/newrelic/go-agent/v3/newrelic" +) + +type S struct{} + +func (s *S) SampleMethod(ctx context.Context) { + defer newrelic.FromContext(ctx).StartSegment("sample_method").End() + fmt.Println("Hello, playground") +} + +// SampleFunc is sample function. +// nrseg:ignore it does not be needed to insert segment in this function. +func SampleFunc(ctx context.Context) { + fmt.Println("Hello, playground") +} + +func SampleHandler(w http.ResponseWriter, req *http.Request) { + defer newrelic.FromContext(req.Context()).StartSegment("sample_handler").End() + fmt.Fprintf(w, "Hello, %q", req.URL.Path) +} `, }, { From 56ed096ac80e1c1ef2f3a298513eef8ba929e771 Mon Sep 17 00:00:00 2001 From: budougumi0617 Date: Tue, 12 Jan 2021 00:41:16 +0900 Subject: [PATCH 2/3] :heart: skip if already segment call --- process.go | 18 +++++++++++++++++- 1 file changed, 17 insertions(+), 1 deletion(-) diff --git a/process.go b/process.go index 7372395..c8b1c77 100644 --- a/process.go +++ b/process.go @@ -36,8 +36,10 @@ func Process(filename string, src []byte) ([]byte, error) { ast.Inspect(f, func(n ast.Node) bool { if fd, ok := n.(*ast.FuncDecl); ok { + if findIgnoreComment(fd.Doc) { + return false + } if fd.Body != nil { - // TODO: skip if comment go:nrsegignore in function/method comment. sn := genSegName(fd.Name.Name) vn, t := parseParams(fd.Type) var ds ast.Stmt @@ -94,6 +96,20 @@ func addImport(fs *token.FileSet, f *ast.File) (string, error) { return "", nil } +var nrignoreReg = regexp.MustCompile("(?m)^// nrseg:ignore .*$") + +func findIgnoreComment(cg *ast.CommentGroup) bool { + if cg == nil { + return false + } + for _, c := range cg.List { + if nrignoreReg.MatchString(c.Text) { + return true + } + } + return false +} + func existFromContext(pn string, s ast.Stmt) bool { var result bool ast.Inspect(s, func(n ast.Node) bool { From c98dbd2963938447ff99416a7fd4b3cabbd36df9 Mon Sep 17 00:00:00 2001 From: budougumi0617 Date: Tue, 12 Jan 2021 00:45:29 +0900 Subject: [PATCH 3/3] :white_check_mark: add test files --- testdata/input/advance.go | 20 +++++++++++++++ testdata/input/go.mod | 2 ++ testdata/input/go.sum | 52 +++++++++++++++++++++++++++++++++++++++ testdata/want/advance.go | 20 +++++++++++++++ 4 files changed, 94 insertions(+) create mode 100644 testdata/input/advance.go create mode 100644 testdata/want/advance.go diff --git a/testdata/input/advance.go b/testdata/input/advance.go new file mode 100644 index 0000000..466d329 --- /dev/null +++ b/testdata/input/advance.go @@ -0,0 +1,20 @@ +package input + +import ( + "fmt" + "net/http" + + "github.com/newrelic/go-agent/v3/newrelic" +) + +// no insert because ignore comment. +// nrseg:ignore this is test. +func IgnoreHandler(w http.ResponseWriter, req *http.Request) { + fmt.Fprintf(w, "Hello, %q", req.URL.Path) +} + +// no insert because called already. +func AlreadyHandler(w http.ResponseWriter, req *http.Request) { + defer newrelic.FromContext(req.Context()).StartSegment("already_handler").End() + fmt.Fprintf(w, "Hello, %q", req.URL.Path) +} diff --git a/testdata/input/go.mod b/testdata/input/go.mod index 174e624..8707549 100644 --- a/testdata/input/go.mod +++ b/testdata/input/go.mod @@ -1,3 +1,5 @@ module github.com/budougumi0617/nrseg/testdata/input go 1.15 + +require github.com/newrelic/go-agent/v3 v3.9.0 diff --git a/testdata/input/go.sum b/testdata/input/go.sum index e69de29..3a6d4e6 100644 --- a/testdata/input/go.sum +++ b/testdata/input/go.sum @@ -0,0 +1,52 @@ +cloud.google.com/go v0.26.0/go.mod h1:aQUYkXzVsufM+DwF1aE+0xfcU+56JwCaLick0ClmMTw= +github.com/BurntSushi/toml v0.3.1/go.mod h1:xHWCNGjB5oqiDr8zfno3MHue2Ht5sIBksp03qcyfWMU= +github.com/census-instrumentation/opencensus-proto v0.2.1/go.mod h1:f6KPmirojxKA12rnyqOA5BBL4O983OfeGPqjHWSTneU= +github.com/client9/misspell v0.3.4/go.mod h1:qj6jICC3Q7zFZvVWo7KLAzC3yx5G7kyvSDkc90ppPyw= +github.com/envoyproxy/go-control-plane v0.9.1-0.20191026205805-5f8ba28d4473/go.mod h1:YTl/9mNaCwkRvm6d1a2C3ymFceY/DCBVvsKhRF0iEA4= +github.com/envoyproxy/protoc-gen-validate v0.1.0/go.mod h1:iSmxcyjqTsJpI2R4NaDN7+kN2VEUnK/pcBlmesArF7c= +github.com/golang/glog v0.0.0-20160126235308-23def4e6c14b h1:VKtxabqXZkF25pY9ekfRL6a582T4P37/31XEstQ5p58= +github.com/golang/glog v0.0.0-20160126235308-23def4e6c14b/go.mod h1:SBH7ygxi8pfUlaOkMMuAQtPIUF8ecWP5IEl/CR7VP2Q= +github.com/golang/mock v1.1.1/go.mod h1:oTYuIxOrZwtPieC+H1uAHpcLFnEyAGVDL/k47Jfbm0A= +github.com/golang/protobuf v1.2.0/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= +github.com/golang/protobuf v1.3.2/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= +github.com/golang/protobuf v1.3.3 h1:gyjaxf+svBWX08ZjK86iN9geUJF0H6gp2IRKX6Nf6/I= +github.com/golang/protobuf v1.3.3/go.mod h1:vzj43D7+SQXF/4pzW/hwtAqwc6iTitCiVSaWz5lYuqw= +github.com/google/go-cmp v0.2.0 h1:+dTQ8DZQJz0Mb/HjFlkptS1FeQ4cWSnN941F8aEG4SQ= +github.com/google/go-cmp v0.2.0/go.mod h1:oXzfMopK8JAjlY9xF4vHSVASa0yLyX7SntLO5aqRK0M= +github.com/newrelic/go-agent/v3 v3.9.0 h1:5bcTbdk/Up5cIYIkQjCG92Y+uNoett9wmhuz4kPiFlM= +github.com/newrelic/go-agent/v3 v3.9.0/go.mod h1:1A1dssWBwzB7UemzRU6ZVaGDsI+cEn5/bNxI0wiYlIc= +github.com/prometheus/client_model v0.0.0-20190812154241-14fe0d1b01d4/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA= +golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w= +golang.org/x/exp v0.0.0-20190121172915-509febef88a4/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= +golang.org/x/lint v0.0.0-20181026193005-c67002cb31c3/go.mod h1:UVdnD1Gm6xHRNCYTkRU2/jEulfH38KcIWyp/GAMgvoE= +golang.org/x/lint v0.0.0-20190227174305-5b3e6a55c961/go.mod h1:wehouNa3lNwaWXcvxsM5YxQ5yQlVC4a0KAMCusXpPoU= +golang.org/x/lint v0.0.0-20190313153728-d0100b6bd8b3/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc= +golang.org/x/net v0.0.0-20180724234803-3673e40ba225/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= +golang.org/x/net v0.0.0-20180826012351-8a410e7b638d/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= +golang.org/x/net v0.0.0-20190213061140-3a22650c66bd/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= +golang.org/x/net v0.0.0-20190311183353-d8887717615a h1:oWX7TPOiFAMXLq8o0ikBYfCJVlRHBcsciT5bXOrH628= +golang.org/x/net v0.0.0-20190311183353-d8887717615a/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= +golang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U= +golang.org/x/sync v0.0.0-20180314180146-1d60e4601c6f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.0.0-20181108010431-42b317875d0f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sys v0.0.0-20180830151530-49385e6e1522/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= +golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a h1:1BGLXjeY4akVXGgbC9HugT3Jv3hCI0z56oJR5vAMgBU= +golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= +golang.org/x/text v0.3.0 h1:g61tztE5qeGQ89tm6NTjjM9VPIm088od1l6aSorWRWg= +golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= +golang.org/x/tools v0.0.0-20190114222345-bf090417da8b/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= +golang.org/x/tools v0.0.0-20190226205152-f727befe758c/go.mod h1:9Yl7xja0Znq3iFh3HoIrodX9oNMXvdceNzlUR8zjMvY= +golang.org/x/tools v0.0.0-20190311212946-11955173bddd/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs= +golang.org/x/tools v0.0.0-20190524140312-2c0ae7006135/go.mod h1:RgjU9mgBXZiqYHBnxXauZ1Gv1EHHAz9KjViQ78xBX0Q= +google.golang.org/appengine v1.1.0/go.mod h1:EbEs0AVv82hx2wNQdGPgUI5lhzA/G0D9YwlJXL52JkM= +google.golang.org/appengine v1.4.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4= +google.golang.org/genproto v0.0.0-20180817151627-c66870c02cf8/go.mod h1:JiN7NxoALGmiZfu7CAH4rXhgtRTLTxftemlI0sWmxmc= +google.golang.org/genproto v0.0.0-20190819201941-24fa4b261c55 h1:gSJIx1SDwno+2ElGhA4+qG2zF97qiUzTM+rQ0klBOcE= +google.golang.org/genproto v0.0.0-20190819201941-24fa4b261c55/go.mod h1:DMBHOl98Agz4BDEuKkezgsaosCRResVns1a3J2ZsMNc= +google.golang.org/grpc v1.19.0/go.mod h1:mqu4LbDTu4XGKhr4mRzUsmM4RtVoemTSY81AxZiDr8c= +google.golang.org/grpc v1.23.0/go.mod h1:Y5yQAOtifL1yxbo5wqy6BxZv8vAUGQwXBOALyacEbxg= +google.golang.org/grpc v1.27.0 h1:rRYRFMVgRv6E0D70Skyfsr28tDXIuuPZyWGMPdMcnXg= +google.golang.org/grpc v1.27.0/go.mod h1:qbnxyOmOxrQa7FizSgH+ReBfzJrCY1pSN7KXBS8abTk= +honnef.co/go/tools v0.0.0-20190102054323-c2f93a96b099/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= +honnef.co/go/tools v0.0.0-20190523083050-ea95bdfd59fc/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= diff --git a/testdata/want/advance.go b/testdata/want/advance.go new file mode 100644 index 0000000..466d329 --- /dev/null +++ b/testdata/want/advance.go @@ -0,0 +1,20 @@ +package input + +import ( + "fmt" + "net/http" + + "github.com/newrelic/go-agent/v3/newrelic" +) + +// no insert because ignore comment. +// nrseg:ignore this is test. +func IgnoreHandler(w http.ResponseWriter, req *http.Request) { + fmt.Fprintf(w, "Hello, %q", req.URL.Path) +} + +// no insert because called already. +func AlreadyHandler(w http.ResponseWriter, req *http.Request) { + defer newrelic.FromContext(req.Context()).StartSegment("already_handler").End() + fmt.Fprintf(w, "Hello, %q", req.URL.Path) +}