void BasicQuantileStatMap::getSelectedValues()

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);
      }
    }
  }
}