// Copyright (c) 2013, Facebook, Inc. All rights reserved. // This source code is licensed under both the GPLv2 (found in the // COPYING file in the root directory) and Apache 2.0 License // (found in the LICENSE.Apache file in the root directory). // // Copyright (c) 2011 The LevelDB Authors. All rights reserved. // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. See the AUTHORS file for names of contributors. #pragma once #include "monitoring/histogram.h" #include "rocksdb/env.h" namespace rocksdb { class HistogramWindowingImpl : public Histogram { public: HistogramWindowingImpl(); HistogramWindowingImpl(uint64_t num_windows, uint64_t micros_per_window, uint64_t min_num_per_window); HistogramWindowingImpl(const HistogramImpl&) = delete; HistogramWindowingImpl& operator=(const HistogramImpl&) = delete; ~HistogramWindowingImpl(); virtual void Clear() override; virtual bool Empty() const override; virtual void Add(uint64_t value) override; virtual void Merge(const Histogram& other) override; void Merge(const HistogramWindowingImpl& other); virtual std::string ToString() const override; virtual const char* Name() const override { return "HistogramWindowingImpl"; } virtual uint64_t min() const override { return stats_.min(); } virtual uint64_t max() const override { return stats_.max(); } virtual uint64_t num() const override { return stats_.num(); } virtual double Median() const override; virtual double Percentile(double p) const override; virtual double Average() const override; virtual double StandardDeviation() const override; virtual void Data(HistogramData* const data) const override; private: void TimerTick(); void SwapHistoryBucket(); inline uint64_t current_window() const { return current_window_.load(std::memory_order_relaxed); } inline uint64_t last_swap_time() const{ return last_swap_time_.load(std::memory_order_relaxed); } Env* env_; std::mutex mutex_; // Aggregated stats over windows_stats_, all the computation is done // upon aggregated values HistogramStat stats_; // This is a circular array representing the latest N time-windows. // Each entry stores a time-window of data. Expiration is done // on window-based. std::unique_ptr window_stats_; std::atomic_uint_fast64_t current_window_; std::atomic_uint_fast64_t last_swap_time_; // Following parameters are configuable uint64_t num_windows_ = 5; uint64_t micros_per_window_ = 60000000; // By default, don't care about the number of values in current window // when decide whether to swap windows or not. uint64_t min_num_per_window_ = 0; }; } // namespace rocksdb