proc_net_ip_vs_stats.c 4.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133
  1. // SPDX-License-Identifier: GPL-3.0-or-later
  2. #include "plugin_proc.h"
  3. #define RRD_TYPE_NET_IPVS "ipvs"
  4. #define PLUGIN_PROC_MODULE_NET_IPVS_NAME "/proc/net/ip_vs_stats"
  5. #define CONFIG_SECTION_PLUGIN_PROC_NET_IPVS "plugin:" PLUGIN_PROC_CONFIG_NAME ":" PLUGIN_PROC_MODULE_NET_IPVS_NAME
  6. int do_proc_net_ip_vs_stats(int update_every, usec_t dt) {
  7. (void)dt;
  8. static int do_bandwidth = -1, do_sockets = -1, do_packets = -1;
  9. static procfile *ff = NULL;
  10. if(do_bandwidth == -1) do_bandwidth = config_get_boolean(CONFIG_SECTION_PLUGIN_PROC_NET_IPVS, "IPVS bandwidth", 1);
  11. if(do_sockets == -1) do_sockets = config_get_boolean(CONFIG_SECTION_PLUGIN_PROC_NET_IPVS, "IPVS connections", 1);
  12. if(do_packets == -1) do_packets = config_get_boolean(CONFIG_SECTION_PLUGIN_PROC_NET_IPVS, "IPVS packets", 1);
  13. if(!ff) {
  14. char filename[FILENAME_MAX + 1];
  15. snprintfz(filename, FILENAME_MAX, "%s%s", netdata_configured_host_prefix, "/proc/net/ip_vs_stats");
  16. ff = procfile_open(config_get(CONFIG_SECTION_PLUGIN_PROC_NET_IPVS, "filename to monitor", filename), " \t,:|", PROCFILE_FLAG_DEFAULT);
  17. }
  18. if(!ff) return 1;
  19. ff = procfile_readall(ff);
  20. if(!ff) return 0; // we return 0, so that we will retry to open it next time
  21. // make sure we have 3 lines
  22. if(procfile_lines(ff) < 3) return 1;
  23. // make sure we have 5 words on the 3rd line
  24. if(procfile_linewords(ff, 2) < 5) return 1;
  25. unsigned long long entries, InPackets, OutPackets, InBytes, OutBytes;
  26. entries = strtoull(procfile_lineword(ff, 2, 0), NULL, 16);
  27. InPackets = strtoull(procfile_lineword(ff, 2, 1), NULL, 16);
  28. OutPackets = strtoull(procfile_lineword(ff, 2, 2), NULL, 16);
  29. InBytes = strtoull(procfile_lineword(ff, 2, 3), NULL, 16);
  30. OutBytes = strtoull(procfile_lineword(ff, 2, 4), NULL, 16);
  31. // --------------------------------------------------------------------
  32. if(do_sockets) {
  33. static RRDSET *st = NULL;
  34. if(unlikely(!st)) {
  35. st = rrdset_create_localhost(
  36. RRD_TYPE_NET_IPVS
  37. , "sockets"
  38. , NULL
  39. , RRD_TYPE_NET_IPVS
  40. , NULL
  41. , "IPVS New Connections"
  42. , "connections/s"
  43. , PLUGIN_PROC_NAME
  44. , PLUGIN_PROC_MODULE_NET_IPVS_NAME
  45. , NETDATA_CHART_PRIO_IPVS_SOCKETS
  46. , update_every
  47. , RRDSET_TYPE_LINE
  48. );
  49. rrddim_add(st, "connections", NULL, 1, 1, RRD_ALGORITHM_INCREMENTAL);
  50. }
  51. else rrdset_next(st);
  52. rrddim_set(st, "connections", entries);
  53. rrdset_done(st);
  54. }
  55. // --------------------------------------------------------------------
  56. if(do_packets) {
  57. static RRDSET *st = NULL;
  58. if(unlikely(!st)) {
  59. st = rrdset_create_localhost(
  60. RRD_TYPE_NET_IPVS
  61. , "packets"
  62. , NULL
  63. , RRD_TYPE_NET_IPVS
  64. , NULL
  65. , "IPVS Packets"
  66. , "packets/s"
  67. , PLUGIN_PROC_NAME
  68. , PLUGIN_PROC_MODULE_NET_IPVS_NAME
  69. , NETDATA_CHART_PRIO_IPVS_PACKETS
  70. , update_every
  71. , RRDSET_TYPE_LINE
  72. );
  73. rrddim_add(st, "received", NULL, 1, 1, RRD_ALGORITHM_INCREMENTAL);
  74. rrddim_add(st, "sent", NULL, -1, 1, RRD_ALGORITHM_INCREMENTAL);
  75. }
  76. else rrdset_next(st);
  77. rrddim_set(st, "received", InPackets);
  78. rrddim_set(st, "sent", OutPackets);
  79. rrdset_done(st);
  80. }
  81. // --------------------------------------------------------------------
  82. if(do_bandwidth) {
  83. static RRDSET *st = NULL;
  84. if(unlikely(!st)) {
  85. st = rrdset_create_localhost(
  86. RRD_TYPE_NET_IPVS
  87. , "net"
  88. , NULL
  89. , RRD_TYPE_NET_IPVS
  90. , NULL
  91. , "IPVS Bandwidth"
  92. , "kilobits/s"
  93. , PLUGIN_PROC_NAME
  94. , PLUGIN_PROC_MODULE_NET_IPVS_NAME
  95. , NETDATA_CHART_PRIO_IPVS_NET
  96. , update_every
  97. , RRDSET_TYPE_AREA
  98. );
  99. rrddim_add(st, "received", NULL, 8, BITS_IN_A_KILOBIT, RRD_ALGORITHM_INCREMENTAL);
  100. rrddim_add(st, "sent", NULL, -8, BITS_IN_A_KILOBIT, RRD_ALGORITHM_INCREMENTAL);
  101. }
  102. else rrdset_next(st);
  103. rrddim_set(st, "received", InBytes);
  104. rrddim_set(st, "sent", OutBytes);
  105. rrdset_done(st);
  106. }
  107. return 0;
  108. }