Portions of Arrow C++ are instrumented with the OpenTelemetry C++ SDK which makes it possible to generate detailed tracing information which can be analyzed in other tools.

Creating a Build with OpenTelemetry Tracing Enabled

OpenTelemetry tracing is not turned on by default so you must first create a custom build of Arrow C++ with tracing turned on. See Building Arrow C++ for general instructions on creating a custom build.

To enable tracing, specify ARROW_WITH_OPENTELEMETRY=ON when generating your build. You may also want to specify CMAKE_BUILD_TYPE=RelWithDebInfo in order to get representative timings while retaining debug information.

Exporting Tracing Information

By default, no tracing information is exported until a tracing backend has been specified. The choice of tracing backend is controlled with the ARROW_TRACING_BACKEND environment variable. Possible values are:

  • ostream: emit textual log messages to stdout

  • otlp_http: emit OTLP JSON encoded traces to a HTTP server (by default, the endpoint URL is “http://localhost:4318/v1/traces”)

  • arrow_otlp_stdout: emit JSON traces to stdout

  • arrow_otlp_stderr: emit JSON traces to stderr

For example, to enable exporting JSON traces to stdout, set:

export ARROW_TRACING_BACKEND=arrow_otlp_stdout

At this point, running the program you’ve linked to your custom build of Arrow C++ should produce JSON traces on stdout.

Visualizing Traces with Jaeger UI

Analyzing trace information exported to stdout/stderr may involve writing custom processing scripts. As an alternative – or even a complement – to this process, the “all-in-one” Jaeger Docker image is a relatively straightforward way of visualizing trace data and is suitable for local development and testing.

Note: This assumes you have Docker installed.

First, change your tracing backend to otlp_http:

export ARROW_TRACING_BACKEND=otlp_http

Then start the Jaeger all-in-one container:

docker run \
  -p 16686:16686 \
  -p 4317:4317 \
  -p 4318:4318 \

Now you should be able to run your program and view any traces in a web browser at http://localhost:16686. Note that unlike with other methods of exporting traces, no output will be made to stdout/stderr. However, if you tail your Docker container logs, you should see output when traces are received by the all-in-one container.