Skip to content

Commit 0686130

Browse files
authored
GH-49382: [Python] Enable OpenTelemetry on PyArrow wheels (#49383)
### Rationale for this change Currently we are not building wheels with OpenTelemetry. ### What changes are included in this PR? - Adding a new feature on our `vcpkg.json` to install required opentelemetry-cpp - Enabling the opentelemetry feature when downloading dependencies via vcpkg for our wheels. - Setting `ARROW_WITH_OPENTELEMETRY=ON` on the wheel build scripts - Minor fix on checking exposed symbols (opentelemetry symbols are exposed) - Minor improvement to `python/examples/flight/middleware.py` to be able to easily enable opentelemetry middleware tracing for testing. - Fix on `server_tracing_middleware.cc` to retrieve tracer from `arrow::internal::tracing::GetTracer();` instead of `otel::trace::Provider::GetTracerProvider()->GetTracer("arrow");` - Expose missing symbols to enable Windows builds - Fix Windows compatibility adding windows compat header. - Add `is_opentelemetry_enabled` utility function in pyarrow to validate whether OpenTelemetry was enabled or not when building Arrow C++. Expose this information on `pa.show_info()`. ### Are these changes tested? Yes, wheels are being successfully built and tested locally with a built wheel that traces are being generated when properly configured. Added test to validate traces appear on stdout and I've also validated Acero traces are being correctly generated by running the test suite and seeing the opentelemetry traces on Jaeger UI. ### Are there any user-facing changes? Yes, PyArrow wheel users will be able to enable OpenTelemetry traces. * GitHub Issue: #49382 Authored-by: Raúl Cumplido <raulcumplido@gmail.com> Signed-off-by: Raúl Cumplido <raulcumplido@gmail.com>
1 parent 65993cd commit 0686130

20 files changed

Lines changed: 126 additions & 27 deletions

.env

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -99,8 +99,8 @@ VCPKG="66c0373dc7fca549e5803087b9487edfe3aca0a1" # 2026.01.16 Release
9999
# ci/docker/python-*-windows-*.dockerfile or the vcpkg config.
100100
# This is a workaround for our CI problem that "archery docker build" doesn't
101101
# use pulled built images in dev/tasks/python-wheels/github.windows.yml.
102-
PYTHON_WHEEL_WINDOWS_IMAGE_REVISION=2026-02-07
103-
PYTHON_WHEEL_WINDOWS_TEST_IMAGE_REVISION=2026-02-07
102+
PYTHON_WHEEL_WINDOWS_IMAGE_REVISION=2026-02-25
103+
PYTHON_WHEEL_WINDOWS_TEST_IMAGE_REVISION=2026-02-25
104104

105105
# Use conanio/${CONAN_BASE}:{CONAN_VERSION} for "docker compose run --rm conan".
106106
# See https://github.com/conan-io/conan-docker-tools#readme and

ci/docker/python-wheel-manylinux.dockerfile

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -92,6 +92,7 @@ RUN --mount=type=secret,id=github_repository_owner \
9292
--x-feature=flight \
9393
--x-feature=gcs \
9494
--x-feature=json \
95+
--x-feature=opentelemetry \
9596
--x-feature=orc \
9697
--x-feature=parquet \
9798
--x-feature=s3 && \

ci/docker/python-wheel-musllinux.dockerfile

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -92,6 +92,7 @@ RUN --mount=type=secret,id=github_repository_owner \
9292
--x-feature=flight \
9393
--x-feature=gcs \
9494
--x-feature=json \
95+
--x-feature=opentelemetry \
9596
--x-feature=orc \
9697
--x-feature=parquet \
9798
--x-feature=s3 && \

ci/docker/python-wheel-windows-vs2022-base.dockerfile

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -141,6 +141,7 @@ RUN vcpkg install `
141141
--x-feature=flight `
142142
--x-feature=gcs `
143143
--x-feature=json `
144+
--x-feature=opentelemetry `
144145
--x-feature=orc `
145146
--x-feature=parquet `
146147
--x-feature=s3

ci/scripts/python_wheel_macos_build.sh

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -73,6 +73,7 @@ echo "=== (${PYTHON_VERSION}) Building Arrow C++ libraries ==="
7373
: ${ARROW_WITH_BROTLI:=ON}
7474
: ${ARROW_WITH_BZ2:=ON}
7575
: ${ARROW_WITH_LZ4:=ON}
76+
: ${ARROW_WITH_OPENTELEMETRY:=ON}
7677
: ${ARROW_WITH_SNAPPY:=ON}
7778
: ${ARROW_WITH_ZLIB:=ON}
7879
: ${ARROW_WITH_ZSTD:=ON}
@@ -125,6 +126,7 @@ cmake \
125126
-DARROW_WITH_BROTLI=${ARROW_WITH_BROTLI} \
126127
-DARROW_WITH_BZ2=${ARROW_WITH_BZ2} \
127128
-DARROW_WITH_LZ4=${ARROW_WITH_LZ4} \
129+
-DARROW_WITH_OPENTELEMETRY=${ARROW_WITH_OPENTELEMETRY} \
128130
-DARROW_WITH_SNAPPY=${ARROW_WITH_SNAPPY} \
129131
-DARROW_WITH_ZLIB=${ARROW_WITH_ZLIB} \
130132
-DARROW_WITH_ZSTD=${ARROW_WITH_ZSTD} \

ci/scripts/python_wheel_windows_build.bat

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -53,6 +53,7 @@ set ARROW_TENSORFLOW=ON
5353
set ARROW_WITH_BROTLI=ON
5454
set ARROW_WITH_BZ2=ON
5555
set ARROW_WITH_LZ4=ON
56+
set ARROW_WITH_OPENTELEMETRY=ON
5657
set ARROW_WITH_SNAPPY=ON
5758
set ARROW_WITH_ZLIB=ON
5859
set ARROW_WITH_ZSTD=ON
@@ -94,6 +95,7 @@ cmake ^
9495
-DARROW_WITH_BROTLI=%ARROW_WITH_BROTLI% ^
9596
-DARROW_WITH_BZ2=%ARROW_WITH_BZ2% ^
9697
-DARROW_WITH_LZ4=%ARROW_WITH_LZ4% ^
98+
-DARROW_WITH_OPENTELEMETRY=%ARROW_WITH_OPENTELEMETRY% ^
9799
-DARROW_WITH_SNAPPY=%ARROW_WITH_SNAPPY% ^
98100
-DARROW_WITH_ZLIB=%ARROW_WITH_ZLIB% ^
99101
-DARROW_WITH_ZSTD=%ARROW_WITH_ZSTD% ^

ci/scripts/python_wheel_xlinux_build.sh

Lines changed: 9 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -25,7 +25,13 @@ function check_arrow_visibility {
2525
# Filter out Arrow symbols and see if anything remains.
2626
# '_init' and '_fini' symbols may or not be present, we don't care.
2727
# (note we must ignore the grep exit status when no match is found)
28-
grep ' T ' nm_arrow.log | grep -v -E '(arrow|\b_init\b|\b_fini\b)' | cat - > visible_symbols.log
28+
local allowed_symbols='(arrow|\b_init\b|\b_fini\b)'
29+
# OpenTelemetry symbols are intentionally exported for features like
30+
# automatic span linking. See cpp/src/arrow/symbols.map for more details.
31+
if [[ "${ARROW_WITH_OPENTELEMETRY:-OFF}" == "ON" ]]; then
32+
allowed_symbols="${allowed_symbols}|(opentelemetry)"
33+
fi
34+
grep ' T ' nm_arrow.log | grep -v -E "${allowed_symbols}" | cat - > visible_symbols.log
2935

3036
if [[ -f visible_symbols.log && `cat visible_symbols.log | wc -l` -eq 0 ]]; then
3137
return 0
@@ -65,6 +71,7 @@ echo "=== (${PYTHON_VERSION}) Building Arrow C++ libraries ==="
6571
: ${ARROW_WITH_BROTLI:=ON}
6672
: ${ARROW_WITH_BZ2:=ON}
6773
: ${ARROW_WITH_LZ4:=ON}
74+
: ${ARROW_WITH_OPENTELEMETRY:=ON}
6875
: ${ARROW_WITH_SNAPPY:=ON}
6976
: ${ARROW_WITH_ZLIB:=ON}
7077
: ${ARROW_WITH_ZSTD:=ON}
@@ -124,6 +131,7 @@ cmake \
124131
-DARROW_WITH_BROTLI=${ARROW_WITH_BROTLI} \
125132
-DARROW_WITH_BZ2=${ARROW_WITH_BZ2} \
126133
-DARROW_WITH_LZ4=${ARROW_WITH_LZ4} \
134+
-DARROW_WITH_OPENTELEMETRY=${ARROW_WITH_OPENTELEMETRY} \
127135
-DARROW_WITH_SNAPPY=${ARROW_WITH_SNAPPY} \
128136
-DARROW_WITH_ZLIB=${ARROW_WITH_ZLIB} \
129137
-DARROW_WITH_ZSTD=${ARROW_WITH_ZSTD} \

ci/vcpkg/vcpkg.json

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -140,6 +140,17 @@
140140
]
141141
}
142142
]
143+
},
144+
"opentelemetry": {
145+
"description": "OpenTelemetry support",
146+
"dependencies": [
147+
{
148+
"name": "opentelemetry-cpp",
149+
"features": [
150+
"otlp-http"
151+
]
152+
}
153+
]
143154
}
144155
}
145156
}

cpp/src/arrow/flight/server_tracing_middleware.cc

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -136,7 +136,7 @@ class TracingServerMiddlewareFactory : public ServerMiddlewareFactory {
136136
options.kind = otel::trace::SpanKind::kServer;
137137
options.parent = otel::trace::GetSpan(new_otel_context)->GetContext();
138138

139-
auto tracer = otel::trace::Provider::GetTracerProvider()->GetTracer("arrow");
139+
auto tracer = arrow::internal::tracing::GetTracer();
140140
auto method_name = ToString(info.method);
141141
auto span = tracer->StartSpan(
142142
method_name,

cpp/src/arrow/util/tracing_internal.h

Lines changed: 6 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,8 @@
2323
#include "arrow/util/config.h"
2424

2525
#ifdef ARROW_WITH_OPENTELEMETRY
26+
// Avoid for example defining max() macro
27+
# include "arrow/util/windows_compatibility.h"
2628
# ifdef _MSC_VER
2729
# pragma warning(push)
2830
# pragma warning(disable : 4522)
@@ -123,13 +125,13 @@ struct Scope {
123125
opentelemetry::trace::Scope scope_impl;
124126
};
125127

126-
opentelemetry::nostd::shared_ptr<opentelemetry::trace::Span>& UnwrapSpan(
128+
ARROW_EXPORT opentelemetry::nostd::shared_ptr<opentelemetry::trace::Span>& UnwrapSpan(
127129
::arrow::util::tracing::SpanDetails* span);
128130

129-
const opentelemetry::nostd::shared_ptr<opentelemetry::trace::Span>& UnwrapSpan(
130-
const ::arrow::util::tracing::SpanDetails* span);
131+
ARROW_EXPORT const opentelemetry::nostd::shared_ptr<opentelemetry::trace::Span>&
132+
UnwrapSpan(const ::arrow::util::tracing::SpanDetails* span);
131133

132-
opentelemetry::nostd::shared_ptr<opentelemetry::trace::Span>& RewrapSpan(
134+
ARROW_EXPORT opentelemetry::nostd::shared_ptr<opentelemetry::trace::Span>& RewrapSpan(
133135
::arrow::util::tracing::SpanDetails* span,
134136
opentelemetry::nostd::shared_ptr<opentelemetry::trace::Span> ot_span);
135137

0 commit comments

Comments
 (0)