From 2583ea64cc1c1f9e39d64e8d7b4e6e65dc7b7c97 Mon Sep 17 00:00:00 2001 From: Olivier Roques Date: Tue, 3 Nov 2020 10:43:15 +0000 Subject: [HICN-562] Ignore ghost interfaces in VPP ollectd plugin Sometimes there are interfaces listed by VPP statistics API that cannot be read from. This results in segfaults. This patch makes the VPP collectd plugin ignore them. Signed-off-by: Olivier Roques Change-Id: I3b626b5bf553dc045c9fe46828889c47ea122020 --- telemetry/vpp-collectd/vpp/vpp.c | 25 ++++++++++++++++--------- 1 file changed, 16 insertions(+), 9 deletions(-) diff --git a/telemetry/vpp-collectd/vpp/vpp.c b/telemetry/vpp-collectd/vpp/vpp.c index 36a8da86e..ba838a050 100644 --- a/telemetry/vpp-collectd/vpp/vpp.c +++ b/telemetry/vpp-collectd/vpp/vpp.c @@ -302,9 +302,7 @@ static int vpp_read(void) { for (int k = 0; k < vec_len(res); k++) { if (res[k].type == STAT_DIR_TYPE_NAME_VECTOR) { for (int i = 0; i < vec_len(res[k].name_vector); i++) { - if (res[k].name_vector[i]) { - vec_add1(interfaces, (char *)res[k].name_vector[i]); - } + vec_add1(interfaces, (char *)res[k].name_vector[i]); } break; } @@ -320,13 +318,18 @@ static int vpp_read(void) { case STAT_DIR_TYPE_COUNTER_VECTOR_SIMPLE: for (int k = 0; k < vec_len(res[i].simple_counter_vec); k++) { for (int j = 0; j < vec_len(res[i].simple_counter_vec[k]); j++) { - value_t values[1] = { - (value_t){.derive = res[i].simple_counter_vec[k][j]}}; + if (!interfaces[j]) { + continue; + } if (get_data_set(res[i].name, &data_set)) { continue; } + value_t values[1] = { + (value_t){.derive = res[i].simple_counter_vec[k][j]} + }; + err = submit(interfaces[j], data_set.type, values, 1, ×tamp); if (err) @@ -338,15 +341,19 @@ static int vpp_read(void) { case STAT_DIR_TYPE_COUNTER_VECTOR_COMBINED: for (int k = 0; k < vec_len(res[i].combined_counter_vec); k++) { for (int j = 0; j < vec_len(res[i].combined_counter_vec[k]); j++) { - value_t values[2] = { - (value_t){.derive = res[i].combined_counter_vec[k][j].packets}, - (value_t){.derive = res[i].combined_counter_vec[k][j].bytes}, - }; + if (!interfaces[j]) { + continue; + } if (get_data_set(res[i].name, &data_set)) { continue; } + value_t values[2] = { + (value_t){.derive = res[i].combined_counter_vec[k][j].packets}, + (value_t){.derive = res[i].combined_counter_vec[k][j].bytes}, + }; + err = submit(interfaces[j], data_set.type, values, 2, ×tamp); if (err) -- cgit 1.2.3-korg