From 8dd7be1899fba2563d6b87e67b37618bdb986bfc Mon Sep 17 00:00:00 2001 From: Lalit Bhasin Date: Mon, 28 Sep 2020 18:55:27 +0530 Subject: [PATCH 1/8] first draft --- api/include/opentelemetry/plugin/tracer.h | 5 +++ .../opentelemetry/trace/default_span.h | 7 ++++ api/include/opentelemetry/trace/link.h | 22 ++++++++++ api/include/opentelemetry/trace/noop.h | 7 +++- api/include/opentelemetry/trace/span.h | 16 ++++++++ examples/plugin/plugin/tracer.cc | 7 ++++ sdk/include/opentelemetry/sdk/trace/link.h | 40 +++++++++++++++++++ sdk/src/trace/span.cc | 28 ++++++++++++- sdk/src/trace/span.h | 9 ++++- sdk/src/trace/tracer.cc | 2 +- 10 files changed, 139 insertions(+), 4 deletions(-) create mode 100644 api/include/opentelemetry/trace/link.h create mode 100644 sdk/include/opentelemetry/sdk/trace/link.h diff --git a/api/include/opentelemetry/plugin/tracer.h b/api/include/opentelemetry/plugin/tracer.h index aed1d26d28..58365c9605 100644 --- a/api/include/opentelemetry/plugin/tracer.h +++ b/api/include/opentelemetry/plugin/tracer.h @@ -5,6 +5,7 @@ #include "opentelemetry/plugin/detail/dynamic_library_handle.h" #include "opentelemetry/plugin/detail/tracer_handle.h" #include "opentelemetry/trace/tracer.h" +#include "opentelemetry/trace/link.h" #include "opentelemetry/version.h" OPENTELEMETRY_BEGIN_NAMESPACE @@ -37,6 +38,10 @@ class Span final : public trace::Span span_->AddEvent(name, timestamp, attributes); } + virtual void AddLink(const trace::Link &link) noexcept override {} + virtual void AddLink(trace::SpanContext spanContext, + const trace::KeyValueIterable& attributes) noexcept override {} + void SetStatus(trace::CanonicalCode code, nostd::string_view description) noexcept override { span_->SetStatus(code, description); diff --git a/api/include/opentelemetry/trace/default_span.h b/api/include/opentelemetry/trace/default_span.h index 9dbe682bc7..ba063a4a59 100644 --- a/api/include/opentelemetry/trace/default_span.h +++ b/api/include/opentelemetry/trace/default_span.h @@ -33,6 +33,13 @@ class DefaultSpan : public Span this->AddEvent(name, std::chrono::system_clock::now(), attributes); } + virtual void AddLink(const trace::Link &link) noexcept override + {} + + virtual void AddLink(trace::SpanContext spanContext, + const trace::KeyValueIterable& attributes) noexcept override + {} + void SetStatus(CanonicalCode status, nostd::string_view description) noexcept {} void UpdateName(nostd::string_view name) noexcept {} diff --git a/api/include/opentelemetry/trace/link.h b/api/include/opentelemetry/trace/link.h new file mode 100644 index 0000000000..b1800cfcf6 --- /dev/null +++ b/api/include/opentelemetry/trace/link.h @@ -0,0 +1,22 @@ +#pragma once + +#include "opentelemetry/version.h" +#include "opentelemetry/trace/key_value_iterable.h" +#include "opentelemetry/trace/span_context.h" + +OPENTELEMETRY_BEGIN_NAMESPACE +namespace trace +{ +class Link +{ +public: + + //returns the Span Context associated with this Link + virtual const SpanContext& GetContext() const = 0 ; + + // returns the attributes associated with link + virtual const KeyValueIterable& GetAttributes() const = 0; + +}; +} // namespace trace +OPENTELEMETRY_END_NAMESPACE \ No newline at end of file diff --git a/api/include/opentelemetry/trace/noop.h b/api/include/opentelemetry/trace/noop.h index b88b1b3093..2b512896f3 100644 --- a/api/include/opentelemetry/trace/noop.h +++ b/api/include/opentelemetry/trace/noop.h @@ -15,7 +15,7 @@ #include -OPENTELEMETRY_BEGIN_NAMESPACE +OPENTELEMETRY_BEGIN_NAMESPACE namespace trace { /** @@ -40,6 +40,11 @@ class NoopSpan final : public Span const trace::KeyValueIterable & /*attributes*/) noexcept override {} + virtual void AddLink(const Link &link) noexcept override {} + + virtual void AddLink(trace_api::SpanContext spanContext, + const trace_api::KeyValueIterable& attributes) noexcept override {} + void SetStatus(CanonicalCode /*code*/, nostd::string_view /*description*/) noexcept override {} void UpdateName(nostd::string_view /*name*/) noexcept override {} diff --git a/api/include/opentelemetry/trace/span.h b/api/include/opentelemetry/trace/span.h index 922f38fb92..964033e8a8 100644 --- a/api/include/opentelemetry/trace/span.h +++ b/api/include/opentelemetry/trace/span.h @@ -10,6 +10,7 @@ #include "opentelemetry/trace/canonical_code.h" #include "opentelemetry/trace/key_value_iterable_view.h" #include "opentelemetry/trace/span_context.h" +#include "opentelemetry/trace/link.h" #include "opentelemetry/version.h" constexpr char SpanKey[] = "span_key"; @@ -135,6 +136,21 @@ class Span attributes.begin(), attributes.end()}); } + /** Adds a Link to newly created Span + * @param spanContext the context of the linked span + * @param attributes Link attributes + */ + + virtual void AddLink(const trace::Link &link) noexcept = 0; + virtual void AddLink(trace::SpanContext spanContext, + const trace::KeyValueIterable& attributes) noexcept = 0; + + template ::value> * = nullptr> + void AddLink(trace_api::SpanContext spanContext) noexcept + { + this->AddLink(spanContext, KeyValueIterableView{}); + } + // Sets the status of the span. The default status is OK. Only the value of // the last call will be // recorded, and implementations are free to ignore previous calls. diff --git a/examples/plugin/plugin/tracer.cc b/examples/plugin/plugin/tracer.cc index e8f324c9e7..f6e8a34ab4 100644 --- a/examples/plugin/plugin/tracer.cc +++ b/examples/plugin/plugin/tracer.cc @@ -42,6 +42,13 @@ class Span final : public trace::Span const trace::KeyValueIterable & /*attributes*/) noexcept override {} + void AddLink(const trace::Link &link) noexcept override + {} + + void AddLink(trace::SpanContext spanContext, + const trace::KeyValueIterable& attributes) noexcept override + {} + void SetStatus(trace::CanonicalCode /*code*/, nostd::string_view /*description*/) noexcept override {} diff --git a/sdk/include/opentelemetry/sdk/trace/link.h b/sdk/include/opentelemetry/sdk/trace/link.h new file mode 100644 index 0000000000..8cd61c627e --- /dev/null +++ b/sdk/include/opentelemetry/sdk/trace/link.h @@ -0,0 +1,40 @@ +#pragma once + +#include "opentelemetry/trace/link.h" +#include "opentelemetry/sdk/trace/attribute_utils.h" +#include "opentelemetry/version.h" + +#include + +OPENTELEMETRY_BEGIN_NAMESPACE +namespace sdk +{ +namespace trace +{ +class Link final : public trace_api::Link +{ +public: + Link( opentelemetry::trace::SpanContext span_context, + const opentelemetry::trace::KeyValueIterableView> &attributes) noexcept + : span_context_(span_context), attribute_map_{attributes} + { + } + + const trace_api::SpanContext& GetContext() const noexcept override + { + return span_context_; + } + + const trace_api::KeyValueIterable & GetAttributes() const noexcept override + { + return attribute_map_; + + } + +private: + trace_api::SpanContext span_context_; + const trace_api::KeyValueIterableView> attribute_map_; +}; +} // namespace trace +} // namespace sdk +OPENTELEMETRY_END_NAMESPACE diff --git a/sdk/src/trace/span.cc b/sdk/src/trace/span.cc index 0f661d8ef6..d43f3e4264 100644 --- a/sdk/src/trace/span.cc +++ b/sdk/src/trace/span.cc @@ -62,13 +62,15 @@ Span::Span(std::shared_ptr &&tracer, nostd::string_view name, const trace_api::KeyValueIterable &attributes, const trace_api::StartSpanOptions &options, - const trace_api::SpanContext &parent_span_context) noexcept + const trace_api::SpanContext &parent_span_context, + const nostd::span> &links) noexcept : tracer_{std::move(tracer)}, processor_{processor}, recordable_{processor_->MakeRecordable()}, start_steady_time{options.start_steady_time}, has_ended_{false} { + (void)options; if (recordable_ == nullptr) { return; @@ -98,6 +100,11 @@ Span::Span(std::shared_ptr &&tracer, return true; }); + for (auto &link: links) + { + recordable_->AddLink(link->GetContext(), link->GetAttributes()); + } + recordable_->SetStartTime(NowOr(options.start_system_time)); start_steady_time = NowOr(options.start_steady_time); processor_->OnStart(*recordable_); @@ -136,6 +143,25 @@ void Span::AddEvent(nostd::string_view name, (void)attributes; } +void Span::AddLink(const trace_api::Link& link) noexcept +{ + if (recordable_ == nullptr) + { + return; + } + recordable_->AddLink(link.GetContext(), link.GetAttributes()); +} + +void Span::AddLink(trace_api::SpanContext spanContext, + const trace_api::KeyValueIterable& attributes) noexcept +{ + if (recordable_ == nullptr ) + { + return; + } + recordable_->AddLink(spanContext, attributes); +} + void Span::SetStatus(trace_api::CanonicalCode code, nostd::string_view description) noexcept { std::lock_guard lock_guard{mu_}; diff --git a/sdk/src/trace/span.h b/sdk/src/trace/span.h index 56baf8838f..33397643ae 100644 --- a/sdk/src/trace/span.h +++ b/sdk/src/trace/span.h @@ -3,6 +3,7 @@ #include #include "opentelemetry/sdk/trace/tracer.h" +#include "opentelemetry/sdk/trace/link.h" #include "opentelemetry/version.h" OPENTELEMETRY_BEGIN_NAMESPACE @@ -20,7 +21,8 @@ class Span final : public trace_api::Span nostd::string_view name, const trace_api::KeyValueIterable &attributes, const trace_api::StartSpanOptions &options, - const trace_api::SpanContext &parent_span_context) noexcept; + const trace_api::SpanContext &parent_span_context, + const nostd::span> &links) noexcept; ~Span() override; @@ -35,6 +37,11 @@ class Span final : public trace_api::Span core::SystemTimestamp timestamp, const trace_api::KeyValueIterable &attributes) noexcept override; + virtual void AddLink(const trace_api::Link &link) noexcept override; + + virtual void AddLink(trace_api::SpanContext spanContext, + const trace_api::KeyValueIterable& attributes) noexcept override; + void SetStatus(trace_api::CanonicalCode code, nostd::string_view description) noexcept override; void UpdateName(nostd::string_view name) noexcept override; diff --git a/sdk/src/trace/tracer.cc b/sdk/src/trace/tracer.cc index 60b00f191c..b8d507ffd3 100644 --- a/sdk/src/trace/tracer.cc +++ b/sdk/src/trace/tracer.cc @@ -63,7 +63,7 @@ nostd::shared_ptr Tracer::StartSpan( { auto span = nostd::shared_ptr{ new (std::nothrow) Span{this->shared_from_this(), processor_.load(), name, attributes, - options, GetCurrentSpanContext()}}; + options, GetCurrentSpanContext(), {}}}; // if the attributes is not nullptr, add attributes to the span. if (sampling_result.attributes) From 375322f0881cb9e452acf60b2a5db90a5be72dc6 Mon Sep 17 00:00:00 2001 From: Lalit Bhasin Date: Mon, 28 Sep 2020 19:10:09 +0530 Subject: [PATCH 2/8] fix format --- api/include/opentelemetry/plugin/tracer.h | 7 ++-- .../opentelemetry/trace/default_span.h | 7 ++-- api/include/opentelemetry/trace/link.h | 16 ++++----- api/include/opentelemetry/trace/noop.h | 9 ++--- api/include/opentelemetry/trace/span.h | 12 +++---- examples/plugin/plugin/tracer.cc | 7 ++-- sdk/include/opentelemetry/sdk/trace/link.h | 33 +++++++++---------- sdk/src/trace/span.cc | 18 +++++----- sdk/src/trace/span.h | 6 ++-- sdk/src/trace/tracer.cc | 10 ++++-- 10 files changed, 63 insertions(+), 62 deletions(-) diff --git a/api/include/opentelemetry/plugin/tracer.h b/api/include/opentelemetry/plugin/tracer.h index 58365c9605..f2e3a6e430 100644 --- a/api/include/opentelemetry/plugin/tracer.h +++ b/api/include/opentelemetry/plugin/tracer.h @@ -4,8 +4,8 @@ #include "opentelemetry/plugin/detail/dynamic_library_handle.h" #include "opentelemetry/plugin/detail/tracer_handle.h" -#include "opentelemetry/trace/tracer.h" #include "opentelemetry/trace/link.h" +#include "opentelemetry/trace/tracer.h" #include "opentelemetry/version.h" OPENTELEMETRY_BEGIN_NAMESPACE @@ -39,8 +39,9 @@ class Span final : public trace::Span } virtual void AddLink(const trace::Link &link) noexcept override {} - virtual void AddLink(trace::SpanContext spanContext, - const trace::KeyValueIterable& attributes) noexcept override {} + virtual void AddLink(trace::SpanContext spanContext, + const trace::KeyValueIterable &attributes) noexcept override + {} void SetStatus(trace::CanonicalCode code, nostd::string_view description) noexcept override { diff --git a/api/include/opentelemetry/trace/default_span.h b/api/include/opentelemetry/trace/default_span.h index ba063a4a59..ebaaa5c0af 100644 --- a/api/include/opentelemetry/trace/default_span.h +++ b/api/include/opentelemetry/trace/default_span.h @@ -33,11 +33,10 @@ class DefaultSpan : public Span this->AddEvent(name, std::chrono::system_clock::now(), attributes); } - virtual void AddLink(const trace::Link &link) noexcept override - {} + virtual void AddLink(const trace::Link &link) noexcept override {} - virtual void AddLink(trace::SpanContext spanContext, - const trace::KeyValueIterable& attributes) noexcept override + virtual void AddLink(trace::SpanContext spanContext, + const trace::KeyValueIterable &attributes) noexcept override {} void SetStatus(CanonicalCode status, nostd::string_view description) noexcept {} diff --git a/api/include/opentelemetry/trace/link.h b/api/include/opentelemetry/trace/link.h index b1800cfcf6..2ece0200b9 100644 --- a/api/include/opentelemetry/trace/link.h +++ b/api/include/opentelemetry/trace/link.h @@ -1,22 +1,20 @@ #pragma once -#include "opentelemetry/version.h" #include "opentelemetry/trace/key_value_iterable.h" #include "opentelemetry/trace/span_context.h" +#include "opentelemetry/version.h" -OPENTELEMETRY_BEGIN_NAMESPACE +OPENTELEMETRY_BEGIN_NAMESPACE namespace trace { -class Link +class Link { public: + // returns the Span Context associated with this Link + virtual const SpanContext &GetContext() const = 0; - //returns the Span Context associated with this Link - virtual const SpanContext& GetContext() const = 0 ; - - // returns the attributes associated with link - virtual const KeyValueIterable& GetAttributes() const = 0; - + // returns the attributes associated with link + virtual const KeyValueIterable &GetAttributes() const = 0; }; } // namespace trace OPENTELEMETRY_END_NAMESPACE \ No newline at end of file diff --git a/api/include/opentelemetry/trace/noop.h b/api/include/opentelemetry/trace/noop.h index 2b512896f3..426747c48a 100644 --- a/api/include/opentelemetry/trace/noop.h +++ b/api/include/opentelemetry/trace/noop.h @@ -15,7 +15,7 @@ #include -OPENTELEMETRY_BEGIN_NAMESPACE +OPENTELEMETRY_BEGIN_NAMESPACE namespace trace { /** @@ -42,9 +42,10 @@ class NoopSpan final : public Span virtual void AddLink(const Link &link) noexcept override {} - virtual void AddLink(trace_api::SpanContext spanContext, - const trace_api::KeyValueIterable& attributes) noexcept override {} - + virtual void AddLink(trace_api::SpanContext spanContext, + const trace_api::KeyValueIterable &attributes) noexcept override + {} + void SetStatus(CanonicalCode /*code*/, nostd::string_view /*description*/) noexcept override {} void UpdateName(nostd::string_view /*name*/) noexcept override {} diff --git a/api/include/opentelemetry/trace/span.h b/api/include/opentelemetry/trace/span.h index 964033e8a8..c7728f2679 100644 --- a/api/include/opentelemetry/trace/span.h +++ b/api/include/opentelemetry/trace/span.h @@ -9,8 +9,8 @@ #include "opentelemetry/nostd/unique_ptr.h" #include "opentelemetry/trace/canonical_code.h" #include "opentelemetry/trace/key_value_iterable_view.h" -#include "opentelemetry/trace/span_context.h" #include "opentelemetry/trace/link.h" +#include "opentelemetry/trace/span_context.h" #include "opentelemetry/version.h" constexpr char SpanKey[] = "span_key"; @@ -140,16 +140,16 @@ class Span * @param spanContext the context of the linked span * @param attributes Link attributes */ - - virtual void AddLink(const trace::Link &link) noexcept = 0; - virtual void AddLink(trace::SpanContext spanContext, - const trace::KeyValueIterable& attributes) noexcept = 0; + + virtual void AddLink(const trace::Link &link) noexcept = 0; + virtual void AddLink(trace::SpanContext spanContext, + const trace::KeyValueIterable &attributes) noexcept = 0; template ::value> * = nullptr> void AddLink(trace_api::SpanContext spanContext) noexcept { this->AddLink(spanContext, KeyValueIterableView{}); - } + } // Sets the status of the span. The default status is OK. Only the value of // the last call will be diff --git a/examples/plugin/plugin/tracer.cc b/examples/plugin/plugin/tracer.cc index f6e8a34ab4..034f1b5655 100644 --- a/examples/plugin/plugin/tracer.cc +++ b/examples/plugin/plugin/tracer.cc @@ -42,11 +42,10 @@ class Span final : public trace::Span const trace::KeyValueIterable & /*attributes*/) noexcept override {} - void AddLink(const trace::Link &link) noexcept override - {} + void AddLink(const trace::Link &link) noexcept override {} - void AddLink(trace::SpanContext spanContext, - const trace::KeyValueIterable& attributes) noexcept override + void AddLink(trace::SpanContext spanContext, + const trace::KeyValueIterable &attributes) noexcept override {} void SetStatus(trace::CanonicalCode /*code*/, diff --git a/sdk/include/opentelemetry/sdk/trace/link.h b/sdk/include/opentelemetry/sdk/trace/link.h index 8cd61c627e..7d8407cee3 100644 --- a/sdk/include/opentelemetry/sdk/trace/link.h +++ b/sdk/include/opentelemetry/sdk/trace/link.h @@ -1,7 +1,7 @@ #pragma once -#include "opentelemetry/trace/link.h" #include "opentelemetry/sdk/trace/attribute_utils.h" +#include "opentelemetry/trace/link.h" #include "opentelemetry/version.h" #include @@ -14,26 +14,25 @@ namespace trace class Link final : public trace_api::Link { public: - Link( opentelemetry::trace::SpanContext span_context, - const opentelemetry::trace::KeyValueIterableView> &attributes) noexcept - : span_context_(span_context), attribute_map_{attributes} - { - } - - const trace_api::SpanContext& GetContext() const noexcept override - { - return span_context_; - } + Link(opentelemetry::trace::SpanContext span_context, + const opentelemetry::trace::KeyValueIterableView< + std::unordered_map> + &attributes) noexcept + : span_context_(span_context), attribute_map_{attributes} + {} + + const trace_api::SpanContext &GetContext() const noexcept override { return span_context_; } - const trace_api::KeyValueIterable & GetAttributes() const noexcept override - { - return attribute_map_; - - } + const trace_api::KeyValueIterable &GetAttributes() const noexcept override + { + return attribute_map_; + } private: trace_api::SpanContext span_context_; - const trace_api::KeyValueIterableView> attribute_map_; + const trace_api::KeyValueIterableView< + std::unordered_map> + attribute_map_; }; } // namespace trace } // namespace sdk diff --git a/sdk/src/trace/span.cc b/sdk/src/trace/span.cc index d43f3e4264..14e6b6c56f 100644 --- a/sdk/src/trace/span.cc +++ b/sdk/src/trace/span.cc @@ -100,7 +100,7 @@ Span::Span(std::shared_ptr &&tracer, return true; }); - for (auto &link: links) + for (auto &link : links) { recordable_->AddLink(link->GetContext(), link->GetAttributes()); } @@ -143,7 +143,7 @@ void Span::AddEvent(nostd::string_view name, (void)attributes; } -void Span::AddLink(const trace_api::Link& link) noexcept +void Span::AddLink(const trace_api::Link &link) noexcept { if (recordable_ == nullptr) { @@ -152,14 +152,14 @@ void Span::AddLink(const trace_api::Link& link) noexcept recordable_->AddLink(link.GetContext(), link.GetAttributes()); } -void Span::AddLink(trace_api::SpanContext spanContext, - const trace_api::KeyValueIterable& attributes) noexcept +void Span::AddLink(trace_api::SpanContext spanContext, + const trace_api::KeyValueIterable &attributes) noexcept { - if (recordable_ == nullptr ) - { - return; - } - recordable_->AddLink(spanContext, attributes); + if (recordable_ == nullptr) + { + return; + } + recordable_->AddLink(spanContext, attributes); } void Span::SetStatus(trace_api::CanonicalCode code, nostd::string_view description) noexcept diff --git a/sdk/src/trace/span.h b/sdk/src/trace/span.h index 33397643ae..eb64797532 100644 --- a/sdk/src/trace/span.h +++ b/sdk/src/trace/span.h @@ -2,8 +2,8 @@ #include -#include "opentelemetry/sdk/trace/tracer.h" #include "opentelemetry/sdk/trace/link.h" +#include "opentelemetry/sdk/trace/tracer.h" #include "opentelemetry/version.h" OPENTELEMETRY_BEGIN_NAMESPACE @@ -39,8 +39,8 @@ class Span final : public trace_api::Span virtual void AddLink(const trace_api::Link &link) noexcept override; - virtual void AddLink(trace_api::SpanContext spanContext, - const trace_api::KeyValueIterable& attributes) noexcept override; + virtual void AddLink(trace_api::SpanContext spanContext, + const trace_api::KeyValueIterable &attributes) noexcept override; void SetStatus(trace_api::CanonicalCode code, nostd::string_view description) noexcept override; diff --git a/sdk/src/trace/tracer.cc b/sdk/src/trace/tracer.cc index b8d507ffd3..eaeada03f9 100644 --- a/sdk/src/trace/tracer.cc +++ b/sdk/src/trace/tracer.cc @@ -61,9 +61,13 @@ nostd::shared_ptr Tracer::StartSpan( } else { - auto span = nostd::shared_ptr{ - new (std::nothrow) Span{this->shared_from_this(), processor_.load(), name, attributes, - options, GetCurrentSpanContext(), {}}}; + auto span = nostd::shared_ptr{new (std::nothrow) Span{this->shared_from_this(), + processor_.load(), + name, + attributes, + options, + GetCurrentSpanContext(), + {}}}; // if the attributes is not nullptr, add attributes to the span. if (sampling_result.attributes) From 0513e54ae8c28aac3fa0c7ff7879b3b620b98cfe Mon Sep 17 00:00:00 2001 From: Lalit Bhasin Date: Mon, 28 Sep 2020 19:17:21 +0530 Subject: [PATCH 3/8] fix trace_api --- sdk/include/opentelemetry/sdk/trace/link.h | 2 ++ 1 file changed, 2 insertions(+) diff --git a/sdk/include/opentelemetry/sdk/trace/link.h b/sdk/include/opentelemetry/sdk/trace/link.h index 7d8407cee3..8ec4d88710 100644 --- a/sdk/include/opentelemetry/sdk/trace/link.h +++ b/sdk/include/opentelemetry/sdk/trace/link.h @@ -11,6 +11,8 @@ namespace sdk { namespace trace { +namespace trace_api = opentelemetry::trace; + class Link final : public trace_api::Link { public: From 65970990a17412b66197a78d43bfcc2b57d7f776 Mon Sep 17 00:00:00 2001 From: Lalit Bhasin Date: Tue, 29 Sep 2020 00:41:14 +0530 Subject: [PATCH 4/8] fix coverage --- api/include/opentelemetry/plugin/tracer.h | 12 ++++++++---- api/include/opentelemetry/trace/default_span.h | 8 +++++--- api/include/opentelemetry/trace/noop.h | 8 +++++--- api/include/opentelemetry/trace/span.h | 9 +++------ api/test/trace/noop_test.cc | 8 ++++++++ examples/plugin/plugin/tracer.cc | 2 ++ sdk/include/opentelemetry/sdk/trace/link.h | 6 ++++++ sdk/src/trace/span.cc | 9 +++++++++ sdk/src/trace/span.h | 8 +++++--- 9 files changed, 51 insertions(+), 19 deletions(-) diff --git a/api/include/opentelemetry/plugin/tracer.h b/api/include/opentelemetry/plugin/tracer.h index f2e3a6e430..e9c333dccf 100644 --- a/api/include/opentelemetry/plugin/tracer.h +++ b/api/include/opentelemetry/plugin/tracer.h @@ -38,10 +38,14 @@ class Span final : public trace::Span span_->AddEvent(name, timestamp, attributes); } - virtual void AddLink(const trace::Link &link) noexcept override {} - virtual void AddLink(trace::SpanContext spanContext, - const trace::KeyValueIterable &attributes) noexcept override - {} + void AddLink(const trace::Link &link) noexcept override { span_->AddLink(link); } + void AddLink(trace::SpanContext spanContext, + const trace::KeyValueIterable &attributes) noexcept override + { + span_->AddLink(spanContext, attributes); + } + + void AddLink(trace::SpanContext spanContext) noexcept override { span_->AddLink(spanContext); } void SetStatus(trace::CanonicalCode code, nostd::string_view description) noexcept override { diff --git a/api/include/opentelemetry/trace/default_span.h b/api/include/opentelemetry/trace/default_span.h index ebaaa5c0af..b9e129ef49 100644 --- a/api/include/opentelemetry/trace/default_span.h +++ b/api/include/opentelemetry/trace/default_span.h @@ -33,12 +33,14 @@ class DefaultSpan : public Span this->AddEvent(name, std::chrono::system_clock::now(), attributes); } - virtual void AddLink(const trace::Link &link) noexcept override {} + void AddLink(const trace::Link &link) noexcept override {} - virtual void AddLink(trace::SpanContext spanContext, - const trace::KeyValueIterable &attributes) noexcept override + void AddLink(trace::SpanContext spanContext, + const trace::KeyValueIterable &attributes) noexcept override {} + void AddLink(trace::SpanContext spanContext) noexcept override {} + void SetStatus(CanonicalCode status, nostd::string_view description) noexcept {} void UpdateName(nostd::string_view name) noexcept {} diff --git a/api/include/opentelemetry/trace/noop.h b/api/include/opentelemetry/trace/noop.h index 426747c48a..60c3896840 100644 --- a/api/include/opentelemetry/trace/noop.h +++ b/api/include/opentelemetry/trace/noop.h @@ -40,12 +40,14 @@ class NoopSpan final : public Span const trace::KeyValueIterable & /*attributes*/) noexcept override {} - virtual void AddLink(const Link &link) noexcept override {} + void AddLink(const Link &link) noexcept override {} - virtual void AddLink(trace_api::SpanContext spanContext, - const trace_api::KeyValueIterable &attributes) noexcept override + void AddLink(trace_api::SpanContext spanContext, + const trace_api::KeyValueIterable &attributes) noexcept override {} + void AddLink(trace_api::SpanContext spanContext) noexcept override {} + void SetStatus(CanonicalCode /*code*/, nostd::string_view /*description*/) noexcept override {} void UpdateName(nostd::string_view /*name*/) noexcept override {} diff --git a/api/include/opentelemetry/trace/span.h b/api/include/opentelemetry/trace/span.h index c7728f2679..50215ebc81 100644 --- a/api/include/opentelemetry/trace/span.h +++ b/api/include/opentelemetry/trace/span.h @@ -141,15 +141,12 @@ class Span * @param attributes Link attributes */ - virtual void AddLink(const trace::Link &link) noexcept = 0; + virtual void AddLink(const trace::Link &link) noexcept = 0; + virtual void AddLink(trace::SpanContext spanContext, const trace::KeyValueIterable &attributes) noexcept = 0; - template ::value> * = nullptr> - void AddLink(trace_api::SpanContext spanContext) noexcept - { - this->AddLink(spanContext, KeyValueIterableView{}); - } + virtual void AddLink(trace::SpanContext spanContext) noexcept = 0; // Sets the status of the span. The default status is OK. Only the value of // the last call will be diff --git a/api/test/trace/noop_test.cc b/api/test/trace/noop_test.cc index 4a069430ef..d1f571becf 100644 --- a/api/test/trace/noop_test.cc +++ b/api/test/trace/noop_test.cc @@ -1,5 +1,6 @@ #include "opentelemetry/trace/noop.h" #include "opentelemetry/core/timestamp.h" +#include "opentelemetry/trace/key_value_iterable_view.h" #include #include @@ -31,6 +32,13 @@ TEST(NoopTest, UseNoopTracers) s1->SetAttribute("abc", 4); s1->AddEvent("abc"); // add Empty + SpanContext sp(false, false); + s1->AddLink(sp); + using M = std::map; + M m1 = {{"abc", "123"}, {"xyz", "456"}}; + opentelemetry::trace::KeyValueIterableView iterable{m1}; + + s1->AddLink(sp, iterable); EXPECT_EQ(s1->IsRecording(), false); diff --git a/examples/plugin/plugin/tracer.cc b/examples/plugin/plugin/tracer.cc index 034f1b5655..bad5420e6b 100644 --- a/examples/plugin/plugin/tracer.cc +++ b/examples/plugin/plugin/tracer.cc @@ -48,6 +48,8 @@ class Span final : public trace::Span const trace::KeyValueIterable &attributes) noexcept override {} + void AddLink(trace::SpanContext spanContext) noexcept override {} + void SetStatus(trace::CanonicalCode /*code*/, nostd::string_view /*description*/) noexcept override {} diff --git a/sdk/include/opentelemetry/sdk/trace/link.h b/sdk/include/opentelemetry/sdk/trace/link.h index 8ec4d88710..1488d1501c 100644 --- a/sdk/include/opentelemetry/sdk/trace/link.h +++ b/sdk/include/opentelemetry/sdk/trace/link.h @@ -23,6 +23,12 @@ class Link final : public trace_api::Link : span_context_(span_context), attribute_map_{attributes} {} + Link(opentelemetry::trace::SpanContext span_context) + : span_context_(span_context), + attribute_map_( + std::unordered_map()) + {} + const trace_api::SpanContext &GetContext() const noexcept override { return span_context_; } const trace_api::KeyValueIterable &GetAttributes() const noexcept override diff --git a/sdk/src/trace/span.cc b/sdk/src/trace/span.cc index 14e6b6c56f..512f88292c 100644 --- a/sdk/src/trace/span.cc +++ b/sdk/src/trace/span.cc @@ -162,6 +162,15 @@ void Span::AddLink(trace_api::SpanContext spanContext, recordable_->AddLink(spanContext, attributes); } +void Span::AddLink(trace_api::SpanContext spanContext) noexcept +{ + if (recordable_ == nullptr) + { + return; + } + recordable_->AddLink(spanContext); +} + void Span::SetStatus(trace_api::CanonicalCode code, nostd::string_view description) noexcept { std::lock_guard lock_guard{mu_}; diff --git a/sdk/src/trace/span.h b/sdk/src/trace/span.h index eb64797532..493778bdd3 100644 --- a/sdk/src/trace/span.h +++ b/sdk/src/trace/span.h @@ -37,10 +37,12 @@ class Span final : public trace_api::Span core::SystemTimestamp timestamp, const trace_api::KeyValueIterable &attributes) noexcept override; - virtual void AddLink(const trace_api::Link &link) noexcept override; + void AddLink(const trace_api::Link &link) noexcept override; - virtual void AddLink(trace_api::SpanContext spanContext, - const trace_api::KeyValueIterable &attributes) noexcept override; + void AddLink(trace_api::SpanContext spanContext, + const trace_api::KeyValueIterable &attributes) noexcept override; + + void AddLink(trace_api::SpanContext spanContext) noexcept override; void SetStatus(trace_api::CanonicalCode code, nostd::string_view description) noexcept override; From 7ce23b94de35db44d098293a7d082864935b6876 Mon Sep 17 00:00:00 2001 From: Lalit Bhasin Date: Tue, 29 Sep 2020 01:39:31 +0530 Subject: [PATCH 5/8] add test --- sdk/test/trace/tracer_test.cc | 19 +++++++++++++++++++ 1 file changed, 19 insertions(+) diff --git a/sdk/test/trace/tracer_test.cc b/sdk/test/trace/tracer_test.cc index ba196c67c1..5c5fff3fc7 100644 --- a/sdk/test/trace/tracer_test.cc +++ b/sdk/test/trace/tracer_test.cc @@ -1,4 +1,5 @@ #include "opentelemetry/sdk/trace/tracer.h" +#include "opentelemetry/sdk/trace/link.h" #include "opentelemetry/sdk/trace/samplers/always_off.h" #include "opentelemetry/sdk/trace/samplers/always_on.h" #include "opentelemetry/sdk/trace/samplers/parent_or_else.h" @@ -341,6 +342,24 @@ TEST(Tracer, SpanSetAttribute) ASSERT_EQ(3.1, nostd::get(span_data->GetAttributes().at("abc"))); } +TEST(Tracer, SpanAddLink) +{ + std::shared_ptr>> spans_received( + new std::vector>); + auto tracer = initTracer(spans_received); + + auto span = tracer->StartSpan("span 1"); + + SpanContext sp1(true, true); + span->AddLink(sp1); + + span->End(); + ASSERT_EQ(1, spans_received->size()); + auto &span_data = spans_received->at(0); + + ASSERT_EQ(1, span_data->GetLinks().size()); +} + TEST(Tracer, TestAlwaysOnSampler) { std::shared_ptr>> spans_received( From fc5b652e1f4b194ea438e6bd799a504e62a37f69 Mon Sep 17 00:00:00 2001 From: Lalit Bhasin Date: Tue, 29 Sep 2020 12:55:56 +0530 Subject: [PATCH 6/8] review comment --- api/include/opentelemetry/plugin/tracer.h | 9 ++++++--- .../opentelemetry/trace/default_span.h | 4 ++-- api/include/opentelemetry/trace/noop.h | 4 ++-- api/include/opentelemetry/trace/span.h | 19 +++++++++++++++++-- examples/plugin/plugin/tracer.cc | 4 ++-- .../ext/zpages/threadsafe_span_data.h | 2 +- .../opentelemetry/sdk/trace/recordable.h | 4 ++-- .../opentelemetry/sdk/trace/span_data.h | 4 ++-- sdk/src/trace/span.cc | 8 ++++---- sdk/src/trace/span.h | 4 ++-- 10 files changed, 40 insertions(+), 22 deletions(-) diff --git a/api/include/opentelemetry/plugin/tracer.h b/api/include/opentelemetry/plugin/tracer.h index e9c333dccf..cb1c4b4e1a 100644 --- a/api/include/opentelemetry/plugin/tracer.h +++ b/api/include/opentelemetry/plugin/tracer.h @@ -39,13 +39,16 @@ class Span final : public trace::Span } void AddLink(const trace::Link &link) noexcept override { span_->AddLink(link); } - void AddLink(trace::SpanContext spanContext, + void AddLink(const trace::SpanContext &span_context, const trace::KeyValueIterable &attributes) noexcept override { - span_->AddLink(spanContext, attributes); + span_->AddLink(span_context, attributes); } - void AddLink(trace::SpanContext spanContext) noexcept override { span_->AddLink(spanContext); } + void AddLink(const trace::SpanContext &span_context) noexcept override + { + span_->AddLink(span_context); + } void SetStatus(trace::CanonicalCode code, nostd::string_view description) noexcept override { diff --git a/api/include/opentelemetry/trace/default_span.h b/api/include/opentelemetry/trace/default_span.h index b9e129ef49..3b31c67b3d 100644 --- a/api/include/opentelemetry/trace/default_span.h +++ b/api/include/opentelemetry/trace/default_span.h @@ -35,11 +35,11 @@ class DefaultSpan : public Span void AddLink(const trace::Link &link) noexcept override {} - void AddLink(trace::SpanContext spanContext, + void AddLink(const trace::SpanContext &span_context, const trace::KeyValueIterable &attributes) noexcept override {} - void AddLink(trace::SpanContext spanContext) noexcept override {} + void AddLink(const trace::SpanContext &span_context) noexcept override {} void SetStatus(CanonicalCode status, nostd::string_view description) noexcept {} diff --git a/api/include/opentelemetry/trace/noop.h b/api/include/opentelemetry/trace/noop.h index 60c3896840..cc18288a7c 100644 --- a/api/include/opentelemetry/trace/noop.h +++ b/api/include/opentelemetry/trace/noop.h @@ -42,11 +42,11 @@ class NoopSpan final : public Span void AddLink(const Link &link) noexcept override {} - void AddLink(trace_api::SpanContext spanContext, + void AddLink(const trace_api::SpanContext &spanContext, const trace_api::KeyValueIterable &attributes) noexcept override {} - void AddLink(trace_api::SpanContext spanContext) noexcept override {} + void AddLink(const trace_api::SpanContext &span_context) noexcept override {} void SetStatus(CanonicalCode /*code*/, nostd::string_view /*description*/) noexcept override {} diff --git a/api/include/opentelemetry/trace/span.h b/api/include/opentelemetry/trace/span.h index 50215ebc81..01cd2d74af 100644 --- a/api/include/opentelemetry/trace/span.h +++ b/api/include/opentelemetry/trace/span.h @@ -143,10 +143,25 @@ class Span virtual void AddLink(const trace::Link &link) noexcept = 0; - virtual void AddLink(trace::SpanContext spanContext, + virtual void AddLink(const trace::SpanContext &span_context, const trace::KeyValueIterable &attributes) noexcept = 0; - virtual void AddLink(trace::SpanContext spanContext) noexcept = 0; + virtual void AddLink(const trace::SpanContext &span_context) noexcept = 0; + + template ::value> * = nullptr> + void AddLink(const trace::SpanContext &span_context, const T &attributes) noexcept + { + this->AddLink(span_context, KeyValueIterableView{attributes}); + } + + void AddLink(const trace::SpanContext &span_context, + std::initializer_list> + attributes) noexcept + { + this->AddLink(span_context, + nostd::span>{ + attributes.begin(), attributes.end()}); + } // Sets the status of the span. The default status is OK. Only the value of // the last call will be diff --git a/examples/plugin/plugin/tracer.cc b/examples/plugin/plugin/tracer.cc index bad5420e6b..dff22598b9 100644 --- a/examples/plugin/plugin/tracer.cc +++ b/examples/plugin/plugin/tracer.cc @@ -44,11 +44,11 @@ class Span final : public trace::Span void AddLink(const trace::Link &link) noexcept override {} - void AddLink(trace::SpanContext spanContext, + void AddLink(const trace::SpanContext &span_context, const trace::KeyValueIterable &attributes) noexcept override {} - void AddLink(trace::SpanContext spanContext) noexcept override {} + void AddLink(const trace::SpanContext &span_context) noexcept override {} void SetStatus(trace::CanonicalCode /*code*/, nostd::string_view /*description*/) noexcept override diff --git a/ext/include/opentelemetry/ext/zpages/threadsafe_span_data.h b/ext/include/opentelemetry/ext/zpages/threadsafe_span_data.h index 1c7595aae6..60301b2288 100644 --- a/ext/include/opentelemetry/ext/zpages/threadsafe_span_data.h +++ b/ext/include/opentelemetry/ext/zpages/threadsafe_span_data.h @@ -163,7 +163,7 @@ class ThreadsafeSpanData final : public opentelemetry::sdk::trace::Recordable } void AddLink( - opentelemetry::trace::SpanContext span_context, + const opentelemetry::trace::SpanContext &span_context, const trace_api::KeyValueIterable &attributes = trace_api::KeyValueIterableView>({})) noexcept override { diff --git a/sdk/include/opentelemetry/sdk/trace/recordable.h b/sdk/include/opentelemetry/sdk/trace/recordable.h index 68124db0e6..7653b3a0cb 100644 --- a/sdk/include/opentelemetry/sdk/trace/recordable.h +++ b/sdk/include/opentelemetry/sdk/trace/recordable.h @@ -82,14 +82,14 @@ class Recordable * @param span_context the span context of the linked span * @param attributes the attributes associated with the link */ - virtual void AddLink(opentelemetry::trace::SpanContext span_context, + virtual void AddLink(const opentelemetry::trace::SpanContext &span_context, const trace_api::KeyValueIterable &attributes) noexcept = 0; /** * Add a link to a span with default (empty) attributes. * @param span_context the span context of the linked span */ - void AddLink(opentelemetry::trace::SpanContext span_context) + void AddLink(const opentelemetry::trace::SpanContext &span_context) { AddLink(span_context, opentelemetry::sdk::GetEmptyAttributes()); } diff --git a/sdk/include/opentelemetry/sdk/trace/span_data.h b/sdk/include/opentelemetry/sdk/trace/span_data.h index b745a3f33f..82c3ac95d4 100644 --- a/sdk/include/opentelemetry/sdk/trace/span_data.h +++ b/sdk/include/opentelemetry/sdk/trace/span_data.h @@ -63,7 +63,7 @@ class SpanDataEvent class SpanDataLink { public: - SpanDataLink(opentelemetry::trace::SpanContext span_context, + SpanDataLink(const opentelemetry::trace::SpanContext &span_context, const trace_api::KeyValueIterable &attributes) : span_context_(span_context), attribute_map_(attributes) {} @@ -180,7 +180,7 @@ class SpanData final : public Recordable events_.push_back(event); } - void AddLink(opentelemetry::trace::SpanContext span_context, + void AddLink(const opentelemetry::trace::SpanContext &span_context, const trace_api::KeyValueIterable &attributes) noexcept override { SpanDataLink link(span_context, attributes); diff --git a/sdk/src/trace/span.cc b/sdk/src/trace/span.cc index 512f88292c..79bc3a9264 100644 --- a/sdk/src/trace/span.cc +++ b/sdk/src/trace/span.cc @@ -152,23 +152,23 @@ void Span::AddLink(const trace_api::Link &link) noexcept recordable_->AddLink(link.GetContext(), link.GetAttributes()); } -void Span::AddLink(trace_api::SpanContext spanContext, +void Span::AddLink(const trace_api::SpanContext &span_context, const trace_api::KeyValueIterable &attributes) noexcept { if (recordable_ == nullptr) { return; } - recordable_->AddLink(spanContext, attributes); + recordable_->AddLink(span_context, attributes); } -void Span::AddLink(trace_api::SpanContext spanContext) noexcept +void Span::AddLink(const trace_api::SpanContext &span_context) noexcept { if (recordable_ == nullptr) { return; } - recordable_->AddLink(spanContext); + recordable_->AddLink(span_context); } void Span::SetStatus(trace_api::CanonicalCode code, nostd::string_view description) noexcept diff --git a/sdk/src/trace/span.h b/sdk/src/trace/span.h index 493778bdd3..09041b1ff1 100644 --- a/sdk/src/trace/span.h +++ b/sdk/src/trace/span.h @@ -39,10 +39,10 @@ class Span final : public trace_api::Span void AddLink(const trace_api::Link &link) noexcept override; - void AddLink(trace_api::SpanContext spanContext, + void AddLink(const trace_api::SpanContext &span_context, const trace_api::KeyValueIterable &attributes) noexcept override; - void AddLink(trace_api::SpanContext spanContext) noexcept override; + void AddLink(const trace_api::SpanContext &span_context) noexcept override; void SetStatus(trace_api::CanonicalCode code, nostd::string_view description) noexcept override; From 92be8823f1758f78ff15421132bc3935a9ef1a1b Mon Sep 17 00:00:00 2001 From: Lalit Bhasin Date: Tue, 29 Sep 2020 13:28:09 +0530 Subject: [PATCH 7/8] more tests --- api/test/trace/noop_test.cc | 1 + 1 file changed, 1 insertion(+) diff --git a/api/test/trace/noop_test.cc b/api/test/trace/noop_test.cc index d1f571becf..7de08f6204 100644 --- a/api/test/trace/noop_test.cc +++ b/api/test/trace/noop_test.cc @@ -39,6 +39,7 @@ TEST(NoopTest, UseNoopTracers) opentelemetry::trace::KeyValueIterableView iterable{m1}; s1->AddLink(sp, iterable); + s1->AddLink(sp, {{"abc", "123"}, {"xyz", "456"}}); EXPECT_EQ(s1->IsRecording(), false); From dce36566576272f68a1093505b7cd121becb45d3 Mon Sep 17 00:00:00 2001 From: Lalit Bhasin Date: Tue, 29 Sep 2020 13:36:20 +0530 Subject: [PATCH 8/8] add comment for span creation --- api/include/opentelemetry/trace/span.h | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/api/include/opentelemetry/trace/span.h b/api/include/opentelemetry/trace/span.h index 01cd2d74af..1c575ce5a8 100644 --- a/api/include/opentelemetry/trace/span.h +++ b/api/include/opentelemetry/trace/span.h @@ -139,6 +139,10 @@ class Span /** Adds a Link to newly created Span * @param spanContext the context of the linked span * @param attributes Link attributes + * + * These methods need to be called immediately after Span + * creation. Specification doesn't allow adding links after + * span creation. */ virtual void AddLink(const trace::Link &link) noexcept = 0;