From cfa5a84ac6f1fa9e8021001cdc588930f509ce74 Mon Sep 17 00:00:00 2001 From: Siim Kallas Date: Tue, 27 Jul 2021 23:16:49 +0300 Subject: [PATCH 1/8] Add Jaeger HTTP exporter --- exporters/jaeger/CMakeLists.txt | 4 +- .../exporters/jaeger/jaeger_exporter.h | 8 ++- .../exporters/jaeger/jaeger_http.h | 23 +++++++ exporters/jaeger/src/THttpTransport.cc | 62 +++++++++++++++++++ exporters/jaeger/src/THttpTransport.h | 41 ++++++++++++ exporters/jaeger/src/http_transport.cc | 37 +++++++++++ exporters/jaeger/src/http_transport.h | 40 ++++++++++++ exporters/jaeger/src/jaeger_exporter.cc | 16 +++-- exporters/jaeger/src/thrift_sender.cc | 4 +- exporters/jaeger/src/transport.h | 4 +- exporters/jaeger/src/udp_transport.cc | 4 +- exporters/jaeger/src/udp_transport.h | 3 +- 12 files changed, 230 insertions(+), 16 deletions(-) create mode 100644 exporters/jaeger/include/opentelemetry/exporters/jaeger/jaeger_http.h create mode 100644 exporters/jaeger/src/THttpTransport.cc create mode 100644 exporters/jaeger/src/THttpTransport.h create mode 100644 exporters/jaeger/src/http_transport.cc create mode 100644 exporters/jaeger/src/http_transport.h diff --git a/exporters/jaeger/CMakeLists.txt b/exporters/jaeger/CMakeLists.txt index aeb0305fba..98d8124ed3 100644 --- a/exporters/jaeger/CMakeLists.txt +++ b/exporters/jaeger/CMakeLists.txt @@ -11,7 +11,7 @@ set(JAEGER_THRIFT_GENCPP_SOURCES set(JAEGER_EXPORTER_SOURCES src/jaeger_exporter.cc src/thrift_sender.cc src/udp_transport.cc - src/recordable.cc src/TUDPTransport.cc) + src/recordable.cc src/TUDPTransport.cc src/http_transport.cc src/THttpTransport.cc) add_library(opentelemetry_exporter_jaeger_trace ${JAEGER_EXPORTER_SOURCES} ${JAEGER_THRIFT_GENCPP_SOURCES}) @@ -26,7 +26,7 @@ target_include_directories( target_link_libraries( opentelemetry_exporter_jaeger_trace - PUBLIC opentelemetry_resources + PUBLIC opentelemetry_resources http_client_curl PRIVATE thrift::thrift) if(MSVC) diff --git a/exporters/jaeger/include/opentelemetry/exporters/jaeger/jaeger_exporter.h b/exporters/jaeger/include/opentelemetry/exporters/jaeger/jaeger_exporter.h index 4e046ad7d1..c81c7f2b3a 100644 --- a/exporters/jaeger/include/opentelemetry/exporters/jaeger/jaeger_exporter.h +++ b/exporters/jaeger/include/opentelemetry/exporters/jaeger/jaeger_exporter.h @@ -4,6 +4,7 @@ #pragma once #include +#include "jaeger_http.h" OPENTELEMETRY_BEGIN_NAMESPACE namespace exporter @@ -25,10 +26,11 @@ class ThriftSender; */ struct JaegerExporterOptions { - // The endpoint to export to. - std::string server_addr = "localhost"; - uint16_t server_port = 6831; TransportFormat transport_format = TransportFormat::kThriftUdpCompact; + std::string endpoint = "localhost"; + uint16_t server_port = 6831; + // Only applicable when using kThriftHttp transport. + std::vector headers; }; namespace trace_sdk = opentelemetry::sdk::trace; diff --git a/exporters/jaeger/include/opentelemetry/exporters/jaeger/jaeger_http.h b/exporters/jaeger/include/opentelemetry/exporters/jaeger/jaeger_http.h new file mode 100644 index 0000000000..4d5532f43f --- /dev/null +++ b/exporters/jaeger/include/opentelemetry/exporters/jaeger/jaeger_http.h @@ -0,0 +1,23 @@ +// Copyright The OpenTelemetry Authors +// SPDX-License-Identifier: Apache-2.0 + +#pragma once + +#include +#include + +OPENTELEMETRY_BEGIN_NAMESPACE +namespace exporter +{ +namespace jaeger +{ + +struct HttpHeader +{ + std::string key; + std::string value; +}; + +} // namespace jaeger +} // namespace exporter +OPENTELEMETRY_END_NAMESPACE \ No newline at end of file diff --git a/exporters/jaeger/src/THttpTransport.cc b/exporters/jaeger/src/THttpTransport.cc new file mode 100644 index 0000000000..d2537f5b9f --- /dev/null +++ b/exporters/jaeger/src/THttpTransport.cc @@ -0,0 +1,62 @@ +// Copyright The OpenTelemetry Authors +// SPDX-License-Identifier: Apache-2.0 + +#include "THttpTransport.h" +#include "opentelemetry/ext/http/client/http_client_factory.h" + +OPENTELEMETRY_BEGIN_NAMESPACE +namespace exporter +{ +namespace jaeger +{ + +THttpTransport::THttpTransport(std::string endpoint, const std::vector &extra_headers) + : endpoint(std::move(endpoint)), + headers({{"Content-Type", "application/vnd.apache.thrift.binary"}}), + client(ext::http::client::HttpClientFactory::CreateSync()) +{ + for (const auto &header : extra_headers) + { + headers.insert({header.key, header.value}); + } +} + +THttpTransport::~THttpTransport() {} + +bool THttpTransport::isOpen() const +{ + return true; +} + +uint32_t THttpTransport::read(uint8_t *buf, uint32_t len) +{ + (void)buf; + (void)len; + return 0; +} + +void THttpTransport::write(const uint8_t *buf, uint32_t len) +{ + request_buffer.insert(request_buffer.end(), buf, buf + len); +} + +bool THttpTransport::sendSpans() +{ + auto result = client->Post(endpoint, request_buffer, headers); + request_buffer.clear(); + if (!result) + { + return false; + } + + if (result.GetResponse().GetStatusCode() >= 400) + { + return false; + } + + return true; +} + +} // namespace jaeger +} // namespace exporter +OPENTELEMETRY_END_NAMESPACE diff --git a/exporters/jaeger/src/THttpTransport.h b/exporters/jaeger/src/THttpTransport.h new file mode 100644 index 0000000000..266ebcf7b1 --- /dev/null +++ b/exporters/jaeger/src/THttpTransport.h @@ -0,0 +1,41 @@ +// Copyright The OpenTelemetry Authors +// SPDX-License-Identifier: Apache-2.0 + +#pragma once + +#include +#include +#include + +#include + +OPENTELEMETRY_BEGIN_NAMESPACE +namespace exporter +{ +namespace jaeger +{ + +class THttpTransport : public apache::thrift::transport::TVirtualTransport +{ +public: + THttpTransport(std::string endpoint, const std::vector &extra_headers); + ~THttpTransport() override; + + bool isOpen() const override; + + uint32_t read(uint8_t *buf, uint32_t len); + + void write(const uint8_t *buf, uint32_t len); + + bool sendSpans(); + +private: + std::string endpoint; + ext::http::client::Headers headers; + std::shared_ptr client; + std::vector request_buffer; +}; + +} // namespace jaeger +} // namespace exporter +OPENTELEMETRY_END_NAMESPACE diff --git a/exporters/jaeger/src/http_transport.cc b/exporters/jaeger/src/http_transport.cc new file mode 100644 index 0000000000..c20413c810 --- /dev/null +++ b/exporters/jaeger/src/http_transport.cc @@ -0,0 +1,37 @@ +// Copyright The OpenTelemetry Authors +// SPDX-License-Identifier: Apache-2.0 + +#include "http_transport.h" + +#include + +OPENTELEMETRY_BEGIN_NAMESPACE +namespace exporter +{ +namespace jaeger +{ + +using TBinaryProtocol = apache::thrift::protocol::TBinaryProtocol; +using TTransport = apache::thrift::transport::TTransport; + +HttpTransport::HttpTransport(std::string endpoint, const std::vector &headers) +{ + endpoint_transport_ = std::make_shared(std::move(endpoint), headers); + protocol_ = std::shared_ptr(new TBinaryProtocol(endpoint_transport_)); +} + +int HttpTransport::EmitBatch(const thrift::Batch &batch) +{ + batch.write(protocol_.get()); + + if (!endpoint_transport_->sendSpans()) + { + return 0; + } + + return static_cast(batch.spans.size()); +} + +} // namespace jaeger +} // namespace exporter +OPENTELEMETRY_END_NAMESPACE diff --git a/exporters/jaeger/src/http_transport.h b/exporters/jaeger/src/http_transport.h new file mode 100644 index 0000000000..66e24ecca2 --- /dev/null +++ b/exporters/jaeger/src/http_transport.h @@ -0,0 +1,40 @@ +#pragma once + +#include "THttpTransport.h" +#include "transport.h" + +#include +#include +#include +#include +#include + +OPENTELEMETRY_BEGIN_NAMESPACE +namespace exporter +{ +namespace jaeger +{ + +using TProtocol = apache::thrift::protocol::TProtocol; + +class HttpTransport : public Transport +{ +public: + HttpTransport(std::string endpoint, const std::vector &headers); + + int EmitBatch(const thrift::Batch &batch) override; + + uint32_t MaxPacketSize() const override + { + // Default to 4 MiB POST body size. + return 1 << 22; + } + +private: + std::shared_ptr endpoint_transport_; + std::shared_ptr protocol_; +}; + +} // namespace jaeger +} // namespace exporter +OPENTELEMETRY_END_NAMESPACE diff --git a/exporters/jaeger/src/jaeger_exporter.cc b/exporters/jaeger/src/jaeger_exporter.cc index 5546248c82..2bf181c54a 100644 --- a/exporters/jaeger/src/jaeger_exporter.cc +++ b/exporters/jaeger/src/jaeger_exporter.cc @@ -5,6 +5,7 @@ #include #include +#include "http_transport.h" #include "thrift_sender.h" #include "udp_transport.h" @@ -64,14 +65,21 @@ void JaegerExporter::InitializeEndpoint() { // TODO: do we need support any authentication mechanism? auto transport = std::unique_ptr( - static_cast(new UDPTransport(options_.server_addr, options_.server_port))); + static_cast(new UDPTransport(options_.endpoint, options_.server_port))); sender_ = std::unique_ptr(new ThriftSender(std::move(transport))); + return; } - else + + if (options_.transport_format == TransportFormat::kThriftHttp) { - // The transport format is not implemented. - assert(false); + auto transport = + std::unique_ptr(new HttpTransport(options_.endpoint, options_.headers)); + sender_ = std::unique_ptr(new ThriftSender(std::move(transport))); + return; } + + // The transport format is not implemented. + assert(false); } } // namespace jaeger diff --git a/exporters/jaeger/src/thrift_sender.cc b/exporters/jaeger/src/thrift_sender.cc index 66feb6c64c..770bb81991 100644 --- a/exporters/jaeger/src/thrift_sender.cc +++ b/exporters/jaeger/src/thrift_sender.cc @@ -79,11 +79,11 @@ int ThriftSender::Flush() batch.__set_process(process_); batch.__set_spans(span_buffer_); - transport_->EmitBatch(batch); + int spans_flushed = transport_->EmitBatch(batch); ResetBuffers(); - return static_cast(batch.spans.size()); + return spans_flushed; } void ThriftSender::Close() diff --git a/exporters/jaeger/src/transport.h b/exporters/jaeger/src/transport.h index a507d5b4a3..8121e30076 100644 --- a/exporters/jaeger/src/transport.h +++ b/exporters/jaeger/src/transport.h @@ -21,8 +21,8 @@ class Transport Transport() = default; virtual ~Transport() = default; - virtual void EmitBatch(const thrift::Batch &batch) = 0; - virtual uint32_t MaxPacketSize() const = 0; + virtual int EmitBatch(const thrift::Batch &batch) = 0; + virtual uint32_t MaxPacketSize() const = 0; }; } // namespace jaeger diff --git a/exporters/jaeger/src/udp_transport.cc b/exporters/jaeger/src/udp_transport.cc index 82624ae313..1470a4260f 100644 --- a/exporters/jaeger/src/udp_transport.cc +++ b/exporters/jaeger/src/udp_transport.cc @@ -63,7 +63,7 @@ void UDPTransport::CleanSocket() #endif } -void UDPTransport::EmitBatch(const thrift::Batch &batch) +int UDPTransport::EmitBatch(const thrift::Batch &batch) { try { @@ -71,6 +71,8 @@ void UDPTransport::EmitBatch(const thrift::Batch &batch) } catch (...) {} + + return static_cast(batch.spans.size()); } } // namespace jaeger diff --git a/exporters/jaeger/src/udp_transport.h b/exporters/jaeger/src/udp_transport.h index b75987e4a5..0997a27c63 100644 --- a/exporters/jaeger/src/udp_transport.h +++ b/exporters/jaeger/src/udp_transport.h @@ -27,7 +27,6 @@ using TBinaryProtocol = apache::thrift::protocol::TBinaryProtocol; using TCompactProtocol = apache::thrift::protocol::TCompactProtocol; using TBufferedTransport = apache::thrift::transport::TBufferedTransport; using TProtocol = apache::thrift::protocol::TProtocol; -using TSocket = apache::thrift::transport::TSocket; using TTransport = apache::thrift::transport::TTransport; class UDPTransport : public Transport @@ -38,7 +37,7 @@ class UDPTransport : public Transport UDPTransport(const std::string &addr, uint16_t port); virtual ~UDPTransport(); - void EmitBatch(const thrift::Batch &batch) override; + int EmitBatch(const thrift::Batch &batch) override; uint32_t MaxPacketSize() const override { return max_packet_size_; } From bd07db9ac5a9e23af89f61e23b2293cf3bbe27ef Mon Sep 17 00:00:00 2001 From: Siim Kallas Date: Tue, 27 Jul 2021 23:29:44 +0300 Subject: [PATCH 2/8] update CHANGELOG --- CHANGELOG.md | 1 + 1 file changed, 1 insertion(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 7e1b02456f..65c8b03289 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -16,6 +16,7 @@ Increment the: ## [Unreleased] * [BUILD] Allow to use local GSL +* [EXPORTER] Jaeger Exporter - Add Thrift HTTP exporter ([#926](https://github.com/open-telemetry/opentelemetry-cpp/pull/926)) ## [1.0.0-rc3] 2021-07-12 From 5708501ae6517d4ffc30f4f2f250be645b038c89 Mon Sep 17 00:00:00 2001 From: Siim Kallas Date: Tue, 27 Jul 2021 23:45:44 +0300 Subject: [PATCH 3/8] fix CMakeLists formatting --- exporters/jaeger/CMakeLists.txt | 9 +++++++-- 1 file changed, 7 insertions(+), 2 deletions(-) diff --git a/exporters/jaeger/CMakeLists.txt b/exporters/jaeger/CMakeLists.txt index 98d8124ed3..0ae9162c61 100644 --- a/exporters/jaeger/CMakeLists.txt +++ b/exporters/jaeger/CMakeLists.txt @@ -10,8 +10,13 @@ set(JAEGER_THRIFT_GENCPP_SOURCES thrift-gen/zipkincore_types.cpp) set(JAEGER_EXPORTER_SOURCES - src/jaeger_exporter.cc src/thrift_sender.cc src/udp_transport.cc - src/recordable.cc src/TUDPTransport.cc src/http_transport.cc src/THttpTransport.cc) + src/jaeger_exporter.cc + src/thrift_sender.cc + src/udp_transport.cc + src/recordable.cc + src/TUDPTransport.cc + src/http_transport.cc + src/THttpTransport.cc) add_library(opentelemetry_exporter_jaeger_trace ${JAEGER_EXPORTER_SOURCES} ${JAEGER_THRIFT_GENCPP_SOURCES}) From 1cb8104cd047d0c38ca2bebfd059bc6bac52b8b6 Mon Sep 17 00:00:00 2001 From: Siim Kallas Date: Wed, 28 Jul 2021 00:02:06 +0300 Subject: [PATCH 4/8] update jaeger example --- examples/jaeger/main.cc | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/examples/jaeger/main.cc b/examples/jaeger/main.cc index f3f94884ca..63ed476aad 100644 --- a/examples/jaeger/main.cc +++ b/examples/jaeger/main.cc @@ -33,7 +33,7 @@ int main(int argc, char *argv[]) { if (argc == 2) { - opts.server_addr = argv[1]; + opts.endpoint = argv[1]; } // Removing this line will leave the default noop TracerProvider in place. InitTracer(); From 8818de58f5bcab1af05611f9909d17b26a9ead33 Mon Sep 17 00:00:00 2001 From: Siim Kallas Date: Wed, 28 Jul 2021 12:35:06 +0300 Subject: [PATCH 5/8] Add todo regarding logging --- exporters/jaeger/src/THttpTransport.cc | 2 ++ 1 file changed, 2 insertions(+) diff --git a/exporters/jaeger/src/THttpTransport.cc b/exporters/jaeger/src/THttpTransport.cc index d2537f5b9f..0b36398ffc 100644 --- a/exporters/jaeger/src/THttpTransport.cc +++ b/exporters/jaeger/src/THttpTransport.cc @@ -44,6 +44,8 @@ bool THttpTransport::sendSpans() { auto result = client->Post(endpoint, request_buffer, headers); request_buffer.clear(); + + // TODO: Add logging once global log handling is available. if (!result) { return false; From aa71073d710a5b81c51ec8243422a12fb3c06448 Mon Sep 17 00:00:00 2001 From: Siim Kallas Date: Wed, 28 Jul 2021 12:44:47 +0300 Subject: [PATCH 6/8] Use ext::http::client::Headers, remove HttpHeader --- .../exporters/jaeger/jaeger_exporter.h | 4 ++-- .../exporters/jaeger/jaeger_http.h | 23 ------------------- exporters/jaeger/src/THttpTransport.cc | 9 +++----- exporters/jaeger/src/THttpTransport.h | 2 +- exporters/jaeger/src/http_transport.cc | 4 ++-- exporters/jaeger/src/http_transport.h | 2 +- 6 files changed, 9 insertions(+), 35 deletions(-) delete mode 100644 exporters/jaeger/include/opentelemetry/exporters/jaeger/jaeger_http.h diff --git a/exporters/jaeger/include/opentelemetry/exporters/jaeger/jaeger_exporter.h b/exporters/jaeger/include/opentelemetry/exporters/jaeger/jaeger_exporter.h index c81c7f2b3a..31f6a8bf35 100644 --- a/exporters/jaeger/include/opentelemetry/exporters/jaeger/jaeger_exporter.h +++ b/exporters/jaeger/include/opentelemetry/exporters/jaeger/jaeger_exporter.h @@ -3,8 +3,8 @@ #pragma once +#include #include -#include "jaeger_http.h" OPENTELEMETRY_BEGIN_NAMESPACE namespace exporter @@ -30,7 +30,7 @@ struct JaegerExporterOptions std::string endpoint = "localhost"; uint16_t server_port = 6831; // Only applicable when using kThriftHttp transport. - std::vector headers; + ext::http::client::Headers headers; }; namespace trace_sdk = opentelemetry::sdk::trace; diff --git a/exporters/jaeger/include/opentelemetry/exporters/jaeger/jaeger_http.h b/exporters/jaeger/include/opentelemetry/exporters/jaeger/jaeger_http.h deleted file mode 100644 index 4d5532f43f..0000000000 --- a/exporters/jaeger/include/opentelemetry/exporters/jaeger/jaeger_http.h +++ /dev/null @@ -1,23 +0,0 @@ -// Copyright The OpenTelemetry Authors -// SPDX-License-Identifier: Apache-2.0 - -#pragma once - -#include -#include - -OPENTELEMETRY_BEGIN_NAMESPACE -namespace exporter -{ -namespace jaeger -{ - -struct HttpHeader -{ - std::string key; - std::string value; -}; - -} // namespace jaeger -} // namespace exporter -OPENTELEMETRY_END_NAMESPACE \ No newline at end of file diff --git a/exporters/jaeger/src/THttpTransport.cc b/exporters/jaeger/src/THttpTransport.cc index 0b36398ffc..cbb1b65cb2 100644 --- a/exporters/jaeger/src/THttpTransport.cc +++ b/exporters/jaeger/src/THttpTransport.cc @@ -10,15 +10,12 @@ namespace exporter namespace jaeger { -THttpTransport::THttpTransport(std::string endpoint, const std::vector &extra_headers) +THttpTransport::THttpTransport(std::string endpoint, ext::http::client::Headers extra_headers) : endpoint(std::move(endpoint)), - headers({{"Content-Type", "application/vnd.apache.thrift.binary"}}), + headers(std::move(extra_headers)), client(ext::http::client::HttpClientFactory::CreateSync()) { - for (const auto &header : extra_headers) - { - headers.insert({header.key, header.value}); - } + headers.insert({{"Content-Type", "application/vnd.apache.thrift.binary"}}); } THttpTransport::~THttpTransport() {} diff --git a/exporters/jaeger/src/THttpTransport.h b/exporters/jaeger/src/THttpTransport.h index 266ebcf7b1..10529d56ff 100644 --- a/exporters/jaeger/src/THttpTransport.h +++ b/exporters/jaeger/src/THttpTransport.h @@ -18,7 +18,7 @@ namespace jaeger class THttpTransport : public apache::thrift::transport::TVirtualTransport { public: - THttpTransport(std::string endpoint, const std::vector &extra_headers); + THttpTransport(std::string endpoint, ext::http::client::Headers extra_headers); ~THttpTransport() override; bool isOpen() const override; diff --git a/exporters/jaeger/src/http_transport.cc b/exporters/jaeger/src/http_transport.cc index c20413c810..f804ccc843 100644 --- a/exporters/jaeger/src/http_transport.cc +++ b/exporters/jaeger/src/http_transport.cc @@ -14,9 +14,9 @@ namespace jaeger using TBinaryProtocol = apache::thrift::protocol::TBinaryProtocol; using TTransport = apache::thrift::transport::TTransport; -HttpTransport::HttpTransport(std::string endpoint, const std::vector &headers) +HttpTransport::HttpTransport(std::string endpoint, ext::http::client::Headers headers) { - endpoint_transport_ = std::make_shared(std::move(endpoint), headers); + endpoint_transport_ = std::make_shared(std::move(endpoint), std::move(headers)); protocol_ = std::shared_ptr(new TBinaryProtocol(endpoint_transport_)); } diff --git a/exporters/jaeger/src/http_transport.h b/exporters/jaeger/src/http_transport.h index 66e24ecca2..fc9a783512 100644 --- a/exporters/jaeger/src/http_transport.h +++ b/exporters/jaeger/src/http_transport.h @@ -20,7 +20,7 @@ using TProtocol = apache::thrift::protocol::TProtocol; class HttpTransport : public Transport { public: - HttpTransport(std::string endpoint, const std::vector &headers); + HttpTransport(std::string endpoint, ext::http::client::Headers headers); int EmitBatch(const thrift::Batch &batch) override; From c1b909dfe1b88c4890b680b82131f00cc296eb7e Mon Sep 17 00:00:00 2001 From: Siim Kallas Date: Wed, 28 Jul 2021 13:00:05 +0300 Subject: [PATCH 7/8] remove unused include --- exporters/jaeger/src/THttpTransport.h | 1 - 1 file changed, 1 deletion(-) diff --git a/exporters/jaeger/src/THttpTransport.h b/exporters/jaeger/src/THttpTransport.h index 10529d56ff..9c796e67a0 100644 --- a/exporters/jaeger/src/THttpTransport.h +++ b/exporters/jaeger/src/THttpTransport.h @@ -3,7 +3,6 @@ #pragma once -#include #include #include From 3bf905f1c293de54e051d7b28933b8d1c3b06c52 Mon Sep 17 00:00:00 2001 From: Siim Kallas Date: Wed, 28 Jul 2021 13:17:08 +0300 Subject: [PATCH 8/8] remove unused header --- exporters/jaeger/src/http_transport.h | 1 - 1 file changed, 1 deletion(-) diff --git a/exporters/jaeger/src/http_transport.h b/exporters/jaeger/src/http_transport.h index fc9a783512..8f5c9c0571 100644 --- a/exporters/jaeger/src/http_transport.h +++ b/exporters/jaeger/src/http_transport.h @@ -3,7 +3,6 @@ #include "THttpTransport.h" #include "transport.h" -#include #include #include #include