Installation
Add Tracepanel to your Go app in two lines, open the panel, and learn where the agent comes from.
Tracepanel for Go is the
github.com/tracepanel/tracepanel-go
module. It records the traces of your app and sends them to the agent. Its
integrations with gin, Echo, pgx, GORM, Redis, zap, zerolog, gRPC and Kafka are
modules of their own, so the core module keeps no dependencies.
The module shares the minor version with the agent, 0.10 today, and downloads the agent of the same minor the first time. See the changelog.
Add the module
go get github.com/tracepanel/tracepanel-go@v0.10.0Tracepanel needs Go 1.26 or newer, on Linux, macOS or Windows. Its tests and an app against the real agent run on Windows too.
Add it to your app
Pass the driver's name to sql.Open through tracepanel.Driver, and
wrap the app's handler. How you wrap it depends on the router:
import tracepanel "github.com/tracepanel/tracepanel-go"
func main() {
db, err := sql.Open(tracepanel.Driver("pgx"), os.Getenv("DATABASE_URL"))
if err != nil {
log.Fatal(err)
}
app := &App{db: db}
mux := http.NewServeMux()
mux.HandleFunc("GET /books/{id}", app.showBook)
log.Fatal(http.ListenAndServe(":8080", tracepanel.WrapHandler(mux)))
}Each request is named by its ServeMux pattern, such as GET /books/{id}.
Pass the request's context down, as in
db.QueryContext(r.Context(), ...). Tracepanel finds the request's trace in
the context, so a query run without it isn't recorded. The same goes for
log records and HTTP calls.
Run the app as usual, with go run ., and open a page of it. The first
request starts the agent. Tracepanel records in development only, so a
binary built with go build records nothing unless you turn it on. See
Development only.
Open the panel
A badge in the corner of each HTML page opens the panel.
Every response carries Tracepanel-Id and Server-Timing, and
Tracepanel-Url names the trace in the console. The SDK
exposes these headers on CORS responses, so a single-page app on another
origin reads them too.
The console isn't on your app's port. The agent serves it on 127.0.0.1, on
a port of its own, and Tracepanel-Url has its address. tracepanel dev
serves it on a fixed port. See Command line.
Add .tracepanel/ to your .gitignore: it holds the project's traces.
echo ".tracepanel/" >> .gitignoreThe agent
The agent is a separate program that keeps the traces, finds the issues and serves the console. You don't install it. The first time your app runs, the SDK downloads the agent of its version for your platform from the agent's npm package. It checks the binary against the SHA-512 the SDK was released with, and keeps it in the user's cache for every project. It checks it again the first time a process runs it. The cache is the first of these that is set:
TRACEPANEL_CACHE_DIR%LOCALAPPDATA%\tracepanel\, on Windows only$XDG_CACHE_HOME/tracepanel/~/.cache/tracepanel/, on macOS too
Without a home directory, the agent is kept in the system's temporary
directory, under tracepanel/.
Without a network, the SDK runs tracepanel-agent from the PATH.
TRACEPANEL_AGENT_BIN names another agent, such as a build of your own. See
How it works.
The agent comes for these platforms:
- Linux on glibc: x86_64, arm64, i686, ppc64le, s390x and riscv64.
- Linux on musl, such as Alpine: x86_64, arm64 and i686.
- Linux on 32-bit ARM: one static build for glibc and musl.
- macOS: Apple silicon and Intel.
- Windows: x86_64, x86 and arm64.
Behind a mirror or a proxy
Where your company mirrors npm, set TRACEPANEL_NPM_REGISTRY to the
mirror. Without it, the SDK uses npm's own npm_config_registry.
export TRACEPANEL_NPM_REGISTRY=https://artifactory.corp/api/npm/npm/Where the network goes through a proxy, the download goes through
HTTPS_PROXY, and NO_PROXY lists the hosts that skip it, as Go's HTTP
client reads them.
Development only
Tracepanel records in development only, as every Tracepanel SDK does. Go has no debug mode, so the SDK records when one of these holds:
- The app runs under
go run. TRACEPANEL_ENABLED=1is set.- The app sets
Config.Enabled, such as for a staging build. Calltracepanel.Setupwith it beforeDriver, so the database is recorded too.
A binary built with go build, as your production build or a container's
is, records nothing. WrapHandler and Middleware return your handler as it
is, Driver returns the driver's own name, the integrations record
nothing, and no agent is downloaded or started. TRACEPANEL_ENABLED=0 turns
Tracepanel off, whatever else says.
To record a built binary, run it through the SDK's command, which sets
TRACEPANEL_ENABLED=1 for it:
go install github.com/tracepanel/tracepanel-go/cmd/tracepanel@v0.10.0
tracepanel run ./shoptracepanel run exits with the app's exit code. See
Command line.