#pragma once #include "config.h" #include "libreichwein/archive.h" #include #include #include #include #include class Statistics { static const int32_t binsize = 3600; // in seconds: i.e. 1 hour static const size_t maxSize = 30000000; // maximum of statistics data in bytes public: struct Bin { uint64_t start_time{}; uint64_t requests{}; uint64_t errors{}; uint64_t bytes_in{}; uint64_t bytes_out{}; uint64_t requests_ipv6{}; uint64_t errors_ipv6{}; uint64_t bytes_in_ipv6{}; uint64_t bytes_out_ipv6{}; uint64_t requests_https{}; uint64_t errors_https{}; uint64_t bytes_in_https{}; uint64_t bytes_out_https{}; template void serialize (Archive& ar) { ar & start_time; ar & requests; ar & errors; ar & bytes_in; ar & bytes_out; ar & requests_ipv6; ar & errors_ipv6; ar & bytes_in_ipv6; ar & bytes_out_ipv6; ar & requests_https; ar & errors_https; ar & bytes_in_https; ar & bytes_out_https; } bool expired() const; }; private: bool mChanged{}; std::deque mBins; std::mutex mMutex; std::filesystem::path mPath; void load(); void limit(); public: Statistics(); Statistics(const std::filesystem::path& path); ~Statistics(); void count(size_t bytes_in, size_t bytes_out, bool error, bool ipv6, bool https); void save(); std::string getValues(); }; // Serialization and Deserialization as free functions namespace Reichwein::Serialization { template Reichwein::Serialization::OArchive& operator& (Reichwein::Serialization::OArchive& ar, std::deque& deque) { uint64_t size { deque.size() }; ar & size; for (auto element: deque) { ar & element; } return ar; } template Reichwein::Serialization::IArchive& operator& (Reichwein::Serialization::IArchive& ar, std::deque& deque) { uint64_t size {}; ar & size; deque.clear(); for (size_t i = 0; i < size; i++) { T element; ar & element; deque.push_back(element); } return ar; } } // namespace