summaryrefslogtreecommitdiff
path: root/examples/c-collectd/c-collectd.c
diff options
context:
space:
mode:
authorToni Uhlig <matzeton@googlemail.com>2022-10-26 13:45:15 +0200
committerToni Uhlig <matzeton@googlemail.com>2022-10-31 12:45:15 +0100
commitc63cbec26d9ab3aa3004c9969ec67315fecd28b1 (patch)
treee5e9bcd8f898cfd7db133a943e28ffb6d672e87e /examples/c-collectd/c-collectd.c
parent805aef5de8b127e58ceae2e6f5c946dba7af569d (diff)
Improved nDPIsrvd-collectd statistics.
* Improved RRD-Graph generation script and static WWW html files. Signed-off-by: Toni Uhlig <matzeton@googlemail.com>
Diffstat (limited to 'examples/c-collectd/c-collectd.c')
-rw-r--r--examples/c-collectd/c-collectd.c90
1 files changed, 86 insertions, 4 deletions
diff --git a/examples/c-collectd/c-collectd.c b/examples/c-collectd/c-collectd.c
index 60d1830a9..59145ec0a 100644
--- a/examples/c-collectd/c-collectd.c
+++ b/examples/c-collectd/c-collectd.c
@@ -14,6 +14,7 @@
#include "nDPIsrvd.h"
#define DEFAULT_COLLECTD_EXEC_INST "nDPIsrvd"
+#define ERROR_EVENT_ID_MAX 17
//#define GENERATE_TIMESTAMP 1
#define LOG(flags, format, ...) \
@@ -47,6 +48,9 @@ static int quiet = 0;
static struct
{
+ uint64_t json_lines;
+ uint64_t json_bytes;
+
uint64_t flow_new_count;
uint64_t flow_end_count;
uint64_t flow_idle_count;
@@ -57,6 +61,18 @@ static struct
uint64_t flow_detection_update_count;
uint64_t flow_not_detected_count;
+ uint64_t packet_count;
+ uint64_t packet_flow_count;
+
+ uint64_t init_count;
+ uint64_t reconnect_count;
+ uint64_t shutdown_count;
+ uint64_t status_count;
+
+ uint64_t error_count_sum;
+ uint64_t error_count[ERROR_EVENT_ID_MAX];
+ uint64_t error_unknown_count;
+
uint64_t flow_src_total_bytes;
uint64_t flow_dst_total_bytes;
uint64_t flow_risky_count;
@@ -130,6 +146,14 @@ static struct json_stat_map const flow_event_map[] = {{"new", &collectd_statisti
&collectd_statistics.flow_detection_update_count},
{"not-detected", &collectd_statistics.flow_not_detected_count}};
+static struct json_stat_map const packet_event_map[] = {{"packet", &collectd_statistics.packet_count},
+ {"packet-flow", &collectd_statistics.packet_flow_count}};
+
+static struct json_stat_map const daemon_event_map[] = {{"init", &collectd_statistics.init_count},
+ {"reconnect", &collectd_statistics.reconnect_count},
+ {"shutdown", &collectd_statistics.shutdown_count},
+ {"status", &collectd_statistics.status_count}};
+
static struct json_stat_map const breeds_map[] = {{"Safe", &collectd_statistics.flow_breed_safe_count},
{"Acceptable", &collectd_statistics.flow_breed_acceptable_count},
{"Fun", &collectd_statistics.flow_breed_fun_count},
@@ -357,18 +381,32 @@ static void print_collectd_exec_output(void)
printf(COLLECTD_PUTVAL_N_FORMAT() COLLECTD_PUTVAL_N_FORMAT() COLLECTD_PUTVAL_N_FORMAT() COLLECTD_PUTVAL_N_FORMAT()
COLLECTD_PUTVAL_N_FORMAT() COLLECTD_PUTVAL_N_FORMAT() COLLECTD_PUTVAL_N_FORMAT()
- COLLECTD_PUTVAL_N_FORMAT() COLLECTD_PUTVAL_N_FORMAT() COLLECTD_PUTVAL_N_FORMAT(),
+ COLLECTD_PUTVAL_N_FORMAT() COLLECTD_PUTVAL_N_FORMAT() COLLECTD_PUTVAL_N_FORMAT()
+ COLLECTD_PUTVAL_N_FORMAT() COLLECTD_PUTVAL_N_FORMAT() COLLECTD_PUTVAL_N_FORMAT()
+ COLLECTD_PUTVAL_N_FORMAT() COLLECTD_PUTVAL_N_FORMAT() COLLECTD_PUTVAL_N_FORMAT()
+ COLLECTD_PUTVAL_N_FORMAT() COLLECTD_PUTVAL_N_FORMAT() COLLECTD_PUTVAL_N_FORMAT()
+ COLLECTD_PUTVAL_N_FORMAT(),
+ COLLECTD_PUTVAL_N(json_lines),
+ COLLECTD_PUTVAL_N(json_bytes),
COLLECTD_PUTVAL_N(flow_new_count),
COLLECTD_PUTVAL_N(flow_end_count),
COLLECTD_PUTVAL_N(flow_idle_count),
+ COLLECTD_PUTVAL_N(flow_update_count),
+ COLLECTD_PUTVAL_N(flow_analyse_count),
COLLECTD_PUTVAL_N(flow_guessed_count),
COLLECTD_PUTVAL_N(flow_detected_count),
COLLECTD_PUTVAL_N(flow_detection_update_count),
COLLECTD_PUTVAL_N(flow_not_detected_count),
COLLECTD_PUTVAL_N(flow_src_total_bytes),
COLLECTD_PUTVAL_N(flow_dst_total_bytes),
- COLLECTD_PUTVAL_N(flow_risky_count));
+ COLLECTD_PUTVAL_N(flow_risky_count),
+ COLLECTD_PUTVAL_N(packet_count),
+ COLLECTD_PUTVAL_N(packet_flow_count),
+ COLLECTD_PUTVAL_N(init_count),
+ COLLECTD_PUTVAL_N(reconnect_count),
+ COLLECTD_PUTVAL_N(shutdown_count),
+ COLLECTD_PUTVAL_N(status_count));
printf(COLLECTD_PUTVAL_N_FORMAT() COLLECTD_PUTVAL_N_FORMAT() COLLECTD_PUTVAL_N_FORMAT() COLLECTD_PUTVAL_N_FORMAT()
COLLECTD_PUTVAL_N_FORMAT() COLLECTD_PUTVAL_N_FORMAT() COLLECTD_PUTVAL_N_FORMAT()
@@ -426,7 +464,7 @@ static void print_collectd_exec_output(void)
printf(COLLECTD_PUTVAL_N_FORMAT() COLLECTD_PUTVAL_N_FORMAT() COLLECTD_PUTVAL_N_FORMAT() COLLECTD_PUTVAL_N_FORMAT()
COLLECTD_PUTVAL_N_FORMAT() COLLECTD_PUTVAL_N_FORMAT() COLLECTD_PUTVAL_N_FORMAT()
- COLLECTD_PUTVAL_N_FORMAT(),
+ COLLECTD_PUTVAL_N_FORMAT() COLLECTD_PUTVAL_N_FORMAT() COLLECTD_PUTVAL_N_FORMAT(),
COLLECTD_PUTVAL_N(flow_l3_ip4_count),
COLLECTD_PUTVAL_N(flow_l3_ip6_count),
@@ -435,7 +473,16 @@ static void print_collectd_exec_output(void)
COLLECTD_PUTVAL_N(flow_l4_udp_count),
COLLECTD_PUTVAL_N(flow_l4_icmp_count),
COLLECTD_PUTVAL_N(flow_l4_other_count),
- COLLECTD_PUTVAL_N(flow_risk_unknown_count));
+ COLLECTD_PUTVAL_N(flow_risk_unknown_count),
+ COLLECTD_PUTVAL_N(error_unknown_count),
+ COLLECTD_PUTVAL_N(error_count_sum));
+
+ for (i = 0; i < ERROR_EVENT_ID_MAX; ++i)
+ {
+ char gauge_name[BUFSIZ];
+ snprintf(gauge_name, sizeof(gauge_name), "error_%zu_count", i);
+ printf(COLLECTD_PUTVAL_N_FORMAT(), COLLECTD_PUTVAL_N2(gauge_name, error_count[i]));
+ }
for (i = 0; i < NDPI_MAX_RISK; ++i)
{
@@ -559,6 +606,41 @@ static enum nDPIsrvd_callback_return collectd_json_callback(struct nDPIsrvd_sock
struct nDPIsrvd_json_token const * const flow_event_name = TOKEN_GET_SZ(sock, "flow_event_name");
struct flow_user_data * flow_user_data = NULL;
+ collectd_statistics.json_lines++;
+ collectd_statistics.json_bytes += sock->buffer.json_string_length + NETWORK_BUFFER_LENGTH_DIGITS;
+
+ struct nDPIsrvd_json_token const * const packet_event_name = TOKEN_GET_SZ(sock, "packet_event_name");
+ if (packet_event_name != NULL)
+ {
+ collectd_map_token_to_stat(sock, packet_event_name, packet_event_map, nDPIsrvd_ARRAY_LENGTH(packet_event_map));
+ }
+
+ struct nDPIsrvd_json_token const * const daemon_event_name = TOKEN_GET_SZ(sock, "daemon_event_name");
+ if (daemon_event_name != NULL)
+ {
+ collectd_map_token_to_stat(sock, daemon_event_name, daemon_event_map, nDPIsrvd_ARRAY_LENGTH(daemon_event_map));
+ }
+
+ struct nDPIsrvd_json_token const * const error_event_id = TOKEN_GET_SZ(sock, "error_event_id");
+ if (error_event_id != NULL)
+ {
+ nDPIsrvd_ull error_event_id_ull;
+ if (TOKEN_VALUE_TO_ULL(sock, error_event_id, &error_event_id_ull) != CONVERSION_OK)
+ {
+ return CALLBACK_ERROR;
+ }
+
+ collectd_statistics.error_count_sum++;
+ if (error_event_id_ull < ERROR_EVENT_ID_MAX)
+ {
+ collectd_statistics.error_count[error_event_id_ull]++;
+ }
+ else
+ {
+ collectd_statistics.error_unknown_count++;
+ }
+ }
+
if (flow != NULL)
{
flow_user_data = (struct flow_user_data *)flow->flow_user_data;