From 2bd3f39e72c4b616eac6e0706b0972636ca8a769 Mon Sep 17 00:00:00 2001 From: Tom Tan Date: Mon, 10 Mar 2025 17:34:02 -0700 Subject: [PATCH 1/2] Change the param-pack unpacking order to start from left to right --- api/include/opentelemetry/logs/logger.h | 12 ++++++++++-- 1 file changed, 10 insertions(+), 2 deletions(-) diff --git a/api/include/opentelemetry/logs/logger.h b/api/include/opentelemetry/logs/logger.h index 519516f297..4ad906d002 100644 --- a/api/include/opentelemetry/logs/logger.h +++ b/api/include/opentelemetry/logs/logger.h @@ -72,8 +72,16 @@ class Logger return; } - IgnoreTraitResult(detail::LogRecordSetterTrait::type>::Set( - log_record.get(), std::forward(args))...); + // + // Keep the parameter pack unpacking order from left to right because left + // ones are usually more important like severity and event_id than the + // attributes. The left to right unpack order could pass the more important + // data to processors to avoid caching and memory allocating. + // + IgnoreTraitResult( + (detail::LogRecordSetterTrait::type>::Set( + log_record.get(), + std::forward(args)),...)); EmitLogRecord(std::move(log_record)); } From dc03d427350ebf1eea8a4d69e7309085aee4582c Mon Sep 17 00:00:00 2001 From: Tom Tan Date: Mon, 10 Mar 2025 18:41:48 -0700 Subject: [PATCH 2/2] Add fallback for c++14 and below --- api/include/opentelemetry/logs/logger.h | 15 +++++++++++---- 1 file changed, 11 insertions(+), 4 deletions(-) diff --git a/api/include/opentelemetry/logs/logger.h b/api/include/opentelemetry/logs/logger.h index 4ad906d002..6bc78f857a 100644 --- a/api/include/opentelemetry/logs/logger.h +++ b/api/include/opentelemetry/logs/logger.h @@ -78,10 +78,17 @@ class Logger // attributes. The left to right unpack order could pass the more important // data to processors to avoid caching and memory allocating. // - IgnoreTraitResult( - (detail::LogRecordSetterTrait::type>::Set( - log_record.get(), - std::forward(args)),...)); +#if __cplusplus <= 201402L + // C++14 does not support fold expressions for parameter pack expansion. + int dummy[] = {(detail::LogRecordSetterTrait::type>::Set( + log_record.get(), std::forward(args)), + 0)...}; + IgnoreTraitResult(dummy); +#else + IgnoreTraitResult((detail::LogRecordSetterTrait::type>::Set( + log_record.get(), std::forward(args)), + ...)); +#endif EmitLogRecord(std::move(log_record)); }