From a0c8036cb7883b98467d64b28010fbcb583e611b Mon Sep 17 00:00:00 2001 From: Mike Schore Date: Tue, 9 May 2017 15:58:15 -0700 Subject: [PATCH] tracing: add direct support for a span to spawn a child --- include/envoy/tracing/http_tracer.h | 8 ++++++-- source/common/tracing/http_tracer_impl.h | 5 +++++ .../common/tracing/lightstep_tracer_impl.cc | 19 +++++++++++++++---- source/common/tracing/lightstep_tracer_impl.h | 4 +++- test/mocks/tracing/mocks.h | 8 +++++++- 5 files changed, 36 insertions(+), 8 deletions(-) diff --git a/include/envoy/tracing/http_tracer.h b/include/envoy/tracing/http_tracer.h index 295d24c9bca4..cc9e2a47f560 100644 --- a/include/envoy/tracing/http_tracer.h +++ b/include/envoy/tracing/http_tracer.h @@ -33,16 +33,20 @@ class Config { /* * Basic abstraction for span. */ +class Span; + +typedef std::unique_ptr SpanPtr; + class Span { public: virtual ~Span() {} virtual void setTag(const std::string& name, const std::string& value) PURE; virtual void finishSpan() PURE; + // virtual void inject(Http::HeaderMap& request_headers) PURE; + virtual SpanPtr spawnChild(const std::string& name, SystemTime start_time) PURE; }; -typedef std::unique_ptr SpanPtr; - /** * Tracing driver is responsible for span creation. */ diff --git a/source/common/tracing/http_tracer_impl.h b/source/common/tracing/http_tracer_impl.h index c2a3ba4c909b..3291ecf96046 100644 --- a/source/common/tracing/http_tracer_impl.h +++ b/source/common/tracing/http_tracer_impl.h @@ -87,6 +87,11 @@ class NullSpan : public Tracing::Span { // Tracing::Span void setTag(const std::string&, const std::string&) override {} void finishSpan() override {} + SpanPtr spawnChild(const std::string&, SystemTime) override { + SpanPtr nullSpan; + nullSpan.reset(new NullSpan()); + return std::move(nullSpan); + } }; } // Tracing diff --git a/source/common/tracing/lightstep_tracer_impl.cc b/source/common/tracing/lightstep_tracer_impl.cc index f0aefbe493b6..888beac38a45 100644 --- a/source/common/tracing/lightstep_tracer_impl.cc +++ b/source/common/tracing/lightstep_tracer_impl.cc @@ -14,7 +14,8 @@ namespace Tracing { -LightStepSpan::LightStepSpan(lightstep::Span& span) : span_(span) {} +LightStepSpan::LightStepSpan(lightstep::Span& span, lightstep::Tracer& tracer) + : span_(span), tracer_(tracer) {} void LightStepSpan::finishSpan() { span_.Finish(); } @@ -22,6 +23,15 @@ void LightStepSpan::setTag(const std::string& name, const std::string& value) { span_.SetTag(name, value); } +SpanPtr LightStepSpan::spawnChild(const std::string& name, SystemTime start_time) { + SpanPtr child_span; + lightstep::Span ls_span = tracer_.StartSpan( + name, {lightstep::ChildOf(span_.context()), lightstep::StartTimestamp(start_time)}); + child_span.reset(new LightStepSpan(ls_span, tracer_)); + + return std::move(child_span); +} + LightStepRecorder::LightStepRecorder(const lightstep::TracerImpl& tracer, LightStepDriver& driver, Event::Dispatcher& dispatcher) : builder_(tracer), driver_(driver) { @@ -133,20 +143,21 @@ SpanPtr LightStepDriver::startSpan(Http::HeaderMap& request_headers, lightstep::Span ls_span = tracer.StartSpan(operation_name, {lightstep::ChildOf(parent_span_ctx), lightstep::StartTimestamp(start_time)}); - active_span.reset(new LightStepSpan(ls_span)); + active_span.reset(new LightStepSpan(ls_span, tracer)); } else { lightstep::Span ls_span = tracer.StartSpan(operation_name, {lightstep::StartTimestamp(start_time)}); - active_span.reset(new LightStepSpan(ls_span)); + active_span.reset(new LightStepSpan(ls_span, tracer)); } - // Inject newly created span context into HTTP carrier. + // Inject newly created span context into HTTP carrier. TODO: move to inject() lightstep::BinaryCarrier ctx; tracer.Inject(active_span->context(), lightstep::CarrierFormat::LightStepBinaryCarrier, lightstep::ProtoWriter(&ctx)); const std::string current_span_context = ctx.SerializeAsString(); request_headers.insertOtSpanContext().value( Base64::encode(current_span_context.c_str(), current_span_context.length())); + // end TODO return std::move(active_span); } diff --git a/source/common/tracing/lightstep_tracer_impl.h b/source/common/tracing/lightstep_tracer_impl.h index 8c44f9d3168e..f01c03923112 100644 --- a/source/common/tracing/lightstep_tracer_impl.h +++ b/source/common/tracing/lightstep_tracer_impl.h @@ -28,16 +28,18 @@ struct LightstepTracerStats { class LightStepSpan : public Span { public: - LightStepSpan(lightstep::Span& span); + LightStepSpan(lightstep::Span& span, lightstep::Tracer& tracer); // Tracing::Span void finishSpan() override; void setTag(const std::string& name, const std::string& value) override; + SpanPtr spawnChild(const std::string& name, SystemTime start_time) override; lightstep::SpanContext context() { return span_.context(); } private: lightstep::Span span_; + lightstep::Tracer& tracer_; }; typedef std::unique_ptr LightStepSpanPtr; diff --git a/test/mocks/tracing/mocks.h b/test/mocks/tracing/mocks.h index c0181932f32a..97dcdfc2cf4c 100644 --- a/test/mocks/tracing/mocks.h +++ b/test/mocks/tracing/mocks.h @@ -33,6 +33,12 @@ class MockSpan : public Span { MOCK_METHOD2(setTag, void(const std::string& name, const std::string& value)); MOCK_METHOD0(finishSpan, void()); + + SpanPtr spawnChild(const std::string& name, SystemTime start_time) override { + return SpanPtr{spawnChild_(name, start_time)}; + } + + MOCK_METHOD2(spawnChild_, Span*(const std::string& name, SystemTime start_time)); }; class MockHttpTracer : public HttpTracer { @@ -63,4 +69,4 @@ class MockDriver : public Driver { const std::string& operation_name, SystemTime start_time)); }; -} // Tracing \ No newline at end of file +} // Tracing