]> arthur.barton.de Git - netdata.git/blob - src/proc_net_stat_synproxy.c
c3ac00b5d7037d7938f8a1caab099113127bd4b9
[netdata.git] / src / proc_net_stat_synproxy.c
1 #include "common.h"
2
3 #define RRD_TYPE_NET_STAT_NETFILTER         "netfilter"
4 #define RRD_TYPE_NET_STAT_SYNPROXY          "synproxy"
5
6 int do_proc_net_stat_synproxy(int update_every, usec_t dt) {
7     (void)dt;
8
9     static int do_entries = -1, do_cookies = -1, do_syns = -1, do_reopened = -1;
10     static procfile *ff = NULL;
11
12     if(unlikely(do_entries == -1)) {
13         do_entries  = config_get_boolean_ondemand("plugin:proc:/proc/net/stat/synproxy", "SYNPROXY entries", CONFIG_ONDEMAND_ONDEMAND);
14         do_cookies  = config_get_boolean_ondemand("plugin:proc:/proc/net/stat/synproxy", "SYNPROXY cookies", CONFIG_ONDEMAND_ONDEMAND);
15         do_syns     = config_get_boolean_ondemand("plugin:proc:/proc/net/stat/synproxy", "SYNPROXY SYN received", CONFIG_ONDEMAND_ONDEMAND);
16         do_reopened = config_get_boolean_ondemand("plugin:proc:/proc/net/stat/synproxy", "SYNPROXY connections reopened", CONFIG_ONDEMAND_ONDEMAND);
17     }
18
19     if(unlikely(!ff)) {
20         char filename[FILENAME_MAX + 1];
21         snprintfz(filename, FILENAME_MAX, "%s%s", global_host_prefix, "/proc/net/stat/synproxy");
22         ff = procfile_open(config_get("plugin:proc:/proc/net/stat/synproxy", "filename to monitor", filename), " \t,:|", PROCFILE_FLAG_DEFAULT);
23         if(unlikely(!ff))
24             return 1;
25     }
26
27     ff = procfile_readall(ff);
28     if(unlikely(!ff))
29         return 0; // we return 0, so that we will retry to open it next time
30
31     // make sure we have 3 lines
32     size_t lines = procfile_lines(ff), l;
33     if(unlikely(lines < 2)) {
34         error("/proc/net/stat/synproxy has %zu lines, expected no less than 2. Disabling it.", lines);
35         return 1;
36     }
37
38     unsigned long long entries = 0, syn_received = 0, cookie_invalid = 0, cookie_valid = 0, cookie_retrans = 0, conn_reopened = 0;
39
40     // synproxy gives its values per CPU
41     for(l = 1; l < lines ;l++) {
42         int words = procfile_linewords(ff, l);
43         if(unlikely(words < 6))
44             continue;
45
46         entries         += strtoull(procfile_lineword(ff, l, 0), NULL, 16);
47         syn_received    += strtoull(procfile_lineword(ff, l, 1), NULL, 16);
48         cookie_invalid  += strtoull(procfile_lineword(ff, l, 2), NULL, 16);
49         cookie_valid    += strtoull(procfile_lineword(ff, l, 3), NULL, 16);
50         cookie_retrans  += strtoull(procfile_lineword(ff, l, 4), NULL, 16);
51         conn_reopened   += strtoull(procfile_lineword(ff, l, 5), NULL, 16);
52     }
53
54     unsigned long long events = entries + syn_received + cookie_invalid + cookie_valid + cookie_retrans + conn_reopened;
55
56     RRDSET *st;
57
58     // --------------------------------------------------------------------
59
60     if((do_entries == CONFIG_ONDEMAND_ONDEMAND && events) || do_entries == CONFIG_ONDEMAND_YES) {
61         do_entries = CONFIG_ONDEMAND_YES;
62
63         st = rrdset_find(RRD_TYPE_NET_STAT_NETFILTER "." RRD_TYPE_NET_STAT_SYNPROXY "_entries");
64         if(unlikely(!st)) {
65             st = rrdset_create(RRD_TYPE_NET_STAT_NETFILTER, RRD_TYPE_NET_STAT_SYNPROXY "_entries", NULL, RRD_TYPE_NET_STAT_SYNPROXY, NULL, "SYNPROXY Entries Used", "entries", 3304, update_every, RRDSET_TYPE_LINE);
66
67             rrddim_add(st, "entries", NULL, 1, 1, RRDDIM_ABSOLUTE);
68         }
69         else rrdset_next(st);
70
71         rrddim_set(st, "entries", entries);
72         rrdset_done(st);
73     }
74
75     // --------------------------------------------------------------------
76
77     if((do_syns == CONFIG_ONDEMAND_ONDEMAND && events) || do_syns == CONFIG_ONDEMAND_YES) {
78         do_syns = CONFIG_ONDEMAND_YES;
79
80         st = rrdset_find(RRD_TYPE_NET_STAT_NETFILTER "." RRD_TYPE_NET_STAT_SYNPROXY "_syn_received");
81         if(unlikely(!st)) {
82             st = rrdset_create(RRD_TYPE_NET_STAT_NETFILTER, RRD_TYPE_NET_STAT_SYNPROXY "_syn_received", NULL, RRD_TYPE_NET_STAT_SYNPROXY, NULL, "SYNPROXY SYN Packets received", "SYN/s", 3301, update_every, RRDSET_TYPE_LINE);
83
84             rrddim_add(st, "received", NULL, 1, 1, RRDDIM_INCREMENTAL);
85         }
86         else rrdset_next(st);
87
88         rrddim_set(st, "received", syn_received);
89         rrdset_done(st);
90     }
91
92     // --------------------------------------------------------------------
93
94     if((do_reopened == CONFIG_ONDEMAND_ONDEMAND && events) || do_reopened == CONFIG_ONDEMAND_YES) {
95         do_reopened = CONFIG_ONDEMAND_YES;
96
97         st = rrdset_find(RRD_TYPE_NET_STAT_NETFILTER "." RRD_TYPE_NET_STAT_SYNPROXY "_conn_reopened");
98         if(unlikely(!st)) {
99             st = rrdset_create(RRD_TYPE_NET_STAT_NETFILTER, RRD_TYPE_NET_STAT_SYNPROXY "_conn_reopened", NULL, RRD_TYPE_NET_STAT_SYNPROXY, NULL, "SYNPROXY Connections Reopened", "connections/s", 3303, update_every, RRDSET_TYPE_LINE);
100
101             rrddim_add(st, "reopened", NULL, 1, 1, RRDDIM_INCREMENTAL);
102         }
103         else rrdset_next(st);
104
105         rrddim_set(st, "reopened", conn_reopened);
106         rrdset_done(st);
107     }
108
109     // --------------------------------------------------------------------
110
111     if((do_cookies == CONFIG_ONDEMAND_ONDEMAND && events) || do_cookies == CONFIG_ONDEMAND_YES) {
112         do_cookies = CONFIG_ONDEMAND_YES;
113
114         st = rrdset_find(RRD_TYPE_NET_STAT_NETFILTER "." RRD_TYPE_NET_STAT_SYNPROXY "_cookies");
115         if(unlikely(!st)) {
116             st = rrdset_create(RRD_TYPE_NET_STAT_NETFILTER, RRD_TYPE_NET_STAT_SYNPROXY "_cookies", NULL, RRD_TYPE_NET_STAT_SYNPROXY, NULL, "SYNPROXY TCP Cookies", "cookies/s", 3302, update_every, RRDSET_TYPE_LINE);
117
118             rrddim_add(st, "valid", NULL, 1, 1, RRDDIM_INCREMENTAL);
119             rrddim_add(st, "invalid", NULL, -1, 1, RRDDIM_INCREMENTAL);
120             rrddim_add(st, "retransmits", NULL, 1, 1, RRDDIM_INCREMENTAL);
121         }
122         else rrdset_next(st);
123
124         rrddim_set(st, "valid", cookie_valid);
125         rrddim_set(st, "invalid", cookie_invalid);
126         rrddim_set(st, "retransmits", cookie_retrans);
127         rrdset_done(st);
128     }
129
130     return 0;
131 }