Go

Embed
Preview of the card
<a href="https://forumulate.com/p/watchtower/docs/onboarding-go"><img src="https://forumulate.com/api/public/orgs/watchtower/spaces/docs/pages/18f28662-316a-4117-a22b-ce123cd1f054/social-card.svg?v=3e7ae33eec8b" alt="Go" width="600" height="315"></a>

<!-- status: ga language: go verified_by: go/sdk/wtotel/wtotel_test.go::TestInitSendsTracesWithKeyHeader -->

Go

Send traces from a Go service to Watchtower over OTLP/HTTP with the standard OpenTelemetry SDK. Nothing Watchtower-specific is installed: the SDK reads the standard OTEL_* variables.

  1. Create a project, then an ingestion key (wti_...) with the ingest:traces scope. The key is shown once.

  2. Point the SDK at the gateway and pass the key in the x-watchtower-key header (Authorization: Bearer wti_... works too):

export OTEL_EXPORTER_OTLP_ENDPOINT=https://ingest.example.com
export OTEL_EXPORTER_OTLP_PROTOCOL=http/protobuf
export OTEL_EXPORTER_OTLP_HEADERS=x-watchtower-key=wti_YOUR_KEY
export OTEL_SERVICE_NAME=my-service
  1. Add the SDK and run this once. The endpoint above is the gateway's base URL; the SDK appends /v1/traces.

go get go.opentelemetry.io/otel go.opentelemetry.io/otel/sdk go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracehttp
package main

import (
	"context"

	"go.opentelemetry.io/otel"
	"go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracehttp"
	sdktrace "go.opentelemetry.io/otel/sdk/trace"
)

func main() {
	ctx := context.Background()
	exp, err := otlptracehttp.New(ctx) // reads OTEL_EXPORTER_OTLP_*
	if err != nil {
		panic(err)
	}
	tp := sdktrace.NewTracerProvider(sdktrace.WithBatcher(exp))
	defer tp.Shutdown(ctx)
	otel.SetTracerProvider(tp)

	_, span := otel.Tracer("onboarding").Start(ctx, "hello-watchtower")
	span.End()
}
  1. Open the project's onboarding screen. It polls GET /v1/projects/{prj}/onboarding/first-event and turns green when the first span arrives. Then open the trace in the trace explorer.

Updated