mirror of
https://github.com/pavel-odintsov/fastnetmon
synced 2024-11-23 05:02:10 +01:00
Switched to new per protocol total counters
This commit is contained in:
parent
c90dda2536
commit
d1934e0165
@ -359,8 +359,13 @@ log4cpp::Category& logger = log4cpp::Category::getRoot();
|
|||||||
|
|
||||||
/* Configuration block ends */
|
/* Configuration block ends */
|
||||||
|
|
||||||
// We count total number of incoming/outgoing/internal and other traffic type packets/bytes
|
// Total IPv4 + IPv6 traffic
|
||||||
|
total_speed_counters_t total_counters;
|
||||||
|
|
||||||
|
// Total IPv4 traffic
|
||||||
total_speed_counters_t total_counters_ipv4;
|
total_speed_counters_t total_counters_ipv4;
|
||||||
|
|
||||||
|
// Total IPv6 traffic
|
||||||
total_speed_counters_t total_counters_ipv6;
|
total_speed_counters_t total_counters_ipv6;
|
||||||
|
|
||||||
std::string total_unparsed_packets_desc = "Total number of packets we failed to parse";
|
std::string total_unparsed_packets_desc = "Total number of packets we failed to parse";
|
||||||
@ -396,7 +401,7 @@ std::string clickhouse_metrics_writes_failed_desc = "Total number of failed Clic
|
|||||||
uint64_t clickhouse_metrics_writes_failed = 0;
|
uint64_t clickhouse_metrics_writes_failed = 0;
|
||||||
|
|
||||||
// Network counters for IPv6
|
// Network counters for IPv6
|
||||||
abstract_subnet_counters_t<subnet_ipv6_cidr_mask_t, subnet_counter_t> ipv6_subnet_counters;
|
abstract_subnet_counters_t<subnet_ipv6_cidr_mask_t, subnet_counter_t> ipv6_network_counters;
|
||||||
|
|
||||||
// Host counters for IPv6
|
// Host counters for IPv6
|
||||||
abstract_subnet_counters_t<subnet_ipv6_cidr_mask_t, subnet_counter_t> ipv6_host_counters;
|
abstract_subnet_counters_t<subnet_ipv6_cidr_mask_t, subnet_counter_t> ipv6_host_counters;
|
||||||
|
@ -96,7 +96,7 @@ extern std::chrono::steady_clock::time_point last_call_of_traffic_recalculation;
|
|||||||
extern std::string cli_stats_ipv6_file_path;
|
extern std::string cli_stats_ipv6_file_path;
|
||||||
extern unsigned int check_for_availible_for_processing_packets_buckets;
|
extern unsigned int check_for_availible_for_processing_packets_buckets;
|
||||||
extern abstract_subnet_counters_t<subnet_ipv6_cidr_mask_t, subnet_counter_t> ipv6_host_counters;
|
extern abstract_subnet_counters_t<subnet_ipv6_cidr_mask_t, subnet_counter_t> ipv6_host_counters;
|
||||||
extern abstract_subnet_counters_t<subnet_ipv6_cidr_mask_t, subnet_counter_t> ipv6_subnet_counters;
|
extern abstract_subnet_counters_t<subnet_ipv6_cidr_mask_t, subnet_counter_t> ipv6_network_counters;
|
||||||
extern bool process_incoming_traffic;
|
extern bool process_incoming_traffic;
|
||||||
extern bool process_outgoing_traffic;
|
extern bool process_outgoing_traffic;
|
||||||
extern uint64_t total_unparsed_packets;
|
extern uint64_t total_unparsed_packets;
|
||||||
@ -113,6 +113,7 @@ extern uint64_t incoming_total_flows_speed;
|
|||||||
extern uint64_t outgoing_total_flows_speed;
|
extern uint64_t outgoing_total_flows_speed;
|
||||||
extern total_speed_counters_t total_counters_ipv4;
|
extern total_speed_counters_t total_counters_ipv4;
|
||||||
extern total_speed_counters_t total_counters_ipv6;
|
extern total_speed_counters_t total_counters_ipv6;
|
||||||
|
extern total_speed_counters_t total_counters;
|
||||||
extern host_group_ban_settings_map_t host_group_ban_settings_map;
|
extern host_group_ban_settings_map_t host_group_ban_settings_map;
|
||||||
extern bool exabgp_announce_whole_subnet;
|
extern bool exabgp_announce_whole_subnet;
|
||||||
extern subnet_to_host_group_map_t subnet_to_host_groups;
|
extern subnet_to_host_group_map_t subnet_to_host_groups;
|
||||||
@ -1939,7 +1940,7 @@ void recalculate_speed() {
|
|||||||
});
|
});
|
||||||
|
|
||||||
// Calculate IPv6 per network traffic
|
// Calculate IPv6 per network traffic
|
||||||
ipv6_subnet_counters.recalculate_speed(speed_calc_period, (double)average_calculation_amount, nullptr);
|
ipv6_network_counters.recalculate_speed(speed_calc_period, (double)average_calculation_amount, nullptr);
|
||||||
|
|
||||||
// Recalculate traffic for hosts
|
// Recalculate traffic for hosts
|
||||||
ipv6_host_counters.recalculate_speed(speed_calc_period, (double)average_calculation_amount, speed_calculation_callback_local_ipv6);
|
ipv6_host_counters.recalculate_speed(speed_calc_period, (double)average_calculation_amount, speed_calculation_callback_local_ipv6);
|
||||||
@ -1956,54 +1957,13 @@ void recalculate_speed() {
|
|||||||
total_unparsed_packets = 0;
|
total_unparsed_packets = 0;
|
||||||
|
|
||||||
// Calculate IPv4 total traffic speed
|
// Calculate IPv4 total traffic speed
|
||||||
for (unsigned int index = 0; index < 4; index++) {
|
total_counters_ipv4.calculate_speed(speed_calc_period, (double)average_calculation_amount);
|
||||||
total_counters_ipv4.total_speed_counters[index].total.bytes =
|
|
||||||
uint64_t((double)total_counters_ipv4.total_counters[index].total.bytes / (double)speed_calc_period);
|
|
||||||
|
|
||||||
total_counters_ipv4.total_speed_counters[index].total.packets =
|
|
||||||
uint64_t((double)total_counters_ipv4.total_counters[index].total.packets / (double)speed_calc_period);
|
|
||||||
|
|
||||||
double exp_power = -speed_calc_period / average_calculation_amount;
|
|
||||||
double exp_value = exp(exp_power);
|
|
||||||
|
|
||||||
total_counters_ipv4.total_speed_average_counters[index].total.bytes =
|
|
||||||
uint64_t(total_counters_ipv4.total_speed_counters[index].total.bytes +
|
|
||||||
exp_value * ((double)total_counters_ipv4.total_speed_average_counters[index].total.bytes -
|
|
||||||
(double)total_counters_ipv4.total_speed_counters[index].total.bytes));
|
|
||||||
|
|
||||||
total_counters_ipv4.total_speed_average_counters[index].total.packets =
|
|
||||||
uint64_t(total_counters_ipv4.total_speed_counters[index].total.packets +
|
|
||||||
exp_value * ((double)total_counters_ipv4.total_speed_average_counters[index].total.packets -
|
|
||||||
(double)total_counters_ipv4.total_speed_counters[index].total.packets));
|
|
||||||
|
|
||||||
// nullify data counters after speed calculation
|
|
||||||
total_counters_ipv4.total_counters[index].total.bytes = 0;
|
|
||||||
total_counters_ipv4.total_counters[index].total.packets = 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
// Do same for IPv6
|
// Do same for IPv6
|
||||||
for (unsigned int index = 0; index < 4; index++) {
|
total_counters_ipv6.calculate_speed(speed_calc_period, (double)average_calculation_amount);
|
||||||
total_counters_ipv6.total_speed_counters[index].total.bytes =
|
|
||||||
uint64_t((double)total_counters_ipv6.total_counters[index].total.bytes / (double)speed_calc_period);
|
|
||||||
total_counters_ipv6.total_speed_counters[index].total.packets =
|
|
||||||
uint64_t((double)total_counters_ipv6.total_counters[index].total.packets / (double)speed_calc_period);
|
|
||||||
|
|
||||||
double exp_power = -speed_calc_period / average_calculation_amount;
|
// Calculate total IPv4 + IPv6 traffic
|
||||||
double exp_value = exp(exp_power);
|
total_counters.calculate_speed(speed_calc_period, (double)average_calculation_amount);
|
||||||
|
|
||||||
total_counters_ipv6.total_speed_average_counters[index].total.bytes =
|
|
||||||
uint64_t(total_counters_ipv6.total_speed_counters[index].total.bytes +
|
|
||||||
exp_value * ((double)total_counters_ipv6.total_speed_average_counters[index].total.bytes -
|
|
||||||
(double)total_counters_ipv6.total_speed_counters[index].total.bytes));
|
|
||||||
|
|
||||||
total_counters_ipv6.total_speed_average_counters[index].total.packets =
|
|
||||||
uint64_t(total_counters_ipv6.total_speed_counters[index].total.packets +
|
|
||||||
exp_value * ((double)total_counters_ipv6.total_speed_average_counters[index].total.packets -
|
|
||||||
(double)total_counters_ipv6.total_speed_counters[index].total.packets));
|
|
||||||
|
|
||||||
// nullify data counters after speed calculation
|
|
||||||
total_counters_ipv6.total_counters[index].zeroify();
|
|
||||||
}
|
|
||||||
|
|
||||||
// Set time of previous startup
|
// Set time of previous startup
|
||||||
last_call_of_traffic_recalculation = std::chrono::steady_clock::now();
|
last_call_of_traffic_recalculation = std::chrono::steady_clock::now();
|
||||||
@ -2335,10 +2295,10 @@ void process_ipv6_packet(simple_packet_t& current_packet) {
|
|||||||
#endif
|
#endif
|
||||||
|
|
||||||
{
|
{
|
||||||
std::lock_guard<std::mutex> lock_guard(ipv6_subnet_counters.counter_map_mutex);
|
std::lock_guard<std::mutex> lock_guard(ipv6_network_counters.counter_map_mutex);
|
||||||
|
|
||||||
// We will create keys for new subnet here on demand
|
// We will create keys for new subnet here on demand
|
||||||
subnet_counter_t* counter_ptr = &ipv6_subnet_counters.counter_map[ipv6_cidr_subnet];
|
subnet_counter_t* counter_ptr = &ipv6_network_counters.counter_map[ipv6_cidr_subnet];
|
||||||
|
|
||||||
if (current_packet.packet_direction == OUTGOING) {
|
if (current_packet.packet_direction == OUTGOING) {
|
||||||
counter_ptr->total.out_packets += sampled_number_of_packets;
|
counter_ptr->total.out_packets += sampled_number_of_packets;
|
||||||
|
@ -317,21 +317,148 @@ class total_counter_element_t {
|
|||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
// Set of structures for calculating total traffic counters
|
// Set of structures for calculating total traffic counters
|
||||||
class total_speed_counters_t {
|
class total_speed_counters_t {
|
||||||
public:
|
public:
|
||||||
total_counter_element_t total_counters[4];
|
total_counter_element_t total_counters[4];
|
||||||
total_counter_element_t total_speed_counters[4];
|
|
||||||
total_counter_element_t total_speed_average_counters[4];
|
total_counter_element_t total_speed_average_counters[4];
|
||||||
|
|
||||||
|
// Calculates speed
|
||||||
|
void calculate_speed(double speed_calc_period, double average_calculation_time) {
|
||||||
|
for (unsigned int index = 0; index < 4; index++) {
|
||||||
|
total_counter_element_t total_speed_counters;
|
||||||
|
|
||||||
|
// Calculate instant speed
|
||||||
|
total_speed_counters.total.bytes = uint64_t((double)total_counters[index].total.bytes / (double)speed_calc_period);
|
||||||
|
|
||||||
|
total_speed_counters.total.packets = uint64_t((double)total_counters[index].total.packets / (double)speed_calc_period);
|
||||||
|
|
||||||
|
|
||||||
|
// tcp
|
||||||
|
total_speed_counters.tcp.bytes = uint64_t((double)total_counters[index].tcp.bytes / (double)speed_calc_period);
|
||||||
|
|
||||||
|
total_speed_counters.tcp.packets = uint64_t((double)total_counters[index].tcp.packets / (double)speed_calc_period);
|
||||||
|
|
||||||
|
// udp
|
||||||
|
|
||||||
|
total_speed_counters.udp.bytes = uint64_t((double)total_counters[index].udp.bytes / (double)speed_calc_period);
|
||||||
|
|
||||||
|
total_speed_counters.udp.packets = uint64_t((double)total_counters[index].udp.packets / (double)speed_calc_period);
|
||||||
|
|
||||||
|
// icmp
|
||||||
|
total_speed_counters.icmp.bytes = uint64_t((double)total_counters[index].icmp.bytes / (double)speed_calc_period);
|
||||||
|
|
||||||
|
total_speed_counters.icmp.packets = uint64_t((double)total_counters[index].icmp.packets / (double)speed_calc_period);
|
||||||
|
|
||||||
|
// fragmented
|
||||||
|
total_speed_counters.fragmented.bytes =
|
||||||
|
uint64_t((double)total_counters[index].fragmented.bytes / (double)speed_calc_period);
|
||||||
|
|
||||||
|
total_speed_counters.fragmented.packets =
|
||||||
|
uint64_t((double)total_counters[index].fragmented.packets / (double)speed_calc_period);
|
||||||
|
|
||||||
|
|
||||||
|
// tcp_syn
|
||||||
|
total_speed_counters.tcp_syn.bytes = uint64_t((double)total_counters[index].tcp_syn.bytes / (double)speed_calc_period);
|
||||||
|
|
||||||
|
total_speed_counters.tcp_syn.packets =
|
||||||
|
uint64_t((double)total_counters[index].tcp_syn.packets / (double)speed_calc_period);
|
||||||
|
|
||||||
|
// dropped
|
||||||
|
total_speed_counters.dropped.bytes = uint64_t((double)total_counters[index].dropped.bytes / (double)speed_calc_period);
|
||||||
|
|
||||||
|
total_speed_counters.dropped.packets =
|
||||||
|
uint64_t((double)total_counters[index].dropped.packets / (double)speed_calc_period);
|
||||||
|
|
||||||
|
// Calculate average speed
|
||||||
|
double exp_power = -speed_calc_period / average_calculation_time;
|
||||||
|
double exp_value = exp(exp_power);
|
||||||
|
|
||||||
|
// Total
|
||||||
|
total_speed_average_counters[index].total.bytes = uint64_t(
|
||||||
|
total_speed_counters.total.bytes + exp_value * ((double)total_speed_average_counters[index].total.bytes -
|
||||||
|
(double)total_speed_counters.total.bytes));
|
||||||
|
|
||||||
|
total_speed_average_counters[index].total.packets = uint64_t(
|
||||||
|
total_speed_counters.total.packets + exp_value * ((double)total_speed_average_counters[index].total.packets -
|
||||||
|
(double)total_speed_counters.total.packets));
|
||||||
|
|
||||||
|
// tcp
|
||||||
|
total_speed_average_counters[index].tcp.bytes =
|
||||||
|
uint64_t(total_speed_counters.tcp.bytes + exp_value * ((double)total_speed_average_counters[index].tcp.bytes -
|
||||||
|
(double)total_speed_counters.tcp.bytes));
|
||||||
|
|
||||||
|
total_speed_average_counters[index].tcp.packets =
|
||||||
|
uint64_t(total_speed_counters.tcp.packets + exp_value * ((double)total_speed_average_counters[index].tcp.packets -
|
||||||
|
(double)total_speed_counters.tcp.packets));
|
||||||
|
|
||||||
|
|
||||||
|
// udp
|
||||||
|
total_speed_average_counters[index].udp.bytes =
|
||||||
|
uint64_t(total_speed_counters.udp.bytes + exp_value * ((double)total_speed_average_counters[index].udp.bytes -
|
||||||
|
(double)total_speed_counters.udp.bytes));
|
||||||
|
|
||||||
|
total_speed_average_counters[index].udp.packets =
|
||||||
|
uint64_t(total_speed_counters.udp.packets + exp_value * ((double)total_speed_average_counters[index].udp.packets -
|
||||||
|
(double)total_speed_counters.udp.packets));
|
||||||
|
|
||||||
|
|
||||||
|
// icmp
|
||||||
|
total_speed_average_counters[index].icmp.bytes =
|
||||||
|
uint64_t(total_speed_counters.icmp.bytes + exp_value * ((double)total_speed_average_counters[index].icmp.bytes -
|
||||||
|
(double)total_speed_counters.icmp.bytes));
|
||||||
|
|
||||||
|
total_speed_average_counters[index].icmp.packets = uint64_t(
|
||||||
|
total_speed_counters.icmp.packets + exp_value * ((double)total_speed_average_counters[index].icmp.packets -
|
||||||
|
(double)total_speed_counters.icmp.packets));
|
||||||
|
|
||||||
|
|
||||||
|
// fragmented
|
||||||
|
total_speed_average_counters[index].fragmented.bytes =
|
||||||
|
uint64_t(total_speed_counters.fragmented.bytes +
|
||||||
|
exp_value * ((double)total_speed_average_counters[index].fragmented.bytes -
|
||||||
|
(double)total_speed_counters.fragmented.bytes));
|
||||||
|
|
||||||
|
total_speed_average_counters[index].fragmented.packets =
|
||||||
|
uint64_t(total_speed_counters.fragmented.packets +
|
||||||
|
exp_value * ((double)total_speed_average_counters[index].fragmented.packets -
|
||||||
|
(double)total_speed_counters.fragmented.packets));
|
||||||
|
|
||||||
|
|
||||||
|
// tcp_syn
|
||||||
|
total_speed_average_counters[index].tcp_syn.bytes = uint64_t(
|
||||||
|
total_speed_counters.tcp_syn.bytes + exp_value * ((double)total_speed_average_counters[index].tcp_syn.bytes -
|
||||||
|
(double)total_speed_counters.tcp_syn.bytes));
|
||||||
|
|
||||||
|
total_speed_average_counters[index].tcp_syn.packets = uint64_t(
|
||||||
|
total_speed_counters.tcp_syn.packets + exp_value * ((double)total_speed_average_counters[index].tcp_syn.packets -
|
||||||
|
(double)total_speed_counters.tcp_syn.packets));
|
||||||
|
|
||||||
|
|
||||||
|
// dropped
|
||||||
|
total_speed_average_counters[index].dropped.bytes = uint64_t(
|
||||||
|
total_speed_counters.dropped.bytes + exp_value * ((double)total_speed_average_counters[index].dropped.bytes -
|
||||||
|
(double)total_speed_counters.dropped.bytes));
|
||||||
|
|
||||||
|
total_speed_average_counters[index].dropped.packets = uint64_t(
|
||||||
|
total_speed_counters.dropped.packets + exp_value * ((double)total_speed_average_counters[index].dropped.packets -
|
||||||
|
(double)total_speed_counters.dropped.packets));
|
||||||
|
|
||||||
|
|
||||||
|
// nullify data counters after speed calculation
|
||||||
|
total_counters[index].zeroify();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
template <class Archive> void serialize(Archive& ar, [[maybe_unused]] const unsigned int version) {
|
template <class Archive> void serialize(Archive& ar, [[maybe_unused]] const unsigned int version) {
|
||||||
ar& BOOST_SERIALIZATION_NVP(total_counters);
|
ar& BOOST_SERIALIZATION_NVP(total_counters);
|
||||||
ar& BOOST_SERIALIZATION_NVP(total_speed_counters);
|
|
||||||
ar& BOOST_SERIALIZATION_NVP(total_speed_average_counters);
|
ar& BOOST_SERIALIZATION_NVP(total_speed_average_counters);
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
// struct for save per direction and per protocol details for flow
|
// struct for save per direction and per protocol details for flow
|
||||||
class conntrack_key_struct_t {
|
class conntrack_key_struct_t {
|
||||||
public:
|
public:
|
||||||
|
Loading…
Reference in New Issue
Block a user