Ecosyste.ms: Awesome

An open API service indexing awesome lists of open source software.

Awesome Lists | Featured Topics | Projects

https://github.com/dlsniper/debugger

Debugging helper for Go
https://github.com/dlsniper/debugger

debugger debugging go goland golang

Last synced: 24 days ago
JSON representation

Debugging helper for Go

Awesome Lists containing this project

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:

![Debugger labels in GoLand](debugger-labels.png "Debugger labels in GoLand")

## How to use

Include it in your application using one of the patterns below.

Then, compile the application with `-tags debugger`, e.g.

```shell script
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:
```go
router.HandleFunc("/", homeHandler)
```

Replacement:
```go
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:
```go
func sum(a, b int) int {
return a+b
}
```

Replacement:
```go
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](LICENSE).