in fb303/detail/QuantileStatMap-inl.h [103:147]
void BasicQuantileStatMap<ClockT>::getSelectedValues(
std::map<std::string, int64_t>& out,
const std::vector<std::string>& keys) const {
std::map<
stat_type*,
std::vector<std::pair<const std::string*, CounterMapEntry>>>
stats;
{
folly::SharedMutex::ReadHolder g(mutex_);
for (const auto& key : keys) {
auto it = counterMap_.find(key);
if (it != counterMap_.end()) {
stats[it->second.stat.get()].emplace_back(&key, it->second);
}
}
}
auto now = ClockT::now();
for (const auto& [stat, vec] : stats) {
std::vector<double> quantiles;
for (const auto& [_, cme] : vec) {
if (cme.statDef.type == ExportType::PERCENT) {
quantiles.push_back(cme.statDef.quantile);
}
}
auto estimates = stat->getEstimates(quantiles, now);
auto timeSinceCreation = std::chrono::duration_cast<std::chrono::seconds>(
now - stat->creationTime());
for (const auto& [pkey, cme] : vec) {
if (cme.slidingWindowLength) {
for (const auto& slidingWindow : estimates.slidingWindows) {
auto slidingWindowLength = slidingWindow.slidingWindowLength();
if (slidingWindowLength == *cme.slidingWindowLength) {
auto duration = std::min(slidingWindowLength, timeSinceCreation);
out[*pkey] =
extractValue(cme.statDef, slidingWindow.estimate, duration);
break;
}
}
} else {
out[*pkey] = extractValue(
cme.statDef, estimates.allTimeEstimate, timeSinceCreation);
}
}
}
}