From e9ee5f9d1815ae75ae5dbdc0e972e4b91eaaadd3 Mon Sep 17 00:00:00 2001 From: Avinash Varma Date: Wed, 4 Dec 2024 13:36:14 +0530 Subject: [PATCH 1/3] Adding support for publishing resource attributes in fluent logs. --- .../exporters/fluentd/common/fluentd_common.h | 88 +++++++++++++++++++ .../exporters/fluentd/log/recordable.h | 2 +- exporters/fluentd/src/log/recordable.cc | 13 +++ 3 files changed, 102 insertions(+), 1 deletion(-) diff --git a/exporters/fluentd/include/opentelemetry/exporters/fluentd/common/fluentd_common.h b/exporters/fluentd/include/opentelemetry/exporters/fluentd/common/fluentd_common.h index 4fc91c596..994a74ab3 100644 --- a/exporters/fluentd/include/opentelemetry/exporters/fluentd/common/fluentd_common.h +++ b/exporters/fluentd/include/opentelemetry/exporters/fluentd/common/fluentd_common.h @@ -4,6 +4,7 @@ #pragma once #include "opentelemetry/common/attribute_value.h" +#include "opentelemetry/sdk/common/attribute_utils.h" #include "opentelemetry/exporters/fluentd/common/fluentd_logging.h" #include "opentelemetry/nostd/string_view.h" #include "opentelemetry/version.h" @@ -99,6 +100,93 @@ void inline PopulateAttribute( } } +void inline PopulateOwnedAttribute( + nlohmann::json &attribute, nostd::string_view key, + const opentelemetry::sdk::common::OwnedAttributeValue &value) { + // Assert size of variant to ensure that this method gets updated if the + // variant definition changes + static_assert( + nostd::variant_size::value == + kAttributeValueSize + 1, + "AttributeValue contains unknown type"); + + namespace common = opentelemetry::sdk::common; + switch(value.index()) { + case common::kTypeBool: + attribute[key.data()] = nostd::get(value); + break; + case common::kTypeInt: + attribute[key.data()] = nostd::get(value); + break; + case common::kTypeUInt: + attribute[key.data()] = nostd::get(value); + break; + case common::kTypeInt64: + attribute[key.data()] = nostd::get(value); + break; + case common::kTypeDouble: + attribute[key.data()] = nostd::get(value); + break; + case common::kTypeString: + attribute[key.data()] = nostd::get(value); + break; + case common::kTypeSpanBool: + attribute[key.data()] = {}; + for (const auto &val : nostd::get>(value)) { + attribute[key.data()].push_back(val); + } + break; + case common::kTypeSpanInt: + attribute[key.data()] = {}; + for (const auto &val : nostd::get>(value)) { + attribute[key.data()].push_back(val); + } + break; + case common::kTypeSpanUInt: + attribute[key.data()] = {}; + for (const auto &val : nostd::get>(value)) { + attribute[key.data()].push_back(val); + } + break; + case common::kTypeSpanInt64: + attribute[key.data()] = {}; + for (const auto &val : nostd::get>(value)) { + attribute[key.data()].push_back(val); + } + break; + case common::kTypeSpanDouble: + attribute[key.data()] = {}; + for (const auto &val : nostd::get>(value)) { + attribute[key.data()].push_back(val); + } + break; + case common::kTypeSpanString: + attribute[key.data()] = {}; + for (const auto &val : + nostd::get>(value)) { + attribute[key.data()].push_back(val); + } + break; + case common::kTypeUInt64: + attribute[key.data()] = nostd::get(value); + break; + case common::kTypeSpanUInt64: + attribute[key.data()] = {}; + for (const auto &val : nostd::get>(value)) { + attribute[key.data()].push_back(val); + } + break; + case common::kTypeSpanByte: + attribute[key.data()] = {}; + for (const auto &val : nostd::get>(value)) { + attribute[key.data()].push_back(val); + } + break; + default: + break; + } +} + inline std::string AttributeValueToString( const opentelemetry::common::AttributeValue &value) { std::string result; diff --git a/exporters/fluentd/include/opentelemetry/exporters/fluentd/log/recordable.h b/exporters/fluentd/include/opentelemetry/exporters/fluentd/log/recordable.h index 9687f03e9..917d5f452 100644 --- a/exporters/fluentd/include/opentelemetry/exporters/fluentd/log/recordable.h +++ b/exporters/fluentd/include/opentelemetry/exporters/fluentd/log/recordable.h @@ -44,7 +44,7 @@ class Recordable final : public opentelemetry::sdk::logs::Recordable { * @param Resource the resource to set */ void SetResource(const opentelemetry::sdk::resource::Resource - &resource) noexcept override {} // Not Supported + &resource) noexcept override; /** * Set an attribute of a log. diff --git a/exporters/fluentd/src/log/recordable.cc b/exporters/fluentd/src/log/recordable.cc index 657f924d1..093ab6ed5 100644 --- a/exporters/fluentd/src/log/recordable.cc +++ b/exporters/fluentd/src/log/recordable.cc @@ -4,6 +4,7 @@ #include "opentelemetry/exporters/fluentd/log/recordable.h" #include "opentelemetry/exporters/fluentd/common/fluentd_common.h" #include "opentelemetry/exporters/fluentd/common/fluentd_logging.h" +#include "opentelemetry/sdk/resource/resource.h" #include "opentelemetry/logs/severity.h" #include "opentelemetry/trace/span_id.h" @@ -54,6 +55,18 @@ void Recordable::SetSpanId(const opentelemetry::trace::SpanId &span_id) noexcept json_[FLUENT_FIELD_SPAN_ID] = std::string(span_id_lower_base16, 16); } +void Recordable::SetResource(const opentelemetry::sdk::resource::Resource + &resource) noexcept { + if(resource.GetAttributes().size() > 0) { + if (!json_.contains(FLUENT_FIELD_PROPERTIES)) { + json_[FLUENT_FIELD_PROPERTIES] = nlohmann::json::object(); + } + } + for(const auto& [key, value] : resource.GetAttributes()) { + fluentd_common::PopulateOwnedAttribute(json_[FLUENT_FIELD_PROPERTIES], key, value); + } +} + void Recordable::SetAttribute( nostd::string_view key, const opentelemetry::common::AttributeValue &value) noexcept { From 7f706c1dbdd5bc2dc55030afc209a17042263bdb Mon Sep 17 00:00:00 2001 From: Avinash Varma Date: Wed, 4 Dec 2024 13:43:28 +0530 Subject: [PATCH 2/3] Adding a macro for the feature. --- .../include/opentelemetry/exporters/fluentd/log/recordable.h | 4 ++++ exporters/fluentd/src/log/recordable.cc | 3 +++ 2 files changed, 7 insertions(+) diff --git a/exporters/fluentd/include/opentelemetry/exporters/fluentd/log/recordable.h b/exporters/fluentd/include/opentelemetry/exporters/fluentd/log/recordable.h index 917d5f452..07e0504c1 100644 --- a/exporters/fluentd/include/opentelemetry/exporters/fluentd/log/recordable.h +++ b/exporters/fluentd/include/opentelemetry/exporters/fluentd/log/recordable.h @@ -44,7 +44,11 @@ class Recordable final : public opentelemetry::sdk::logs::Recordable { * @param Resource the resource to set */ void SetResource(const opentelemetry::sdk::resource::Resource +#ifdef ENABLE_FLUENT_RESOURCE_PUBLISH &resource) noexcept override; +#else + &resource) noexcept override {} // Not Supported +#endif /** * Set an attribute of a log. diff --git a/exporters/fluentd/src/log/recordable.cc b/exporters/fluentd/src/log/recordable.cc index 093ab6ed5..b119f2e77 100644 --- a/exporters/fluentd/src/log/recordable.cc +++ b/exporters/fluentd/src/log/recordable.cc @@ -55,6 +55,8 @@ void Recordable::SetSpanId(const opentelemetry::trace::SpanId &span_id) noexcept json_[FLUENT_FIELD_SPAN_ID] = std::string(span_id_lower_base16, 16); } + +#ifdef ENABLE_FLUENT_RESOURCE_PUBLISH void Recordable::SetResource(const opentelemetry::sdk::resource::Resource &resource) noexcept { if(resource.GetAttributes().size() > 0) { @@ -66,6 +68,7 @@ void Recordable::SetResource(const opentelemetry::sdk::resource::Resource fluentd_common::PopulateOwnedAttribute(json_[FLUENT_FIELD_PROPERTIES], key, value); } } +#endif void Recordable::SetAttribute( nostd::string_view key, From bae1488d9ff4909e8a62d5b68b962df77e150426 Mon Sep 17 00:00:00 2001 From: Avinash Varma Date: Thu, 5 Dec 2024 12:59:02 +0530 Subject: [PATCH 3/3] Address review comments. --- exporters/fluentd/CMakeLists.txt | 4 ++++ .../include/opentelemetry/exporters/fluentd/log/recordable.h | 2 +- exporters/fluentd/src/log/recordable.cc | 2 +- 3 files changed, 6 insertions(+), 2 deletions(-) diff --git a/exporters/fluentd/CMakeLists.txt b/exporters/fluentd/CMakeLists.txt index 0cd7354b3..93aa4f6a5 100644 --- a/exporters/fluentd/CMakeLists.txt +++ b/exporters/fluentd/CMakeLists.txt @@ -56,6 +56,10 @@ endif() include_directories(include) +if(OPENTELEMETRY_ENABLE_FLUENT_RESOURCE_PUBLISH_EXPERIMENTAL) + add_definitions(-DOPENTELEMETRY_ENABLE_FLUENT_RESOURCE_PUBLISH_EXPERIMENTAL) +endif() + # create fluentd trace exporter add_library(opentelemetry_exporter_geneva_trace src/trace/fluentd_exporter.cc src/trace/recordable.cc) diff --git a/exporters/fluentd/include/opentelemetry/exporters/fluentd/log/recordable.h b/exporters/fluentd/include/opentelemetry/exporters/fluentd/log/recordable.h index 07e0504c1..3155dff19 100644 --- a/exporters/fluentd/include/opentelemetry/exporters/fluentd/log/recordable.h +++ b/exporters/fluentd/include/opentelemetry/exporters/fluentd/log/recordable.h @@ -44,7 +44,7 @@ class Recordable final : public opentelemetry::sdk::logs::Recordable { * @param Resource the resource to set */ void SetResource(const opentelemetry::sdk::resource::Resource -#ifdef ENABLE_FLUENT_RESOURCE_PUBLISH +#ifdef OPENTELEMETRY_ENABLE_FLUENT_RESOURCE_PUBLISH_EXPERIMENTAL &resource) noexcept override; #else &resource) noexcept override {} // Not Supported diff --git a/exporters/fluentd/src/log/recordable.cc b/exporters/fluentd/src/log/recordable.cc index b119f2e77..6b14a7fe3 100644 --- a/exporters/fluentd/src/log/recordable.cc +++ b/exporters/fluentd/src/log/recordable.cc @@ -56,7 +56,7 @@ void Recordable::SetSpanId(const opentelemetry::trace::SpanId &span_id) noexcept } -#ifdef ENABLE_FLUENT_RESOURCE_PUBLISH +#ifdef OPENTELEMETRY_ENABLE_FLUENT_RESOURCE_PUBLISH_EXPERIMENTAL void Recordable::SetResource(const opentelemetry::sdk::resource::Resource &resource) noexcept { if(resource.GetAttributes().size() > 0) {