From 2e675493bda74e011e7d8e1c474df99881d207bd Mon Sep 17 00:00:00 2001 From: alyssawilk Date: Mon, 29 Jul 2024 11:17:41 -0400 Subject: [PATCH] opentracing: remove legacy open tracing extension (#35418) Risk Level: medium Testing: n/a Docs Changes: Release Notes: inline Fixes https://github.com/envoyproxy/envoy/issues/27401 Fixes https://github.com/envoyproxy/envoy/issues/34321 --------- Signed-off-by: Alyssa Wilk Signed-off-by: Martin Duke --- api/envoy/config/trace/v3/dynamic_ot.proto | 4 +- bazel/io_opentracing_cpp.patch | 159 ------------- changelogs/current.yaml | 4 + source/extensions/extensions_build_config.bzl | 1 - source/extensions/extensions_metadata.yaml | 7 - source/extensions/tracers/common/ot/BUILD | 33 --- .../common/ot/opentracing_driver_impl.cc | 220 ------------------ .../common/ot/opentracing_driver_impl.h | 96 -------- source/extensions/tracers/dynamic_ot/BUILD | 37 --- .../extensions/tracers/dynamic_ot/config.cc | 39 ---- source/extensions/tracers/dynamic_ot/config.h | 31 --- .../dynamic_opentracing_driver_impl.cc | 42 ---- .../dynamic_opentracing_driver_impl.h | 44 ---- test/extensions/tracers/common/ot/BUILD | 30 --- test/extensions/tracers/dynamic_ot/BUILD | 54 ----- .../tracers/dynamic_ot/config_test.cc | 63 ----- .../dynamic_opentracing_driver_impl_test.cc | 105 --------- 17 files changed, 6 insertions(+), 963 deletions(-) delete mode 100644 bazel/io_opentracing_cpp.patch delete mode 100644 source/extensions/tracers/common/ot/BUILD delete mode 100644 source/extensions/tracers/common/ot/opentracing_driver_impl.cc delete mode 100644 source/extensions/tracers/common/ot/opentracing_driver_impl.h delete mode 100644 source/extensions/tracers/dynamic_ot/BUILD delete mode 100644 source/extensions/tracers/dynamic_ot/config.cc delete mode 100644 source/extensions/tracers/dynamic_ot/config.h delete mode 100644 source/extensions/tracers/dynamic_ot/dynamic_opentracing_driver_impl.cc delete mode 100644 source/extensions/tracers/dynamic_ot/dynamic_opentracing_driver_impl.h delete mode 100644 test/extensions/tracers/common/ot/BUILD delete mode 100644 test/extensions/tracers/dynamic_ot/BUILD delete mode 100644 test/extensions/tracers/dynamic_ot/config_test.cc delete mode 100644 test/extensions/tracers/dynamic_ot/dynamic_opentracing_driver_impl_test.cc diff --git a/api/envoy/config/trace/v3/dynamic_ot.proto b/api/envoy/config/trace/v3/dynamic_ot.proto index d2664ef717e62..40fe8526a5f66 100644 --- a/api/envoy/config/trace/v3/dynamic_ot.proto +++ b/api/envoy/config/trace/v3/dynamic_ot.proto @@ -20,10 +20,10 @@ option (udpa.annotations.file_status).package_version_status = ACTIVE; // [#protodoc-title: Dynamically loadable OpenTracing tracer] -// DynamicOtConfig is used to dynamically load a tracer from a shared library +// DynamicOtConfig was used to dynamically load a tracer from a shared library // that implements the `OpenTracing dynamic loading API // `_. -// [#extension: envoy.tracers.dynamic_ot] +// [#not-implemented-hide:] message DynamicOtConfig { option (udpa.annotations.versioning).previous_message_type = "envoy.config.trace.v2.DynamicOtConfig"; diff --git a/bazel/io_opentracing_cpp.patch b/bazel/io_opentracing_cpp.patch deleted file mode 100644 index e4fe4710d8521..0000000000000 --- a/bazel/io_opentracing_cpp.patch +++ /dev/null @@ -1,159 +0,0 @@ -diff --git a/mocktracer/BUILD b/mocktracer/BUILD -index 3b22bab..d425e2e 100644 ---- a/mocktracer/BUILD -+++ b/mocktracer/BUILD -@@ -7,11 +7,13 @@ cc_library( - deps = [ - "//:opentracing", - ], -+ alwayslink = 1, - ) - - cc_binary( - name = "libmocktracer_plugin.so", - linkshared = 1, -+ linkstatic = 1, - visibility = ["//visibility:public"], - deps = [ - "//mocktracer:mocktracer" -diff --git a/src/dynamic_load_unix.cpp b/src/dynamic_load_unix.cpp -index 17e08fd..7e8ac02 100644 ---- a/src/dynamic_load_unix.cpp -+++ b/src/dynamic_load_unix.cpp -@@ -35,7 +35,13 @@ DynamicallyLoadTracingLibrary(const char* shared_library, - std::string& error_message) noexcept try { - dlerror(); // Clear any existing error. - -- const auto handle = dlopen(shared_library, RTLD_NOW | RTLD_LOCAL); -+ const auto handle = dlopen(shared_library, RTLD_NOW | RTLD_LOCAL -+#if defined(__has_feature) -+#if __has_feature(address_sanitizer) -+ | RTLD_NODELETE -+#endif -+#endif -+ ); - if (handle == nullptr) { - error_message = dlerror(); - return make_unexpected(dynamic_load_failure_error); -# commit 3a6f049c123a1906c7381e824292c18fd8698293 -# Author: Christian Neumüller -# Date: Wed Feb 27 01:48:17 2019 +0100 -# -# Fix MSVC compiler flags. (#104) -# -# * All debug specific flags would be replaced by release specific on MSVC. -# * The OPENTRACING_STATIC flag would be missing from OpenTracingConfig.cmake when linking against OpenTracing::opentracing-static -# -diff --git a/CMakeLists.txt b/CMakeLists.txt -index 1721fb3..3873b3a 100644 ---- a/CMakeLists.txt -+++ b/CMakeLists.txt -@@ -52,7 +52,7 @@ if ("${CMAKE_CXX_COMPILER_ID}" MATCHES "Clang") - elseif ("${CMAKE_CXX_COMPILER_ID}" STREQUAL "GNU") - set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -Wall -Wextra") - elseif ("${CMAKE_CXX_COMPILER_ID}" STREQUAL "MSVC") -- set(CMAKE_CXX_FLAGS_DEBUG "${CMAKE_CXX_FLAGS_RELEASE} -D_SCL_SECURE_NO_WARNINGS") -+ set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -D_SCL_SECURE_NO_WARNINGS") - endif() - - # ============================================================================== -diff --git a/include/opentracing/config.h b/include/opentracing/config.h -new file mode 100755 -index 0000000..cae3e61 ---- /dev/null -+++ b/include/opentracing/config.h -@@ -0,0 +1,3 @@ -+#pragma once -+ -+#define OPENTRACING_BUILD_DYNAMIC_LOADING -diff --git a/include/opentracing/version.h b/include/opentracing/version.h -new file mode 100755 -index 0000000..25b9945 ---- /dev/null -+++ b/include/opentracing/version.h -@@ -0,0 +1,14 @@ -+#ifndef OPENTRACING_VERSION_H -+#define OPENTRACING_VERSION_H -+ -+#define OPENTRACING_VERSION "1.5.1" -+#define OPENTRACING_ABI_VERSION "2" -+ -+// clang-format off -+#define BEGIN_OPENTRACING_ABI_NAMESPACE \ -+ inline namespace v2 { -+#define END_OPENTRACING_ABI_NAMESPACE \ -+ } // namespace v2 -+// clang-format on -+ -+#endif // OPENTRACING_VERSION_H -diff --git a/BUILD.bazel b/BUILD.bazel -index c57dc9f..587bf0e 100644 ---- a/BUILD.bazel -+++ b/BUILD.bazel -@@ -1,10 +1,7 @@ - cc_library( - name = "opentracing", - srcs = glob(["src/**/*.cpp"], exclude=["src/dynamic_load_unsupported.cpp", "src/dynamic_load_windows.cpp"]), -- hdrs = glob(["include/opentracing/**/*.h"]) + [ -- ":include/opentracing/config.h", -- ":include/opentracing/version.h", -- ], -+ hdrs = glob(["include/opentracing/**/*.h"]), - strip_include_prefix = "include", - visibility = ["//visibility:public"], - deps = [ -@@ -15,27 +12,3 @@ cc_library( - "-ldl", - ], - ) -- --genrule( -- name = "generate_version_h", -- srcs = glob([ -- "*", -- "cmake/*", -- "src/**/*.cpp", -- ]), -- outs = [ -- "include/opentracing/config.h", -- "include/opentracing/version.h" -- ], -- cmd = """ -- TEMP_DIR=$$(mktemp -d) -- CONFIG_H_OUT=$${PWD}/$(location :include/opentracing/config.h) -- VERSION_H_OUT=$${PWD}/$(location :include/opentracing/version.h) -- OPENTRACING_ROOT=$$(dirname $${PWD}/$(location :CMakeLists.txt)) -- cd $$TEMP_DIR -- cmake -DBUILD_TESTING=OFF -DBUILD_MOCKTRACER=OFF -L $$OPENTRACING_ROOT -- mv include/opentracing/config.h $$CONFIG_H_OUT -- mv include/opentracing/version.h $$VERSION_H_OUT -- rm -rf $$TEMP_DIR -- """, --) -diff --git a/3rd_party/include/opentracing/variant/variant.hpp b/3rd_party/include/opentracing/variant/variant.hpp ---- a/3rd_party/include/opentracing/variant/variant.hpp 2023-07-11 17:17:48.563874883 +0000 -+++ b/3rd_party/include/opentracing/variant/variant.hpp 2023-07-11 17:45:38.558235212 +0000 -@@ -167,7 +167,11 @@ - template - struct result_of_unary_visit - { -+#if __cplusplus >= 202002L -+ using type = typename std::invoke_result::type; -+#else - using type = typename std::result_of::type; -+#endif - }; - - template -@@ -179,7 +183,11 @@ - template - struct result_of_binary_visit - { -+#if __cplusplus >= 202002L -+ using type = typename std::invoke_result::type; -+#else - using type = typename std::result_of::type; -+#endif - }; - - template \ No newline at end of file diff --git a/changelogs/current.yaml b/changelogs/current.yaml index 4f616f951122a..fc742db04eb12 100644 --- a/changelogs/current.yaml +++ b/changelogs/current.yaml @@ -2,6 +2,10 @@ date: Pending behavior_changes: # *Changes that are expected to cause an incompatibility if applicable; deployment changes are likely required* +- area: tracing + change: | + Removed support for (long deprecated) opentracing. See `issue 27401 + `_ for details. minor_behavior_changes: # *Changes that may cause incompatibilities for some users, but should not for most* diff --git a/source/extensions/extensions_build_config.bzl b/source/extensions/extensions_build_config.bzl index b1fbdbaa88309..ed7cb6a0391d0 100644 --- a/source/extensions/extensions_build_config.bzl +++ b/source/extensions/extensions_build_config.bzl @@ -267,7 +267,6 @@ EXTENSIONS = { # Tracers # - "envoy.tracers.dynamic_ot": "//source/extensions/tracers/dynamic_ot:config", "envoy.tracers.datadog": "//source/extensions/tracers/datadog:config", "envoy.tracers.zipkin": "//source/extensions/tracers/zipkin:config", "envoy.tracers.opencensus": "//source/extensions/tracers/opencensus:config", diff --git a/source/extensions/extensions_metadata.yaml b/source/extensions/extensions_metadata.yaml index 761c5913ef49b..483b4294bc84c 100644 --- a/source/extensions/extensions_metadata.yaml +++ b/source/extensions/extensions_metadata.yaml @@ -1201,13 +1201,6 @@ envoy.tracers.datadog: status: stable type_urls: - envoy.config.trace.v3.DatadogConfig -envoy.tracers.dynamic_ot: - categories: - - envoy.tracers - security_posture: unknown - status: stable - type_urls: - - envoy.config.trace.v3.DynamicOtConfig envoy.tracers.opencensus: categories: - envoy.tracers diff --git a/source/extensions/tracers/common/ot/BUILD b/source/extensions/tracers/common/ot/BUILD deleted file mode 100644 index 2612bf77a4613..0000000000000 --- a/source/extensions/tracers/common/ot/BUILD +++ /dev/null @@ -1,33 +0,0 @@ -load( - "//bazel:envoy_build_system.bzl", - "envoy_cc_library", - "envoy_extension_package", -) - -licenses(["notice"]) # Apache 2 - -envoy_extension_package() - -envoy_cc_library( - name = "opentracing_driver_lib", - srcs = [ - "opentracing_driver_impl.cc", - ], - hdrs = [ - "opentracing_driver_impl.h", - ], - external_deps = ["opentracing"], - deps = [ - "//envoy/runtime:runtime_interface", - "//envoy/thread_local:thread_local_interface", - "//envoy/tracing:trace_driver_interface", - "//envoy/upstream:cluster_manager_interface", - "//source/common/common:base64_lib", - "//source/common/common:empty_string", - "//source/common/http:header_map_lib", - "//source/common/json:json_loader_lib", - "//source/common/tracing:common_values_lib", - "//source/common/tracing:null_span_lib", - "//source/common/tracing:trace_context_lib", - ], -) diff --git a/source/extensions/tracers/common/ot/opentracing_driver_impl.cc b/source/extensions/tracers/common/ot/opentracing_driver_impl.cc deleted file mode 100644 index 3c1ecafb9632b..0000000000000 --- a/source/extensions/tracers/common/ot/opentracing_driver_impl.cc +++ /dev/null @@ -1,220 +0,0 @@ -#include "source/extensions/tracers/common/ot/opentracing_driver_impl.h" - -#include - -#include "envoy/stats/scope.h" - -#include "source/common/common/assert.h" -#include "source/common/common/base64.h" -#include "source/common/common/utility.h" -#include "source/common/http/header_map_impl.h" -#include "source/common/tracing/common_values.h" -#include "source/common/tracing/null_span_impl.h" -#include "source/common/tracing/trace_context_impl.h" - -namespace Envoy { -namespace Extensions { -namespace Tracers { -namespace Common { -namespace Ot { - -Http::RegisterCustomInlineHeader - ot_span_context_handle(Http::CustomHeaders::get().OtSpanContext); - -namespace { - -const Tracing::TraceContextHandler& otSpanContextHeader() { - CONSTRUCT_ON_FIRST_USE(Tracing::TraceContextHandler, Http::CustomHeaders::get().OtSpanContext); -} - -/** - * TODO(wbpcode): Use opentracing::TextMapWriter to replace opentracing::HTTPHeadersWriter. - */ -class OpenTracingHeadersWriter : public opentracing::HTTPHeadersWriter { -public: - explicit OpenTracingHeadersWriter(Tracing::TraceContext& trace_context) - : trace_context_(trace_context) {} - - // opentracing::HTTPHeadersWriter - opentracing::expected Set(opentracing::string_view key, - opentracing::string_view value) const override { - Http::LowerCaseString lowercase_key{{key.data(), key.size()}}; - trace_context_.set(lowercase_key, {value.data(), value.size()}); - return {}; - } - -private: - Tracing::TraceContext& trace_context_; -}; - -/** - * TODO(wbpcode): Use opentracing::TextMapReader to replace opentracing::HTTPHeadersReader. - */ -class OpenTracingHeadersReader : public opentracing::HTTPHeadersReader { -public: - explicit OpenTracingHeadersReader(const Tracing::TraceContext& trace_context) - : trace_context_(trace_context) {} - - using OpenTracingCb = std::function(opentracing::string_view, - opentracing::string_view)>; - - // opentracing::HTTPHeadersReader - opentracing::expected - LookupKey(opentracing::string_view key) const override { - Http::LowerCaseString lowercase_key{{key.data(), key.size()}}; - const auto entry = trace_context_.get(lowercase_key); - if (entry.has_value()) { - return opentracing::string_view{entry.value().data(), entry.value().length()}; - } else { - return opentracing::make_unexpected(opentracing::key_not_found_error); - } - } - - opentracing::expected ForeachKey(OpenTracingCb f) const override { - trace_context_.forEach([cb = std::move(f)](absl::string_view key, absl::string_view val) { - opentracing::string_view opentracing_key{key.data(), key.length()}; - opentracing::string_view opentracing_val{val.data(), val.length()}; - return static_cast(cb(opentracing_key, opentracing_val)); - }); - return {}; - } - -private: - const Tracing::TraceContext& trace_context_; -}; -} // namespace - -OpenTracingSpan::OpenTracingSpan(OpenTracingDriver& driver, - std::unique_ptr&& span) - : driver_{driver}, span_(std::move(span)) {} - -void OpenTracingSpan::finishSpan() { span_->FinishWithOptions(finish_options_); } - -void OpenTracingSpan::setOperation(absl::string_view operation) { - span_->SetOperationName({operation.data(), operation.length()}); -} - -void OpenTracingSpan::setTag(absl::string_view name, absl::string_view value) { - span_->SetTag({name.data(), name.length()}, - opentracing::v2::string_view{value.data(), value.length()}); -} - -void OpenTracingSpan::log(SystemTime timestamp, const std::string& event) { - opentracing::LogRecord record{timestamp, {{Tracing::Logs::get().EventKey, event}}}; - finish_options_.log_records.emplace_back(std::move(record)); -} - -void OpenTracingSpan::setBaggage(absl::string_view key, absl::string_view value) { - span_->SetBaggageItem({key.data(), key.length()}, {value.data(), value.length()}); -} - -std::string OpenTracingSpan::getBaggage(absl::string_view key) { - return span_->BaggageItem({key.data(), key.length()}); -} - -void OpenTracingSpan::injectContext(Tracing::TraceContext& trace_context, - const Tracing::UpstreamContext&) { - if (driver_.propagationMode() == OpenTracingDriver::PropagationMode::SingleHeader) { - // Inject the span context using Envoy's single-header format. - std::ostringstream oss; - const opentracing::expected was_successful = - span_->tracer().Inject(span_->context(), oss); - if (!was_successful) { - ENVOY_LOG(debug, "Failed to inject span context: {}", was_successful.error().message()); - driver_.tracerStats().span_context_injection_error_.inc(); - return; - } - const std::string current_span_context = oss.str(); - otSpanContextHeader().setRefKey( - trace_context, Base64::encode(current_span_context.c_str(), current_span_context.length())); - } else { - // Inject the context using the tracer's standard header format. - const OpenTracingHeadersWriter writer{trace_context}; - const opentracing::expected was_successful = - span_->tracer().Inject(span_->context(), writer); - if (!was_successful) { - ENVOY_LOG(debug, "Failed to inject span context: {}", was_successful.error().message()); - driver_.tracerStats().span_context_injection_error_.inc(); - return; - } - } -} - -void OpenTracingSpan::setSampled(bool sampled) { - span_->SetTag(opentracing::ext::sampling_priority, sampled ? 1 : 0); -} - -Tracing::SpanPtr OpenTracingSpan::spawnChild(const Tracing::Config&, const std::string& name, - SystemTime start_time) { - std::unique_ptr ot_span = span_->tracer().StartSpan( - name, {opentracing::ChildOf(&span_->context()), opentracing::StartTimestamp(start_time)}); - RELEASE_ASSERT(ot_span != nullptr, ""); - return Tracing::SpanPtr{new OpenTracingSpan{driver_, std::move(ot_span)}}; -} - -OpenTracingDriver::OpenTracingDriver(Stats::Scope& scope) - : tracer_stats_{OPENTRACING_TRACER_STATS(POOL_COUNTER_PREFIX(scope, "tracing.opentracing."))} {} - -Tracing::SpanPtr OpenTracingDriver::startSpan(const Tracing::Config& config, - Tracing::TraceContext& trace_context, - const StreamInfo::StreamInfo& stream_info, - const std::string& operation_name, - Tracing::Decision tracing_decision) { - const PropagationMode propagation_mode = this->propagationMode(); - const opentracing::Tracer& tracer = this->tracer(); - std::unique_ptr active_span; - std::unique_ptr parent_span_ctx; - - const auto entry = otSpanContextHeader().get(trace_context); - if (propagation_mode == PropagationMode::SingleHeader && entry.has_value()) { - opentracing::expected> parent_span_ctx_maybe; - std::string parent_context = Base64::decode(std::string(entry.value())); - - if (!parent_context.empty()) { - InputConstMemoryStream istream{parent_context.data(), parent_context.size()}; - parent_span_ctx_maybe = tracer.Extract(istream); - } else { - parent_span_ctx_maybe = - opentracing::make_unexpected(opentracing::span_context_corrupted_error); - } - - if (parent_span_ctx_maybe) { - parent_span_ctx = std::move(*parent_span_ctx_maybe); - } else { - ENVOY_LOG(debug, "Failed to extract span context: {}", - parent_span_ctx_maybe.error().message()); - tracerStats().span_context_extraction_error_.inc(); - } - } else if (propagation_mode == PropagationMode::TracerNative) { - const OpenTracingHeadersReader reader{trace_context}; - opentracing::expected> parent_span_ctx_maybe = - tracer.Extract(reader); - if (parent_span_ctx_maybe) { - parent_span_ctx = std::move(*parent_span_ctx_maybe); - } else { - ENVOY_LOG(debug, "Failed to extract span context: {}", - parent_span_ctx_maybe.error().message()); - tracerStats().span_context_extraction_error_.inc(); - } - } - opentracing::StartSpanOptions options; - options.references.emplace_back(opentracing::SpanReferenceType::ChildOfRef, - parent_span_ctx.get()); - options.start_system_timestamp = stream_info.startTime(); - if (!tracing_decision.traced) { - options.tags.emplace_back(opentracing::ext::sampling_priority, 0); - } - active_span = tracer.StartSpanWithOptions(operation_name, options); - RELEASE_ASSERT(active_span != nullptr, ""); - active_span->SetTag(opentracing::ext::span_kind, - config.operationName() == Tracing::OperationName::Egress - ? opentracing::ext::span_kind_rpc_client - : opentracing::ext::span_kind_rpc_server); - return Tracing::SpanPtr{new OpenTracingSpan{*this, std::move(active_span)}}; -} - -} // namespace Ot -} // namespace Common -} // namespace Tracers -} // namespace Extensions -} // namespace Envoy diff --git a/source/extensions/tracers/common/ot/opentracing_driver_impl.h b/source/extensions/tracers/common/ot/opentracing_driver_impl.h deleted file mode 100644 index b06323043f8d7..0000000000000 --- a/source/extensions/tracers/common/ot/opentracing_driver_impl.h +++ /dev/null @@ -1,96 +0,0 @@ -#pragma once - -#include - -#include "envoy/stats/scope.h" -#include "envoy/tracing/trace_driver.h" - -#include "source/common/common/empty_string.h" -#include "source/common/common/logger.h" -#include "source/common/singleton/const_singleton.h" - -#include "opentracing/ext/tags.h" -#include "opentracing/tracer.h" - -namespace Envoy { -namespace Extensions { -namespace Tracers { -namespace Common { -namespace Ot { - -#define OPENTRACING_TRACER_STATS(COUNTER) \ - COUNTER(span_context_extraction_error) \ - COUNTER(span_context_injection_error) - -struct OpenTracingTracerStats { - OPENTRACING_TRACER_STATS(GENERATE_COUNTER_STRUCT) -}; - -class OpenTracingDriver; - -class OpenTracingSpan : public Tracing::Span, Logger::Loggable { -public: - OpenTracingSpan(OpenTracingDriver& driver, std::unique_ptr&& span); - - // Tracing::Span - void finishSpan() override; - void setOperation(absl::string_view operation) override; - void setTag(absl::string_view name, const absl::string_view) override; - void log(SystemTime timestamp, const std::string& event) override; - void injectContext(Tracing::TraceContext& trace_context, - const Tracing::UpstreamContext&) override; - Tracing::SpanPtr spawnChild(const Tracing::Config& config, const std::string& name, - SystemTime start_time) override; - void setSampled(bool) override; - std::string getBaggage(absl::string_view key) override; - void setBaggage(absl::string_view key, absl::string_view value) override; - - // TODO(#34412): These two methods are unimplemented for OpenTracing. - // They won't be implemented because OpenTracing was deprecated. - // Maybe we should remove them in the future? - std::string getTraceId() const override { return EMPTY_STRING; }; - std::string getSpanId() const override { return EMPTY_STRING; }; - -private: - OpenTracingDriver& driver_; - opentracing::FinishSpanOptions finish_options_; - std::unique_ptr span_; -}; - -/** - * This driver can be used by tracing libraries implementing the OpenTracing API (see - * https://github.com/opentracing/opentracing-cpp) to hook into Envoy's tracing functionality with a - * minimal amount of effort. Libraries need only provide an opentracing::Tracer implementation; the - * rest of span creation is taken care of by this class. - */ -class OpenTracingDriver : public Tracing::Driver, protected Logger::Loggable { -public: - explicit OpenTracingDriver(Stats::Scope& scope); - - // Tracing::Driver - Tracing::SpanPtr startSpan(const Tracing::Config& config, Tracing::TraceContext& trace_context, - const StreamInfo::StreamInfo& stream_info, - const std::string& operation_name, - Tracing::Decision tracing_decision) override; - - virtual opentracing::Tracer& tracer() PURE; - - enum class PropagationMode { SingleHeader, TracerNative }; - - /** - * Controls how span context is propagated in HTTP headers. PropagationMode::SingleHeader will - * propagate span context as a single header within the inline header HeaderMap::OtSpanContext; - * otherwise, span context will be propagated using the native format of the tracing library. - */ - virtual PropagationMode propagationMode() const { return PropagationMode::SingleHeader; } - - OpenTracingTracerStats& tracerStats() { return tracer_stats_; } - -private: - OpenTracingTracerStats tracer_stats_; -}; -} // namespace Ot -} // namespace Common -} // namespace Tracers -} // namespace Extensions -} // namespace Envoy diff --git a/source/extensions/tracers/dynamic_ot/BUILD b/source/extensions/tracers/dynamic_ot/BUILD deleted file mode 100644 index 8a3bb1937ed38..0000000000000 --- a/source/extensions/tracers/dynamic_ot/BUILD +++ /dev/null @@ -1,37 +0,0 @@ -load( - "//bazel:envoy_build_system.bzl", - "envoy_cc_extension", - "envoy_cc_library", - "envoy_extension_package", -) - -licenses(["notice"]) # Apache 2 - -# Trace driver for dynamically loadable C++ OpenTracing drivers (http://opentracing.io/). - -envoy_extension_package() - -envoy_cc_library( - name = "dynamic_opentracing_driver_lib", - srcs = [ - "dynamic_opentracing_driver_impl.cc", - ], - hdrs = [ - "dynamic_opentracing_driver_impl.h", - ], - deps = [ - "//source/common/tracing:http_tracer_lib", - "//source/extensions/tracers/common/ot:opentracing_driver_lib", - ], -) - -envoy_cc_extension( - name = "config", - srcs = ["config.cc"], - hdrs = ["config.h"], - deps = [ - ":dynamic_opentracing_driver_lib", - "//source/extensions/tracers/common:factory_base_lib", - "@envoy_api//envoy/config/trace/v3:pkg_cc_proto", - ], -) diff --git a/source/extensions/tracers/dynamic_ot/config.cc b/source/extensions/tracers/dynamic_ot/config.cc deleted file mode 100644 index 79409774522cf..0000000000000 --- a/source/extensions/tracers/dynamic_ot/config.cc +++ /dev/null @@ -1,39 +0,0 @@ -#include "source/extensions/tracers/dynamic_ot/config.h" - -#include "envoy/config/trace/v3/dynamic_ot.pb.h" -#include "envoy/config/trace/v3/dynamic_ot.pb.validate.h" -#include "envoy/registry/registry.h" - -#include "source/common/common/utility.h" -#include "source/extensions/tracers/dynamic_ot/dynamic_opentracing_driver_impl.h" - -namespace Envoy { -namespace Extensions { -namespace Tracers { -namespace DynamicOt { - -DynamicOpenTracingTracerFactory::DynamicOpenTracingTracerFactory() - : FactoryBase("envoy.tracers.dynamic_ot") {} - -Tracing::DriverSharedPtr DynamicOpenTracingTracerFactory::createTracerDriverTyped( - const envoy::config::trace::v3::DynamicOtConfig& proto_config, - Server::Configuration::TracerFactoryContext& context) { - const std::string& library = proto_config.library(); - const ProtobufWkt::Struct& config_struct = proto_config.config(); - absl::StatusOr json_or_error = MessageUtil::getJsonStringFromMessage(config_struct); - ENVOY_BUG(json_or_error.ok(), "Failed to parse json"); - const std::string config = json_or_error.ok() ? json_or_error.value() : ""; - return std::make_shared(context.serverFactoryContext().scope(), library, - config); -} - -/** - * Static registration for the dynamic opentracing tracer. @see RegisterFactory. - */ -LEGACY_REGISTER_FACTORY(DynamicOpenTracingTracerFactory, Server::Configuration::TracerFactory, - "envoy.dynamic.ot"); - -} // namespace DynamicOt -} // namespace Tracers -} // namespace Extensions -} // namespace Envoy diff --git a/source/extensions/tracers/dynamic_ot/config.h b/source/extensions/tracers/dynamic_ot/config.h deleted file mode 100644 index 61be3be55c27f..0000000000000 --- a/source/extensions/tracers/dynamic_ot/config.h +++ /dev/null @@ -1,31 +0,0 @@ -#pragma once - -#include "envoy/config/trace/v3/dynamic_ot.pb.h" -#include "envoy/config/trace/v3/dynamic_ot.pb.validate.h" - -#include "source/extensions/tracers/common/factory_base.h" - -namespace Envoy { -namespace Extensions { -namespace Tracers { -namespace DynamicOt { - -/** - * Config registration for the dynamic opentracing tracer. @see TracerFactory. - */ -class DynamicOpenTracingTracerFactory - : public Common::FactoryBase { -public: - DynamicOpenTracingTracerFactory(); - -private: - // FactoryBase - Tracing::DriverSharedPtr - createTracerDriverTyped(const envoy::config::trace::v3::DynamicOtConfig& configuration, - Server::Configuration::TracerFactoryContext& context) override; -}; - -} // namespace DynamicOt -} // namespace Tracers -} // namespace Extensions -} // namespace Envoy diff --git a/source/extensions/tracers/dynamic_ot/dynamic_opentracing_driver_impl.cc b/source/extensions/tracers/dynamic_ot/dynamic_opentracing_driver_impl.cc deleted file mode 100644 index 583fbfd6bb6fe..0000000000000 --- a/source/extensions/tracers/dynamic_ot/dynamic_opentracing_driver_impl.cc +++ /dev/null @@ -1,42 +0,0 @@ -#include "source/extensions/tracers/dynamic_ot/dynamic_opentracing_driver_impl.h" - -#include "source/common/common/assert.h" - -namespace Envoy { -namespace Extensions { -namespace Tracers { -namespace DynamicOt { - -DynamicOpenTracingDriver::DynamicOpenTracingDriver(Stats::Scope& scope, const std::string& library, - const std::string& tracer_config) - : OpenTracingDriver{scope} { - std::string error_message; - opentracing::expected library_handle_maybe = - opentracing::DynamicallyLoadTracingLibrary(library.c_str(), error_message); - if (!library_handle_maybe) { - throw EnvoyException{formatErrorMessage(library_handle_maybe.error(), error_message)}; - } - library_handle_ = std::move(*library_handle_maybe); - - opentracing::expected> tracer_maybe = - library_handle_.tracer_factory().MakeTracer(tracer_config.c_str(), error_message); - if (!tracer_maybe) { - throw EnvoyException{formatErrorMessage(tracer_maybe.error(), error_message)}; - } - tracer_ = std::move(*tracer_maybe); - RELEASE_ASSERT(tracer_ != nullptr, ""); -} - -std::string DynamicOpenTracingDriver::formatErrorMessage(std::error_code error_code, - const std::string& error_message) { - if (error_message.empty()) { - return absl::StrCat("", error_code.message()); - } else { - return fmt::format("{}: {}", error_code.message(), error_message); - } -} - -} // namespace DynamicOt -} // namespace Tracers -} // namespace Extensions -} // namespace Envoy diff --git a/source/extensions/tracers/dynamic_ot/dynamic_opentracing_driver_impl.h b/source/extensions/tracers/dynamic_ot/dynamic_opentracing_driver_impl.h deleted file mode 100644 index 712283919b365..0000000000000 --- a/source/extensions/tracers/dynamic_ot/dynamic_opentracing_driver_impl.h +++ /dev/null @@ -1,44 +0,0 @@ -#pragma once - -#include "envoy/runtime/runtime.h" -#include "envoy/thread_local/thread_local.h" -#include "envoy/upstream/cluster_manager.h" - -#include "source/extensions/tracers/common/ot/opentracing_driver_impl.h" - -#include "opentracing/dynamic_load.h" - -namespace Envoy { -namespace Extensions { -namespace Tracers { -namespace DynamicOt { - -/** - * This driver provides support for dynamically loading tracing libraries into Envoy that provide an - * implementation of the OpenTracing API (see https://github.com/opentracing/opentracing-cpp). - * TODO(rnburn): Add an example showing how to use a tracer library with this driver. - */ -class DynamicOpenTracingDriver : public Common::Ot::OpenTracingDriver { -public: - DynamicOpenTracingDriver(Stats::Scope& scope, const std::string& library, - const std::string& tracer_config); - - static std::string formatErrorMessage(std::error_code error_code, - const std::string& error_message); - - // Tracer::OpenTracingDriver - opentracing::Tracer& tracer() override { return *tracer_; } - - PropagationMode propagationMode() const override { - return OpenTracingDriver::PropagationMode::TracerNative; - } - -private: - opentracing::DynamicTracingLibraryHandle library_handle_; - std::shared_ptr tracer_; -}; - -} // namespace DynamicOt -} // namespace Tracers -} // namespace Extensions -} // namespace Envoy diff --git a/test/extensions/tracers/common/ot/BUILD b/test/extensions/tracers/common/ot/BUILD deleted file mode 100644 index e27a825efa2a7..0000000000000 --- a/test/extensions/tracers/common/ot/BUILD +++ /dev/null @@ -1,30 +0,0 @@ -load( - "//bazel:envoy_build_system.bzl", - "envoy_package", -) -load( - "//test/extensions:extensions_build_system.bzl", - "envoy_extension_cc_test", -) - -licenses(["notice"]) # Apache 2 - -envoy_package() - -envoy_extension_cc_test( - name = "opentracing_driver_impl_test", - srcs = [ - "opentracing_driver_impl_test.cc", - ], - extension_names = ["envoy.tracers.dynamic_ot"], - # TODO(wrowe): envoy_extension_ rules don't currently exclude windows extensions - tags = ["skip_on_windows"], - deps = [ - "//source/extensions/tracers/dynamic_ot:dynamic_opentracing_driver_lib", - "//test/mocks/http:http_mocks", - "//test/mocks/stats:stats_mocks", - "//test/mocks/stream_info:stream_info_mocks", - "//test/mocks/tracing:tracing_mocks", - "@io_opentracing_cpp//mocktracer", - ], -) diff --git a/test/extensions/tracers/dynamic_ot/BUILD b/test/extensions/tracers/dynamic_ot/BUILD deleted file mode 100644 index 793c9884499bb..0000000000000 --- a/test/extensions/tracers/dynamic_ot/BUILD +++ /dev/null @@ -1,54 +0,0 @@ -load( - "//bazel:envoy_build_system.bzl", - "envoy_package", -) -load( - "//test/extensions:extensions_build_system.bzl", - "envoy_extension_cc_test", -) - -licenses(["notice"]) # Apache 2 - -envoy_package() - -envoy_extension_cc_test( - name = "dynamic_opentracing_driver_impl_test", - size = "large", - srcs = [ - "dynamic_opentracing_driver_impl_test.cc", - ], - data = [ - "@io_opentracing_cpp//mocktracer:libmocktracer_plugin.so", - ], - extension_names = ["envoy.tracers.dynamic_ot"], - # TODO(wrowe): envoy_extension_ rules don't currently exclude windows extensions - tags = ["skip_on_windows"], - deps = [ - "//source/common/http:header_map_lib", - "//source/extensions/tracers/dynamic_ot:dynamic_opentracing_driver_lib", - "//test/mocks/http:http_mocks", - "//test/mocks/stats:stats_mocks", - "//test/mocks/stream_info:stream_info_mocks", - "//test/mocks/tracing:tracing_mocks", - "//test/test_common:environment_lib", - ], -) - -envoy_extension_cc_test( - name = "config_test", - size = "large", - srcs = ["config_test.cc"], - data = [ - "@io_opentracing_cpp//mocktracer:libmocktracer_plugin.so", - ], - extension_names = ["envoy.tracers.dynamic_ot"], - # TODO(wrowe): envoy_extension_ rules don't currently exclude windows extensions - tags = ["skip_on_windows"], - deps = [ - "//source/extensions/tracers/dynamic_ot:config", - "//test/mocks/server:server_mocks", - "//test/test_common:environment_lib", - "//test/test_common:utility_lib", - "@envoy_api//envoy/config/trace/v3:pkg_cc_proto", - ], -) diff --git a/test/extensions/tracers/dynamic_ot/config_test.cc b/test/extensions/tracers/dynamic_ot/config_test.cc deleted file mode 100644 index 6626f18e90373..0000000000000 --- a/test/extensions/tracers/dynamic_ot/config_test.cc +++ /dev/null @@ -1,63 +0,0 @@ -#include "envoy/config/trace/v3/dynamic_ot.pb.h" -#include "envoy/config/trace/v3/dynamic_ot.pb.validate.h" -#include "envoy/config/trace/v3/http_tracer.pb.h" - -#include "source/extensions/tracers/dynamic_ot/config.h" - -#include "test/mocks/server/tracer_factory.h" -#include "test/mocks/server/tracer_factory_context.h" -#include "test/test_common/environment.h" - -#include "fmt/printf.h" -#include "gmock/gmock.h" -#include "gtest/gtest.h" - -using testing::Eq; -using testing::NiceMock; -using testing::Return; - -namespace Envoy { -namespace Extensions { -namespace Tracers { -namespace DynamicOt { -namespace { - -// TODO(https://github.com/envoyproxy/envoy/issues/34321) -#if !__has_feature(address_sanitizer) -TEST(DynamicOtTracerConfigTest, DEPRECATED_FEATURE_TEST(DynamicOpentracingHttpTracer)) { - NiceMock context; - EXPECT_CALL(context.server_factory_context_.cluster_manager_, - getThreadLocalCluster(Eq("fake_cluster"))) - .WillRepeatedly( - Return(&context.server_factory_context_.cluster_manager_.thread_local_cluster_)); - ON_CALL(*context.server_factory_context_.cluster_manager_.thread_local_cluster_.cluster_.info_, - features()) - .WillByDefault(Return(Upstream::ClusterInfo::Features::HTTP2)); - - const std::string yaml_string = fmt::sprintf( - R"EOF( - http: - name: envoy.tracers.dynamic_ot - typed_config: - "@type": type.googleapis.com/envoy.config.trace.v3.DynamicOtConfig - library: %s - config: - output_file: fake_file - )EOF", - TestEnvironment::runfilesPath("mocktracer/libmocktracer_plugin.so", "io_opentracing_cpp")); - envoy::config::trace::v3::Tracing configuration; - TestUtility::loadFromYaml(yaml_string, configuration); - - DynamicOpenTracingTracerFactory factory; - auto message = Config::Utility::translateToFactoryConfig( - configuration.http(), ProtobufMessage::getStrictValidationVisitor(), factory); - auto tracer = factory.createTracerDriver(*message, context); - EXPECT_NE(nullptr, tracer); -} -#endif - -} // namespace -} // namespace DynamicOt -} // namespace Tracers -} // namespace Extensions -} // namespace Envoy diff --git a/test/extensions/tracers/dynamic_ot/dynamic_opentracing_driver_impl_test.cc b/test/extensions/tracers/dynamic_ot/dynamic_opentracing_driver_impl_test.cc deleted file mode 100644 index eb765feefeafd..0000000000000 --- a/test/extensions/tracers/dynamic_ot/dynamic_opentracing_driver_impl_test.cc +++ /dev/null @@ -1,105 +0,0 @@ -#include - -#include "source/common/http/header_map_impl.h" -#include "source/extensions/tracers/dynamic_ot/dynamic_opentracing_driver_impl.h" - -#include "test/mocks/http/mocks.h" -#include "test/mocks/stats/mocks.h" -#include "test/mocks/stream_info/mocks.h" -#include "test/mocks/tracing/mocks.h" -#include "test/test_common/environment.h" - -#include "fmt/printf.h" -#include "gmock/gmock.h" -#include "gtest/gtest.h" - -namespace Envoy { -namespace Extensions { -namespace Tracers { -namespace DynamicOt { -namespace { - -class DynamicOpenTracingDriverTest : public testing::Test { -public: - void setup(const std::string& library, const std::string& tracer_config) { - driver_ = - std::make_unique(*stats_.rootScope(), library, tracer_config); - } - - void setupValidDriver() { setup(library_path_, tracer_config_); } - - const std::string library_path_ = - TestEnvironment::runfilesPath("mocktracer/libmocktracer_plugin.so", "io_opentracing_cpp"); - const std::string spans_file_ = TestEnvironment::temporaryDirectory() + "/spans.json"; - const std::string tracer_config_ = fmt::sprintf(R"EOF( - { - "output_file": "%s" - } - )EOF", - spans_file_); - std::unique_ptr driver_; - Stats::IsolatedStoreImpl stats_; - - const std::string operation_name_{"test"}; - Tracing::TestTraceContextImpl request_headers_{ - {":path", "/"}, {":method", "GET"}, {"x-request-id", "foo"}}; - - NiceMock config_; - NiceMock stream_info_; -}; - -TEST_F(DynamicOpenTracingDriverTest, FormatErrorMessage) { - const std::error_code error_code = std::make_error_code(std::errc::permission_denied); - EXPECT_EQ(error_code.message(), DynamicOpenTracingDriver::formatErrorMessage(error_code, "")); - EXPECT_EQ(error_code.message() + ": abc", - DynamicOpenTracingDriver::formatErrorMessage(error_code, "abc")); -} - -// TODO(https://github.com/envoyproxy/envoy/issues/34321) -#if !__has_feature(address_sanitizer) -TEST_F(DynamicOpenTracingDriverTest, InitializeDriver) { - { - std::string invalid_library = "abc123"; - std::string invalid_config = R"EOF( - {"fake" : "fake"} - )EOF"; - - EXPECT_THROW(setup(invalid_library, invalid_config), EnvoyException); - } - - { - std::string empty_config = "{}"; - - EXPECT_THROW(setup(library_path_, empty_config), EnvoyException); - } -} - -// This test fails under gcc, please see https://github.com/envoyproxy/envoy/issues/7647 -// for more details. -#ifndef GCC_COMPILER -TEST_F(DynamicOpenTracingDriverTest, FlushSpans) { - setupValidDriver(); - - { - Tracing::SpanPtr first_span = - driver_->startSpan(config_, request_headers_, stream_info_, operation_name_, - {Tracing::Reason::Sampling, true}); - first_span->finishSpan(); - driver_->tracer().Close(); - } - - driver_ = nullptr; - - const Json::ObjectSharedPtr spans_json = - TestEnvironment::jsonLoadFromString(TestEnvironment::readFileToStringForTest(spans_file_)); - EXPECT_NE(spans_json, nullptr); - EXPECT_EQ(spans_json->asObjectArray().size(), 1); -} -#endif // GCC -#endif // ASAN - -} // namespace -} // namespace DynamicOt -} // namespace Tracers -} // namespace Extensions -} // namespace Envoy