diff --git a/sdk/include/opentelemetry/sdk/metrics/observer_result.h b/sdk/include/opentelemetry/sdk/metrics/observer_result.h index 8acc4972e0..0d816efae0 100644 --- a/sdk/include/opentelemetry/sdk/metrics/observer_result.h +++ b/sdk/include/opentelemetry/sdk/metrics/observer_result.h @@ -7,6 +7,7 @@ #include "opentelemetry/common/attribute_value.h" #include "opentelemetry/common/key_value_iterable.h" +#include "opentelemetry/common/macros.h" #include "opentelemetry/metrics/observer_result.h" #include "opentelemetry/nostd/string_view.h" #include "opentelemetry/sdk/metrics/state/attributes_hashmap.h" @@ -34,15 +35,37 @@ class ObserverResultT final : public opentelemetry::metrics::ObserverResultT ~ObserverResultT() override = default; void Observe(T value) noexcept override +#if OPENTELEMETRY_HAVE_EXCEPTIONS + try +#endif { data_[MetricAttributes{{}, attributes_processor_}] = value; } +#if OPENTELEMETRY_HAVE_EXCEPTIONS + catch (...) + { + // Silently drop the measurement; per opentelemetry-cpp guidance (PR #3964), + // exceptions in noexcept API/SDK code must not log or abort. + return; + } +#endif void Observe(T value, const opentelemetry::common::KeyValueIterable &attributes) noexcept override +#if OPENTELEMETRY_HAVE_EXCEPTIONS + try +#endif { data_[MetricAttributes{attributes, attributes_processor_}] = value; // overwrites the previous value if present } +#if OPENTELEMETRY_HAVE_EXCEPTIONS + catch (...) + { + // Silently drop the measurement; per opentelemetry-cpp guidance (PR #3964), + // exceptions in noexcept API/SDK code must not log or abort. + return; + } +#endif const std::unordered_map &GetMeasurements() {