Tracing across the stack follows, as much as possible, the Open Telemetry specifications. Configuration environment variables are specified in the OpenTelemetry Environment Variable Specification.
We use the opentelemetry-go package, which currently does not have default support
for the OTEL_TRACES_EXPORTER environment variables. Therefore, we provide some
helper functions under boxo/tracing to support these.
In this document, we document the quirks of our custom support for the OTEL_TRACES_EXPORTER,
as well as examples on how to use tracing, create traceable headers, and how
to use the Jaeger UI. The Gateway examples fully support Tracing.
For advanced configurations, such as ratio-based sampling, please see also the OpenTelemetry Environment Variable Specification.
Specifies the exporters to use as a comma-separated string. Each exporter has a set of additional environment variables used to configure it. The following values are supported:
otlpzipkinstdoutfile-- appends traces to a JSON file on the filesystem
Default: "" (no exporters)
Unless specified in this section, the OTLP exporter uses the environment variables documented in OpenTelemetry Protocol Exporter.
Specifies the OTLP protocol to use, which is one of:
grpchttp/protobuf
Default: "grpc"
See Zipkin Exporter.
Specifies the filesystem path for the JSON file.
Default: "$PWD/traces.json"
See General SDK Configuration.
One can use the jaegertracing/all-in-one Docker image to run a full Jaeger stack
and configure the Kubo daemon, or gateway examples, to publish traces to it. Here, in an
ephemeral container:
$ docker run -d --rm --name jaeger \
-e COLLECTOR_OTLP_ENABLED=true \
-e COLLECTOR_ZIPKIN_HOST_PORT=:9411 \
-p 5775:5775/udp \
-p 6831:6831/udp \
-p 6832:6832/udp \
-p 5778:5778 \
-p 16686:16686 \
-p 14250:14250 \
-p 14268:14268 \
-p 14269:14269 \
-p 4317:4317 \
-p 4318:4318 \
-p 9411:9411 \
jaegertracing/all-in-oneThen, in other terminal, start the app that uses boxo/tracing internally (e.g., a Kubo daemon), with Jaeger exporter enabled:
$ OTEL_EXPORTER_OTLP_INSECURE=true OTEL_TRACES_EXPORTER=otlp ipfs daemon --initFinally, the Jaeger UI is available at http://localhost:16686.
If you want to trace a specific request and want to have its tracing ID, you can
generate a Traceparent header. According to the Trace Context specification,
the header is formed as follows:
version-format = trace-id "-" parent-id "-" trace-flags trace-id = 32HEXDIGLC ; 16 bytes array identifier. All zeroes forbidden parent-id = 16HEXDIGLC ; 8 bytes array identifier. All zeroes forbidden trace-flags = 2HEXDIGLC ; 8 bit flags. Currently, only one bit is used. See below for details
To generate a valid Traceparent header value, the following script can be used:
version="00" # fixed in spec at 00
trace_id="$(cat /dev/urandom | tr -dc 'a-f0-9' | fold -w 32 | head -n 1)"
parent_id="00$(cat /dev/urandom | tr -dc 'a-f0-9' | fold -w 14 | head -n 1)"
trace_flag="01" # sampled
traceparent="$version-$trace_id-$parent_id-$trace_flag"
echo $traceparentNOTE: the tr command behaves differently on macOS. You may want to install
the GNU tr (gtr) and use it instead.
Then, the value can be passed onto the request with curl -H "Traceparent: $traceparent" URL.
If using Jaeger, you can now search by the trace with ID $trace_id and see
the complete trace of this request.