Installation
To start, add the OpenTelemetry SDK and necessary instrumentation packages to your Go module. You can install them with the go get command:Initializing OpenTelemetry
Next, initialize the OpenTelemetry SDK in your application. This involves setting up a Tracer Provider (which manages tracers and spans) and oltp exporter to send the traces to TrueFoundry Backend.Automatic HTTP Instrumentation
Now that the OpenTelemetry SDK is set up, let’s instrument the HTTP server to automatically trace incoming requests. OpenTelemetry provides middleware for popular frameworks; for Go’s built-in net/http, we use the otelhttp handler. At this point, all incoming HTTP requests are being traced automatically.Context propagation for outgoing requests
To fully benefit from distributed tracing, you should also propagate trace context in your outgoing HTTP requests. This helps downstream services recognize that their requests are part of a larger distributed trace. Configure your HTTP client to automatically inject trace context into outgoing requests using OpenTelemetry’s otelhttp instrumentation:This functionality is not incorporated into the Complete Application example to reduce complexity
Adding Attributes to Spans
Automatic instrumentation captures basic request information, but you can add custom data to your traces using attributes. Attributes are key-value pairs that provide additional context about your operations. For example, in order service, you might add order.id to make traces more useful.Creating Custom Spans
Automatic instrumentation captures HTTP requests and external calls, but it doesn’t track your application’s internal logic. For important operations, you can manually create spans to trace specific parts of your code. A span represents a unit of work, and creating sub-spans helps you see detailed timing and context for key processes. For example, if a request triggers a complex function or external call that isn’t automatically captured, you can create a span to trace that specific operation. Manual instrumentation fills these gaps by letting you track what happens inside your application, not just at the edges.Complete Application Example
Below is a comprehensive example that demonstrates all the OpenTelemetry concepts we’ve covered. This application creates an order service HTTP server that sets up OpenTelemetry tracing with proper configuration, automatically instruments HTTP requests usingotelhttp
, creates custom spans for database operations, and adds custom attributes to provide order-specific context.
Advanced Configuration
Sampling
Tracing sampling is a crucial technique for managing the volume of trace data in production environments. By default, OpenTelemetry Go traces every request, which works well for debugging or development but can become expensive and noisy in high-traffic production systems. Sampling helps in several ways: it reduces noise in traces, helping you focus on important traces while maintaining visibility into your system. It also helps with cost management in terms of storage, processing, and network bandwidth, making it essential for production deployments.Sampling Strategies
OpenTelemetry supports several built-in samplers, but in practice, two cover most use cases: 1. TraceIdRatioBased Sampler Samples a fixed percentage of root traces. This sampler makes sampling decisions independently for each trace.Troubleshooting
Partial Traces If you see partial traces (missing spans in the middle of a trace), ensure you’re usingParentBased
sampler: