Chapter 158 · Omnibus Instrument Error Tracking
Subchapter 158.7
references/go.mdMarkdown5 KBView on GitHub
Required
Install the PostHog Go SDK (opens in a new tab):
Terminal
PostHog AI
go get github.com/posthog/posthog-goSource context not yet supported
The Go SDK captures stack traces with file names, line numbers, and function names, but does not yet support source context (displaying the surrounding lines of code in the error tracking UI). Symbol set uploads for Go are not currently available.
2
Required
Go
PostHog AI
package main
import (
"github.com/posthog/posthog-go"
)
func main() {
client, _ := posthog.NewWithConfig(
"<ph_project_token>",
posthog.Config{
Endpoint: "https://us.i.posthog.com",
},
)
defer client.Close()
}3
Required
There are two ways to capture exceptions with the Go SDK:
Use NewDefaultException to capture errors directly. This automatically generates a UUID and stack trace for you.
Go
PostHog AI
import (
"time"
"github.com/posthog/posthog-go"
)
exception := posthog.NewDefaultException(
time.Now(),
"user_distinct_id",
"DatabaseError", // type - rendered as title in the UI
"connection refused", // value - rendered as description in the UI
)
client.Enqueue(exception)For more control, build the Exception struct manually:
Go
PostHog AI
import (
"time"
"github.com/posthog/posthog-go"
)
handled := true
fingerprint := "my-custom-fingerprint"
exception := posthog.Exception{
DistinctId: "user_distinct_id",
Timestamp: time.Now(),
ExceptionList: []posthog
The SDK provides a SlogCaptureHandler that wraps Go’s standard log/slog logger and automatically captures log records as exceptions.
By default, it captures logs at Warning level and above.
Go
PostHog AI
import (
"context"
"fmt"
"log/slog"
"os"
"github.com/posthog/posthog-go"
)
client, _ := posthog.NewWithConfig(
"<ph_project_token>",
posthog.
The handler supports several configuration options:
| Option | Description | Default |
|---|---|---|
| WithMinCaptureLevel(level) | Minimum log level to capture | slog.LevelWarn |
| WithDistinctIDFn(fn) | Function to extract distinct ID from context/record | Returns “” (skips capture) |
| WithFingerprintFn(fn) | Custom fingerprint for error grouping | nil (PostHog assigns) |
| WithSkip(n) | Stack frames to skip | 5 |
| WithStackTraceExtractor(e) | Custom stack trace extractor | DefaultStackTraceExtractor |
| WithDescriptionExtractor(e) | Custom description extractor | ErrorExtractor |
Error extraction
The slog handler automatically extracts error descriptions from log attributes with keys err or error (case-insensitive). It also supports wrapped errors via the Unwrap() interface.
4
Recommended
Trigger a test exception to confirm events are being sent to PostHog. You should see them appear in the activity feed (opens in a new tab).
Go
PostHog AI
exception := posthog.NewDefaultException(
time.Now(),
"test_user",
"TestError",
"This is a test exception from Go",
)
client.Enqueue(exception)
// Flush the queue before exiting
client.Close()Ask a question
HelpfulCould be better