diff --git a/docs/dependencies.md b/docs/dependencies.md index 8d19b6490b..78dbc4bb4d 100644 --- a/docs/dependencies.md +++ b/docs/dependencies.md @@ -6,6 +6,11 @@ There are - Internal dependencies as the part of code from external libraries backported/copied in main repo. +The minimum required versions of the third-party libraries that are required can +be found in the [third_party_minimum](/install/cmake/third_party_minimum) file. +The minimum supported versions are listed here for convenience but the +authoritative source is always the linked file. + Both these dependencies are listed here: ## Internal dependencies @@ -37,8 +42,8 @@ Both these dependencies are listed here: - [OTLP/HTTP+JSON](/exporters/otlp) exporter: - - [protobuf](https://github.com/protocolbuffers/protobuf): Library to - serialize structured data. + - [protobuf](https://github.com/protocolbuffers/protobuf) (v3.21.6 or later): + Library to serialize structured data. - OTLP messages are constructed as protobuf payloads. - `protoc` compiler is used to generate C++ stubs for proto files provided by `opentelemetry-proto`. @@ -48,18 +53,19 @@ Both these dependencies are listed here: [here](https://github.com/protocolbuffers/protobuf/blob/master/LICENSE). The code generated by protoc compiler is owned by the owner of `.proto` file. - - [libcurl](https://curl.se/libcurl/) : the multiprotocol file transfer - library. + - [libcurl](https://curl.se/libcurl/) (curl-7_81_0 or later): + the multiprotocol file transfer library. - Export connects with opentelemetry collector over HTTP protocol using libcurl library - License: Inspired by `MIT/X` but not same. - - [nlohmann/json](https://github.com/nlohmann/json): JSON for Modern C++. + - [nlohmann/json](https://github.com/nlohmann/json) (v3.10.5 or later): + JSON for Modern C++. - protobuf serialized otlp messages are encoded in JSON format using this library. - License: `MIT License` - - [zlib](https://www.zlib.net/): A Massively Spiffy Yet Delicately - Unobtrusive Compression Library. + - [zlib](https://www.zlib.net/) (v1.2.11 or later): + A Massively Spiffy Yet Delicately Unobtrusive Compression Library. - The `http_client` utilizes zlib to compress the message body and send it in gzip format. - License: The library is licensed @@ -68,7 +74,7 @@ Both these dependencies are listed here: - [OTLP/gRPC](/exporters/otlp) exporter: - `protobuf` OTLP messages are constructed as protobuf payloads. - - [gRPC](https://github.com/grpc/grpc): An RPC library and framework + - [gRPC](https://github.com/grpc/grpc) (v1.49.2 or later): An RPC library and framework - Exporter communicates with OTLP collector using gRPC transport mechanism. - License: `Apache License 2.0` @@ -84,8 +90,8 @@ Both these dependencies are listed here: - [Prometheus](/exporters/prometheus) exporter: - - [`prometheus-cpp`](https://github.com/jupp0r/prometheus-cpp) Prometheus - Client Library for Modern C++ + - [`prometheus-cpp`](https://github.com/jupp0r/prometheus-cpp) + (v1.1.0 or later): Prometheus Client Library for Modern C++ - License: `MIT License` - [ElasticSearch](/exporters/elasticsearch) @@ -96,6 +102,6 @@ Both these dependencies are listed here: - [Opentracing](/opentracing-shim) shim: - [`opentracing-cpp`](https://github.com/opentracing/opentracing-cpp) - OpenTracing API for C++ + (v1.6.0 or later): OpenTracing API for C++ - A bridge layer implementing the OpenTracing API using the OpenTelemetry API - License: `Apache License 2.0` diff --git a/ext/include/opentelemetry/ext/http/client/curl/http_operation_curl.h b/ext/include/opentelemetry/ext/http/client/curl/http_operation_curl.h index d180134cae..76879fc1df 100644 --- a/ext/include/opentelemetry/ext/http/client/curl/http_operation_curl.h +++ b/ext/include/opentelemetry/ext/http/client/curl/http_operation_curl.h @@ -338,6 +338,7 @@ class HttpOperation std::promise result_promise; std::future result_future; }; + friend class HttpOperationAccessor; std::unique_ptr async_data_; }; } // namespace curl diff --git a/ext/src/http/client/curl/http_operation_curl.cc b/ext/src/http/client/curl/http_operation_curl.cc index 042ae4fe63..3fd27c9634 100644 --- a/ext/src/http/client/curl/http_operation_curl.cc +++ b/ext/src/http/client/curl/http_operation_curl.cc @@ -47,6 +47,28 @@ namespace client namespace curl { +class HttpOperationAccessor +{ +public: + OPENTELEMETRY_SANITIZER_NO_THREAD static std::thread::id GetThreadId( + const HttpOperation::AsyncData &async_data) + { +#if !(defined(OPENTELEMETRY_HAVE_THREAD_SANITIZER) && OPENTELEMETRY_HAVE_THREAD_SANITIZER) + std::atomic_thread_fence(std::memory_order_acquire); +#endif + return async_data.callback_thread; + } + + OPENTELEMETRY_SANITIZER_NO_THREAD static void SetThreadId(HttpOperation::AsyncData &async_data, + std::thread::id thread_id) + { + async_data.callback_thread = thread_id; +#if !(defined(OPENTELEMETRY_HAVE_THREAD_SANITIZER) && OPENTELEMETRY_HAVE_THREAD_SANITIZER) + std::atomic_thread_fence(std::memory_order_release); +#endif + } +}; + size_t HttpOperation::WriteMemoryCallback(void *contents, size_t size, size_t nmemb, void *userp) { HttpOperation *self = reinterpret_cast(userp); @@ -335,7 +357,7 @@ HttpOperation::~HttpOperation() case opentelemetry::ext::http::client::SessionState::Sending: { if (async_data_ && async_data_->result_future.valid()) { - if (async_data_->callback_thread != std::this_thread::get_id()) + if (HttpOperationAccessor::GetThreadId(*async_data_) != std::this_thread::get_id()) { async_data_->result_future.wait(); last_curl_result_ = async_data_->result_future.get(); @@ -360,7 +382,7 @@ void HttpOperation::Finish() if (async_data_ && async_data_->result_future.valid()) { // We should not wait in callback from Cleanup() - if (async_data_->callback_thread != std::this_thread::get_id()) + if (HttpOperationAccessor::GetThreadId(*async_data_) != std::this_thread::get_id()) { async_data_->result_future.wait(); last_curl_result_ = async_data_->result_future.get(); @@ -412,9 +434,9 @@ void HttpOperation::Cleanup() callback.swap(async_data_->callback); if (callback) { - async_data_->callback_thread = std::this_thread::get_id(); + HttpOperationAccessor::SetThreadId(*async_data_, std::this_thread::get_id()); callback(*this); - async_data_->callback_thread = std::thread::id(); + HttpOperationAccessor::SetThreadId(*async_data_, std::thread::id()); } // Set value to promise to continue Finish() diff --git a/install/cmake/third_party_minimum b/install/cmake/third_party_minimum index 004c8e597a..15470c56ac 100644 --- a/install/cmake/third_party_minimum +++ b/install/cmake/third_party_minimum @@ -4,6 +4,8 @@ # Minimum supported version git tags of third-party dependencies # Format: = +# Update docs/dependencies.md whenever the minimum version of a library is modified. + abseil=20220623.2 zlib=v1.2.11 curl=curl-7_81_0