Skip to content

Commit 231ca4a

Browse files
authored
[SDK] Metrics ObservableRegistry Cleanup (#2376)
1 parent e918960 commit 231ca4a

File tree

4 files changed

+18
-0
lines changed

4 files changed

+18
-0
lines changed

sdk/include/opentelemetry/sdk/metrics/async_instruments.h

+1
Original file line numberDiff line numberDiff line change
@@ -25,6 +25,7 @@ class ObservableInstrument : public opentelemetry::metrics::ObservableInstrument
2525
ObservableInstrument(InstrumentDescriptor instrument_descriptor,
2626
std::unique_ptr<AsyncWritableMetricStorage> storage,
2727
std::shared_ptr<ObservableRegistry> observable_registry);
28+
~ObservableInstrument() override;
2829

2930
void AddCallback(opentelemetry::metrics::ObservableCallbackPtr callback,
3031
void *state) noexcept override;

sdk/include/opentelemetry/sdk/metrics/state/observable_registry.h

+2
Original file line numberDiff line numberDiff line change
@@ -35,6 +35,8 @@ class ObservableRegistry
3535
void *state,
3636
opentelemetry::metrics::ObservableInstrument *instrument);
3737

38+
void CleanupCallback(opentelemetry::metrics::ObservableInstrument *instrument);
39+
3840
void Observe(opentelemetry::common::SystemTimestamp collection_ts);
3941

4042
private:

sdk/src/metrics/async_instruments.cc

+5
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,11 @@ ObservableInstrument::ObservableInstrument(InstrumentDescriptor instrument_descr
2121

2222
{}
2323

24+
ObservableInstrument::~ObservableInstrument()
25+
{
26+
observable_registry_->CleanupCallback(this);
27+
}
28+
2429
void ObservableInstrument::AddCallback(opentelemetry::metrics::ObservableCallbackPtr callback,
2530
void *state) noexcept
2631
{

sdk/src/metrics/state/observable_registry.cc

+10
Original file line numberDiff line numberDiff line change
@@ -38,6 +38,16 @@ void ObservableRegistry::RemoveCallback(opentelemetry::metrics::ObservableCallba
3838
callbacks_.erase(new_end, callbacks_.end());
3939
}
4040

41+
void ObservableRegistry::CleanupCallback(opentelemetry::metrics::ObservableInstrument *instrument)
42+
{
43+
std::lock_guard<std::mutex> lock_guard{callbacks_m_};
44+
auto iter = std::remove_if(callbacks_.begin(), callbacks_.end(),
45+
[instrument](const std::unique_ptr<ObservableCallbackRecord> &record) {
46+
return record->instrument == instrument;
47+
});
48+
callbacks_.erase(iter, callbacks_.end());
49+
}
50+
4151
void ObservableRegistry::Observe(opentelemetry::common::SystemTimestamp collection_ts)
4252
{
4353
std::lock_guard<std::mutex> lock_guard{callbacks_m_};

0 commit comments

Comments
 (0)