README
Debugger Middleware
This package provides a debugging middleware for Go applications to enable better display of goroutines in the debugger.
It has nearly-zero performance penalty in production code when not actively used.
How this looks like in the IDE
Below you can see how this feature looks like in GoLand IDE:
How to use
Include it in your application using one of the patterns below.
Then, compile the application with -tags debugger
, e.g.
go build -tags debugger
More details on how to use this can be found in this blog post: https://blog.jetbrains.com/go/2020/03/03/how-to-find-goroutines-during-debugging/
HTTP handlers
In your code, replace the HTTP handler with the Middleware
function call.
Original:
router.HandleFunc("/", homeHandler)
Replacement:
router.HandleFunc("/", debugger.Middleware(homeHandler, func(r *http.Request) []string {
return []string{
"path", r.RequestURI,
}
}))
Non-HTTP handlers
For normal functions/methods, you can use the SetLabels
/ SetLabelsCtx
functions
to set the debugger labels.
Original:
func sum(a, b int) int {
return a+b
}
Replacement:
func sum(a, b int) int {
debugger.SetLabels(func() []string {
return []string{
"a", strconv.Itoa(a),
"b", strconv.Itoa(b),
}
})
return a+b
}
Performance
You can asses the performance of this library by running the included benchmarks in your environment.
Here are the results from my own machine (Intel Core i7 6700HQ, 32GB RAM, Windows 10),
when running with a -count=5
pass, averaged across runs.
Go 1.13.8
Without labels:
Name | go 1.13.8 | go 1.14 RC1 | ||
---|---|---|---|---|
Execution count | Time | Execution count | Time | |
BenchmarkWorkerWithout-8 | 3255558 | 370 ns/op | 3183910 | 368 ns/op |
BenchmarkWorkerWithOne-8 | 25938 | 45698 ns/op | 25643 | 46479 ns/op |
BenchmarkWorkerWithThree-8 | 15656 | 78222 ns/op | 19754 | 60131 ns/op |
BenchmarkWorkerWithTen-8 | 5776 | 216798 ns/op | 7322 | 171842 ns/op |
BenchmarkWorkerWithConv-8 | 15374 | 79609 ns/op | 19049 | 63818 ns/op |
License
This project is provided under the MIT license.
Documentation
Overview ¶
Debugger package allows an application to be compiled for production without incurring any penalty due to instrumentation.
When the time comes to use a debugger and inspect your code, use the -tags=debugger build tag to switch the implementation to one that will set labels that can be displayed in the debugger.
The current implementation relies on pprof labels to be created and then the debugger can read them and display them.
Index ¶
Constants ¶
Variables ¶
Functions ¶
func Middleware ¶
func Middleware(f http.HandlerFunc, l MiddlewareLabels) http.HandlerFunc
Middleware allows HTTP middleware to receive debugger labels
Types ¶
type MiddlewareLabels ¶
MiddlewareLabels generates labels that are aware of the request properties