debugger

package module
v0.6.0 Latest Latest
Warning

This package is not in the latest version of its module.

Go to latest
Published: Apr 28, 2020 License: MIT Imports: 1 Imported by: 7

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

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

This section is empty.

Variables

This section is empty.

Functions

func Middleware

Middleware allows HTTP middleware to receive debugger labels

func SetLabels

func SetLabels(l Labels)

SetLabels will set debugger labels for any function/method call

Types

type Labels

type Labels func() []string

Labels generates the labels for a function/method

type MiddlewareLabels

type MiddlewareLabels func(r *http.Request) []string

MiddlewareLabels generates labels that are aware of the request properties

Jump to

Keyboard shortcuts

? : This menu
/ : Search site
f or F : Jump to
y or Y : Canonical URL