diff --git a/CHANGELOG.md b/CHANGELOG.md index 82eaf5a2ba..a714b0de6f 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -55,6 +55,9 @@ Increment the: * [CMAKE] Add generated protobuf headers to the opentelemetry_proto target [#3400](https://github.com/open-telemetry/opentelemetry-cpp/pull/3400) +* [EXPORTER] ostream log exporter, fixed memory ownership issues + [#3417](https://github.com/open-telemetry/opentelemetry-cpp/pull/3417) + ## [1.20 2025-04-01] * [BUILD] Update opentelemetry-proto version diff --git a/sdk/include/opentelemetry/sdk/logs/read_write_log_record.h b/sdk/include/opentelemetry/sdk/logs/read_write_log_record.h index 9831eaa1c9..af28273c49 100644 --- a/sdk/include/opentelemetry/sdk/logs/read_write_log_record.h +++ b/sdk/include/opentelemetry/sdk/logs/read_write_log_record.h @@ -82,7 +82,7 @@ class ReadWriteLogRecord final : public ReadableLogRecord * Get body field of this log. * @return the body field for this log. */ - const opentelemetry::common::AttributeValue &GetBody() const noexcept override; + const opentelemetry::sdk::common::OwnedAttributeValue &GetBody() const noexcept override; /** * Set the Event Id object @@ -151,8 +151,8 @@ class ReadWriteLogRecord final : public ReadableLogRecord * Get attributes of this log. * @return the body field of this log */ - const std::unordered_map &GetAttributes() - const noexcept override; + const std::unordered_map & + GetAttributes() const noexcept override; /** * Get resource of this log @@ -187,8 +187,8 @@ class ReadWriteLogRecord final : public ReadableLogRecord const opentelemetry::sdk::resource::Resource *resource_; const opentelemetry::sdk::instrumentationscope::InstrumentationScope *instrumentation_scope_; - std::unordered_map attributes_map_; - opentelemetry::common::AttributeValue body_; + std::unordered_map attributes_map_; + opentelemetry::sdk::common::OwnedAttributeValue body_; opentelemetry::common::SystemTimestamp timestamp_; opentelemetry::common::SystemTimestamp observed_timestamp_; diff --git a/sdk/include/opentelemetry/sdk/logs/readable_log_record.h b/sdk/include/opentelemetry/sdk/logs/readable_log_record.h index 2222def9d2..3245717ce2 100644 --- a/sdk/include/opentelemetry/sdk/logs/readable_log_record.h +++ b/sdk/include/opentelemetry/sdk/logs/readable_log_record.h @@ -75,7 +75,7 @@ class ReadableLogRecord : public Recordable * Get body field of this log. * @return the body field for this log. */ - virtual const opentelemetry::common::AttributeValue &GetBody() const noexcept = 0; + virtual const opentelemetry::sdk::common::OwnedAttributeValue &GetBody() const noexcept = 0; /** * Get the Event id. @@ -111,7 +111,7 @@ class ReadableLogRecord : public Recordable * Get attributes of this log. * @return the body field of this log */ - virtual const std::unordered_map & + virtual const std::unordered_map & GetAttributes() const noexcept = 0; /** diff --git a/sdk/src/logs/read_write_log_record.cc b/sdk/src/logs/read_write_log_record.cc index 84a4bed2f4..7743fbd5db 100644 --- a/sdk/src/logs/read_write_log_record.cc +++ b/sdk/src/logs/read_write_log_record.cc @@ -12,6 +12,7 @@ #include "opentelemetry/logs/severity.h" #include "opentelemetry/nostd/string_view.h" #include "opentelemetry/nostd/variant.h" +#include "opentelemetry/sdk/common/attribute_utils.h" #include "opentelemetry/sdk/instrumentationscope/instrumentation_scope.h" #include "opentelemetry/sdk/logs/read_write_log_record.h" #include "opentelemetry/sdk/resource/resource.h" @@ -30,7 +31,7 @@ ReadWriteLogRecord::ReadWriteLogRecord() : severity_(opentelemetry::logs::Severity::kInvalid), resource_(nullptr), instrumentation_scope_(nullptr), - body_(nostd::string_view()), + body_(std::string()), observed_timestamp_(std::chrono::system_clock::now()), event_id_(0), event_name_("") @@ -71,10 +72,11 @@ opentelemetry::logs::Severity ReadWriteLogRecord::GetSeverity() const noexcept void ReadWriteLogRecord::SetBody(const opentelemetry::common::AttributeValue &message) noexcept { - body_ = message; + opentelemetry::sdk::common::AttributeConverter converter; + body_ = nostd::visit(converter, message); } -const opentelemetry::common::AttributeValue &ReadWriteLogRecord::GetBody() const noexcept +const opentelemetry::sdk::common::OwnedAttributeValue &ReadWriteLogRecord::GetBody() const noexcept { return body_; } @@ -161,10 +163,12 @@ const opentelemetry::trace::TraceFlags &ReadWriteLogRecord::GetTraceFlags() cons void ReadWriteLogRecord::SetAttribute(nostd::string_view key, const opentelemetry::common::AttributeValue &value) noexcept { - attributes_map_[static_cast(key)] = value; + std::string safe_key(key); + opentelemetry::sdk::common::AttributeConverter converter; + attributes_map_[safe_key] = nostd::visit(converter, value); } -const std::unordered_map & +const std::unordered_map & ReadWriteLogRecord::GetAttributes() const noexcept { return attributes_map_; diff --git a/sdk/test/logs/log_record_test.cc b/sdk/test/logs/log_record_test.cc index 1a9ac328cf..48d0754060 100644 --- a/sdk/test/logs/log_record_test.cc +++ b/sdk/test/logs/log_record_test.cc @@ -9,8 +9,8 @@ #include #include #include +#include -#include "opentelemetry/common/attribute_value.h" #include "opentelemetry/common/key_value_iterable.h" #include "opentelemetry/common/timestamp.h" #include "opentelemetry/logs/log_record.h" @@ -22,6 +22,7 @@ #include "opentelemetry/nostd/string_view.h" #include "opentelemetry/nostd/unique_ptr.h" #include "opentelemetry/nostd/variant.h" +#include "opentelemetry/sdk/common/attribute_utils.h" #include "opentelemetry/sdk/logs/read_write_log_record.h" #include "opentelemetry/sdk/resource/resource.h" #include "opentelemetry/trace/span_id.h" @@ -72,13 +73,9 @@ TEST(ReadWriteLogRecord, SetAndGet) // Test that all fields match what was set ASSERT_EQ(record.GetSeverity(), logs_api::Severity::kInvalid); - if (nostd::holds_alternative(record.GetBody())) + if (nostd::holds_alternative(record.GetBody())) { - ASSERT_EQ(std::string(nostd::get(record.GetBody())), "Message"); - } - else if (nostd::holds_alternative(record.GetBody())) - { - ASSERT_TRUE(nostd::get(record.GetBody()) == "Message"); + ASSERT_EQ(std::string(nostd::get(record.GetBody())), "Message"); } ASSERT_TRUE(nostd::get(record.GetResource().GetAttributes().at("res1"))); ASSERT_EQ(nostd::get(record.GetAttributes().at("attr1")), 314159); @@ -109,13 +106,13 @@ class TestBodyLogger : public opentelemetry::logs::Logger } } - const opentelemetry::common::AttributeValue &GetLastLogRecord() const noexcept + const opentelemetry::sdk::common::OwnedAttributeValue &GetLastLogRecord() const noexcept { return last_body_; } private: - opentelemetry::common::AttributeValue last_body_; + opentelemetry::sdk::common::OwnedAttributeValue last_body_; }; // Define a basic LoggerProvider class that returns an instance of the logger class defined above @@ -173,28 +170,19 @@ TEST(LogBody, BodyConversation) real_logger->EmitLogRecord(opentelemetry::logs::Severity::kInfo, "128"); ASSERT_TRUE( - opentelemetry::nostd::holds_alternative(real_logger->GetLastLogRecord()) || - opentelemetry::nostd::holds_alternative(real_logger->GetLastLogRecord())); - if (opentelemetry::nostd::holds_alternative(real_logger->GetLastLogRecord())) - { - ASSERT_EQ(nostd::string_view{"128"}, - opentelemetry::nostd::get(real_logger->GetLastLogRecord())); - } - else - { - ASSERT_EQ(nostd::string_view{"128"}, - opentelemetry::nostd::get(real_logger->GetLastLogRecord())); - } + opentelemetry::nostd::holds_alternative(real_logger->GetLastLogRecord())); + ASSERT_EQ(nostd::string_view{"128"}, + opentelemetry::nostd::get(real_logger->GetLastLogRecord())); { bool data[] = {true, false, true}; nostd::span data_span = data; real_logger->EmitLogRecord(opentelemetry::logs::Severity::kInfo, data_span); - ASSERT_TRUE(opentelemetry::nostd::holds_alternative>( + ASSERT_TRUE(opentelemetry::nostd::holds_alternative>( real_logger->GetLastLogRecord())); - nostd::span output = - opentelemetry::nostd::get>(real_logger->GetLastLogRecord()); + std::vector output = + opentelemetry::nostd::get>(real_logger->GetLastLogRecord()); ASSERT_EQ(data_span.size(), output.size()); @@ -208,11 +196,11 @@ TEST(LogBody, BodyConversation) int32_t data[] = {221, 222, 223}; nostd::span data_span = data; real_logger->EmitLogRecord(opentelemetry::logs::Severity::kInfo, data_span); - ASSERT_TRUE(opentelemetry::nostd::holds_alternative>( + ASSERT_TRUE(opentelemetry::nostd::holds_alternative>( real_logger->GetLastLogRecord())); nostd::span output = - opentelemetry::nostd::get>(real_logger->GetLastLogRecord()); + opentelemetry::nostd::get>(real_logger->GetLastLogRecord()); ASSERT_EQ(data_span.size(), output.size()); @@ -226,11 +214,11 @@ TEST(LogBody, BodyConversation) uint32_t data[] = {231, 232, 233}; nostd::span data_span = data; real_logger->EmitLogRecord(opentelemetry::logs::Severity::kInfo, data_span); - ASSERT_TRUE(opentelemetry::nostd::holds_alternative>( + ASSERT_TRUE(opentelemetry::nostd::holds_alternative>( real_logger->GetLastLogRecord())); - nostd::span output = - opentelemetry::nostd::get>(real_logger->GetLastLogRecord()); + std::vector output = + opentelemetry::nostd::get>(real_logger->GetLastLogRecord()); ASSERT_EQ(data_span.size(), output.size()); @@ -244,11 +232,11 @@ TEST(LogBody, BodyConversation) int64_t data[] = {241, 242, 243}; nostd::span data_span = data; real_logger->EmitLogRecord(opentelemetry::logs::Severity::kInfo, data_span); - ASSERT_TRUE(opentelemetry::nostd::holds_alternative>( + ASSERT_TRUE(opentelemetry::nostd::holds_alternative>( real_logger->GetLastLogRecord())); - nostd::span output = - opentelemetry::nostd::get>(real_logger->GetLastLogRecord()); + std::vector output = + opentelemetry::nostd::get>(real_logger->GetLastLogRecord()); ASSERT_EQ(data_span.size(), output.size()); @@ -262,11 +250,11 @@ TEST(LogBody, BodyConversation) uint64_t data[] = {251, 252, 253}; nostd::span data_span = data; real_logger->EmitLogRecord(opentelemetry::logs::Severity::kInfo, data_span); - ASSERT_TRUE(opentelemetry::nostd::holds_alternative>( + ASSERT_TRUE(opentelemetry::nostd::holds_alternative>( real_logger->GetLastLogRecord())); - nostd::span output = - opentelemetry::nostd::get>(real_logger->GetLastLogRecord()); + std::vector output = + opentelemetry::nostd::get>(real_logger->GetLastLogRecord()); ASSERT_EQ(data_span.size(), output.size()); @@ -280,11 +268,11 @@ TEST(LogBody, BodyConversation) uint8_t data[] = {161, 162, 163}; nostd::span data_span = data; real_logger->EmitLogRecord(opentelemetry::logs::Severity::kInfo, data_span); - ASSERT_TRUE(opentelemetry::nostd::holds_alternative>( + ASSERT_TRUE(opentelemetry::nostd::holds_alternative>( real_logger->GetLastLogRecord())); - nostd::span output = - opentelemetry::nostd::get>(real_logger->GetLastLogRecord()); + std::vector output = + opentelemetry::nostd::get>(real_logger->GetLastLogRecord()); ASSERT_EQ(data_span.size(), output.size()); @@ -298,11 +286,11 @@ TEST(LogBody, BodyConversation) double data[] = {271.0, 272.0, 273.0}; nostd::span data_span = data; real_logger->EmitLogRecord(opentelemetry::logs::Severity::kInfo, data_span); - ASSERT_TRUE(opentelemetry::nostd::holds_alternative>( + ASSERT_TRUE(opentelemetry::nostd::holds_alternative>( real_logger->GetLastLogRecord())); - nostd::span output = - opentelemetry::nostd::get>(real_logger->GetLastLogRecord()); + std::vector output = + opentelemetry::nostd::get>(real_logger->GetLastLogRecord()); ASSERT_EQ(data_span.size(), output.size()); @@ -317,12 +305,11 @@ TEST(LogBody, BodyConversation) nostd::string_view data[] = {data_origin[0], data_origin[1], data_origin[2]}; nostd::span data_span = data; real_logger->EmitLogRecord(opentelemetry::logs::Severity::kInfo, data_span); - ASSERT_TRUE(opentelemetry::nostd::holds_alternative>( + ASSERT_TRUE(opentelemetry::nostd::holds_alternative>( real_logger->GetLastLogRecord())); - nostd::span output = - opentelemetry::nostd::get>( - real_logger->GetLastLogRecord()); + std::vector output = + opentelemetry::nostd::get>(real_logger->GetLastLogRecord()); ASSERT_EQ(data_span.size(), output.size());