Automatic instrumentation already meets our needs in most scenarios, but manual instrumentation allows developers to have greater control over their projects.
Based on the example/demo
, automatic instrumentation generates a trace where the HTTP service acts as the root span, with Redis and MySQL operations as child spans.
Manual instrumentation enables us to capture specific telemetry data. In example/demo/pkg/http.go
we can add a manual span to the traceService()
function that wraps database operations.
var tracer = otel.Tracer("otel-manual-instr")
func traceService(w http.ResponseWriter, r *http.Request) {
_, span := tracer.Start(r.Context(), "db init")
defer span.End()
...
}
And the generated trace in Jaeger is as follows.