in spectator/registry.h [31:54]
std::shared_ptr<M> get_or_create(IdPtr id, Args&&... args) {
auto new_meter =
std::make_shared<M>(std::move(id), std::forward<Args>(args)...);
absl::MutexLock lock(&mutex_);
auto it = meters_.find(new_meter->MeterId());
if (it != meters_.end()) {
// already exists, we need to ensure the existing type
// matches the new meter type, otherwise we need to notify the user
// of the error
auto& old_meter = it->second;
if (old_meter->GetType() != new_meter->GetType()) {
detail::log_type_error(old_meter->GetType(), new_meter->GetType(),
*new_meter->MeterId());
// this is not registered therefore no measurements
// will be reported
return new_meter;
} else {
return std::static_pointer_cast<M>(old_meter);
}
}
meters_.emplace(new_meter->MeterId(), new_meter);
return new_meter;
}