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