Skip to content
API Documentation
BastionGuard™
Statistics.cpp
Go to the documentation of this file.
2#include <chrono>
3#include <ctime>
4#include <iomanip>
5#include <sstream>
6
7namespace bsc::stats {
8namespace {
9std::string now_string() {
10 auto now = std::chrono::system_clock::now();
11 auto t = std::chrono::system_clock::to_time_t(now);
12 std::tm tm{}; gmtime_r(&t, &tm);
13 std::ostringstream oss; oss << std::put_time(&tm, "%FT%TZ");
14 return oss.str();
15}
16}
17
18Statistics::Statistics(std::size_t max_events) : max_events_(max_events) {}
19
20void Statistics::record(const bsc::model::Connection& conn, const std::string& action, const std::string& rule_name) {
21 std::lock_guard lock(mutex_);
23 ++by_proto_[conn.protocol];
24 ++by_address_[conn.dst_ip];
25 if (!conn.dst_host.empty()) ++by_host_[conn.dst_host];
26 ++by_port_[std::to_string(conn.dst_port)];
27 ++by_uid_[std::to_string(conn.user_id)];
28 if (!conn.process_path.empty()) ++by_executable_[conn.process_path];
29 if (action == "allow") ++accepted_;
30 else if (action == "deny") ++dropped_;
31 else ++ignored_;
32 if (!rule_name.empty()) { ++rules_; ++rule_hits_; }
33 else ++rule_misses_;
34 auto now = std::chrono::system_clock::now();
35 events_.push_front(Event{now_string(), conn, rule_name, std::chrono::duration_cast<std::chrono::nanoseconds>(now.time_since_epoch()).count()});
36 while (events_.size() > max_events_) events_.pop_back();
37}
38
39std::uint64_t Statistics::connections() const { std::lock_guard lock(mutex_); return connections_; }
40std::uint64_t Statistics::accepted() const { std::lock_guard lock(mutex_); return accepted_; }
41std::uint64_t Statistics::dropped() const { std::lock_guard lock(mutex_); return dropped_; }
42std::uint64_t Statistics::ignored() const { std::lock_guard lock(mutex_); return ignored_; }
43std::uint64_t Statistics::rules() const { std::lock_guard lock(mutex_); return rules_; }
44void Statistics::note_dns_response() { std::lock_guard lock(mutex_); ++dns_responses_; }
45std::uint64_t Statistics::dns_responses() const { std::lock_guard lock(mutex_); return dns_responses_; }
46std::uint64_t Statistics::rule_hits() const { std::lock_guard lock(mutex_); return rule_hits_; }
47std::uint64_t Statistics::rule_misses() const { std::lock_guard lock(mutex_); return rule_misses_; }
48std::map<std::string, std::uint64_t> Statistics::by_proto() const { std::lock_guard lock(mutex_); return by_proto_; }
49std::map<std::string, std::uint64_t> Statistics::by_address() const { std::lock_guard lock(mutex_); return by_address_; }
50std::map<std::string, std::uint64_t> Statistics::by_host() const { std::lock_guard lock(mutex_); return by_host_; }
51std::map<std::string, std::uint64_t> Statistics::by_port() const { std::lock_guard lock(mutex_); return by_port_; }
52std::map<std::string, std::uint64_t> Statistics::by_uid() const { std::lock_guard lock(mutex_); return by_uid_; }
53std::map<std::string, std::uint64_t> Statistics::by_executable() const { std::lock_guard lock(mutex_); return by_executable_; }
54std::deque<Event> Statistics::events() const { std::lock_guard lock(mutex_); return events_; }
55
56} // namespace bsc::stats
std::map< std::string, std::uint64_t > by_uid_
std::uint64_t rule_hits_
std::map< std::string, std::uint64_t > by_port() const
std::uint64_t dropped_
std::map< std::string, std::uint64_t > by_executable() const
std::uint64_t connections_
std::deque< Event > events() const
std::uint64_t rule_misses_
std::uint64_t ignored() const
std::map< std::string, std::uint64_t > by_address() const
std::uint64_t rule_misses() const
void record(const bsc::model::Connection &conn, const std::string &action, const std::string &rule_name)
std::map< std::string, std::uint64_t > by_port_
std::map< std::string, std::uint64_t > by_host() const
std::map< std::string, std::uint64_t > by_host_
std::uint64_t accepted_
std::map< std::string, std::uint64_t > by_address_
std::map< std::string, std::uint64_t > by_executable_
std::uint64_t dns_responses() const
Statistics(std::size_t max_events=250)
std::uint64_t dropped() const
std::uint64_t connections() const
std::uint64_t rule_hits() const
std::uint64_t accepted() const
std::uint64_t rules() const
std::map< std::string, std::uint64_t > by_proto() const
std::uint64_t ignored_
std::map< std::string, std::uint64_t > by_proto_
std::deque< Event > events_
std::map< std::string, std::uint64_t > by_uid() const
std::uint64_t dns_responses_
std::uint32_t dst_port
std::uint32_t user_id