@cryptotaxi247 / netdata-1 / commits / d02695ea6

Retry reading carrier, duplex, and speed files periodically (#13850)

* Retry reading carrier file periodically * Fix formatting type * Don't log error messages on every iteration for duplex and speed

Vladimir Kobal committed Oct 21, 2022 at 14:38 UTC d02695ea6915d8d7a4ec7a5dde73f6dd18ae3bc1
1 file changed +56 -18
collectors/proc.plugin/proc_net_dev.c
+56 -18
@@ -7,6 +7,8 @@
7
8 #define STATE_LENGTH_MAX 32
9
10 +#define READ_RETRY_PERIOD 60 // seconds
11 +
12 enum {
13 NETDEV_DUPLEX_UNKNOWN,
14 NETDEV_DUPLEX_HALF,
@@ -55,6 +57,15 @@ static struct netdev {
57 int configured;
58 int enabled;
59 int updated;
60 +
61 + int carrier_file_exists;
62 + time_t carrier_file_lost_time;
63 +
64 + int duplex_file_exists;
65 + time_t duplex_file_lost_time;
66 +
67 + int speed_file_exists;
68 + time_t speed_file_lost_time;
69
70 int do_bandwidth;
71 int do_packets;
@@ -859,21 +870,37 @@ int do_proc_net_dev(int update_every, usec_t dt) {
870 if ((d->do_carrier != CONFIG_BOOLEAN_NO ||
871 d->do_duplex != CONFIG_BOOLEAN_NO ||
872 d->do_speed != CONFIG_BOOLEAN_NO) &&
862 - d->filename_carrier) {
873 + d->filename_carrier &&
874 + (d->carrier_file_exists ||
875 + now_monotonic_sec() - d->carrier_file_lost_time > READ_RETRY_PERIOD)) {
876 if (read_single_number_file(d->filename_carrier, &d->carrier)) {
864 - error("Cannot refresh interface %s carrier state by reading '%s'. Stop updating it.", d->name, d->filename_carrier);
865 - freez(d->filename_carrier);
866 - d->filename_carrier = NULL;
877 + if (d->carrier_file_exists)
878 + error(
879 + "Cannot refresh interface %s carrier state by reading '%s'. Next update is in %d seconds.",
880 + d->name,
881 + d->filename_carrier,
882 + READ_RETRY_PERIOD);
883 + d->carrier_file_exists = 0;
884 + d->carrier_file_lost_time = now_monotonic_sec();
885 + } else {
886 + d->carrier_file_exists = 1;
887 + d->carrier_file_lost_time = 0;
888 }
889 }
890
870 - if (d->do_duplex != CONFIG_BOOLEAN_NO && d->filename_duplex && (d->carrier || !d->filename_carrier)) {
891 + if (d->do_duplex != CONFIG_BOOLEAN_NO &&
892 + d->filename_duplex &&
893 + (d->carrier || d->carrier_file_exists) &&
894 + (d->duplex_file_exists ||
895 + now_monotonic_sec() - d->duplex_file_lost_time > READ_RETRY_PERIOD)) {
896 char buffer[STATE_LENGTH_MAX + 1];
897
898 if (read_file(d->filename_duplex, buffer, STATE_LENGTH_MAX)) {
874 - error("Cannot refresh interface %s duplex state by reading '%s'. I will stop updating it.", d->name, d->filename_duplex);
875 - freez(d->filename_duplex);
876 - d->filename_duplex = NULL;
899 + if (d->duplex_file_exists)
900 + error("Cannot refresh interface %s duplex state by reading '%s'.", d->name, d->filename_duplex);
901 + d->duplex_file_exists = 0;
902 + d->duplex_file_lost_time = now_monotonic_sec();
903 + d->duplex = NETDEV_DUPLEX_UNKNOWN;
904 } else {
905 // values can be unknown, half or full -- just check the first letter for speed
906 if (buffer[0] == 'f')
@@ -882,9 +909,11 @@ int do_proc_net_dev(int update_every, usec_t dt) {
909 d->duplex = NETDEV_DUPLEX_HALF;
910 else
911 d->duplex = NETDEV_DUPLEX_UNKNOWN;
912 + d->duplex_file_exists = 1;
913 + d->duplex_file_lost_time = 0;
914 }
915 } else {
887 - d->duplex = 0;
916 + d->duplex = NETDEV_DUPLEX_UNKNOWN;
917 }
918
919 if(d->do_operstate != CONFIG_BOOLEAN_NO && d->filename_operstate) {
@@ -904,7 +933,8 @@ int do_proc_net_dev(int update_every, usec_t dt) {
933
934 if (d->do_mtu != CONFIG_BOOLEAN_NO && d->filename_mtu) {
935 if (read_single_number_file(d->filename_mtu, &d->mtu)) {
907 - error("Cannot refresh mtu for interface %s by reading '%s'. Stop updating it.", d->name, d->filename_mtu);
936 + error(
937 + "Cannot refresh mtu for interface %s by reading '%s'. Stop updating it.", d->name, d->filename_mtu);
938 freez(d->filename_mtu);
939 d->filename_mtu = NULL;
940 }
@@ -970,25 +1000,29 @@ int do_proc_net_dev(int update_every, usec_t dt) {
1000 d->chart_var_speed =
1001 rrdsetvar_custom_chart_variable_add_and_acquire(d->st_bandwidth, "nic_speed_max");
1002 if(!d->chart_var_speed) {
973 - error("Cannot create interface %s chart variable 'nic_speed_max'. Will not update its speed anymore.", d->name);
1003 + error(
1004 + "Cannot create interface %s chart variable 'nic_speed_max'. Will not update its speed anymore.",
1005 + d->name);
1006 freez(d->filename_speed);
1007 d->filename_speed = NULL;
1008 }
1009 }
1010
979 - if(d->filename_speed && d->chart_var_speed) {
1011 + if (d->filename_speed && d->chart_var_speed) {
1012 int ret = 0;
1013
982 - if (d->carrier || !d->filename_carrier) {
1014 + if ((d->carrier || d->carrier_file_exists) &&
1015 + (d->speed_file_exists || now_monotonic_sec() - d->speed_file_lost_time > READ_RETRY_PERIOD)) {
1016 ret = read_single_number_file(d->filename_speed, (unsigned long long *) &d->speed);
1017 } else {
1018 d->speed = 0;
1019 }
1020
1021 if(ret) {
989 - error("Cannot refresh interface %s speed by reading '%s'. Will not update its speed anymore.", d->name, d->filename_speed);
990 - freez(d->filename_speed);
991 - d->filename_speed = NULL;
1022 + if (d->speed_file_exists)
1023 + error("Cannot refresh interface %s speed by reading '%s'.", d->name, d->filename_speed);
1024 + d->speed_file_exists = 0;
1025 + d->speed_file_lost_time = now_monotonic_sec();
1026 }
1027 else {
1028 if(d->do_speed != CONFIG_BOOLEAN_NO) {
@@ -1020,7 +1054,11 @@ int do_proc_net_dev(int update_every, usec_t dt) {
1054 rrdset_done(d->st_speed);
1055 }
1056
1023 - rrdsetvar_custom_chart_variable_set(d->st_bandwidth, d->chart_var_speed, (NETDATA_DOUBLE) d->speed * KILOBITS_IN_A_MEGABIT);
1057 + rrdsetvar_custom_chart_variable_set(
1058 + d->st_bandwidth, d->chart_var_speed, (NETDATA_DOUBLE)d->speed * KILOBITS_IN_A_MEGABIT);
1059 +
1060 + d->speed_file_exists = 1;
1061 + d->speed_file_lost_time = 0;
1062 }
1063 }
1064 }
@@ -1106,7 +1144,7 @@ int do_proc_net_dev(int update_every, usec_t dt) {
1144
1145 // --------------------------------------------------------------------
1146
1109 - if(d->do_carrier != CONFIG_BOOLEAN_NO && d->filename_carrier) {
1147 + if(d->do_carrier != CONFIG_BOOLEAN_NO && d->carrier_file_exists) {
1148 if(unlikely(!d->st_carrier)) {
1149 d->st_carrier = rrdset_create_localhost(
1150 d->chart_type_net_carrier