#pragma once #include "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; void load(); void limit(); public: Statistics(); ~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 Serialization { template Serialization::OArchive& operator& (Serialization::OArchive& ar, std::deque& deque) { uint64_t size { deque.size() }; ar & size; for (auto element: deque) { ar & element; } return ar; } template Serialization::IArchive& operator& (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; } }