Skip to content

Commit

Permalink
telemetry: fix mapping of statistics
Browse files Browse the repository at this point in the history
If we have two NIC ports which have a different set of NIC stats we can
end up having two different stats registered with xstats with the same
name. [Since the stats are updated in bulk as a contiguous set, the
second driver re-using the registration of the first is not possible.]

This causes issues with the invalid stat for one driver being found due to
a lookup by name which is unnecessary. Instead of getting stat names
involved do the lookup by ID instead.

Fixes: 1b75608 ("telemetry: add parser for client socket messages")
Cc: stable@dpdk.org

Signed-off-by: Bruce Richardson <bruce.richardson@intel.com>
Acked-by: Kevin Laatz <kevin.laatz@intel.com>
  • Loading branch information
bruce-richardson authored and tmonjalo committed Apr 2, 2019
1 parent f73477e commit c12cefa
Showing 1 changed file with 9 additions and 13 deletions.
22 changes: 9 additions & 13 deletions lib/librte_telemetry/rte_telemetry_parser.c
Original file line number Diff line number Diff line change
Expand Up @@ -256,7 +256,7 @@ rte_telemetry_command_ports_all_stat_values(struct telemetry_impl *telemetry,
int action, json_t *data)
{
int ret, num_metrics, i, p;
struct rte_metric_name *names;
struct rte_metric_value *values;
uint64_t num_port_ids = 0;
uint32_t port_ids[RTE_MAX_ETHPORTS];

Expand All @@ -281,7 +281,7 @@ rte_telemetry_command_ports_all_stat_values(struct telemetry_impl *telemetry,
return -1;
}

num_metrics = rte_metrics_get_names(NULL, 0);
num_metrics = rte_metrics_get_values(0, NULL, 0);
if (num_metrics < 0) {
TELEMETRY_LOG_ERR("Cannot get metrics count");

Expand All @@ -300,8 +300,8 @@ rte_telemetry_command_ports_all_stat_values(struct telemetry_impl *telemetry,
return -1;
}

names = malloc(sizeof(struct rte_metric_name) * num_metrics);
if (names == NULL) {
values = malloc(sizeof(struct rte_metric_value) * num_metrics);
if (values == NULL) {
TELEMETRY_LOG_ERR("Cannot allocate memory");
ret = rte_telemetry_send_error_response(telemetry,
-ENOMEM);
Expand All @@ -310,7 +310,6 @@ rte_telemetry_command_ports_all_stat_values(struct telemetry_impl *telemetry,
return -1;
}

const char *stat_names[num_metrics];
uint32_t stat_ids[num_metrics];

RTE_ETH_FOREACH_DEV(p) {
Expand All @@ -328,16 +327,13 @@ rte_telemetry_command_ports_all_stat_values(struct telemetry_impl *telemetry,
goto fail;
}

ret = rte_metrics_get_names(names, num_metrics);
for (i = 0; i < num_metrics; i++)
stat_names[i] = names[i].name;

ret = rte_telemetry_stat_names_to_ids(telemetry, stat_names, stat_ids,
num_metrics);
ret = rte_metrics_get_values(port_ids[0], values, num_metrics);
if (ret < 0) {
TELEMETRY_LOG_ERR("Could not convert stat names to IDs");
TELEMETRY_LOG_ERR("Could not get stat values");
goto fail;
}
for (i = 0; i < num_metrics; i++)
stat_ids[i] = values[i].key;

ret = rte_telemetry_send_ports_stats_values(stat_ids, num_metrics,
port_ids, num_port_ids, telemetry);
Expand All @@ -349,7 +345,7 @@ rte_telemetry_command_ports_all_stat_values(struct telemetry_impl *telemetry,
return 0;

fail:
free(names);
free(values);
return -1;
}

Expand Down

0 comments on commit c12cefa

Please sign in to comment.