diff --git a/source/extensions/tracers/zipkin/span_buffer.cc b/source/extensions/tracers/zipkin/span_buffer.cc index 387d851a9f91..1d2df882792b 100644 --- a/source/extensions/tracers/zipkin/span_buffer.cc +++ b/source/extensions/tracers/zipkin/span_buffer.cc @@ -16,15 +16,15 @@ bool SpanBuffer::addSpan(const Span& span) { return true; } -std::string SpanBuffer::toStringifiedJsonArray() { +std::string SpanBuffer::toStringifiedJsonArray(SpanSerializer& span_serialier) { std::string stringified_json_array = "["; if (pendingSpans()) { - stringified_json_array += span_buffer_[0].toJson(); + stringified_json_array += span_serialier.serialize(span_buffer_[0]); const uint64_t size = span_buffer_.size(); for (uint64_t i = 1; i < size; i++) { stringified_json_array += ","; - stringified_json_array += span_buffer_[i].toJson(); + stringified_json_array += span_serialier.serialize(span_buffer_[i]); } } stringified_json_array += "]"; diff --git a/source/extensions/tracers/zipkin/span_buffer.h b/source/extensions/tracers/zipkin/span_buffer.h index f81ddc41e003..80ed3f6b7b65 100644 --- a/source/extensions/tracers/zipkin/span_buffer.h +++ b/source/extensions/tracers/zipkin/span_buffer.h @@ -1,5 +1,6 @@ #pragma once +#include "extensions/tracers/zipkin/span_serializer.h" #include "extensions/tracers/zipkin/zipkin_core_types.h" namespace Envoy { @@ -57,7 +58,7 @@ class SpanBuffer { * @return the contents of the buffer as a stringified array of JSONs, where * each JSON in the array corresponds to one Zipkin span. */ - std::string toStringifiedJsonArray(); + std::string toStringifiedJsonArray(SpanSerializer& span_serializer); private: // We use a pre-allocated vector to improve performance diff --git a/source/extensions/tracers/zipkin/span_serializer.h b/source/extensions/tracers/zipkin/span_serializer.h new file mode 100644 index 000000000000..1e2670b0c5ff --- /dev/null +++ b/source/extensions/tracers/zipkin/span_serializer.h @@ -0,0 +1,26 @@ +#pragma once + +#include "extensions/tracers/zipkin/zipkin_core_types.h" + +namespace Envoy { +namespace Extensions { +namespace Tracers { +namespace Zipkin { +class SpanSerializer { +public: + /** + * Destructor. + */ + virtual ~SpanSerializer() {} + + /** + * Method that a concrete SpanSerializer class must implement to serialize spans. + * + * @param span The span that needs action. + */ + virtual std::string serialize(const Span& span); +}; +} // namespace Zipkin +} // namespace Tracers +} // namespace Extensions +} // namespace Envoy diff --git a/source/extensions/tracers/zipkin/zipkin_tracer_impl.cc b/source/extensions/tracers/zipkin/zipkin_tracer_impl.cc index a2ccbb989afb..0d62cda27f81 100644 --- a/source/extensions/tracers/zipkin/zipkin_tracer_impl.cc +++ b/source/extensions/tracers/zipkin/zipkin_tracer_impl.cc @@ -122,8 +122,12 @@ Tracing::SpanPtr Driver::startSpan(const Tracing::Config& config, Http::HeaderMa return std::move(active_span); } +V1SpanSerializer::V1SpanSerializer() {} + +const std::string V1SpanSerializer::serialize(const Span& span) { return span.toJson(); } + ReporterImpl::ReporterImpl(Driver& driver, Event::Dispatcher& dispatcher, - const std::string& collector_endpoint) + const std::string& collector_endpoint, SpanSerializer& span_serializer) : driver_(driver), collector_endpoint_(collector_endpoint) { flush_timer_ = dispatcher.createTimer([this]() -> void { driver_.tracerStats().timer_flushed_.inc(); @@ -131,6 +135,8 @@ ReporterImpl::ReporterImpl(Driver& driver, Event::Dispatcher& dispatcher, enableTimer(); }); + span_serializer_ = span_serializer; + const uint64_t min_flush_spans = driver_.runtime().snapshot().getInteger("tracing.zipkin.min_flush_spans", 5U); span_buffer_.allocateBuffer(min_flush_spans); @@ -140,7 +146,14 @@ ReporterImpl::ReporterImpl(Driver& driver, Event::Dispatcher& dispatcher, ReporterPtr ReporterImpl::NewInstance(Driver& driver, Event::Dispatcher& dispatcher, const std::string& collector_endpoint) { - return ReporterPtr(new ReporterImpl(driver, dispatcher, collector_endpoint)); + return ReporterPtr( + new ReporterImpl(driver, dispatcher, collector_endpoint, new V1SpanSerializer())); +} + +ReporterPtr ReporterImpl::NewInstanceWithSerializer(Driver& driver, Event::Dispatcher& dispatcher, + const std::string& collector_endpoint, + SpanSerializer span_serializer) { + return ReporterPtr(new ReporterImpl(driver, dispatcher, collector_endpoint, span_serializer)); } // TODO(fabolive): Need to avoid the copy to improve performance. @@ -165,7 +178,7 @@ void ReporterImpl::flushSpans() { if (span_buffer_.pendingSpans()) { driver_.tracerStats().spans_sent_.add(span_buffer_.pendingSpans()); - const std::string request_body = span_buffer_.toStringifiedJsonArray(); + const std::string request_body = span_buffer_.toStringifiedJsonArray(span_serializer_); Http::MessagePtr message(new Http::RequestMessageImpl()); message->headers().insertMethod().value().setReference(Http::Headers::get().MethodValues.Post); message->headers().insertPath().value(collector_endpoint_); diff --git a/source/extensions/tracers/zipkin/zipkin_tracer_impl.h b/source/extensions/tracers/zipkin/zipkin_tracer_impl.h index fa1be871a77e..5d1a4b7c918a 100644 --- a/source/extensions/tracers/zipkin/zipkin_tracer_impl.h +++ b/source/extensions/tracers/zipkin/zipkin_tracer_impl.h @@ -208,6 +208,7 @@ class ReporterImpl : public Reporter, Http::AsyncClient::Callbacks { Event::TimerPtr flush_timer_; SpanBuffer span_buffer_; const std::string collector_endpoint_; + SpanSerializer span_serializer_; }; } // namespace Zipkin } // namespace Tracers