diff --git a/exporters/memory/BUILD b/exporters/memory/BUILD index 055d5016a5..daa0c662ff 100644 --- a/exporters/memory/BUILD +++ b/exporters/memory/BUILD @@ -3,6 +3,7 @@ package(default_visibility = ["//visibility:public"]) cc_library( name = "in_memory_span_data", hdrs = [ + "include/opentelemetry/exporters/memory/in_memory_data.h", "include/opentelemetry/exporters/memory/in_memory_span_data.h", ], strip_include_prefix = "include", diff --git a/exporters/memory/include/opentelemetry/exporters/memory/in_memory_data.h b/exporters/memory/include/opentelemetry/exporters/memory/in_memory_data.h new file mode 100644 index 0000000000..26acba4b63 --- /dev/null +++ b/exporters/memory/include/opentelemetry/exporters/memory/in_memory_data.h @@ -0,0 +1,62 @@ +// Copyright The OpenTelemetry Authors +// SPDX-License-Identifier: Apache-2.0 + +#pragma once + +#include "opentelemetry/sdk/common/circular_buffer.h" + +#include + +OPENTELEMETRY_BEGIN_NAMESPACE +namespace exporter +{ +namespace memory +{ +/** + * A wrapper class holding in memory exporter data + */ +template +class InMemoryData +{ +public: + /** + * @param buffer_size a required value that sets the size of the CircularBuffer + */ + InMemoryData(size_t buffer_size) : data_(buffer_size) {} + + /** + * @param data a required unique pointer to the data to add to the CircularBuffer + */ + void Add(std::unique_ptr data) noexcept { data_.Add(data); } + + /** + * @return Returns a vector of unique pointers containing all the data in the + * CircularBuffer. This operation will empty the Buffer, which is why the data + * is returned as unique pointers + */ + std::vector> Get() noexcept + { + std::vector> res; + + // Pointer swap is required because the Consume function requires that the + // AtomicUniquePointer be set to null + data_.Consume( + data_.size(), [&](opentelemetry::sdk::common::CircularBufferRange< + opentelemetry::sdk::common::AtomicUniquePtr> range) noexcept { + range.ForEach([&](opentelemetry::sdk::common::AtomicUniquePtr &ptr) noexcept { + std::unique_ptr swap_ptr = nullptr; + ptr.Swap(swap_ptr); + res.push_back(std::move(swap_ptr)); + return true; + }); + }); + + return res; + } + +private: + opentelemetry::sdk::common::CircularBuffer data_; +}; +} // namespace memory +} // namespace exporter +OPENTELEMETRY_END_NAMESPACE diff --git a/exporters/memory/include/opentelemetry/exporters/memory/in_memory_span_data.h b/exporters/memory/include/opentelemetry/exporters/memory/in_memory_span_data.h index df6d377b9d..874b475690 100644 --- a/exporters/memory/include/opentelemetry/exporters/memory/in_memory_span_data.h +++ b/exporters/memory/include/opentelemetry/exporters/memory/in_memory_span_data.h @@ -3,7 +3,7 @@ #pragma once -#include "opentelemetry/sdk/common/circular_buffer.h" +#include "opentelemetry/exporters/memory/in_memory_data.h" #include "opentelemetry/sdk/trace/recordable.h" #include "opentelemetry/sdk/trace/span_data.h" @@ -14,60 +14,17 @@ namespace exporter { namespace memory { -/** - * A wrapper class holding in memory exporter data - */ -class InMemorySpanData final +class InMemorySpanData final : public exporter::memory::InMemoryData { public: /** * @param buffer_size a required value that sets the size of the CircularBuffer */ - InMemorySpanData(size_t buffer_size) : spans_received_(buffer_size) {} + explicit InMemorySpanData(size_t buffer_size) + : exporter::memory::InMemoryData(buffer_size) + {} - /** - * @param data a required unique pointer to the data to add to the CircularBuffer - */ - void Add(std::unique_ptr data) noexcept - { - std::unique_ptr span_data( - static_cast(data.release())); - spans_received_.Add(span_data); - } - - /** - * @return Returns a vector of unique pointers containing all the span data in the - * CircularBuffer. This operation will empty the Buffer, which is why the data - * is returned as unique pointers - */ - std::vector> GetSpans() noexcept - { - std::vector> res; - - // Pointer swap is required because the Consume function requires that the - // AtomicUniquePointer be set to null - spans_received_.Consume( - spans_received_.size(), - [&](opentelemetry::sdk::common::CircularBufferRange< - opentelemetry::sdk::common::AtomicUniquePtr> - range) noexcept { - range.ForEach( - [&](opentelemetry::sdk::common::AtomicUniquePtr - &ptr) noexcept { - std::unique_ptr swap_ptr = - std::unique_ptr(nullptr); - ptr.Swap(swap_ptr); - res.push_back( - std::unique_ptr(swap_ptr.release())); - return true; - }); - }); - - return res; - } - -private: - opentelemetry::sdk::common::CircularBuffer spans_received_; + std::vector> GetSpans() noexcept { return Get(); } }; } // namespace memory } // namespace exporter diff --git a/exporters/memory/include/opentelemetry/exporters/memory/in_memory_span_exporter.h b/exporters/memory/include/opentelemetry/exporters/memory/in_memory_span_exporter.h index 28b7bc34e8..075d6e4b2e 100644 --- a/exporters/memory/include/opentelemetry/exporters/memory/in_memory_span_exporter.h +++ b/exporters/memory/include/opentelemetry/exporters/memory/in_memory_span_exporter.h @@ -6,6 +6,7 @@ #include "opentelemetry/common/spin_lock_mutex.h" #include "opentelemetry/exporters/memory/in_memory_span_data.h" #include "opentelemetry/sdk/trace/exporter.h" +#include "opentelemetry/sdk/trace/span_data.h" #include "opentelemetry/sdk_config.h" OPENTELEMETRY_BEGIN_NAMESPACE @@ -26,7 +27,7 @@ class InMemorySpanExporter final : public opentelemetry::sdk::trace::SpanExporte * @param buffer_size an optional value that sets the size of the InMemorySpanData */ InMemorySpanExporter(size_t buffer_size = MAX_BUFFER_SIZE) - : data_(new opentelemetry::exporter::memory::InMemorySpanData(buffer_size)) + : data_(new InMemorySpanData(buffer_size)) {} /** @@ -80,13 +81,10 @@ class InMemorySpanExporter final : public opentelemetry::sdk::trace::SpanExporte /** * @return Returns a shared pointer to this exporters InMemorySpanData */ - std::shared_ptr GetData() noexcept - { - return data_; - } + std::shared_ptr GetData() noexcept { return data_; } private: - std::shared_ptr data_; + std::shared_ptr data_; bool is_shutdown_ = false; mutable opentelemetry::common::SpinLockMutex lock_; const bool isShutdown() const noexcept