#pragma once #include "bsc/model/Connection.hpp" #include #include #include #include #include namespace bsc::stats { struct Event { std::string time; bsc::model::Connection connection; std::string rule_name; std::int64_t unixnano{0}; }; class Statistics { public: explicit Statistics(std::size_t max_events = 250); void record(const bsc::model::Connection& conn, const std::string& action, const std::string& rule_name); void note_dns_response(); [[nodiscard]] std::uint64_t connections() const; [[nodiscard]] std::uint64_t accepted() const; [[nodiscard]] std::uint64_t dropped() const; [[nodiscard]] std::uint64_t ignored() const; [[nodiscard]] std::uint64_t rules() const; [[nodiscard]] std::uint64_t dns_responses() const; [[nodiscard]] std::uint64_t rule_hits() const; [[nodiscard]] std::uint64_t rule_misses() const; [[nodiscard]] std::map by_proto() const; [[nodiscard]] std::map by_address() const; [[nodiscard]] std::map by_host() const; [[nodiscard]] std::map by_port() const; [[nodiscard]] std::map by_uid() const; [[nodiscard]] std::map by_executable() const; [[nodiscard]] std::deque events() const; private: mutable std::mutex mutex_; std::size_t max_events_; std::uint64_t rules_{0}; std::uint64_t connections_{0}; std::uint64_t ignored_{0}; std::uint64_t accepted_{0}; std::uint64_t dropped_{0}; std::uint64_t dns_responses_{0}; std::uint64_t rule_hits_{0}; std::uint64_t rule_misses_{0}; std::map by_proto_; std::map by_address_; std::map by_host_; std::map by_port_; std::map by_uid_; std::map by_executable_; std::deque events_; }; } // namespace bsc::stats