From 472036de30a4da18f02d93277e9f2809e410008b Mon Sep 17 00:00:00 2001 From: Marc Alff Date: Sat, 29 Aug 2026 19:22:21 +0200 Subject: [PATCH 1/2] Fix cppcoreguidelines-pro-type-const-cast for multi observer metrics. --- .../opentelemetry/sdk/metrics/async_instruments.h | 4 ++-- .../sdk/metrics/multi_observer_result.h | 4 ++-- sdk/src/metrics/async_instruments.cc | 4 ++-- sdk/src/metrics/multi_observer_result.cc | 15 +++++---------- sdk/src/metrics/state/observable_registry.cc | 6 +++--- 5 files changed, 14 insertions(+), 19 deletions(-) diff --git a/sdk/include/opentelemetry/sdk/metrics/async_instruments.h b/sdk/include/opentelemetry/sdk/metrics/async_instruments.h index af6888b2d5..5feb7bf555 100644 --- a/sdk/include/opentelemetry/sdk/metrics/async_instruments.h +++ b/sdk/include/opentelemetry/sdk/metrics/async_instruments.h @@ -37,9 +37,9 @@ class ObservableInstrument : public opentelemetry::metrics::ObservableInstrument void RemoveCallback(opentelemetry::metrics::ObservableCallbackPtr callback, void *state) noexcept override; - const InstrumentDescriptor &GetInstrumentDescriptor(); + const InstrumentDescriptor &GetInstrumentDescriptor() const; - AsyncWritableMetricStorage *GetMetricStorage(); + AsyncWritableMetricStorage *GetMetricStorage() const; private: InstrumentDescriptor instrument_descriptor_; diff --git a/sdk/include/opentelemetry/sdk/metrics/multi_observer_result.h b/sdk/include/opentelemetry/sdk/metrics/multi_observer_result.h index b0304c2c43..3f47469a3a 100644 --- a/sdk/include/opentelemetry/sdk/metrics/multi_observer_result.h +++ b/sdk/include/opentelemetry/sdk/metrics/multi_observer_result.h @@ -27,7 +27,7 @@ class OPENTELEMETRY_EXPORT MultiObserverResult final size_t InstrumentCount() const; bool HasInstrument(const opentelemetry::metrics::ObservableInstrument *instrument) const; void GetInstruments( - nostd::function_ref callback); + nostd::function_ref callback); void Reset(); void StoreResults(opentelemetry::common::SystemTimestamp collection_ts); @@ -43,7 +43,7 @@ class OPENTELEMETRY_EXPORT MultiObserverResult final // This allows us to avoid an unnecessary layer of indirection and a bunch of allocations. using ObserverResultDirect = nostd::variant, ObserverResultT>; - std::unordered_map + std::unordered_map observer_results_; }; } // namespace metrics diff --git a/sdk/src/metrics/async_instruments.cc b/sdk/src/metrics/async_instruments.cc index 709957d68e..1403d55b11 100644 --- a/sdk/src/metrics/async_instruments.cc +++ b/sdk/src/metrics/async_instruments.cc @@ -43,12 +43,12 @@ void ObservableInstrument::RemoveCallback(opentelemetry::metrics::ObservableCall observable_registry_->RemoveCallback(callback, state, this); } -const InstrumentDescriptor &ObservableInstrument::GetInstrumentDescriptor() +const InstrumentDescriptor &ObservableInstrument::GetInstrumentDescriptor() const { return instrument_descriptor_; } -AsyncWritableMetricStorage *ObservableInstrument::GetMetricStorage() +AsyncWritableMetricStorage *ObservableInstrument::GetMetricStorage() const { return storage_.get(); } diff --git a/sdk/src/metrics/multi_observer_result.cc b/sdk/src/metrics/multi_observer_result.cc index c7ddbc255d..83b8cf77d8 100644 --- a/sdk/src/metrics/multi_observer_result.cc +++ b/sdk/src/metrics/multi_observer_result.cc @@ -65,12 +65,11 @@ size_t MultiObserverResult::InstrumentCount() const bool MultiObserverResult::HasInstrument( const opentelemetry::metrics::ObservableInstrument *instrument) const { - return observer_results_.find(const_cast( - instrument)) != observer_results_.end(); + return observer_results_.find(instrument) != observer_results_.end(); } void MultiObserverResult::GetInstruments( - nostd::function_ref callback) + nostd::function_ref callback) { for (auto &el : observer_results_) { @@ -93,7 +92,7 @@ void MultiObserverResult::StoreResults(opentelemetry::common::SystemTimestamp co auto *instrument = el.first; auto &result = el.second; - auto storage = static_cast(instrument) + auto storage = static_cast(instrument) ->GetMetricStorage(); nostd::visit(StoreResultVisitor{storage, collection_ts}, result); } @@ -103,10 +102,7 @@ opentelemetry::metrics::ObserverResultT &MultiObserverResult::ForInstrum const opentelemetry::metrics::ObservableInstrument *instrument) { static opentelemetry::sdk::metrics::ObserverResultT null_result; - // const_cast is appropriate here, because we're _not_ modifying the passed-in pointer; - // we just need to make it non-const to be able to look it up in our map. - auto it = observer_results_.find( - const_cast(instrument)); + auto it = observer_results_.find(instrument); if (it == observer_results_.end()) { OTEL_INTERNAL_LOG_ERROR("[MultiObserverResult::ForInstrumentDouble]" @@ -128,8 +124,7 @@ opentelemetry::metrics::ObserverResultT &MultiObserverResult::ForInstru const opentelemetry::metrics::ObservableInstrument *instrument) { static opentelemetry::sdk::metrics::ObserverResultT null_result; - auto it = observer_results_.find( - const_cast(instrument)); + auto it = observer_results_.find(instrument); if (it == observer_results_.end()) { OTEL_INTERNAL_LOG_ERROR("[MultiObserverResult::ForInstrumentInt64]" diff --git a/sdk/src/metrics/state/observable_registry.cc b/sdk/src/metrics/state/observable_registry.cc index 025e263f25..28741c86ee 100644 --- a/sdk/src/metrics/state/observable_registry.cc +++ b/sdk/src/metrics/state/observable_registry.cc @@ -162,9 +162,9 @@ struct InvokeCallbackVisitor void operator()(const opentelemetry::metrics::ObservableCallbackPtr &callback) { record->observable_result.GetInstruments( - [&](opentelemetry::metrics::ObservableInstrument *instrument) { + [&](const opentelemetry::metrics::ObservableInstrument *instrument) { auto value_type = - static_cast(instrument) + static_cast(instrument) ->GetInstrumentDescriptor() .value_type_; if (value_type == InstrumentValueType::kDouble) @@ -185,7 +185,7 @@ struct InvokeCallbackVisitor template void invoke_single_instrument_callback( const opentelemetry::metrics::ObservableCallbackPtr &callback, - opentelemetry::metrics::ObservableInstrument *instrument) + const opentelemetry::metrics::ObservableInstrument *instrument) { // This is all a bit strangely shaped, but it's in the name of back-compat. // The signature of ObservableCallbackPtr is that it takes a nostd::shared_ptr to From 2c5678b9131bc617148baca324c22d0890127a05 Mon Sep 17 00:00:00 2001 From: Marc Alff Date: Sat, 29 Aug 2026 19:26:46 +0200 Subject: [PATCH 2/2] Format --- sdk/src/metrics/multi_observer_result.cc | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/sdk/src/metrics/multi_observer_result.cc b/sdk/src/metrics/multi_observer_result.cc index 83b8cf77d8..9e414466d6 100644 --- a/sdk/src/metrics/multi_observer_result.cc +++ b/sdk/src/metrics/multi_observer_result.cc @@ -92,8 +92,9 @@ void MultiObserverResult::StoreResults(opentelemetry::common::SystemTimestamp co auto *instrument = el.first; auto &result = el.second; - auto storage = static_cast(instrument) - ->GetMetricStorage(); + auto storage = + static_cast(instrument) + ->GetMetricStorage(); nostd::visit(StoreResultVisitor{storage, collection_ts}, result); } }