/* * Copyright 2018-present Facebook, Inc. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ #pragma once #include #include namespace folly { struct QuantileEstimates { public: double sum; double count; // vector of {quantile, value} std::vector> quantiles; }; /* * A QuantileEstimator that buffers writes for 1 second. */ template class SimpleQuantileEstimator { public: using TimePoint = typename ClockT::time_point; SimpleQuantileEstimator(); QuantileEstimates estimateQuantiles( Range quantiles, TimePoint now = ClockT::now()); void addValue(double value, TimePoint now = ClockT::now()); /// Flush buffered values void flush() { bufferedDigest_.flush(); } private: detail::BufferedDigest bufferedDigest_; }; /* * A QuantileEstimator that keeps values for nWindows * windowDuration (see * constructor). Values are buffered for windowDuration. */ template class SlidingWindowQuantileEstimator { public: using TimePoint = typename ClockT::time_point; SlidingWindowQuantileEstimator( std::chrono::seconds windowDuration, size_t nWindows = 60); QuantileEstimates estimateQuantiles( Range quantiles, TimePoint now = ClockT::now()); void addValue(double value, TimePoint now = ClockT::now()); /// Flush buffered values void flush() { bufferedSlidingWindow_.flush(); } private: detail::BufferedSlidingWindow bufferedSlidingWindow_; }; extern template class SimpleQuantileEstimator; extern template class SlidingWindowQuantileEstimator; } // namespace folly