diff --git a/envoy/1.20/patches/envoy/20240726-custom-span-tag.patch b/envoy/1.20/patches/envoy/20240726-custom-span-tag.patch new file mode 100644 index 000000000..85ee540d4 --- /dev/null +++ b/envoy/1.20/patches/envoy/20240726-custom-span-tag.patch @@ -0,0 +1,106 @@ +diff --git a/envoy/stream_info/stream_info.h b/envoy/stream_info/stream_info.h +index c6d82db4f4..09717673b0 100644 +--- a/envoy/stream_info/stream_info.h ++++ b/envoy/stream_info/stream_info.h +@@ -613,7 +613,21 @@ public: + * @return the number of times the request was attempted upstream, absl::nullopt if the request + * was never attempted upstream. + */ ++ + virtual absl::optional attemptCount() const PURE; ++ ++#ifdef ALIMESH ++ /** ++ * @param key the filter state key set by wasm filter. ++ * @param value the filter state value set by wasm filter. ++ */ ++ virtual void setCustomSpanTag(const std::string& key, const std::string& value) PURE; ++ ++ /** ++ * @return the key-value map of filter states set by wasm filter. ++ */ ++ virtual const std::unordered_map& getCustomSpanTagMap() const PURE; ++#endif + }; + + } // namespace StreamInfo +diff --git a/source/common/stream_info/stream_info_impl.h b/source/common/stream_info/stream_info_impl.h +index 6ce2afe773..d5e7a80b37 100644 +--- a/source/common/stream_info/stream_info_impl.h ++++ b/source/common/stream_info/stream_info_impl.h +@@ -291,6 +291,20 @@ struct StreamInfoImpl : public StreamInfo { + + absl::optional attemptCount() const override { return attempt_count_; } + ++#ifdef ALIMESH ++ void setCustomSpanTag(const std::string& key, const std::string& value) override { ++ auto it = custom_span_tags_.find(key); ++ if (it != custom_span_tags_.end()) { ++ it->second = value; ++ } else { ++ custom_span_tags_.emplace(key, value); ++ } ++ } ++ ++ const std::unordered_map& getCustomSpanTagMap() const override { ++ return custom_span_tags_; ++ } ++#endif + TimeSource& time_source_; + const SystemTime start_time_; + const MonotonicTime start_time_monotonic_; +@@ -350,6 +364,9 @@ private: + absl::optional upstream_cluster_info_; + std::string filter_chain_name_; + Tracing::Reason trace_reason_; ++#ifdef ALIMESH ++ std::unordered_map custom_span_tags_; ++#endif + }; + + } // namespace StreamInfo +diff --git a/source/common/tracing/http_tracer_impl.cc b/source/common/tracing/http_tracer_impl.cc +index e55cf00e0a..f94e9101d7 100644 +--- a/source/common/tracing/http_tracer_impl.cc ++++ b/source/common/tracing/http_tracer_impl.cc +@@ -214,6 +214,14 @@ void HttpTracerUtility::setCommonTags(Span& span, const Http::ResponseHeaderMap* + + span.setTag(Tracing::Tags::get().Component, Tracing::Tags::get().Proxy); + ++#ifdef ALIMESH ++ // Wasm filter state ++ const auto& custom_span_tags = stream_info.getCustomSpanTagMap(); ++ for (const auto& it : custom_span_tags) { ++ span.setTag(it.first, it.second); ++ } ++#endif ++ + if (nullptr != stream_info.upstreamHost()) { + span.setTag(Tracing::Tags::get().UpstreamCluster, stream_info.upstreamHost()->cluster().name()); + span.setTag(Tracing::Tags::get().UpstreamClusterName, +diff --git a/source/extensions/common/wasm/context.cc b/source/extensions/common/wasm/context.cc +index 410baa856f..b11ecf1cd6 100644 +--- a/source/extensions/common/wasm/context.cc ++++ b/source/extensions/common/wasm/context.cc +@@ -60,6 +60,7 @@ namespace { + constexpr absl::string_view CelStateKeyPrefix = "wasm."; + + #if defined(ALIMESH) ++constexpr absl::string_view CustomeTraceSpanTagPrefix = "trace_span_tag."; + constexpr std::string_view ClearRouteCacheKey = "clear_route_cache"; + constexpr std::string_view DisableClearRouteCache = "off"; + constexpr std::string_view SetDecoderBufferLimit = "set_decoder_buffer_limit"; +@@ -1271,6 +1272,13 @@ WasmResult Context::setProperty(std::string_view path, std::string_view value) { + if (!stream_info) { + return WasmResult::NotFound; + } ++#ifdef ALIMESH ++ if (absl::StartsWith(absl::string_view{path.data(), path.size()}, CustomeTraceSpanTagPrefix)) { ++ stream_info->setCustomSpanTag(std::string(path.substr(CustomeTraceSpanTagPrefix.size())), ++ std::string(value)); ++ return WasmResult::Ok; ++ } ++#endif + std::string key; + absl::StrAppend(&key, CelStateKeyPrefix, toAbslStringView(path)); + CelState* state;