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