proc_net_stat_synproxy.c 7.0 KB

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