Alpha

Go

The OpenTelemetry Go SDK and contrib instrumentation with WizeLens defaults, in one module. N+1 queries, SQL parameters, request bodies, and logs.

The WizeLens module

Go has no agent: services use the OpenTelemetry SDK and the contrib instrumentation. The WizeLens module sets them up in a few lines and adds what they leave out.

go get github.com/brandonkorous/wizelens/go
import wizelens "github.com/brandonkorous/wizelens/go"

shutdown, err := wizelens.Start(ctx, wizelens.WithServiceName("inventory"))
defer shutdown(context.Background())

db, err := wizelens.OpenDB("pgx", dsn, "postgresql")              // queries, with their parameters
client := &http.Client{Transport: wizelens.Transport(nil)}       // outgoing calls carry the trace
log := wizelens.Logger("inventory", slog.Default().Handler())    // log.InfoContext(ctx, ...) joins the trace
http.ListenAndServe(":8080", wizelens.Handler(mux, "inventory")) // server spans, headers, bodies
Call What it is
Start Tracer and logger providers with OTLP over HTTP to WIZELENS_HUB, W3C trace context, and sampling that keeps every trace with an error or a slow span
OpenDB, DBOptions otelsql with one span per query, named by its first word, plus wizelens.db.parameters
Handler, Capture otelhttp plus request headers and, with WIZELENS_CAPTURE_BODY=true, request and response bodies
Transport otelhttp's client transport
Logger The otelslog bridge, also writing to your own handler

OTEL_EXPORTER_OTLP_ENDPOINT and the other OTEL_* variables still win when you set them.

Plain OpenTelemetry

Already set up the SDK yourself? Point it at WizeLens and the insights work on its spans: N+1 queries, N+1 HTTP calls, slow queries, and database waits.

OTEL_EXPORTER_OTLP_ENDPOINT=http://localhost:5960
OTEL_EXPORTER_OTLP_HEADERS="Authorization=Bearer <token>"   # a shared hub or the cloud

Use the OTLP HTTP exporters (otlptracehttp, otlploghttp). Without parameters on query spans, WizeLens cannot tell whether two queries had the same values, so it does not call them duplicates. DBOptions() adds the parameters to your own otelsql.Open call.

Settings

Variable Default What it does
WIZELENS_HUB http://localhost:5960 Hub or cloud address
WIZELENS_HUB_TOKEN none Hub token or cloud ingest key
WIZELENS_PROJECT none Project on a shared hub
WIZELENS_SAMPLE_RATE 1 Share of traces kept. See Sampling
WIZELENS_KEEP_SLOW_MS 1000 Keep traces with a span this slow at any rate (off for none)
WIZELENS_KEEP_ERRORS true Keep traces with an error at any rate
WIZELENS_CAPTURE_BODY false Request and response bodies (text and JSON, 16 KB)
WIZELENS_CAPTURE_SQL_PARAMETERS true SQL parameters, sensitive names redacted
WIZELENS_CAPTURE_HEADERS true Request headers, secrets redacted
WIZELENS_REDACT_KEYS none More key fragments to redact, comma-separated
WIZELENS_ENABLED true false makes Start do nothing

A runnable sample

samples/go-net-http is a net/http service with SQLite. GET /orders shows N+1 queries, a duplicate query, and N+1 HTTP calls; GET /report shows a slow query and a database wait; GET /fail shows an error with its log line.

cd samples/go-net-http
WIZELENS_CAPTURE_BODY=true go run .