]> arthur.barton.de Git - netdata.git/blob - src/proc_net_stat_synproxy.c
Merge pull request #1998 from ktsaou/master
[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_BOOLEAN_AUTO);
14         do_cookies  = config_get_boolean_ondemand("plugin:proc:/proc/net/stat/synproxy", "SYNPROXY cookies", CONFIG_BOOLEAN_AUTO);
15         do_syns     = config_get_boolean_ondemand("plugin:proc:/proc/net/stat/synproxy", "SYNPROXY SYN received", CONFIG_BOOLEAN_AUTO);
16         do_reopened = config_get_boolean_ondemand("plugin:proc:/proc/net/stat/synproxy", "SYNPROXY connections reopened", CONFIG_BOOLEAN_AUTO);
17     }
18
19     if(unlikely(!ff)) {
20         char filename[FILENAME_MAX + 1];
21         snprintfz(filename, FILENAME_MAX, "%s%s", netdata_configured_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         size_t 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_BOOLEAN_AUTO && events) || do_entries == CONFIG_BOOLEAN_YES) {
61         do_entries = CONFIG_BOOLEAN_YES;
62
63         st = rrdset_find_localhost(RRD_TYPE_NET_STAT_NETFILTER "." RRD_TYPE_NET_STAT_SYNPROXY "_entries");
64         if(unlikely(!st)) {
65             st = rrdset_create_localhost(RRD_TYPE_NET_STAT_NETFILTER, RRD_TYPE_NET_STAT_SYNPROXY "_entries", NULL
66                                          , RRD_TYPE_NET_STAT_SYNPROXY, NULL, "SYNPROXY Entries Used", "entries", 3304
67                                          , update_every, RRDSET_TYPE_LINE);
68
69             rrddim_add(st, "entries", NULL, 1, 1, RRD_ALGORITHM_ABSOLUTE);
70         }
71         else rrdset_next(st);
72
73         rrddim_set(st, "entries", entries);
74         rrdset_done(st);
75     }
76
77     // --------------------------------------------------------------------
78
79     if((do_syns == CONFIG_BOOLEAN_AUTO && events) || do_syns == CONFIG_BOOLEAN_YES) {
80         do_syns = CONFIG_BOOLEAN_YES;
81
82         st = rrdset_find_localhost(RRD_TYPE_NET_STAT_NETFILTER "." RRD_TYPE_NET_STAT_SYNPROXY "_syn_received");
83         if(unlikely(!st)) {
84             st = rrdset_create_localhost(RRD_TYPE_NET_STAT_NETFILTER, RRD_TYPE_NET_STAT_SYNPROXY "_syn_received", NULL
85                                          , RRD_TYPE_NET_STAT_SYNPROXY, NULL, "SYNPROXY SYN Packets received", "SYN/s"
86                                          , 3301, update_every, RRDSET_TYPE_LINE);
87
88             rrddim_add(st, "received", NULL, 1, 1, RRD_ALGORITHM_INCREMENTAL);
89         }
90         else rrdset_next(st);
91
92         rrddim_set(st, "received", syn_received);
93         rrdset_done(st);
94     }
95
96     // --------------------------------------------------------------------
97
98     if((do_reopened == CONFIG_BOOLEAN_AUTO && events) || do_reopened == CONFIG_BOOLEAN_YES) {
99         do_reopened = CONFIG_BOOLEAN_YES;
100
101         st = rrdset_find_localhost(RRD_TYPE_NET_STAT_NETFILTER "." RRD_TYPE_NET_STAT_SYNPROXY "_conn_reopened");
102         if(unlikely(!st)) {
103             st = rrdset_create_localhost(RRD_TYPE_NET_STAT_NETFILTER, RRD_TYPE_NET_STAT_SYNPROXY "_conn_reopened", NULL
104                                          , RRD_TYPE_NET_STAT_SYNPROXY, NULL, "SYNPROXY Connections Reopened"
105                                          , "connections/s", 3303, update_every, RRDSET_TYPE_LINE);
106
107             rrddim_add(st, "reopened", NULL, 1, 1, RRD_ALGORITHM_INCREMENTAL);
108         }
109         else rrdset_next(st);
110
111         rrddim_set(st, "reopened", conn_reopened);
112         rrdset_done(st);
113     }
114
115     // --------------------------------------------------------------------
116
117     if((do_cookies == CONFIG_BOOLEAN_AUTO && events) || do_cookies == CONFIG_BOOLEAN_YES) {
118         do_cookies = CONFIG_BOOLEAN_YES;
119
120         st = rrdset_find_localhost(RRD_TYPE_NET_STAT_NETFILTER "." RRD_TYPE_NET_STAT_SYNPROXY "_cookies");
121         if(unlikely(!st)) {
122             st = rrdset_create_localhost(RRD_TYPE_NET_STAT_NETFILTER, RRD_TYPE_NET_STAT_SYNPROXY "_cookies", NULL
123                                          , RRD_TYPE_NET_STAT_SYNPROXY, NULL, "SYNPROXY TCP Cookies", "cookies/s", 3302
124                                          , update_every, RRDSET_TYPE_LINE);
125
126             rrddim_add(st, "valid", NULL, 1, 1, RRD_ALGORITHM_INCREMENTAL);
127             rrddim_add(st, "invalid", NULL, -1, 1, RRD_ALGORITHM_INCREMENTAL);
128             rrddim_add(st, "retransmits", NULL, 1, 1, RRD_ALGORITHM_INCREMENTAL);
129         }
130         else rrdset_next(st);
131
132         rrddim_set(st, "valid", cookie_valid);
133         rrddim_set(st, "invalid", cookie_invalid);
134         rrddim_set(st, "retransmits", cookie_retrans);
135         rrdset_done(st);
136     }
137
138     return 0;
139 }